-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathObjectEditor.razor
More file actions
154 lines (149 loc) · 6.22 KB
/
Copy pathObjectEditor.razor
File metadata and controls
154 lines (149 loc) · 6.22 KB
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
@inject NavigationManager NavigationManager
@*
// Help to use style class for bootstrap: https://www.w3schools.com/bootstrap/bootstrap_ref_all_classes.asp
*@
@using static UISupportGeneric.Util
@using UISupportGeneric.UI
@using UISupportGeneric.Resources
@{
Info ??= ObjectToEdit == null ? null : GetClassInfo(ObjectToEdit, InterfaceType, SaveAction);
var uri = new Uri(NavigationManager.Uri);
var queryStrings = System.Web.HttpUtility.ParseQueryString(uri.Query);
foreach (string? key in queryStrings.AllKeys)
{
if (key != null)
{
var value = queryStrings[key];
if (value != null)
{
Info?.SetQueryString(key, value);
}
}
}
var container = Level == 0 ? "" : "card my-3";
var title = Level == 0 ? "h1" : "card-header";
var body = Level == 0 ? "" : "card-body";
if (Info?.RedirectTo != null)
{
NavigationManager.NavigateTo(Info.RedirectTo.ToString());
}
}
<div class="@container">
<div class="@title">
@Info?.Label
</div>
<div class="@body">
@if (Info?.Description != null)
{
<div class="lead" style="white-space: pre-wrap; overflow-wrap: anywhere">@Info.Description</div>
}
@if (Info != null)
{
foreach (var element in Info.Elements)
{
if (element.Hidden != true)
{
if (element is MethodUISupport method)
{
var fieldsetClass = method.Parameters.Count > 0 ? "container panel panel-default border my-3" : "";
<fieldset class=@fieldsetClass>
@if (method.Parameters.Count != 0)
{
<p class="h5">@method.Description</p>
}
@foreach (var parameter in method.Parameters)
{
<ObjectMember EditableMember="@parameter" RefreshContainer="@Refresh" OnEnterKeyPressed="@(() => { method.Execute(); RefreshContainer?.Invoke(); })"></ObjectMember>
}
<button class="btn btn-primary my-1" type="submit" @onclick="() => { method.Execute(); RefreshContainer?.Invoke(); }">@method.Label</button>
@if (method.Parameters.Count == 0)
{
<Tooltip Text="@method.Description"></Tooltip>
}
@if (method.TableResult != null)
{
<ObjectArray Array="@method.TableResult" RefreshContainer="@Refresh"></ObjectArray>
}
else
{
<Message Hidden="@(!method.ShowResult)" Success="@method.Successful" Title="@Dictionary.Result" Text="@(method.Successful ? method.Result : method.Error)" Tooltip="@method.Tooltip"></Message>
}
</fieldset>
}
else if (element is PropertyUISupport property)
{
<ObjectMember EditableMember="@property" RefreshContainer="@Refresh"></ObjectMember>
}
else if (element is TableUISupport array)
{
<ObjectArray Array="@array" RefreshContainer="@Refresh"></ObjectArray>
}
else if (element is ObjectsCollection objectsCollection)
{
foreach (var obj in objectsCollection.Elements)
{
if (obj is ClassInfo classInfo)
{
<ObjectEditor ObjectToEdit="null" Info="@classInfo" InterfaceType="@InterfaceType" RefreshContainer="@Refresh" Level="@(Level + 1)"></ObjectEditor>
}
if (obj is ArrayElementPrimitiveUI arrayElementPrimitiveUI)
{
<ObjectMember EditableMember="@arrayElementPrimitiveUI" RefreshContainer="@Refresh"></ObjectMember>
}
}
}
else if (element is ClassInfo obj)
{
<ObjectEditor ObjectToEdit="null" Info="@obj" InterfaceType="@InterfaceType" RefreshContainer="@Refresh" Level="@(Level + 1)"></ObjectEditor>
}
}
}
}
</div>
</div>
@if (Info != null && !Info.InterfaceType.HasFlag(InterfaceType.NoSubmitButton) && !Info.InterfaceType.HasFlag(InterfaceType.AutoSave))
{
<button class="btn btn-primary" type="submit" @onclick=OnSubmit>@Dictionary.Submit</button>
@code {
private void OnSubmit(Microsoft.AspNetCore.Components.Web.MouseEventArgs e)
{
var errorLog = Info?.Submit?.Invoke();
if (errorLog != null)
{
TitleWarning = Dictionary.ValidationError;
DescriptionWarning = errorLog;
HiddenWarning = false;
}
else
{
HiddenWarning = true;
}
}
// private Warning? Warning;
private string? TitleWarning;
private string? DescriptionWarning;
private bool HiddenWarning = true;
}
<Warning Message="@DescriptionWarning" Title="@TitleWarning" Hidden="@HiddenWarning"></Warning>
}
@code {
private void Refresh()
{
InvokeAsync(StateHasChanged);
}
// Used to update the container component
[Parameter, EditorRequired]
public Action? RefreshContainer { get; set; }
[Parameter]
public ClassInfo? Info { get; set; }
// The object to edit or static class
[Parameter]
public object? ObjectToEdit { get; set; }
[Parameter]
public InterfaceType InterfaceType { get; set; } = InterfaceType.AutoSave;
[Parameter]
// Action to execute on save (a call occurs every time the edited object should be saved)
public ClassInfo.SaveAction? SaveAction { get; set; }
[Parameter]
public int Level { get; set; } = 0;
}