Skip to content

Commit

Permalink
some improvements added for JingetDynamicForm
Browse files Browse the repository at this point in the history
  • Loading branch information
vahid committed Jun 2, 2024
1 parent 67fd59e commit e4beb39
Show file tree
Hide file tree
Showing 6 changed files with 186 additions and 126 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,13 @@ else if (Attribute is JingetComboBox searchableComboBox && searchableComboBox.Se
<option value="">@searchableComboBox.DefaultText</option>
@foreach (var item in _data)
{
@* bool selected = item.Selected == true || (item.Value != null && Value != null && item.Value.ToString().Equals(Value.ToString())); *@
bool selected = item.Value != null && Value != null && item.Value.ToString().Equals(Value.ToString());
if (selected)
{
Task.Run(() => JS.InvokeVoidAsync("selectItem", Id, Value).GetAwaiter().GetResult());
Task.Run(() =>
{
JS.InvokeVoidAsync("selectItem", Id, Value).GetAwaiter().GetResult();
});
}
<option value="@item.Value" selected="@selected">@item.Text</option>
}
Expand Down Expand Up @@ -147,16 +149,27 @@ else

@code {

[JsonProperty]
[Parameter] public string? Id { get; set; }

[JsonProperty]
[Parameter] public JingetFormElement? Attribute { get; set; }

[JsonProperty]
[Parameter] public object? Value { get; set; }

[JsonIgnore]
[JsonProperty]
[Parameter] public PropertyInfo? Binding { get; set; }

/// <summary>
/// This event raised whenever a field's value changed
/// </summary>
[JsonIgnore]
[Parameter] public EventCallback<object> ValueChanged { get; set; }

/// <summary>
/// This event raised whenever a field rendered on page
/// </summary>
[JsonIgnore]
[Parameter] public EventCallback<JingetDynamicField> DynamicFieldAdded { get; set; }

Expand Down Expand Up @@ -195,29 +208,22 @@ else
}
}
if (firstRender)
await DynamicFieldAdded.InvokeAsync(new JingetDynamicField
{
Attribute = this.Attribute,
Id = this.Id,
Value = this.Value,
_data = this._data
});
await OnDynamicFieldAdded();
}

public async Task SelectComboItem(IJSRuntime js, string id, object? value)
async Task OnDynamicFieldAdded()
{
Value = value;
if (((JingetComboBox)Attribute).Searchable)
{
await js.InvokeVoidAsync("selectItem", id, value);
}
await DynamicFieldAdded.InvokeAsync(this);
}

[JSInvokable]
public void OnItemSelected(object value) => OnChange(new ChangeEventArgs() { Value = value });
void OnTextChanged(string value) => OnChange(new ChangeEventArgs() { Value = value });

async void OnChange(ChangeEventArgs e) => await ValueChanged.InvokeAsync(e.Value);
async void OnChange(ChangeEventArgs e)
{
await OnDynamicFieldAdded();
await ValueChanged.InvokeAsync(e.Value);
}

object? InvokeBindingFunction(string? functionName, params object[] parameters)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
Value=@(p.Property.DeclaringType==typeof(string) && p.Property.GetValue(Model)==null?"":p.Property.GetValue(Model))
Attribute="@p.Attribute"
Binding="@p.Property"
@ref=JingetDynamicField
DynamicFieldAdded="@((e)=>OnDynamicFieldAdded(e))"
ValueChanged="@((e)=>OnValueChanged(p.Property.Name, e))" />
</MudItem>
Expand All @@ -25,11 +24,22 @@
@code {
[Parameter] public T? Model { get; set; }
[Parameter] public bool Rtl { get; set; } = true;

/// <summary>
/// This event raised whenever a member's value changed
/// </summary>
[Parameter] public EventCallback<Dictionary<string, object?>> OnModelChanged { get; set; }

public List<JingetDynamicField> DynamicFields { get; private set; } = [];
JingetDynamicField JingetDynamicField;
/// <summary>
/// This event raised whenever a field rendered on page
/// </summary>
[Parameter] public EventCallback<JingetDynamicField> OnFieldReady { get; set; }

/// <summary>
/// return the list of fields rendered on page
/// </summary>
public List<JingetDynamicField> DynamicFields { get; private set; } = [];

public HashSet<(PropertyInfo Property, JingetFormElement? Attribute)> Properties { get; set; } = new();

protected override void OnInitialized()
Expand All @@ -48,9 +58,11 @@
}
}

void OnDynamicFieldAdded(JingetDynamicField field)
async Task OnDynamicFieldAdded(JingetDynamicField field)
{
DynamicFields.RemoveAll(x => (x.Binding != null && x.Binding.Name == field.Binding.Name) || x.Id == field.Id);
DynamicFields.Add(field);
await OnFieldReady.InvokeAsync(field);
}

public List<JingetDynamicField> FindElement(string id)
Expand Down
1 change: 1 addition & 0 deletions 04-Presentation/Jinget.Blazor/GlobalUsings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@
global using Microsoft.Extensions.DependencyInjection;
global using Microsoft.Extensions.DependencyInjection.Extensions;
global using MudBlazor.Services;

14 changes: 13 additions & 1 deletion 04-Presentation/Jinget.Blazor/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -621,9 +621,21 @@ Add the `JingetDynamicForm` to your page and start using it;-)

`Rtl`: If set to true, the the form will be rendred Right-to-Left. Default is `true`.

***Properties:***

`DynamicFields`: Returns a list of fields rendered on page.

***Methods:***

`FindElement`: Find element by id.

`FindElement<TFormElementType>`: Find element by type.

***Callbacks:***

`OnModelChanged`: Fires a callback whenever the model is changed.
`OnModelChanged`: This event raised whenever a member's value changed.

`OnFieldReady`: This event raised whenever a field rendered on page.

***Attributes:***

Expand Down
157 changes: 54 additions & 103 deletions Tests/Jinget.Blazor.Test/Components/Pages/Dynamic.razor
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,20 @@
<MudText>Submit</MudText>
</MudButton>
<hr />
<JingetDynamicForm @ref=dynamicForm Model=@Model></JingetDynamicForm>
<JingetDynamicForm @ref=dynamicForm Model=@Model OnFieldReady="OnFieldReady"></JingetDynamicForm>

<MudButton FullWidth=true
OnClick="Submit"
Variant="Variant.Filled"
Color="Color.Primary">
<MudText>Submit</MudText>
</MudButton>
<MudButton FullWidth=true
OnClick="SetValue"
Variant="Variant.Filled"
Color="Color.Primary">
<MudText>Set Value</MudText>
</MudButton>
<MudButton FullWidth=true
OnClick="ViewElements"
Variant="Variant.Filled"
Expand All @@ -56,6 +62,11 @@
@code {
JingetDynamicForm<SampleModel> dynamicForm;

public void OnFieldReady(JingetDynamicField field)
{

}

public class InquiryByDateFromViewModel
{
[Attributes.Picker.JingetDateRangePicker(DisplayName = "تاریخ", HasLabel = false, Culture = "fa-IR")]
Expand All @@ -73,130 +84,70 @@
Model1 = new();
}

protected override Task OnAfterRenderAsync(bool firstRender)
{
return base.OnAfterRenderAsync(firstRender);
}

async Task Submit1()
{
await messageBox.ShowInfoAsync(
Model1.Date == null ? "" : Model1.Date.ToString(),
"",
Newtonsoft.Json.JsonConvert.SerializeObject(Model1));
await messageBox.ShowInfoAsync(Model1.Date == null ? "" : Model1.Date.ToString(), "", Newtonsoft.Json.JsonConvert.SerializeObject(Model1));
}
async Task Submit()
{
await messageBox.ShowInfoAsync(
Model.Name,
$"{Model.Name} {Model.LastName}",
Newtonsoft.Json.JsonConvert.SerializeObject(Model));
await messageBox.ShowInfoAsync(Model.Name, $"{Model.Name} {Model.LastName}", Newtonsoft.Json.JsonConvert.SerializeObject(Model));
}
async Task SetValue()
{
dynamicForm.Model.Status = 1;
dynamicForm.Model.Status2 = 2;
dynamicForm.Model.LastName = "Farahmandian";
await messageBox.ShowInfoAsync(Model.Name, $"{Model.Name} {Model.LastName}", Newtonsoft.Json.JsonConvert.SerializeObject(Model));
}

async Task ViewElements()
{
await messageBox.ShowInfoAsync("Elements on page", "", Newtonsoft.Json.JsonConvert.SerializeObject(new { dynamicForm.DynamicFields }, new Newtonsoft.Json.JsonSerializerSettings
{
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore,
}));
var result = dynamicForm.DynamicFields.Select(x => new
{
x.Attribute,
x.Value,
x.Id,
x.Binding?.Name
});
await messageBox.ShowInfoAsync("Elements on page", "",
Newtonsoft.Json.JsonConvert.SerializeObject(new { result },
new Newtonsoft.Json.JsonSerializerSettings
{
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore,
}));
}
async Task FindType()
{
var y = dynamicForm.FindElement<JingetComboBox>();
foreach (var i in y)
var fields = dynamicForm.FindElement<JingetComboBox>();
var result = fields.Select(x => new
{
await i.SelectComboItem(js, ((JingetComboBox)i.Attribute).Id, 3);
await InvokeAsync(StateHasChanged);
}

await messageBox.ShowInfoAsync("Elements on page", "", Newtonsoft.Json.JsonConvert.SerializeObject(new { y }, new Newtonsoft.Json.JsonSerializerSettings
x.Attribute,
x.Value,
x.Id,
x.Binding?.Name
});
await messageBox.ShowInfoAsync("Elements on page", "",
Newtonsoft.Json.JsonConvert.SerializeObject(new { Fields = result },
new Newtonsoft.Json.JsonSerializerSettings
{
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore,
}));
}

async Task FindId()
{
var y = dynamicForm.FindElement("cmbSearch");
foreach (var i in y)
var fields = dynamicForm.FindElement("cmbSearch");
var result = fields.Select(x => new
{
await i.SelectComboItem(js, ((JingetComboBox)i.Attribute).Id, 1);
await InvokeAsync(StateHasChanged);
}

await messageBox.ShowInfoAsync("Elements on page", "", Newtonsoft.Json.JsonConvert.SerializeObject(new { y }, new Newtonsoft.Json.JsonSerializerSettings
x.Attribute,
x.Value,
x.Id,
x.Binding?.Name
});
await messageBox.ShowInfoAsync("Elements on page", "",
Newtonsoft.Json.JsonConvert.SerializeObject(new { Fields = result },
new Newtonsoft.Json.JsonSerializerSettings
{
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore,
}));
}

public record SampleModel
{
public SampleModel()
{

}
ITokenStorageService tokenService;
ILocalStorageService localStorage;
public SampleModel(IServiceProvider serviceProvider)
{
tokenService = serviceProvider.GetRequiredService<ITokenStorageService>();
localStorage = serviceProvider.GetRequiredService<ILocalStorageService>();
}
[JingetTextBox(DisplayName = "نام", HelperText = "نام خود را منطبق با اطلاعات کارت ملی وارد نمایید", Order = 1)]
public string? Name { get; set; }

[JingetTextBox(DisplayName = "نام خانوادگی", HelperText = "نام خانوادگی خود را منطبق با اطلاعات کارت ملی وارد نمایید", Order = 2)]
public string? LastName { get; init; }

[JingetPasswordBox(DisplayName = "رمز عبور", Order = 3)]
public string? Password { get; init; }

[JingetEmailBox(DisplayName = "پست الکترونیکی", Order = 4)]
public string? EMail { get; init; }

[Attributes.Picker.JingetDatePicker(DisplayName = "تاریخ تولد", Culture = "fa-IR", Order = 5)]
public string? DoB { get; init; }

[Attributes.Picker.JingetDateRangePicker(DisplayName = "بازه زمانی سفر", Culture = "fa-IR", Order = 6)]
public DateRange? TravelDate { get; init; }

[JingetLabel(DisplayName = "امتیاز اکتسابی", HasLabel = false)]
public int Score { get; init; } = 1850;

[JingetTextArea(DisplayName = "اطلاعات بیشتر", Rows = 3)]
public string? Description { get; init; }

[JingetNumberBox(DisplayName = "سن", Order = 7)]
public int Age { get; set; }

[JingetComboBox(DisplayName = "وضعیت2", Id = "cmb2", BindingFunction = nameof(GetStatusAsync), DefaultText = "---انتخاب کنید---",
HasLabel = true, LabelCssClass = "overlayed-label", Order = 8, GetTokenBeforeBinding = true)]
public int? Status2 { get; init; }

[JingetComboBox(DisplayName = "وضعیت", Id = "cmbSearch",
BindingFunction = nameof(GetStatusAsync), PreBindingFunction = nameof(PreBinding), PostBindingFunction = nameof(PostBinding),
Searchable = true, DefaultText = "---انتخاب کنید---", HasLabel = true, LabelCssClass = "overlayed-label", Order = 9, GetTokenBeforeBinding = true)]
public int? Status { get; init; }
public async Task<string> PreBinding(string? token) => await Task.FromResult("This is pre binding");
public async Task<string> PostBinding(string? token, object? preBindingResult, object? data) => await Task.FromResult("This is post binding");
public async Task<List<DropDownItemModel>> GetStatusAsync(string token, object? preBindingResult)
=> await new JingetComboBox().BindAsync<StatusModel>(async () =>
{
var t = preBindingResult;
return await Task.FromResult(new List<StatusModel>{
new StatusModel{Code= 1,Title= token },
new StatusModel{Code= 2,Title= "غیرفعال"},
new StatusModel{Code= 3,Title= "نامشخص" }
});
});


class StatusModel : BaseTypeModel
{

}

}

}
Loading

0 comments on commit e4beb39

Please sign in to comment.