Progress
This commit is contained in:
		
							parent
							
								
									c3b267dfc4
								
							
						
					
					
						commit
						b178bbb9b0
					
				@ -10,18 +10,31 @@ namespace Connected.Components;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
public partial class Dialog : UIComponent
 | 
					public partial class Dialog : UIComponent
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   protected string ContentClass => new CssBuilder("dialog-content")
 | 
						#region Variables
 | 
				
			||||||
     .AddClass($"dialog-no-side-padding", DisableSidePadding)
 | 
					 | 
				
			||||||
     .AddClass(ClassContent)
 | 
					 | 
				
			||||||
   .Build();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   protected string ActionClass => new CssBuilder("dialog-actions")
 | 
					 | 
				
			||||||
     .AddClass(ClassActions)
 | 
					 | 
				
			||||||
   .Build();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	[CascadingParameter] private DialogInstance DialogInstance { get; set; }
 | 
						[CascadingParameter] private DialogInstance DialogInstance { get; set; }
 | 
				
			||||||
 | 
					 | 
				
			||||||
	[Inject] public IDialogService DialogService { get; set; }
 | 
						[Inject] public IDialogService DialogService { get; set; }
 | 
				
			||||||
 | 
						private IDialogReference _reference;
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Events
 | 
				
			||||||
 | 
						[Parameter]
 | 
				
			||||||
 | 
						[Category(CategoryTypes.Dialog.Behavior)]
 | 
				
			||||||
 | 
						public Action OnBackdropClick { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/// <summary>
 | 
				
			||||||
 | 
						/// Raised when the inline dialog's display status changes.
 | 
				
			||||||
 | 
						/// </summary>
 | 
				
			||||||
 | 
						[Parameter] public EventCallback<bool> IsVisibleChanged { get; set; }
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Content
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/// <summary>
 | 
				
			||||||
 | 
						/// Define the dialog title as a renderfragment (overrides GlyphTitle)
 | 
				
			||||||
 | 
						/// </summary>
 | 
				
			||||||
 | 
						[Parameter]
 | 
				
			||||||
 | 
						[Category(CategoryTypes.Dialog.Behavior)]
 | 
				
			||||||
 | 
						public DefaultFocus DefaultFocus { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
	/// Define the dialog title as a renderfragment (overrides GlyphTitle)
 | 
						/// Define the dialog title as a renderfragment (overrides GlyphTitle)
 | 
				
			||||||
@ -43,26 +56,15 @@ public partial class Dialog : UIComponent
 | 
				
			|||||||
	[Parameter]
 | 
						[Parameter]
 | 
				
			||||||
	[Category(CategoryTypes.Dialog.Behavior)]
 | 
						[Category(CategoryTypes.Dialog.Behavior)]
 | 
				
			||||||
	public RenderFragment DialogActions { get; set; }
 | 
						public RenderFragment DialogActions { get; set; }
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /// <summary>
 | 
						#region Styling
 | 
				
			||||||
   /// Default options to pass to Show(), if none are explicitly provided.
 | 
					 | 
				
			||||||
   /// Typically useful on inline dialogs.
 | 
					 | 
				
			||||||
   /// </summary>
 | 
					 | 
				
			||||||
   [Parameter]
 | 
					 | 
				
			||||||
   [Category(CategoryTypes.Dialog.Misc)]  // Behavior and Appearance
 | 
					 | 
				
			||||||
   public DialogOptions Options { get; set; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   [Parameter]
 | 
					 | 
				
			||||||
   [Category(CategoryTypes.Dialog.Behavior)]
 | 
					 | 
				
			||||||
   public Action OnBackdropClick { get; set; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
	/// No padding at the sides
 | 
						/// No padding at the sides
 | 
				
			||||||
	/// </summary>
 | 
						/// </summary>
 | 
				
			||||||
	[Parameter]
 | 
						[Parameter]
 | 
				
			||||||
	[Category(CategoryTypes.Dialog.Appearance)]
 | 
						[Category(CategoryTypes.Dialog.Appearance)]
 | 
				
			||||||
	public bool DisableSidePadding { get; set; }
 | 
						public bool DisableSidePadding { get; set; }
 | 
				
			||||||
 | 
					 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
	/// CSS class that will be applied to the dialog content
 | 
						/// CSS class that will be applied to the dialog content
 | 
				
			||||||
	/// </summary>
 | 
						/// </summary>
 | 
				
			||||||
@ -101,23 +103,56 @@ public partial class Dialog : UIComponent
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	private bool _isVisible;
 | 
						private bool _isVisible;
 | 
				
			||||||
 | 
						protected string ContentClass => new CssBuilder("dialog-content")
 | 
				
			||||||
 | 
						  .AddClass($"dialog-no-side-padding", DisableSidePadding)
 | 
				
			||||||
 | 
						  .AddClass(ClassContent)
 | 
				
			||||||
 | 
						.Build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						protected string ActionClass => new CssBuilder("dialog-actions")
 | 
				
			||||||
 | 
						  .AddClass(ClassActions)
 | 
				
			||||||
 | 
						.Build();
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Behavior
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
   /// Raised when the inline dialog's display status changes.
 | 
						/// Used for forwarding state changes from inlined dialog to its instance
 | 
				
			||||||
	/// </summary>
 | 
						/// </summary>
 | 
				
			||||||
   [Parameter] public EventCallback<bool> IsVisibleChanged { get; set; }
 | 
						internal void ForceUpdate()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							StateHasChanged();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
   /// Define the dialog title as a renderfragment (overrides GlyphTitle)
 | 
						/// Default options to pass to Show(), if none are explicitly provided.
 | 
				
			||||||
 | 
						/// Typically useful on inline dialogs.
 | 
				
			||||||
	/// </summary>
 | 
						/// </summary>
 | 
				
			||||||
	[Parameter]
 | 
						[Parameter]
 | 
				
			||||||
   [Category(CategoryTypes.Dialog.Behavior)]
 | 
						[Category(CategoryTypes.Dialog.Misc)]  // Behavior and Appearance
 | 
				
			||||||
   public DefaultFocus DefaultFocus { get; set; }
 | 
						public DialogOptions Options { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/// <summary>
 | 
				
			||||||
 | 
					   /// Close the currently open inlined dialog
 | 
				
			||||||
 | 
					   /// </summary>
 | 
				
			||||||
 | 
					   /// <param name="result"></param>
 | 
				
			||||||
 | 
					   public void Close(DialogResult result = null)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      if (!IsInline || _reference == null)
 | 
				
			||||||
 | 
					         return;
 | 
				
			||||||
 | 
					      _reference.Close(result);
 | 
				
			||||||
 | 
					      _reference = null;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private bool IsInline => DialogInstance == null;
 | 
						private bool IsInline => DialogInstance == null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   private IDialogReference _reference;
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Lifecycle
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						protected override void OnInitialized()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							base.OnInitialized();
 | 
				
			||||||
 | 
							DialogInstance?.Register(this);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
	/// Show this inlined dialog
 | 
						/// Show this inlined dialog
 | 
				
			||||||
@ -170,30 +205,6 @@ public partial class Dialog : UIComponent
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		base.OnAfterRender(firstRender);
 | 
							base.OnAfterRender(firstRender);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
   /// <summary>
 | 
					 | 
				
			||||||
   /// Used for forwarding state changes from inlined dialog to its instance
 | 
					 | 
				
			||||||
   /// </summary>
 | 
					 | 
				
			||||||
   internal void ForceUpdate()
 | 
					 | 
				
			||||||
   {
 | 
					 | 
				
			||||||
      StateHasChanged();
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   /// <summary>
 | 
					 | 
				
			||||||
   /// Close the currently open inlined dialog
 | 
					 | 
				
			||||||
   /// </summary>
 | 
					 | 
				
			||||||
   /// <param name="result"></param>
 | 
					 | 
				
			||||||
   public void Close(DialogResult result = null)
 | 
					 | 
				
			||||||
   {
 | 
					 | 
				
			||||||
      if (!IsInline || _reference == null)
 | 
					 | 
				
			||||||
         return;
 | 
					 | 
				
			||||||
      _reference.Close(result);
 | 
					 | 
				
			||||||
      _reference = null;
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   protected override void OnInitialized()
 | 
					 | 
				
			||||||
   {
 | 
					 | 
				
			||||||
      base.OnInitialized();
 | 
					 | 
				
			||||||
      DialogInstance?.Register(this);
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -12,29 +12,52 @@ namespace Connected.Components;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
public partial class DialogInstance : UIComponent, IDisposable
 | 
					public partial class DialogInstance : UIComponent, IDisposable
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						#region Variables
 | 
				
			||||||
	private DialogOptions _options = new();
 | 
						private DialogOptions _options = new();
 | 
				
			||||||
	private string _elementId = "dialog_" + Guid.NewGuid().ToString().Substring(0, 8);
 | 
						private string _elementId = "dialog_" + Guid.NewGuid().ToString().Substring(0, 8);
 | 
				
			||||||
	private IKeyInterceptor _keyInterceptor;
 | 
						private IKeyInterceptor _keyInterceptor;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	[Inject] private IKeyInterceptorFactory _keyInterceptorFactory { get; set; }
 | 
						[Inject] private IKeyInterceptorFactory _keyInterceptorFactory { get; set; }
 | 
				
			||||||
 | 
					 | 
				
			||||||
	[CascadingParameter(Name = "RightToLeft")] public bool RightToLeft { get; set; }
 | 
					 | 
				
			||||||
	[CascadingParameter] private DialogProvider Parent { get; set; }
 | 
						[CascadingParameter] private DialogProvider Parent { get; set; }
 | 
				
			||||||
	[CascadingParameter] private DialogOptions GlobalDialogOptions { get; set; } = new DialogOptions();
 | 
						[CascadingParameter] private DialogOptions GlobalDialogOptions { get; set; } = new DialogOptions();
 | 
				
			||||||
 | 
						private Dialog _dialog;
 | 
				
			||||||
 | 
						private bool _disposedValue;
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	[Parameter]
 | 
						#region Events
 | 
				
			||||||
	[Category(CategoryTypes.Dialog.Misc)]  // Behavior and Appearance
 | 
						private void HandleBackgroundClick()
 | 
				
			||||||
	public DialogOptions Options
 | 
					 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		get
 | 
							if (DisableBackdropClick)
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (_dialog?.OnBackdropClick == null)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if (_options == null)
 | 
								Cancel();
 | 
				
			||||||
				_options = new DialogOptions();
 | 
								return;
 | 
				
			||||||
			return _options;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		set => _options = value;
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							_dialog?.OnBackdropClick.Invoke();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/// <summary>
 | 
				
			||||||
 | 
						/// Cancels all dialogs in dialog provider collection.
 | 
				
			||||||
 | 
						/// </summary>
 | 
				
			||||||
 | 
						public void CancelAll()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Parent?.DismissAll();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public void Register(Dialog dialog)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (dialog == null)
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							_dialog = dialog;
 | 
				
			||||||
 | 
							//AdditionalClassList = dialog.AdditionalClassList;
 | 
				
			||||||
 | 
							TitleContent = dialog.TitleContent;
 | 
				
			||||||
 | 
							StateHasChanged();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Content
 | 
				
			||||||
	[Parameter]
 | 
						[Parameter]
 | 
				
			||||||
	[Category(CategoryTypes.Dialog.Behavior)]
 | 
						[Category(CategoryTypes.Dialog.Behavior)]
 | 
				
			||||||
	public string Title { get; set; }
 | 
						public string Title { get; set; }
 | 
				
			||||||
@ -46,10 +69,129 @@ public partial class DialogInstance : UIComponent, IDisposable
 | 
				
			|||||||
	[Parameter]
 | 
						[Parameter]
 | 
				
			||||||
	[Category(CategoryTypes.Dialog.Behavior)]
 | 
						[Category(CategoryTypes.Dialog.Behavior)]
 | 
				
			||||||
	public RenderFragment Content { get; set; }
 | 
						public RenderFragment Content { get; set; }
 | 
				
			||||||
 | 
					 | 
				
			||||||
	[Parameter]
 | 
						[Parameter]
 | 
				
			||||||
	[Category(CategoryTypes.Dialog.Behavior)]
 | 
						[Category(CategoryTypes.Dialog.Behavior)]
 | 
				
			||||||
	public Guid Id { get; set; }
 | 
						public Guid Id { get; set; }
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Styling
 | 
				
			||||||
 | 
						public void ForceRender()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							StateHasChanged();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						private string SetPosition()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							DialogPosition position;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (Options.Position.HasValue)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								position = Options.Position.Value;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if (GlobalDialogOptions.Position.HasValue)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								position = GlobalDialogOptions.Position.Value;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								position = DialogPosition.Center;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return $"dialog-{position.ToDescription()}";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private bool SetHideHeader()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (Options.NoHeader.HasValue)
 | 
				
			||||||
 | 
								return Options.NoHeader.Value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (GlobalDialogOptions.NoHeader.HasValue)
 | 
				
			||||||
 | 
								return GlobalDialogOptions.NoHeader.Value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private bool SetCloseButton()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (Options.CloseButton.HasValue)
 | 
				
			||||||
 | 
								return Options.CloseButton.Value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (GlobalDialogOptions.CloseButton.HasValue)
 | 
				
			||||||
 | 
								return GlobalDialogOptions.CloseButton.Value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private bool SetDisableBackdropClick()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (Options.DisableBackdropClick.HasValue)
 | 
				
			||||||
 | 
								return Options.DisableBackdropClick.Value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (GlobalDialogOptions.DisableBackdropClick.HasValue)
 | 
				
			||||||
 | 
								return GlobalDialogOptions.DisableBackdropClick.Value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private bool SetCloseOnEscapeKey()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (Options.CloseOnEscapeKey.HasValue)
 | 
				
			||||||
 | 
								return Options.CloseOnEscapeKey.Value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (GlobalDialogOptions.CloseOnEscapeKey.HasValue)
 | 
				
			||||||
 | 
								return GlobalDialogOptions.CloseOnEscapeKey.Value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						private string SetMaxWidth()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							MaxWidth maxWidth;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (Options.MaxWidth.HasValue)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								maxWidth = Options.MaxWidth.Value;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if (GlobalDialogOptions.MaxWidth.HasValue)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								maxWidth = GlobalDialogOptions.MaxWidth.Value;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								maxWidth = MaxWidth.Small;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return $"dialog-width-{maxWidth.ToDescription()}";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private bool SetFullWidth()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (Options.FullWidth.HasValue)
 | 
				
			||||||
 | 
								return Options.FullWidth.Value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (GlobalDialogOptions.FullWidth.HasValue)
 | 
				
			||||||
 | 
								return GlobalDialogOptions.FullWidth.Value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private bool SetFulScreen()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (Options.FullScreen.HasValue)
 | 
				
			||||||
 | 
								return Options.FullScreen.Value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (GlobalDialogOptions.FullScreen.HasValue)
 | 
				
			||||||
 | 
								return GlobalDialogOptions.FullScreen.Value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						protected string Classname =>
 | 
				
			||||||
 | 
							new CssBuilder("dialog")
 | 
				
			||||||
 | 
								.AddClass(DialogMaxWidth, !FullScreen)
 | 
				
			||||||
 | 
								.AddClass("dialog-width-full", FullWidth && !FullScreen)
 | 
				
			||||||
 | 
								.AddClass("dialog-fullscreen", FullScreen)
 | 
				
			||||||
 | 
								.AddClass("dialog-rtl", RightToLeft)
 | 
				
			||||||
 | 
								.AddClass(_dialog?.AdditionalClassList)
 | 
				
			||||||
 | 
							.Build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
	/// Custom close icon.
 | 
						/// Custom close icon.
 | 
				
			||||||
@ -66,35 +208,22 @@ public partial class DialogInstance : UIComponent, IDisposable
 | 
				
			|||||||
	private bool CloseButton { get; set; }
 | 
						private bool CloseButton { get; set; }
 | 
				
			||||||
	private bool FullScreen { get; set; }
 | 
						private bool FullScreen { get; set; }
 | 
				
			||||||
	private bool FullWidth { get; set; }
 | 
						private bool FullWidth { get; set; }
 | 
				
			||||||
 | 
						[CascadingParameter(Name = "RightToLeft")] public bool RightToLeft { get; set; }
 | 
				
			||||||
 | 
						[Parameter]
 | 
				
			||||||
	protected override void OnInitialized()
 | 
						[Category(CategoryTypes.Dialog.Misc)]  // Behavior and Appearance
 | 
				
			||||||
 | 
						public DialogOptions Options
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		ConfigureInstance();
 | 
							get
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (_options == null)
 | 
				
			||||||
 | 
									_options = new DialogOptions();
 | 
				
			||||||
 | 
								return _options;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							set => _options = value;
 | 
				
			||||||
	protected override async Task OnAfterRenderAsync(bool firstRender)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (firstRender)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			//Since CloseOnEscapeKey is the only thing to be handled, turn interceptor off
 | 
					 | 
				
			||||||
			if (CloseOnEscapeKey)
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				_keyInterceptor = _keyInterceptorFactory.Create();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				await _keyInterceptor.Connect(_elementId, new KeyInterceptorOptions()
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					TargetClass = "dialog",
 | 
					 | 
				
			||||||
					Keys = {
 | 
					 | 
				
			||||||
						 new KeyOptions { Key="Escape", SubscribeDown = true },
 | 
					 | 
				
			||||||
					 },
 | 
					 | 
				
			||||||
				});
 | 
					 | 
				
			||||||
				_keyInterceptor.KeyDown += HandleKeyDown;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		await base.OnAfterRenderAsync(firstRender);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Behavior
 | 
				
			||||||
	internal void HandleKeyDown(KeyboardEventArgs args)
 | 
						internal void HandleKeyDown(KeyboardEventArgs args)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		switch (args.Key)
 | 
							switch (args.Key)
 | 
				
			||||||
@ -175,157 +304,34 @@ public partial class DialogInstance : UIComponent, IDisposable
 | 
				
			|||||||
		//AdditionalClassList = Classname;
 | 
							//AdditionalClassList = Classname;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private string SetPosition()
 | 
						#endregion
 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		DialogPosition position;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (Options.Position.HasValue)
 | 
						#region Lifecycle
 | 
				
			||||||
 | 
						protected override void OnInitialized()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
			position = Options.Position.Value;
 | 
							ConfigureInstance();
 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		else if (GlobalDialogOptions.Position.HasValue)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			position = GlobalDialogOptions.Position.Value;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		else
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			position = DialogPosition.Center;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return $"dialog-{position.ToDescription()}";
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private string SetMaxWidth()
 | 
						protected override async Task OnAfterRenderAsync(bool firstRender)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		MaxWidth maxWidth;
 | 
							if (firstRender)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								//Since CloseOnEscapeKey is the only thing to be handled, turn interceptor off
 | 
				
			||||||
 | 
								if (CloseOnEscapeKey)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									_keyInterceptor = _keyInterceptorFactory.Create();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (Options.MaxWidth.HasValue)
 | 
									await _keyInterceptor.Connect(_elementId, new KeyInterceptorOptions()
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
			maxWidth = Options.MaxWidth.Value;
 | 
										TargetClass = "dialog",
 | 
				
			||||||
 | 
										Keys = {
 | 
				
			||||||
 | 
											 new KeyOptions { Key="Escape", SubscribeDown = true },
 | 
				
			||||||
 | 
										 },
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
									_keyInterceptor.KeyDown += HandleKeyDown;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		else if (GlobalDialogOptions.MaxWidth.HasValue)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			maxWidth = GlobalDialogOptions.MaxWidth.Value;
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else
 | 
							await base.OnAfterRenderAsync(firstRender);
 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			maxWidth = MaxWidth.Small;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return $"dialog-width-{maxWidth.ToDescription()}";
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private bool SetFullWidth()
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (Options.FullWidth.HasValue)
 | 
					 | 
				
			||||||
			return Options.FullWidth.Value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (GlobalDialogOptions.FullWidth.HasValue)
 | 
					 | 
				
			||||||
			return GlobalDialogOptions.FullWidth.Value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private bool SetFulScreen()
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (Options.FullScreen.HasValue)
 | 
					 | 
				
			||||||
			return Options.FullScreen.Value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (GlobalDialogOptions.FullScreen.HasValue)
 | 
					 | 
				
			||||||
			return GlobalDialogOptions.FullScreen.Value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	protected string Classname =>
 | 
					 | 
				
			||||||
		new CssBuilder("dialog")
 | 
					 | 
				
			||||||
			.AddClass(DialogMaxWidth, !FullScreen)
 | 
					 | 
				
			||||||
			.AddClass("dialog-width-full", FullWidth && !FullScreen)
 | 
					 | 
				
			||||||
			.AddClass("dialog-fullscreen", FullScreen)
 | 
					 | 
				
			||||||
			.AddClass("dialog-rtl", RightToLeft)
 | 
					 | 
				
			||||||
			.AddClass(_dialog?.AdditionalClassList)
 | 
					 | 
				
			||||||
		.Build();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private bool SetHideHeader()
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (Options.NoHeader.HasValue)
 | 
					 | 
				
			||||||
			return Options.NoHeader.Value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (GlobalDialogOptions.NoHeader.HasValue)
 | 
					 | 
				
			||||||
			return GlobalDialogOptions.NoHeader.Value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private bool SetCloseButton()
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (Options.CloseButton.HasValue)
 | 
					 | 
				
			||||||
			return Options.CloseButton.Value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (GlobalDialogOptions.CloseButton.HasValue)
 | 
					 | 
				
			||||||
			return GlobalDialogOptions.CloseButton.Value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private bool SetDisableBackdropClick()
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (Options.DisableBackdropClick.HasValue)
 | 
					 | 
				
			||||||
			return Options.DisableBackdropClick.Value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (GlobalDialogOptions.DisableBackdropClick.HasValue)
 | 
					 | 
				
			||||||
			return GlobalDialogOptions.DisableBackdropClick.Value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private bool SetCloseOnEscapeKey()
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (Options.CloseOnEscapeKey.HasValue)
 | 
					 | 
				
			||||||
			return Options.CloseOnEscapeKey.Value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (GlobalDialogOptions.CloseOnEscapeKey.HasValue)
 | 
					 | 
				
			||||||
			return GlobalDialogOptions.CloseOnEscapeKey.Value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private void HandleBackgroundClick()
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (DisableBackdropClick)
 | 
					 | 
				
			||||||
			return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (_dialog?.OnBackdropClick == null)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			Cancel();
 | 
					 | 
				
			||||||
			return;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		_dialog?.OnBackdropClick.Invoke();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	private Dialog _dialog;
 | 
					 | 
				
			||||||
	private bool _disposedValue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public void Register(Dialog dialog)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (dialog == null)
 | 
					 | 
				
			||||||
			return;
 | 
					 | 
				
			||||||
		_dialog = dialog;
 | 
					 | 
				
			||||||
		//AdditionalClassList = dialog.AdditionalClassList;
 | 
					 | 
				
			||||||
		TitleContent = dialog.TitleContent;
 | 
					 | 
				
			||||||
		StateHasChanged();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public void ForceRender()
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		StateHasChanged();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/// <summary>
 | 
					 | 
				
			||||||
	/// Cancels all dialogs in dialog provider collection.
 | 
					 | 
				
			||||||
	/// </summary>
 | 
					 | 
				
			||||||
	public void CancelAll()
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		Parent?.DismissAll();
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	protected virtual void Dispose(bool disposing)
 | 
						protected virtual void Dispose(bool disposing)
 | 
				
			||||||
@ -350,4 +356,6 @@ public partial class DialogInstance : UIComponent, IDisposable
 | 
				
			|||||||
		Dispose(disposing: true);
 | 
							Dispose(disposing: true);
 | 
				
			||||||
		GC.SuppressFinalize(this);
 | 
							GC.SuppressFinalize(this);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -15,9 +15,10 @@ namespace Connected.Components;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
public partial class DialogProvider : IDisposable
 | 
					public partial class DialogProvider : IDisposable
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Variables
 | 
				
			||||||
	[Inject] private IDialogService DialogService { get; set; }
 | 
						[Inject] private IDialogService DialogService { get; set; }
 | 
				
			||||||
	[Inject] private NavigationManager NavigationManager { get; set; }
 | 
						[Inject] private NavigationManager NavigationManager { get; set; }
 | 
				
			||||||
 | 
					 | 
				
			||||||
	[Parameter][Category(CategoryTypes.Dialog.Behavior)] public bool? NoHeader { get; set; }
 | 
						[Parameter][Category(CategoryTypes.Dialog.Behavior)] public bool? NoHeader { get; set; }
 | 
				
			||||||
	[Parameter][Category(CategoryTypes.Dialog.Behavior)] public bool? CloseButton { get; set; }
 | 
						[Parameter][Category(CategoryTypes.Dialog.Behavior)] public bool? CloseButton { get; set; }
 | 
				
			||||||
	[Parameter][Category(CategoryTypes.Dialog.Behavior)] public bool? DisableBackdropClick { get; set; }
 | 
						[Parameter][Category(CategoryTypes.Dialog.Behavior)] public bool? DisableBackdropClick { get; set; }
 | 
				
			||||||
@ -28,7 +29,47 @@ public partial class DialogProvider : IDisposable
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	private readonly Collection<IDialogReference> _dialogs = new();
 | 
						private readonly Collection<IDialogReference> _dialogs = new();
 | 
				
			||||||
	private readonly DialogOptions _globalDialogOptions = new();
 | 
						private readonly DialogOptions _globalDialogOptions = new();
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Events
 | 
				
			||||||
 | 
						private void AddInstance(IDialogReference dialog)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							_dialogs.Add(dialog);
 | 
				
			||||||
 | 
							StateHasChanged();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						internal void DismissInstance(Guid id, DialogResult result)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							var reference = GetDialogReference(id);
 | 
				
			||||||
 | 
							if (reference != null)
 | 
				
			||||||
 | 
								DismissInstance(reference, result);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public void DismissAll()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							_dialogs.ToList().ForEach(r => DismissInstance(r, DialogResult.Cancel()));
 | 
				
			||||||
 | 
							StateHasChanged();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private void DismissInstance(IDialogReference dialog, DialogResult result)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (!dialog.Dismiss(result)) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							_dialogs.Remove(dialog);
 | 
				
			||||||
 | 
							StateHasChanged();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private IDialogReference GetDialogReference(Guid id)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return _dialogs.SingleOrDefault(x => x.Id == id);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private void LocationChanged(object sender, LocationChangedEventArgs args)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							DismissAll();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Lifecycle
 | 
				
			||||||
	protected override void OnInitialized()
 | 
						protected override void OnInitialized()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		DialogService.OnDialogInstanceAdded += AddInstance;
 | 
							DialogService.OnDialogInstanceAdded += AddInstance;
 | 
				
			||||||
@ -57,43 +98,6 @@ public partial class DialogProvider : IDisposable
 | 
				
			|||||||
		return base.OnAfterRenderAsync(firstRender);
 | 
							return base.OnAfterRenderAsync(firstRender);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   internal void DismissInstance(Guid id, DialogResult result)
 | 
					 | 
				
			||||||
   {
 | 
					 | 
				
			||||||
      var reference = GetDialogReference(id);
 | 
					 | 
				
			||||||
      if (reference != null)
 | 
					 | 
				
			||||||
         DismissInstance(reference, result);
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   private void AddInstance(IDialogReference dialog)
 | 
					 | 
				
			||||||
   {
 | 
					 | 
				
			||||||
      _dialogs.Add(dialog);
 | 
					 | 
				
			||||||
      StateHasChanged();
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   public void DismissAll()
 | 
					 | 
				
			||||||
   {
 | 
					 | 
				
			||||||
      _dialogs.ToList().ForEach(r => DismissInstance(r, DialogResult.Cancel()));
 | 
					 | 
				
			||||||
      StateHasChanged();
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   private void DismissInstance(IDialogReference dialog, DialogResult result)
 | 
					 | 
				
			||||||
   {
 | 
					 | 
				
			||||||
      if (!dialog.Dismiss(result)) return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      _dialogs.Remove(dialog);
 | 
					 | 
				
			||||||
      StateHasChanged();
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   private IDialogReference GetDialogReference(Guid id)
 | 
					 | 
				
			||||||
   {
 | 
					 | 
				
			||||||
      return _dialogs.SingleOrDefault(x => x.Id == id);
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   private void LocationChanged(object sender, LocationChangedEventArgs args)
 | 
					 | 
				
			||||||
   {
 | 
					 | 
				
			||||||
      DismissAll();
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public void Dispose()
 | 
						public void Dispose()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (NavigationManager != null)
 | 
							if (NavigationManager != null)
 | 
				
			||||||
@ -105,4 +109,7 @@ public partial class DialogProvider : IDisposable
 | 
				
			|||||||
			DialogService.OnDialogCloseRequested -= DismissInstance;
 | 
								DialogService.OnDialogCloseRequested -= DismissInstance;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Components;
 | 
				
			|||||||
namespace Connected.Components;
 | 
					namespace Connected.Components;
 | 
				
			||||||
public partial class Divider : UIComponent
 | 
					public partial class Divider : UIComponent
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						#region Styling
 | 
				
			||||||
	protected string Classname =>
 | 
						protected string Classname =>
 | 
				
			||||||
   new CssBuilder("divider")
 | 
					   new CssBuilder("divider")
 | 
				
			||||||
     .AddClass($"divider-absolute", Absolute)
 | 
					     .AddClass($"divider-absolute", Absolute)
 | 
				
			||||||
@ -50,4 +51,6 @@ public partial class Divider : UIComponent
 | 
				
			|||||||
   [Parameter]
 | 
					   [Parameter]
 | 
				
			||||||
   [Category(CategoryTypes.Divider.Appearance)]
 | 
					   [Category(CategoryTypes.Divider.Appearance)]
 | 
				
			||||||
   public DividerType DividerType { get; set; } = DividerType.FullWidth;
 | 
					   public DividerType DividerType { get; set; } = DividerType.FullWidth;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -7,6 +7,7 @@ namespace Connected.Components;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
public partial class Drawer : UIComponent, IDisposable, INavigationEventReceiver
 | 
					public partial class Drawer : UIComponent, IDisposable, INavigationEventReceiver
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						#region Variables
 | 
				
			||||||
	private double _height;
 | 
						private double _height;
 | 
				
			||||||
	private ElementReference _contentRef;
 | 
						private ElementReference _contentRef;
 | 
				
			||||||
	private DrawerClipMode _clipMode;
 | 
						private DrawerClipMode _clipMode;
 | 
				
			||||||
@ -21,8 +22,16 @@ public partial class Drawer : UIComponent, IDisposable, INavigationEventReceiver
 | 
				
			|||||||
	private Breakpoint _screenBreakpoint = Breakpoint.None;
 | 
						private Breakpoint _screenBreakpoint = Breakpoint.None;
 | 
				
			||||||
	private Guid _breakpointListenerSubscriptionId;
 | 
						private Guid _breakpointListenerSubscriptionId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#region EventCallbacks
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Events
 | 
				
			||||||
 | 
						private void CloseDrawer()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (Open)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								OpenChanged.InvokeAsync(false);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	[Parameter] public EventCallback<bool> OpenChanged { get; set; }
 | 
						[Parameter] public EventCallback<bool> OpenChanged { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -351,13 +360,7 @@ public partial class Drawer : UIComponent, IDisposable, INavigationEventReceiver
 | 
				
			|||||||
			OpenChanged.InvokeAsync(_open);
 | 
								OpenChanged.InvokeAsync(_open);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	private void CloseDrawer()
 | 
						
 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (Open)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			OpenChanged.InvokeAsync(false);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
	/// Width of left/right drawer. Only for non-fixed drawers.
 | 
						/// Width of left/right drawer. Only for non-fixed drawers.
 | 
				
			||||||
 | 
				
			|||||||
@ -6,16 +6,33 @@ namespace Connected.Components;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
public partial class DrawerContainer : UIComponent
 | 
					public partial class DrawerContainer : UIComponent
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						#region Variables
 | 
				
			||||||
	protected bool Fixed { get; set; } = false;
 | 
						protected bool Fixed { get; set; } = false;
 | 
				
			||||||
	private List<Drawer> _drawers = new();
 | 
						private List<Drawer> _drawers = new();
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#region Event callbacks
 | 
						#region Events
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	internal void FireDrawersChanged() => StateHasChanged();
 | 
						internal void FireDrawersChanged() => StateHasChanged();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						internal void Add(Drawer drawer)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (Fixed && !drawer.Fixed)
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							_drawers.Add(drawer);
 | 
				
			||||||
 | 
							StateHasChanged();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						internal void Remove(Drawer drawer)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							_drawers.Remove(drawer);
 | 
				
			||||||
 | 
							StateHasChanged();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#endregion
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#region Content placeholders
 | 
						#region Content
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	[CascadingParameter(Name = "RightToLeft")] public bool RightToLeft { get; set; }
 | 
						[CascadingParameter(Name = "RightToLeft")] public bool RightToLeft { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -83,7 +100,7 @@ public partial class DrawerContainer : UIComponent
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	#endregion
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#region Styling properties
 | 
						#region Styling
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	protected virtual CssBuilder CompiledClassList
 | 
						protected virtual CssBuilder CompiledClassList
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@ -142,18 +159,5 @@ public partial class DrawerContainer : UIComponent
 | 
				
			|||||||
	#endregion
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	internal void Add(Drawer drawer)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (Fixed && !drawer.Fixed)
 | 
					 | 
				
			||||||
			return;
 | 
					 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
		_drawers.Add(drawer);
 | 
					 | 
				
			||||||
		StateHasChanged();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	internal void Remove(Drawer drawer)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		_drawers.Remove(drawer);
 | 
					 | 
				
			||||||
		StateHasChanged();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -4,10 +4,8 @@ using Microsoft.AspNetCore.Components;
 | 
				
			|||||||
namespace Connected.Components;
 | 
					namespace Connected.Components;
 | 
				
			||||||
public partial class DrawerHeader : UIComponent
 | 
					public partial class DrawerHeader : UIComponent
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	#region Event callbacks
 | 
					 | 
				
			||||||
	#endregion
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#region Content placeholders
 | 
						#region Content
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
	/// If true, compact padding will be used, same as the Appbar.
 | 
						/// If true, compact padding will be used, same as the Appbar.
 | 
				
			||||||
@ -29,7 +27,7 @@ public partial class DrawerHeader : UIComponent
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	#endregion
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#region Styling properties
 | 
						#region Styling
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
	/// A space separated list of class names, added on top of the default class list.
 | 
						/// A space separated list of class names, added on top of the default class list.
 | 
				
			||||||
@ -37,11 +35,13 @@ public partial class DrawerHeader : UIComponent
 | 
				
			|||||||
	[Parameter]
 | 
						[Parameter]
 | 
				
			||||||
	public string? ClassList { get; set; }
 | 
						public string? ClassList { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
	/// A space separated list of class names, added on top of the default class list.
 | 
						/// A space separated list of class names, added on top of the default class list.
 | 
				
			||||||
	/// </summary>
 | 
						/// </summary>
 | 
				
			||||||
	[Parameter]
 | 
						[Parameter]
 | 
				
			||||||
	public string? StyleList { get; set; }
 | 
						public string? StyleList { get; set; }
 | 
				
			||||||
 | 
						*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	protected virtual CssBuilder CompiledClassList
 | 
						protected virtual CssBuilder CompiledClassList
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@ -56,5 +56,4 @@ public partial class DrawerHeader : UIComponent
 | 
				
			|||||||
	#endregion
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -10,6 +10,13 @@ namespace Connected.Components;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
public class DragAndDropIndexChangedEventArgs : EventArgs
 | 
					public class DragAndDropIndexChangedEventArgs : EventArgs
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						#region Variables
 | 
				
			||||||
 | 
						public string ZoneIdentifier { get; }
 | 
				
			||||||
 | 
						public int Index { get; }
 | 
				
			||||||
 | 
						public string OldZoneIdentifier { get; }
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Events
 | 
				
			||||||
	public DragAndDropIndexChangedEventArgs(string zoneIdentifier, string oldZoneIdentifier, int index)
 | 
						public DragAndDropIndexChangedEventArgs(string zoneIdentifier, string oldZoneIdentifier, int index)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		ZoneIdentifier = zoneIdentifier;
 | 
							ZoneIdentifier = zoneIdentifier;
 | 
				
			||||||
@ -17,41 +24,17 @@ public class DragAndDropIndexChangedEventArgs : EventArgs
 | 
				
			|||||||
		OldZoneIdentifier = oldZoneIdentifier;
 | 
							OldZoneIdentifier = oldZoneIdentifier;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public string ZoneIdentifier { get; }
 | 
						#endregion
 | 
				
			||||||
	public int Index { get; }
 | 
					 | 
				
			||||||
	public string OldZoneIdentifier { get; }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// <summary>
 | 
					 | 
				
			||||||
/// Used to encapsulate data for a drag and drop transaction
 | 
					 | 
				
			||||||
/// </summary>
 | 
					 | 
				
			||||||
/// <typeparam name="T"></typeparam>
 | 
					 | 
				
			||||||
public class DragAndDropItemTransaction<T>
 | 
					public class DragAndDropItemTransaction<T>
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						#region Variables
 | 
				
			||||||
	private Func<Task> _commitCallback;
 | 
						private Func<Task> _commitCallback;
 | 
				
			||||||
	private Func<Task> _cancelCallback;
 | 
						private Func<Task> _cancelCallback;
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// <summary>
 | 
						#region Events
 | 
				
			||||||
	/// The Item that is dragged during the transaction
 | 
					 | 
				
			||||||
	/// </summary>
 | 
					 | 
				
			||||||
	public T Item { get; init; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/// <summary>
 | 
					 | 
				
			||||||
	/// The index of the item in the current drop zone
 | 
					 | 
				
			||||||
	/// </summary>
 | 
					 | 
				
			||||||
	public int Index { get; private set; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/// <summary>
 | 
					 | 
				
			||||||
	/// The index of the item when the transaction started
 | 
					 | 
				
			||||||
	/// </summary>
 | 
					 | 
				
			||||||
	public int SourceIndex { get; private set; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/// <summary>
 | 
					 | 
				
			||||||
	/// Identifier for drop zone where the transaction started
 | 
					 | 
				
			||||||
	/// </summary>
 | 
					 | 
				
			||||||
	public string SourceZoneIdentifier { get; init; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public string CurrentZone { get; private set; }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/// <summary>
 | 
						/// <summary>
 | 
				
			||||||
	/// create a new instance of a drag and drop transaction encapsulating the item and source
 | 
						/// create a new instance of a drag and drop transaction encapsulating the item and source
 | 
				
			||||||
@ -101,8 +84,53 @@ public class DragAndDropItemTransaction<T>
 | 
				
			|||||||
		Index = -1;
 | 
							Index = -1;
 | 
				
			||||||
		return true;
 | 
							return true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Content
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/// <summary>
 | 
				
			||||||
 | 
						/// The Item that is dragged during the transaction
 | 
				
			||||||
 | 
						/// </summary>
 | 
				
			||||||
 | 
						public T Item { get; init; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/// <summary>
 | 
				
			||||||
 | 
						/// The index of the item in the current drop zone
 | 
				
			||||||
 | 
						/// </summary>
 | 
				
			||||||
 | 
						public int Index { get; private set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/// <summary>
 | 
				
			||||||
 | 
						/// The index of the item when the transaction started
 | 
				
			||||||
 | 
						/// </summary>
 | 
				
			||||||
 | 
						public int SourceIndex { get; private set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/// <summary>
 | 
				
			||||||
 | 
						/// Identifier for drop zone where the transaction started
 | 
				
			||||||
 | 
						/// </summary>
 | 
				
			||||||
 | 
						public string SourceZoneIdentifier { get; init; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public string CurrentZone { get; private set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Styling
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Behavior
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#region Lifecycle
 | 
				
			||||||
 | 
						#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// <summary>
 | 
				
			||||||
 | 
					/// Used to encapsulate data for a drag and drop transaction
 | 
				
			||||||
 | 
					/// </summary>
 | 
				
			||||||
 | 
					/// <typeparam name="T"></typeparam>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// <summary>
 | 
					/// <summary>
 | 
				
			||||||
/// Record encaplusalting data regaring a completed transaction
 | 
					/// Record encaplusalting data regaring a completed transaction
 | 
				
			||||||
/// </summary>
 | 
					/// </summary>
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user