瀏覽代碼

Avalonia: Changes to Repository layer, making it static and made a "Me" field as a wrapper of the model.

Kenric Nugteren 4 月之前
父節點
當前提交
0a4e5e9edb

+ 3 - 0
PRS.Avalonia/PRS.Avalonia/App.axaml.cs

@@ -5,6 +5,7 @@ using Avalonia.Controls.ApplicationLifetimes;
 using Avalonia.Data.Core.Plugins;
 using Avalonia.Markup.Xaml;
 using Comal.Classes;
+using InABox.Avalonia;
 using InABox.Core;
 using PRS.Avalonia.Modules;
 
@@ -12,6 +13,8 @@ namespace PRS.Avalonia;
 
 public class App : Application
 {
+    public static GPSLocation? GPS => null;
+
     public override void Initialize()
     {
         CoreUtils.RegisterClasses();

+ 8 - 8
PRS.Avalonia/PRS.Avalonia/HomePage/HomePageView.axaml

@@ -68,14 +68,14 @@
             Content="Select Task"
             IsVisible="{Binding ClockOnVisible}" />
 
-        <moduleGrid:AvaloniaModuleGrid
-            Grid.Row="3"
-            Grid.Column="0"
-            Grid.ColumnSpan="2"
-            Margin="0"
-            Padding="0"
-            BorderThickness="0"
-            Modules="{Binding Modules}" />
+		<ScrollViewer Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2"
+					  Margin="0" Padding="0">
+			<moduleGrid:AvaloniaModuleGrid
+				Margin="0"
+				Padding="0"
+				BorderThickness="0"
+				Modules="{Binding Modules}" />
+		</ScrollViewer>
 
     </Grid>
 </UserControl>

+ 1 - 1
PRS.Avalonia/PRS.Avalonia/MainViewModel.cs

@@ -27,7 +27,7 @@ public partial class MainViewModel : ViewModelBase
             Content = viewModel;
             Title = viewModel is ModuleViewModel module
                 ? module.Title
-                : Repositories.Me.FirstOrDefault()?.Name ?? "PRS Avalonia";
+                : Repositories.Me?.Name ?? "PRS Avalonia";
             PrimaryMenu = viewModel.PrimaryMenu;
             SecondaryMenu = viewModel.SecondaryMenu;
             BackButtonVisible = viewModel.BackButtonVisible;

+ 1 - 1
PRS.Avalonia/PRS.Avalonia/Modules/DeliveryModule/DeliveryList/DeliveryListViewModel.cs

@@ -25,7 +25,7 @@ public partial class DeliveryListViewModel : ModuleViewModel
         Deliveries = new DeliveryModel(
             DataAccess, 
             () => new Filter<Delivery>().All(),
-            () => Repositories.DefaultCacheFileName<DeliveryShell>()
+            () => DefaultCacheFileName<DeliveryShell>()
         );
     }
     

+ 1 - 1
PRS.Avalonia/PRS.Avalonia/Modules/EquipmentModule/DigitalKeys/DigitalKeyListViewModel.cs

@@ -59,7 +59,7 @@ public partial class DigitalKeyListViewModel : ModuleViewModel
         Equipment = new EquipmentModel(
             DataAccess,
             () => new Filter<Equipment>().All(),
-            () => Repositories.DefaultCacheFileName<EquipmentShell>()
+            () => DefaultCacheFileName<EquipmentShell>()
         );
         
         PrimaryMenu.Add(new AvaloniaMenuItem(Images.refresh,DoRefresh));

+ 1 - 1
PRS.Avalonia/PRS.Avalonia/Modules/EquipmentModule/EquipmentList/EquipmentListViewModel.cs

@@ -48,7 +48,7 @@ public partial class EquipmentListViewModel : ModuleViewModel
         Equipment = new EquipmentModel(
             DataAccess, 
             () => new Filter<Equipment>().All(),
-            () => Repositories.DefaultCacheFileName<EquipmentShell>()
+            () => DefaultCacheFileName<EquipmentShell>()
         );
         
     }

+ 2 - 2
PRS.Avalonia/PRS.Avalonia/Modules/MyHR/MyHRDetails/MyHRDetailsViewModel.cs

@@ -20,8 +20,8 @@ public partial class MyHRDetailsViewModel : ModuleViewModel
 
     protected override async Task<TimeSpan> OnRefresh()
     {
-        await Repositories.Me.RefreshAsync(true);
-        Me = Repositories.Me.Items.FirstOrDefault();
+        await Repositories.MeModel.RefreshAsync(true);
+        Me = Repositories.MeModel.Items.FirstOrDefault();
         return TimeSpan.Zero;
     }
 }

+ 1 - 1
PRS.Avalonia/PRS.Avalonia/Modules/Site/SiteDocuments/SiteDocument/SiteDocumentViewModel.cs

@@ -24,7 +24,7 @@ public partial class SiteDocumentViewModel : ModuleViewModel
     {
         _document = new DocumentModel(DataAccess,
             () => new Filter<Document>(x => x.ID).IsEqualTo(Shell?.ID ?? Guid.Empty),
-            () => Repositories.DefaultCacheFileName<DocumentShell>(Shell?.ID ?? Guid.Empty)
+            () => DefaultCacheFileName<DocumentShell>(Shell?.ID ?? Guid.Empty)
         );
     }
 

+ 1 - 1
PRS.Avalonia/PRS.Avalonia/Modules/Site/SiteDocuments/SiteDocumentsViewModel.cs

@@ -21,7 +21,7 @@ public partial class SiteDocumentsViewModel : SiteModuleViewModel
     {
         JobDocuments = new JobDocumentModel(DataAccess,
             () => new Filter<JobDocumentSetMileStoneFile>(x=>x.EntityLink.DocumentSet.Job.ID).IsEqualTo(JobShell?.ID ?? Guid.Empty),
-            () => Repositories.DefaultCacheFileName<JobDocumentShell>(JobShell?.ID ?? Guid.Empty)
+            () => DefaultCacheFileName<JobDocumentShell>(JobShell?.ID ?? Guid.Empty)
         );
     }
 

+ 24 - 4
PRS.Avalonia/PRS.Avalonia/RepositoryLayer.cs

@@ -12,7 +12,7 @@ public partial class RepositoryLayer : ObservableObject
 {
     [ObservableProperty] private IModelHost _data;
 
-    public string DefaultCacheFileName<T>(Guid? id = null) where T : IShell
+    private string DefaultCacheFileName<T>(Guid? id = null) where T : IShell
     {
         return id == null 
             ? typeof(T).Name.ToLower()
@@ -24,7 +24,7 @@ public partial class RepositoryLayer : ObservableObject
     {
         Data = data;
 
-        Me = new EmployeeModel(Data,
+        MeModel = new EmployeeModel(Data,
             () => new Filter<Employee>(x => x.UserLink.ID).IsEqualTo(ClientFactory.UserGuid));
 
         MyAlerts = new EmployeeAlertModel(Data,
@@ -38,12 +38,21 @@ public partial class RepositoryLayer : ObservableObject
             () => new Filter<EmployeeQualification>(x => x.Employee.UserLink.ID).IsEqualTo(ClientFactory.UserGuid));
         
         Jobs = new JobModel(Data,
-            () => new Filter<Job>().All(),
+            () => JobFilter(),
             () => DefaultCacheFileName<JobShell>()        
         );
     }
 
-    public EmployeeModel Me { get; private set; }
+    public EmployeeModel MeModel { get; private set; }
+
+    public EmployeeShell? Me
+    {
+        get
+        {
+            MeModel.Refresh(false);
+            return MeModel.FirstOrDefault();
+        }
+    }
 
     public EmployeeAlertModel MyAlerts { get; private set; }
 
@@ -53,4 +62,15 @@ public partial class RepositoryLayer : ObservableObject
     
     public JobModel Jobs { get; private set; }
     
+    public Filter<Job> JobFilter()
+    {
+        return Security.IsAllowed<CanViewAllJobs>()
+            ? new Filter<Job>(X => X.Completed).IsEqualTo(DateTime.MinValue)
+                .And(x => x.JobStatus.Active).IsEqualTo(true)
+            : new Filter<Job>(X => X.Completed).IsEqualTo(DateTime.MinValue)
+                .And(x => x.JobStatus.Active).IsEqualTo(true)
+                .And(x => x.ID).InQuery(
+                    new Filter<JobEmployee>(x => x.EmployeeLink.ID).IsEqualTo(Me.ID),
+                    x => x.JobLink.ID);
+    }
 }

+ 16 - 7
PRS.Avalonia/PRS.Avalonia/ViewModelBase.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
 using System.Linq;
 using System.Reflection;
 using System.Threading;
@@ -36,7 +37,7 @@ public abstract partial class ViewModelBase : ObservableObject, IViewModelBase
 
     [ObservableProperty] private AvaloniaMenuItemCollection _secondaryMenu = new();
 
-    public DataAccessLayer DataAccess
+    public static DataAccessLayer DataAccess
     {
         get
         {
@@ -52,7 +53,7 @@ public abstract partial class ViewModelBase : ObservableObject, IViewModelBase
         }
     }
 
-    public RepositoryLayer Repositories
+    public static RepositoryLayer Repositories
     {
         get
         {
@@ -92,19 +93,26 @@ public abstract partial class ViewModelBase : ObservableObject, IViewModelBase
         || string.IsNullOrWhiteSpace(CurrentDatabase.Password);
 
 
-    private void Connected()
+    private static void Connected()
     {
     }
 
     private void Validated()
     {
-        Repositories.Me.Refresh(true);
+        Repositories.MeModel.Refresh(true);
     }
 
-    private void Disconnected()
+    private static void Disconnected()
     {
     }
 
+    public string DefaultCacheFileName<T>(Guid? id = null) where T : IShell
+    {
+        return id == null 
+            ? $"{GetType().Name}.{typeof(T).Name}"
+            : $"{GetType().Name}.{typeof(T).Name}.{id}";
+    }
+
 
     [RelayCommand]
     private void BackButtonPressed()
@@ -151,9 +159,9 @@ public abstract partial class ViewModelBase : ObservableObject, IViewModelBase
         return await OnRefresh();
     }
 
-    protected virtual async Task<TimeSpan> OnRefresh()
+    protected virtual Task<TimeSpan> OnRefresh()
     {
-        return TimeSpan.FromSeconds(30);
+        return Task.FromResult(TimeSpan.FromSeconds(30));
     }
 
     public async Task Deactivate()
@@ -182,6 +190,7 @@ public abstract partial class ViewModelBase : ObservableObject, IViewModelBase
         config.SaveAll(DatabaseSettings);
     }
 
+    [MemberNotNull(nameof(_databaseSettings))]
     public static void LoadDatabaseSettings()
     {