Skip to content

Commit 412bb38

Browse files
committed
add LoadMore feature to BitBasicList #10996
1 parent 6100458 commit 412bb38

File tree

16 files changed

+1008
-548
lines changed

16 files changed

+1008
-548
lines changed

src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/BlazorParameter.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ public class BlazorParameter(IPropertySymbol propertySymbol, bool resetClassBuil
1212
public bool ResetStyleBuilder { get; set; } = resetStyleBuilder;
1313

1414
public string? CallOnSetMethodName { get; set; }
15+
public string? CallOnSetAsyncMethodName { get; set; }
1516
}

src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSourceGenerator.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public partial class {className}
5757
if (twoWayParameters.Length > 0) builder.AppendLine("");
5858
builder.AppendLine($@" [global::System.Diagnostics.DebuggerNonUserCode]
5959
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
60-
public override Task SetParametersAsync(ParameterView parameters)
60+
public override async Task SetParametersAsync(ParameterView parameters)
6161
{{");
6262
foreach (var par in twoWayParameters)
6363
{
@@ -87,7 +87,7 @@ public override Task SetParametersAsync(ParameterView parameters)
8787
builder.AppendLine($" {paramName}HasBeenSet = true;");
8888
}
8989
builder.AppendLine($" var {varName} = parameter.Value is null ? default! : ({paramType})parameter.Value;");
90-
if (par.ResetClassBuilder || par.ResetStyleBuilder || string.IsNullOrWhiteSpace(par.CallOnSetMethodName) is false)
90+
if (par.ResetClassBuilder || par.ResetStyleBuilder || string.IsNullOrWhiteSpace(par.CallOnSetMethodName) is false || string.IsNullOrWhiteSpace(par.CallOnSetAsyncMethodName) is false)
9191
{
9292
builder.AppendLine($" var notEquals{paramName} = EqualityComparer<{paramType}>.Default.Equals({paramName}, {varName}) is false;");
9393
}
@@ -104,6 +104,10 @@ public override Task SetParametersAsync(ParameterView parameters)
104104
{
105105
builder.AppendLine($" if (notEquals{paramName}) {par.CallOnSetMethodName}();");
106106
}
107+
if (string.IsNullOrWhiteSpace(par.CallOnSetAsyncMethodName) is false)
108+
{
109+
builder.AppendLine($" if (notEquals{paramName}) await {par.CallOnSetAsyncMethodName}();");
110+
}
107111
builder.AppendLine(" parametersDictionary.Remove(parameter.Key);");
108112
builder.AppendLine(" break;");
109113
if (par.IsTwoWayBound)
@@ -121,17 +125,17 @@ public override Task SetParametersAsync(ParameterView parameters)
121125
builder.AppendLine(" }");
122126
if (isBaseTypeComponentBase)
123127
{
124-
builder.AppendLine(" return base.SetParametersAsync(ParameterView.Empty);");
128+
builder.AppendLine(" await base.SetParametersAsync(ParameterView.Empty);");
125129
}
126130
else
127131
{
128132
if (doesSupporteParametersViewCache)
129133
{
130-
builder.AppendLine(" return base.SetParametersAsync(ParameterView.Empty);");
134+
builder.AppendLine(" await base.SetParametersAsync(ParameterView.Empty);");
131135
}
132136
else
133137
{
134-
builder.AppendLine(" return base.SetParametersAsync(ParameterView.FromDictionary(parametersDictionary as IDictionary<string, object?>));");
138+
builder.AppendLine(" await base.SetParametersAsync(ParameterView.FromDictionary(parametersDictionary as IDictionary<string, object?>));");
135139
}
136140
}
137141
builder.AppendLine(@" }");
@@ -162,6 +166,10 @@ public override Task SetParametersAsync(ParameterView parameters)
162166
{
163167
builder.AppendLine($" {par.CallOnSetMethodName}();");
164168
}
169+
if (string.IsNullOrWhiteSpace(par.CallOnSetAsyncMethodName) is false)
170+
{
171+
builder.AppendLine($" await {par.CallOnSetAsyncMethodName}();");
172+
}
165173
builder.AppendLine(" }");
166174
builder.AppendLine($" return true;");
167175
builder.AppendLine(" }");

src/BlazorUI/Bit.BlazorUI.SourceGenerators/Component/ComponentSyntaxContextReceiver.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,12 @@ public void OnVisitSyntaxNode(GeneratorSyntaxContext context)
4444
var parameter = new BlazorParameter(propertySymbol, resetClassBuilder, resetStyleBuilder, isTwoWayBound);
4545

4646
var callOnSetAttribute = attributes.SingleOrDefault(a => a.AttributeClass?.ToDisplayString() == "Bit.BlazorUI.CallOnSetAttribute");
47-
var name = callOnSetAttribute?.ConstructorArguments.FirstOrDefault().Value as string;
47+
var callOnSetName = callOnSetAttribute?.ConstructorArguments.FirstOrDefault().Value as string;
48+
parameter.CallOnSetMethodName = callOnSetName;
4849

49-
parameter.CallOnSetMethodName = name;
50+
var callOnSetAsyncAttribute = attributes.SingleOrDefault(a => a.AttributeClass?.ToDisplayString() == "Bit.BlazorUI.CallOnSetAsyncAttribute");
51+
var callOnSetAsyncName = callOnSetAsyncAttribute?.ConstructorArguments.FirstOrDefault().Value as string;
52+
parameter.CallOnSetAsyncMethodName = callOnSetAsyncName;
5053

5154
Parameters.Add(parameter);
5255
}

src/BlazorUI/Bit.BlazorUI.Tests/Components/Lists/BasicList/BitBasicListTest.razor

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<BitBasicList Items="Items" EnableVirtualization="Virtualize"
1+
<BitBasicList Items="Items" Virtualize="Virtualize"
22
Role="@Role" Style="@ListStyle" ItemSize="ItemSize" OverscanCount="OverscanCount">
33
<RowTemplate Context="person">
44
<div class="list-item" style="height:@($"{ItemSize}px")">

src/BlazorUI/Bit.BlazorUI/Components/Lists/BasicList/BitBasicList.razor

Lines changed: 53 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,45 +4,70 @@
44

55
<div @ref="RootElement" @attributes="HtmlAttributes"
66
id="@_Id"
7+
role="@Role"
78
style="@StyleBuilder.Value"
89
class="@ClassBuilder.Value"
9-
dir="@Dir?.ToString().ToLower()"
10-
role="@Role">
11-
12-
@if (EnableVirtualization)
10+
dir="@Dir?.ToString().ToLower()">
11+
@if (RowTemplate is not null)
1312
{
14-
if (ItemsProvider is null)
13+
if (Virtualize)
1514
{
16-
<_BitBasicListVirtualize Items="Items"
17-
ItemSize="@ItemSize"
18-
OverscanCount="@OverscanCount"
19-
EmptyContent="EmptyContent">
20-
@RowTemplate(context)
21-
</_BitBasicListVirtualize>
15+
if (ItemsProvider is null || LoadMore)
16+
{
17+
<_BitBasicListVirtualize Items="_viewItems"
18+
ItemSize="@ItemSize"
19+
EmptyContent="EmptyContent"
20+
OverscanCount="@OverscanCount">
21+
@RowTemplate(context)
22+
</_BitBasicListVirtualize>
23+
}
24+
else
25+
{
26+
<_BitBasicListVirtualize @ref="_bitBasicListVirtualizeRef"
27+
EmptyContent="EmptyContent"
28+
OverscanCount="@OverscanCount"
29+
Placeholder="VirtualizePlaceholder"
30+
ItemsProvider="ProvideVirtualizedItems">
31+
@RowTemplate(context)
32+
</_BitBasicListVirtualize>
33+
}
2234
}
2335
else
2436
{
25-
<_BitBasicListVirtualize @ref="_bitBasicListVirtualizeRef"
26-
OverscanCount="@OverscanCount"
27-
Placeholder="VirtualizePlaceholder"
28-
ItemsProvider="ProvideVirtualizedItems"
29-
EmptyContent="EmptyContent">
30-
@RowTemplate(context)
31-
</_BitBasicListVirtualize>
37+
if (_viewItems.Count > 0)
38+
{
39+
foreach (var item in _viewItems)
40+
{
41+
@RowTemplate(item)
42+
}
43+
}
44+
else if (_isLoadingMore is false)
45+
{
46+
@EmptyContent
47+
}
3248
}
3349
}
34-
else
50+
51+
@if (LoadMore && _loadMoreFinished is false)
3552
{
36-
if (Items.Count > 0)
37-
{
38-
foreach (var item in Items)
53+
<button class="bit-bsl-lmb" @onclick="() => PerformLoadMore(false)">
54+
@if (LoadMoreTemplate is not null)
3955
{
40-
@RowTemplate(item)
56+
@LoadMoreTemplate(_isLoadingMore)
4157
}
42-
}
43-
else
44-
{
45-
@EmptyContent
46-
}
58+
else
59+
{
60+
<div class="bit-bsl-lmt">
61+
@if (_isLoadingMore)
62+
{
63+
<span>...</span>
64+
}
65+
else
66+
{
67+
<span>@LoadMoreText</span>
68+
}
69+
</div>
70+
}
71+
</button>
4772
}
4873
</div>

0 commit comments

Comments
 (0)