Преглед на файлове

avalonia: Started work on FormsList

Kenric Nugteren преди 3 месеца
родител
ревизия
976111f006

+ 71 - 7
PRS.Avalonia/PRS.Avalonia/Components/FormsList/FormsList.axaml

@@ -3,14 +3,21 @@
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
              xmlns:listView="clr-namespace:PRS.Avalonia.Components.ListView"
+             xmlns:prs="using:PRS.Avalonia"
              xmlns:local="using:PRS.Avalonia.Components"
 			 xmlns:components="using:InABox.Avalonia.Components"
+			 xmlns:converters="using:InABox.Avalonia.Converters"
              mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
              x:Class="PRS.Avalonia.Components.FormsList"
 			 x:DataType="local:FormsList">
+	<UserControl.Resources>
+		<local:FormsListBackgroundColorConverter x:Key="BackgroundColorConverter"/>
+		<local:FormsListForegroundColorConverter x:Key="ForegroundColorConverter"/>
+		<local:ExistingFormStatusConverter x:Key="StatusConverter"/>
+		<converters:ShellSelectedConverter x:Key="ShellSelectedConverter"/>
+	</UserControl.Resources>
 	<Grid>
 		<Grid.RowDefinitions>
-			<RowDefinition Height="Auto"/>
 			<RowDefinition Height="*"/>
 			<RowDefinition Height="Auto"/>
 		</Grid.RowDefinitions>
@@ -18,11 +25,68 @@
 			<ColumnDefinition Width="*"/>
 			<ColumnDefinition Width="Auto"/>
 		</Grid.ColumnDefinitions>
-		
-		<components:SearchBar Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"
-							  Text="{Binding SearchText}"
-							  Command="{Binding SearchCommand}"/>
-		
-		<listView:PrsListView Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2"/>
+
+		<listView:PrsListView Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"
+							  Repository="{Binding $parent[local:FormsList].Model}">
+			<listView:PrsListView.ItemTemplate>
+				<DataTemplate DataType="prs:IDigitalFormInstanceShell">
+					<Button Background="{Binding .,Converter={StaticResource BackgroundColorConverter}}"
+							Command="{Binding $parent[local:FormsList].FormClickedCommand}"
+							CommandParameter="{Binding .}"
+							Height="50"
+							Padding="0"
+							HorizontalContentAlignment="Stretch">
+						<Grid>
+							<Grid.RowDefinitions>
+								<RowDefinition Height="*"/>
+								<RowDefinition Height="*"/>
+							</Grid.RowDefinitions>
+							<Grid.ColumnDefinitions>
+								<ColumnDefinition Width="Auto"/>
+								<ColumnDefinition Width="Auto"/>
+								<ColumnDefinition Width="*"/>
+								<ColumnDefinition Width="Auto"/>
+								<ColumnDefinition Width="Auto"/>
+							</Grid.ColumnDefinitions>
+							
+							<CheckBox Grid.Row="0" Grid.Column="0"
+									  Height="15"
+									  Classes="small"
+									  IsChecked="{Binding .,Converter={StaticResource ShellSelectedConverter}}"/>
+							<Label Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="3"
+								   Content="{Binding FormDescription}"
+								   FontSize="{StaticResource PrsFontSizeSmall}"
+								   FontWeight="{StaticResource PrsFontWeightBold}"
+								   VerticalAlignment="Stretch"
+								   VerticalContentAlignment="Center"
+								   Foreground="{Binding .,Converter={StaticResource ForegroundColorConverter}}"/>
+							<Label Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3"
+								   Content="{Binding .,Converter={StaticResource StatusConverter}}"
+								   FontSize="{StaticResource PrsFontSizeExtraSmall}"
+								   VerticalAlignment="Stretch"
+								   VerticalContentAlignment="Center"
+								   Foreground="{Binding .,Converter={StaticResource ForegroundColorConverter}}"/>
+							<Label Grid.Row="1" Grid.Column="3"
+								   Content="{Binding Number}"
+								   FontSize="{StaticResource PrsFontSizeExtraSmall}"
+								   VerticalAlignment="Stretch"
+								   VerticalContentAlignment="Center"
+								   Foreground="{Binding .,Converter={StaticResource ForegroundColorConverter}}"/>
+							<Image Grid.Row="0" Grid.Column="4" Grid.RowSpan="2"
+								   Source="{SvgImage /Images/digitalform.svg}"/>
+						</Grid>
+					</Button>
+				</DataTemplate>
+			</listView:PrsListView.ItemTemplate>
+		</listView:PrsListView>
+		<TabStrip Grid.Row="1" Grid.Column="0"
+				  IsVisible="{Binding $parent[local:FormsList].SeparateHistory}">
+			<TabStripItem Content="Open Forms"/>
+			<TabStripItem Content="History"/>
+		</TabStrip>
+		<Button Grid.Row="1" Grid.Column="1"
+				Background="Silver"
+				IsVisible="False"
+				Command="{Binding $parent[local:FormsList].SelectionMenuCommand}"/>
 	</Grid>
 </UserControl>

+ 110 - 0
PRS.Avalonia/PRS.Avalonia/Components/FormsList/FormsList.axaml.cs

@@ -1,14 +1,86 @@
 using Avalonia;
 using Avalonia.Controls;
+using Avalonia.Data.Converters;
 using Avalonia.Markup.Xaml;
+using Avalonia.Media;
 using CommunityToolkit.Mvvm.Input;
+using InABox.Avalonia;
+using InABox.Avalonia.Components;
+using InABox.Avalonia.Converters;
+using InABox.Core;
+using System;
+using System.Globalization;
+using System.Threading.Tasks;
+using System.Windows.Input;
 
 namespace PRS.Avalonia.Components;
 
+public class FormsListBackgroundColorConverter : AbstractConverter<IDigitalFormInstanceShell, IBrush>
+{
+    protected override IBrush? Convert(IDigitalFormInstanceShell? value, object? parameter = null)
+    {
+        if(value is null) return new SolidColorBrush(Colors.Transparent);
+
+        return new SolidColorBrush(!value.Completed.IsEmpty()
+            ? Colors.DimGray
+            : !value.Started.IsEmpty()
+                ? Colors.LightGreen
+                : Colors.Coral);
+    }
+}
+
+public class FormsListForegroundColorConverter : AbstractConverter<IDigitalFormInstanceShell, IBrush>
+{
+    protected override IBrush? Convert(IDigitalFormInstanceShell? value, object? parameter = null)
+    {
+        if(value is null) return new SolidColorBrush(Colors.Transparent);
+
+        return new SolidColorBrush(!value.Completed.IsEmpty()
+            ? Colors.WhiteSmoke
+            : !value.Started.IsEmpty()
+                ? Colors.Black
+                : Colors.Black);
+    }
+}
+
+public class ExistingFormStatusConverter : AbstractConverter<IDigitalFormInstanceShell, string>
+{
+    public static readonly ExistingFormStatusConverter Instance = new();
+
+    protected override string? Convert(IDigitalFormInstanceShell? value, object? parameter = null)
+    {
+        if (value is null) return "";
+
+        return !value.Completed.IsEmpty()
+            ? $"{value.Completed:dd MMMM yy}"
+            : !value.Started.IsEmpty()
+                ? $"{value.Started:dd MMMM yy}"
+                : $"{value.Created:dd MMMM yy}";
+    }
+}
+
 public partial class FormsList : UserControl
 {
+    public static readonly StyledProperty<bool> SeparateHistoryProperty =
+        AvaloniaProperty.Register<FormsList, bool>(nameof(SeparateHistory), true);
+
     public string SearchText { get; set; }
 
+    public bool SeparateHistory
+    {
+        get => GetValue(SeparateHistoryProperty);
+        set => SetValue(SeparateHistoryProperty, value);
+    }
+
+    public static readonly StyledProperty<ICoreRepository?> ModelProperty =
+        AvaloniaProperty.Register<FormsList, ICoreRepository?>(nameof(Model));
+
+    public ICoreRepository? Model
+    {
+        get => GetValue(ModelProperty);
+        set => SetValue(ModelProperty, value);
+    }
+
     public FormsList()
     {
         InitializeComponent();
@@ -19,4 +91,42 @@ public partial class FormsList : UserControl
     {
 
     }
+
+    [RelayCommand]
+    private void FormClicked(IDigitalFormInstanceShell form)
+    {
+    }
+
+    [RelayCommand]
+    private void SelectionMenu(IDigitalFormInstanceShell form)
+    {
+        var menu = new ContextMenu();
+        AvaloniaMenuItem.LoadMenuItems([
+            new CoreMenuItem<IImage>("Complete Forms", null, CompleteForms),
+            new CoreMenuItem<IImage>("Re-open Forms", null, ReopenForms),
+            new CoreMenuSeparator(),
+            new CoreMenuItem<IImage>("Select All", null, SelectAll),
+            new CoreMenuItem<IImage>("Select None", null, SelectNone),
+            ], menu.Items);
+    }
+
+    private async Task<bool> SelectNone()
+    {
+        return true;
+    }
+
+    private async Task<bool> SelectAll()
+    {
+        return true;
+    }
+
+    private async Task<bool> ReopenForms()
+    {
+        return true;
+    }
+
+    private async Task<bool> CompleteForms()
+    {
+        return true;
+    }
 }

+ 5 - 1
PRS.Avalonia/PRS.Avalonia/Modules/Site/SiteItps/SiteITPFormsView.axaml

@@ -2,6 +2,10 @@
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+             xmlns:avComponents="using:PRS.Avalonia.Components"
+			 xmlns:local="using:PRS.Avalonia.Modules"
              mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
-             x:Class="PRS.Avalonia.Modules.SiteITPFormsView">
+			 x:Class="PRS.Avalonia.Modules.SiteITPFormsView"
+			 x:DataType="local:SiteITPFormsViewModel">
+	<avComponents:FormsList Model="{Binding Forms}"/>
 </UserControl>

+ 11 - 2
PRS.Avalonia/PRS.Avalonia/Modules/Site/SiteItps/SiteITPFormsViewModel.cs

@@ -15,8 +15,17 @@ public partial class SiteITPFormsViewModel : ModuleViewModel
     private Guid _itpID;
 
     [ObservableProperty]
-    private JobITPModel? _ITPs;
+    private JobITPModel _ITPs;
 
     [ObservableProperty]
-    private JobITPFormModel? _forms;
+    private JobITPFormModel _forms;
+
+    protected override async Task<TimeSpan> OnRefresh()
+    {
+        await Task.WhenAll([
+            ITPs.RefreshAsync(false),
+            Forms.RefreshAsync(false)
+            ]);
+        return TimeSpan.Zero;
+    }
 }