Browse Source

Fixed bugs where ReferencedVariables weren't being loaded by the event

Kenric Nugteren 11 months ago
parent
commit
51de68998a

+ 1 - 1
prs.shared/Grids/EventEditor/Action Editors/ActionEditors.cs

@@ -76,7 +76,7 @@ public static class EventActionEditors
 }
 
 public class ScriptSaveEventActionEditor<T> : IEventActionEditor<ScriptSaveEventAction<T>>
-    where T : Entity
+    where T : Entity, new()
 {
     public bool Edit(ScriptSaveEventAction<T> action, IEventDataModelDefinition dataModelDefinition)
     {

+ 1 - 1
prs.shared/Grids/EventEditor/Action Editors/CreateEntityActionEditor.cs

@@ -15,7 +15,7 @@ using System.Windows.Controls;
 namespace PRS.Shared.Grids.EventEditor;
 
 public class CreateEntitySaveEventActionEditor<T> : IEventActionEditor<CreateEntitySaveEventAction<T>>, INotifyPropertyChanged
-    where T : Entity
+    where T : Entity, new()
 {
     private CreateEntitySaveEventAction<T> Action = null!;
     private PropertyInitializerGrid Grid = null!;

+ 1 - 1
prs.shared/Grids/EventEditor/Action Editors/EventActionGrid.cs

@@ -20,7 +20,7 @@ public class EventActionContainer<TEvent, TDataModel> : BaseObject
 
     public string ActionType => Action.GetType().GetCaption();
 
-    public string Description => Action.GetDescription();
+    public string Description => Action.Description;
 }
 
 public class EventActionGrid<TEvent, TDataModel> : DynamicItemsListGrid<EventActionContainer<TEvent, TDataModel>>

+ 1 - 1
prs.shared/Grids/EventEditor/EventTriggerGrid.cs

@@ -21,7 +21,7 @@ public class EventTriggerContainer<TEvent, TDataModel> : BaseObject
 
     public string TriggerType => Trigger.GetType().GetCaption();
 
-    public string Description => Trigger.GetDescription();
+    public string Description => Trigger.Description;
 }
 
 public class EventTriggerGrid<TEvent, TDataModel> : DynamicItemsListGrid<EventTriggerContainer<TEvent, TDataModel>>

+ 2 - 2
prs.shared/Grids/EventEditor/TriggerEditors.cs

@@ -73,7 +73,7 @@ public static class EventTriggerEditors
 }
 
 public class PropertyChangedSaveEventTriggerEditor<T> : IEventTriggerEditor<PropertyChangedSaveEventTrigger<T>>
-    where T : Entity
+    where T : Entity, new()
 {
     public bool Edit(PropertyChangedSaveEventTrigger<T> trigger)
     {
@@ -95,7 +95,7 @@ public class PropertyChangedSaveEventTriggerEditor<T> : IEventTriggerEditor<Prop
 }
 
 public class ScriptSaveEventTriggerEditor<T> : IEventTriggerEditor<ScriptSaveEventTrigger<T>>
-    where T : Entity
+    where T : Entity, new()
 {
     public bool Edit(ScriptSaveEventTrigger<T> trigger)
     {

+ 1 - 1
prs.shared/Grids/EventGrid.cs

@@ -133,7 +133,7 @@ public class EventGrid : DynamicDataGrid<Event>
     {
         base.BeforeLoad(form, items);
 
-        form.ReadOnly = Security.IsAllowed<CanManageEvents>();
+        form.ReadOnly = !Security.IsAllowed<CanManageEvents>();
 
         var ev = items.First();
 

+ 35 - 8
prs.stores/Events/Event.cs

@@ -16,6 +16,8 @@ namespace PRS.Shared.Events;
 public interface IEventData : ISerializeBinary
 {
     IEvent Event { get; }
+
+    IEnumerable<string> ReferencedVariables { get; }
 }
 
 public class EventData<T, TDataModel> : IEventData
@@ -33,6 +35,11 @@ public class EventData<T, TDataModel> : IEventData
 
     IEvent IEventData.Event => Event;
 
+    public IEnumerable<string> ReferencedVariables =>
+        Triggers.SelectMany(x => x.ReferencedVariables)
+        .Concat(Actions.SelectMany(x => x.ReferencedVariables))
+        .Distinct();
+
     public EventData(T eventData)
     {
         Event = eventData;
@@ -334,7 +341,10 @@ public static class EventUtils
             var data = Deserialize(reader);
 
             var entityType = data.Event.GetType().GenericTypeArguments[0];
-            _entityEvents.GetValueOrAdd(ev.EventType).GetValueOrAdd(entityType).Add((ev, data));
+            var list = _entityEvents.GetValueOrAdd(ev.EventType).GetValueOrAdd(entityType);
+            list.RemoveAll(x => x.Event.ID == ev.ID);
+            
+            list.Add((ev, data));
             _entityEventMap[ev.ID] = (ev.EventType, entityType);
         }
     }
@@ -384,8 +394,12 @@ public static class EventUtils
         }
     }
 
+    #endregion
+
+    #region Public Event Running Interface
+
     public static void AfterSave<T>(IStore store, T entity)
-        where T : Entity
+        where T : Entity, new()
     {
         if (!_loadedCache) ReloadCache(store.Provider);
 
@@ -395,7 +409,12 @@ public static class EventUtils
 
         foreach(var ev in events)
         {
-            Run(store, ev.Event, (ev.EventData as EventData<SaveEvent<T>, SaveEventDataModel<T>>)!, new SaveEventDataModel<T>(entity));
+            var eventData = (ev.EventData as EventData<SaveEvent<T>, SaveEventDataModel<T>>)!;
+            var model = new SaveEventDataModel<T>(entity);
+
+            eventData.Event.Init(store, eventData, model);
+
+            Run(store, ev.Event, eventData, model);
         }
     }
 
@@ -501,6 +520,11 @@ public class ChildEventDataModel : IChildEventDataModel
         return Values.TryGetValue(name, out value)
             || Parent.TryGetVariable(name, out value);
     }
+
+    public void Init(IEventData data)
+    {
+        throw new NotImplementedException();
+    }
 }
 
 #endregion
@@ -515,8 +539,7 @@ public interface IEvent : ISerializeBinary
 
         var values = new List<(string name, object? value)[]>() { Array.Empty<(string, object?)>() };
 
-        var vars = action.ReferencedVariables();
-        foreach(var variable in vars)
+        foreach(var variable in action.ReferencedVariables)
         {
             var varDef = dataModelDef.GetVariable(variable);
             if(varDef is ListEventVariable)
@@ -566,12 +589,16 @@ public interface IEvent : ISerializeBinary
 
 public interface IEvent<TDataModel> : IEvent
 {
+    void Init(IStore store, IEventData data, TDataModel model);
+
     Notification GenerateNotification(TDataModel model);
 }
 
 public interface IEventTrigger
 {
-    string GetDescription();
+    IEnumerable<string> ReferencedVariables { get; }
+
+    string Description { get; }
 }
 
 public interface IEventTrigger<TEvent, TDataModel> : ISerializeBinary, IEventTrigger
@@ -583,11 +610,11 @@ public interface IEventTrigger<TEvent, TDataModel> : ISerializeBinary, IEventTri
 
 public interface IEventAction : ISerializeBinary
 {
-    IEnumerable<string> ReferencedVariables();
+    IEnumerable<string> ReferencedVariables { get; }
 
     object? Execute(IEventDataModel dataModel);
 
-    string GetDescription();
+    string Description { get; }
 }
 
 public interface IEventAction<TEvent> : IEventAction

+ 61 - 43
prs.stores/Events/SaveEvent.cs

@@ -11,7 +11,7 @@ using System.Text;
 namespace PRS.Shared.Events;
 
 public class SaveEvent<T> : IEvent<SaveEventDataModel<T>>
-    where T : Entity
+    where T : Entity, new()
 {
     public Type Entity => typeof(T);
 
@@ -40,10 +40,39 @@ public class SaveEvent<T> : IEvent<SaveEventDataModel<T>>
     public void DeserializeBinary(CoreBinaryReader reader)
     {
     }
+
+    public void Init(IStore store, IEventData evData, SaveEventDataModel<T> model)
+    {
+        if (model.Entity.ID != Guid.Empty)
+        {
+            var loadCols = Columns.None<T>();
+
+            var prefix = $"{typeof(T).Name}.";
+            foreach (var variable in evData.ReferencedVariables)
+            {
+                if (variable.StartsWith(prefix))
+                {
+                    var varName = variable[prefix.Length..];
+                    if (!model.Entity.HasOriginalValue(varName))
+                    {
+                        loadCols.Add(varName);
+                    }
+                }
+            }
+
+            var data = store.Provider.Query(
+                new Filter<T>(x => x.ID).IsEqualTo(model.Entity.ID),
+                loadCols);
+            if(data.Rows.Count > 0)
+            {
+                data.Rows[0].FillObject(model.Entity);
+            }
+        }
+    }
 }
 
 public class SaveEventDataModelDefinition<T>(SaveEvent<T> ev) : IEventDataModelDefinition
-    where T : Entity
+    where T : Entity, new()
 {
     private IEventVariable[]? variables;
 
@@ -90,7 +119,7 @@ public class SaveEventDataModelDefinition<T>(SaveEvent<T> ev) : IEventDataModelD
 }
 
 public class SaveEventDataModel<T>(T entity) : IEventDataModel, ITypedEventDataModel
-    where T : Entity
+    where T : Entity, new()
 {
     public T Entity { get; set; } = entity;
 
@@ -118,8 +147,12 @@ public class SaveEventDataModel<T>(T entity) : IEventDataModel, ITypedEventDataM
 
 [Caption("New Record")]
 public class CreatedSaveEventTrigger<T> : IEventTrigger<SaveEvent<T>, SaveEventDataModel<T>>
-    where T : Entity
+    where T : Entity, new()
 {
+    public string Description => "New Record";
+
+    public IEnumerable<string> ReferencedVariables => [];
+
     public bool Check(SaveEventDataModel<T> dataModel)
     {
         return dataModel.Entity.HasOriginalValue(x => x.ID);
@@ -131,16 +164,20 @@ public class CreatedSaveEventTrigger<T> : IEventTrigger<SaveEvent<T>, SaveEventD
     public void DeserializeBinary(CoreBinaryReader reader)
     {
     }
-
-    public string GetDescription() => "New Record";
 }
 
 [Caption("Property Changed")]
 public class PropertyChangedSaveEventTrigger<T> : IEventTrigger<SaveEvent<T>, SaveEventDataModel<T>>
-    where T : Entity
+    where T : Entity, new()
 {
     public IProperty? TriggerProperty { get; set; }
 
+    public string Description => TriggerProperty is null
+        ? $"{typeof(T).GetCaption()} changed"
+        : $"{typeof(T).GetCaption()}.{TriggerProperty.Name} changed";
+
+    public IEnumerable<string> ReferencedVariables => [];
+
     public bool Check(SaveEventDataModel<T> dataModel)
     {
         if(TriggerProperty is null)
@@ -177,24 +214,14 @@ public class PropertyChangedSaveEventTrigger<T> : IEventTrigger<SaveEvent<T>, Sa
             TriggerProperty = null;
         }
     }
-
-    public string GetDescription()
-    {
-        if(TriggerProperty is null)
-        {
-            return $"{typeof(T).GetCaption()} changed";
-        }
-        else
-        {
-            return $"{typeof(T).GetCaption()}.{TriggerProperty.Name} changed";
-        }
-    }
 }
 
 [Caption("Custom Script")]
 public class ScriptSaveEventTrigger<T> : IEventTrigger<SaveEvent<T>, SaveEventDataModel<T>>
-    where T : Entity
+    where T : Entity, new()
 {
+    public string Description => "Custom Script";
+
     private ScriptDocument? _scriptDocument;
 
     private string? _script;
@@ -211,6 +238,8 @@ public class ScriptSaveEventTrigger<T> : IEventTrigger<SaveEvent<T>, SaveEventDa
         }
     }
 
+    public IEnumerable<string> ReferencedVariables => [];
+
     public string DefaultScript()
     {
         return @"using PRS.Shared.Events;
@@ -254,8 +283,6 @@ public class Module
             Script = script;
         }
     }
-
-    public string GetDescription() => "Custom Script";
 }
 
 #endregion
@@ -264,7 +291,7 @@ public class Module
 
 [Caption("Custom Script")]
 public class ScriptSaveEventAction<T> : IEventAction<SaveEvent<T>>
-    where T : Entity
+    where T : Entity, new()
 {
     private ScriptDocument? _scriptDocument;
 
@@ -282,6 +309,10 @@ public class ScriptSaveEventAction<T> : IEventAction<SaveEvent<T>>
         }
     }
 
+    public IEnumerable<string> ReferencedVariables => [];
+
+    public string Description => "Custom Script";
+
     public string DefaultScript()
     {
         return @"using PRS.Shared.Events;
@@ -319,11 +350,6 @@ public class Module
         }
     }
 
-    public IEnumerable<string> ReferencedVariables()
-    {
-        yield break;
-    }
-
     public void SerializeBinary(CoreBinaryWriter writer)
     {
         writer.Write(Script ?? "");
@@ -341,18 +367,20 @@ public class Module
             Script = script;
         }
     }
-
-    public string GetDescription() => "Custom Script";
 }
 
 [Caption("Create Entity")]
 public class CreateEntitySaveEventAction<T> : IEventAction<SaveEvent<T>>
-    where T : Entity
+    where T : Entity, new()
 {
     public Type? EntityType { get; set; }
 
     public List<PropertyInitializer> Initializers { get; set; } = new List<PropertyInitializer>();
 
+    public string Description => $"Create New {EntityType?.Name ?? "Entity"}";
+
+    public IEnumerable<string> ReferencedVariables => Initializers.SelectMany(x => x.ReferencedVariables);
+
     public object? Execute(IEventDataModel dataModel)
     {
         if(EntityType is null)
@@ -368,11 +396,6 @@ public class CreateEntitySaveEventAction<T> : IEventAction<SaveEvent<T>>
         return entity;
     }
 
-    public IEnumerable<string> ReferencedVariables()
-    {
-        return Initializers.SelectMany(x => x.ReferencedVariables());
-    }
-
     public void SerializeBinary(CoreBinaryWriter writer)
     {
         if(EntityType is null)
@@ -408,8 +431,6 @@ public class CreateEntitySaveEventAction<T> : IEventAction<SaveEvent<T>>
             Initializers.Add(init);
         }
     }
-
-    public string GetDescription() => $"Create New {EntityType?.Name ?? "Entity"}";
 }
 
 public class PropertyInitializer
@@ -441,6 +462,8 @@ public class PropertyInitializer
         }
     }
 
+    public IEnumerable<string> ReferencedVariables => ValueExpression.ReferencedVariables;
+
     /// <summary>
     /// <b>Only for use in serialisation.</b>
     /// </summary>
@@ -460,11 +483,6 @@ public class PropertyInitializer
         Property.Setter()(entity, ValueExpression.Evaluate(dataModel));
     }
 
-    public IEnumerable<string> ReferencedVariables()
-    {
-        return ValueExpression.ReferencedVariables;
-    }
-
     public void SerializeBinary(CoreBinaryWriter writer)
     {
         writer.Write(Property.Name);