ProjectsPanel_Old.xaml.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using System.Windows.Threading;
  9. using Comal.Classes;
  10. using InABox.Clients;
  11. using InABox.Configuration;
  12. using InABox.Core;
  13. using InABox.DynamicGrid;
  14. using InABox.DynamicGrid.Spreadsheet;
  15. using InABox.WPF;
  16. using Microsoft.Office.Interop.Outlook;
  17. using System.ComponentModel;
  18. using Selection = InABox.Core.Selection;
  19. using PRSDesktop.Panels.Jobs;
  20. namespace PRSDesktop;
  21. public class JobPanelSettings : BaseObject, IGlobalConfigurationSettings
  22. {
  23. [Caption("Milestone Task",IncludePath = false)]
  24. public KanbanTypeLink DocumentMilestoneKanbanType { get; set; }
  25. }
  26. /// <summary>
  27. /// Interaction logic for JobPanel.xaml
  28. /// </summary>
  29. public partial class ProjectsPanel_Old : UserControl, IPanel<Job>
  30. {
  31. private JobPanelSettings _settings;
  32. private int CurrentPage = -1;
  33. private readonly List<IMasterDetailPage<Job>> Pages;
  34. private DateTime lastselection = DateTime.MaxValue;
  35. private IDataModelSource modelsource;
  36. // User Settings
  37. private JobScreenSettings settings;
  38. private DispatcherTimer timer;
  39. protected void CreatePage<T>(String caption) where T : class, IMasterDetailPage<Job>
  40. {
  41. var header = new DynamicTabItem() { Header = caption };
  42. JobPages.Items.Add(header);
  43. if (Activator.CreateInstance(typeof(T), header) is T page)
  44. Pages.Add(page);
  45. }
  46. public ProjectsPanel_Old()
  47. {
  48. InitializeComponent();
  49. Pages = new List<IMasterDetailPage<Job>>();
  50. CreatePage<JobDetailPanel<JobDetails>>("Details");
  51. CreatePage<JobDetailPanel<JobScopePanel>>("Scopes");
  52. CreatePage<JobDetailPanel<JobDocumentSetPanel>>("Documents");
  53. CreatePage<JobDetailPanel<JobStagesPanel>>("Stages");
  54. CreatePage<JobDetailGrid<JobITPGrid, JobITP>>("ITPs");
  55. CreatePage<JobDetailGrid<JobProductMappingsGrid, JobProductMapping>>("Product Mappings");
  56. CreatePage<JobDetailGrid<JobProductStylesGrid, JobStyle>>("Product Styles");
  57. CreatePage<JobDetailPanel<JobBillOfMaterialsPanel>>("BOM");
  58. CreatePage<JobDetailPanel<JobRequisitionPanel>>("Requisitions");
  59. CreatePage<JobDetailGrid<JobOrderGrid, PurchaseOrderItem>>("Orders");
  60. CreatePage<JobDetailPanel<JobDesignPanel>>("Designs");
  61. CreatePage<JobDetailGrid<ManufacturingGrid, ManufacturingPacket>>("Manufacturing");
  62. CreatePage<JobDetailGrid<ReadyToGoGrid, DeliveryItem>>("Dispatch");
  63. CreatePage<JobDetailPanel<DeliveryPanel>>("Deliveries");
  64. CreatePage<JobDetailGrid<DeliveredOnSiteGrid, DeliveryItem>>("OnSite");
  65. CreatePage<JobDetailPanel<TaskPanel>>("Tasks");
  66. CreatePage<JobDetailGrid<JobEquipmentGrid, JobEquipment>>("EquipmentTab");
  67. CreatePage<JobDetailPanel<JobEmployeePanel>>("Employees");
  68. CreatePage<JobDetailGrid<JobTrackerGrid, JobTracker>>("Trackers");
  69. CreatePage<JobDetailPanel<JobAssignmentPanel>>("Assignments");
  70. CreatePage<JobDetailGrid<JobTimesheetGrid, TimeSheet>>("Timesheets");
  71. CreatePage<JobDetailGrid<JobFormGrid, JobForm>>("Forms");
  72. CreatePage<JobDetailPanel<InvoicePanel>>("Invoices");
  73. CreatePage<JobDetailGrid<JobSpreadsheetGrid, JobSpreadsheet>>("Spreadsheets");
  74. CreatePage<JobDetailPanel<JobSummaryPanel>>("Summary");
  75. }
  76. private IMasterDetailPage<Job>? SelectedPage => Pages.FirstOrDefault(x => x.Tab == JobPages.SelectedTab);
  77. public bool IsReady { get; set; }
  78. public Dictionary<string, object[]> Selected()
  79. {
  80. return SelectedPage?.Selected()
  81. ?? new Dictionary<string, object[]> { { typeof(Job).EntityName(), JobGrid.SelectedRows } };
  82. }
  83. public void Setup()
  84. {
  85. settings = new UserConfiguration<JobScreenSettings>().Load();
  86. SplitPanel.View = settings.ViewType == ScreenViewType.Register ? DynamicSplitPanelView.Master :
  87. settings.ViewType == ScreenViewType.Details ? DynamicSplitPanelView.Detail : DynamicSplitPanelView.Combined;
  88. SplitPanel.AnchorWidth = Math.Max(20,settings.AnchorWidth);
  89. JobGrid.OnSelectItem += JobGrid_OnSelectItem;
  90. JobGrid.BeforeRefresh += JobGrid_BeforeRefresh;
  91. JobGrid.AfterRefresh += JobGrid_AfterRefresh;
  92. Scopes.Visibility = Security.CanView<JobScope>() ? Visibility.Visible : Visibility.Collapsed;
  93. Documents.Visibility = Security.CanView<JobDocumentSet>() ? Visibility.Visible : Visibility.Collapsed;
  94. Stages.Visibility = ClientFactory.IsSupported<JobStage>() ? Visibility.Visible : Visibility.Collapsed;
  95. ITPs.Visibility = ClientFactory.IsSupported<JobITP>() ? Visibility.Visible : Visibility.Collapsed;
  96. ProductMappings.Visibility = ClientFactory.IsSupported<JobProductMapping>() ? Visibility.Visible : Visibility.Collapsed;
  97. ProductStyles.Visibility = ClientFactory.IsSupported<JobStyle>() ? Visibility.Visible : Visibility.Collapsed;
  98. BOM.Visibility = ClientFactory.IsSupported<JobBillOfMaterials>() ? Visibility.Visible : Visibility.Collapsed;
  99. Requisitions.Visibility = ClientFactory.IsSupported<JobRequisition>() ? Visibility.Visible : Visibility.Collapsed;
  100. Orders.Visibility = ClientFactory.IsSupported<PurchaseOrderItem>() ? Visibility.Visible : Visibility.Collapsed;
  101. Setouts.Visibility = ClientFactory.IsSupported<Setout>() ? Visibility.Visible : Visibility.Collapsed;
  102. Manufacturing.Visibility = ClientFactory.IsSupported<ManufacturingPacket>() ? Visibility.Visible : Visibility.Collapsed;
  103. Dispatch.Visibility = ClientFactory.IsSupported<DeliveryItem>() ? Visibility.Visible : Visibility.Collapsed;
  104. Deliveries.Visibility = ClientFactory.IsSupported<Delivery>() ? Visibility.Visible : Visibility.Collapsed;
  105. OnSite.Visibility = ClientFactory.IsSupported<DeliveryItem>() ? Visibility.Visible : Visibility.Collapsed;
  106. Tasks.Visibility = ClientFactory.IsSupported<Kanban>() ? Visibility.Visible : Visibility.Collapsed;
  107. EquipmentTab.Visibility = ClientFactory.IsSupported<Equipment>() ? Visibility.Visible : Visibility.Collapsed;
  108. Employees.Visibility = ClientFactory.IsSupported<Employee>() ? Visibility.Visible : Visibility.Collapsed;
  109. Trackers.Visibility = ClientFactory.IsSupported<GPSTracker>() ? Visibility.Visible : Visibility.Collapsed;
  110. Assignments.Visibility = ClientFactory.IsSupported<Assignment>() ? Visibility.Visible : Visibility.Collapsed;
  111. Timesheets.Visibility = ClientFactory.IsSupported<TimeSheet>() ? Visibility.Visible : Visibility.Collapsed;
  112. Forms.Visibility = Security.CanView<JobForm>() ? Visibility.Visible : Visibility.Collapsed;
  113. Invoices.Visibility = Security.CanView<Invoice>() ? Visibility.Visible : Visibility.Collapsed;
  114. Spreadsheets.Visibility = Security.CanView<JobSpreadsheet>() ? Visibility.Visible : Visibility.Collapsed;
  115. Summary.Visibility = ClientFactory.IsSupported<JobMaterial>() ? Visibility.Visible : Visibility.Collapsed;
  116. JobGrid.ColumnsTag = settings.ViewType == ScreenViewType.Register ? settings.ViewType.ToString() : "";
  117. JobGrid.Refresh(true, false);
  118. timer = new DispatcherTimer();
  119. timer.Tick += Timer_Tick;
  120. timer.Interval = new TimeSpan(0, 0, 0, 0, 100);
  121. timer.IsEnabled = true;
  122. }
  123. private bool _jobGridRefreshing;
  124. private void JobGrid_BeforeRefresh(object sender, BeforeRefreshEventArgs args)
  125. {
  126. _jobGridRefreshing = true;
  127. }
  128. private void JobGrid_AfterRefresh(object sender, AfterRefreshEventArgs args)
  129. {
  130. if (settings.CurrentJob == Guid.Empty)
  131. {
  132. JobGrid.SelectedRows = Array.Empty<CoreRow>();
  133. }
  134. else
  135. {
  136. JobGrid.SelectedRows = JobGrid.Data.Rows.Where(x => x.Get<Job, Guid>(x => x.ID) == settings.CurrentJob).ToArray();
  137. }
  138. _jobGridRefreshing = false;
  139. }
  140. public void Shutdown(CancelEventArgs? cancel)
  141. {
  142. timer.IsEnabled = false;
  143. timer = null;
  144. Details.Content = null;
  145. Scopes.Content = null;
  146. Documents.Content = null;
  147. Stages.Content = null;
  148. ITPs.Content = null;
  149. BOM.Content = null;
  150. Setouts.Content = null;
  151. Requisitions.Content = null;
  152. Orders.Content = null;
  153. Manufacturing.Content = null;
  154. Dispatch.Content = null;
  155. Deliveries.Content = null;
  156. OnSite.Content = null;
  157. Tasks.Content = null;
  158. EquipmentTab.Content = null;
  159. Employees.Content = null;
  160. Trackers.Content = null;
  161. Assignments.Content = null;
  162. Timesheets.Content = null;
  163. Forms.Content = null;
  164. Invoices.Content = null;
  165. Spreadsheets.Content = null;
  166. Summary.Content = null;
  167. }
  168. public void Refresh()
  169. {
  170. JobGrid.Refresh(false, true);
  171. lastselection = DateTime.MinValue;
  172. }
  173. public void CreateToolbarButtons(IPanelHost host)
  174. {
  175. ProjectSetupActions.JobStatuses(host);
  176. ProjectSetupActions.DocumentMilestones(host);
  177. ProjectSetupActions.JobScopeStatuses(host);
  178. ProjectSetupActions.DrawingTemplates(host);
  179. host.CreateSetupSeparator();
  180. ProjectSetupActions.JobSpreadsheetTemplates(host);
  181. host.CreateSetupSeparator();
  182. ProjectSetupActions.SetoutGroups(host);
  183. host.CreateSetupAction(new PanelAction() { Caption = "Job Settings", Image = PRSDesktop.Resources.specifications, OnExecute = JobSettingsClick });
  184. }
  185. private void JobSettingsClick(PanelAction obj)
  186. {
  187. if (DynamicGridUtils.Edit(_settings))
  188. {
  189. new GlobalConfiguration<JobPanelSettings>().Save(_settings);
  190. }
  191. }
  192. public event DataModelUpdateEvent? OnUpdateDataModel;
  193. public string SectionName => modelsource?.SectionName ?? "Job Details";
  194. public DataModel DataModel(Selection selection)
  195. {
  196. if (modelsource == null)
  197. {
  198. var row = JobGrid.SelectedRows.FirstOrDefault();
  199. var jobid = row != null ? row.Get<Job, Guid>(x => x.ID) : CoreUtils.FullGuid;
  200. return new JobDetailsDataModel(new Filter<Job>(x => x.ID).IsEqualTo(jobid));
  201. }
  202. return modelsource.DataModel(selection);
  203. }
  204. public void Heartbeat(TimeSpan time)
  205. {
  206. }
  207. private void Timer_Tick(object? sender, EventArgs e)
  208. {
  209. if (lastselection < DateTime.Now.AddMilliseconds(-500) && !_jobGridRefreshing)
  210. {
  211. lastselection = DateTime.MaxValue;
  212. var job = JobGrid.SelectedRows.FirstOrDefault()?.ToObject<Job>() ?? new Job();
  213. var dataModelSource = SelectedPage?.Refresh(job);
  214. if (JobPages.SelectedIndex != CurrentPage)
  215. {
  216. if(dataModelSource is not null)
  217. {
  218. modelsource = dataModelSource;
  219. OnUpdateDataModel?.Invoke(dataModelSource.SectionName, dataModelSource.DataModel(Selection.None));
  220. }
  221. CurrentPage = JobPages.SelectedIndex;
  222. }
  223. }
  224. }
  225. private void JobGrid_OnSelectItem(object sender, DynamicGridSelectionEventArgs e)
  226. {
  227. if (!_jobGridRefreshing)
  228. {
  229. lastselection = DateTime.Now;
  230. settings.CurrentJob = e.Rows?.FirstOrDefault()?.Get<Job, Guid>(x => x.ID) ?? Guid.Empty;
  231. new UserConfiguration<JobScreenSettings>().Save(settings);
  232. }
  233. }
  234. private void JobPages_SelectionChanged(object sender, SelectionChangedEventArgs e)
  235. {
  236. if (e.Source == JobPages)
  237. lastselection = DateTime.MinValue;
  238. }
  239. private void SplitPanel_OnChanged(object sender, DynamicSplitPanelSettings e)
  240. {
  241. settings.ViewType = SplitPanel.View == DynamicSplitPanelView.Master ? ScreenViewType.Register :
  242. SplitPanel.View == DynamicSplitPanelView.Detail ? ScreenViewType.Details : ScreenViewType.Combined;
  243. settings.AnchorWidth = SplitPanel.AnchorWidth;
  244. new UserConfiguration<JobScreenSettings>().Save(settings);
  245. var newTag = settings.ViewType == ScreenViewType.Register ? settings.ViewType.ToString() : "";
  246. if (JobGrid.ColumnsTag != newTag)
  247. {
  248. JobGrid.ColumnsTag = newTag;
  249. JobGrid.Refresh(true, true);
  250. }
  251. }
  252. }