SeemGen/Components/Partials/DynamicEditFormFromDescript...

195 lines
8.2 KiB
Plaintext

@using BLAIzor.Models
@using Radzen
@if (isEditing)
{
<EditForm EditContext="@editContext" OnValidSubmit="@HandleValidSubmit">
<div class="card p-4">
<h4 class="mb-3">@TitleString</h4>
@foreach (var group in Groups)
{
<h5 class="mt-4">@group.GroupName</h5>
@for (int entryIndex = 0; entryIndex < group.EntryCount; entryIndex++)
{
var entryPrefix = $"{group.GroupName}_{entryIndex}";
foreach (var field in group.Fields)
{
var label = $"{entryPrefix}_{field.Label}";
<div class="mb-3">
<label class="form-label">@field.Label</label>
@switch (field.Type?.ToLower())
{
case "textarea":
<RadzenTextArea Style="width:100%"
Value="@GetValue(label)"
Change="@(args => SetValue(label, args))" />
break;
case "number":
<RadzenNumeric TValue="int"
Value="@(Convert.ToInt32(GetValue(label)))"
Change="@(args => SetValue(label, args.ToString()))" />
break;
case "date":
<RadzenDatePicker TValue="DateTime?"
Value="@GetDate(label)"
Change="@(args => SetDate(label, args))" />
break;
case "checkbox":
<RadzenCheckBox TValue="bool"
Value="@GetCheckboxValue(label)"
Change="@(args => SetCheckboxValue(label, args))" />
break;
case "radio":
<RadzenRadioButtonList TValue="int"
Value="@GetRadioValue(label)"
Change="@(args => SetRadioValue(label, args))">
<Items>
@foreach (var option in field.Options ?? new())
{
var split = option.Split(':');
var text = split[0];
var val = split.Length > 1 && int.TryParse(split[1], out var parsedVal) ? parsedVal : 0;
<RadzenRadioButtonListItem Text="@text" Value="@val" />
}
</Items>
</RadzenRadioButtonList>
break;
case "select":
<RadzenDropDown TValue="string"
Data="@field.Options"
Value="@GetDropdownValue(label)"
Change="@(args => SetDropdownValue(label, args?.ToString()))" />
break;
default:
<RadzenTextBox Style="width:100%"
Value="@GetValue(label)"
Change="@(args => SetValue(label, args?.ToString()))" />
break;
}
</div>
}
}
@if (group.Repeatable)
{
<RadzenButton Icon="add_circle"
ButtonStyle="ButtonStyle.Light"
Text="Add Another"
Click="@(() => AddGroupEntry(group))" />
}
}
<RadzenButton ButtonStyle="ButtonStyle.Primary" Text="@ButtonTextString" Type="Submit" />
</div>
</EditForm>
}
else
{
<div class="card p-4">
<h4 class="mb-3">Details</h4>
@foreach (var kvp in formValues)
{
<p><strong>@kvp.Key:</strong> @kvp.Value</p>
}
</div>
}
<p class="mt-2">@FormSubmitResult</p>
@code {
[Parameter] public List<FormFieldGroup> Groups { get; set; } = new();
[Parameter] public List<string> IgnoreReflection { get; set; } = new();
[Parameter] public EventCallback<Dictionary<string, string>> OnSubmit { get; set; }
[Parameter] public bool isEditing { get; set; }
[Parameter] public string TitleString { get; set; } = "Edit your details";
[Parameter] public string ButtonTextString { get; set; } = "Submit";
private EditContext editContext;
private Dictionary<string, string> formValues = new();
private Dictionary<string, DateTime?> formDates = new();
private string FormSubmitResult = "";
protected override void OnParametersSet()
{
foreach (var group in Groups)
{
if (group.EntryCount == 0)
{
group.EntryCount = 1; // Always have at least one entry
}
for (int i = 0; i < group.EntryCount; i++)
{
foreach (var field in group.Fields)
{
var key = $"{group.GroupName}_{i}_{field.Label}";
if (!formValues.ContainsKey(key))
{
if (field.Type?.ToLower() == "radio" && field.Options?.Count > 0)
{
var defaultVal = field.Options.FirstOrDefault()?.Split(':').LastOrDefault() ?? "0";
formValues[key] = defaultVal;
}
else
{
formValues[key] = string.Empty;
}
}
if (field.Type?.ToLower() == "date" && !formDates.ContainsKey(key))
{
formDates[key] = DateTime.Today;
}
}
}
}
editContext = new EditContext(formValues);
}
private string GetValue(string label) => formValues.TryGetValue(label, out var value) ? value : "";
private void SetValue(string label, string? value) => formValues[label] = value ?? "";
private DateTime? GetDate(string label) => formDates.TryGetValue(label, out var date) ? date : null;
private void SetDate(string label, DateTime? value) => formDates[label] = value;
private string GetDropdownValue(string label) => formValues.TryGetValue(label, out var value) ? value : "";
private void SetDropdownValue(string label, string? value) => formValues[label] = value ?? "";
private bool GetCheckboxValue(string label) => formValues.TryGetValue(label, out var value) && bool.TryParse(value, out var result) && result;
private void SetCheckboxValue(string label, bool? value) => formValues[label] = (value ?? false).ToString();
private int GetRadioValue(string label) => formValues.TryGetValue(label, out var value) && int.TryParse(value, out var intValue) ? intValue : 0;
private void SetRadioValue(string label, int? value) => formValues[label] = value?.ToString() ?? "0";
private void AddGroupEntry(FormFieldGroup group)
{
group.EntryCount++;
StateHasChanged();
}
private async Task HandleValidSubmit()
{
foreach (var dateField in formDates)
{
formValues[dateField.Key] = dateField.Value?.ToString("yyyy-MM-dd") ?? "";
}
FormSubmitResult = "Success!";
await OnSubmit.InvokeAsync(formValues);
isEditing = false;
}
}