diff --git a/Inspectron.PrintServer.TemplateEditor/Components/Pages/Home.razor b/Inspectron.PrintServer.TemplateEditor/Components/Pages/Home.razor index baf2fe4..31ac06f 100644 --- a/Inspectron.PrintServer.TemplateEditor/Components/Pages/Home.razor +++ b/Inspectron.PrintServer.TemplateEditor/Components/Pages/Home.razor @@ -2,14 +2,18 @@ @using BlazorMonaco @using BlazorMonaco.Editor @using BlazorMonaco.Languages +@using CommunityToolkit.Maui.Storage @using Inspectron.PrintServer.TemplateEditor.Services @inject IJSRuntime JSRuntime
- - - + + + + + @FileDisplayName@(HasUnsavedChanges ? " *" : "") +
@if (!string.IsNullOrEmpty(_loadedJsonFile)) @@ -41,6 +45,15 @@ private string? _loadedJsonFile; private readonly TemplateCompletionProvider _completionProvider = new(); + private string? _currentFilePath; + private string _savedContent = ""; + + private bool HasUnsavedChanges => _editorContent != _savedContent; + + private string FileDisplayName => _currentFilePath is not null + ? Path.GetFileName(_currentFilePath) + : "Untitled"; + private StandaloneEditorConstructionOptions EditorConstructionOptions(StandaloneCodeEditor editor) { return new StandaloneEditorConstructionOptions @@ -76,6 +89,77 @@ _editorContent = await _editor.GetValue(); } + private async Task NewFileAsync() + { + _currentFilePath = null; + _savedContent = ""; + _editorContent = ""; + await _editor.SetValue(""); + } + + private async Task OpenFileAsync() + { + try + { + var result = await FilePicker.Default.PickAsync(new PickOptions + { + PickerTitle = "Select an XML template file", + FileTypes = new FilePickerFileType(new Dictionary> + { + { DevicePlatform.WinUI, new[] { ".xml" } }, + { DevicePlatform.macOS, new[] { "xml" } }, + { DevicePlatform.iOS, new[] { "public.xml" } }, + { DevicePlatform.Android, new[] { "text/xml" } }, + }) + }); + + if (result is null) + return; + + var content = await File.ReadAllTextAsync(result.FullPath); + _currentFilePath = result.FullPath; + _savedContent = content; + _editorContent = content; + await _editor.SetValue(content); + } + catch (Exception) + { + // User cancelled or file read failed + } + } + + private async Task SaveFileAsync() + { + if (_currentFilePath is not null) + { + await File.WriteAllTextAsync(_currentFilePath, _editorContent); + _savedContent = _editorContent; + } + else + { + await SaveAsAsync(); + } + } + + private async Task SaveAsAsync() + { + try + { + using var stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(_editorContent)); + var result = await FileSaver.Default.SaveAsync("template.xml", stream, CancellationToken.None); + + if (result.IsSuccessful) + { + _currentFilePath = result.FilePath; + _savedContent = _editorContent; + } + } + catch (Exception) + { + // User cancelled or save failed + } + } + private async Task LoadJsonAsync() { try diff --git a/Inspectron.PrintServer.TemplateEditor/Inspectron.PrintServer.TemplateEditor.csproj b/Inspectron.PrintServer.TemplateEditor/Inspectron.PrintServer.TemplateEditor.csproj index 56a8610..b860b14 100644 --- a/Inspectron.PrintServer.TemplateEditor/Inspectron.PrintServer.TemplateEditor.csproj +++ b/Inspectron.PrintServer.TemplateEditor/Inspectron.PrintServer.TemplateEditor.csproj @@ -55,7 +55,8 @@ - + + diff --git a/Inspectron.PrintServer.TemplateEditor/MauiProgram.cs b/Inspectron.PrintServer.TemplateEditor/MauiProgram.cs index 37eb180..33cff06 100644 --- a/Inspectron.PrintServer.TemplateEditor/MauiProgram.cs +++ b/Inspectron.PrintServer.TemplateEditor/MauiProgram.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.Logging; +using CommunityToolkit.Maui; +using Microsoft.Extensions.Logging; namespace Inspectron.PrintServer.TemplateEditor { @@ -9,6 +10,7 @@ namespace Inspectron.PrintServer.TemplateEditor var builder = MauiApp.CreateBuilder(); builder .UseMauiApp() + .UseMauiCommunityToolkit() .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); diff --git a/Inspectron.PrintServer.TemplateEditor/wwwroot/app.css b/Inspectron.PrintServer.TemplateEditor/wwwroot/app.css index c0732f8..6e0a7c7 100644 --- a/Inspectron.PrintServer.TemplateEditor/wwwroot/app.css +++ b/Inspectron.PrintServer.TemplateEditor/wwwroot/app.css @@ -44,6 +44,18 @@ html, body { margin: 2px 6px; } +.file-indicator { + display: inline-flex; + align-items: center; + padding: 2px 10px; + color: #999; + font-size: 12px; + max-width: 200px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + .json-indicator { display: inline-flex; align-items: center;