|
@@ -1,6 +1,123 @@
|
|
|
+using Avalonia.Controls;
|
|
|
+using Comal.Classes;
|
|
|
+using CommunityToolkit.Mvvm.ComponentModel;
|
|
|
+using CommunityToolkit.Mvvm.Input;
|
|
|
+using DynamicData;
|
|
|
+using InABox.Avalonia;
|
|
|
+using InABox.Avalonia.Components;
|
|
|
+using InABox.Clients;
|
|
|
+using InABox.Core;
|
|
|
+using PRS.Avalonia.Components;
|
|
|
+using PRS.Avalonia.DigitalForms;
|
|
|
+using System;
|
|
|
+using System.Linq;
|
|
|
+using System.Threading.Tasks;
|
|
|
+
|
|
|
namespace PRS.Avalonia.Modules;
|
|
|
|
|
|
-public class FormsViewModel : ModuleViewModel
|
|
|
+public partial class FormsViewModel : ModuleViewModel
|
|
|
{
|
|
|
public override string Title => "Forms";
|
|
|
+
|
|
|
+ [ObservableProperty]
|
|
|
+ private KanbanModel _kanbans;
|
|
|
+
|
|
|
+ [ObservableProperty]
|
|
|
+ private KanbanFormModel _forms;
|
|
|
+
|
|
|
+ [ObservableProperty]
|
|
|
+ private DigitalFormModel _digitalForms;
|
|
|
+
|
|
|
+ public FormsViewModel()
|
|
|
+ {
|
|
|
+ Kanbans = new KanbanModel(DataAccess,
|
|
|
+ () => new Filter<Kanban>(x => x.ID).InQuery(new Filter<KanbanSubscriber>(x => x.Employee.ID).IsEqualTo(Repositories.Me.ID), x => x.Kanban.ID)
|
|
|
+ .And(new Filter<Kanban>(x => x.Status).IsNotEqualTo(KanbanStatus.Complete)
|
|
|
+ .Or(x => x.Completed).IsGreaterThanOrEqualTo(DateTime.Today.AddDays(-7))),
|
|
|
+ () => DefaultCacheFileName<KanbanShell>());
|
|
|
+
|
|
|
+ Forms = new KanbanFormModel(DataAccess,
|
|
|
+ () => new Filter<KanbanForm>(x => x.Parent.EmployeeLink.ID).IsEqualTo(Repositories.Me.ID)
|
|
|
+ .And(new Filter<KanbanForm>(x => x.FormCompleted).IsEqualTo(DateTime.MinValue)
|
|
|
+ .Or(x => x.FormCompleted).IsGreaterThanOrEqualTo(DateTime.Today.AddDays(-7))),
|
|
|
+ () => DefaultCacheFileName<KanbanFormShell>());
|
|
|
+
|
|
|
+ DigitalForms = new DigitalFormModel(DataAccess,
|
|
|
+ () => new Filter<DigitalForm>(x => x.ID).InQuery(new Filter<EmployeeDigitalForm>(x => x.Employee.ID).IsEqualTo(Repositories.Me.ID), x => x.Form.ID)
|
|
|
+ .And(x => x.Active).IsEqualTo(true),
|
|
|
+ () => DefaultCacheFileName<DigitalFormShell>());
|
|
|
+
|
|
|
+ PrimaryMenu.Add(new AvaloniaMenuItem(Images.plus, AddForm));
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task<bool> AddForm()
|
|
|
+ {
|
|
|
+ var form = (await SelectionViewModel.ExecutePopup<DigitalFormShell>(model =>
|
|
|
+ {
|
|
|
+ model.AddFilters(DigitalForms.AvailableFilters.Select(x => x.Name).NotNull());
|
|
|
+ model.Columns.BeginUpdate()
|
|
|
+ .Add(new AvaloniaDataGridTextColumn<DigitalFormShell>
|
|
|
+ {
|
|
|
+ Column = x => x.Code,
|
|
|
+ Width = GridLength.Auto
|
|
|
+ })
|
|
|
+ .Add(new AvaloniaDataGridTextColumn<DigitalFormShell>
|
|
|
+ {
|
|
|
+ Column = x => x.Description,
|
|
|
+ Width = GridLength.Star
|
|
|
+ })
|
|
|
+ .EndUpdate();
|
|
|
+ }, args =>
|
|
|
+ {
|
|
|
+ DigitalForms.SelectFilter(args.Filter);
|
|
|
+ DigitalForms.Search(x => x.AppliesTo == nameof(Kanban));
|
|
|
+ return DigitalForms.Refresh(args.Force);
|
|
|
+ }))?.FirstOrDefault();
|
|
|
+ if (form is null) return true;
|
|
|
+
|
|
|
+ var kanban = Kanbans.CreateItem();
|
|
|
+ kanban.EmployeeID = Repositories.Me.ID;
|
|
|
+ kanban.ManagerID = Repositories.Me.ID;
|
|
|
+ kanban.Title = form.Description;
|
|
|
+
|
|
|
+ var kanbanForm = Forms.CreateItem();
|
|
|
+ kanbanForm.FormID = form.ID;
|
|
|
+ kanbanForm.FormCode = form.Code;
|
|
|
+ kanbanForm.FormDescription = form.Description;
|
|
|
+
|
|
|
+ DigitalFormsHostViewModel<KanbanFormModel, KanbanFormShell, Kanban, KanbanLink, KanbanForm>.EditForm(Forms, kanbanForm, kanban.Entity);
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ protected override async Task<TimeSpan> OnRefresh()
|
|
|
+ {
|
|
|
+ await Forms.RefreshAsync(false);
|
|
|
+ return TimeSpan.Zero;
|
|
|
+ }
|
|
|
+
|
|
|
+ [RelayCommand]
|
|
|
+ private async Task FormClicked(KanbanFormShell shell)
|
|
|
+ {
|
|
|
+ var kanban = Kanbans.FirstOrDefault(x => x.ID == shell.ParentID)?.Entity;
|
|
|
+ if(kanban is null)
|
|
|
+ {
|
|
|
+ // Need to go to the database, because this task isn't in our list.
|
|
|
+ ProgressVisible = true;
|
|
|
+
|
|
|
+ kanban = (await Client.QueryAsync(new Filter<Kanban>(x => x.ID).IsEqualTo(shell.ParentID), new KanbanShell().Columns.Columns))
|
|
|
+ .ToObjects<Kanban>().FirstOrDefault();
|
|
|
+
|
|
|
+ ProgressVisible = false;
|
|
|
+
|
|
|
+ if(kanban is null)
|
|
|
+ {
|
|
|
+ MobileLogging.Log($"ERROR: Could not find kanban with ID {shell.ParentID} for editing form.");
|
|
|
+ await MessageDialog.ShowMessage("Sorry, but we could not load this form.");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ DigitalFormsHostViewModel<KanbanFormModel, KanbanFormShell, Kanban, KanbanLink, KanbanForm>.EditForm(Forms, shell, kanban);
|
|
|
+ }
|
|
|
}
|