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.Panels.Jobs; public class JobProductStylesGrid : DynamicDataGrid, IJobControl, IDataModelSource { public Job Job { get; set; } protected override void Init() { base.Init(); HiddenColumns.Add(x => x.JobDocumentSet.ID); HiddenColumns.Add(x => x.Style.Code); HiddenColumns.Add(x => x.Style.Description); ActionColumns.Add(new DynamicMenuColumn(BuildMenu)); } protected override void DoReconfigure(FluentList options) { base.DoReconfigure(options); options.Add(DynamicGridOption.SelectColumns); } 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("Edit Document Set", 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 folder = new MultiSelectDialog( new Filter(x => x.Job.ID).IsEqualTo(Job.ID), new Columns(x => x.ID)); if (!folder.ShowDialog()) { 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 = row.Get(x => x.Style.Description) + $"\nAttached to Product Style '{code}'" }; docSet.Job.ID = Job.ID; docSet.Folder.ID = folder.IDs().First(); 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); } } JobPanelSettings IJobControl.Settings { get; set; } public string SectionName => "Job Product Styles"; public event DataModelUpdateEvent? OnUpdateDataModel; protected override bool CanCreateItems() { return Job.ID != Guid.Empty; } protected override JobStyle CreateItem() { var result = base.CreateItem(); result.Job.ID = Job.ID; result.Job.Synchronise(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(new Filter(x => x.Job.ID).IsEqualTo(Job.ID)); base.Reload(criteria, columns, ref sort, action); } }