Przeglądaj źródła

Editor Configure() changes

Kenric Nugteren 2 lat temu
rodzic
commit
75c1152398

+ 1 - 1
prs.classes/Entities/Product/ProductDimensions/ProductDimensionsLookup.cs

@@ -30,7 +30,7 @@ namespace Comal.Classes
             return new SortOrder<ProductDimensionUnit>(x => x.Sequence);
         }
 
-        public override string FormatLookup(Dictionary<string, object> values, IEnumerable<string> exclude)
+        public override string FormatLookup(Dictionary<string, object?> values, IEnumerable<string> exclude)
         {
             return String.Format("{0}: {1}",values["Code"], values["Description"]);
         }

+ 1 - 1
prs.classes/Entities/Quote/QuoteTakeoff/QuoteTakeOffUnitLookup.cs

@@ -28,7 +28,7 @@ namespace Comal.Classes
             return new SortOrder<QuoteTakeOffUnit>(x => x.Sequence);
         }
 
-        public override string FormatLookup(Dictionary<string, object> values, IEnumerable<string> exclude)
+        public override string FormatLookup(Dictionary<string, object?> values, IEnumerable<string> exclude)
         {
             return String.Format("{0}",values["Description"]);
         }

+ 3 - 3
prs.classes/Entities/Stock/StockHoldingLookups.cs

@@ -31,12 +31,12 @@ namespace Comal.Classes
                 .Add(x => x.Dimensions.UnitSize);
         }
 
-        private bool HasValue(Dictionary<string, object> values, string key)
+        private bool HasValue(Dictionary<string, object?> values, string key)
         {
-            return values.ContainsKey(key) && values[key] != null && (values[key] is string ? !string.IsNullOrWhiteSpace((string)values[key]) : true);
+            return values.ContainsKey(key) && values[key] != null && !string.IsNullOrWhiteSpace(values[key] as string);
         }
 
-        public override string FormatLookup(Dictionary<string, object> values, IEnumerable<string> exclude)
+        public override string FormatLookup(Dictionary<string, object?> values, IEnumerable<string> exclude)
         {
             var result = new StringBuilder();
             result.AppendFormat("{0}: {1} @ {2} {3}", values["Location.Description"], values["Units"], values["UnitSize"],

+ 0 - 5
prs.classes/Entities/Stock/StockLocation/StockLocationLookups.cs

@@ -59,10 +59,5 @@ namespace Comal.Classes
         {
             return new SortOrder<StockLocation>(x => x.Code);
         }
-
-        public override string FormatLookup(Dictionary<string, object> values, IEnumerable<string> exclude)
-        {
-            return base.FormatLookup(values, exclude);
-        }
     }
 }

+ 0 - 5
prs.desktop/Grids/KanbanGrid.cs

@@ -93,11 +93,6 @@ namespace PRSDesktop
             return true;
         }
 
-        protected override void LookupsDefined(ILookupEditorControl sender, Kanban[] items)
-        {
-            base.LookupsDefined(sender, items);
-        }
-
         private void BeforeSave(IDynamicEditorForm editor, Kanban[] items)
         {
             EnsureAssignee(editor, items.FirstOrDefault());

+ 0 - 3
prs.desktop/Panels/DailyReports/DailyReport.xaml

@@ -190,7 +190,6 @@
                                                      Grid.ColumnSpan="5" Margin="5" Color="LightYellow"
                                                      ColumnName="Task.ID"
                                                      OnEditorValueChanged="EditorValueChanged"
-                                                     OnDefineLookups="Task_OnDefineLookups"
                                                      KeyboardNavigation.TabIndex="8" />
 
                     <Label Content="Job" Grid.Row="4" Grid.Column="0" VerticalAlignment="Center" />
@@ -205,7 +204,6 @@
                                                      Grid.ColumnSpan="5" Margin="5" Color="LightYellow"
                                                      ColumnName="ITP.ID"
                                                      OnEditorValueChanged="EditorValueChanged"
-                                                     OnDefineLookups="ITP_OnDefineLookups"
                                                      KeyboardNavigation.TabIndex="7" />
 
                     <Label Content="Activity" Grid.Row="6" Grid.Column="0" VerticalAlignment="Center" />
@@ -213,7 +211,6 @@
                                                      Grid.ColumnSpan="5" Margin="5" Color="LightYellow"
                                                      ColumnName="ActivityLink.ID"
                                                      OnEditorValueChanged="EditorValueChanged"
-                                                     OnDefineLookups="Activity_OnDefineLookups"
                                                      KeyboardNavigation.TabIndex="8" />
 
 

+ 69 - 17
prs.desktop/Panels/DailyReports/DailyReport.xaml.cs

@@ -8,7 +8,6 @@ using System.Windows.Controls;
 using System.Windows.Data;
 using System.Windows.Input;
 using System.Windows.Media;
-using com.sun.xml.@internal.ws.client;
 using Comal.Classes;
 using InABox.Clients;
 using InABox.Configuration;
@@ -170,7 +169,7 @@ namespace PRSDesktop
     /// <summary>
     ///     Interaction logic for DailyReport.xaml
     /// </summary>
-    public partial class DailyReport : UserControl, IPanel<Assignment>
+    public partial class DailyReport : UserControl, IPanel<Assignment>, IDynamicEditorHost
     {
         private DailyActivityScreenSettings _settings;
 
@@ -227,14 +226,67 @@ namespace PRSDesktop
 
             ConfirmTimeSheetImage.Source = PRSDesktop.Resources.tick.AsBitmapImage();
         }
-        
+
+        #region IDynamicEditorHost
+
+        public IEnumerable<DynamicGridColumn> Columns { get; } = InitialiseColumns();
+
+        private static DynamicGridColumns InitialiseColumns()
+        {
+            var columns = new DynamicGridColumns();
+            columns.ExtractColumns(typeof(Assignment));
+            return columns;
+        }
+
+        public void LoadColumns(string column, Dictionary<string, string> columns)
+        {
+            columns.Clear();
+            var comps = column.Split('.').ToList();
+            comps.RemoveAt(comps.Count - 1);
+            var prefix = string.Format("{0}.", string.Join(".", comps));
+            var cols = Columns.Where(x => !x.ColumnName.Equals(column) && x.ColumnName.StartsWith(prefix));
+            foreach (var col in cols)
+                columns[col.ColumnName.Replace(prefix, "")] = col.ColumnName;
+        }
+
+        public IFilter? DefineFilter(Type type) => LookupFactory.DefineFilter<Assignment>(new Assignment[] { SelectedAssignment }, type);
+
+        public void LoadLookups(ILookupEditorControl editor)
+        {
+            if (editor == Activity) Activity_OnDefineLookups(editor);
+            else if (editor == Kanban) Task_OnDefineLookups(editor);
+            else if (editor == ITP) ITP_OnDefineLookups(editor);
+        }
+
+        public Document? FindDocument(string filename)
+        {
+            return new Client<Document>().Load(new Filter<Document>(x => x.FileName).IsEqualTo(filename)).FirstOrDefault();
+        }
+
+        public Document? GetDocument(Guid id)
+        {
+            Document? doc = null;
+            if (id != Guid.Empty)
+                doc = new Client<Document>().Load(new Filter<Document>(x => x.ID).IsEqualTo(id)).FirstOrDefault();
+            return doc;
+        }
+
+        public void SaveDocument(Document document)
+        {
+            new Client<Document>().Save(document, "");
+        }
+
+        object?[] IDynamicEditorHost.GetItems() => new object?[] { SelectedAssignment };
+
+        public BaseEditor? GetEditor(DynamicGridColumn column) => column.Editor.CloneEditor();
+
+        #endregion
+
         public void Setup()
         {
             Calendar.DisableUpdate();
             try
             {
-
-
                 Parallel.ForEach(
                     new Action[]
                     {
@@ -269,25 +321,24 @@ namespace PRSDesktop
                 ConfigureEditor(Finish, new TimeOfDayEditor());
                 ConfigureEditor(Notes, new MemoEditor());
 
-                Activity.EditorDefinition = DatabaseSchema.Property(typeof(Assignment), CoreUtils.GetFullPropertyName<Assignment,Guid>(c=>c.ActivityLink.ID,".")).Editor;
+                Activity.EditorDefinition = DatabaseSchema.Property(typeof(Assignment), CoreUtils.GetFullPropertyName<Assignment,Guid>(c=>c.ActivityLink.ID,".")).Editor as ILookupEditor;
                 Activity.OtherColumns["Color"] = CoreUtils.GetFullPropertyName<Assignment,String>(c=>c.ActivityLink.Color,".");
                 Activity.OtherColumns["Description"] = CoreUtils.GetFullPropertyName<Assignment,String>(c=>c.ActivityLink.Description,".");
                 ConfigureEditor(Activity);
 
-                ITP.EditorDefinition = DatabaseSchema.Property(typeof(Assignment), "ITP.ID").Editor;
+                ITP.EditorDefinition = DatabaseSchema.Property(typeof(Assignment), "ITP.ID").Editor as ILookupEditor;
                 ITP.OtherColumns["Code"] = "ITP.Code";
                 //ConfigureEditor(ITP);
 
-                Kanban.EditorDefinition = DatabaseSchema.Property(typeof(Assignment), "Task.ID").Editor;
+                Kanban.EditorDefinition = DatabaseSchema.Property(typeof(Assignment), "Task.ID").Editor as ILookupEditor;
                 Kanban.OtherColumns["JobLink.ID"] = "JobLink.ID";
                 Kanban.OtherColumns["JobLink.JobNumber"] = "JobLink.JobNumber";
                 Kanban.OtherColumns["JobLink.Name"] = "JobLink.Name";
                 ConfigureEditor(Kanban);
 
-                Job.EditorDefinition = DatabaseSchema.Property(typeof(Assignment), "JobLink.ID").Editor;
+                Job.EditorDefinition = DatabaseSchema.Property(typeof(Assignment), "JobLink.ID").Editor as CodePopupEditor;
                 Job.OtherColumns["JobNumber"] = "JobLink.JobNumber";
                 Job.OtherColumns["Name"] = "JobLink.Name";
-                Job.OnDefineFilter += (sender, type) => { return LookupFactory.DefineFilter<Assignment, Job>(new[] { SelectedAssignment }); };
                 ConfigureEditor(Job);
                 
                 GotoCurrentRequiredReport();
@@ -349,7 +400,7 @@ namespace PRSDesktop
         
         public Employee Employee { get; set; }
         
-        public event DataModelUpdateEvent OnUpdateDataModel;
+        public event DataModelUpdateEvent? OnUpdateDataModel;
 
         public bool IsReady { get; set; }
 
@@ -383,7 +434,7 @@ namespace PRSDesktop
             
             menu.Items.RemoveAt(0);
             var create = new MenuItem { Header = "Create New Assignment" };
-            create.Tag = new Tuple<DateTime, AssignmentFavourite>(time, null);
+            create.Tag = new Tuple<DateTime, AssignmentFavourite?>(time, null);
             create.Click += action;
             menu.Items.Insert(0,create);
             
@@ -394,7 +445,7 @@ namespace PRSDesktop
                 foreach (var favourite in _settings.Favourites)
                 {
                     var fav = new MenuItem { Header = favourite.Title };
-                    fav.Tag = new Tuple<DateTime, AssignmentFavourite>(time, favourite);
+                    fav.Tag = new Tuple<DateTime, AssignmentFavourite?>(time, favourite);
                     fav.Click += action;
                     menu.Items.Insert(i,fav);
                     i++;
@@ -430,12 +481,12 @@ namespace PRSDesktop
         }
         
 
-        private AssignmentFavourite GetFavourite(AssignmentModel model)
+        private AssignmentFavourite? GetFavourite(AssignmentModel? model)
         {
             return model == null ? null : _settings.Favourites.FirstOrDefault(x => string.Equals(x.Title, model.Subject));
         }
 
-        private void SetAsFavourite(AssignmentModel model)
+        private void SetAsFavourite(AssignmentModel? model)
         {
             if (model == null)
             {
@@ -486,7 +537,7 @@ namespace PRSDesktop
 
         private void CreateAssignment_Click(object sender, RoutedEventArgs e)
         {
-            var fav = (sender as MenuItem)?.Tag as Tuple<DateTime, AssignmentFavourite>;
+            var fav = (sender as MenuItem)?.Tag as Tuple<DateTime, AssignmentFavourite?>;
             var start = fav != null ? fav.Item1.TimeOfDay : Calendar.SelectedDate.TimeOfDay;
             CreateNewAssignment(start, fav?.Item2);
         }
@@ -613,8 +664,9 @@ namespace PRSDesktop
             Logger.Send(LogType.Information, ClientFactory.UserID, "Out Of Assignment_SelectionChanged()");
         }
 
-        private void ConfigureEditor(BaseDynamicEditorControl editor, BaseEditor definition = null)
+        private void ConfigureEditor(BaseDynamicEditorControl editor, BaseEditor? definition = null)
         {
+            editor.Host = this;
             if (definition != null)
                 editor.EditorDefinition = definition;
             editor.Configure();

+ 58 - 10
prs.desktop/Panels/DataEntry/DataEntryPanel.xaml.cs

@@ -32,9 +32,12 @@ namespace PRSDesktop
     /// <summary>
     /// Interaction logic for DataEntryPanel.xaml
     /// </summary>
-    public partial class DataEntryPanel : UserControl, IBasePanel
+    /// <remarks>
+    /// This is a host because it has a singular code popup editor
+    /// </remarks>
+    public partial class DataEntryPanel : UserControl, IBasePanel, IDynamicEditorHost
     {
-        DynamicEditorControl<Guid>? Popup;
+        IPopupEditorControl? Popup;
 
 
         public DataEntryPanel()
@@ -107,6 +110,48 @@ namespace PRSDesktop
             ScanPanel.Shutdown();
         }
 
+        #region Host
+
+        private HashSet<Type> _loadedTypes = new();
+
+        public DynamicGridColumns Columns { get; set; } = new();
+
+        IEnumerable<DynamicGridColumn> IDynamicEditorHost.Columns => Columns;
+
+        public void LoadColumns(string column, Dictionary<string, string> columns)
+        {
+            columns.Clear();
+            var comps = column.Split('.').ToList();
+            comps.RemoveAt(comps.Count - 1);
+            var prefix = string.Format("{0}.", string.Join(".", comps));
+            var cols = Columns.Where(x => !x.ColumnName.Equals(column) && x.ColumnName.StartsWith(prefix));
+            foreach (var col in cols)
+                columns[col.ColumnName.Replace(prefix, "")] = col.ColumnName;
+        }
+
+        public IFilter? DefineFilter(Type type) => LookupFactory.DefineFilter(type);
+
+        public void LoadLookups(ILookupEditorControl sender)
+        {
+            var editor = sender.EditorDefinition as ILookupEditor;
+            var colname = sender.ColumnName;
+
+            var values = editor.Values(colname, Editor.Items);
+            sender.LoadLookups(values);
+        }
+
+        public Document? FindDocument(string filename) => null;
+
+        public Document? GetDocument(Guid id) => null;
+
+        public void SaveDocument(Document document) { }
+
+        object?[] IDynamicEditorHost.GetItems() => Editor.Items;
+
+        public BaseEditor? GetEditor(DynamicGridColumn column) => column.Editor.CloneEditor();
+
+        #endregion
+
         private void ClearEditor(Type TEntity)
         {
             UpdateEditor(TEntity, null);
@@ -164,8 +209,8 @@ namespace PRSDesktop
                 var dataGrid = UpdateEditor(selectedType, null);
                 var editorColumns = dataGrid.LoadEditorColumns();
 
-                if (Popup is not null)
-                    DetailGrid.Children.Remove(Popup);
+                if (Popup is UIElement element)
+                    DetailGrid.Children.Remove(element);
 
                 var code = DatabaseSchema.Properties(selectedType)
                     .Where(x => x.Parent is null && (x.Editor is CodeEditor || x.Editor is UniqueCodeEditor)
@@ -186,8 +231,10 @@ namespace PRSDesktop
                 if (Popup is IPopupEditorControl popupEditor)
                 {
                     Popup.ColumnName = "ID";
-                    popupEditor.OnDefineFilter += (sender, type) => { return LookupFactory.DefineFilter(type); };
+                    popupEditor.Host = this;
 
+                    Columns = new DynamicGridColumns();
+                    Columns.ExtractColumns(selectedType);
                     foreach (var column in LookupFactory.DefineColumns(selectedType).ColumnNames().Where(x => x != "ID"))
                     {
                         popupEditor.OtherColumns.Add(column, column);
@@ -197,9 +244,10 @@ namespace PRSDesktop
                         popupEditor.OtherColumns.Add(codePopup.CodeColumn, codePopup.CodeColumn);
                     }
                 }
+                var el = (Popup as UIElement)!;
 
-                Popup.SetValue(Grid.RowProperty, 0);
-                Popup.SetValue(Grid.ColumnProperty, 3);
+                el.SetValue(Grid.RowProperty, 0);
+                el.SetValue(Grid.ColumnProperty, 3);
                 Popup.EditorDefinition = editor;
                 Popup.OnEditorValueChanged += (s, v) =>
                 {
@@ -224,13 +272,13 @@ namespace PRSDesktop
                 Popup.Configure();
                 Popup.Loaded = true;
 
-                DetailGrid.Children.Add(Popup);
+                DetailGrid.Children.Add(el);
             }
             else
             {
                 DetailGrid.Children.Remove(Editor);
-                if (Popup is not null)
-                    DetailGrid.Children.Remove(Popup);
+                if (Popup is UIElement el)
+                    DetailGrid.Children.Remove(el);
             }
         }
 

+ 1 - 1
prs.desktop/Panels/Jobs/JobSummaryGrid.cs

@@ -79,7 +79,7 @@ namespace PRSDesktop
                         grid.ColumnsTag = $"JobSummaryAggregate.{args.Column.ColumnName}";
                         //DynamicGridUtils.CreateDynamicGrid(typeof(DynamicDataGrid<>), entityType);
                         grid.Options.BeginUpdate().Clear().AddRange(DynamicGridOption.FilterRows, DynamicGridOption.SelectColumns).EndUpdate();
-                        grid.OnDefineFilter += (o, type) =>
+                        grid.OnDefineFilter += t =>
                         {
                             return filter;
                         };

+ 10 - 3
prs.desktop/Panels/Products/Locations/StockTreatmentWindow.xaml.cs

@@ -5,9 +5,15 @@ using Comal.Classes;
 using InABox.Core;
 using InABox.DynamicGrid;
 using InABox.Wpf;
+using Syncfusion.UI.Xaml.Spreadsheet.Commands;
 
 namespace PRSDesktop
 {
+    public class HoldingStockTreatmentEditorHost : DefaultDynamicEditorHost<StockHolding>
+    {
+        public override IFilter? DefineFilter(Type type) => new Filter<Product>(x => x.NonStock).IsEqualTo(true);
+    }
+
     /// <summary>
     ///     Interaction logic for StockTreatmentWindow.xaml
     /// </summary>
@@ -23,15 +29,16 @@ namespace PRSDesktop
         {
             _location = location;
             InitializeComponent();
-            Product.EditorDefinition = DatabaseSchema.Property(typeof(StockHolding), "Product.ID").Editor;
+            Product.EditorDefinition = DatabaseSchema.Property(typeof(StockHolding), "Product.ID").Editor as CodePopupEditor;
             Product.OtherColumns["Code"] = "Product.Code";
             Product.OtherColumns["Name"] = "Product.Name";
-            Product.OnDefineFilter += (sender, type) => new Filter<Product>(x => x.NonStock).IsEqualTo(true);
+            Product.Host = new HoldingStockTreatmentEditorHost();
             ConfigureEditor(Product);
 
-            Supplier.EditorDefinition = DatabaseSchema.Property(typeof(PurchaseOrder), "SupplierLink.ID").Editor;
+            Supplier.EditorDefinition = DatabaseSchema.Property(typeof(PurchaseOrder), "SupplierLink.ID").Editor as CodePopupEditor;
             Supplier.OtherColumns["Code"] = "SupplierLink.Code";
             Supplier.OtherColumns["Name"] = "SupplierLink.Name";
+            Supplier.Host = new DefaultDynamicEditorHost<PurchaseOrder>();
             //Product.OnDefineFilter += (sender, type) => new Filter<Supplier>(x => x.NonStock).IsEqualTo(true);
             ConfigureEditor(Supplier);
         }

+ 1 - 1
prs.desktop/Panels/StockSummary/StockSummaryGrid.cs

@@ -82,7 +82,7 @@ namespace PRSDesktop
                         grid.ColumnsTag = $"StockSummaryAggregate.{args.Column.ColumnName}";
                         //DynamicGridUtils.CreateDynamicGrid(typeof(DynamicDataGrid<>), entityType);
                         grid.Options.BeginUpdate().Clear().AddRange(DynamicGridOption.FilterRows, DynamicGridOption.SelectColumns).EndUpdate();
-                        grid.OnDefineFilter += (o, type) =>
+                        grid.OnDefineFilter += t =>
                         {
                             return filter;
                         };