Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions IoListTestingWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,20 @@
<TextBlock Text="Dedicated FAT workspace · imported IEDs and IO-list SDI signals only"
Style="{StaticResource Caption}" Margin="0,2,0,0"/>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center">
<WrapPanel Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Right">
<Border Background="{StaticResource SoftBlue}" CornerRadius="14" Padding="12,7" Margin="0,0,8,0">
<TextBlock Text="{Binding ProjectSummary}" FontSize="12" Foreground="{StaticResource Ink}"/>
</Border>
<Button Content="Save Progress" Style="{StaticResource SoftButton}" Padding="11,7"
Click="SaveProgress_Click" Margin="0,0,6,0"/>
<Button Content="Export Handover" Style="{StaticResource PrimaryButton}" Padding="11,7"
<Button Content="Export Excel" Style="{StaticResource SoftButton}" Padding="11,7"
Click="ExportExcel_Click" Margin="0,0,6,0"/>
<Button Content="Export PDF" Style="{StaticResource SoftButton}" Padding="11,7"
Click="ExportPdf_Click" Margin="0,0,6,0"/>
<Button Content="Export .arsas" Style="{StaticResource PrimaryButton}" Padding="11,7"
Click="ExportHandover_Click" Margin="0,0,6,0"/>
<Button Content="Return to Engineering" Style="{StaticResource SoftButton}" Click="ReturnToEngineering_Click"/>
</StackPanel>
</WrapPanel>
</Grid>
</Border>

Expand Down
118 changes: 105 additions & 13 deletions IoListTestingWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -107,28 +107,103 @@ private void SaveProgress_Click(object sender, RoutedEventArgs e)
}
}

private async void ExportHandover_Click(object sender, RoutedEventArgs e)
private async void ExportExcel_Click(object sender, RoutedEventArgs e)
{
if (Storage == null)
return;
if (Session.IsSessionActive)
if (!EnsureSessionSealedForExport("Excel evidence workbook"))
return;

var dialog = new SaveFileDialog
{
Title = "Export ARSAS IO FAT result workbook",
Filter = "Excel workbook (*.xlsx)|*.xlsx",
FileName = $"{SafeFileName(Project.ProjectId)}_IO-FAT-Results_{DateTime.Now:yyyyMMdd_HHmm}.xlsx",
AddExtension = true,
DefaultExt = ".xlsx",
OverwritePrompt = true
};
if (dialog.ShowDialog(this) != true)
return;

try
{
IsEnabled = false;
Storage.SaveNow();
await IoFatExcelResultExportService.ExportAsync(
Storage.SourceWorkbookPath,
dialog.FileName,
Project);
MessageBox.Show(
this,
"Stop the active IED session before exporting. This seals and verifies the evidence journal before it is transferred to another laptop.",
"Stop session before export",
$"FAT result workbook created successfully.\n\n{dialog.FileName}\n\nThe approved source workbook was not modified.",
"Excel evidence exported",
MessageBoxButton.OK,
MessageBoxImage.Information);
}
catch (Exception ex) when (ex is IOException or UnauthorizedAccessException or InvalidDataException or InvalidOperationException or ArgumentException)
{
MessageBox.Show(this, ex.Message, "Excel evidence export failed", MessageBoxButton.OK, MessageBoxImage.Error);
}
finally
{
IsEnabled = true;
}
}

private void ExportPdf_Click(object sender, RoutedEventArgs e)
{
if (!EnsureSessionSealedForExport("PDF evidence report"))
return;

var dialog = new SaveFileDialog
{
Title = "Export native ARSAS IO FAT PDF report",
Filter = "PDF evidence report (*.pdf)|*.pdf",
FileName = $"{SafeFileName(Project.ProjectId)}_IO-FAT_{DateTime.Now:yyyyMMdd_HHmm}.pdf",
AddExtension = true,
DefaultExt = ".pdf",
OverwritePrompt = true
};
if (dialog.ShowDialog(this) != true)
return;

try
{
IsEnabled = false;
Storage?.SaveNow();
IoFatPdfReportService.Save(dialog.FileName, Project);
MessageBox.Show(
this,
$"Native PDF evidence report created successfully.\n\n{dialog.FileName}",
"PDF report exported",
MessageBoxButton.OK,
MessageBoxImage.Information);
}
catch (Exception ex) when (ex is IOException or UnauthorizedAccessException or InvalidDataException or InvalidOperationException or ArgumentException)
{
MessageBox.Show(this, ex.Message, "PDF report export failed", MessageBoxButton.OK, MessageBoxImage.Error);
}
finally
{
IsEnabled = true;
}
}

private async void ExportHandover_Click(object sender, RoutedEventArgs e)
{
if (Storage == null)
return;
if (!EnsureSessionSealedForExport("ARSAS project"))
return;

var dialog = new SaveFileDialog
{
Title = "Export portable ARSAS IO FAT handover",
Filter = $"ARSAS IO FAT handover (*{IoTestWorkspacePersistence.PackageExtension})|*{IoTestWorkspacePersistence.PackageExtension}",
FileName = $"{SafeFileName(Project.ProjectId)}_{DateTime.Now:yyyyMMdd_HHmm}{IoTestWorkspacePersistence.PackageExtension}",
Title = "Export portable ARSAS IO FAT project",
Filter = $"ARSAS project (*{IoFatProjectPackageService.PackageExtension})|*{IoFatProjectPackageService.PackageExtension}",
FileName = $"{SafeFileName(Project.ProjectId)}_{DateTime.Now:yyyyMMdd_HHmm}{IoFatProjectPackageService.PackageExtension}",
AddExtension = true,
DefaultExt = IoTestWorkspacePersistence.PackageExtension,
DefaultExt = IoFatProjectPackageService.PackageExtension,
OverwritePrompt = true
};
if (dialog.ShowDialog(this) != true)
Expand All @@ -137,24 +212,41 @@ private async void ExportHandover_Click(object sender, RoutedEventArgs e)
try
{
IsEnabled = false;
await Storage.ExportPackageAsync(dialog.FileName);
var exportedPath = await IoFatProjectPackageService.ExportAsync(
Storage,
Session,
dialog.FileName);
MessageBox.Show(
this,
$"Portable FAT handover created successfully.\n\n{Storage.LastExportPath}\n\nThe package can be opened in ARSAS on another laptop. It also contains report/IO-FAT-Report.html for browser Print to PDF.",
"FAT handover exported",
$"Portable ARSAS project created successfully.\n\n{exportedPath}\n\nOpen this .arsas file on another laptop to continue the remaining FAT scope. The package also contains the native PDF report and the completed Excel result workbook.",
"ARSAS project exported",
MessageBoxButton.OK,
MessageBoxImage.Information);
}
catch (Exception ex) when (ex is IOException or UnauthorizedAccessException or InvalidDataException or InvalidOperationException)
catch (Exception ex) when (ex is IOException or UnauthorizedAccessException or InvalidDataException or InvalidOperationException or ArgumentException)
{
MessageBox.Show(this, ex.Message, "FAT handover export failed", MessageBoxButton.OK, MessageBoxImage.Error);
MessageBox.Show(this, ex.Message, "ARSAS project export failed", MessageBoxButton.OK, MessageBoxImage.Error);
}
finally
{
IsEnabled = true;
}
}

private bool EnsureSessionSealedForExport(string outputName)
{
if (!Session.IsSessionActive)
return true;

MessageBox.Show(
this,
$"Stop the active IED session before exporting the {outputName}. This seals and verifies the current evidence journal first.",
"Stop session before export",
MessageBoxButton.OK,
MessageBoxImage.Information);
return false;
}

private void ReturnToEngineering_Click(object sender, RoutedEventArgs e)
=> Close();

Expand Down
16 changes: 8 additions & 8 deletions MainWindow.IoTesting.cs
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ private Border CreateIoListTestingCard()
});
content.Children.Add(new TextBlock
{
Text = "Import the ARSAS Excel template for a new project, or open a portable handover package to continue saved progress from another laptop.",
Text = "Import the ARSAS Excel template for a new project, or open a portable .arsas project to continue saved progress from another laptop.",
TextWrapping = TextWrapping.Wrap,
FontSize = 13.4,
Foreground = TryFindResource("Muted") as Brush,
Expand All @@ -162,15 +162,15 @@ private Border CreateIoListTestingCard()
Brushes.White,
new Thickness(0, 0, 0, 8)));
content.Children.Add(CreateLauncherButton(
"Open FAT Handover Package",
"Open ARSAS Project",
"LucideFolderOpen",
"SoftButton",
OpenIoListPackage_Click,
null,
new Thickness(0, 0, 0, 10)));
content.Children.Add(new TextBlock
{
Text = "Autosave · portable continuation · verified evidence · printable browser report",
Text = "Autosave · portable continuation · verified evidence · native PDF report",
Style = TryFindResource("Caption") as Style,
TextWrapping = TextWrapping.Wrap
});
Expand Down Expand Up @@ -291,15 +291,15 @@ private async void OpenIoListPackage_Click(object sender, RoutedEventArgs e)
{
var dialog = new OpenFileDialog
{
Title = "Open ARSAS IO FAT handover package",
Filter = $"ARSAS IO FAT handover (*{IoTestWorkspacePersistence.PackageExtension})|*{IoTestWorkspacePersistence.PackageExtension}|All files (*.*)|*.*",
Title = "Open ARSAS IO FAT project",
Filter = IoFatProjectPackageService.OpenDialogFilter,
CheckFileExists = true,
Multiselect = false
};
if (dialog.ShowDialog(this) != true)
return;

SetStatus($"Opening FAT handover package {Path.GetFileName(dialog.FileName)}…");
SetStatus($"Opening ARSAS IO FAT project {Path.GetFileName(dialog.FileName)}…");
try
{
var launch = await IoTestWorkspaceBootstrapService.OpenPackageAsync(
Expand All @@ -312,11 +312,11 @@ private async void OpenIoListPackage_Click(object sender, RoutedEventArgs e)
}
catch (OperationCanceledException)
{
SetStatus("FAT handover import cancelled.");
SetStatus("ARSAS IO FAT project import cancelled.");
}
catch (Exception ex) when (ex is IOException or JsonException or InvalidDataException or UnauthorizedAccessException or ArgumentException or InvalidOperationException)
{
ShowIoTestingFailure(ex, "FAT handover import failed");
ShowIoTestingFailure(ex, "ARSAS IO FAT project import failed");
}
}

Expand Down
Loading
Loading