Skip to content

Commit 8860c4b

Browse files
authored
fix(DockView): theme parameter not work (#5705)
* feat: 增加 ThemeChangedAsync 回调方法 * doc: 增加样式切换逻辑 * refactor: 增加 IThemeProvider 联动 * doc: 增加描述 * refactor: 移除更新 Pre 组件主题代码提高可读性 * refactor: 增加主题联动功能 * doc: 更新 DockView 主题切换功能 * test: 更新单元测试
1 parent 7d4606e commit 8860c4b

25 files changed

+129
-34
lines changed

src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
<PackageReference Include="BootstrapBlazor.Chart" Version="9.0.0" />
3232
<PackageReference Include="BootstrapBlazor.CherryMarkdown" Version="9.0.0" />
3333
<PackageReference Include="BootstrapBlazor.Dock" Version="9.0.0" />
34-
<PackageReference Include="BootstrapBlazor.DockView" Version="9.1.5" />
34+
<PackageReference Include="BootstrapBlazor.DockView" Version="9.1.7" />
3535
<PackageReference Include="BootstrapBlazor.DriverJs" Version="9.0.3" />
3636
<PackageReference Include="BootstrapBlazor.ElementIcon" Version="9.0.3" />
3737
<PackageReference Include="BootstrapBlazor.FileViewer" Version="9.0.0" />

src/BootstrapBlazor.Server/Components/Components/Header.razor

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,5 @@
4848
</ul>
4949
<a class="btn btn-bd-download d-none d-lg-block mb-3 mb-md-0 ms-md-3" target="_blank" href="@DownloadUrl">@DownloadText</a>
5050
<div class="navbar-version ms-2">@_versionString</div>
51-
<ThemeProvider class="ms-2 d-none d-lg-block" OnThemeChangedAsync="OnThemeChangedAsync"></ThemeProvider>
51+
<ThemeProvider class="ms-2 d-none d-lg-block"></ThemeProvider>
5252
</header>

src/BootstrapBlazor.Server/Components/Components/Header.razor.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,4 @@ protected override void OnInitialized()
5757
TutorialsText ??= Localizer[nameof(TutorialsText)];
5858
_versionString = $"v{PackageVersionService.Version}";
5959
}
60-
61-
private Task OnThemeChangedAsync(ThemeValue themeName) => InvokeVoidAsync("updateTheme", themeName, WebsiteOption.CurrentValue.AssetRootPath);
6260
}

src/BootstrapBlazor.Server/Components/Components/Header.razor.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { switchTheme as syncTheme } from "./Pre.razor.js"
2-
import EventHandler from "../../_content/BootstrapBlazor/modules/event-handler.js"
1+
import EventHandler from "../../_content/BootstrapBlazor/modules/event-handler.js"
32

43
export function init(id) {
54
const scrollTop = () => (document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop
@@ -17,10 +16,6 @@ export function init(id) {
1716
});
1817
}
1918

20-
export async function updateTheme(theme, assetPath) {
21-
await syncTheme(theme, assetPath);
22-
}
23-
2419
export function dispose(id) {
2520
EventHandler.off(document, 'scroll');
2621
}

src/BootstrapBlazor.Server/Components/Components/Pre.razor.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ public partial class Pre
2929
[NotNull]
3030
private CodeSnippetService? CodeSnippetService { get; set; }
3131

32+
[Inject]
33+
[NotNull]
34+
private IThemeProvider? ThemeProviderService { get; set; }
35+
3236
/// <summary>
3337
/// 获得/设置 子组件 CodeFile 为空时生效
3438
/// </summary>
@@ -67,6 +71,16 @@ public partial class Pre
6771

6872
private string? CopiedText { get; set; }
6973

74+
/// <summary>
75+
/// <inheritdoc/>
76+
/// </summary>
77+
protected override void OnInitialized()
78+
{
79+
base.OnInitialized();
80+
81+
ThemeProviderService.ThemeChangedAsync += OnThemeChanged;
82+
}
83+
7084
/// <summary>
7185
/// <inheritdoc/>
7286
/// </summary>
@@ -189,4 +203,12 @@ private string FindCodeSnippetByName(string code)
189203

190204
[GeneratedRegex(@"<Tips[\s\S]*>[\s\S]*?</Tips>")]
191205
private static partial Regex TipsRegex();
206+
207+
private async Task OnThemeChanged(string themeName)
208+
{
209+
if (themeName == "light" || themeName == "dark")
210+
{
211+
await InvokeVoidAsync("switchTheme", themeName);
212+
}
213+
}
192214
}

src/BootstrapBlazor.Server/Components/Components/Pre.razor.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,14 @@ export async function highlight(id) {
7878
}
7979
}
8080

81-
export async function switchTheme(theme, assetPath) {
81+
export async function switchTheme(theme) {
8282
if (theme === 'dark') {
83-
removeLink(`${assetPath}lib/highlight/vs.min.css`);
84-
await addLink(`${assetPath}lib/highlight/vs2015.min.css`);
83+
removeLink(`./lib/highlight/vs.min.css`);
84+
await addLink(`./lib/highlight/vs2015.min.css`);
8585
}
8686
else {
87-
removeLink(`${assetPath}lib/highlight/vs2015.min.css`);
88-
await addLink(`${assetPath}lib/highlight/vs.min.css`);
87+
removeLink(`./lib/highlight/vs2015.min.css`);
88+
await addLink(`./lib/highlight/vs.min.css`);
8989
}
9090
}
9191

src/BootstrapBlazor.Server/Components/Components/ThemeMode.razor

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
@inherits WebSiteModuleComponentBase
2-
@attribute [JSModuleAutoLoader("Components/ThemeMode.razor.js")]
2+
@attribute [JSModuleAutoLoader("Components/ThemeMode.razor.js", JSObjectReference = true)]
33

44
<div id="@Id" class="btn btn-circle btn-fade btn-theme-mode icon-theme d-flex" @onclick:stopPropagation>
55
<i class="@GetLightIconClassString"></i>

src/BootstrapBlazor.Server/Components/Components/ThemeMode.razor.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
// See the LICENSE file in the project root for more information.
44
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone
55

6+
using Microsoft.JSInterop;
7+
68
namespace BootstrapBlazor.Server.Components.Components;
79

810
/// <summary>
@@ -13,6 +15,10 @@ public partial class ThemeMode
1315
[Inject, NotNull]
1416
private IIconTheme? IconTheme { get; set; }
1517

18+
[Inject]
19+
[NotNull]
20+
private IThemeProvider? ThemeProvider { get; set; }
21+
1622
private string? GetLightIconClassString => CssBuilder.Default("icon-light")
1723
.AddClass(_lightModeIcon)
1824
.Build();
@@ -35,4 +41,17 @@ protected override void OnInitialized()
3541
_darkModeIcon ??= IconTheme.GetIconByKey(ComponentIcons.ThemeProviderDarkModeIcon);
3642
_lightModeIcon ??= IconTheme.GetIconByKey(ComponentIcons.ThemeProviderLightModeIcon);
3743
}
44+
45+
/// <summary>
46+
/// <inheritdoc/>
47+
/// </summary>
48+
protected override Task InvokeInitAsync() => InvokeVoidAsync("init", Id, Interop, nameof(OnThemeChanged));
49+
50+
/// <summary>
51+
/// The callback when theme changed
52+
/// </summary>
53+
/// <param name="themeName"></param>
54+
/// <returns></returns>
55+
[JSInvokable]
56+
public ValueTask OnThemeChanged(string themeName) => ThemeProvider.SetThemeAsync(themeName);
3857
}

src/BootstrapBlazor.Server/Components/Components/ThemeMode.razor.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { getTheme, switchTheme, calcCenterPosition } from "../../_content/BootstrapBlazor/modules/utility.js"
22
import EventHandler from "../../_content/BootstrapBlazor/modules/event-handler.js"
33

4-
export function init(id) {
4+
export function init(id, invoke, method) {
55
const el = document.getElementById(id);
66
if (el) {
77
EventHandler.on(el, 'click', e => {
@@ -15,6 +15,7 @@ export function init(id) {
1515

1616
const rect = calcCenterPosition(el);
1717
switchTheme(theme, rect.x, rect.y);
18+
invoke.invokeMethodAsync(method, theme);
1819
});
1920
}
2021
}

src/BootstrapBlazor.Server/Components/Samples/DockViews2/BaseDockView.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ public abstract class BaseDockView : ComponentBase
2222
[NotNull]
2323
private MockDataTableDynamicService? DataTableDynamicService { get; set; }
2424

25+
[Inject]
26+
[NotNull]
27+
private IThemeProvider? ThemeProviderService { get; set; }
28+
2529
/// <summary>
2630
/// 获得/设置 数据集合
2731
/// </summary>
@@ -39,6 +43,11 @@ public abstract class BaseDockView : ComponentBase
3943
/// </summary>
4044
protected DataTableDynamicContext? DataTableDynamicContext { get; set; }
4145

46+
/// <summary>
47+
/// Gets or sets the theme
48+
/// </summary>
49+
protected DockViewTheme Theme { get; set; } = DockViewTheme.Light;
50+
4251
/// <summary>
4352
/// 获得 <see cref="DynamicObjectContext"/> 实例方法
4453
/// </summary>
@@ -51,6 +60,8 @@ public abstract class BaseDockView : ComponentBase
5160
/// </summary>
5261
protected override void OnInitialized()
5362
{
63+
base.OnInitialized();
64+
5465
Items = Foo.GenerateFoo(LocalizerFoo, 50);
5566

5667
// 模拟数据从数据库中获得
@@ -63,6 +74,22 @@ protected override void OnInitialized()
6374
TreeItems.AddRange(TreeFoo.GenerateFoos(LocalizerFoo, 3, 101, 1010));
6475

6576
DataTableDynamicContext = DataTableDynamicService.CreateContext();
77+
78+
ThemeProviderService.ThemeChangedAsync += OnThemeChanged;
79+
}
80+
81+
private Task OnThemeChanged(string themeName)
82+
{
83+
if (themeName == "dark")
84+
{
85+
Theme = DockViewTheme.Dark;
86+
}
87+
else
88+
{
89+
Theme = DockViewTheme.Light;
90+
}
91+
StateHasChanged();
92+
return Task.CompletedTask;
6693
}
6794

6895
/// <summary>

0 commit comments

Comments
 (0)