Kenric Nugteren 6 месяцев назад
Родитель
Сommit
3937419385

+ 18 - 0
prs.shared/Grids/EventEditor/TriggerEditors.cs

@@ -111,3 +111,21 @@ public class ScriptSaveEventTriggerEditor<T> : IEventTriggerEditor<ScriptSaveEve
         }
     }
 }
+
+public class FilterSaveEventTriggerEditor<T> : IEventTriggerEditor<FilterSaveEventTrigger<T>>
+    where T : Entity, new()
+{
+    public bool Edit(FilterSaveEventTrigger<T> trigger)
+    {
+        var filter = trigger.Filter;
+        if(FilterEditorWindow.Execute(ref filter))
+        {
+            trigger.Filter = filter;
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+    }
+}

+ 1 - 1
prs.stores/Events/Event.cs

@@ -334,7 +334,7 @@ public static class EventUtils
         foreach(var ev in events)
         {
             var eventData = (ev.EventData as EventData<SaveEvent<T>, SaveEventDataModel<T>>)!;
-            var model = new SaveEventDataModel<T>(entity);
+            var model = new SaveEventDataModel<T>(entity, store);
 
             eventData.Event.Init(store, eventData, model);
 

+ 34 - 1
prs.stores/Events/SaveEvent.cs

@@ -112,13 +112,15 @@ public class SaveEventDataModelDefinition<T>(SaveEvent<T> ev) : IEventDataModelD
     }
 }
 
-public class SaveEventDataModel<T>(T entity) : IEventDataModel, ITypedEventDataModel
+public class SaveEventDataModel<T>(T entity, IStore store) : IEventDataModel, ITypedEventDataModel
     where T : Entity, new()
 {
     public T Entity { get; set; } = entity;
 
     public Type EntityType => typeof(T);
 
+    public IStore Store { get; } = store;
+
     public bool TryGetVariable(string name, out object? value)
     {
         var prefix = $"{typeof(T).Name}.";
@@ -190,6 +192,37 @@ public class PropertyChangedSaveEventTrigger<T> : IEventTrigger<SaveEvent<T>, Sa
     }
 }
 
+[Caption("Filter")]
+public class FilterSaveEventTrigger<T> : IEventTrigger<SaveEvent<T>, SaveEventDataModel<T>>
+    where T : Entity, new()
+{
+    public Filter<T>? Filter { get; set; }
+
+    public IEnumerable<string> ReferencedVariables => GetReferencedProperties(Filter).Select(x => $"{typeof(T).Name}.{x}");
+
+    public string Description => Filter?.ToString() ?? "Blank Filter";
+
+    public bool Check(SaveEventDataModel<T> dataModel)
+    {
+        return Filter.Match(dataModel.Entity, dataModel.Store.GetQueryProviderFactory());
+    }
+
+    private IEnumerable<string> GetReferencedProperties(Filter<T>? filter)
+    {
+        if (filter is null) yield break;
+
+        if(filter.Operator != Operator.All && filter.Operator != Operator.None
+            && !filter.Property.IsNullOrWhiteSpace())
+        {
+            yield return filter.Property;
+        }
+        foreach(var prop in filter.Ands.Concat(filter.Ors).SelectMany(GetReferencedProperties))
+        {
+            yield return prop;
+        }
+    }
+}
+
 [Caption("Custom Script")]
 public class ScriptSaveEventTrigger<T> : IEventTrigger<SaveEvent<T>, SaveEventDataModel<T>>
     where T : Entity, new()