From 9ba6e76e95255ce8752b8884a9abed0483e899ec Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 8 Apr 2025 08:21:45 +0800 Subject: [PATCH 1/9] refactor: support isPage option --- src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs b/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs index 3a05127aa6d..347116c4ce5 100644 --- a/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs +++ b/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs @@ -95,6 +95,7 @@ protected override async Task OnAfterRenderAsync(bool firstRender) Color, Rotate, Gap, - ZIndex + ZIndex, + IsPage = ChildContent is null }; } From d33ff35cf2bda204ee45b6e59405175d496a6f8f Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 8 Apr 2025 08:45:48 +0800 Subject: [PATCH 2/9] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E6=95=B4?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=B0=B4=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Watermark/Watermark.razor.js | 26 +++++++++++++------ .../Components/Watermark/Watermark.razor.scss | 9 ++++++- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/BootstrapBlazor/Components/Watermark/Watermark.razor.js b/src/BootstrapBlazor/Components/Watermark/Watermark.razor.js index cb24dfc3015..50fe80f35a1 100644 --- a/src/BootstrapBlazor/Components/Watermark/Watermark.razor.js +++ b/src/BootstrapBlazor/Components/Watermark/Watermark.razor.js @@ -71,7 +71,8 @@ const createWatermark = watermark => { fontSize: 16, text: 'BootstrapBlazor', rotate: -40, - color: '#0000004d' + color: '#0000004d', + zIndex: '9999' }; for (const key in options) { @@ -90,31 +91,40 @@ const createWatermark = watermark => { div.style.opacity = '1'; div.style.position = 'absolute'; div.style.inset = '0'; - div.style.zIndex = '9999'; div.classList.add("bb-watermark-bg"); + if (options.zIndex === void 0) { + options.zIndex = defaults.zIndex; + } + div.style.zIndex = options.zIndex; + const mark = el.querySelector('.bb-watermark-bg'); if (mark) { mark.remove(); } - el.appendChild(div); + if (bg.isPage) { + document.body.appendChild(div); + } + else { + el.appendChild(div); + } options.bg = bg; requestAnimationFrame(() => monitor(watermark)); } const monitor = watermark => { - const { el, options, ob } = watermark; + const { el, options } = watermark; if (el === null) { return; } - if (el.children.length !== 2) { + if (options.isPage === false && el.children.length !== 2) { clearWatermark(watermark); return; } - const mark = el.children[1]; + const mark = options.isPage ? el.children[0] : el.children[1]; if (mark.className !== 'bb-watermark-bg') { clearWatermark(watermark); return; @@ -138,7 +148,7 @@ const monitor = watermark => { clearWatermark(watermark); return; } - if (zIndex !== '9999') { + if (zIndex !== options.zIndex) { clearWatermark(watermark); return; } @@ -198,6 +208,6 @@ const getWatermark = props => { return { base64: canvas.toDataURL(), size: canvasSize, - styleSize: canvasSize / devicePixelRatio, + styleSize: canvasSize / devicePixelRatio }; } diff --git a/src/BootstrapBlazor/Components/Watermark/Watermark.razor.scss b/src/BootstrapBlazor/Components/Watermark/Watermark.razor.scss index d2f97f6c411..6844365cb1e 100644 --- a/src/BootstrapBlazor/Components/Watermark/Watermark.razor.scss +++ b/src/BootstrapBlazor/Components/Watermark/Watermark.razor.scss @@ -1,3 +1,10 @@ -.bb-watermark { +.bb-watermark { position: relative; + pointer-events: none; +} + +body > .bb-watermark { + position: fixed; + inset: 0; + z-index: 9999; } From a62986b5485e9f952914a9394bdf5b7fcecfa432 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 8 Apr 2025 08:46:02 +0800 Subject: [PATCH 3/9] =?UTF-8?q?refactor:=20=E5=AE=8C=E5=96=84=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E7=A9=BA=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/wwwroot/modules/utility.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/wwwroot/modules/utility.js b/src/BootstrapBlazor/wwwroot/modules/utility.js index 98576bdd756..f824177237d 100644 --- a/src/BootstrapBlazor/wwwroot/modules/utility.js +++ b/src/BootstrapBlazor/wwwroot/modules/utility.js @@ -801,7 +801,7 @@ const deepMerge = (obj1, obj2, skipNull = true) => { } else { const value = obj2[key]; - if (skipNull && value === null) { + if (skipNull && (value === null || value === void 0)) { continue; } obj1[key] = obj2[key]; From 82a0f3014ee4bdf7716894f9eb8bdee158f1a30c Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 8 Apr 2025 08:58:48 +0800 Subject: [PATCH 4/9] =?UTF-8?q?feat:=20=E6=80=8E=E5=8A=A0=20is-page=20?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Watermark/Watermark.razor.cs | 1 + .../Components/Watermark/Watermark.razor.scss | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs b/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs index 347116c4ce5..7907b73e6e4 100644 --- a/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs +++ b/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs @@ -54,6 +54,7 @@ public partial class Watermark public int? Gap { get; set; } private string? ClassString => CssBuilder.Default("bb-watermark") + .AddClass("is-page", ChildContent is null) .AddClassFromAttributes(AdditionalAttributes) .Build(); diff --git a/src/BootstrapBlazor/Components/Watermark/Watermark.razor.scss b/src/BootstrapBlazor/Components/Watermark/Watermark.razor.scss index 6844365cb1e..9c175374e91 100644 --- a/src/BootstrapBlazor/Components/Watermark/Watermark.razor.scss +++ b/src/BootstrapBlazor/Components/Watermark/Watermark.razor.scss @@ -1,10 +1,10 @@ .bb-watermark { position: relative; - pointer-events: none; -} -body > .bb-watermark { - position: fixed; - inset: 0; - z-index: 9999; + &.is-page { + position: fixed; + inset: 0; + z-index: 9999; + pointer-events: none; + } } From cf61a6dcf6fd7bff1644306937fde49317fc77d6 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 8 Apr 2025 09:15:04 +0800 Subject: [PATCH 5/9] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=20IsPage=20?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Watermark/Watermark.razor.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs b/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs index 7907b73e6e4..712de6a13c7 100644 --- a/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs +++ b/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs @@ -53,6 +53,12 @@ public partial class Watermark [Parameter] public int? Gap { get; set; } + /// + /// 获得/设置 是否为整页面水印 默认 false + /// + [Parameter] + public bool IsPage { get; set; } + private string? ClassString => CssBuilder.Default("bb-watermark") .AddClass("is-page", ChildContent is null) .AddClassFromAttributes(AdditionalAttributes) @@ -97,6 +103,6 @@ protected override async Task OnAfterRenderAsync(bool firstRender) Rotate, Gap, ZIndex, - IsPage = ChildContent is null + IsPage }; } From d051a1a49f88f814d30deff85ef4fb7d6f4897fe Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 8 Apr 2025 09:20:01 +0800 Subject: [PATCH 6/9] =?UTF-8?q?doc:=20=E5=A2=9E=E5=8A=A0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor.Server/Components/Samples/Watermarks.razor | 3 +++ src/BootstrapBlazor.Server/Locales/en-US.json | 3 ++- src/BootstrapBlazor.Server/Locales/zh-CN.json | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/Watermarks.razor b/src/BootstrapBlazor.Server/Components/Samples/Watermarks.razor index 363b12df64e..96a827d89f2 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/Watermarks.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/Watermarks.razor @@ -7,6 +7,9 @@
+ @((MarkupString)Localizer["WatermarkDescription"].Value) +
<Layout></Layout>
+<Watermark IsPage="true" Text="BootstrapBlazor" FontSize="20" Color="#ddd" Rotate="-45" Gap="40"></Watermark>
diff --git a/src/BootstrapBlazor.Server/Locales/en-US.json b/src/BootstrapBlazor.Server/Locales/en-US.json index 6a3ca8729c3..bc17c834253 100644 --- a/src/BootstrapBlazor.Server/Locales/en-US.json +++ b/src/BootstrapBlazor.Server/Locales/en-US.json @@ -7017,7 +7017,8 @@ "WatermarkTitle": "Watermark", "WatermarkIntro": "Add specific text or patterns to the page", "WatermarkNormalTitle": "Basic usage", - "WatermarkNormalIntro": "Use the Text property to set a string to specify the watermark text" + "WatermarkNormalIntro": "Use the Text property to set a string to specify the watermark text", + "WatermarkDescription": "

How to add a watermark globally

You can add a watermark component to the template page MainLayout and set IsPage=\"true\"

" }, "BootstrapBlazor.Server.Data.AttributeItem": { "Name": "Name", diff --git a/src/BootstrapBlazor.Server/Locales/zh-CN.json b/src/BootstrapBlazor.Server/Locales/zh-CN.json index fb44eb5ed32..aa2ff96ebde 100644 --- a/src/BootstrapBlazor.Server/Locales/zh-CN.json +++ b/src/BootstrapBlazor.Server/Locales/zh-CN.json @@ -7017,7 +7017,8 @@ "WatermarkTitle": "Watermark 水印组件", "WatermarkIntro": "在页面上添加文本或图片等水印信息", "WatermarkNormalTitle": "基础用法", - "WatermarkNormalIntro": "使用 Text 属性设置一个字符串指定水印内容" + "WatermarkNormalIntro": "使用 Text 属性设置一个字符串指定水印内容", + "WatermarkDescription": "

全局增加水印实现方法

可以在模板页 MainLayout 中加水印组件并设置 IsPage=\"true\" 即可

" }, "BootstrapBlazor.Server.Data.AttributeItem": { "Name": "参数", From 2afc4b9b68c089d972a8cb03b6b794fe28b5bdce Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 8 Apr 2025 09:27:59 +0800 Subject: [PATCH 7/9] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs b/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs index 712de6a13c7..609d20c9fd9 100644 --- a/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs +++ b/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs @@ -60,7 +60,7 @@ public partial class Watermark public bool IsPage { get; set; } private string? ClassString => CssBuilder.Default("bb-watermark") - .AddClass("is-page", ChildContent is null) + .AddClass("is-page", IsPage) .AddClassFromAttributes(AdditionalAttributes) .Build(); From 2338e221421c5a98138e17477338edd211912d5a Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 8 Apr 2025 09:28:08 +0800 Subject: [PATCH 8/9] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs b/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs index 609d20c9fd9..fb7fb15002e 100644 --- a/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs +++ b/src/BootstrapBlazor/Components/Watermark/Watermark.razor.cs @@ -72,6 +72,11 @@ protected override void OnParametersSet() base.OnParametersSet(); Text ??= "BootstrapBlazor"; + + if(IsPage && ChildContent is not null) + { + throw new InvalidOperationException($"{nameof(IsPage)} is true, {nameof(ChildContent)} cannot be set."); + } } /// From f1fd38dc44a197319c509306d0d6d18a005c7334 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 8 Apr 2025 09:28:13 +0800 Subject: [PATCH 9/9] =?UTF-8?q?test:=20=E6=9B=B4=E6=96=B0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Components/WatermarkTest.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/test/UnitTest/Components/WatermarkTest.cs b/test/UnitTest/Components/WatermarkTest.cs index 7ed8c8effcf..44dd4fa250b 100644 --- a/test/UnitTest/Components/WatermarkTest.cs +++ b/test/UnitTest/Components/WatermarkTest.cs @@ -22,6 +22,17 @@ public void Watermark_Ok() }); cut.MarkupMatches("
Test
"); - cut.SetParametersAndRender(); + var ex = Assert.ThrowsAny(() => cut.SetParametersAndRender(pb => + { + pb.Add(a => a.IsPage, true); + })); + Assert.Equal($"IsPage is true, ChildContent cannot be set.", ex.Message); + + cut.SetParametersAndRender(pb => + { + pb.Add(a => a.IsPage, true); + pb.Add(a => a.ChildContent, (RenderFragment?)null); + }); + cut.MarkupMatches("
"); } }