using Comal.Classes; using InABox.Clients; using InABox.Core; using InABox.DynamicGrid; using InABox.Wpf; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PRSDesktop; public class JobProductStylesGrid : DynamicDataGrid, IMasterDetailControl, IDataModelSource { public Job? Master { get; set; } public Filter MasterDetailFilter => (Master?.ID ?? Guid.Empty) != Guid.Empty ? new Filter(x => x.Job.ID).IsEqualTo(Master.ID) : new Filter().None(); protected override void Init() { base.Init(); HiddenColumns.Add(x => x.JobDocumentSet.ID); HiddenColumns.Add(x => x.Style.Code); HiddenColumns.Add(x => x.Style.Description); HiddenColumns.Add(x => x.Style.Image.ID); HiddenColumns.Add(x => x.Style.Image.FileName); ActionColumns.Add(new DynamicMenuColumn(BuildMenu)); ActionColumns.Add(new DynamicImageManagerColumn(this, x => x.Style.Image, false) { Position = DynamicActionColumnPosition.Start }); } protected override void DoReconfigure(FluentList options) { base.DoReconfigure(options); options.Add(DynamicGridOption.SelectColumns); } public override DynamicGridColumns GenerateColumns() { var columns = new DynamicGridColumns(); columns.Add(x => x.Style.Code, 150, "", "", Alignment.MiddleCenter); columns.Add(x => x.Style.Description, 0, "", "", Alignment.MiddleLeft); columns.Add(x => x.JobDocumentSet.Description, 0, "Approval Document", "", Alignment.MiddleLeft); columns.Add(x => x.JobDocumentSet.CurrentMileStone.Type.Code, 100, "Stage", "", Alignment.MiddleCenter); columns.Add(x => x.JobDocumentSet.CurrentMileStone.Revision, 50, "Rev", "", Alignment.MiddleCenter); columns.Add(x => x.JobDocumentSet.CurrentMileStone.Status, 100, "Status", "", Alignment.MiddleCenter); return columns; } private void BuildMenu(DynamicMenuColumn column, CoreRow? row) { if (row is not null) { var docSet = row.Get(x => x.JobDocumentSet.ID); if (docSet != Guid.Empty) { var caption = Security.CanEdit() ? "Edit Document Set" : "View Document Set"; column.AddItem(caption, PRSDesktop.Resources.design, (_) => { ViewDocumentSet(docSet); }); } else { if (Security.CanEdit()) { column.AddItem("Create Document Set", PRSDesktop.Resources.design, (_) => { CreateDocumentSet(row); }); } } } } private static DynamicDataGrid GetDocumentSetGrid() { var gridType = DynamicGridUtils.FindDynamicGrid(typeof(DynamicDataGrid<>), typeof(JobDocumentSet)) ?? typeof(DynamicDataGrid); return (Activator.CreateInstance(gridType) as DynamicDataGrid)!; } private void ViewDocumentSet(Guid docSetID) { var docSet = Client.Query( new Filter(x => x.ID).IsEqualTo(docSetID), DynamicGridUtils.LoadEditorColumns(new Columns(x => x.ID))) .ToObjects() .FirstOrDefault(); if (docSet is null) { MessageWindow.ShowMessage("Document set does not exist.", "Error"); Logger.Send(LogType.Information, "", "Document set does not exist."); return; } GetDocumentSetGrid().EditItems(new JobDocumentSet[] { docSet }); } private void CreateDocumentSet(CoreRow row) { var dialog = new JobDocumentSetFolderSelectionDialog(Master); if (dialog.ShowDialog() != true) { MessageWindow.ShowMessage("You need to select a folder to add this document set to.", "Folder required"); return; } var code = row.Get(x => x.Style.Code); var docSet = new JobDocumentSet { Code = code, Description = $"{code} Approval".Trim() }; docSet.Job.ID = Master.ID; docSet.Folder.ID = dialog.SelectedFolder; if (GetDocumentSetGrid().EditItems(new JobDocumentSet[] { docSet })) { var jobStyle = row.ToObject(); jobStyle.JobDocumentSet.ID = docSet.ID; Client.Save(jobStyle, "Attached to new JobDocumentSet"); Refresh(false, true); } } public string SectionName => "Job Product Styles"; public event DataModelUpdateEvent? OnUpdateDataModel; protected override bool CanCreateItems() { return base.CanCreateItems() && (Master?.ID ?? Guid.Empty) != Guid.Empty; } public override JobStyle CreateItem() { var result = base.CreateItem(); result.Job.ID = Master?.ID ?? Guid.Empty; result.Job.Synchronise(Master ?? new Job()); return result; } public DataModel DataModel(Selection selection) { var ids = ExtractValues(x => x.ID, selection).ToArray(); return new BaseDataModel(new Filter(x => x.ID).InList(ids)); } protected override void Reload(Filters criteria, Columns columns, ref SortOrder? sort, Action action) { criteria.Add(MasterDetailFilter); base.Reload(criteria, columns, ref sort, action); } }