@inject IHttpClientFactory HttpClientFactory @inject ISnackbar Snackbar @inject IDialogService Dialog
@foreach (var action in Actions) { @action.Name }
Action: @ActionSelected?.Name
Add Parameter
@ActionSelected?.Content
Create Action Cancel Create @code { [Parameter, EditorRequired] public Guid Id { get; set; } private bool CreateActionVisible = false; private ActionCreateModel ActionCreateModel = new(); private List Actions = []; private ActionDto? ActionSelected = null; private readonly ActionModel VDAActionSelected = new(); private readonly ActionModel VDAActionSelectedReset = new(); private bool OverlayVisible; private ActionParameter ActionParameter = new(); private HttpClient Http = default!; protected override async Task OnAfterRenderAsync(bool firstRender) { await base.OnAfterRenderAsync(firstRender); if (!firstRender) return; Http = HttpClientFactory.CreateClient("MapManagerAPI"); await LoadAction(); StateHasChanged(); } private async Task LoadAction() { OverlayVisible = true; Actions.Clear(); var result = await Http.GetFromJsonAsync>($"api/Actions/{Id}"); if (result is not null && result.Any()) { Actions.AddRange(result); ActionSelectedChanged(Actions.First()); } OverlayVisible = false; StateHasChanged(); } private async Task CreateAction() { var nameInvalid = MapEditorHelper.NameValidation(ActionCreateModel.Name); if (nameInvalid.Any()) { Snackbar.Add(string.Join(';', nameInvalid), Severity.Error); return; } var actionDefault = new ActionModel() { ActionId = Guid.NewGuid().ToString(), ActionType = ActionCreateModel.Name, ActionDescription = "", BlockingType = BlockingType.NONE.ToString(), ActionParameters = [], }; ActionCreateModel.Content = JsonSerializer.Serialize(actionDefault, JsonOptionExtends.Write); var result = await (await Http.PostAsJsonAsync("api/Actions", ActionCreateModel)).Content.ReadFromJsonAsync>(); if (result == null) { Snackbar.Add("Lỗi giao tiếp với hệ thống", Severity.Error); return; } else if (!result.IsSuccess) { Snackbar.Add(result.Message, Severity.Error); return; } else if (result.Data is null) { Snackbar.Add("Không có dữ liệu trả về", Severity.Error); return; } Actions.Add(result.Data); if (Actions.Any()) ActionSelectedChanged(Actions.First()); else ActionSelected = new(); Snackbar.Add("Tạo Action thành công", Severity.Success); CreateActionVisible = false; StateHasChanged(); } public async Task DeleteAction() { if (ActionSelected is null) return; var parameters = new DialogParameters { { x => x.Content, $"Bạn có chắc chắn muốn xóa Action {ActionSelected.Name} đi không?" }, { x => x.ConfirmText, "Delete" }, { x => x.Color, Color.Secondary } }; var ConfirmDelete = await Dialog.ShowAsync("Xoá Action", 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 deletResult = await Http.DeleteFromJsonAsync($"api/Actions/{ActionSelected.Id}"); if (deletResult == null) { Snackbar.Add("Lỗi giao tiếp với hệ thống", Severity.Error); return; } else if (!deletResult.IsSuccess) { Snackbar.Add(deletResult.Message, Severity.Error); return; } var action = Actions.FirstOrDefault(action => action.Id == ActionSelected.Id); if (action is not null) Actions.Remove(action); if (Actions.Any()) ActionSelectedChanged(Actions.First()); else { ActionSelected = null; ActionModel actionNew = new(); SetActionSelectedDto(actionNew); SetActionSelectedResetDto(actionNew); } Snackbar.Add("Xóa Action thành công", Severity.Success); StateHasChanged(); } } private void ActionSelectedChanged(ActionDto action) { if (ActionSelected != action) { ActionSelected = action; var vdaAction = JsonSerializer.Deserialize(ActionSelected.Content, JsonOptionExtends.Read); if (vdaAction is not null) { SetActionSelectedDto(vdaAction); SetActionSelectedResetDto(vdaAction); } StateHasChanged(); } } public void ShowCreateAction() { ActionCreateModel.MapId = Id; ActionCreateModel.Content = ""; CreateActionVisible = true; StateHasChanged(); } public void Reset() { if (ActionSelected is null) return; SetActionSelectedDto(VDAActionSelectedReset); PreviewAction(); StateHasChanged(); } public async Task Save() { if (ActionSelected is null) return; if (!ValidateUpdateData(VDAActionSelectedReset, VDAActionSelected)) { Snackbar.Add("Không có sự thay đổi", Severity.Warning); return; } ActionSelected.Content = JsonSerializer.Serialize(VDAActionSelected, JsonOptionExtends.Write); var result = await (await Http.PutAsJsonAsync("api/Actions", ActionSelected)).Content.ReadFromJsonAsync(); if (result == null) { Snackbar.Add("Lỗi giao tiếp với hệ thống", Severity.Error); return; } else if (!result.IsSuccess) { Snackbar.Add(result.Message, Severity.Error); return; } SetActionSelectedResetDto(VDAActionSelected); Snackbar.Add("Cập nhật thành công", Severity.Success); StateHasChanged(); } private void PreviewAction() { if (ActionSelected is null) return; ActionSelected.Content = JsonSerializer.Serialize(VDAActionSelected, JsonOptionExtends.Write); StateHasChanged(); } private void SetActionSelectedDto(ActionModel dto) { VDAActionSelected.ActionId = dto.ActionId; VDAActionSelected.ActionType = dto.ActionType; VDAActionSelected.ActionDescription = dto.ActionDescription; VDAActionSelected.BlockingType = dto.BlockingType; List actionParameters = []; foreach (var param in dto.ActionParameters) { actionParameters.Add(new() { Value = param.Value, Key = param.Key }); } VDAActionSelected.ActionParameters = [..actionParameters]; } private void SetActionSelectedResetDto(ActionModel dto) { VDAActionSelectedReset.ActionId = dto.ActionId; VDAActionSelectedReset.ActionType = dto.ActionType; VDAActionSelectedReset.ActionDescription = dto.ActionDescription; VDAActionSelectedReset.BlockingType = dto.BlockingType; List actionParameters = []; foreach (var param in dto.ActionParameters) { actionParameters.Add(new() { Value = param.Value, Key = param.Key }); } VDAActionSelectedReset.ActionParameters = [.. actionParameters]; } private bool ValidateUpdateData(ActionModel old, ActionModel update) { if (old.ActionId != update.ActionId) return true; if (old.ActionType != update.ActionType) return true; if (old.ActionDescription != update.ActionDescription) return true; if (old.BlockingType != update.BlockingType) return true; if (old.ActionParameters.Length != update.ActionParameters.Length) return true; foreach (var param in old.ActionParameters) { if (!update.ActionParameters.Any(a => a.Key == param.Key && a.Value == param.Value)) return true; } return false; } private void AddParamterClick() { if (ActionSelected is null) return; if (string.IsNullOrEmpty(ActionParameter.Key)) { Snackbar.Add("Key không được để trống", Severity.Warning); return; } if (string.IsNullOrEmpty(ActionParameter.Value)) { Snackbar.Add("Value không được để trống", Severity.Warning); return; } List parameters = []; if (VDAActionSelected.ActionParameters is not null && VDAActionSelected.ActionParameters.Any()) parameters.AddRange(VDAActionSelected.ActionParameters.ToList()); parameters.Add(new() { Key = ActionParameter.Key, Value = ActionParameter.Value }); VDAActionSelected.ActionParameters = [.. parameters]; PreviewAction(); ActionParameter.Key = string.Empty; ActionParameter.Value = string.Empty; StateHasChanged(); } private void CommittedItemChanges(ActionParameter item) { PreviewAction(); StateHasChanged(); } private async Task DeleteParameter(ActionParameter item) { var parameters = new DialogParameters { { x => x.Content, "Bạn có chắc chắn muốn xóa paramter đi không?" }, { x => x.ConfirmText, "Delete" }, { x => x.Color, Color.Secondary } }; var ConfirmDelete = await Dialog.ShowAsync("Xoá Paramter", 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) { List actionParameters = []; if (VDAActionSelected.ActionParameters is not null && VDAActionSelected.ActionParameters.Any()) actionParameters.AddRange(VDAActionSelected.ActionParameters.ToList()); if (actionParameters.Any()) actionParameters.Remove(item); VDAActionSelected.ActionParameters = [.. actionParameters]; PreviewAction(); StateHasChanged(); } } }