diff --git a/src/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/DraftEditor.razor b/src/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/DraftEditor.razor index 49d90eb..dfef4b9 100644 --- a/src/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/DraftEditor.razor +++ b/src/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/DraftEditor.razor @@ -27,7 +27,7 @@
- @if (_tab == "equipment") { } + @if (_tab == "equipment") { } else if (_tab == "uns") { } else if (_tab == "namespaces") { } else if (_tab == "drivers") { } diff --git a/src/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/EquipmentTab.razor b/src/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/EquipmentTab.razor index 4bc3d4f..109f5b6 100644 --- a/src/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/EquipmentTab.razor +++ b/src/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/EquipmentTab.razor @@ -2,10 +2,14 @@ @using ZB.MOM.WW.OtOpcUa.Configuration.Entities @using ZB.MOM.WW.OtOpcUa.Configuration.Validation @inject EquipmentService EquipmentSvc +@inject NavigationManager Nav

Equipment (draft gen @GenerationId)

- +
+ + +
@if (_equipment is null) @@ -96,6 +100,9 @@ else if (_equipment.Count > 0) @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; private bool _showForm; private bool _editMode; diff --git a/src/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/ImportEquipment.razor b/src/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/ImportEquipment.razor new file mode 100644 index 0000000..f7b7b54 --- /dev/null +++ b/src/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/ImportEquipment.razor @@ -0,0 +1,200 @@ +@page "/clusters/{ClusterId}/draft/{GenerationId:long}/import-equipment" +@using Microsoft.AspNetCore.Components.Authorization +@using ZB.MOM.WW.OtOpcUa.Admin.Services +@using ZB.MOM.WW.OtOpcUa.Configuration.Entities +@inject DriverInstanceService DriverSvc +@inject UnsService UnsSvc +@inject EquipmentImportBatchService BatchSvc +@inject NavigationManager Nav +@inject AuthenticationStateProvider AuthProvider + +
+
+

Equipment CSV import

+ Cluster @ClusterId · draft generation @GenerationId +
+ Back to draft +
+ +
+ Accepts @EquipmentCsvImporter.VersionMarker-headered CSV per Stream B.3. + Required columns: @string.Join(", ", EquipmentCsvImporter.RequiredColumns). + Optional columns cover the OPC 40010 Identification fields. Paste the file contents + or upload directly — the parser runs client-stream-side and shows a row-level preview + before anything lands in the draft. ZTag + SAPID uniqueness across the fleet is NOT + enforced here yet (see task #197); for now the finalise may fail at commit time if a + reservation conflict exists. +
+ +
+
+
+
+ + +
+
+ + +
+
+ +
+
+
+ +