Selaa lähdekoodia

Fixed Clock Off / Timesheet notes bug
Added extra fields to TimeSheetShell
Added support for centralised QueueUpdater system

Frank van den Bos 9 kuukautta sitten
vanhempi
commit
6a491e016d

+ 1 - 1
prs.mobile.new/PRS.Mobile.Droid/Properties/AndroidManifest.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="816000" android:versionName="8.16.0" package="comal.timesheets.Android">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="818000" android:versionName="8.18.0" package="comal.timesheets.Android">
 	<uses-sdk android:minSdkVersion="28" android:targetSdkVersion="34" />
 	<queries>
 		<intent>

+ 1 - 1
prs.mobile.new/PRS.Mobile.iOS/Info.plist

@@ -27,7 +27,7 @@
 	<key>CFBundleIdentifier</key>
 	<string>com.prsdigital.prssiteapp</string>
 	<key>CFBundleVersion</key>
-	<string>8.16.0</string>
+	<string>8.18.0</string>
 	<key>UILaunchStoryboardName</key>
 	<string>LaunchScreen</string>
 	<key>CFBundleName</key>

+ 27 - 0
prs.mobile.new/PRS.Mobile.sln

@@ -33,6 +33,8 @@ Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "InABox.Mobile.iOS", "..\..\
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PdfiumAndroid", "..\..\3rdpartylibs\pdfium-android\PdfiumAndroid\PdfiumAndroid\PdfiumAndroid.csproj", "{63845795-416F-4848-9DC1-63E992803D29}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InABox.Logikal", "..\..\inabox\InABox.Logikal\InABox.Logikal.csproj", "{E8503DB8-C9DD-47F6-88DC-6300575846BE}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
@@ -301,6 +303,30 @@ Global
 		{63845795-416F-4848-9DC1-63E992803D29}.Release|iPhone.Build.0 = Release|Any CPU
 		{63845795-416F-4848-9DC1-63E992803D29}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
 		{63845795-416F-4848-9DC1-63E992803D29}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.AppStore|iPhone.Build.0 = Debug|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.Debug|iPhone.Build.0 = Debug|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.Release|iPhone.ActiveCfg = Release|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.Release|iPhone.Build.0 = Release|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -318,6 +344,7 @@ Global
 		{DF11E3A5-F670-4B09-AD37-01D9ED5ED3BA} = {0FAD249B-2C90-4ABC-B14D-8D1C44D071C2}
 		{DAA14944-1DA1-4E7A-B9D2-A6545EBBF2FF} = {0FAD249B-2C90-4ABC-B14D-8D1C44D071C2}
 		{63845795-416F-4848-9DC1-63E992803D29} = {D70FB71D-5C9D-44FC-AF66-3B9A23AD7FFD}
+		{E8503DB8-C9DD-47F6-88DC-6300575846BE} = {0FAD249B-2C90-4ABC-B14D-8D1C44D071C2}
 	EndGlobalSection
 	GlobalSection(SharedMSBuildProjectFiles) = preSolution
 		..\..\inabox\InABox.Mobile\InABox.Mobile.iOS\InABox.Mobile.iOS.projitems*{2869560f-3142-4c75-8028-95f7c613d61b}*SharedItemsImports = 4

+ 117 - 8
prs.mobile.new/PRS.Mobile/Data Models/Lists/TimeSheet/TimeSheetShell.cs

@@ -23,16 +23,54 @@ namespace PRS.Mobile
                 .Map(nameof(_actualfinish), x => x.Finish)
                 .Map(nameof(_approvedstart), x => x.ApprovedStart)
                 .Map(nameof(_approvedfinish), x => x.ApprovedFinish)
-                .Map(nameof(_approved), x => x.Approved);
+                .Map(nameof(_approved), x => x.Approved)
+                .Map(nameof(StartLongitude), x => x.StartLocation.Longitude)
+                .Map(nameof(StartLatitude), x => x.StartLocation.Latitude)
+                .Map(nameof(StartAddress), x => x.StartLocation.Address)
+                .Map(nameof(StartTimeStamp), x => x.StartLocation.Timestamp)
+                .Map(nameof(FinishLongitude), x => x.FinishLocation.Longitude)
+                .Map(nameof(FinishLatitude), x => x.FinishLocation.Latitude)
+                .Map(nameof(FinishAddress), x => x.FinishLocation.Address)
+                .Map(nameof(FinishTimeStamp), x => x.FinishLocation.Timestamp)
+                .Map(nameof(JobID), x => x.JobLink.ID)
+                .Map(nameof(JobNumber), x => x.JobLink.JobNumber)
+                .Map(nameof(JobName), x => x.JobLink.Name)
+                .Map(nameof(Notes), x => x.Notes);
         }
 
-        public DateTime Date => Get<DateTime>();
+        public DateTime Date
+        {
+            get => Get<DateTime>();
+            set => Set(value);
+        }
+
+        private TimeSpan _actualstart
+        {
+            get => Get<TimeSpan>();
+            set => Set(value);
+        }
+        
+        private TimeSpan _actualfinish
+        {
+            get => Get<TimeSpan>();
+            set => Set(value);
+        }
         
-        private TimeSpan _actualstart => Get<TimeSpan>();
-        private TimeSpan _actualfinish => Get<TimeSpan>();
-        private TimeSpan _approvedstart => Get<TimeSpan>();
-        private TimeSpan _approvedfinish => Get<TimeSpan>();
-        private DateTime _approved => Get<DateTime>();
+        private TimeSpan _approvedstart
+        {
+            get => Get<TimeSpan>();
+            set => Set(value);
+        }
+        private TimeSpan _approvedfinish
+        {
+            get => Get<TimeSpan>();
+            set => Set(value);
+        }
+        private DateTime _approved
+        {
+            get => Get<DateTime>();
+            set => Set(value);
+        }
 
         public TimeSpan Start => _approved.IsEmpty()
             ? _actualstart
@@ -42,9 +80,80 @@ namespace PRS.Mobile
             ? _actualfinish
             : _approvedfinish;
         
-        public ImageSource Approved => _approved.IsEmpty()
+        public ImageSource? Approved => _approved.IsEmpty()
             ? null
             : ImageSource.FromFile("tick");
+        
+         public double StartLongitude
+         {
+             get => Get<double>();
+             set => Set(value);
+         }
+         
+         public double StartLatitude
+         {
+             get => Get<double>();
+             set => Set(value);
+         }
+         
+         public string StartAddress
+         {
+             get => Get<string>();
+             set => Set(value);
+         }
+         
+         public DateTime StartTimeStamp
+         {
+             get => Get<DateTime>();
+             set => Set(value);
+         }
+         
+         public double FinishLongitude
+         {
+             get => Get<double>();
+             set => Set(value);
+         }
+         
+         public double FinishLatitude
+         {
+             get => Get<double>();
+             set => Set(value);
+         }
+         
+         public string FinishAddress
+         {
+             get => Get<string>();
+             set => Set(value);
+         }
+         
+         public DateTime FinishTimeStamp
+         {
+             get => Get<DateTime>();
+             set => Set(value);
+         }
+         
+         public Guid JobID
+         {
+             get => Get<Guid>();
+             set => Set(value);
+         }
+         public string JobNumber
+         {
+             get => Get<string>();
+             set => Set(value);
+         }
+         
+         public string JobName
+         {
+             get => Get<string>();
+             set => Set(value);
+         }
+         
+         public string Notes
+         {
+             get => Get<string>();
+             set => Set(value);
+         }
 
     }
 }

+ 52 - 1
prs.mobile.new/PRS.Mobile/Main/DataModel.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading;
 using System.Threading.Tasks;
 using Comal.Classes;
 using InABox.Clients;
@@ -234,7 +235,7 @@ namespace PRS.Mobile
 
         public void Reset()
         {
-
+            
             _me = null;
             
             CurrentEmployee = new EmployeeDetailModel(this,
@@ -430,6 +431,8 @@ namespace PRS.Mobile
                 })
             );
             DigitalFormDocumentFactory.Run();
+            
+            StartUpdateQueue();
         }
         
 
@@ -484,6 +487,54 @@ namespace PRS.Mobile
             TransportConnected?.Invoke(new TransportConnectedEventArgs());
         }
         
+        #region QueueUpdaterSupport
+        
+        private CancellationTokenSource? _cancelQueueUpdate;
+        private List<IQueueUpdater> _updateQueues = new();
+        
+        private void StartUpdateQueue()
+        {
+            StopUpdateQueue();
+            _cancelQueueUpdate = new CancellationTokenSource();
+            Task.Run(
+                () =>
+                {
+                    while (_cancelQueueUpdate?.IsCancellationRequested != true)
+                    {
+                        foreach (var queue in _updateQueues.ToArray())
+                            queue.ProcessQueue();
+                        Thread.Sleep(100);
+                    }
+                },
+                _cancelQueueUpdate.Token
+            );
+        }
+
+        private void StopUpdateQueue()
+        {
+            if (_cancelQueueUpdate != null)
+            {
+                _cancelQueueUpdate.Cancel();
+                _cancelQueueUpdate.Dispose();
+                _cancelQueueUpdate = null;
+            }
+        }
+        
+        public void AddUpdateQueue<TEntity>(QueueUpdater<TEntity> queue)
+            where TEntity : Entity, IPersistent, IRemotable, new()
+        {
+            _updateQueues.Add(queue);
+        }
+
+        public void RemoveUpdateQueue<TEntity>(QueueUpdater<TEntity> queue)
+            where TEntity : Entity, IPersistent, IRemotable, new()
+        {
+            _updateQueues.Remove(queue);
+        }
+        
+        #endregion
+        
+        
         private Location _lastgpslocation = new Location();
 
         private GPSTrackerLocation GetGPSTrackerUpdate(string deviceid, Location location,

+ 1 - 0
prs.mobile.new/PRS.Mobile/MainPage.xaml.cs

@@ -462,6 +462,7 @@ namespace PRS.Mobile
                 var table = client.Query(
                     filter, 
                     Columns.None<TimeSheet>()
+                        .Add(x=>x.ID)
                         .Add(x=>x.Date)
                         .Add(x=>x.Start)
                         .Add(x=>x.StartLocation.Longitude)