You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Connected.Components/Components/Table/Tr.razor.cs

192 lines
4.7 KiB

using Connected.Utilities;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
namespace Connected.Components;
public partial class Tr : UIComponent
{
private bool hasBeenCanceled;
private bool hasBeenCommitted;
private bool hasBeenClickedFirstTime;
internal object _itemCopy;
protected string Classname => new CssBuilder("mud-table-row")
.AddClass(Class).Build();
protected string ActionsStylename => new StyleBuilder()
.AddStyle("padding-left", "34px", IsExpandable).Build();
[CascadingParameter] public TableContext Context { get; set; }
[Parameter] public RenderFragment ChildContent { get; set; }
[Parameter] public object Item { get; set; }
[Parameter] public bool IsCheckable { get; set; }
[Parameter] public bool IsEditable { get; set; }
[Parameter] public bool IsEditing { get; set; }
[Parameter] public bool IsEditSwitchBlocked { get; set; }
[Parameter] public bool IsExpandable { get; set; }
[Parameter]
public EventCallback<bool> IsCheckedChanged { get; set; }
private bool _checked;
[Parameter]
public bool IsChecked
{
get => _checked;
set
{
if (value != _checked)
{
_checked = value;
IsCheckedChanged.InvokeAsync(value);
}
}
}
public void OnRowClicked(MouseEventArgs args)
{
StartEditingItem(buttonClicked: false);
if (Context?.Table.MultiSelection == true && !(Context?.Table.IsEditable == true))
{
IsChecked = !IsChecked;
}
Context?.Table.FireRowClickEvent(args, this, Item);
}
private void StartEditingItem() => StartEditingItem(buttonClicked: true);
private void StartEditingItem(bool buttonClicked)
{
if (Context?.Table.IsEditable == true && Context?.Table.IsEditing == true && Context?.Table.IsEditRowSwitchingBlocked == true) return;
if ((Context?.Table.EditTrigger == TableEditTrigger.RowClick && buttonClicked) || (Context?.Table.EditTrigger == TableEditTrigger.EditButton && !buttonClicked)) return;
// Manage any previous edited row
Context.ManagePreviousEditedRow(this);
if (!(Context?.Table.Validator.IsValid ?? true))
return;
if (!buttonClicked)
Context?.Table.SetSelectedItem(Item);
// Manage edition the first time the row is clicked and if the table is editable
if (!hasBeenClickedFirstTime && IsEditable)
{
// Sets hasBeenClickedFirstTime to true
hasBeenClickedFirstTime = true;
// Set to false that the item has been committed
// Set to false that the item has been cancelled
hasBeenCanceled = false;
hasBeenCommitted = false;
// Trigger the preview event
Context?.Table.OnPreviewEditHandler(Item);
// Trigger the row edit preview event
Context.Table.RowEditPreview?.Invoke(Item);
Context?.Table.SetEditingItem(Item);
}
}
protected override Task OnInitializedAsync()
{
Context?.Add(this, Item);
return base.OnInitializedAsync();
}
public void Dispose()
{
Context?.Remove(this, Item);
}
public void SetChecked(bool b, bool notify)
{
if (notify)
IsChecked = b;
else
{
_checked = b;
InvokeAsync(StateHasChanged);
}
}
private void FinishEdit(MouseEventArgs ev)
{
// Check the validity of the item
if (!Context?.Table.Validator.IsValid ?? true) return;
// Set the item value to cancel edit mode
Context?.Table.SetEditingItem(null);
// Trigger the commit event
Context?.Table.OnCommitEditHandler(ev, Item);
// Trigger the row edit commit event
Context.Table.RowEditCommit?.Invoke(Item);
// Set to true that the item has been committed
// Set to false that the item has been cancelled
hasBeenCommitted = true;
hasBeenCanceled = false;
// Set hasBeenClickedFirstTime to false
hasBeenClickedFirstTime = false;
}
private void CancelEdit(MouseEventArgs ev)
{
// Set the item value to cancel edit mode
Context?.Table.SetEditingItem(null);
// Trigger the cancel event
Context?.Table.OnCancelEditHandler(ev);
// Trigger the row edit cancel event
Context?.Table.RowEditCancel?.Invoke(Item);
// Set to true that the item has been canceled
// Set to false that the items has been committed
hasBeenCanceled = true;
hasBeenCommitted = false;
// Set hasBeenClickedFirstTime to false
hasBeenClickedFirstTime = false;
}
public void ManagePreviousEdition()
{
// Reset the item to its original value if no cancellation and no commit has been done
if (!hasBeenCanceled && !hasBeenCommitted)
{
// Set the item value to cancel edit mode
Context?.Table.SetEditingItem(null);
// Force/indicate a refresh on the component to remove the edition mode for the row
StateHasChanged();
// Trigger the row edit cancel event
Context.Table.RowEditCancel?.Invoke(Item);
}
// Reset the variables
hasBeenCanceled = false;
hasBeenCommitted = false;
hasBeenClickedFirstTime = false;
}
}