123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using InABox.Clients;
- using System.Diagnostics.CodeAnalysis;
- namespace InABox.Core
- {
- public interface IDigitalFormReportDataModel
- {
- public DigitalFormVariable[]? Variables { get; set; }
- void AddFormData(Guid formInstanceID, DFLoadStorage storage);
- }
- /// <summary>
- /// </summary>
- /// <typeparam name="T">
- /// Should always be an EntityForm<,></typeparam>
- public class DigitalFormReportDataModel<T> : AutoDataModel<T>, IDigitalFormReportDataModel
- where T : Entity, IRemotable, IPersistent, IDigitalFormInstance, new()
- {
- private Guid? FormId { get; set; } = null;
- private CoreTable? FormDataTable { get; set; } = null;
- private Dictionary<Guid, DFLoadStorage> FormData { get; set; } = new Dictionary<Guid, DFLoadStorage>();
- //private DigitalFormVariable[]? _variables = null;
- public DigitalFormVariable[]? Variables { get; set; }
- public DigitalFormReportDataModel(Filter<T> filter, Guid? formId = null) : base(filter)
- {
- FormId = formId;
- }
- public override string Name => "Digital Form Reports";
- public void AddFormData(Guid formInstanceID, DFLoadStorage storage)
- {
- FormData.Add(formInstanceID, storage);
- }
- protected override void CheckRequiredTables(List<string> requiredtables)
- {
- base.CheckRequiredTables(requiredtables);
- requiredtables.Add(TableName<T>());
- }
- private void LoadFormDataTable(Guid formID)
- {
- var formDataTable = new CoreTable();
- formDataTable.Columns.Add(new CoreColumn
- {
- ColumnName = "Parent.ID",
- DataType = typeof(Guid)
- });
- Variables ??= new Client<DigitalFormVariable>().Load(new Filter<DigitalFormVariable>(x => x.Form.ID).IsEqualTo(formID));
- foreach (var variable in Variables)
- {
- var columns = variable.GetDisplayColumns().ToArray();
- foreach (var column in columns)
- formDataTable.Columns.Add(column);
- }
- FormDataTable = formDataTable;
- AddTable("Form_Data", formDataTable, isdefault: true);
- LinkTable(typeof(T), "ID", "Form_Data", "Parent.ID");
- }
- private void LoadFormDataIntoRow(CoreRow row, DFLoadStorage data)
- {
- foreach(var variable in Variables!)
- {
- var value = variable.Deserialize(data.GetEntry(variable.Code));
- foreach(var (k, v) in variable.GetDisplayValues(value))
- {
- row[k] = v;
- }
- }
- }
- protected override void AfterLoad(IEnumerable<string> requiredtables)
- {
- base.AfterLoad(requiredtables);
- if(FormDataTable == null)
- {
- LoadFormDataTable(FormId ?? ExtractValues<T, Guid>(x => x.Form.ID).FirstOrDefault());
- }
- var idList = ExtractValues<T, Guid>(x => x.ID);
- var jsonLists = ExtractValues<T, string>(x => x.FormData, false).ToList();
- var blobLists = ExtractValues<T, string?>(x => x.BlobData, false).ToList();
- for(var i = 0; i < jsonLists.Count; ++i)
- {
- if (!FormData.TryGetValue(idList[i], out var formData))
- {
- var json = jsonLists[i];
- var blobJSON = blobLists[i];
- formData = DigitalForm.DeserializeFormData(json, blobJSON);
- }
- var formRow = FormDataTable!.NewRow();
- formRow["Parent.ID"] = idList[i];
- if (formData != null) LoadFormDataIntoRow(formRow, formData);
- FormDataTable.Rows.Add(formRow);
- }
- Load(typeof(CoreTable), FormDataTable!, requiredtables, "Form_Data");
- }
- }
- }
|