@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(); } }