Skip to content

Commit 9d9b04a

Browse files
committed
Merge branch 'refactor-table' into revert-event
# Conflicts: # src/BootstrapBlazor/Components/BaseComponents/DynamicElement.cs
2 parents 7d17ccb + 4efbe04 commit 9d9b04a

4 files changed

Lines changed: 105 additions & 2 deletions

File tree

src/BootstrapBlazor/Components/BaseComponents/DynamicElement.cs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,34 @@ public class DynamicElement : BootstrapComponentBase
7878
[Parameter]
7979
public bool TriggerContextMenu { get; set; }
8080

81+
/// <summary>
82+
/// <para lang="zh">获得/设置 OnTouchStart 回调委托</para>
83+
/// <para lang="en">Gets or sets the OnTouchStart callback delegate</para>
84+
/// </summary>
85+
[Parameter]
86+
public Func<TouchEventArgs, Task>? OnTouchStart { get; set; }
87+
88+
/// <summary>
89+
/// <para lang="zh">获得/设置 OnTouchEnd 回调委托</para>
90+
/// <para lang="en">Gets or sets the OnTouchEnd callback delegate</para>
91+
/// </summary>
92+
[Parameter]
93+
public Func<TouchEventArgs, Task>? OnTouchEnd { get; set; }
94+
95+
/// <summary>
96+
/// <para lang="zh">获得/设置 是否触发 OnTouchStart 事件 默认 false</para>
97+
/// <para lang="en">Gets or sets whether to trigger OnTouchStart events. Default is false</para>
98+
/// </summary>
99+
[Parameter]
100+
public bool TriggerTouchStart { get; set; }
101+
102+
/// <summary>
103+
/// <para lang="zh">获得/设置 是否触发 OnTouchEnd 事件 默认 false</para>
104+
/// <para lang="en">Gets or sets whether to trigger OnTouchEnd events. Default is false</para>
105+
/// </summary>
106+
[Parameter]
107+
public bool TriggerTouchEnd { get; set; }
108+
81109
/// <summary>
82110
/// <para lang="zh">获得/设置 内容组件</para>
83111
/// <para lang="en">Gets or sets the child content</para>
@@ -139,6 +167,16 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
139167
builder.AddEventPreventDefaultAttribute(9, "oncontextmenu", true);
140168
}
141169

170+
if (IsTriggerTouchStart())
171+
{
172+
builder.AddAttribute(11, "ontouchstart", EventCallback.Factory.Create<TouchEventArgs>(this, OnTriggerTouchStart));
173+
}
174+
175+
if (IsTriggerTouchEnd())
176+
{
177+
builder.AddAttribute(12, "ontouchend", EventCallback.Factory.Create<TouchEventArgs>(this, OnTriggerTouchEnd));
178+
}
179+
142180
builder.AddContent(10, ChildContent);
143181

144182
if (GenerateElement || IsTriggerClick() || IsTriggerDoubleClick())
@@ -153,6 +191,10 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
153191

154192
private bool IsTriggerContextMenu() => TriggerContextMenu && OnContextMenu != null;
155193

194+
private bool IsTriggerTouchStart() => TriggerTouchStart && OnTouchStart != null;
195+
196+
private bool IsTriggerTouchEnd() => TriggerTouchEnd && OnTouchEnd != null;
197+
156198
private async Task OnTriggerClick()
157199
{
158200
if (OnClick != null)
@@ -176,4 +218,20 @@ private async Task OnTriggerContextMenu(MouseEventArgs e)
176218
await OnContextMenu(e);
177219
}
178220
}
221+
222+
private async Task OnTriggerTouchStart(TouchEventArgs e)
223+
{
224+
if (OnTouchStart != null)
225+
{
226+
await OnTouchStart(e);
227+
}
228+
}
229+
230+
private async Task OnTriggerTouchEnd(TouchEventArgs e)
231+
{
232+
if (OnTouchEnd != null)
233+
{
234+
await OnTouchEnd(e);
235+
}
236+
}
179237
}

src/BootstrapBlazor/Components/Table/Table.razor

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,8 @@
734734
@<DynamicElement @key="GetKeyByITem(item)" TagName="tr"
735735
class="@GetRowClassString(item)" style="@GetRowStyleString(item)"
736736
TriggerContextMenu="ContextMenuZone != null" OnContextMenu="e => OnContextMenu(e, item)"
737-
@ontouchstart="e => OnTouchStart(e, item)" @ontouchend="OnTouchEnd"
737+
TriggerTouchStart="true" OnTouchStart="e => OnTouchStart(e, item)"
738+
TriggerTouchEnd="true" OnTouchEnd="OnTouchEnd"
738739
TriggerClick="@(ClickToSelect || OnClickRowCallback != null)" OnClick="() => ClickRow(item)"
739740
TriggerDoubleClick="@(DoubleClickToEdit || OnDoubleClickRowCallback != null)"
740741
OnDoubleClick="() => DoubleClickRow(item)">

src/BootstrapBlazor/Components/Table/Table.razor.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2000,9 +2000,10 @@ private async Task OnTouchStart(TouchEventArgs e, TItem item)
20002000
}
20012001
}
20022002

2003-
private void OnTouchEnd()
2003+
private Task OnTouchEnd(TouchEventArgs e)
20042004
{
20052005
TouchStart = false;
2006+
return Task.CompletedTask;
20062007
}
20072008

20082009
private object? GetKeyByITem(TItem item) => SortableList != null ? item : null; //OnGetRowKey?.Invoke(item);

test/UnitTest/Components/DynamicElementTest.cs

Lines changed: 43 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(argo@live.ca) Website: https://www.blazor.zone
55

6+
using Microsoft.AspNetCore.Components.Web;
7+
68
namespace UnitTest.Components;
79

810
public class DynamicElementTest
@@ -18,4 +20,45 @@ public void Key_OK()
1820

1921
Assert.Equal("<div></div>", cut.Markup);
2022
}
23+
24+
[Fact]
25+
public void TouchEvents_Ok()
26+
{
27+
var context = new BunitContext();
28+
TouchEventArgs? touchStartArgs = null;
29+
TouchEventArgs? touchEndArgs = null;
30+
var touchStartEventArgs = new TouchEventArgs
31+
{
32+
Touches = [new TouchPoint { ClientX = 10, ClientY = 20, ScreenX = 30, ScreenY = 40 }]
33+
};
34+
var touchEndEventArgs = new TouchEventArgs
35+
{
36+
ChangedTouches = [new TouchPoint { ClientX = 11, ClientY = 21, ScreenX = 31, ScreenY = 41 }]
37+
};
38+
39+
var cut = context.Render<DynamicElement>(pb =>
40+
{
41+
pb.Add(a => a.TagName, "span");
42+
pb.Add(a => a.TriggerTouchStart, true);
43+
pb.Add(a => a.OnTouchStart, e =>
44+
{
45+
touchStartArgs = e;
46+
return Task.CompletedTask;
47+
});
48+
pb.Add(a => a.TriggerTouchEnd, true);
49+
pb.Add(a => a.OnTouchEnd, e =>
50+
{
51+
touchEndArgs = e;
52+
return Task.CompletedTask;
53+
});
54+
pb.AddChildContent("Touch");
55+
});
56+
57+
var element = cut.Find("span");
58+
element.TriggerEvent("ontouchstart", touchStartEventArgs);
59+
element.TriggerEvent("ontouchend", touchEndEventArgs);
60+
61+
Assert.Same(touchStartEventArgs, touchStartArgs);
62+
Assert.Same(touchEndEventArgs, touchEndArgs);
63+
}
2164
}

0 commit comments

Comments
 (0)