Browse Source

Added menu to subscribe/unsubscribe from event

Kenric Nugteren 9 months ago
parent
commit
ca36fa2ba1
1 changed files with 122 additions and 0 deletions
  1. 122 0
      prs.shared/Grids/EventGrid.cs

+ 122 - 0
prs.shared/Grids/EventGrid.cs

@@ -0,0 +1,122 @@
+using Comal.Classes;
+using InABox.Clients;
+using InABox.Core;
+using InABox.DynamicGrid;
+using InABox.WPF;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Media.Imaging;
+
+namespace PRS.Shared;
+
+public class EventGrid : DynamicDataGrid<Event>
+{
+    private readonly BitmapImage _tick = InABox.Wpf.Resources.Bullet_Tick.AsBitmapImage();
+
+    private HashSet<Guid> _subscribedSet = new();
+
+    public Guid EmployeeID { get; set; }
+
+    protected override void Init()
+    {
+        base.Init();
+
+        ActionColumns.Add(new DynamicImageColumn(Subscribed_Image) { ToolTip = Subscribed_ToolTip });
+        ActionColumns.Add(new DynamicMenuColumn(BuildMenu));
+    }
+
+    private FrameworkElement? Subscribed_ToolTip(DynamicActionColumn column, CoreRow? row)
+    {
+        if(row is null)
+        {
+            return column.TextToolTip("Are you subscribed to this event?");
+        }
+        else
+        {
+            return _subscribedSet.Contains(row.Get<Event, Guid>(x => x.ID))
+                ? column.TextToolTip("You are subscribed to this event.")
+                : null;
+        }
+    }
+
+    private BitmapImage? Subscribed_Image(CoreRow? row)
+    {
+        if(row is null)
+        {
+            return _tick;
+        }
+        else
+        {
+            return _subscribedSet.Contains(row.Get<Event, Guid>(x => x.ID)) ? _tick : null;
+        }
+    }
+
+    private void BuildMenu(DynamicMenuColumn column, CoreRow? row)
+    {
+        if (row is null) return;
+
+        var eventID = row.Get<Event, Guid>(x => x.ID);
+
+        var menu = column.GetMenu();
+        if(_subscribedSet.Contains(eventID))
+        {
+            menu.AddItem("Unsubscribe from event", null, row, Unsubscribe_Click);
+        }
+        else
+        {
+            menu.AddItem("Subscribe to event", null, row, Subscribe_Click);
+        }
+    }
+
+    private void Unsubscribe_Click(CoreRow row)
+    {
+        var eventID = row.Get<Event, Guid>(x => x.ID);
+
+        var subscriber = Client.Query(
+            new Filter<EventSubscriber>(x => x.Employee.ID).IsEqualTo(EmployeeID)
+                .And(x => x.Event.ID).IsEqualTo(eventID),
+            Columns.None<EventSubscriber>().Add(x => x.ID))
+            .ToObjects<EventSubscriber>().FirstOrDefault();
+        if(subscriber is not null)
+        {
+            Client.Delete(subscriber, "");
+        }
+
+        _subscribedSet.Remove(eventID);
+
+        InvalidateRow(row);
+    }
+
+    private void Subscribe_Click(CoreRow row)
+    {
+        var ev = row.ToObject<Event>();
+        var subscriber = new EventSubscriber();
+        subscriber.Event.CopyFrom(ev);
+        subscriber.Employee.ID = EmployeeID;
+        Client.Save(subscriber, "");
+        _subscribedSet.Add(ev.ID);
+
+        InvalidateRow(row);
+    }
+
+    protected override void Reload(Filters<Event> criteria, Columns<Event> columns, ref SortOrder<Event>? sort, CancellationToken token, Action<CoreTable?, Exception?> action)
+    {
+        base.Reload(criteria, columns, ref sort, token, (data, error) =>
+        {
+            if(data is not null)
+            {
+                var ids = data.ExtractValues<Event, Guid>(x => x.ID);
+                _subscribedSet = Client.Query(
+                    new Filter<EventSubscriber>(x => x.Employee.ID).IsEqualTo(EmployeeID)
+                        .And(x => x.Event.ID).InList(ids),
+                    Columns.None<EventSubscriber>().Add(x => x.Event.ID))
+                    .ToObjects<EventSubscriber>().Select(x => x.Event.ID).ToHashSet();
+            }
+            action(data, error);
+        });
+    }
+}