201 lines
7.0 KiB
Plaintext
201 lines
7.0 KiB
Plaintext
@using ZB.MOM.WW.OtOpcUa.Admin.Services
|
|
@using ZB.MOM.WW.OtOpcUa.Configuration.Entities
|
|
@using ZB.MOM.WW.OtOpcUa.Configuration.Validation
|
|
@inject EquipmentService EquipmentSvc
|
|
@inject NavigationManager Nav
|
|
|
|
<div class="d-flex justify-content-between mb-3">
|
|
<h4>Equipment (draft gen @GenerationId)</h4>
|
|
<div>
|
|
<button class="btn btn-outline-primary btn-sm me-2" @onclick="GoImport">Import CSV…</button>
|
|
<button class="btn btn-primary btn-sm" @onclick="StartAdd">Add equipment</button>
|
|
</div>
|
|
</div>
|
|
|
|
@if (_equipment is null)
|
|
{
|
|
<p>Loading…</p>
|
|
}
|
|
else if (_equipment.Count == 0 && !_showForm)
|
|
{
|
|
<p class="text-muted">No equipment in this draft yet.</p>
|
|
}
|
|
else if (_equipment.Count > 0)
|
|
{
|
|
<table class="table table-sm table-hover">
|
|
<thead>
|
|
<tr>
|
|
<th>EquipmentId</th><th>Name</th><th>MachineCode</th><th>ZTag</th><th>SAPID</th>
|
|
<th>Manufacturer / Model</th><th>Serial</th><th></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@foreach (var e in _equipment)
|
|
{
|
|
<tr>
|
|
<td><code>@e.EquipmentId</code></td>
|
|
<td>@e.Name</td>
|
|
<td>@e.MachineCode</td>
|
|
<td>@e.ZTag</td>
|
|
<td>@e.SAPID</td>
|
|
<td>@e.Manufacturer / @e.Model</td>
|
|
<td>@e.SerialNumber</td>
|
|
<td>
|
|
<button class="btn btn-sm btn-outline-secondary me-1" @onclick="() => StartEdit(e)">Edit</button>
|
|
<button class="btn btn-sm btn-outline-danger" @onclick="() => DeleteAsync(e.EquipmentRowId)">Remove</button>
|
|
</td>
|
|
</tr>
|
|
}
|
|
</tbody>
|
|
</table>
|
|
}
|
|
|
|
@if (_showForm)
|
|
{
|
|
<div class="card mt-3">
|
|
<div class="card-body">
|
|
<h5>@(_editMode ? "Edit equipment" : "New equipment")</h5>
|
|
<EditForm Model="_draft" OnValidSubmit="SaveAsync" FormName="equipment-form">
|
|
<DataAnnotationsValidator/>
|
|
<div class="row g-3">
|
|
<div class="col-md-4">
|
|
<label class="form-label">Name (UNS segment)</label>
|
|
<InputText @bind-Value="_draft.Name" class="form-control"/>
|
|
<ValidationMessage For="() => _draft.Name"/>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label">MachineCode</label>
|
|
<InputText @bind-Value="_draft.MachineCode" class="form-control"/>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label">DriverInstanceId</label>
|
|
<InputText @bind-Value="_draft.DriverInstanceId" class="form-control"/>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label">UnsLineId</label>
|
|
<InputText @bind-Value="_draft.UnsLineId" class="form-control"/>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label">ZTag</label>
|
|
<InputText @bind-Value="_draft.ZTag" class="form-control"/>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label">SAPID</label>
|
|
<InputText @bind-Value="_draft.SAPID" class="form-control"/>
|
|
</div>
|
|
</div>
|
|
|
|
<IdentificationFields Equipment="_draft"/>
|
|
|
|
@if (_error is not null) { <div class="alert alert-danger mt-3">@_error</div> }
|
|
|
|
<div class="mt-3">
|
|
<button type="submit" class="btn btn-primary btn-sm">Save</button>
|
|
<button type="button" class="btn btn-secondary btn-sm ms-2" @onclick="Cancel">Cancel</button>
|
|
</div>
|
|
</EditForm>
|
|
</div>
|
|
</div>
|
|
}
|
|
|
|
@code {
|
|
[Parameter] public long GenerationId { get; set; }
|
|
[Parameter] public string ClusterId { get; set; } = string.Empty;
|
|
|
|
private void GoImport() => Nav.NavigateTo($"/clusters/{ClusterId}/draft/{GenerationId}/import-equipment");
|
|
private List<Equipment>? _equipment;
|
|
private bool _showForm;
|
|
private bool _editMode;
|
|
private Equipment _draft = NewBlankDraft();
|
|
private string? _error;
|
|
|
|
private static Equipment NewBlankDraft() => new()
|
|
{
|
|
EquipmentId = string.Empty, DriverInstanceId = string.Empty,
|
|
UnsLineId = string.Empty, Name = string.Empty, MachineCode = string.Empty,
|
|
};
|
|
|
|
protected override async Task OnParametersSetAsync() => await ReloadAsync();
|
|
|
|
private async Task ReloadAsync()
|
|
{
|
|
_equipment = await EquipmentSvc.ListAsync(GenerationId, CancellationToken.None);
|
|
}
|
|
|
|
private void StartAdd()
|
|
{
|
|
_draft = NewBlankDraft();
|
|
_editMode = false;
|
|
_error = null;
|
|
_showForm = true;
|
|
}
|
|
|
|
private void StartEdit(Equipment row)
|
|
{
|
|
// Shallow-clone so Cancel doesn't mutate the list-displayed row with in-flight form edits.
|
|
_draft = new Equipment
|
|
{
|
|
EquipmentRowId = row.EquipmentRowId,
|
|
GenerationId = row.GenerationId,
|
|
EquipmentId = row.EquipmentId,
|
|
EquipmentUuid = row.EquipmentUuid,
|
|
DriverInstanceId = row.DriverInstanceId,
|
|
DeviceId = row.DeviceId,
|
|
UnsLineId = row.UnsLineId,
|
|
Name = row.Name,
|
|
MachineCode = row.MachineCode,
|
|
ZTag = row.ZTag,
|
|
SAPID = row.SAPID,
|
|
Manufacturer = row.Manufacturer,
|
|
Model = row.Model,
|
|
SerialNumber = row.SerialNumber,
|
|
HardwareRevision = row.HardwareRevision,
|
|
SoftwareRevision = row.SoftwareRevision,
|
|
YearOfConstruction = row.YearOfConstruction,
|
|
AssetLocation = row.AssetLocation,
|
|
ManufacturerUri = row.ManufacturerUri,
|
|
DeviceManualUri = row.DeviceManualUri,
|
|
EquipmentClassRef = row.EquipmentClassRef,
|
|
Enabled = row.Enabled,
|
|
};
|
|
_editMode = true;
|
|
_error = null;
|
|
_showForm = true;
|
|
}
|
|
|
|
private void Cancel()
|
|
{
|
|
_showForm = false;
|
|
_editMode = false;
|
|
}
|
|
|
|
private async Task SaveAsync()
|
|
{
|
|
_error = null;
|
|
try
|
|
{
|
|
if (_editMode)
|
|
{
|
|
await EquipmentSvc.UpdateAsync(_draft, CancellationToken.None);
|
|
}
|
|
else
|
|
{
|
|
_draft.EquipmentUuid = Guid.NewGuid();
|
|
_draft.EquipmentId = DraftValidator.DeriveEquipmentId(_draft.EquipmentUuid);
|
|
_draft.GenerationId = GenerationId;
|
|
await EquipmentSvc.CreateAsync(GenerationId, _draft, CancellationToken.None);
|
|
}
|
|
_showForm = false;
|
|
_editMode = false;
|
|
await ReloadAsync();
|
|
}
|
|
catch (Exception ex) { _error = ex.Message; }
|
|
}
|
|
|
|
private async Task DeleteAsync(Guid id)
|
|
{
|
|
await EquipmentSvc.DeleteAsync(id, CancellationToken.None);
|
|
await ReloadAsync();
|
|
}
|
|
}
|