using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using OneOf;
namespace AntDesign
{
///
/// Modal Dialog
///
public partial class Modal
{
#region Parameter
///
///
///
[Parameter]
public ModalRef ModalRef { get; set; }
///
/// Specify a function that will be called when modal is closed
///
[Parameter]
public Func AfterClose { get; set; }
///
/// Body style for modal body element. Such as height, padding etc
///
[Parameter]
public string BodyStyle { get; set; }
///
/// Text or RenderFragment of the Cancel button, it will override the ModalLocale
///
[Parameter]
public OneOf? CancelText { get; set; } = null;
///
/// centered
///
[Parameter]
public bool Centered { get; set; }
///
/// Whether a close (x) button is visible on top right of the modal dialog or not
///
[Parameter]
public bool Closable { get; set; } = true;
///
/// Whether the modal dialog box be dragged
///
[Parameter]
public bool Draggable { get; set; }
///
/// Drag and drop only within the Viewport
///
[Parameter]
public bool DragInViewport { get; set; } = true;
///
/// closer icon RenderFragment, the default is a "X"
///
[Parameter]
public RenderFragment CloseIcon { get; set; } = DialogOptions.DefaultCloseIcon;
///
/// Whether to apply loading visual effect for OK button or not
///
[Parameter]
public bool ConfirmLoading { get; set; }
///
/// Whether to unmount child components on onClose, default is false
///
[Parameter]
public bool DestroyOnClose { get; set; }
///
/// Footer content, set as Footer=null when you don't need default buttons
///
[Parameter]
public OneOf? Footer { get; set; } = DialogOptions.DefaultFooter;
///
/// get or set the modal parent DOM, default is null: which is specifying document.body
///
[Parameter]
public ElementReference? GetContainer { get; set; } = null;
///
/// Whether support press esc to close
///
[Parameter]
public bool Keyboard { get; set; } = true;
///
/// Whether show mask or not
///
[Parameter]
public bool Mask { get; set; } = true;
///
/// Whether to close the modal dialog when the mask (area outside the modal) is clicked
///
[Parameter]
public bool MaskClosable { get; set; } = true;
///
/// Style for modal's mask element
///
[Parameter]
public string MaskStyle { get; set; }
///
/// Text of RenderFragment of the OK button, it will override the ModalLocale
///
[Parameter]
public OneOf? OkText { get; set; } = null;
///
/// Button type of the OK button
///
[Parameter]
public string OkType { get; set; } = ButtonType.Primary;
#region title
///
/// The modal dialog's title. If TitleTemplate!= null, Title will not take effect
///
[Parameter]
public string Title { get; set; } = null;
///
/// The modal dialog's title
///
[Parameter]
public RenderFragment TitleTemplate { get; set; } = null;
#endregion
///
/// Whether the modal dialog is visible or not
///
[Parameter]
public bool Visible { get; set; }
///
/// Width of the modal dialog, the default value is 520
///
[Parameter] public OneOf Width { get; set; } = 520;
private string GetWidth()
{
if (Width.IsT0)
{
return Width.AsT0;
}
else
{
return $"{Width.AsT1}px";
}
}
///
/// The class name of the container of the modal dialog
///
[Parameter]
public string WrapClassName { get; set; }
///
/// The z-index of the Modal
///
[Parameter]
public int ZIndex { get; set; } = 1000;
///
/// Specify a function that will be called when a user clicks mask, close button on top right or Cancel button
///
[Parameter]
public EventCallback OnCancel { get; set; }
///
/// Specify a function that will be called when a user clicks the OK button
///
[Parameter]
public EventCallback OnOk { get; set; }
///
/// The OK button props
///
[Parameter]
public ButtonProps OkButtonProps { get; set; }
///
/// The Cancel button props
///
[Parameter]
public ButtonProps CancelButtonProps { get; set; }
///
///
///
[Parameter]
public RenderFragment ChildContent { get; set; }
///
/// Is RTL
///
[CascadingParameter]
public bool Rtl { get; set; } = false;
///
/// Modal Locale
///
[Parameter]
public ModalLocale Locale { get; set; } = LocaleProvider.CurrentLocale.Modal;
#endregion Parameter
#pragma warning disable 649
private DialogWrapper _dialogWrapper;
#pragma warning restore 649
private DialogOptions BuildDialogOptions()
{
DialogOptions options = new DialogOptions()
{
OnClosed = AfterClose,
BodyStyle = BodyStyle,
CancelText = CancelText ?? Locale.CancelText,
Centered = Centered,
Closable = Closable,
Draggable = Draggable,
DragInViewport = DragInViewport,
CloseIcon = CloseIcon,
ConfirmLoading = ConfirmLoading,
Footer = Footer,
GetContainer = GetContainer,
Keyboard = Keyboard,
Mask = Mask,
MaskClosable = MaskClosable,
MaskStyle = MaskStyle,
OkText = OkText ?? Locale.OkText,
OkType = OkType,
Title = Title,
TitleTemplate = TitleTemplate,
Width = Width,
WrapClassName = WrapClassName,
ZIndex = ZIndex,
OnCancel = async (e) =>
{
var args = new ModalClosingEventArgs(e, false);
var modalTemplate = (ModalRef as IFeedbackRef)?.ModalTemplate;
if (modalTemplate != null)
await modalTemplate.OnFeedbackCancelAsync(args);
if (!args.Cancel)
{
await (ModalRef?.OnCancel?.Invoke() ?? Task.CompletedTask);
if (OnCancel.HasDelegate)
{
await OnCancel.InvokeAsync(e);
}
}
},
OnOk = async (e) =>
{
var args = new ModalClosingEventArgs(e, false);
var modalTemplate = (ModalRef as IFeedbackRef)?.ModalTemplate;
if (modalTemplate != null)
await modalTemplate.OnFeedbackOkAsync(args);
if (!args.Cancel)
{
await (ModalRef?.OnOk?.Invoke() ?? Task.CompletedTask);
if (OnOk.HasDelegate)
{
await OnOk.InvokeAsync(e);
}
}
else
{
ConfirmLoading = false;
await InvokeStateHasChangedAsync();
}
},
OkButtonProps = OkButtonProps,
CancelButtonProps = CancelButtonProps,
Rtl = Rtl
};
return options;
}
#region Sustainable Dialog
private bool _hasFocus = false;
private async Task OnAfterDialogShow()
{
if (!_hasFocus)
{
await JsInvokeAsync(JSInteropConstants.FocusDialog, $"#{_dialogWrapper.Dialog.SentinelStart}");
_hasFocus = true;
if (ModalRef?.OnOpen != null)
{
await ModalRef.OnOpen();
}
}
}
private async Task OnAfterHide()
{
if (ModalRef?.OnClose != null)
{
await ModalRef.OnClose();
}
}
private async Task OnBeforeDialogWrapperDestroy()
{
_hasFocus = false;
await InvokeAsync(StateHasChanged);
}
#endregion
}
}