Parcourir la source

avalonia: Added saving and cancelling to tasks screen

Kenric Nugteren il y a 1 mois
Parent
commit
44afec89a4

+ 2 - 1
PRS.Avalonia/PRS.Avalonia/Modules/MyTasks/MyTasksView.axaml

@@ -98,7 +98,8 @@
 		<TabStrip Name="_tabList" Classes="Standard"
 				  Grid.Row="1" Grid.Column="0"
 				  SelectionChanged="TabStrip_SelectionChanged"
-				  Margin="{StaticResource PrsControlSpacing}">
+				  Margin="{StaticResource PrsControlSpacing}"
+				  SelectedIndex="{Binding SelectedTab}">
 			<TabStripItem Content="New" Tag="{x:Static classes:KanbanStatus.Open}"/>
 			<TabStripItem Content="Current" Tag="{x:Static classes:KanbanStatus.InProgress}"/>
 			<TabStripItem Content="Waiting" Tag="{x:Static classes:KanbanStatus.Waiting}"/>

+ 4 - 4
PRS.Avalonia/PRS.Avalonia/Modules/MyTasks/MyTasksView.axaml.cs

@@ -88,7 +88,7 @@ public class KanbanForegroundColorConverter : KanbanColorConverter
 
 public partial class MyTasksView : UserControl
 {
-    private MyTasksViewModel ViewModel = null!;
+    private MyTasksViewModel? ViewModel = null;
 
     public MyTasksView()
     {
@@ -99,17 +99,17 @@ public partial class MyTasksView : UserControl
     {
         base.OnDataContextChanged(e);
         
-        ViewModel = (DataContext as MyTasksViewModel)!;
+        ViewModel = DataContext as MyTasksViewModel;
     }
 
     private bool PrsListView_FilterShell(IShell shell)
     {
-        return ViewModel.FilterShell(shell);
+        return ViewModel?.FilterShell(shell) ?? true;
     }
 
     private void TabStrip_SelectionChanged(object sender, SelectionChangedEventArgs e)
     {
-        if (_tabList is null) return;
+        if (_tabList is null || ViewModel is null) return;
 
         if(_tabList.SelectedItem is TabStripItem tab && tab.Tag is KanbanStatus status)
         {

+ 3 - 0
PRS.Avalonia/PRS.Avalonia/Modules/MyTasks/MyTasksViewModel.cs

@@ -29,6 +29,9 @@ public partial class MyTasksViewModel : ModuleViewModel
     [ObservableProperty]
     private KanbanStatus _status;
 
+    [ObservableProperty]
+    private int _selectedTab = 0;
+
     public MyTasksViewModel()
     {
         PrimaryMenu.Add(new(Images.plus, AddTask));

+ 15 - 13
PRS.Avalonia/PRS.Avalonia/Modules/MyTasks/TaskEditView.axaml

@@ -48,19 +48,21 @@
         <TabItem Header="Notes">
             <Border Classes="Standard">
 				<Border CornerRadius="{StaticResource PrsCornerRadius}" ClipToBounds="True">
-					<ItemsControl ItemsSource="{Binding Shell.Notes}">
-						<ItemsControl.ItemTemplate>
-							<DataTemplate>
-								<StackPanel>
-                                    <TextBlock Text="{Binding}" Background="Gainsboro"
-                                               Padding="5,10"
-                                               VerticalAlignment="Center"
-                                               TextWrapping="WrapWithOverflow"/>
-									<Rectangle Height="1" Margin="0" Fill="Silver"/>
-								</StackPanel>
-							</DataTemplate>
-						</ItemsControl.ItemTemplate>
-					</ItemsControl>
+                    <ScrollViewer HorizontalScrollBarVisibility="Hidden">
+						<ItemsControl ItemsSource="{Binding Shell.Notes}">
+							<ItemsControl.ItemTemplate>
+								<DataTemplate>
+									<StackPanel>
+										<TextBlock Text="{Binding}" Background="Gainsboro"
+												   Padding="5,10"
+												   VerticalAlignment="Center"
+												   TextWrapping="WrapWithOverflow"/>
+										<Rectangle Height="1" Margin="0" Fill="Silver"/>
+									</StackPanel>
+								</DataTemplate>
+							</ItemsControl.ItemTemplate>
+						</ItemsControl>
+                    </ScrollViewer>
 				</Border>
             </Border>
         </TabItem>

+ 14 - 1
PRS.Avalonia/PRS.Avalonia/Modules/MyTasks/TaskEditViewModel.cs

@@ -32,6 +32,9 @@ internal partial class TaskEditViewModel : ModuleViewModel
     [ObservableProperty]
     private EmployeeModel _employees;
 
+    [ObservableProperty]
+    private KanbanDocumentModel _documents;
+
     [ObservableProperty]
     private int _selectedTab;
 
@@ -69,6 +72,14 @@ internal partial class TaskEditViewModel : ModuleViewModel
             () => new Filter<KanbanType>().All(),
             () => DefaultCacheFileName<KanbanTypeShell>());
         Employees = Repositories.Employees();
+        Documents = new KanbanDocumentModel(DataAccess,
+            () => new Filter<KanbanDocument>(x => x.EntityLink.ID).IsEqualTo(Shell?.ID ?? CoreUtils.FullGuid),
+            () => DefaultCacheFileName<KanbanDocumentShell>(Shell?.ID));
+    }
+
+    public override bool OnBackButtonPressed()
+    {
+        return ConfirmChanges(Shell);
     }
 
     partial void OnSelectedTabChanged(int value)
@@ -114,7 +125,9 @@ internal partial class TaskEditViewModel : ModuleViewModel
 
     private async Task<bool> Save()
     {
-        await MessageDialog.ShowMessage("Unimplemented");
+        Shell.Save("Saved on Mobile Device");
+        await Documents.RefreshAsync(false);
+        Changed();
         return true;
     }
 

+ 1 - 1
PRS.Avalonia/PRS.Avalonia/Repositories/KanbanDocument/KanbanDocumentModel.cs

@@ -7,7 +7,7 @@ namespace PRS.Avalonia;
 
 public class KanbanDocumentModel : CoreRepository<KanbanDocumentModel, KanbanDocumentShell, KanbanDocument>
 {
-    public KanbanDocumentModel(IModelHost host, Func<Filter<KanbanDocument>> filter) : base(host, filter)
+    public KanbanDocumentModel(IModelHost host, Func<Filter<KanbanDocument>> filter, Func<string>? filename = null) : base(host, filter, filename)
     {
     }
 }

+ 55 - 0
PRS.Avalonia/PRS.Avalonia/ViewModelBase.cs

@@ -4,12 +4,15 @@ using System.Diagnostics.CodeAnalysis;
 using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
+using Avalonia.Threading;
+
 // using Avalonia.Svg.Skia;
 using CommunityToolkit.Mvvm.ComponentModel;
 using CommunityToolkit.Mvvm.Input;
 using DialogHostAvalonia;
 using InABox.Avalonia;
 using InABox.Avalonia.Components;
+using InABox.Avalonia.Dialogs;
 using InABox.Configuration;
 
 namespace PRS.Avalonia;
@@ -124,6 +127,58 @@ public abstract partial class ViewModelBase : ObservableValidator, IViewModelBas
     {
         return true;
     }
+
+    private enum ConfirmChangesResult
+    {
+        Cancel,
+        Save,
+        KeepEditing
+    }
+    protected bool ConfirmChanges(IShell item)
+    {
+        if (item.IsChanged())
+        {
+            var result = ConfirmChangesResult.Cancel;
+            new MessageDialogViewModel()
+                .Message("Confirm Cancel?")
+                .AddButton(new("Yes, Cancel", (window, button) =>
+                {
+                    result = ConfirmChangesResult.Cancel;
+                    window.Close(MessageDialogResult.None);
+                }, MessageDialogButtonPosition.Right))
+                .AddButton(new("Keep Editing", (window, button) =>
+                {
+                    result = ConfirmChangesResult.KeepEditing;
+                    window.Close(MessageDialogResult.None);
+                }, MessageDialogButtonPosition.Right))
+                .AddButton(new("Save Changes", (window, button) =>
+                {
+                    result = ConfirmChangesResult.Save;
+                    window.Close(MessageDialogResult.None);
+                }, MessageDialogButtonPosition.Right))
+                .Display()
+                .ContinueWith(task =>
+                {
+                    switch (result)
+                    {
+                        case ConfirmChangesResult.Cancel:
+                            item.Cancel();
+                            break;
+                        case ConfirmChangesResult.Save:
+                            item.Save("Saved on Mobile Device");
+                            break;
+                        case ConfirmChangesResult.KeepEditing:
+                            return;
+                    }
+                    Navigation.Back();
+                });
+            return false;
+        }
+        else
+        {
+            return true;
+        }
+    }
     
     public async Task Activate()
     {