using System; using System.Collections.Generic; using System.Threading.Tasks; using AntDesign.Forms; using AntDesign.Internal; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Forms; using OneOf; namespace AntDesign { public partial class Form : AntDomComponentBase, IForm { private readonly string _prefixCls = "ant-form"; [Parameter] public string Layout { get; set; } = FormLayout.Horizontal; [Parameter] public RenderFragment ChildContent { get; set; } [Parameter] public ColLayoutParam LabelCol { get; set; } = new ColLayoutParam(); [Parameter] public AntLabelAlignType? LabelAlign { get; set; } [Parameter] public OneOf LabelColSpan { get { return LabelCol.Span; } set { LabelCol.Span = value; } } [Parameter] public OneOf LabelColOffset { get { return LabelCol.Offset; } set { LabelCol.Offset = value; } } [Parameter] public ColLayoutParam WrapperCol { get; set; } = new ColLayoutParam(); [Parameter] public OneOf WrapperColSpan { get { return WrapperCol.Span; } set { WrapperCol.Span = value; } } [Parameter] public OneOf WrapperColOffset { get { return WrapperCol.Offset; } set { WrapperCol.Offset = value; } } [Parameter] public string Size { get; set; } [Parameter] public string Name { get; set; } [Parameter] public TModel Model { get { return _model; } set { if (!(_model?.Equals(value) ?? false)) { _model = value; _editContext = new EditContext(Model); } } } [Parameter] public bool Loading { get; set; } [Parameter] public EventCallback OnFinish { get; set; } [Parameter] public EventCallback OnFinishFailed { get; set; } [Parameter] public RenderFragment Validator { get; set; } = _defaultValidator; /// /// Enable validation when component values change /// [Parameter] public bool ValidateOnChange { get; set; } private static readonly RenderFragment _defaultValidator = builder => { builder.OpenComponent(0); builder.CloseComponent(); }; [CascadingParameter(Name = "FormProvider")] private IFormProvider FormProvider { get; set; } public bool IsModified => _editContext.IsModified(); private EditContext _editContext; private IList _formItems = new List(); private IList _controls = new List(); private TModel _model; ColLayoutParam IForm.WrapperCol => WrapperCol; ColLayoutParam IForm.LabelCol => LabelCol; EditContext IForm.EditContext => _editContext; AntLabelAlignType? IForm.LabelAlign => LabelAlign; string IForm.Size => Size; string IForm.Name => Name; object IForm.Model => Model; bool IForm.ValidateOnChange => ValidateOnChange; bool IForm.IsModified => _editContext.IsModified(); public event Action OnFinishEvent; protected override void OnInitialized() { base.OnInitialized(); _editContext = new EditContext(Model); if (FormProvider != null) { FormProvider.AddForm(this); } } protected override void OnParametersSet() { base.OnParametersSet(); SetClass(); } protected void SetClass() { this.ClassMapper.Clear() .Add(_prefixCls) .Get(() => $"{_prefixCls}-{Layout.ToLowerInvariant()}") .If($"{_prefixCls}-rtl", () => RTL) ; } private async Task OnValidSubmit(EditContext editContext) { await OnFinish.InvokeAsync(editContext); OnFinishEvent?.Invoke(this); } private async Task OnInvalidSubmit(EditContext editContext) { await OnFinishFailed.InvokeAsync(editContext); } public void Reset() { _controls.ForEach(item => item.Reset()); _editContext = new EditContext(Model); } void IForm.AddFormItem(IFormItem formItem) { _formItems.Add(formItem); } void IForm.AddControl(IControlValueAccessor valueAccessor) { this._controls.Add(valueAccessor); } public void Submit() { var isValid = _editContext.Validate(); if (isValid) { if (OnFinish.HasDelegate) { OnFinish.InvokeAsync(_editContext); } OnFinishEvent?.Invoke(this); } else { OnFinishFailed.InvokeAsync(_editContext); } } public bool Validate() { return _editContext.Validate(); } public void ValidationReset() { _editContext = new EditContext(Model); } } }