-
-
Notifications
You must be signed in to change notification settings - Fork 114
/
InputField.Validation.cs
111 lines (95 loc) · 3.23 KB
/
InputField.Validation.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
using InputKit.Shared.Abstraction;
using InputKit.Shared.Validations;
using UraniumUI.Pages;
using UraniumUI.Resources;
using Path = Microsoft.Maui.Controls.Shapes.Path;
namespace UraniumUI.Material.Controls;
public partial class InputField : IValidatable
{
public List<IValidation> Validations { get; } = new();
public bool IsValid { get => ValidationResults().All(x => x.isValid); }
protected Lazy<ContentView> iconValidation = new Lazy<ContentView>(() => new ContentView
{
VerticalOptions = LayoutOptions.Center,
HorizontalOptions = LayoutOptions.End,
Padding = new Thickness(5, 0),
Margin = new Thickness(0, 0, 5, 0),
Content = new Path
{
StyleClass = new[] { "InputField.ValidationIcon" },
Fill = ColorResource.GetColor("Error", "ErrorDark", Colors.Red),
Data = UraniumShapes.ExclamationCircle,
}
});
protected Lazy<Label> labelValidation = new Lazy<Label>(() => new Label
{
StyleClass = new[] { "InputField.ValidationLabel" },
HorizontalOptions = LayoutOptions.Start,
TextColor = ColorResource.GetColor("Error", "ErrorDark", Colors.Red),
});
protected bool lastValidationState = true;
protected virtual void InitializeValidation()
{
this.AddRowDefinition(new RowDefinition(GridLength.Auto));
this.AddRowDefinition(new RowDefinition(GridLength.Auto));
}
protected virtual void CheckAndShowValidations()
{
var results = ValidationResults().ToArray();
var isValidationPassed = results.All(a => a.isValid);
var isStateChanged = isValidationPassed != lastValidationState;
lastValidationState = isValidationPassed;
if (isValidationPassed)
{
if (isStateChanged)
{
endIconsContainer.Remove(iconValidation.Value);
this.Remove(labelValidation.Value);
}
}
else
{
var message = string.Join('\n', results.Where(x => !x.isValid).Select(s => s.message));
labelValidation.Value.Text = message;
if (isStateChanged)
{
endIconsContainer.Add(iconValidation.Value);
this.Add(labelValidation.Value, row: 1);
}
}
}
protected IEnumerable<(bool isValid, string message)> ValidationResults()
{
foreach (var validation in Validations)
{
yield return ValidateOne(validation);
}
}
protected (bool isValid, string message) ValidateOne(IValidation validation)
{
try
{
var value = GetValueForValidator();
var validated = validation.Validate(value);
return new(validated, validation.Message);
}
catch (Exception ex)
{
return new(false, ex.Message);
}
}
protected virtual object GetValueForValidator()
{
return new object();
}
public virtual void DisplayValidation()
{
CheckAndShowValidations();
}
public virtual void ResetValidation()
{
endIconsContainer.Remove(iconValidation.Value);
this.Remove(labelValidation.Value);
lastValidationState = true;
}
}