@inject IHttpClientFactory HttpClientFactory
@inject ISnackbar Snackbar
@inject IDialogService Dialog
@foreach (var action in Actions)
{
@action.Name
}
Action: @ActionSelected?.Name
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();
}
}
}