JobDocumentSetGrid.xaml.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Drawing;
  5. using System.Globalization;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Windows;
  9. using System.Windows.Controls;
  10. using System.Windows.Data;
  11. using System.Windows.Forms;
  12. using com.sun.tools.@internal.ws.processor.model;
  13. using Comal.Classes;
  14. using InABox.Clients;
  15. using InABox.Core;
  16. using InABox.DynamicGrid;
  17. using InABox.WPF;
  18. using Syncfusion.Data.Extensions;
  19. using Syncfusion.UI.Xaml.Grid;
  20. using Syncfusion.UI.Xaml.Grid.Helpers;
  21. using HorizontalAlignment = System.Windows.HorizontalAlignment;
  22. using MessageBox = System.Windows.MessageBox;
  23. using OpenFileDialog = Microsoft.Win32.OpenFileDialog;
  24. using UserControl = System.Windows.Controls.UserControl;
  25. namespace PRSDesktop
  26. {
  27. public class MileStoneBlock
  28. {
  29. public Guid ID { get; set; }
  30. public String Revision { get; set; }
  31. public JobDocumentSetMileStoneStatus Status { get; set; }
  32. public DateTime Date { get; set; }
  33. public System.Drawing.Color Color { get; set; }
  34. }
  35. public class MileStoneConverter : IValueConverter
  36. {
  37. public object Convert(object value, Type t, object parameter, CultureInfo culture)
  38. {
  39. try
  40. {
  41. if (value == null)
  42. return "";
  43. var block = Serialization.Deserialize<MileStoneBlock>(value.ToString());
  44. if (String.Equals(parameter, "ID"))
  45. return block.ID;
  46. if (String.Equals(parameter, "Revision"))
  47. return String.IsNullOrWhiteSpace(block.Revision) ? "--" : String.Format("Rev {0}",block.Revision);
  48. if (String.Equals(parameter, "Status"))
  49. return block.Status.ToString().SplitCamelCase();
  50. if (String.Equals(parameter, "Date"))
  51. return String.Format("{0:dd MMM yy}", block.Date);
  52. if (String.Equals(parameter, "Color"))
  53. return "Red"; //ImageUtils.ColorToString(block.Color);
  54. return parameter.ToString();
  55. }
  56. catch (Exception e)
  57. {
  58. return e.Message;
  59. }
  60. }
  61. public object ConvertBack(object value, Type t, object parameter, CultureInfo culture)
  62. {
  63. return value.Equals(false) ? DependencyProperty.UnsetValue : parameter;
  64. }
  65. }
  66. public partial class JobDocumentSetGrid : UserControl
  67. {
  68. private struct MileStone
  69. {
  70. public Guid TypeID { get; set; }
  71. public CoreRow Row { get; set; }
  72. }
  73. private struct MileStoneType
  74. {
  75. public String Code { get; set; }
  76. public String Description { get; set; }
  77. public Dictionary<Guid,List<CoreRow>> SetMileStones { get; set; }
  78. public List<String> Columns { get; set; }
  79. }
  80. public Guid JobID { get; set; }
  81. public Guid FolderID { get; set; }
  82. private Dictionary<Guid,MileStoneType> _types = null;
  83. private CoreTable _milestones = null;
  84. private CoreTable _documentSets = null;
  85. private CoreTable _files = null;
  86. public JobDocumentSetGrid()
  87. {
  88. InitializeComponent();
  89. AddImage.Source = PRSDesktop.Resources.add.AsBitmapImage();
  90. EditImage.Source = PRSDesktop.Resources.pencil.AsBitmapImage();
  91. DeleteImage.Source = PRSDesktop.Resources.delete.AsBitmapImage();
  92. }
  93. private Dictionary<JobDocumentSetMileStoneStatus, System.Drawing.Color> _statuscolors = new Dictionary<JobDocumentSetMileStoneStatus, Color>()
  94. {
  95. { JobDocumentSetMileStoneStatus.InProgress, System.Drawing.Color.LightYellow },
  96. { JobDocumentSetMileStoneStatus.OnHold, System.Drawing.Color.Silver },
  97. { JobDocumentSetMileStoneStatus.InfoRequired, System.Drawing.Color.Silver },
  98. { JobDocumentSetMileStoneStatus.Submitted, System.Drawing.Color.Orange },
  99. { JobDocumentSetMileStoneStatus.Approved, System.Drawing.Color.LightGreen },
  100. { JobDocumentSetMileStoneStatus.Rejected, System.Drawing.Color.Gray },
  101. { JobDocumentSetMileStoneStatus.Cancelled, System.Drawing.Color.Gray },
  102. };
  103. public void Refresh()
  104. {
  105. var setfilter = new Filter<JobDocumentSet>(x => x.Job.ID).IsEqualTo(JobID);
  106. if (FolderID != Guid.Empty)
  107. setfilter = setfilter.And(x => x.Folder.ID).IsEqualTo(FolderID);
  108. MultiQuery query = new MultiQuery();
  109. query.Add(
  110. setfilter,
  111. new Columns<JobDocumentSet>(x=>x.ID)
  112. .Add(x=>x.Code)
  113. .Add(x=>x.Description)
  114. );
  115. var milestonefilter = new Filter<JobDocumentSetMileStone>(x => x.DocumentSet.Job.ID).IsEqualTo(JobID);
  116. if (FolderID != Guid.Empty)
  117. milestonefilter = milestonefilter.And(x => x.DocumentSet.Folder.ID).IsEqualTo(FolderID);
  118. query.Add(
  119. milestonefilter,
  120. new Columns<JobDocumentSetMileStone>(x => x.ID)
  121. .Add(x=>x.DocumentSet.ID)
  122. .Add(x => x.Type.ID)
  123. .Add(x => x.Type.Code)
  124. .Add(x => x.Status)
  125. .Add(x => x.Revision)
  126. .Add(x => x.Submitted)
  127. .Add(x => x.Closed)
  128. );
  129. if (_types == null)
  130. {
  131. query.Add<JobDocumentSetMileStoneType>(
  132. null,
  133. new Columns<JobDocumentSetMileStoneType>(x => x.ID)
  134. .Add(x => x.Code)
  135. .Add(x => x.Description),
  136. new SortOrder<JobDocumentSetMileStoneType>(x => x.Sequence)
  137. );
  138. }
  139. query.Query();
  140. _documentSets = query.Get<JobDocumentSet>();
  141. _milestones = query.Get<JobDocumentSetMileStone>();
  142. if (_types == null)
  143. {
  144. _types = query.Get<JobDocumentSetMileStoneType>().ToDictionary<JobDocumentSetMileStoneType, Guid, MileStoneType>(
  145. x => x.ID,
  146. r => new MileStoneType()
  147. {
  148. Code = r.Get<JobDocumentSetMileStoneType, String>(c => c.Code),
  149. Description = r.Get<JobDocumentSetMileStoneType, String>(c => c.Description),
  150. SetMileStones = new Dictionary<Guid, List<CoreRow>>(),
  151. Columns = new List<string>()
  152. }
  153. );
  154. }
  155. else
  156. {
  157. foreach (var typeid in _types.Keys)
  158. _types[typeid].SetMileStones.Clear();
  159. }
  160. var documentsets = new DataTable();
  161. documentsets.Columns.Add("ID", typeof(Guid));
  162. documentsets.Columns.Add("Code", typeof(String));
  163. documentsets.Columns.Add("Description", typeof(String));
  164. var milestones = _milestones.ToLookup<JobDocumentSetMileStone, Guid, MileStone>(
  165. x => x.DocumentSet.ID,
  166. r => new MileStone()
  167. {
  168. TypeID = r.Get<JobDocumentSetMileStone, Guid>(c => c.Type.ID),
  169. Row = r
  170. }
  171. );
  172. foreach (var milestone in milestones)
  173. {
  174. foreach (var entry in milestone)
  175. {
  176. if (!_types[entry.TypeID].SetMileStones.ContainsKey(milestone.Key))
  177. _types[entry.TypeID].SetMileStones[milestone.Key] = new List<CoreRow>();
  178. if (_hidesuperceded)
  179. _types[entry.TypeID].SetMileStones[milestone.Key].Clear();
  180. _types[entry.TypeID].SetMileStones[milestone.Key].Add(entry.Row);
  181. }
  182. }
  183. foreach (var typeid in _types.Keys)
  184. {
  185. int count = 1;
  186. foreach (var setkey in _types[typeid].SetMileStones.Keys)
  187. count = Math.Max(count,_types[typeid].SetMileStones[setkey].Count);
  188. for (int i = 1; i <= count; i++)
  189. {
  190. String column = String.Format("{0}_{1}", _types[typeid].Code, i);
  191. documentsets.Columns.Add(column, typeof(String));
  192. _types[typeid].Columns.Add(column);
  193. }
  194. }
  195. foreach (var setrow in _documentSets.Rows)
  196. {
  197. Guid setid = setrow.Get<JobDocumentSet, Guid>(x => x.ID);
  198. var datarow = documentsets.Rows.Add();
  199. datarow["ID"] = setid;
  200. datarow["Code"] = setrow.Get<JobDocumentSet, String>(c => c.Code);
  201. datarow["Description"] = setrow.Get<JobDocumentSet, String>(c => c.Description);
  202. foreach (var typeid in _types.Keys)
  203. {
  204. if (_types[typeid].SetMileStones.TryGetValue(setid, out var rows))
  205. {
  206. int i = 1;
  207. foreach (var row in rows)
  208. {
  209. MileStoneBlock block = new MileStoneBlock();
  210. block.ID = row.Get<JobDocumentSetMileStone, Guid>(c => c.ID);
  211. block.Revision = row.Get<JobDocumentSetMileStone, String>(c => c.Revision);
  212. block.Status = row.Get<JobDocumentSetMileStone, JobDocumentSetMileStoneStatus>(c => c.Status);
  213. block.Date = row.Get<JobDocumentSetMileStone, DateTime>(c => c.Closed);
  214. if (block.Date.IsEmpty())
  215. block.Date = row.Get<JobDocumentSetMileStone, DateTime>(c => c.Submitted);
  216. block.Color = _statuscolors[block.Status];
  217. datarow[String.Format("{0}_{1}", _types[typeid].Code, i)] = Serialization.Serialize(block);
  218. i++;
  219. }
  220. }
  221. }
  222. }
  223. dataGrid.ItemsSource = null;
  224. stackedHeaderRow.StackedColumns.Clear();
  225. stackedHeaderRow.StackedColumns.Add(new StackedColumn()
  226. {
  227. ChildColumns = "ID,Code,Description",
  228. HeaderText = "Document Register"
  229. });
  230. foreach (var typeid in _types.Keys)
  231. {
  232. stackedHeaderRow.StackedColumns.Add(new StackedColumn()
  233. {
  234. ChildColumns = String.Join(",", _types[typeid].Columns),
  235. HeaderText = _types[typeid].Code
  236. });
  237. }
  238. dataGrid.ItemsSource = documentsets;
  239. }
  240. private void DataGrid_AutoGeneratingColumn(object sender, AutoGeneratingColumnArgs e)
  241. {
  242. e.Column.HorizontalHeaderContentAlignment = HorizontalAlignment.Center;
  243. if (String.Equals(e.Column.MappingName, "ID"))
  244. e.Column.Width = 0;
  245. else if (String.Equals(e.Column.MappingName, "Code"))
  246. e.Column.Width = 120;
  247. else if (String.Equals(e.Column.MappingName, "Description"))
  248. {
  249. e.Column.ColumnSizer = GridLengthUnitType.Star;
  250. e.Column.MinimumWidth = 200;
  251. }
  252. else
  253. {
  254. var mapping = e.Column.MappingName;
  255. e.Column = new GridTemplateColumn()
  256. {
  257. CellTemplate = FindResource("milestoneTemplate") as DataTemplate,
  258. MappingName = mapping,
  259. SetCellBoundValue = true
  260. };
  261. e.Column.HeaderText = " "; //mapping.Split('_').Last();
  262. e.Column.Width = 80;
  263. }
  264. //throw new NotImplementedException();
  265. }
  266. private void DataGrid_OnQueryRowHeight(object sender, QueryRowHeightEventArgs e)
  267. {
  268. if (e.RowIndex == 0)
  269. {
  270. e.Height = 30;
  271. e.Handled = true;
  272. }
  273. }
  274. private void DataGrid_ContextMenuOpening(object sender, ContextMenuEventArgs e)
  275. {
  276. var tag = (e.OriginalSource as FrameworkElement).Tag;
  277. if (tag == null)
  278. {
  279. e.Handled = true;
  280. return;
  281. }
  282. MileStoneMenu.Items.Clear();
  283. Guid.TryParse(tag.ToString(), out Guid id);
  284. var milestone = _milestones.Rows.FirstOrDefault(r => r.Get<JobDocumentSetMileStone, Guid>(c => c.ID) == id);
  285. if (milestone == null)
  286. {
  287. Guid setid = (Guid)(dataGrid.SelectedItem as DataRowView).Row["ID"];
  288. var column = dataGrid.GetSelectedCells().First().Column.MappingName;
  289. var typeid = _types.FirstOrDefault(x => x.Value.Columns.Contains(column)).Key;
  290. var openmilestones = _milestones.Rows.Any(r =>
  291. Guid.Equals(r.Get<JobDocumentSetMileStone, Guid>(c => c.DocumentSet.ID), setid)
  292. && Guid.Equals(r.Get<JobDocumentSetMileStone, Guid>(c => c.Type.ID), typeid)
  293. && r.Get<JobDocumentSetMileStone,DateTime>(c=>c.Closed).IsEmpty()
  294. );
  295. if (openmilestones)
  296. {
  297. e.Handled = true;
  298. return;
  299. }
  300. MenuItem newmilestone = new MenuItem()
  301. {
  302. Header = "New Milestone",
  303. Tag = typeid
  304. };
  305. newmilestone.Click += (o, args) => { CreateMileStone(setid, typeid); };
  306. MileStoneMenu.Items.Add(newmilestone);
  307. return;
  308. }
  309. var status = milestone.Get<JobDocumentSetMileStone, JobDocumentSetMileStoneStatus>(c => c.Status);
  310. MenuItem setstatus = new MenuItem() { Header = "Change Status" };
  311. foreach (JobDocumentSetMileStoneStatus newstatus in Enum.GetValues(typeof(JobDocumentSetMileStoneStatus)))
  312. {
  313. if (newstatus != status)
  314. {
  315. MenuItem setstatus2 = new MenuItem() { Header = newstatus.ToString().SplitCamelCase() };
  316. setstatus2.Click += (o, args) => { ChangeMileStoneStatus(milestone, newstatus); };
  317. setstatus.Items.Add(setstatus2);
  318. }
  319. }
  320. MileStoneMenu.Items.Add(setstatus);
  321. MenuItem editmilestone = new MenuItem() { Header = "Edit MileStone" };
  322. editmilestone.Click += (o, args) => { EditMileStone(milestone); };
  323. MileStoneMenu.Items.Add(editmilestone);
  324. var closed = milestone.Get<JobDocumentSetMileStone, DateTime>(c => c.Closed);
  325. if (closed.IsEmpty())
  326. {
  327. MenuItem upload = new MenuItem() { Header = "Upload Files" };
  328. upload.Click += (o, args) => { UploadFiles(milestone); };
  329. MileStoneMenu.Items.Add(upload);
  330. }
  331. MileStoneMenu.Items.Add(new Separator());
  332. MenuItem download = new MenuItem() { Header = "Download Files" };
  333. download.SubmenuOpened += (o, e) =>
  334. {
  335. var files = new Client<JobDocumentSetMileStoneFile>().Query(
  336. new Filter<JobDocumentSetMileStoneFile>(x => x.EntityLink.ID).IsEqualTo(id),
  337. new Columns<JobDocumentSetMileStoneFile>(x => x.ID)
  338. .Add(x => x.DocumentLink.FileName)
  339. .Add(x => x.DocumentLink.ID),
  340. new SortOrder<JobDocumentSetMileStoneFile>(x => x.DocumentLink.FileName)
  341. );
  342. foreach (var row in files.Rows)
  343. {
  344. MenuItem downloadone = new MenuItem()
  345. {
  346. Header = row.Get<JobDocumentSetMileStoneFile,String>(x=>x.DocumentLink.FileName),
  347. Tag = row.Get<JobDocumentSetMileStoneFile,Guid>(x=>x.DocumentLink.ID)
  348. };
  349. downloadone.Click += (sender, args) => { DownloadFiles(milestone, new Guid[] { (Guid)downloadone.Tag }); };
  350. download.Items.Insert(download.Items.Count-1,downloadone);
  351. }
  352. if (files.Rows.Any())
  353. {
  354. download.Items.Insert(download.Items.Count-1,new Separator());
  355. (download.Items[download.Items.Count - 1] as MenuItem).Tag =
  356. files.ExtractValues<JobDocumentSetMileStoneFile, Guid>(x => x.DocumentLink.ID, true).ToArray();
  357. (download.Items[download.Items.Count-1] as MenuItem).IsEnabled = true;
  358. }
  359. };
  360. MenuItem downloadall = new MenuItem()
  361. {
  362. Header = "Download All",
  363. IsEnabled = false
  364. };
  365. downloadall.Click += (sender, args) => { DownloadFiles(milestone, (Guid[])downloadall.Tag); };
  366. download.Items.Add(downloadall);
  367. MileStoneMenu.Items.Add(download);
  368. Guid newsetid = (Guid)(dataGrid.SelectedItem as DataRowView).Row["ID"];
  369. var newcolumn = dataGrid.GetSelectedCells().First().Column.MappingName;
  370. var newtypeid = _types.FirstOrDefault(x => x.Value.Columns.Contains(newcolumn)).Key;
  371. var newopenmilestones = _milestones.Rows.Any(r =>
  372. Guid.Equals(r.Get<JobDocumentSetMileStone, Guid>(c => c.DocumentSet.ID), newsetid)
  373. && Guid.Equals(r.Get<JobDocumentSetMileStone, Guid>(c => c.Type.ID), newtypeid)
  374. && r.Get<JobDocumentSetMileStone,DateTime>(c=>c.Closed).IsEmpty()
  375. );
  376. if (!newopenmilestones)
  377. {
  378. MileStoneMenu.Items.Add(new Separator());
  379. MenuItem newmilestone2 = new MenuItem()
  380. {
  381. Header = "New Milestone",
  382. Tag = newtypeid
  383. };
  384. newmilestone2.Click += (o, args) => { CreateMileStone(newsetid, newtypeid); };
  385. MileStoneMenu.Items.Add(newmilestone2);
  386. }
  387. MileStoneMenu.Items.Add(new Separator());
  388. MenuItem delete = new MenuItem { Header = "Delete MileStone" };
  389. delete.Click += (o, args) => DeleteMileStone(milestone);
  390. MileStoneMenu.Items.Add(delete);
  391. }
  392. private void DownloadFiles(CoreRow row, Guid[] ids)
  393. {
  394. var status = row.Get<JobDocumentSetMileStone, JobDocumentSetMileStoneStatus>(c => c.Status);
  395. var stage = row.Get<JobDocumentSetMileStone, String>(c => c.Type.Code);
  396. var revision = row.Get<JobDocumentSetMileStone, String>(c => c.Revision);
  397. String tag = String.Format(" - {0}{1} ({2})", stage, String.IsNullOrWhiteSpace(revision) ? "" : " - Rev " + revision,
  398. status.ToString().SplitCamelCase());
  399. FolderBrowserDialog dlg = new FolderBrowserDialog();
  400. if (dlg.ShowDialog() == DialogResult.OK)
  401. {
  402. Progress.ShowModal("Downloading Files", (progress) =>
  403. {
  404. var files = new Client<Document>().Query(
  405. new Filter<Document>(x => x.ID).InList(ids)
  406. );
  407. foreach (var row in files.Rows)
  408. {
  409. string filename = row.Get<Document, String>(c => c.FileName);
  410. string extension = Path.GetExtension(filename);
  411. string basefilename = Path.GetFileNameWithoutExtension(filename);
  412. filename = String.Format("{0}{1}{2}", basefilename, tag, extension);
  413. filename = Path.Combine(dlg.SelectedPath, filename);
  414. File.WriteAllBytes(filename, row.Get<Document, byte[]>(c => c.Data));
  415. }
  416. });
  417. }
  418. }
  419. private void UploadFiles(CoreRow row)
  420. {
  421. Guid id = row.Get<JobDocumentSetMileStone, Guid>(c => c.ID);
  422. OpenFileDialog dlg = new OpenFileDialog();
  423. dlg.Filter = "PDF Files (*.pdf)|*.pdf";
  424. dlg.Multiselect = true;
  425. if ((dlg.ShowDialog() == true) && (dlg.FileNames.Length > 0))
  426. {
  427. Progress.ShowModal("Uploading Files", (progress) =>
  428. {
  429. List<Document> documents = new List<Document>();
  430. foreach (var file in dlg.FileNames)
  431. {
  432. var data = File.ReadAllBytes(file);
  433. documents.Add(
  434. new Document()
  435. {
  436. FileName = Path.GetFileName(file).ToLower(),
  437. Data = data,
  438. CRC = CoreUtils.CalculateCRC(data),
  439. TimeStamp = new FileInfo(file).LastWriteTime
  440. }
  441. );
  442. }
  443. new Client<Document>().Save(documents.ToArray(), "Uploaded by User");
  444. progress.Report("Updating Links");
  445. List<JobDocumentSetMileStoneFile> links = new List<JobDocumentSetMileStoneFile>();
  446. foreach (var document in documents)
  447. {
  448. var link = new JobDocumentSetMileStoneFile();
  449. link.EntityLink.ID = id;
  450. link.DocumentLink.ID = document.ID;
  451. links.Add(link);
  452. }
  453. new Client<JobDocumentSetMileStoneFile>().Save(links, "Uploaded By User");
  454. });
  455. MessageBox.Show(String.Format("{0} files uploaded", dlg.FileNames.Length));
  456. }
  457. }
  458. private void CreateMileStone(Guid setid, Guid typeid)
  459. {
  460. JobDocumentSetMileStone milestone = new JobDocumentSetMileStone();
  461. milestone.DocumentSet.ID = setid;
  462. milestone.Type.ID = typeid;
  463. milestone.Status = JobDocumentSetMileStoneStatus.InProgress;
  464. var grid = new JobDocumentSetMileStoneGrid();
  465. if (grid.EditItems(new[] { milestone}))
  466. Refresh();
  467. }
  468. private void ChangeMileStoneStatus(CoreRow row, JobDocumentSetMileStoneStatus newstatus)
  469. {
  470. var milestone = row.ToObject<JobDocumentSetMileStone>();
  471. milestone.Status = newstatus;
  472. new Client<JobDocumentSetMileStone>().Save(milestone, "Changed Status to " + newstatus.ToString().SplitCamelCase());
  473. Refresh();
  474. }
  475. private void EditMileStone(CoreRow row)
  476. {
  477. var milestone = new Client<JobDocumentSetMileStone>().Query(
  478. new Filter<JobDocumentSetMileStone>(x => x.ID).IsEqualTo(row.Get<JobDocumentSetMileStone, Guid>(x => x.ID))
  479. ).Rows.FirstOrDefault()?.ToObject<JobDocumentSetMileStone>();
  480. var grid = new JobDocumentSetMileStoneGrid();
  481. if (grid.EditItems(new[] { milestone }))
  482. Refresh();
  483. }
  484. private void DeleteMileStone(CoreRow row)
  485. {
  486. var milestone = row.ToObject<JobDocumentSetMileStone>();
  487. new Client<JobDocumentSetMileStone>().Delete(milestone,"Deleted by User");
  488. Refresh();
  489. }
  490. private void Add_OnClick(object sender, RoutedEventArgs e)
  491. {
  492. JobDocumentSet set = new JobDocumentSet();
  493. set.Job.ID = JobID;
  494. set.Folder.ID = FolderID;
  495. var grid = new DynamicDataGrid<JobDocumentSet>();
  496. if (grid.EditItems(new[] { set }))
  497. Refresh();
  498. }
  499. private void Edit_OnClick(object sender, RoutedEventArgs e)
  500. {
  501. Guid setid = (Guid)(dataGrid.SelectedItem as DataRowView).Row["ID"];
  502. var set = new Client<JobDocumentSet>().Query(
  503. new Filter<JobDocumentSet>(x => x.ID).IsEqualTo(setid)
  504. ).Rows.FirstOrDefault()?.ToObject<JobDocumentSet>();
  505. var grid = new DynamicDataGrid<JobDocumentSet>();
  506. if (grid.EditItems(new[] { set }))
  507. Refresh();
  508. }
  509. private void Delete_OnClick(object sender, RoutedEventArgs e)
  510. {
  511. Guid setid = (Guid)(dataGrid.SelectedItem as DataRowView).Row["ID"];
  512. var set = new JobDocumentSet() { ID = setid };
  513. new Client<JobDocumentSet>().Delete(set, "Deleted By User");
  514. Refresh();
  515. }
  516. private bool _hidesuperceded = false;
  517. private void HideRejected_OnClick(object sender, RoutedEventArgs e)
  518. {
  519. _hidesuperceded = !_hidesuperceded;
  520. HideSupercededLabel.Content = _hidesuperceded ? "Show All" : "Last Only";
  521. Refresh();
  522. }
  523. }
  524. }