From 79aa2de9ee6fb655fd4f3556345f8cea26f3bc26 Mon Sep 17 00:00:00 2001
From: Mackinnon Buck
Date: Wed, 8 Jul 2020 15:30:00 -0700
Subject: [PATCH 01/20] Started on head manager
---
.../src/Head/HeadElementBase.cs | 43 +++++++++
.../Web.Extensions/src/Head/HeadManager.cs | 92 +++++++++++++++++++
.../Head/HeadServiceCollectionExtensions.cs | 13 +++
.../Web.Extensions/src/Head/Title.cs | 36 ++++++++
...spNetCore.Components.Web.Extensions.csproj | 4 +-
.../Web.Extensions/src/wwwroot/headManager.js | 7 ++
.../test/testassets/BasicTestApp/Index.razor | 1 +
.../BasicTestApp/ModifyHeadComponent.razor | 49 ++++++++++
.../test/testassets/BasicTestApp/Program.cs | 2 +
.../BasicTestApp/wwwroot/index.html | 2 +
.../TestServer/Pages/_ServerHost.cshtml | 2 +
.../testassets/TestServer/ServerStartup.cs | 1 +
12 files changed, 251 insertions(+), 1 deletion(-)
create mode 100644 src/Components/Web.Extensions/src/Head/HeadElementBase.cs
create mode 100644 src/Components/Web.Extensions/src/Head/HeadManager.cs
create mode 100644 src/Components/Web.Extensions/src/Head/HeadServiceCollectionExtensions.cs
create mode 100644 src/Components/Web.Extensions/src/Head/Title.cs
create mode 100644 src/Components/Web.Extensions/src/wwwroot/headManager.js
create mode 100644 src/Components/test/testassets/BasicTestApp/ModifyHeadComponent.razor
diff --git a/src/Components/Web.Extensions/src/Head/HeadElementBase.cs b/src/Components/Web.Extensions/src/Head/HeadElementBase.cs
new file mode 100644
index 000000000000..cd7cbae6f48f
--- /dev/null
+++ b/src/Components/Web.Extensions/src/Head/HeadElementBase.cs
@@ -0,0 +1,43 @@
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace Microsoft.AspNetCore.Components.Web.Extensions
+{
+ public abstract class HeadElementBase : ComponentBase, IDisposable
+ {
+ [Inject]
+ protected HeadManager HeadManager { get; set; } = default!;
+
+ internal LinkedListNode Node { get; }
+
+ internal abstract object ElementKey { get; }
+
+ protected HeadElementBase()
+ {
+ Node = new LinkedListNode(this);
+ }
+
+ protected override void OnInitialized()
+ {
+ if (HeadManager == null)
+ {
+ throw new InvalidOperationException($"{GetType()} requires the {typeof(HeadManager)} service.");
+ }
+ }
+
+ protected override async Task OnParametersSetAsync()
+ {
+ await HeadManager.NotifyChangedAsync(this);
+ }
+
+ internal abstract ValueTask SaveInitialStateAsync();
+
+ internal abstract ValueTask ApplyChangesAsync();
+
+ public void Dispose()
+ {
+ HeadManager.NotifyDisposed(this);
+ }
+ }
+}
diff --git a/src/Components/Web.Extensions/src/Head/HeadManager.cs b/src/Components/Web.Extensions/src/Head/HeadManager.cs
new file mode 100644
index 000000000000..9d2471cc35c5
--- /dev/null
+++ b/src/Components/Web.Extensions/src/Head/HeadManager.cs
@@ -0,0 +1,92 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading.Tasks;
+using Microsoft.JSInterop;
+
+namespace Microsoft.AspNetCore.Components.Web.Extensions
+{
+ public class HeadManager
+ {
+ private const string JsFunctionsPrefix = "_blazorHeadManager";
+
+ private readonly IJSRuntime _jsRuntime;
+
+ private readonly Dictionary
+
+@for (int i = 0; i < showTitles.Length; i++)
+{
+ var titleId = i;
+
+
+
+ if (showTitles[titleId])
+ {
+
+ }
+}
+
+
+
+@if (toggled)
+{
+
+}
+else
+{
+
+}
+
+@code {
+ private string title = "Basic test app";
+
+ private bool toggled = false;
+
+ private readonly bool[] showTitles = Enumerable.Repeat(false, 6).ToArray();
+
+ private void ToggleTitle(int titleId)
+ {
+ showTitles[titleId] = !showTitles[titleId];
+ StateHasChanged();
+ }
+
+ private void Toggle()
+ {
+ toggled = !toggled;
+ }
+}
diff --git a/src/Components/test/testassets/BasicTestApp/Program.cs b/src/Components/test/testassets/BasicTestApp/Program.cs
index 1e640b59dc64..eb6b2c341d85 100644
--- a/src/Components/test/testassets/BasicTestApp/Program.cs
+++ b/src/Components/test/testassets/BasicTestApp/Program.cs
@@ -39,6 +39,8 @@ public static async Task Main(string[] args)
policy.RequireAssertion(ctx => ctx.User.Identity.Name?.StartsWith("B") ?? false));
});
+ builder.Services.AddSingleton();
+
builder.Services.AddDataProtection();
builder.Services.AddTransient();
diff --git a/src/Components/test/testassets/BasicTestApp/wwwroot/index.html b/src/Components/test/testassets/BasicTestApp/wwwroot/index.html
index 68a3e8234449..241b91829ca6 100644
--- a/src/Components/test/testassets/BasicTestApp/wwwroot/index.html
+++ b/src/Components/test/testassets/BasicTestApp/wwwroot/index.html
@@ -42,6 +42,8 @@
+
+