|
|
@@ -49,6 +49,8 @@ public interface IDigitalFormsHostViewModel : INotifyPropertyChanged
|
|
|
Func<DFSaveStorage> SaveValues { set; }
|
|
|
|
|
|
Func<List<string>?> Validate { set; }
|
|
|
+
|
|
|
+ void FieldChanged(string fieldName);
|
|
|
}
|
|
|
|
|
|
public partial class DigitalFormsHostViewModel<TModel, TShell, TParent, TParentLink, TForm> : ModuleViewModel, IDigitalFormsHostViewModel
|
|
|
@@ -118,6 +120,8 @@ public partial class DigitalFormsHostViewModel<TModel, TShell, TParent, TParentL
|
|
|
|
|
|
DFLayout IDigitalFormsHostViewModel.Layout => Layout;
|
|
|
|
|
|
+ private bool _isChanged = false;
|
|
|
+
|
|
|
public DigitalFormsHostViewModel()
|
|
|
{
|
|
|
PrimaryMenu.Add(new(Images.save, SaveForm));
|
|
|
@@ -125,6 +129,24 @@ public partial class DigitalFormsHostViewModel<TModel, TShell, TParent, TParentL
|
|
|
ProgressVisible = true;
|
|
|
}
|
|
|
|
|
|
+ public override bool OnBackButtonPressed()
|
|
|
+ {
|
|
|
+ return ConfirmChanges(_isChanged, result =>
|
|
|
+ {
|
|
|
+ switch (result)
|
|
|
+ {
|
|
|
+ case ConfirmChangesResult.Cancel:
|
|
|
+ Navigation.Back();
|
|
|
+ return;
|
|
|
+ case ConfirmChangesResult.Save:
|
|
|
+ SaveForm(SaveOption.Save).Wait();
|
|
|
+ break;
|
|
|
+ case ConfirmChangesResult.KeepEditing:
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
private void BaseConfigure()
|
|
|
{
|
|
|
Model = DigitalFormModel.CreateModel(DataAccess, Parent.GetType().Name);
|
|
|
@@ -218,6 +240,7 @@ public partial class DigitalFormsHostViewModel<TModel, TShell, TParent, TParentL
|
|
|
|
|
|
NewForm = Form.FormData.IsNullOrWhiteSpace();
|
|
|
ReadOnly = Form.FormCompleted != DateTime.MinValue;
|
|
|
+ _isChanged = NewForm;
|
|
|
|
|
|
TimeStarted = DateTime.Now;
|
|
|
|
|
|
@@ -225,26 +248,24 @@ public partial class DigitalFormsHostViewModel<TModel, TShell, TParent, TParentL
|
|
|
return TimeSpan.Zero;
|
|
|
}
|
|
|
|
|
|
- private async Task<bool> SaveForm()
|
|
|
+ public void FieldChanged(string fieldName)
|
|
|
{
|
|
|
- string[] options;
|
|
|
- if(DigitalForm.AppliesTo.Equals(nameof(Kanban)) || DigitalForm.AppliesTo.Equals(nameof(Job)))
|
|
|
- {
|
|
|
- options = ["Save Progress", "Complete Form", "Complete and Duplicate", "Delete Form"];
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- options = ["Save Progress", "Complete Form", "Delete Form"];
|
|
|
- }
|
|
|
- var chosenOption = await OptionDialog.Execute("Select Option", options);
|
|
|
- if(chosenOption is null)
|
|
|
- {
|
|
|
- return true;
|
|
|
- }
|
|
|
+ _isChanged = true;
|
|
|
+ }
|
|
|
|
|
|
- var completeDuplicate = chosenOption == "Complete and Duplicate";
|
|
|
- var complete = chosenOption == "Complete Form" || completeDuplicate;
|
|
|
- var delete = chosenOption == "Delete Form";
|
|
|
+ private enum SaveOption
|
|
|
+ {
|
|
|
+ Save,
|
|
|
+ Complete,
|
|
|
+ CompleteDuplicate,
|
|
|
+ Delete
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task SaveForm(SaveOption chosenOption)
|
|
|
+ {
|
|
|
+ var completeDuplicate = chosenOption == SaveOption.CompleteDuplicate;
|
|
|
+ var complete = chosenOption == SaveOption.Complete || completeDuplicate;
|
|
|
+ var delete = chosenOption == SaveOption.Delete;
|
|
|
|
|
|
if(complete)
|
|
|
{
|
|
|
@@ -252,12 +273,13 @@ public partial class DigitalFormsHostViewModel<TModel, TShell, TParent, TParentL
|
|
|
if(errors is not null)
|
|
|
{
|
|
|
await MessageDialog.ShowMessage($"Could not save form:\n - {string.Join("\n - ", errors)}\nPlease address these issues and try again.");
|
|
|
- return true;
|
|
|
+ return;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
ProgressVisible = true;
|
|
|
- DigitalForm.SerializeFormData(Form, Variables, SaveValues());
|
|
|
+ var values = Dispatcher.UIThread.Invoke(SaveValues);
|
|
|
+ DigitalForm.SerializeFormData(Form, Variables, values);
|
|
|
|
|
|
await Task.Run(() =>
|
|
|
{
|
|
|
@@ -307,6 +329,33 @@ public partial class DigitalFormsHostViewModel<TModel, TShell, TParent, TParentL
|
|
|
Navigation.Back();
|
|
|
OnSaved?.Invoke();
|
|
|
}
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task<bool> SaveForm()
|
|
|
+ {
|
|
|
+ string[] options;
|
|
|
+ if(DigitalForm.AppliesTo.Equals(nameof(Kanban)) || DigitalForm.AppliesTo.Equals(nameof(Job)))
|
|
|
+ {
|
|
|
+ options = ["Save Progress", "Complete Form", "Complete and Duplicate", "Delete Form"];
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ options = ["Save Progress", "Complete Form", "Delete Form"];
|
|
|
+ }
|
|
|
+ var chosenOption = await OptionDialog.Execute("Select Option", options);
|
|
|
+ if(chosenOption is null)
|
|
|
+ {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ await SaveForm(chosenOption switch
|
|
|
+ {
|
|
|
+ "Save Progress" => SaveOption.Save,
|
|
|
+ "Complete Form" => SaveOption.Complete,
|
|
|
+ "Complete and Duplicate" => SaveOption.CompleteDuplicate,
|
|
|
+ "Delete Form" => SaveOption.Delete,
|
|
|
+ _ => SaveOption.Save
|
|
|
+ });
|
|
|
|
|
|
return true;
|
|
|
}
|