|
@@ -110,11 +110,10 @@ public partial class TaskPanel : UserControl, IPanel<Kanban>, ITaskHost, IMaster
|
|
|
|
|
|
#region Menu
|
|
|
|
|
|
- private void CompleteTask(ITaskControl control, RoutedEventArgs e, DateTime completed)
|
|
|
+ private void CompleteTask(ITaskControl control, IEnumerable<TaskModel> tasks, DateTime completed)
|
|
|
{
|
|
|
if (!MessageWindow.ShowYesNo("Are you sure you want to complete the selected tasks?", "Confirm Completion"))
|
|
|
return;
|
|
|
- var tasks = (((FrameworkElement)e.Source).Tag as IEnumerable<TaskModel>)!;
|
|
|
Progress.ShowModal("Completing Tasks", progress =>
|
|
|
{
|
|
|
var kanbans = LoadKanbans(tasks, Columns.Required<Kanban>().Add(x => x.ID, x => x.Completed, x => x.Status));
|
|
@@ -467,6 +466,8 @@ public partial class TaskPanel : UserControl, IPanel<Kanban>, ITaskHost, IMaster
|
|
|
{
|
|
|
menu.AddSeparatorIfNeeded();
|
|
|
|
|
|
+ #region Status
|
|
|
+
|
|
|
var changeStatus = new MenuItem { Header = "Change Status" };
|
|
|
|
|
|
AddChangeStatusButton(control, models, changeStatus, "Open", KanbanStatus.Open);
|
|
@@ -475,16 +476,10 @@ public partial class TaskPanel : UserControl, IPanel<Kanban>, ITaskHost, IMaster
|
|
|
|
|
|
if (models.Any(x => x.CompletedDate.IsEmpty()))
|
|
|
{
|
|
|
- var complete = new MenuItem
|
|
|
- {
|
|
|
- Tag = models,
|
|
|
- Header = models.Length > 1 ? "Complete Tasks" : "Complete Task"
|
|
|
- };
|
|
|
- complete.Click += (o, e) =>
|
|
|
+ var complete = menu.AddItem(models.Length > 1 ? "Complete Tasks" : "Complete Task", null, () =>
|
|
|
{
|
|
|
- CompleteTask(control, e, DateTime.Now);
|
|
|
- };
|
|
|
- menu.Items.Add(complete);
|
|
|
+ CompleteTask(control, models, DateTime.Now);
|
|
|
+ });
|
|
|
|
|
|
if (Security.IsAllowed<CanSetKanbanCompletedDate>())
|
|
|
{
|
|
@@ -504,7 +499,7 @@ public partial class TaskPanel : UserControl, IPanel<Kanban>, ITaskHost, IMaster
|
|
|
menu.IsOpen = false;
|
|
|
|
|
|
var selectedDate = calendar.SelectedDate ?? DateTime.Now;
|
|
|
- CompleteTask(control, e, selectedDate);
|
|
|
+ CompleteTask(control, models, selectedDate);
|
|
|
};
|
|
|
|
|
|
dateItem.Header = dateCalendar;
|
|
@@ -535,7 +530,11 @@ public partial class TaskPanel : UserControl, IPanel<Kanban>, ITaskHost, IMaster
|
|
|
|
|
|
menu.Items.Add(changeStatus);
|
|
|
|
|
|
- var changeType = new MenuItem { Header = "Change Task Type", Tag = models };
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region Task Type
|
|
|
+
|
|
|
+ var changeType = menu.AddItem("Change Task Type", null, null);
|
|
|
|
|
|
foreach(var type in KanbanTypes)
|
|
|
{
|
|
@@ -555,10 +554,11 @@ public partial class TaskPanel : UserControl, IPanel<Kanban>, ITaskHost, IMaster
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- menu.Items.Add(changeType);
|
|
|
+ #endregion
|
|
|
|
|
|
+ #region Due Date
|
|
|
|
|
|
- var changeDueDate = new MenuItem { Header = "Change Due Date" };
|
|
|
+ var changeDueDate = menu.AddItem("Change Due Date", null, null);
|
|
|
|
|
|
var calendarItem = new MenuItem();
|
|
|
|
|
@@ -590,10 +590,54 @@ public partial class TaskPanel : UserControl, IPanel<Kanban>, ITaskHost, IMaster
|
|
|
|
|
|
changeDueDate.Items.Add(calendarItem);
|
|
|
|
|
|
- menu.Items.Add(changeDueDate);
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region Employees
|
|
|
+
|
|
|
+ menu.AddItem("Assign To...", null, (control, models), SetAssignee_Click);
|
|
|
+ menu.AddItem("Set Manager...", null, (control, models), SetManager_Click);
|
|
|
+
|
|
|
+ #endregion
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private void SetAssignee_Click((ITaskControl control, TaskModel[] models) tuple)
|
|
|
+ {
|
|
|
+ var tasks = LoadKanbans(tuple.models, Columns.Required<Kanban>().Add(x => x.ID).Add(x => x.EmployeeLink.ID))
|
|
|
+ .ToArray();
|
|
|
+ if (MultiSelectDialog.SelectItem<Employee>(out var employee,
|
|
|
+ filter: LookupFactory.DefineLookupFilter<Kanban, Employee, EmployeeLink>(x => x.EmployeeLink, tasks),
|
|
|
+ columns: LookupFactory.DefineLookupColumns<Kanban, Employee, EmployeeLink>(x => x.EmployeeLink),
|
|
|
+ title: "Select Assignee for Task"))
|
|
|
+ {
|
|
|
+ foreach (var task in tasks)
|
|
|
+ {
|
|
|
+ task.EmployeeLink.CopyFrom(employee);
|
|
|
+ }
|
|
|
+ Client.Save(tasks, "Set Assignee");
|
|
|
+ tuple.control.Refresh();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void SetManager_Click((ITaskControl control, TaskModel[] models) tuple)
|
|
|
+ {
|
|
|
+ var tasks = LoadKanbans(tuple.models, Columns.Required<Kanban>().Add(x => x.ID).Add(x => x.ManagerLink.ID))
|
|
|
+ .ToArray();
|
|
|
+ if (MultiSelectDialog.SelectItem<Employee>(out var employee,
|
|
|
+ filter: LookupFactory.DefineLookupFilter<Kanban, Employee, EmployeeLink>(x => x.ManagerLink, tasks),
|
|
|
+ columns: LookupFactory.DefineLookupColumns<Kanban, Employee, EmployeeLink>(x => x.ManagerLink),
|
|
|
+ title: "Select Manager for Task"))
|
|
|
+ {
|
|
|
+ foreach (var task in tasks)
|
|
|
+ {
|
|
|
+ task.ManagerLink.CopyFrom(employee);
|
|
|
+ }
|
|
|
+ Client.Save(tasks, "Set Manager");
|
|
|
+ tuple.control.Refresh();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
private void Subscribers_Click(TaskModel model)
|
|
|
{
|
|
|
var kanban = LoadKanbans([model], Columns.Required<Kanban>().Add(x => x.ID).Add(x => x.Number)).First();
|