From 22d896543c354933a67b375b0b61377eb30fdab6 Mon Sep 17 00:00:00 2001 From: Michael Babienco Date: Mon, 30 Mar 2026 21:00:19 +0900 Subject: [PATCH] Keep doing rework for using PDFReportInfo obj Still need to think about how this all works...could probably simplify more... --- TODO.txt | 7 +++ src/MayShow.Shared/Models/PDFReport.cs | 10 ++++ src/MayShow.Shared/Models/PDFReportInfo.cs | 11 +++- .../ViewModels/CreatePDFReportViewModel.cs | 57 +++++++++++++++---- .../StartNewChooseReportViewModel.cs | 21 +++++-- 5 files changed, 89 insertions(+), 17 deletions(-) diff --git a/TODO.txt b/TODO.txt index beb2b7a..2c77365 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,3 +1,10 @@ +----iOS---- + +-quickstart for loading last edited report on main menu +-option/setting to put picture data into internal data dir for backup (always on for mobile) + +----------- + https://stackoverflow.com/questions/78855900/error-ios-projects-must-build-with-publishtrimmed-true-when-trimming-is-disabl https://blog.verslu.is/maui/exclude-assemblies-from-trimming/ diff --git a/src/MayShow.Shared/Models/PDFReport.cs b/src/MayShow.Shared/Models/PDFReport.cs index 501c060..c9fd04c 100644 --- a/src/MayShow.Shared/Models/PDFReport.cs +++ b/src/MayShow.Shared/Models/PDFReport.cs @@ -20,6 +20,16 @@ class PDFReport : PDFReportInfo _lastGenerated = null; } + public PDFReport(PDFReportInfo info) : base() + { + _files = []; + _lastGenerated = null; + BaseFolder = info.BaseFolder; + UUID = info.UUID; + Title = info.Title; + LastSaved = info.LastSaved; + } + public List Files { get => _files; diff --git a/src/MayShow.Shared/Models/PDFReportInfo.cs b/src/MayShow.Shared/Models/PDFReportInfo.cs index 9cacd0a..886a91f 100644 --- a/src/MayShow.Shared/Models/PDFReportInfo.cs +++ b/src/MayShow.Shared/Models/PDFReportInfo.cs @@ -12,7 +12,7 @@ namespace MayShow.Models; class PDFReportInfo : ChangeNotifier { - private string? _baseFolder; // might be null + private string? _baseFolder; // might be null; if set, use this to know where (initial) working dir is private string _uuid; private string _title; private DateTime? _lastSaved; @@ -53,6 +53,15 @@ class PDFReportInfo : ChangeNotifier { UUID = Guid.NewGuid().ToString(); } + + public string GetWorkingPath() + { + if (string.IsNullOrWhiteSpace(BaseFolder)) + { + return Path.Combine(Utilities.GetInternalDataPath(), UUID); + } + return BaseFolder; + } public void DeleteInternalFolderFromDisk() { diff --git a/src/MayShow.Shared/ViewModels/CreatePDFReportViewModel.cs b/src/MayShow.Shared/ViewModels/CreatePDFReportViewModel.cs index ce7e07b..bbf4ffb 100644 --- a/src/MayShow.Shared/ViewModels/CreatePDFReportViewModel.cs +++ b/src/MayShow.Shared/ViewModels/CreatePDFReportViewModel.cs @@ -48,12 +48,18 @@ class CreatePDFReportViewModel : BaseViewModel, ICanCheckShutdown, ILogger private bool _hasUnsavedWork; - public CreatePDFReportViewModel(IChangeViewModel viewModelChanger) : base(viewModelChanger) + private CreatePDFReportViewModel(IChangeViewModel viewModelChanger) : base(viewModelChanger) { - _isPerformingInitialLoad = true; _processDir = Path.GetDirectoryName(Environment.ProcessPath) ?? ""; Console.WriteLine("Internal storage directory is: {0}", Utilities.GetInternalDataPath()); _isCreatingPDF = false; + _workingFolder = ""; + ReportFiles = _reportFiles = new ObservableCollection(); + _reportTitle = ""; + _lastGeneratedTime = null; + _settings = Settings.LoadSettings(); // TODO: needs tweaking + HasUnsavedWork = false; + // setup initial quote and program log data var quotes = Constants.GetQuotes(); Random random = new Random(); var quoteIndex = random.Next(0, quotes.Length); @@ -62,21 +68,50 @@ class CreatePDFReportViewModel : BaseViewModel, ICanCheckShutdown, ILogger _programLog += "---------------------------------------" + Environment.NewLine; _programLog += "Loaded and ready to create report!" + Environment.NewLine; _programLog += "Please copy and send this Program Log when reporting any issues with the software."; - _workingFolder = ""; - ReportFiles = _reportFiles = new ObservableCollection(); - _reportTitle = ""; - _lastGeneratedTime = null; - _settings = Settings.LoadSettings(); - if (!string.IsNullOrWhiteSpace(_settings.LastUsedPath)) + } + + // this is the "normal path" into the pdf report view + // pathToLoad is presumably _settings.LastUsedPath but doesn't have to be + public CreatePDFReportViewModel(string pathToLoad, IChangeViewModel viewModelChanger) : this(viewModelChanger) + { + _isPerformingInitialLoad = true; + // TODO: load settings properly + if (!string.IsNullOrWhiteSpace(pathToLoad)) { - LogInfo("Loading data at last used path of {0}", _settings.LastUsedPath); - ScanFolder(_settings.LastUsedPath); + LogInfo("Loading report data at path: {0}", pathToLoad); + ScanFolder(pathToLoad); } else { LogInfo("Choose a receipt folder to begin..."); } - HasUnsavedWork = false; + _isPerformingInitialLoad = false; + } + + public CreatePDFReportViewModel(PDFReportInfo reportInfo, IChangeViewModel viewModelChanger) : this(viewModelChanger) + { + _isPerformingInitialLoad = true; + // todo: load settings properly! + // if BaseFolder set, regardless of where the JSON data is saved, + // the working data (pictures, etc.) is outside of the current, working folder + if (!string.IsNullOrWhiteSpace(reportInfo.BaseFolder)) + { + LogInfo("Loading report data at path: {0}", reportInfo.BaseFolder); + ScanFolder(reportInfo.BaseFolder); + } + else + { + // load data file in internal dir + UUID + var path = Path.Combine(Utilities.GetInternalDataPath(), reportInfo.UUID); + if (Directory.Exists(path)) + { + ScanFolder(path); // even if points internally will be A-OK + } + else + { + // TODO: error + } + } _isPerformingInitialLoad = false; } diff --git a/src/MayShow.Shared/ViewModels/StartNewChooseReportViewModel.cs b/src/MayShow.Shared/ViewModels/StartNewChooseReportViewModel.cs index 89c0684..b69bea5 100644 --- a/src/MayShow.Shared/ViewModels/StartNewChooseReportViewModel.cs +++ b/src/MayShow.Shared/ViewModels/StartNewChooseReportViewModel.cs @@ -44,15 +44,17 @@ class StartNewChooseReportViewModel : BaseViewModel public async void StartReport() { + if (string.IsNullOrWhiteSpace(CreatingReportTitle)) + { + await DialogHost.Show(new WarningViewModel("Report title cannot be blank!")); + return; + } + // TODO: if report with name already exists in system, error var reportInfo = new PDFReportInfo() { Title = CreatingReportTitle, LastSaved = DateTime.Now }; - _settings.AllReportInfo.Add(reportInfo); - // ... this sort and save is slow, technically, but we're not going to have millions of items here, so... - SavedReports = new ObservableCollection(_settings.AllReportInfo.OrderBy(x => x.Title)); - await _settings.SaveSettingsAsync(); // create folder for report data var path = Path.Combine(Utilities.GetInternalDataPath(), reportInfo.UUID); while (Directory.Exists(path)) @@ -61,8 +63,13 @@ class StartNewChooseReportViewModel : BaseViewModel path = Path.Combine(Utilities.GetInternalDataPath(), reportInfo.UUID); } Directory.CreateDirectory(path); + reportInfo.BaseFolder = path; // default to internal directory + _settings.AllReportInfo.Add(reportInfo); + // ... this sort and save is slow, technically, but we're not going to have millions of items here, so... + SavedReports = new ObservableCollection(_settings.AllReportInfo.OrderBy(x => x.Title)); + await _settings.SaveSettingsAsync(); // now update UI - ViewModelChanger.PushViewModel(new CreatePDFReportViewModel(ViewModelChanger) + ViewModelChanger.PushViewModel(new CreatePDFReportViewModel(reportInfo, ViewModelChanger) { ReportTitle = CreatingReportTitle }); @@ -73,6 +80,10 @@ class StartNewChooseReportViewModel : BaseViewModel public void LoadExistingReportImpl(PDFReportInfo reportInfo) { // TODO: load data and send to create PDF report view model + ViewModelChanger.PushViewModel(new CreatePDFReportViewModel(reportInfo, ViewModelChanger) + { + ReportTitle = CreatingReportTitle + }); } public void DeleteExistingReport(object info) => DeleteExistingReportImpl((PDFReportInfo) info);