瀏覽代碼

Added filtering to TrackingKanban list.

Kenric Nugteren 5 月之前
父節點
當前提交
949a7e505e
共有 2 個文件被更改,包括 96 次插入24 次删除
  1. 95 23
      prs.desktop/MainWindow.xaml.cs
  2. 1 1
      prs.desktop/Panels/Tasks/TasksByUserControl.xaml.cs

+ 95 - 23
prs.desktop/MainWindow.xaml.cs

@@ -62,6 +62,7 @@ using System.Threading;
 using H.Formatters;
 using PRSDesktop.Forms.Issues;
 using Brushes = System.Windows.Media.Brushes;
+using System.Windows.Media.Imaging;
 
 namespace PRSDesktop;
 
@@ -2692,42 +2693,113 @@ public partial class MainWindow : IPanelHostControl
 
     #region Tracking Kanban
 
+    private class TrackingKanbanFilterItemComponent : DynamicGridFilterComponent<Kanban>
+    {
+        public TrackingKanbanFilterItemComponent() : base(
+            new GlobalConfiguration<CoreFilterDefinitions>(nameof(Kanban)),
+            new UserConfiguration<CoreFilterDefinitions>(nameof(Kanban)))
+        {
+            ButtonText = "Filter";
+        }
+
+        public string Text { get; private set; } = "Filter";
+
+        public Bitmap? Image { get; private set; }
+
+        protected override void UpdateButtonText(Bitmap image, string text)
+        {
+            Text = text;
+            Image = image;
+        }
+    }
+    private TrackingKanbanFilterItemComponent? _trackingKanbanFilterComponent;
+    private TrackingKanbanFilterItemComponent TrackingKanbanFilterComponent
+    {
+        get
+        {
+            if(_trackingKanbanFilterComponent is null)
+            {
+                _trackingKanbanFilterComponent = new();
+                _trackingKanbanFilterComponent.OnFiltersSelected += _trackingKanbanFilterComponent_OnFiltersSelected;
+            }
+            return _trackingKanbanFilterComponent;
+        }
+    }
+
+    private ContextMenu? _trackingKanbanMenu;
+    private MenuItem? _trackingKanbanFilterMenu;
+
+    private void _trackingKanbanFilterComponent_OnFiltersSelected(DynamicGridSelectedFilterSettings filters)
+    {
+        if (_trackingKanbanMenu is null) return;
+
+        if (!filters.MultipleFilters)
+        {
+            _trackingKanbanMenu.IsOpen = false;
+        }
+        if(_trackingKanbanFilterMenu is not null)
+        {
+            _trackingKanbanFilterMenu.Header = TrackingKanbanFilterComponent.Text;
+            _trackingKanbanFilterMenu.Icon = new System.Windows.Controls.Image() { Source = TrackingKanbanFilterComponent.Image?.AsBitmapImage(24, 24) };
+        }
+    }
+
     private void SelectTask_Click(object sender, RoutedEventArgs e)
     {
-        ContextMenu menu = new ContextMenu();
-        MenuItem others = new MenuItem() { Header = "Other Tasks" };
+        var menu = new ContextMenu();
+
+        var others = new MenuItem() { Header = "Other Tasks" };
+        var waiting = new MenuItem() { Header = "Waiting Tasks" };
         using (new WaitCursor())
         {
-
-            var kanbans = new Client<KanbanSubscriber>().Query(
+            var filter =
                 new Filter<KanbanSubscriber>(x => x.Employee.UserLink.ID).IsEqualTo(ClientFactory.UserGuid)
                     .And(x => x.Kanban.Completed).IsEqualTo(DateTime.MinValue)
-                    .And(x => x.Kanban.Closed).IsEqualTo(DateTime.MinValue),
-                Columns.None<KanbanSubscriber>().Add(x => x.Kanban.ID)
+                    .And(x => x.Kanban.Closed).IsEqualTo(DateTime.MinValue);
+            var kanbanFilter = TrackingKanbanFilterComponent.GetFilter();
+            if(kanbanFilter is not null)
+            {
+                filter = filter.And(x => x.Kanban.ID).InQuery(kanbanFilter, x => x.ID);
+            }
+            var kanbans = Client.Query(
+                filter,
+                Columns.None<KanbanSubscriber>()
+                    .Add(x => x.Kanban.ID)
                     .Add(x => x.Kanban.Number)
                     .Add(x => x.Kanban.Title)
+                    .Add(x => x.Kanban.Status)
                     .Add(x => x.Assignee),
-                new SortOrder<KanbanSubscriber>(x => x.Kanban.Number, SortDirection.Ascending)
-            );
-            foreach (var row in kanbans.Rows)
+                new SortOrder<KanbanSubscriber>(x => x.Kanban.Number, SortDirection.Ascending));
+            foreach (var subscriber in kanbans.ToObjects<KanbanSubscriber>())
             {
-                CreateTaskMenu(row.Get<KanbanSubscriber, bool>(c => c.Assignee) ? menu.Items : others.Items,
-                    String.Format("{0} {1}",
-                        row.Get<KanbanSubscriber, int>(c => c.Kanban.Number),
-                        row.Get<KanbanSubscriber, String>(c => c.Kanban.Title)),
-                    row.Get<KanbanSubscriber, Guid>(c => c.Kanban.ID)
-                );
+                CreateTaskMenu(subscriber.Assignee ? (subscriber.Kanban.Status != KanbanStatus.Waiting ? menu : waiting) : others,
+                    $"{subscriber.Kanban.Number} {subscriber.Kanban.Title}",
+                    subscriber.Kanban.ID);
+            }
+
+            menu.AddSeparatorIfNeeded();
+            if(others.Items.Count > 0)
+            {
+                menu.Items.Add(others);
+            }
+            if(waiting.Items.Count > 0)
+            {
+                menu.Items.Add(waiting);
             }
+            menu.AddSeparatorIfNeeded();
+            CreateTaskMenu(menu, "(No Task Selected)", Guid.Empty);
+            menu.AddSeparatorIfNeeded();
 
-            menu.Items.Add(new Separator());
-            menu.Items.Add(others);
-            menu.Items.Add(new Separator());
-            CreateTaskMenu(menu.Items, "(No Task Selected)", Guid.Empty);
+            var filterItem = menu.AddItem(TrackingKanbanFilterComponent.Text, TrackingKanbanFilterComponent.Image, null);
+            TrackingKanbanFilterComponent.PopulateMenu(filterItem);
+            _trackingKanbanFilterMenu = filterItem;
         }
         menu.IsOpen = true;
+        _trackingKanbanMenu = menu;
     }
 
     private Assignment? _kanbantrackingassignment = null;
+    private CoreFilterDefinitions? _kanbanTrackingFilter = null;
 
     private void SetTrackingKanban(Guid kanbanID, string header)
     {
@@ -2741,7 +2813,7 @@ public partial class MainWindow : IPanelHostControl
             if (_kanbantrackingassignment.Actual.Finish < DateTime.Now.TimeOfDay)
             {
                 _kanbantrackingassignment.Actual.Finish = DateTime.Now.TimeOfDay;
-                new Client<Assignment>().Save(_kanbantrackingassignment, "");
+                Client.Save(_kanbantrackingassignment, "");
             }
 
             // Update Existing Kanban
@@ -2766,14 +2838,14 @@ public partial class MainWindow : IPanelHostControl
             _kanbantrackingassignment.Date = DateTime.Today;
             _kanbantrackingassignment.Actual.Start = DateTime.Now.TimeOfDay;
             _kanbantrackingassignment.Actual.Finish = DateTime.Now.TimeOfDay.Add(new TimeSpan(0, 2, 0));
-            new Client<Assignment>().Save(_kanbantrackingassignment, "");
+            Client.Save(_kanbantrackingassignment, "");
         }
     }
 
     private void ClearTrackingKanban()
         => SetTrackingKanban(Guid.Empty, "(No Task Selected)");
 
-    private void CreateTaskMenu(ItemCollection items, String title, Guid id)
+    private void CreateTaskMenu(ItemsControl menu, string title, Guid id)
     {
         var item = new MenuItem()
         {
@@ -2786,7 +2858,7 @@ public partial class MainWindow : IPanelHostControl
 
             SetTrackingKanban((Guid)item.Tag, (menu.Header as string) ?? "");
         };
-        items.Add(item);
+        menu.Items.Add(item);
     }
 
     #endregion

+ 1 - 1
prs.desktop/Panels/Tasks/TasksByUserControl.xaml.cs

@@ -453,7 +453,7 @@ public partial class TasksByUserControl : UserControl, INotifyPropertyChanged, I
                 Columns.None<KanbanSubscriber>().Add(x => x.ID, x => x.Employee.ID, x => x.Kanban.ID),
                 new SortOrder<KanbanSubscriber>(x => x.Kanban.DueDate) { Direction = SortDirection.Ascending }),
             new KeyedQueryDef<Kanban>(
-               kanbanFilter,
+                kanbanFilter,
                 GetKanbanColumns()));
 
         var kanbans = results.GetObjects<Kanban>().ToDictionary(x => x.ID);