173 lines
7.7 KiB
Plaintext
173 lines
7.7 KiB
Plaintext
<MudPaper Class="pa-4 h-100 d-flex flex-column" Elevation="2">
|
|
<MudStack Row AlignItems="AlignItems.Center" Justify="Justify.SpaceBetween"
|
|
Class="mb-4 flex-shrink-0">
|
|
<MudText Typo="Typo.h6">🔗 Edges</MudText>
|
|
|
|
<MudButton Variant="Variant.Filled"
|
|
Color="Color.Primary"
|
|
StartIcon="@Icons.Material.Filled.Add"
|
|
OnClick="AddEdgeAsync">
|
|
Add Edge
|
|
</MudButton>
|
|
</MudStack>
|
|
|
|
<div class="flex-grow-1" style="overflow:auto;">
|
|
<MudExpansionPanels MultiExpansion>
|
|
@foreach (var edge in Order.Edges)
|
|
{
|
|
<MudExpansionPanel @key="edge">
|
|
<!-- ================= HEADER ================= -->
|
|
<TitleContent>
|
|
<div class="d-flex align-center justify-space-between w-100">
|
|
|
|
<!-- LEFT: Edge information -->
|
|
<div class="d-flex align-center gap-3">
|
|
<MudText Typo="Typo.subtitle1" Class="fw-bold">
|
|
@edge.EdgeId
|
|
</MudText>
|
|
|
|
<MudChip T="string"
|
|
Size="Size.Small"
|
|
Color="Color.Info"
|
|
Variant="Variant.Outlined">
|
|
@edge.StartNodeId → @edge.EndNodeId
|
|
</MudChip>
|
|
</div>
|
|
|
|
<!-- RIGHT: Delete -->
|
|
<MudIconButton Icon="@Icons.Material.Filled.Delete"
|
|
Color="Color.Error"
|
|
Size="Size.Small"
|
|
OnClick="@(() => RemoveEdgeAsync(edge))"
|
|
StopPropagation="true" />
|
|
</div>
|
|
</TitleContent>
|
|
|
|
<!-- ================= BODY ================= -->
|
|
<ChildContent>
|
|
<MudGrid Spacing="3">
|
|
|
|
<!-- Edge ID -->
|
|
<MudItem xs="12">
|
|
<MudTextField Value="@edge.EdgeId"
|
|
ValueChanged="@((string v) => SetValue(() => edge.EdgeId = v))"
|
|
Immediate="true"
|
|
Label="Edge ID" />
|
|
</MudItem>
|
|
|
|
<!-- Start Node -->
|
|
<MudItem xs="12">
|
|
<MudSelect T="string"
|
|
Value="@edge.StartNodeId"
|
|
ValueChanged="@((string v) => SetValue(() => edge.StartNodeId = v))"
|
|
Dense
|
|
Label="Start Node"
|
|
Required="true">
|
|
@foreach (var n in Order.Nodes)
|
|
{
|
|
<MudSelectItem Value="@n.NodeId">
|
|
@n.NodeId
|
|
</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
</MudItem>
|
|
|
|
<!-- End Node -->
|
|
<MudItem xs="12">
|
|
<MudSelect T="string"
|
|
Value="@edge.EndNodeId"
|
|
ValueChanged="@((string v) => SetValue(() => edge.EndNodeId = v))"
|
|
Dense
|
|
Label="End Node"
|
|
Required="true">
|
|
@foreach (var n in Order.Nodes)
|
|
{
|
|
<MudSelectItem Value="@n.NodeId">
|
|
@n.NodeId
|
|
</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
</MudItem>
|
|
|
|
<!-- Radius -->
|
|
<MudItem xs="6">
|
|
<MudNumericField T="double"
|
|
Value="@edge.Radius"
|
|
ValueChanged="@((double v) => SetValue(() => edge.Radius = v))"
|
|
Immediate="true"
|
|
Min="0"
|
|
Step="0.1"
|
|
Label="Radius (0 = straight line)" />
|
|
</MudItem>
|
|
|
|
<!-- Quadrant -->
|
|
@if (edge.Radius > 0)
|
|
{
|
|
<MudItem xs="6">
|
|
<MudSelect T="Quadrant"
|
|
Value="@edge.Quadrant"
|
|
ValueChanged="@((Quadrant v) => SetValue(() => edge.Quadrant = v))"
|
|
Label="Quadrant">
|
|
<MudSelectItem Value="Quadrant.I">I</MudSelectItem>
|
|
<MudSelectItem Value="Quadrant.II">II</MudSelectItem>
|
|
<MudSelectItem Value="Quadrant.III">III</MudSelectItem>
|
|
<MudSelectItem Value="Quadrant.IV">IV</MudSelectItem>
|
|
</MudSelect>
|
|
</MudItem>
|
|
}
|
|
|
|
<!-- Apply Curve -->
|
|
@if (edge.Radius > 0 && !edge.Expanded)
|
|
{
|
|
<MudItem xs="12">
|
|
<MudButton Color="Color.Primary"
|
|
Variant="Variant.Outlined"
|
|
StartIcon="@Icons.Material.Filled.Merge"
|
|
OnClick="@(() => ApplyCurveAsync(edge))">
|
|
Apply Curve
|
|
</MudButton>
|
|
</MudItem>
|
|
}
|
|
|
|
</MudGrid>
|
|
</ChildContent>
|
|
</MudExpansionPanel>
|
|
}
|
|
</MudExpansionPanels>
|
|
</div>
|
|
</MudPaper>
|
|
|
|
@code {
|
|
[Parameter] public OrderMessage Order { get; set; } = default!;
|
|
|
|
[Parameter] public EventCallback OnAddEdge { get; set; }
|
|
[Parameter] public EventCallback<UiEdge> OnRemoveEdge { get; set; }
|
|
[Parameter] public EventCallback<UiEdge> OnApplyCurve { get; set; }
|
|
|
|
[Parameter] public EventCallback OnOrderChanged { get; set; }
|
|
|
|
private async Task SetValue(System.Action setter)
|
|
{
|
|
setter();
|
|
await OnOrderChanged.InvokeAsync();
|
|
}
|
|
|
|
private async Task AddEdgeAsync()
|
|
{
|
|
await OnAddEdge.InvokeAsync();
|
|
await OnOrderChanged.InvokeAsync();
|
|
}
|
|
|
|
private async Task RemoveEdgeAsync(UiEdge edge)
|
|
{
|
|
await OnRemoveEdge.InvokeAsync(edge);
|
|
await OnOrderChanged.InvokeAsync();
|
|
}
|
|
|
|
private async Task ApplyCurveAsync(UiEdge edge)
|
|
{
|
|
await OnApplyCurve.InvokeAsync(edge);
|
|
await OnOrderChanged.InvokeAsync();
|
|
}
|
|
}
|