212 lines
8.4 KiB
Plaintext
212 lines
8.4 KiB
Plaintext
@inherits MudComponentBase
|
|
@using RobotApp.VDA5050.InstantAction
|
|
@using System.Text.Json
|
|
@using System.Text.Json.Serialization
|
|
@using RobotApp.VDA5050.Order
|
|
@using RobotApp.VDA5050.Type
|
|
|
|
<MudDialog>
|
|
<TitleContent>
|
|
<MudText Typo="Typo.h6">Edit Node: @Node.NodeId</MudText>
|
|
</TitleContent>
|
|
|
|
<DialogContent>
|
|
<MudGrid Spacing="3">
|
|
<MudItem xs="12">
|
|
<MudTextField @bind-Value="Node.NodeId" Label="Node ID" Required="true" />
|
|
</MudItem>
|
|
<MudItem xs="12">
|
|
<MudNumericField T="int" @bind-Value="Node.SequenceId" Label="Sequence ID" Required="true" />
|
|
</MudItem>
|
|
<MudItem xs="12">
|
|
<MudSwitch T="bool" @bind-Checked="Node.Released" Label="Released" />
|
|
</MudItem>
|
|
<MudItem xs="6">
|
|
<MudNumericField T="double" @bind-Value="Node.NodePosition.X" Label="X" />
|
|
</MudItem>
|
|
|
|
<MudItem xs="6">
|
|
<MudNumericField T="double" @bind-Value="Node.NodePosition.Y" Label="Y" />
|
|
</MudItem>
|
|
|
|
<MudItem xs="6">
|
|
<MudNumericField T="double" @bind-Value="Node.NodePosition.Theta" Label="Theta (rad)" />
|
|
</MudItem>
|
|
|
|
<MudItem xs="6">
|
|
<MudNumericField T="double" @bind-Value="Node.NodePosition.AllowedDeviationXY"
|
|
Label="Allowed Dev XY" />
|
|
</MudItem>
|
|
|
|
<MudItem xs="6">
|
|
<MudNumericField T="double" @bind-Value="Node.NodePosition.AllowedDeviationTheta"
|
|
Label="Allowed Dev Theta" />
|
|
</MudItem>
|
|
|
|
<MudItem xs="12">
|
|
<MudTextField @bind-Value="Node.NodePosition.MapId" Label="Map ID" />
|
|
</MudItem>
|
|
|
|
|
|
<MudItem xs="12">
|
|
<MudDivider Class="my-4" />
|
|
<MudText Typo="Typo.subtitle1" Class="mb-3">Actions</MudText>
|
|
|
|
@foreach (var act in Node.Actions)
|
|
{
|
|
<MudPaper Class="pa-3 mb-3" Outlined="true">
|
|
<MudGrid Spacing="3">
|
|
<MudItem xs="10">
|
|
<MudItem xs="12">
|
|
<MudSelect T="string"
|
|
Label="Action Type"
|
|
Dense="true"
|
|
Required="true"
|
|
@bind-Value="act.ActionType">
|
|
|
|
@foreach (var at in Enum.GetValues<ActionType>())
|
|
{
|
|
<MudSelectItem Value="@at.ToString()">
|
|
@at
|
|
</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
</MudItem>
|
|
</MudItem>
|
|
<MudItem xs="12">
|
|
<MudSelect T="string" @bind-Value="act.BlockingType" Label="Blocking Type">
|
|
<MudSelectItem Value="@("NONE")">NONE</MudSelectItem>
|
|
<MudSelectItem Value="@("SOFT")">SOFT</MudSelectItem>
|
|
<MudSelectItem Value="@("HARD")">HARD</MudSelectItem>
|
|
</MudSelect>
|
|
</MudItem>
|
|
<MudItem xs="12">
|
|
<MudTextField @bind-Value="act.ActionId" Label="Action ID" />
|
|
</MudItem>
|
|
</MudGrid>
|
|
|
|
<MudText Typo="Typo.caption" Class="mt-3 mb-2">Action Parameters</MudText>
|
|
|
|
@{
|
|
var parameters = act.ActionParameters ?? Array.Empty<ActionParameter>();
|
|
}
|
|
@foreach (var p in parameters.Cast<UiActionParameter>().ToList())
|
|
{
|
|
var param = p; // capture cho lambda
|
|
<MudGrid Class="mt-1">
|
|
<MudItem xs="5">
|
|
<MudTextField @bind-Value="param.Key" Label="Key" />
|
|
</MudItem>
|
|
<MudItem xs="5">
|
|
<MudTextField @bind-Value="param.ValueString" Label="Value" />
|
|
</MudItem>
|
|
<MudItem xs="2">
|
|
<MudIconButton Icon="@Icons.Material.Filled.Delete"
|
|
Color="Color.Error"
|
|
Size="Size.Small"
|
|
OnClick="@(() => RemoveParameter(act, param))" />
|
|
</MudItem>
|
|
</MudGrid>
|
|
}
|
|
|
|
<MudButton Size="Size.Small"
|
|
StartIcon="@Icons.Material.Filled.Add"
|
|
Class="mt-3"
|
|
OnClick="@(() => AddParameter(act))">
|
|
Add Parameter
|
|
</MudButton>
|
|
|
|
<MudDivider Class="my-3" />
|
|
|
|
<MudButton Size="Size.Small"
|
|
Color="Color.Error"
|
|
Variant="Variant.Text"
|
|
StartIcon="@Icons.Material.Filled.Delete"
|
|
OnClick="@(() => RemoveAction(act))">
|
|
Remove Action
|
|
</MudButton>
|
|
</MudPaper>
|
|
}
|
|
|
|
<MudButton Size="Size.Small"
|
|
StartIcon="@Icons.Material.Filled.Add"
|
|
OnClick="AddNewAction">
|
|
Add Action
|
|
</MudButton>
|
|
</MudItem>
|
|
</MudGrid>
|
|
</DialogContent>
|
|
|
|
<DialogActions>
|
|
<MudButton OnClick="Cancel">Cancel</MudButton>
|
|
<MudButton Color="Color.Primary" Variant="Variant.Filled" OnClick="Submit">Save</MudButton>
|
|
</DialogActions>
|
|
</MudDialog>
|
|
|
|
@code {
|
|
[CascadingParameter] public IMudDialogInstance MudDialog { get; set; } = default!;
|
|
[Parameter] public Node Node { get; set; } = default!;
|
|
|
|
private void Cancel() => MudDialog.Cancel();
|
|
private void Submit() => MudDialog.Close(DialogResult.Ok(true));
|
|
|
|
private void RemoveAction(VDA5050.InstantAction.Action actToRemove)
|
|
{
|
|
Node.Actions = Node.Actions
|
|
.Where(a => a != actToRemove)
|
|
.ToArray();
|
|
}
|
|
|
|
|
|
private void AddNewAction()
|
|
{
|
|
Node.Actions = Node.Actions
|
|
.Append(new VDA5050.InstantAction.Action
|
|
{
|
|
ActionId = Guid.NewGuid().ToString(),
|
|
ActionType = ActionType.startPause.ToString(),
|
|
BlockingType = "NONE",
|
|
ActionParameters = Array.Empty<ActionParameter>()
|
|
})
|
|
.ToArray();
|
|
}
|
|
|
|
|
|
|
|
private void AddParameter(VDA5050.InstantAction.Action act)
|
|
{
|
|
var newParam = new UiActionParameter();
|
|
|
|
if (act.ActionParameters == null || act.ActionParameters.Length == 0)
|
|
{
|
|
act.ActionParameters = new[] { newParam };
|
|
}
|
|
else
|
|
{
|
|
var list = act.ActionParameters.ToList();
|
|
list.Add(newParam);
|
|
act.ActionParameters = list.ToArray();
|
|
}
|
|
}
|
|
|
|
private void RemoveParameter(VDA5050.InstantAction.Action act, UiActionParameter paramToRemove)
|
|
{
|
|
if (act.ActionParameters == null || act.ActionParameters.Length == 0)
|
|
return;
|
|
|
|
act.ActionParameters = act.ActionParameters
|
|
.Where(p => p != paramToRemove) // so sánh reference
|
|
.ToArray();
|
|
}
|
|
|
|
// UiActionParameter vẫn giữ như cũ trong trang chính
|
|
public class UiActionParameter : ActionParameter
|
|
{
|
|
[JsonIgnore]
|
|
public string ValueString
|
|
{
|
|
get => Value?.ToString() ?? "";
|
|
set => Value = value;
|
|
}
|
|
}
|
|
} |