Skip to content

Commit d2e26fc

Browse files
authored
ForceUpdate (#123)
1 parent 85577c8 commit d2e26fc

File tree

6 files changed

+51
-40
lines changed

6 files changed

+51
-40
lines changed

CodeBeam.MudExtensions.UnitTests/Components/SelectExtendedTests.cs

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -116,32 +116,32 @@ public void Select_ValueBubblingTest_MultiSelection()
116116
select.Instance.Text.Should().Be("2, 1");
117117
}
118118

119-
//[Test]
120-
//public async Task Select_ValueChangeEventCountTest()
121-
//{
122-
// var comp = Context.RenderComponent<SelectEventCountTest>(x =>
123-
// {
124-
// x.Add(c => c.MultiSelection, false);
125-
// });
126-
// var select = comp.FindComponent<MudSelectExtended<string>>();
127-
// var input = comp.Find("div.mud-input-control");
128-
129-
// comp.Instance.ValueChangeCount.Should().Be(0);
130-
// comp.Instance.ValuesChangeCount.Should().Be(0);
131-
132-
// await comp.InvokeAsync(() => select.SetParam("Value", "1"));
133-
// await comp.InvokeAsync(() => select.Instance.ForceUpdate());
134-
// comp.WaitForAssertion(() => comp.Instance.ValueChangeCount.Should().Be(1));
135-
// comp.Instance.ValuesChangeCount.Should().Be(1);
136-
// select.Instance.Value.Should().Be("1");
137-
138-
// // Changing value programmatically without ForceUpdate should change value, but should not fire change events
139-
// // Its by design, so this part can be change if design changes
140-
// await comp.InvokeAsync(() => select.SetParam("Value", "2"));
141-
// comp.WaitForAssertion(() => comp.Instance.ValueChangeCount.Should().Be(1));
142-
// comp.Instance.ValuesChangeCount.Should().Be(1);
143-
// select.Instance.Value.Should().Be("2");
144-
//}
119+
[Test]
120+
public async Task Select_ValueChangeEventCountTest()
121+
{
122+
var comp = Context.RenderComponent<SelectEventCountTest>(x =>
123+
{
124+
x.Add(c => c.MultiSelection, false);
125+
});
126+
var select = comp.FindComponent<MudSelectExtended<string>>();
127+
var input = comp.Find("div.mud-input-control");
128+
129+
comp.Instance.ValueChangeCount.Should().Be(0);
130+
comp.Instance.ValuesChangeCount.Should().Be(0);
131+
132+
await comp.InvokeAsync(() => select.SetParam("Value", "1"));
133+
await comp.InvokeAsync(() => select.Instance.ForceUpdate());
134+
comp.WaitForAssertion(() => comp.Instance.ValueChangeCount.Should().Be(1));
135+
comp.Instance.ValuesChangeCount.Should().Be(1);
136+
select.Instance.Value.Should().Be("1");
137+
138+
// Changing value programmatically without ForceUpdate should change value, but should not fire change events
139+
// Its by design, so this part can be change if design changes
140+
await comp.InvokeAsync(() => select.SetParam("Value", "2"));
141+
comp.WaitForAssertion(() => comp.Instance.ValueChangeCount.Should().Be(1));
142+
comp.Instance.ValuesChangeCount.Should().Be(1);
143+
select.Instance.Value.Should().Be("2");
144+
}
145145

146146
[Test]
147147
public async Task Select_ValueChangeEventCountTest_MultiSelection()

CodeBeam.MudExtensions/Base/MudBaseInputExtended.cs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,15 @@ protected MudBaseInputExtended() : base(new DefaultConverter<T>()) { }
227227
[Parameter]
228228
public string MockInputStyle { get; set; }
229229

230+
/// <summary>
231+
/// Sync the value, values and text, calls validation manually. Useful to call after user changes value or text programmatically.
232+
/// </summary>
233+
/// <returns></returns>
234+
public virtual async Task ForceUpdate()
235+
{
236+
await SetValueAsync(Value, force: true);
237+
}
238+
230239
/// <summary>
231240
/// Derived classes need to override this if they can be something other than text
232241
/// </summary>
@@ -299,10 +308,10 @@ protected internal virtual void OnBlurred(FocusEventArgs obj)
299308
/// </summary>
300309
[Parameter] public EventCallback<KeyboardEventArgs> OnKeyDown { get; set; }
301310

302-
protected virtual void InvokeKeyDown(KeyboardEventArgs obj)
311+
protected virtual async Task InvokeKeyDown(KeyboardEventArgs obj)
303312
{
304313
_isFocused = true;
305-
OnKeyDown.InvokeAsync(obj).AndForget();
314+
await OnKeyDown.InvokeAsync(obj);
306315
}
307316

308317
/// <summary>
@@ -318,9 +327,9 @@ protected virtual void InvokeKeyDown(KeyboardEventArgs obj)
318327
/// </summary>
319328
[Parameter] public EventCallback<KeyboardEventArgs> OnKeyPress { get; set; }
320329

321-
protected virtual void InvokeKeyPress(KeyboardEventArgs obj)
330+
protected virtual async Task InvokeKeyPress(KeyboardEventArgs obj)
322331
{
323-
OnKeyPress.InvokeAsync(obj).AndForget();
332+
await OnKeyPress.InvokeAsync(obj);
324333
}
325334

326335
/// <summary>
@@ -335,10 +344,10 @@ protected virtual void InvokeKeyPress(KeyboardEventArgs obj)
335344
/// </summary>
336345
[Parameter] public EventCallback<KeyboardEventArgs> OnKeyUp { get; set; }
337346

338-
protected virtual void InvokeKeyUp(KeyboardEventArgs obj)
347+
protected virtual async Task InvokeKeyUp(KeyboardEventArgs obj)
339348
{
340349
_isFocused = true;
341-
OnKeyUp.InvokeAsync(obj).AndForget();
350+
await OnKeyUp.InvokeAsync(obj);
342351
}
343352

344353
/// <summary>
@@ -365,9 +374,9 @@ public T Value
365374
set => _value = value;
366375
}
367376

368-
protected virtual async Task SetValueAsync(T value, bool updateText = true)
377+
protected virtual async Task SetValueAsync(T value, bool updateText = true, bool force = false)
369378
{
370-
if (!EqualityComparer<T>.Default.Equals(Value, value))
379+
if (!EqualityComparer<T>.Default.Equals(Value, value) || force == true)
371380
{
372381
_isDirty = true;
373382
Value = value;

CodeBeam.MudExtensions/Components/SelectExtended/MudSelectExtended.razor

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
Value="@(Strict && !IsValueInList ? null : Text)" DisableUnderLine="@DisableUnderLine"
2525
Disabled="@Disabled" ReadOnly="true" Error="@Error" ErrorId="@ErrorId"
2626
Clearable="@Clearable" OnClearButtonClick="(async (e) => await SelectClearButtonClickHandlerAsync(e))"
27-
@attributes="UserAttributes" OnBlur="@OnLostFocus">
27+
@attributes="UserAttributes" OnBlur="@OnLostFocus" ForceShrink="@ForceShrink">
2828

2929
<AdornmentEnd>
3030
<MudIcon Icon="@_currentIcon" Color="@AdornmentColor" Size="@IconSize" @onclick="OnAdornmentClick" />

CodeBeam.MudExtensions/Components/SelectExtended/MudSelectExtended.razor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -922,9 +922,9 @@ public async Task SelectOption(object obj)
922922
}
923923

924924
//TODO: will override this method when core library will have the base one.
925-
public async Task ForceUpdate()
925+
public override async Task ForceUpdate()
926926
{
927-
//await base.ForceUpdate();
927+
await base.ForceUpdate();
928928
if (!MultiSelection)
929929
{
930930
SelectedValues = new HashSet<T>(_comparer) { Value };

CodeBeam.MudExtensions/Components/TextFieldExtended/MudTextFieldExtended.razor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public IMask Mask
141141
}
142142
}
143143

144-
protected override Task SetValueAsync(T value, bool updateText = true)
144+
protected override Task SetValueAsync(T value, bool updateText = true, bool force = false)
145145
{
146146
if (_mask != null)
147147
{
@@ -150,7 +150,7 @@ protected override Task SetValueAsync(T value, bool updateText = true)
150150
textValue=Mask.GetCleanText();
151151
value = Converter.Get(textValue);
152152
}
153-
return base.SetValueAsync(value, updateText);
153+
return base.SetValueAsync(value, updateText, force);
154154
}
155155

156156
protected override Task SetTextAsync(string text, bool updateValue = true)

ComponentViewer.Docs/Pages/Examples/TextFieldExtendedExample2.razor

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@
22
<MudGrid>
33
<MudItem xs="12" sm="8" Class="d-flex justify-center">
44
<MudPaper Width="200px" Elevation="0">
5-
<MudTextFieldExtended T="string" Lines="2" Immediate="true" AutoSize="_autosize" Label="AutoSized TextField" Variant="Variant.Filled" />
5+
<MudTextFieldExtended T="string" Lines="2" Immediate="true" AutoSize="_autosize" Label="AutoSized TextField" Variant="Variant.Filled" ForceShrink="_forceShrink" />
66
</MudPaper>
77
</MudItem>
88

99
<MudItem xs="12" sm="4">
1010
<MudStack>
1111
<MudSwitchM3 @bind-Checked="_autosize" Label="AutoSize" Color="Color.Primary" />
12+
<MudSwitchM3 @bind-Checked="_forceShrink" Label="Force Shrink" Color="Color.Primary" />
1213
</MudStack>
1314
</MudItem>
1415
</MudGrid>
1516

1617
@code {
1718
bool _autosize = true;
19+
bool _forceShrink = false;
1820
}

0 commit comments

Comments
 (0)