diff --git a/Tikhole.Website/Components/Pages/Rule.razor b/Tikhole.Website/Components/Pages/Rule.razor index 1df9902..510ea3b 100644 --- a/Tikhole.Website/Components/Pages/Rule.razor +++ b/Tikhole.Website/Components/Pages/Rule.razor @@ -4,7 +4,7 @@ @using System.Text.RegularExpressions @using global::Tikhole.Engine -📃 Rule: @EngineRule?.Name +📃 Rule: @(EngineRule?.Name ?? "New") @if (Error != "") { @@ -18,49 +18,63 @@ } -

📃 Rule: @EngineRule?.Name

+

📃 Rule: @(EngineRule?.Name ?? "New")

- @{ - RuleAttribute? ruleAttribute = EngineRule?.GetType().GetCustomAttribute(); + @if (EngineRuleType == null) + { + Select a rule type below. + } + else + { + RuleAttribute? ruleAttribute = EngineRuleType.GetCustomAttribute(); + @ruleAttribute?.Name
+ @ruleAttribute?.Hint } - @ruleAttribute?.Name
- @ruleAttribute?.Hint


-⬅️ Cancel - - @if (EngineRule != null) +⬅️ Back +@if (EngineRuleType != null) +{ + +} +@if (EngineRule != null) +{ + @if (DeleteIntent) { - @if (DeleteIntent) - { - - } - else - { - - } + } + else + { + + } +}
- @if (EngineRule == null) + @if (EngineRuleType == null) { - foreach (Type rule in EngineAssembly.GetTypes()) +
+ @foreach (Type rule in EngineAssembly.GetTypes()) { RuleAttribute? ra = rule.GetCustomAttribute(); if (ra == null) continue; - +
+ + @ra.Hint +
} +
} else { - foreach (FieldInfo field in EngineRule.GetType().GetFields().Reverse()) + foreach (FieldInfo field in EngineRuleType.GetFields().Reverse()) { RuleFieldAttribute? fa = field.GetCustomAttribute(); if (fa == null) continue;
@{ - string value = Settings[field.Name]; + string value = ""; + if (Settings.ContainsKey(field.Name)) value = Settings[field.Name]; } @if (field.FieldType == typeof(Regex)) { @@ -82,7 +96,7 @@ [Parameter] public int Index { get; set; } private string Error { get; set; } = ""; - private Type EngineRuleType = typeof(Rule); + private Type? EngineRuleType; private Engine.Rule? EngineRule; private bool DeleteIntent = false; private Assembly EngineAssembly = Assembly.GetAssembly(typeof(Engine.Tikhole))!; @@ -108,7 +122,9 @@ } private void LoadSettings() { - foreach (FieldInfo field in EngineRuleType.GetFields().Reverse()) + if (EngineRuleType == null) return; + Settings.Clear(); + foreach (FieldInfo field in EngineRuleType.GetFields()) { string value = field.GetValue(EngineRule)?.ToString() ?? ""; if (field.FieldType == typeof(System.Timers.Timer)) @@ -124,29 +140,46 @@ } private void SaveSettings() { + Error = ""; + if (EngineRuleType == null) return; try { - foreach (FieldInfo field in EngineRuleType.GetFields()) + List parameters = new(); + ConstructorInfo engineRuleConstructor = EngineRuleType.GetConstructors().First(); + foreach (ParameterInfo param in engineRuleConstructor.GetParameters()) { - if (field.FieldType == typeof(Regex)) + if (param.Name == null) continue; + if (param.ParameterType == typeof(Regex)) { - field.SetValue(EngineRule, new Regex(Settings[field.Name])); + parameters.Add(new Regex(Settings[param.Name])); } - if (field.FieldType == typeof(System.Timers.Timer)) + if (param.ParameterType == typeof(System.Timers.Timer)) { - field.SetValue(EngineRule, new System.Timers.Timer(double.Parse(Settings[field.Name]))); + parameters.Add(new System.Timers.Timer(double.Parse(Settings[param.Name]))); } - if (field.FieldType == typeof(Uri)) + if (param.ParameterType == typeof(Uri)) { - field.SetValue(EngineRule, new Uri(Settings[field.Name])); + parameters.Add(new Uri(Settings[param.Name])); } - if (field.FieldType == typeof(string)) + if (param.ParameterType == typeof(string)) { - field.SetValue(EngineRule, Settings[field.Name]); + parameters.Add(Settings[param.Name]); } } + Engine.Rule rule = (Engine.Rule)engineRuleConstructor.Invoke(parameters.ToArray()); + if (EngineRule == null) + { + Engine.Matcher.Rules.Add(rule); + Index = Engine.Matcher.Rules.IndexOf(rule); + } + else + { + Engine.Matcher.Rules[Index].Dispose(); + Engine.Matcher.Rules[Index] = rule; + } Engine.Configurator.SaveConfig(); - NavigationManager.NavigateTo("/Rules"); + NavigationManager.NavigateTo("/Rules/" + Index); + OnInitialized(); } catch (Exception e) { @@ -155,6 +188,12 @@ } private void Delete() { + if (EngineRule != null) + { + EngineRule.Dispose(); + Engine.Matcher.Rules.Remove(EngineRule); + } + Engine.Configurator.SaveConfig(); NavigationManager.NavigateTo("/Rules"); } } \ No newline at end of file diff --git a/Tikhole.Website/Components/Pages/Rules.razor b/Tikhole.Website/Components/Pages/Rules.razor index 9e0296a..b1064f9 100644 --- a/Tikhole.Website/Components/Pages/Rules.razor +++ b/Tikhole.Website/Components/Pages/Rules.razor @@ -34,8 +34,8 @@ @rule.Name Type @ra.Name - - + + ✏️ index++; @@ -47,4 +47,20 @@ { base.OnInitialized(); } + private void MoveUp(Engine.Rule Rule) + { + int index = Engine.Matcher.Rules.IndexOf(Rule) - 1; + if (index < 0) return; + Engine.Matcher.Rules.Remove(Rule); + Engine.Matcher.Rules.Insert(index, Rule); + Engine.Configurator.SaveConfig(); + } + private void MoveDown(Engine.Rule Rule) + { + int index = Engine.Matcher.Rules.IndexOf(Rule) + 1; + if (index >= Engine.Matcher.Rules.Count) return; + Engine.Matcher.Rules.Remove(Rule); + Engine.Matcher.Rules.Insert(index, Rule); + Engine.Configurator.SaveConfig(); + } } \ No newline at end of file