Commit Graph

74 Commits

Author SHA1 Message Date
Ryan Nowak 8485e2ea10 Add support for Action event handlers
This change adds `Action` to the set of types that have an overload on
RenderTreeBuilder. Additionally, we special case `Action` in the runtime
because passing the event args via DynamicInvoke() would throw.

Finally, reverted some of the clutter introduced by the first pass of
the event handler feature.
2018-04-11 07:36:05 -07:00
Ryan Nowak 15ba614e6f Remove old workaround @onclick and @bind
This change removes support for the old syntax used for event handlers
and two-way binding.

See the relevant issues for details on the new features and
improvements:

bind https://github.com/aspnet/Blazor/issues/409
event handlers https://github.com/aspnet/Blazor/issues/503

Along with this change we've removed a few additional things Blazor
could do that aren't part of Razor's usual syntax.

----

The features that was used to make something like:
```
<button @onclick(...) />
```

is an expression that's embedded in a an element's attribute. This
feature might be useful in the future if we want to support 'splatting'
arbitrary attributes into a tag, but the runtime support for this isn't
accessible outside the Blazor core.

----

The features that implement:
```
<button onclick=@{ } />
```

have been removed in favor of a better design for lambdas, method group
conversions and other things for event handler attributes.

use `<button onclick=@(x => ...} />` instead.

We think is a better approach in general, because we want the app
developer to write and see the parameter list.

----

Both syntactic features that have been removed have dedicated error
messages in the compiler. If you're porting old code it should help you
figure out what to do.
2018-04-10 16:54:15 -07:00
Steve Sanderson bd2c8a09ef Improve JS-side event handling code. Fixes #433 2018-04-10 18:15:22 +01:00
Ryan Nowak df13669362 Improvements for delegate types (#516)
* Improve support for more types of event handlers

Improves support for for other types of event handlers with eventargs
types derived from UIEventArgs. Additionally fleshes out the set of
event handler types.

This change improves support for using more specific event handler types
like:

```
<button onclick="@Clicked" />

@functions {
    public void Clicked(UIMouseEventArgs e) { ... }
}
```

And:
```
builder.AddAttribute(12, "onkeypressed", KeyPressed);

...

void KeyPressed(UIKeyboardEventArgs e) { ... }

```

In particular what got better is:
- overload resolution for the AddAttribute method
- performance of different cases for AddAttribute

-----

The runtime now treats delegates as one of three types:
- arbitrary delegate: not attached to DOM events, not tracked by
renderer
- UIEventHandler: can attach to DOM events, tracked by renderer, first
class in IHandleEvents
- UIEventHandler-like: can attach to DOM events, tracked by renderer,
requires some special runtime support.

The set of overloads on AddAttribute has been tuned with a few specific
cases in mind.

Lambda expressions in an attribute will be inferred as UIEventHandler
unless the compiler does something more specific. So for instance,
passing a lambda as an attribute value for a component, where the
component doesn't define a matching attribute, will always be inferred
as UIEventHandler.

We now support method-group to delegate conversion for methods that
accept a derived UIEventArgs type. This means you can use a signature
like `void KeyPressed(UIKeyboardEventArgs e)` without any compiler
magic, and this will work in the runtime as long as the event type
produced by the runtime matches.

We also allow user-defined UIEventArgs-derived types. There's a pattern
for this and it requires defining an extension method and delegate type.

The method-group to delegate conversion part required some doing. It
doesn't play well with generics (Action<T> where T : UIEventArgs)
doesn't work at all. Adding more actual overloads (as opposed to
extensions) would cause lambda cases we want to work to be ambiguous.

----

The performance win here is to remove the need for a 'wrapper' delegate
created by the event handler tag helper code. This wrapper is now
created by the runtime, but only *after* we have checked the frame for
changes. This requires more heavy lifting in the runtime, but has the
advantage of producing no-op diffs as often as possible.

You will still get some inefficient behavior if your component uses a
capturing lambda in an event handler, so don't do that.

* Add selenium logs to test output

* Minor feedback

* WIP
2018-04-09 13:21:12 -07:00
Steve Sanderson 281d5a8751 Enable same-origin credentials by default. Add E2E test to show they can be sent to different-origin domains too. 2018-04-09 12:54:13 +01:00
Ryan Nowak c3366bc956 Add event handlers as tag helpers
This change adds support for mapping DOM event handlers as tag helpers
that function in a bi-modal way.

This is a new first-class feature for DOM events, and replaces a few
workarounds like using `@onclick(...)` or `click=@{ ... }`. I haven't
removed those things yet, this is a first pass to get the new support
in, we'll remove those things when we're totally satisfied.

When used with a string like `<button onclick="foo" />` the result is
a simple HTML attribute .

But when used with an implicit expression like
`<button onclick="@Foo" />` or
`<button onclick="@(x => Clicked = true)" />` a C# function is bound to
the click event from the DOM.
2018-04-06 13:00:04 -07:00
Steve Sanderson fef5a52183 Reference static content from referenced assemblies. Implements #340 2018-04-06 09:50:10 +01:00
Steve Sanderson d3dc294d5e Revert live reloading implementation. See PR for explanation. 2018-04-04 18:10:12 +01:00
Olivier Lefebvre 1626b3b8c8 Support arbitrary 'fetch' arguments 2018-04-04 10:12:42 +01:00
Steve Sanderson 2c268a4eca Live reloading (currently enabled only for command-line builds - will
add VS support next)
2018-04-02 15:33:00 +01:00
Ryouko Konpaku ef3db51bbf Text Area Bind Fix for issue #434 (#439)
* Text Area Bind Fix for issue #434

* Correct Typo/Mispelling on test method name.
2018-03-30 10:10:23 +01:00
Stephen Roe cda3692d0b Added SVG support (#366) (#435)
* Added SVG support (#366)

* Added E2E tests for SVG
2018-03-30 10:07:10 +01:00
Ryan Nowak 5b658c80a1 Replace @bind with bind-...
This change introduces a 'tag helper' that replaces @bind with custom
code generation that accomplishes roughly the same thing.

This feature lights up by dynamically generating tag helpers that are
visible to tooling and affect the code generation based on:
- pattern recognition of component properties
- attributes that create definitions for elements
- a 'fallback' case for elements

'bind' also supports format strings (currently only for DateTime) via
a separate attribute.

This change introduces the basic framework for bind and tooling support.
We know that we'll have to do more work to define the set of default
'bind' cases for the DOM and to flesh out the conversion/formatting
infrastructure.

This change gets us far enough to replace all of the cases we currently
have tests for :) with the new features. The old @bind technique still
works for now.

Examples:

@* bind an input element to an expression *@
<input bind="@SelectedDate" format="mm/dd/yyyy" />
@functions {
    public DateTime SelectedDate { get; set; }
}

@* bind an arbitrary expression to an arbitrary set of attributes *@
<div bind-myvalue-myevent="@SomeExpression">...</div>

@* write a component that supports bind *@

@* in Counter.cshtml *@
<div>...html omitted for brevity...</div>
@functions {
    public int Value { get; set; } = 1;
    public Action<int> ValueChanged { get; set; }
}

@* in another file *@
<Counter bind-Value="@CurrentValue" />
@functions {
    public int CurrentValue { get; set; }
}
2018-03-29 22:04:24 -07:00
Steve Sanderson fb3beab270 Link on build by default for all configurations, not only Release 2018-03-21 15:58:49 +00:00
Steve Sanderson 5bf0b891e9 In NavLink, support matching either complete URLs or just URL prefixes (both are necessary for typical nav menus) 2018-03-20 13:15:37 +00:00
Steve Sanderson 87c4d3c53e Cover case-insensitive child component parameter names in E2E test 2018-03-19 12:59:59 +00:00
Javier Calvarro Nelson 70c4501497 [Fixes #220] Support `@page` with custom route template on components
* Updates the router component to scan for components within assemblies.
* Parses the templates on `[Route]` in component instances and builds a
  route table that maps paths to components.
* Uses the route table to map paths to components.
2018-03-16 19:15:00 -07:00
Steve Sanderson d0731c337d Add IUriHelper.NavigateTo 2018-03-16 11:19:09 +00:00
Steve Sanderson cb473e8ad7 Add test case to show base-relative links work 2018-03-16 11:17:54 +00:00
Steve Sanderson a02ac60c8c Fix selection on <select> box. Fixes #157 2018-03-16 10:27:26 +00:00
Steve Sanderson 0e9d52fe11 Support components and static content in external NuGet packages (#247)
* On build, drop <BlazorPackageContentFiles> items into dist\_content\(PackageName)\

* Add <script> and <link> tags to generated index.html

* Add testapp coverage of external content package. Still need to add E2E tests that uses it.

* Add missing unit test update

* Add example of packaging an entire Blazor component including CSS and images

* Add E2E test for component from NuGet package
2018-03-14 11:23:43 +00:00
Javier Calvarro Nelson 700c2203c6 [Fixes #66] Adds linking support to the build
* Switch the tasks used to generate the blazor output to be MSBuild based.
* Package the optimized mono runtime and the BCL inside a nuget package.
* Add opt-in support for linking the application on build.
* Make the whole build process incremental.
2018-03-14 11:23:43 +00:00
Ryan Nowak d175b4d38a Konvert to KoreBuild 2018-03-14 11:23:42 +00:00
Steve Sanderson c50f089269 Update BasicTestApp 2018-03-14 11:23:41 +00:00
Steve Sanderson 649159e31d Use real BCL System.Net.Http.HttpClient. Implements #159 2018-02-28 17:37:42 +00:00
Steve Sanderson 4bd3cd98d6 Simplify apps by moving some commonly used types into Microsoft.AspNetCore.Blazor namespace 2018-02-28 11:29:14 +00:00
Steve Sanderson 3e5381c17e Rename .DevHost project to .Cli, and make it work as a DotNetCliTool 2018-02-27 12:17:35 +00:00
Steve Sanderson 6995b974e9 Support @bind for textboxes and checkboxes 2018-02-26 14:39:56 +00:00
Steve Sanderson c0bf73234c Tweak (to force rebuild, since Travis just tried to build a branch that was already deleted) 2018-02-23 22:42:10 +00:00
Steve Sanderson 8590f6e7a5 Remainder of initial HttpClient features plus E2E tests 2018-02-23 22:31:26 +00:00
Steve Sanderson 88cc2caf45 Infrastructure for E2E tests where the app makes requests to an API server 2018-02-23 13:28:58 +00:00
Steve Sanderson ea6b6bcd19 Add an example API server project that can be used in E2E tests 2018-02-23 13:07:49 +00:00
Steve Sanderson 0bb32ad628 Move BrowserRouter -> Router in Microsoft.AspNetCore.Blazor now it has no browser-specific aspects 2018-02-23 10:49:03 +00:00
Steve Sanderson fc9cb1af65 Add E2E tests for BrowserRouter, plus implement querystring/hash support 2018-02-21 10:22:03 +00:00
Steve Sanderson 8bc7c92683 Support hosting at non-root URL. Prove it by updating BasicTestApp to serve from non-root location. 2018-02-21 10:22:03 +00:00
Steve Sanderson f649de2976 Support _ViewImports.cshtml files hierarchically 2018-02-18 23:57:20 +00:00
Steve Sanderson 0595251ac2 E2E test showing rendering of RenderFragment 2018-02-16 10:10:14 +00:00
Steve Sanderson ad2c63ca37 Make OpenRegion/CloseRegion not public because they are only to support AddContent(seq, fragment) 2018-02-16 10:10:12 +00:00
Steve Sanderson 41aae0b7e6 Add ability to append RenderFragment into a RenderTreeBuilder 2018-02-16 10:10:11 +00:00
Steve Sanderson 29a6175ac1 Define RenderFragment concept 2018-02-16 10:10:10 +00:00
Steve Sanderson 1ac5ee25c1 Rename RenderTreeBuilder's AddText to AddContent, since it will be used for other types too 2018-02-16 10:10:08 +00:00
Steve Sanderson 2ebfddc237 Switch client apps to netstandard2.0 to fix type load errors
Do a "git clean -xdf" on your local copy if you get runtime errors after
updating to this.
2018-02-15 10:20:31 +00:00
Steve Sanderson 2da17602ed Support "Region" frames in JS-side code
They only appear in a prepended subtree, because the .NET-side diffing
code resolves them out if they are top-level to any given edit
2018-02-14 23:41:25 +00:00
Steve Sanderson a889cd3152 Beginning lifecycle methods on BlazorComponent 2018-02-13 15:55:37 +00:00
Steve Sanderson 861154764c Introduce IComponent.SetParameters, moving parameter-setting and rerendering logic into component base class 2018-02-13 15:00:53 +00:00
Eugene Bekker b38718d77f Require <script type="blazor-boot"> to define script injection location 2018-02-12 21:49:27 +00:00
Steve Sanderson e37e22aa27 Further renderer refactoring 2018-02-10 10:55:44 +00:00
Steve Sanderson b8ed7bc2c5 Track event handlers via explicit IDs rather than by index into frames
array
2018-02-08 15:31:45 +00:00
Steve Sanderson 83fa72bc7e Have RenderTreeDiff build its own array of referenced frames rather than pointing to the latest render tree
This is in preparation for supporting multiple diffs for the same
component in a single batch (which means we can't rely on there being at
most only new render tree per component)
2018-02-07 10:27:32 +00:00
Steve Sanderson 76dafa819f Mechanism for components running logic when parents change their properties 2018-01-31 16:19:01 +00:00