Przeglądaj źródła

Added adjustability for calendar appointments

Kenric Nugteren 2 tygodni temu
rodzic
commit
86f90ebf84

+ 49 - 10
prs.desktop/Components/Calendar/Appointments/AssignmentAppointment.cs

@@ -18,21 +18,60 @@ namespace PRSDesktop
     {
         public CalendarAssignmentType AssignmentType { get; }
 
-        public override TimeSpan StartTime => AssignmentType switch
+        public override TimeSpan StartTime
         {
-            CalendarAssignmentType.Booked => Model.Booked.Start,
-            CalendarAssignmentType.Actual => Model.Actual.Start,
-            _ => Model.EffectiveStartTime()
-        };
+            get => AssignmentType switch
+            {
+                CalendarAssignmentType.Booked => Model.Booked.Start,
+                CalendarAssignmentType.Actual => Model.Actual.Start,
+                _ => Model.EffectiveStartTime()
+            };
+            set
+            {
+                switch (AssignmentType)
+                {
+                    case CalendarAssignmentType.Automatic:
+                    case CalendarAssignmentType.Actual:
+                        Model.Actual.Start = value;
+                        break;
+                    case CalendarAssignmentType.Booked:
+                        Model.Booked.Start = value;
+                        break;
+                }
+                OnUpdate?.Invoke();
+            }
+        }
+            
 
-        public override TimeSpan EndTime => AssignmentType switch
+        public override TimeSpan EndTime
         {
-            CalendarAssignmentType.Booked => Model.Booked.Finish,
-            CalendarAssignmentType.Actual => Model.Actual.Finish,
-            _ => Model.EffectiveFinishTime()
-        };
+            get => AssignmentType switch
+            {
+                CalendarAssignmentType.Booked => Model.Booked.Finish,
+                CalendarAssignmentType.Actual => Model.Actual.Finish,
+                _ => Model.EffectiveFinishTime()
+            };
+            set
+            {
+                switch (AssignmentType)
+                {
+                    case CalendarAssignmentType.Automatic:
+                    case CalendarAssignmentType.Actual:
+                        Model.Actual.Finish = value;
+                        break;
+                    case CalendarAssignmentType.Booked:
+                        Model.Booked.Finish = value;
+                        break;
+                }
+                OnUpdate?.Invoke();
+            }
+        }
+
+        public override bool CanAdjust => true;
 
         public override DateTime Date => Model.Date;
+
+        public event Action? OnUpdate;
         
         public AssignmentAppointment(Assignment model, Employee employee, CalendarAssignmentType type)
             : base(model, employee, x => x.ActivityLink.Color)

+ 27 - 3
prs.desktop/Components/Calendar/Appointments/CalendarAppointment.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.ObjectModel;
 using System.ComponentModel;
+using System.Diagnostics.CodeAnalysis;
 using System.Runtime.CompilerServices;
 using System.Windows.Media;
 using System.Windows.Media.Imaging;
@@ -17,6 +18,7 @@ namespace PRSDesktop
         // object Id { get; }
 
         Brush Background { get; }
+        Brush BorderBrush { get; }
         Brush Foreground { get; }
 
         string? Subject { get; }
@@ -33,6 +35,8 @@ namespace PRSDesktop
         TimeSpan StartTime { get; }
         TimeSpan EndTime { get; }
         DateTime Date { get; }
+
+        bool CanAdjust { get; }
     }
     
     public interface ICalendarAppointment<T> : ICalendarAppointment where T : notnull
@@ -65,12 +69,31 @@ namespace PRSDesktop
         
         public T Model { get; }
 
-        public Brush Background { get; private set; }
+        private Brush _background;
+        public Brush Background
+        {
+            get => _background;
+            [MemberNotNull(nameof(_background), nameof(BorderBrush))]
+            private set
+            {
+                _background = value;
+                if(value is SolidColorBrush brush)
+                {
+                    BorderBrush = brush.Color.AdjustBrightness(-0.5f).ToBrush();
+                }
+                else
+                {
+                    BorderBrush = Colors.Black.ToBrush();
+                }
+            }
+        }
+        public Brush BorderBrush { get; private set; }
         public Brush Foreground { get; private set; }
 
-        public abstract TimeSpan StartTime { get; }
-        public abstract TimeSpan EndTime { get; }
+        public abstract TimeSpan StartTime { get; set; }
+        public abstract TimeSpan EndTime { get; set; }
         public abstract DateTime Date { get; }
+        public abstract bool CanAdjust { get; }
 
         private Func<T, string?> Colour;
 
@@ -83,6 +106,7 @@ namespace PRSDesktop
             UpdateColour();
         }
 
+        [MemberNotNull(nameof(_background), nameof(Foreground), nameof(BorderBrush))]
         protected void UpdateColour()
         {
             var c = Colour(Model);

+ 18 - 2
prs.desktop/Components/Calendar/Appointments/LeaveRequestAppointment.cs

@@ -10,10 +10,26 @@ namespace PRSDesktop
     {
         public RosterBlock Block { get; }
 
-        public override TimeSpan StartTime => Block.Start;
-        public override TimeSpan EndTime => Block.Finish;
+        public override TimeSpan StartTime
+        {
+            get => Block.Start;
+            set
+            {
+
+            }
+        }
+        public override TimeSpan EndTime
+        {
+            get => Block.Finish;
+            set
+            {
+
+            }
+        }
 
         public override DateTime Date => Block.Date;
+
+        public override bool CanAdjust => false;
         
         public LeaveRequestAppointment(LeaveRequest model, Employee employee, RosterBlock block) : base(model, employee, x => x.LeaveType.Color)
         {

+ 18 - 2
prs.desktop/Components/Calendar/Appointments/StandardLeaveAppointment.cs

@@ -8,11 +8,27 @@ namespace PRSDesktop
     {
         public RosterBlock Block { get; }
 
-        public override TimeSpan StartTime => Block.Start;
-        public override TimeSpan EndTime => Block.Finish;
+        public override TimeSpan StartTime
+        {
+            get => Block.Start;
+            set
+            {
+
+            }
+        }
+        public override TimeSpan EndTime
+        {
+            get => Block.Finish;
+            set
+            {
+
+            }
+        }
 
         public override DateTime Date => Block.Date;
 
+        public override bool CanAdjust => false;
+
         public StandardLeaveAppointment(StandardLeave leave, Employee employee, RosterBlock block)
             : base(leave, employee, x => x.LeaveType.Color)
         {

+ 16 - 9
prs.desktop/Components/Calendar/Appointments/TimeSheetAppointment.cs

@@ -10,17 +10,24 @@ namespace PRSDesktop
 {
     public class TimeSheetAppointment : CalendarAppointment<TimeSheet>
     {
-
-        // public override DateTime StartTime { get; set; }
-        // public override DateTime EndTime { get; set; }
-        // public override string? Notes { get; set; }
-        public BitmapImage? Image { get; set; }
-        // public override string? Subject { get; set; }
-
-        public override TimeSpan StartTime => Model.Approved.IsEmpty() ? Model.Start : Model.ApprovedStart;
-        public override TimeSpan EndTime => Model.Approved.IsEmpty() ? Model.Finish : Model.ApprovedFinish;
+        public override TimeSpan StartTime
+        {
+            get => Model.Approved.IsEmpty() ? Model.Start : Model.ApprovedStart;
+            set
+            {
+            }
+        }
+        public override TimeSpan EndTime
+        {
+            get => Model.Approved.IsEmpty() ? Model.Finish : Model.ApprovedFinish;
+            set
+            {
+            }
+        }
 
         public override DateTime Date => Model.Date;
+
+        public override bool CanAdjust => false;
         
         public TimeSheetAppointment(TimeSheet model, Employee employee, Func<TimeSheetModel, String> color) : base(model, employee, x => x.ActivityLink.Color)
         {

+ 3 - 2
prs.desktop/Components/Calendar/Calendar.xaml

@@ -88,8 +88,9 @@
                                          ColumnWidthMode="ConstantColumns"
                                          ColumnMapping="{Binding Employee}"
                                          DateMapping="{Binding Date}"
-                                         StartTimeMapping="{Binding StartTime}"
-                                         EndTimeMapping="{Binding EndTime}">
+                                         StartTimeMapping="{Binding StartTime, Mode=TwoWay}"
+                                         EndTimeMapping="{Binding EndTime, Mode=TwoWay}"
+                                         CanAdjustMapping="{Binding CanAdjust}">
                         <wpf:CalendarControl.DateTemplate>
                             <DataTemplate DataType="system:DateTime">
                                 <StackPanel Background="WhiteSmoke"

+ 1 - 0
prs.desktop/Components/Calendar/Calendar.xaml.cs

@@ -6,6 +6,7 @@ using System.Diagnostics.CodeAnalysis;
 using System.Linq;
 using System.Windows;
 using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
 using System.Windows.Data;
 using System.Windows.Media;
 using System.Windows.Threading;