@inject IHttpClientFactory HttpClientFactory
@inject ISnackbar Snackbar
@inject IDialogService Dialog
@inject NavigationManager Nav
Elements
Name
Model
IsOpen
OffsetX
OffsetY
NodeId
@context.Name
@context.ModelName
@context.IsOpen
@context.OffsetX
@context.OffsetY
@context.NodeId
Edit
Delete
Update Element @ElementUpdateModel.Name
Cancel
Update
@code {
[Parameter]
public EventCallback ElementSelectChanged { get; set; }
private List Elements { get; set; } = [];
private List ElementsShow { get; set; } = [];
private string txtSearch = "";
private bool IsLoading;
private MudTable Table = default!;
private int selectedRowNumber = -1;
private bool updateElementVisble;
private ElementUpdateModel ElementUpdateModel = new();
private HttpClient Http = default!;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await base.OnAfterRenderAsync(firstRender);
if (!firstRender) return;
Http = HttpClientFactory.CreateClient("MapManagerAPI");
}
private bool FilterFunc(ElementDto element)
{
if (string.IsNullOrWhiteSpace(txtSearch))
return true;
if (element.Name.Contains(txtSearch, StringComparison.OrdinalIgnoreCase))
return true;
return false;
}
private Task> ReloadData(TableState state, CancellationToken _)
{
var robots = new List();
ElementsShow.Clear();
Elements.ForEach(robot =>
{
if (FilterFunc(robot)) robots.Add(robot);
});
ElementsShow = robots.Skip(state.Page * state.PageSize).Take(state.PageSize).ToList();
return Task.FromResult(new TableData() { TotalItems = robots.Count(), Items = ElementsShow });
}
private async Task LoadElements(Guid modelId)
{
IsLoading = true;
Elements.Clear();
StateHasChanged();
var elements = await Http.GetFromJsonAsync>>($"api/Elements/{modelId}");
if (elements is null) Snackbar.Add("Lỗi giao tiếp với hệ thống", Severity.Error);
else if (!elements.IsSuccess) Snackbar.Add($"Có lỗi xảy ra: {elements.Message}", Severity.Error);
else if (elements.Data is null || !elements.Data.Any())
{
Snackbar.Add("Không có element nào trong model này.", Severity.Warning);
ElementsShow.Clear();
Table?.ReloadServerData();
}
else
{
Elements.AddRange(elements.Data.OrderBy(el => el.Name));
Table?.ReloadServerData();
}
IsLoading = false;
StateHasChanged();
}
public async Task SetData(ElementModelDto? model)
{
selectedRowNumber = -1;
Table.SetSelectedItem(null);
_ = ElementSelectChanged.InvokeAsync(null);
if (model is null)
{
Elements.Clear();
await Table.ReloadServerData();
}
else await LoadElements(model.Id);
}
private void RowClickEvent(TableRowClickEventArgs tableRowClickEventArgs) { }
private string SelectedRowClassFunc(ElementDto element, int rowNumber)
{
if (selectedRowNumber == rowNumber && Table?.SelectedItem != null && !Table.SelectedItem.Equals(element))
{
return string.Empty;
}
else if (selectedRowNumber == rowNumber && Table?.SelectedItem != null && Table.SelectedItem.Equals(element))
{
return "selected";
}
else if (Table?.SelectedItem != null && Table.SelectedItem.Equals(element))
{
selectedRowNumber = rowNumber;
_ = ElementSelectChanged.InvokeAsync(element);
return "selected";
}
else
{
return string.Empty;
}
}
private void TextSearchChanged(string text)
{
txtSearch = text;
Table?.ReloadServerData();
}
private async Task Delete(ElementDto element)
{
var parameters = new DialogParameters
{
{ x => x.Content, $"Bạn có chắc chắn muốn xóa element {element.Name} đi không?" },
{ x => x.ConfirmText, "Delete" },
{ x => x.Color, Color.Secondary }
};
var ConfirmDelete = await Dialog.ShowAsync("Xoá Element", parameters);
var result = await ConfirmDelete.Result;
if (result is not null && result.Data is not null && bool.TryParse(result.Data.ToString(), out bool data) && data)
{
var response = await Http.DeleteFromJsonAsync($"api/Elements/{element.Id}");
if (response is null) Snackbar.Add("Lỗi giao tiếp với hệ thống", Severity.Error);
else if (!response.IsSuccess) Snackbar.Add(response.Message ?? "Lỗi chưa xác định.", Severity.Error);
else
{
var elementData = Elements.FirstOrDefault(m => m.Id == element.Id);
if (elementData is not null)
{
Elements.Remove(elementData);
await Table.ReloadServerData();
await ElementSelectChanged.InvokeAsync(null);
selectedRowNumber = -1;
Snackbar.Add($"Xóa element thành công.", Severity.Success);
}
else Snackbar.Add($"Element không tồn tại.", Severity.Warning);
}
StateHasChanged();
}
}
private void OpenEditElement(ElementDto model)
{
ElementUpdateModel.Id = model.Id;
ElementUpdateModel.Name = model.Name;
ElementUpdateModel.IsOpen = model.IsOpen;
ElementUpdateModel.OffsetX = model.OffsetX;
ElementUpdateModel.OffsetY = model.OffsetY;
ElementUpdateModel.Content = model.Content;
updateElementVisble = true;
StateHasChanged();
}
private async Task UpdateElement()
{
var selectedElement = Elements.FirstOrDefault(e => e.Id == ElementUpdateModel.Id);
if (selectedElement is null) return;
var result = await (await Http.PutAsJsonAsync($"api/Elements", new ElementUpdateModel()
{
Id = ElementUpdateModel.Id,
Name = ElementUpdateModel.Name,
IsOpen = ElementUpdateModel.IsOpen,
OffsetX = ElementUpdateModel.OffsetX,
OffsetY = ElementUpdateModel.OffsetY,
Content = ElementUpdateModel.Content,
})).Content.ReadFromJsonAsync>();
if (result == null) Snackbar.Add("Lỗi giao tiếp với hệ thống", Severity.Error);
else if (!result.IsSuccess) Snackbar.Add(result.Message, Severity.Error);
else if (result.Data is null) Snackbar.Add("Lỗi dữ liệu", Severity.Error);
else
{
selectedElement.Name = result.Data.Name;
selectedElement.OffsetX = result.Data.OffsetX;
selectedElement.OffsetY = result.Data.OffsetY;
selectedElement.IsOpen = result.Data.IsOpen;
Snackbar.Add("Cập nhật thành công", Severity.Success);
}
updateElementVisble = false;
StateHasChanged();
}
public void UpdateProperty(ElementDto model)
{
var element = Elements.FirstOrDefault(e => e.Id == model.Id);
if (element is null) return;
element.Name = model.Name;
element.OffsetX = model.OffsetX;
element.OffsetY = model.OffsetY;
element.IsOpen = model.IsOpen;
element.Content = model.Content;
StateHasChanged();
}
}