Browse Source

Added live maps equipment group selector

Kenric Nugteren 5 months ago
parent
commit
b0e12d163d

+ 2 - 0
PRS.Avalonia/PRS.Avalonia/App.axaml

@@ -20,6 +20,8 @@
         <StyleInclude Source="avares://InABox.Avalonia/Theme/Classes/TextBox.axaml" />
         <StyleInclude Source="avares://InABox.Avalonia/Theme/Classes/Separator.axaml" />
         <StyleInclude Source="avares://InABox.Avalonia/Theme/Classes/ListBox.axaml" />
+		
+        <StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml" />
 
 		<dialogHostAvalonia:DialogHostStyles/>
 

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

@@ -1,3 +1,4 @@
+using System;
 using System.Linq;
 using Avalonia;
 using Avalonia.Controls;
@@ -23,6 +24,11 @@ public class App : Application
         AvaloniaXamlLoader.Load(this);
     }
 
+    public static void HandleException(Exception e)
+    {
+        MobileLogging.Log(CoreUtils.FormatException(e));
+    }
+
     public override void OnFrameworkInitializationCompleted()
     {
         if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)

+ 1 - 1
PRS.Avalonia/PRS.Avalonia/MainView.axaml

@@ -9,7 +9,7 @@
              x:Class="PRS.Avalonia.Modules.MainView"
              x:DataType="avalonia:MainViewModel">
 
-	<dialogHostAvalonia:DialogHost CloseOnClickAway="True">
+	<dialogHostAvalonia:DialogHost CloseOnClickAway="True" DialogMargin="20">
 		<Grid Background="{StaticResource PrsSurfaceBackground}">
 			<Grid.RowDefinitions>
 				<RowDefinition Height="45" />

+ 10 - 1
PRS.Avalonia/PRS.Avalonia/Modules/EquipmentModule/EquipmentMaps/EquipmentMapsMenuView.axaml

@@ -15,11 +15,20 @@
 			<ColumnDefinition Width="*"/>
 			<ColumnDefinition Width="*"/>
 		</Grid.ColumnDefinitions>
+
+		<DataGrid x:Name="Grid" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"
+				  ItemsSource="{Binding Items}">
+			<DataGrid.Columns>
+				<DataGridCheckBoxColumn Header="Selected?" Binding="{Binding Selected}"/>
+				<DataGridTextColumn Header="Select Categories" Binding="{Binding Description}"/>
+			</DataGrid.Columns>
+		</DataGrid>
 		
 		<Button Grid.Row="1" Grid.Column="0"
 				Content="Clear All"
 				Command="{Binding ClearAllCommand}"/>
 		<Button Grid.Row="1" Grid.Column="1"
-				Content="Select All"/>
+				Content="Select All"
+				Command="{Binding SelectAllCommand}"/>
 	</Grid>
 </UserControl>

+ 95 - 2
PRS.Avalonia/PRS.Avalonia/Modules/EquipmentModule/EquipmentMaps/EquipmentMapsMenuViewModel.cs

@@ -1,19 +1,112 @@
-using CommunityToolkit.Mvvm.Input;
+using Avalonia.Threading;
+using Comal.Classes;
+using CommunityToolkit.Mvvm.ComponentModel;
+using CommunityToolkit.Mvvm.Input;
 using DialogHostAvalonia;
+using DynamicData;
 using InABox.Avalonia;
+using InABox.Core;
 using System;
 using System.Collections.Generic;
+using System.Collections.ObjectModel;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
 namespace PRS.Avalonia.Modules;
 
+public partial class EquipmentMapsMenuItem(Guid id, string description, bool selected) : ObservableObject
+{
+    [ObservableProperty]
+    private bool _selected = selected;
+
+    [ObservableProperty]
+    private string _description = description;
+
+    [ObservableProperty]
+    private Guid _ID = id;
+}
+
 public partial class EquipmentMapsMenuViewModel : PopupViewModel
 {
+    public event EventHandler? OnChanged;
+
+    [ObservableProperty]
+    public HashSet<Guid> _selectedItems = [];
+
+    [ObservableProperty]
+    private ObservableCollection<EquipmentMapsMenuItem> _items = [];
+    
+    [ObservableProperty]
+    private EquipmentGroupModel _equipmentGroups;
+
+    public EquipmentMapsMenuViewModel()
+    {
+        EquipmentGroups = new EquipmentGroupModel(
+            DataAccess,
+            () => LookupFactory.DefineFilter<EquipmentGroup>());
+    }
+
+    protected async override Task<TimeSpan> OnRefresh()
+    {
+        await EquipmentGroups.RefreshAsync(false);
+
+        Dispatcher.UIThread.Invoke(() =>
+        {
+            Items.Clear();
+            Items.AddRange(EquipmentGroups.Items
+                .Select(x => new EquipmentMapsMenuItem(x.ID, x.Description, SelectedItems.Contains(x.ID)))
+                .Prepend(new EquipmentMapsMenuItem(CoreUtils.FullGuid, "Job Locations", SelectedItems.Contains(CoreUtils.FullGuid))));
+            foreach (var item in Items)
+            {
+                item.PropertyChanged += Item_PropertyChanged;
+            }
+        });
+        return TimeSpan.Zero;
+    }
+
+    private void Item_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
+    {
+        if (sender is not EquipmentMapsMenuItem item) return;
+
+        if(e.PropertyName == nameof(EquipmentMapsMenuItem.Selected))
+        {
+            if (item.Selected)
+            {
+                SelectedItems.Add(item.ID);
+            }
+            else
+            {
+                SelectedItems.Remove(item.ID);
+            }
+            DoChanged();
+        }
+    }
+
     [RelayCommand]
     private void ClearAll()
     {
-        Close();
+        SelectedItems.Clear();
+        foreach (var item in Items)
+        {
+            item.Selected = false;
+        }
+        DoChanged();
+    }
+
+    [RelayCommand]
+    private void SelectAll()
+    {
+        foreach (var item in Items)
+        {
+            item.Selected = true;
+            SelectedItems.Add(item.ID);
+        }
+        DoChanged();
+    }
+
+    private void DoChanged()
+    {
+        OnChanged?.Invoke(this, EventArgs.Empty);
     }
 }

+ 12 - 10
PRS.Avalonia/PRS.Avalonia/Modules/EquipmentModule/EquipmentMaps/EquipmentMapsViewModel.cs

@@ -42,9 +42,6 @@ public partial class EquipmentMapsViewModel : ModuleViewModel
     
     [ObservableProperty]
     private EquipmentModel _equipment;
-    
-    [ObservableProperty]
-    private EquipmentGroupModel _equipmentGroups;
 
     [ObservableProperty]
     private Point _coordinates;
@@ -66,10 +63,6 @@ public partial class EquipmentMapsViewModel : ModuleViewModel
             () => new Filter<Equipment>().All(),
             () => DefaultCacheFileName<EquipmentShell>());
 
-        EquipmentGroups = new EquipmentGroupModel(
-            DataAccess,
-            () => LookupFactory.DefineFilter<EquipmentGroup>());
-
         PrimaryMenu.Add(new AvaloniaMenuItem(Images.menu, SelectFilter));
     }
 
@@ -77,8 +70,7 @@ public partial class EquipmentMapsViewModel : ModuleViewModel
     {
         await Task.WhenAll(
             Jobs.RefreshAsync(false),
-            Equipment.RefreshAsync(false),
-            EquipmentGroups.RefreshAsync(false));
+            Equipment.RefreshAsync(false));
 
         Refresh();
 
@@ -190,7 +182,17 @@ public partial class EquipmentMapsViewModel : ModuleViewModel
 
     private async Task<bool> SelectFilter()
     {
-        return await Task.FromResult(true);
+        await Navigation.Popup<EquipmentMapsMenuViewModel>(model =>
+        {
+            model.SelectedItems = _settings.SelectedCategories.ToHashSet();
+            model.OnChanged += (o, e) =>
+            {
+                _settings.SelectedCategories = model.SelectedItems.ToArray();
+                new LocalConfiguration<EquipmentMapsSettings>().Save(_settings);
+                Refresh();
+            };
+        });
+        return true;
     }
 
     [RelayCommand]

+ 10 - 1
PRS.Avalonia/PRS.Avalonia/ViewModelBase.cs

@@ -6,6 +6,7 @@ using System.Reflection;
 using System.Threading;
 using System.Threading.Tasks;
 using Avalonia.Svg.Skia;
+using Avalonia.Threading;
 using Comal.Classes;
 using CommunityToolkit.Mvvm.ComponentModel;
 using CommunityToolkit.Mvvm.Input;
@@ -13,7 +14,9 @@ using DialogHostAvalonia;
 using InABox.Avalonia;
 using InABox.Avalonia.Components;
 using InABox.Configuration;
+using InABox.Core;
 using PRS.Avalonia.Components;
+using PRS.Avalonia.Dialogs;
 
 namespace PRS.Avalonia;
 
@@ -146,7 +149,13 @@ public abstract partial class ViewModelBase : ObservableObject, IViewModelBase
                 }
             },
             token
-        );
+        ).ContinueWith(task =>
+        {
+            if(task.Exception is not null)
+            {
+                App.HandleException(task.Exception);
+            }
+        });
     }
 
     protected virtual Task OnActivated()