|
@@ -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
|