using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Windows; using InABox.Clients; using InABox.Core; namespace InABox.DynamicGrid { /// /// Interaction logic for FormDesigner.xaml /// public partial class DynamicFormEditWindow : DynamicFormWindow { public enum FormResult { None, Cancel, Save, Complete } public DynamicFormEditWindow() { InitializeComponent(); Grid.OnChanged += Grid_OnChanged; //Complete.IsEnabled = Security.IsAllowed(); } protected override DynamicFormDesignGrid Grid { get => Preview; } public FormMode Mode { get => Grid.Mode; private set => Grid.Mode = value; } public FormResult Result = FormResult.None; public IDigitalFormDataModel? DataModel { get => Grid.DataModel; set { Grid.DataModel = value; RefreshEnabled(); } } /// /// Gets or sets the values in the form; can only be accessed after . /// public Dictionary Values { get => Grid.SaveValues(); set { Grid.LoadValues(value); RefreshEnabled(); } } private bool IsReopening = false; private bool HasChanged = false; private void RefreshEnabled() { var formInstance = DataModel!.Instance; var completed = formInstance.FormCompleted; CompletedDate.Content = !completed.IsEmpty() ? $"Completed {completed:d MMM yyyy} at {completed:hh:mm tt}" : "Not completed yet"; if (completed.IsEmpty() && DFUtils.CanEditForm(formInstance.GetType(), formInstance, DataModel.Entity)) { Mode = FormMode.Filling; } else { Mode = Security.IsAllowed() ? FormMode.Editing : FormMode.ReadOnly; } if (Mode == FormMode.Editing || Mode == FormMode.Filling || Mode == FormMode.Preview) { SaveForm.IsEnabled = Grid.IsChanged || HasChanged; } else { SaveForm.IsEnabled = false; } if (!completed.IsEmpty() && Security.IsAllowed()) { CompleteForm.Content = "Re-open form"; CompleteForm.IsEnabled = true; IsReopening = true; } else { CompleteForm.Content = "Complete form"; CompleteForm.IsEnabled = Mode == FormMode.Filling && DataModel?.Instance.FormCompleted == DateTime.MinValue; IsReopening = false; } } private void Grid_OnChanged(DynamicFormDesignGrid sender, string fieldName) { if (Mode == FormMode.Editing || Mode == FormMode.Filling || Mode == FormMode.Preview) { SaveForm.IsEnabled = true; } } private void Cancel_Click(object sender, RoutedEventArgs e) { Result = FormResult.Cancel; DialogResult = false; } private void Complete() { if (!Grid.Validate(out var messages)) { MessageBox.Show(string.Join('\n', messages)); return; } if (MessageBox.Show("Are you sure you want to complete this form?", "Confirm Completion", MessageBoxButton.YesNo) == MessageBoxResult.Yes) { Result = FormResult.Complete; DialogResult = true; } } private void Reopen() { HasChanged = true; DataModel!.Instance.FormCompleted = DateTime.MinValue; DataModel!.Instance.FormCompletedBy.Clear(); RefreshEnabled(); } private void CompleteForm_Click(object sender, RoutedEventArgs e) { if (IsReopening) Reopen(); else Complete(); } private void SaveForm_Click(object sender, RoutedEventArgs e) { if (DataModel?.Instance.FormCompleted.IsEmpty() == false && !Grid.Validate(out var messages)) { MessageBox.Show(string.Join('\n', messages)); return; } if (MessageBox.Show("Are you sure you want to save this form?", "Confirm Save", MessageBoxButton.YesNo) == MessageBoxResult.Yes) { Result = FormResult.Save; DialogResult = true; } } public static bool EditDigitalForm(IDigitalFormInstance formInstance, [NotNullWhen(true)] out IDigitalFormDataModel? dataModel) { dataModel = null; var formid = formInstance.Form.ID; var formdata = formInstance.FormData; var parentlink = CoreUtils.HasProperty(formInstance.GetType(), "Parent") ? CoreUtils.GetPropertyValue(formInstance, "Parent") as IEntityLink : null; var parenttype = parentlink?.GetType().BaseType?.GetGenericArguments().FirstOrDefault(); var results = Client.QueryMultiple( new KeyedQueryDef(new Filter(x => x.Form.ID).IsEqualTo(formid)), new KeyedQueryDef( new Filter(x => x.Form.ID).IsEqualTo(formid) .And(x => x.Active).IsEqualTo(true) .And(x => x.Layout).IsNotEqualTo(""))); var variables = results[nameof(DigitalFormVariable)].Rows.Select(x => x.ToObject()).ToArray(); var layout = results[nameof(DigitalFormLayout)].Rows.FirstOrDefault()?.ToObject(); Entity? parent = null; if (parenttype != null && parentlink != null) { var parentid = parentlink.ID; var filter = Filter.Create(parenttype); filter.Expression = CoreUtils.GetMemberExpression(parenttype, "ID"); filter.Operator = Operator.IsEqualTo; filter.Value = parentid; var client = (Activator.CreateInstance(typeof(Client<>).MakeGenericType(parenttype)) as Client)!; parent = client.Query(filter, null, null).Rows.FirstOrDefault()?.ToObject(parenttype) as Entity; } if (layout == null) return false; if (parent == null) { Logger.Send(LogType.Error, "", $"Form parent is null; Form Type: {formInstance.GetType()}; Parent Type: {parenttype}; Form ID: {formInstance.ID}"); MessageBox.Show("An error occurred while loading the form: Form Entity is null"); return false; } var form = new DynamicFormEditWindow { Type = layout.Type, Title = string.Format("Viewing {0}", formInstance.Form.Description.SplitCamelCase()) //Completed = !formInstance.FormCompleted.IsEmpty() }; form.LoadLayout(layout, variables); try { dataModel = formInstance.CreateDataModel(parent); form.DataModel = dataModel; } catch (Exception e) { Logger.Send(LogType.Error, ClientFactory.UserID, $"Error during Edit Form / CreateDataModel: {CoreUtils.FormatException(e)}"); } form.Initialize(); if (!string.IsNullOrWhiteSpace(formdata)) form.Values = Serialization.Deserialize>(formdata); if (form.ShowDialog() == true) { if (form.Result == FormResult.Complete) { formInstance.FormCompleted = DateTime.Now; formInstance.FormCompletedBy.ID = ClientFactory.UserGuid; formInstance.FormCompletedBy.UserID = ClientFactory.UserID; /*formInstance.FormCompleted = form.Completed ? formInstance.FormCompleted.IsEmpty() ? DateTime.Now : formInstance.FormCompleted : DateTime.MinValue; formInstance.FormCompletedBy.ID = form.Completed ? !formInstance.FormCompletedBy.IsValid() ? ClientFactory.UserGuid : formInstance.FormCompletedBy.ID : Guid.Empty; formInstance.FormCompletedBy.UserID = form.Completed ? string.IsNullOrWhiteSpace(formInstance.FormCompletedBy.UserID) ? ClientFactory.UserID : formInstance.FormCompletedBy.UserID : "";*/ } formInstance.FormData = Serialization.Serialize(form.Values); } return form.Result == FormResult.Save || form.Result == FormResult.Complete; } private void DynamicFormWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) { if(DialogResult != true && (HasChanged || Grid.IsChanged)) { if(MessageBox.Show("This form has unsaved changes. Do you wish to discard them?", "Discard Changes?", MessageBoxButton.YesNo) != MessageBoxResult.Yes) { e.Cancel = true; } } } } }