Преглед на файлове

Fixed Direct Edit Drop-Down Issues
Added Clear Button to MultiSelectDialog

frogsoftware преди 1 година
родител
ревизия
ae06f57c4a

+ 25 - 27
InABox.Core/Entity.cs

@@ -248,33 +248,31 @@ namespace InABox.Core
                 bTaxing = true;
                 try
                 {
-
-
-
-                var taxable = this as ITaxable;
-
-                if (name.Equals("ExTax"))
-                {
-                    taxable.Tax = (double)after * (taxable.TaxRate / 100.0F);
-                    taxable.IncTax = (double)after + taxable.Tax;
-                }
-
-                else if (name.Equals("TaxRate"))
-                {
-                    taxable.Tax = taxable.ExTax * ((double)after / 100.0F);
-                    taxable.IncTax = taxable.ExTax + taxable.Tax;
-                }
-
-                else if (name.Equals("Tax"))
-                {
-                    taxable.IncTax = (double)after + taxable.Tax;
-                }
-
-                else if (name.Equals("IncTax"))
-                {
-                    taxable.ExTax = (double)after / ((100.0F + taxable.TaxRate) / 100.0F);
-                    taxable.Tax = (double)after - taxable.ExTax;
-                }
+                    
+                    var taxable = this as ITaxable;
+
+                    if (name.Equals("ExTax"))
+                    {
+                        taxable.Tax = (double)after * (taxable.TaxRate / 100.0F);
+                        taxable.IncTax = (double)after + taxable.Tax;
+                    }
+
+                    else if (name.Equals("TaxRate"))
+                    {
+                        taxable.Tax = taxable.ExTax * ((double)after / 100.0F);
+                        taxable.IncTax = taxable.ExTax + taxable.Tax;
+                    }
+
+                    else if (name.Equals("Tax"))
+                    {
+                        taxable.IncTax = (double)after + taxable.Tax;
+                    }
+
+                    else if (name.Equals("IncTax"))
+                    {
+                        taxable.ExTax = (double)after / ((100.0F + taxable.TaxRate) / 100.0F);
+                        taxable.Tax = (double)after - taxable.ExTax;
+                    }
                 
                 }
                 catch (Exception e)

+ 2 - 1
inabox.wpf/DynamicGrid/DynamicEditorForm/DynamicEditorForm.xaml

@@ -21,7 +21,8 @@
                              BorderThickness="0,0.75,0,0"
                              Background="White"
                              CornerRadius="0"
-                             d:DesignHeight="400" d:DesignWidth="400">
+                             d:DesignHeight="400" d:DesignWidth="400"
+                             >
     <syncfusion:ChromelessWindow.DataContext>
         <local:DynamicEditorFormModel />
     </syncfusion:ChromelessWindow.DataContext>

+ 89 - 60
inabox.wpf/DynamicGrid/DynamicGrid.cs

@@ -480,6 +480,7 @@ namespace InABox.DynamicGrid
             DataGrid.NavigationMode = NavigationMode.Row;
             DataGrid.AllowEditing = false;
             DataGrid.EditTrigger = EditTrigger.OnTap;
+
             DataGrid.CurrentCellBeginEdit += DataGrid_CurrentCellBeginEdit;
             DataGrid.CurrentCellEndEdit += DataGrid_CurrentCellEndEdit;
             DataGrid.CurrentCellValueChanged += DataGrid_CurrentCellValueChanged;
@@ -870,6 +871,12 @@ namespace InABox.DynamicGrid
             }
             else if (e.Key == Key.Tab)
             {
+                if (HasOption(DynamicGridOption.DirectEdit))
+                {
+                    DataGrid.SelectionController.CurrentCellManager.EndEdit();
+                    DataGrid.MoveFocus(new TraversalRequest(FocusNavigationDirection.Right));
+                    DataGrid.SelectionController.CurrentCellManager.BeginEdit();
+                }
             }
             //throw new NotImplementedException();
         }
@@ -1028,21 +1035,57 @@ namespace InABox.DynamicGrid
             if (e.Column is GridCheckBoxColumn)
                 inplaceeditor = LoadItem(Data.Rows[e.RowColumnIndex.RowIndex - headerrows]);
             if (inplaceeditor is not null)
-                UpdateData(inplaceeditor, DataGrid.Columns[e.RowColumnIndex.ColumnIndex].MappingName);
+                UpdateData(DataGrid.Columns[e.RowColumnIndex.ColumnIndex].MappingName);
             if (e.Column is GridCheckBoxColumn)
                 inplaceeditor = null;
             if (inplaceeditor is not null)
                 bChanged = true;
         }
 
-        private void DataGrid_CurrentCellDropDownSelectionChanged(object? sender, CurrentCellDropDownSelectionChangedEventArgs e)
+        private void DataGrid_CurrentCellDropDownSelectionChanged(object? sender,
+            CurrentCellDropDownSelectionChangedEventArgs e)
         {
             var headerrows = HasOption(DynamicGridOption.FilterRows) ? 2 : 1;
             if (e.RowColumnIndex.RowIndex < headerrows)
                 return;
             inplaceeditor ??= LoadItem(Data.Rows[e.RowColumnIndex.RowIndex - headerrows]);
-            if (inplaceeditor != null)
-                bChanged = true;
+            if ((inplaceeditor is not null) && (e.SelectedItem is Tuple<object?, string> tuple))
+            {
+                
+                var iRow = SelectedRows.First().Index;
+                
+                var mappedname = DataGrid.Columns[e.RowColumnIndex.ColumnIndex].MappingName;
+
+                var colno = DataGridItems.Columns.IndexOf(mappedname);
+                var corecol = Data.Columns[colno].ColumnName;
+
+                Dictionary<CoreColumn, object> updates = new Dictionary<CoreColumn, object>();
+
+                var prefix = String.Join(".", corecol.Split(".").Reverse().Skip(1).Reverse());
+                var field = corecol.Split(".").Last();
+
+                var prop = CoreUtils.GetProperty(typeof(T), corecol);
+                if (prop.GetEditor() is ILookupEditor editor)
+                {
+                    var data = editor.Values(corecol);
+                    var lookuprow = data.Rows.FirstOrDefault(r => Equals(r[field], tuple.Item1));
+                    if (lookuprow == null)
+                        lookuprow = data.NewRow(true);
+
+                    foreach (CoreColumn lookupcol in data.Columns)
+                    {
+                        var columnname = String.IsNullOrWhiteSpace(prefix)
+                            ? lookupcol.ColumnName
+                            : String.Join(".", prefix, lookupcol.ColumnName);
+                        var updatecol = Data.Columns.FirstOrDefault(x => String.Equals(x.ColumnName, columnname));
+                        if (updatecol != null)
+                            updates[updatecol] = lookuprow[lookupcol.ColumnName];
+                    }
+                    UpdateData(updates);
+                    bChanged = true;
+                    
+                }
+            }
         }
 
         protected void UpdateCell(int row, string colname, object value)
@@ -1066,7 +1109,7 @@ namespace InABox.DynamicGrid
             if (e.RowColumnIndex.RowIndex < headerrows)
                 return;
             if (inplaceeditor is not null && bChanged) 
-                UpdateData(inplaceeditor, DataGrid.Columns[e.RowColumnIndex.ColumnIndex].MappingName);
+                UpdateData(DataGrid.Columns[e.RowColumnIndex.ColumnIndex].MappingName);
             if (bChanged)
                 DoChanged();
             bChanged = false;
@@ -1075,69 +1118,55 @@ namespace InABox.DynamicGrid
 
         }
 
-        private void UpdateData(T obj, String mappedname)
+        private void UpdateData(Dictionary<CoreColumn,object> updates)
         {
             if (!SelectedRows.Any())
                 return;
-            var table = DataGridItems;
-            
-            var iRow = SelectedRows.First().Index; //e.RowColumnIndex.RowIndex - (HasOption(DynamicGridOptions.FilterRows) ? 2 : 1);
-            if (table is null || iRow > table.Rows.Count)
-                return;
-            var row = table.Rows[iRow];
-            var value = row[mappedname];
 
-            var colno = table.Columns.IndexOf(mappedname);
-            var corecol = Data.Columns[colno].ColumnName;
+            var iRow = SelectedRows.First().Index;
             var corerow = Data.Rows[iRow];
-            corerow[corecol] = value;
+            var row = DataGridItems.Rows[iRow];
 
             Dictionary<String, object> changes = new Dictionary<string, object>();
-            if (DataGrid.Columns[mappedname] is GridComboBoxColumn combo)
+            foreach (var col in updates.Keys)
             {
-
-                var prefix = String.Join(".", corecol.Split(".").Reverse().Skip(1).Reverse());
-                var field = corecol.Split(".").Last();
-                var lookups = (combo.ItemsSource as DataView)?.Table;
-                if (lookups != null)
-                {
-                    var lookuprow = lookups.AsEnumerable().FirstOrDefault(x => x[field] == value);
-                    if (lookuprow != null)
-                    {
-                        foreach (DataColumn lookupcol in lookups.Columns)
-                        {
-                            var prop = String.IsNullOrWhiteSpace(prefix)
-                                ? lookupcol.ColumnName
-                                : String.Join(".", new String[] { prefix, lookupcol.ColumnName });
-                            DynamicGridUtils.UpdateEditorValue(new BaseObject[] { inplaceeditor }, prop, lookuprow[lookupcol], changes);
-                            //CoreUtils.SetPropertyValue(obj, prop, lookuprow[lookupcol]);
-                        }
-                    }
-                }
+                corerow[col.ColumnName] = updates[col];
+                DynamicGridUtils.UpdateEditorValue(new BaseObject[] { inplaceeditor }, col.ColumnName, updates[col], changes);
             }
-            else
-                DynamicGridUtils.UpdateEditorValue(new BaseObject[] { inplaceeditor }, corecol, value, changes);
-            //CoreUtils.SetPropertyValue(obj, corecol, value);
-
-
-            SaveItem(obj);
+            
+            SaveItem(inplaceeditor);
+            
             foreach (var key in changes.Keys)
                 UpdateCell(iRow, key, changes[key]);
-            //Data.LoadRow(corerow, obj);
-
-            foreach (var c in Data.Columns.Where(x => !string.Equals(corecol, x.ColumnName)))
-            {
-                var scol = c.ColumnName.Replace('.', '_');
-                row[scol] = corerow[c.ColumnName] ?? DBNull.Value;
-            }
+            
+            // foreach (var c in Data.Columns.Where(x => !string.Equals(column.ColumnName, x.ColumnName)))
+            // {
+            //     var scol = c.ColumnName.Replace('.', '_');
+            //     row[scol] = corerow[c.ColumnName] ?? DBNull.Value;
+            // }
 
             for (var i = 0; i < ActionColumns.Count; i++)
                 row[string.Format("ActionColumn{0}", i)] = ActionColumns[i].Data(corerow);
+            
+        }
 
+        private void UpdateData(String mappedname)
+        {
+            if (!SelectedRows.Any())
+                return;
+            
+            var iRow = SelectedRows.First().Index; //e.RowColumnIndex.RowIndex - (HasOption(DynamicGridOptions.FilterRows) ? 2 : 1);
+            if (DataGridItems is null || iRow > DataGridItems.Rows.Count)
+                return;
+
+            var colno = DataGridItems.Columns.IndexOf(mappedname);
+            var column = Data.Columns[colno];
+            var value = DataGridItems.Rows[iRow][mappedname];
+            
+            UpdateData(new Dictionary<CoreColumn, object>() { { column, value } });
+            
         }
         
-        
-
         private void DataGrid_QueryRowHeight(object? sender, QueryRowHeightEventArgs e)
         {
             if (e.RowIndex > 0)
@@ -1946,7 +1975,7 @@ namespace InABox.DynamicGrid
                                                 {
                                                     var colno = DataGridItems.Columns.IndexOf(col.MappingName);
                                                     view[col.MappingName] = list.ID;
-                                                    UpdateData(inplaceeditor,col.MappingName);
+                                                    UpdateData(col.MappingName);
                                                     
                                                     var prefix = String.Join(".", Data.Columns[colno].ColumnName.Split('.').Reverse().Skip(1).Reverse());
                                                     foreach (var key in list.OtherValues.Keys)
@@ -1956,7 +1985,7 @@ namespace InABox.DynamicGrid
                                                             : $"{prefix}.{key}";
                                                         othercol = othercol.Replace('.', '_');
                                                         view[othercol] = list.OtherValues[key] ?? DBNull.Value;
-                                                        UpdateData(inplaceeditor,othercol);
+                                                        UpdateData(othercol);
                                                     }
                                                     
                                                     DataGrid.SelectionController.CurrentCellManager.EndEdit();
@@ -1986,7 +2015,7 @@ namespace InABox.DynamicGrid
                     else if (prop.Editor is ILookupEditor lookupEditor)
                     {
                         var lookupcol = new GridComboBoxColumn();
-
+                        
                         //var lookups = editor.Values(column.ColumnName).ToDictionary(column.ColumnName, "Display");
                         //lookupcol.SelectedValuePath = "Key";
                         //lookupcol.DisplayMemberPath = "Value";
@@ -1997,7 +2026,7 @@ namespace InABox.DynamicGrid
                         //row["Display"] = "";
                         //table.Rows.InsertAt(row, 0);
                         
-                        /*var data = lookupEditor.Values(column.ColumnName);
+                        var data = lookupEditor.Values(column.ColumnName);
 
                         var items = new List<Tuple<object?, string>>();
                         if (!lookupEditor.IsEnumEditor())
@@ -2005,13 +2034,13 @@ namespace InABox.DynamicGrid
                             items.Add(new(null, ""));
                         }
                         foreach(var row in data.Rows)
-                        {
                             items.Add(new(row[data.Columns[0].ColumnName], (row["Display"] ?? "").ToString() ?? ""));
-                        }*/
+                        
+                        lookupcol.SelectedValuePath = "Item1";
+                        lookupcol.DisplayMemberPath = "Item2";
+                        lookupcol.ItemsSource = items;
+                        lookupcol.UpdateTrigger = UpdateSourceTrigger.PropertyChanged;
 
-                        lookupcol.SelectedValuePath = table.Columns[0].ColumnName;
-                        lookupcol.DisplayMemberPath = "Display";
-                        lookupcol.ItemsSource = table.DefaultView;
                         newcol = lookupcol;
                     }
                     else

+ 67 - 36
inabox.wpf/DynamicGrid/MultiSelectDialog.cs

@@ -4,10 +4,12 @@ using System.Linq;
 using System.Linq.Expressions;
 using System.Windows;
 using System.Windows.Controls;
+using System.Windows.Forms;
 using InABox.Clients;
 using InABox.Core;
 using InABox.Wpf;
 using Syncfusion.Data;
+using Button = System.Windows.Controls.Button;
 
 namespace InABox.DynamicGrid
 {
@@ -26,6 +28,7 @@ namespace InABox.DynamicGrid
         private readonly Filter<T>? _filter;
         private readonly DynamicDataGrid<T> datagrid;
         private readonly Grid grid;
+        private readonly Button ClearButton;
         private readonly Button OKButton;
         private ThemableWindow? window;
 
@@ -43,6 +46,7 @@ namespace InABox.DynamicGrid
             grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1.0F, GridUnitType.Star) });
             grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(40.0F, GridUnitType.Pixel) });
 
+            grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(80.0F, GridUnitType.Pixel) });
             grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1.0F, GridUnitType.Star) });
             grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(80.0F, GridUnitType.Pixel) });
             grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(80.0F, GridUnitType.Pixel) });
@@ -79,16 +83,24 @@ namespace InABox.DynamicGrid
 
             datagrid.SetValue(Grid.RowProperty, 0);
             datagrid.SetValue(Grid.ColumnProperty, 0);
-            datagrid.SetValue(Grid.ColumnSpanProperty, 3);
+            datagrid.SetValue(Grid.ColumnSpanProperty, 4);
             datagrid.OnSelectItem += Datagrid_OnSelectItem;
             grid.Children.Add(datagrid);
+            
+            ClearButton = new Button();
+            ClearButton.Margin = new Thickness(0, 5, 5, 0);
+            ClearButton.Content = "Clear";
+            ClearButton.Click += ClearButton_Click;
+            ClearButton.SetValue(Grid.RowProperty, 1);
+            ClearButton.SetValue(Grid.ColumnProperty, 0);
+            grid.Children.Add(ClearButton);
 
             OKButton = new Button();
             OKButton.Margin = new Thickness(5, 5, 0, 0);
             OKButton.Content = "OK";
             OKButton.Click += OKButton_Click;
             OKButton.SetValue(Grid.RowProperty, 1);
-            OKButton.SetValue(Grid.ColumnProperty, 1);
+            OKButton.SetValue(Grid.ColumnProperty, 2);
             OKButton.IsEnabled = false;
             grid.Children.Add(OKButton);
 
@@ -97,7 +109,7 @@ namespace InABox.DynamicGrid
             CancelButton.Content = "Cancel";
             CancelButton.Click += CancelButton_Click;
             CancelButton.SetValue(Grid.RowProperty, 1);
-            CancelButton.SetValue(Grid.ColumnProperty, 2);
+            CancelButton.SetValue(Grid.ColumnProperty, 3);
             grid.Children.Add(CancelButton);
         }
 
@@ -108,14 +120,21 @@ namespace InABox.DynamicGrid
             datagrid.Refresh(true, true);
             if (!String.IsNullOrEmpty(column) && !String.IsNullOrEmpty(value))
                 datagrid.AddVisualFilter(column, value, filtertype);
-            if (window.ShowDialog() == true)
+            if (window.ShowDialog() != null)
                 return true;
             return false;
         }
 
         public Guid[] IDs()
         {
-            if (datagrid.Data != null && datagrid.SelectedRows.Any()) return datagrid.SelectedRows.Select(r => r.Get<T, Guid>(x => x.ID)).ToArray();
+            if (window?.DialogResult == true)
+            {
+                if (datagrid?.Data != null && datagrid.SelectedRows.Any())
+                    return datagrid.SelectedRows.Select(r => r.Get<T, Guid>(x => x.ID)).ToArray();
+            }
+            else if (window?.DialogResult == false)
+                return new Guid[] { Guid.Empty };
+
             return Array.Empty<Guid>();
         }
 
@@ -123,31 +142,54 @@ namespace InABox.DynamicGrid
         {
             var result = new CoreTable();
             result.Columns.Add(new CoreColumn { ColumnName = "ID", DataType = typeof(Guid) });
-
-            //foreach (var column in _columns)
-            //{
-            //String name = CoreUtils.GetFullPropertyName(column, ".");
-            //Type type = column.ReturnType;
-            //result.Columns.Add(new CoreColumn() { ColumnName = name, DataType = type });
-
-            //}
             foreach (var column in _columns.Items)
                 result.Columns.Add(new CoreColumn { ColumnName = column.Property, DataType = column.Type });
 
-            if (datagrid.Data != null && datagrid.SelectedRows.Any())
-                foreach (var sel in datagrid.SelectedRows)
+            if (window?.DialogResult == true)
+            {
+
+                if (datagrid?.Data != null && datagrid.SelectedRows.Any())
+                    foreach (var sel in datagrid.SelectedRows)
+                    {
+                        var row = result.NewRow();
+                        foreach (var column in result.Columns)
+                        {
+                            var value = sel[column.ColumnName];
+                            row.Set(column.ColumnName, value);
+                        }
+                        result.Rows.Add(row);
+                    }
+            }
+            else if (window?.DialogResult == false)
+            {
+                var row = result.NewRow(true);
+                result.Rows.Add(row);
+            }
+
+            return result;
+        }
+        
+        public T[] Items(Columns<T>? columns = null)
+        {
+            if (window?.DialogResult == true)
+            {
+                if (datagrid.Data != null && datagrid.SelectedRows.Any())
                 {
-                    var row = result.NewRow();
-                    foreach (var column in result.Columns)
+                    Filter<T>? flt = null;
+                    foreach (var row in datagrid.SelectedRows)
                     {
-                        var value = sel[column.ColumnName];
-                        row.Set(column.ColumnName, value);
+                        var id = row.Get<T, Guid>(x => x.ID);
+                        flt = flt == null ? new Filter<T>(x => x.ID).IsEqualTo(id) : flt.Or(x => x.ID).IsEqualTo(id);
                     }
 
-                    result.Rows.Add(row);
+                    var items = new Client<T>().Query(flt, columns).Rows.Select(r => r.ToObject<T>());
+                    return items.ToArray();
                 }
+            }
+            else if (window?.DialogResult == false)
+                return new T[] { new T() };
 
-            return result;
+            return new T[] { };
         }
 
         private void Grid_DoubleClick(object sender, HandledEventArgs args)
@@ -164,7 +206,6 @@ namespace InABox.DynamicGrid
 
         private void CancelButton_Click(object sender, RoutedEventArgs e)
         {
-            window!.DialogResult = false;
             window.Close();
         }
 
@@ -174,23 +215,13 @@ namespace InABox.DynamicGrid
             window.Close();
         }
 
-        public T[] Items(Columns<T>? columns = null)
+        private void ClearButton_Click(object sender, RoutedEventArgs e)
         {
-            if (datagrid.Data != null && datagrid.SelectedRows.Any())
-            {
-                Filter<T>? flt = null;
-                foreach (var row in datagrid.SelectedRows)
-                {
-                    var id = row.Get<T, Guid>(x => x.ID);
-                    flt = flt == null ? new Filter<T>(x => x.ID).IsEqualTo(id) : flt.Or(x => x.ID).IsEqualTo(id);
-                }
+            window!.DialogResult = false;
+            window.Close();
+        }
 
-                var items = new Client<T>().Query(flt, columns).Rows.Select(r => r.ToObject<T>());
-                return items.ToArray();
-            }
 
-            return new T[] { };
-        }
 
         private void Grid_OnReload(object sender, Filters<T> criteria, Columns<T> columns, ref SortOrder<T>? sortby)
         {