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.
192 lines
4.7 KiB
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;
|
|
}
|
|
}
|