From b058dfd2b11d39b3a07900f725fb29cbe4cb01c1 Mon Sep 17 00:00:00 2001 From: badhitman Date: Fri, 23 Feb 2024 19:09:16 +0300 Subject: [PATCH] + --- .../ab-log.web.Client/Pages/CamerasPage.razor | 12 + .../Pages/HardwareConfigPage.razor | 34 ++ .../Pages/HardwaresPage.razor | 53 +++ .../ab-log.web.Client/Pages/IndexPage.razor | 26 ++ .../Pages/MqttConfigPage.razor | 9 + .../ab-log.web.Client/Pages/ScriptsPage.razor | 304 +++++++++++++ .../Pages/TriggersPage.razor | 423 ++++++++++++++++++ .../ab-log.web.client/Pages/Counter.razor | 19 - ab-log.web/ab-log.web.client/_Imports.razor | 7 + .../ab-log.web.client.csproj | 24 + .../ab-log.web/Components/_Imports.razor | 3 + old.v3/ab-log-rc/ab-log-rc.csproj | 6 +- 12 files changed, 898 insertions(+), 22 deletions(-) create mode 100644 ab-log.web/ab-log.web.Client/Pages/CamerasPage.razor create mode 100644 ab-log.web/ab-log.web.Client/Pages/HardwareConfigPage.razor create mode 100644 ab-log.web/ab-log.web.Client/Pages/HardwaresPage.razor create mode 100644 ab-log.web/ab-log.web.Client/Pages/IndexPage.razor create mode 100644 ab-log.web/ab-log.web.Client/Pages/MqttConfigPage.razor create mode 100644 ab-log.web/ab-log.web.Client/Pages/ScriptsPage.razor create mode 100644 ab-log.web/ab-log.web.Client/Pages/TriggersPage.razor delete mode 100644 ab-log.web/ab-log.web.client/Pages/Counter.razor diff --git a/ab-log.web/ab-log.web.Client/Pages/CamerasPage.razor b/ab-log.web/ab-log.web.Client/Pages/CamerasPage.razor new file mode 100644 index 00000000..0dd65927 --- /dev/null +++ b/ab-log.web/ab-log.web.Client/Pages/CamerasPage.razor @@ -0,0 +1,12 @@ +@page "/cameras-page" + +@inject ILogger _loger +@inject IRefitCamerasService _refit + +@inherits BlazorBusyComponentBaseModel + +Камеры + +@code { + +} \ No newline at end of file diff --git a/ab-log.web/ab-log.web.Client/Pages/HardwareConfigPage.razor b/ab-log.web/ab-log.web.Client/Pages/HardwareConfigPage.razor new file mode 100644 index 00000000..9d4dbaa2 --- /dev/null +++ b/ab-log.web/ab-log.web.Client/Pages/HardwareConfigPage.razor @@ -0,0 +1,34 @@ +@page "/hardware-page/{Id:int}" + +@using RazorLib.Shared.navs.tabs +@using RazorLib.Shared.hardwares +@using RazorLib.Shared; +@using BlazorLib +@using SharedLib +@using Refit + +@inject ILogger _loger + +@inherits BlazorBusyComponentBaseModel + + + Управляющий блок #@(Id) + + +

Настройка управляющего блока

+ + + + + + + + + + + + +@code { + [Parameter, EditorRequired] + public int Id { get; set; } +} \ No newline at end of file diff --git a/ab-log.web/ab-log.web.Client/Pages/HardwaresPage.razor b/ab-log.web/ab-log.web.Client/Pages/HardwaresPage.razor new file mode 100644 index 00000000..65011408 --- /dev/null +++ b/ab-log.web/ab-log.web.Client/Pages/HardwaresPage.razor @@ -0,0 +1,53 @@ +@page "/hardwares-page" + +@using RazorLib.Shared.hardwares +@using BlazorLib +@using SharedLib + +@inject ILogger _loger +@inject IRefitHardwaresService _refit + +@inherits BlazorBusyComponentBaseModel + +Устройства + + +
+ + +@if (IsAddingHardware) +{ + +
+} + +@code { + bool IsAddingHardware = false; + + HardwaresListComponent? refCom; + + void OpeningToggle() + { + IsAddingHardware = !IsAddingHardware; + StateHasChanged(); + if (!IsAddingHardware) + refCom?.ReloadHardwares(); + } +} \ No newline at end of file diff --git a/ab-log.web/ab-log.web.Client/Pages/IndexPage.razor b/ab-log.web/ab-log.web.Client/Pages/IndexPage.razor new file mode 100644 index 00000000..e77a0e3e --- /dev/null +++ b/ab-log.web/ab-log.web.Client/Pages/IndexPage.razor @@ -0,0 +1,26 @@ +@page "/" + + + +Настройки + +
+
+

Локальный сервер.

+
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/ab-log.web/ab-log.web.Client/Pages/MqttConfigPage.razor b/ab-log.web/ab-log.web.Client/Pages/MqttConfigPage.razor new file mode 100644 index 00000000..81027c59 --- /dev/null +++ b/ab-log.web/ab-log.web.Client/Pages/MqttConfigPage.razor @@ -0,0 +1,9 @@ +@page "/mqtt-config-page" + +@using RazorLib.Shared.settings + + + +@code { + +} \ No newline at end of file diff --git a/ab-log.web/ab-log.web.Client/Pages/ScriptsPage.razor b/ab-log.web/ab-log.web.Client/Pages/ScriptsPage.razor new file mode 100644 index 00000000..78d314db --- /dev/null +++ b/ab-log.web/ab-log.web.Client/Pages/ScriptsPage.razor @@ -0,0 +1,304 @@ +@page "/scripts-page" + +@using RazorLib.Shared.navs.tabs +@using RazorLib.Shared; +@using MudBlazor; +@using SharedLib; +@using BlazorLib; +@using Refit; + +@inject ILogger _logger; +@inject IRefitScriptsService _refit; +@inject ISnackbar _snackbar; + +@inherits BlazorBusyComponentBaseModel + +Скрипты + + + +@if (IsBusyProgress) +{ +
+
+ Загрузка... +
+
+} +else +{ + if (ScriptsAll?.Any() != true) + { + + } + else + { +
+
+
+ @foreach (ScriptModelDB script in ScriptsAll) + { + +
+
+ @(script.Name) + + #@(script.Id > 0 ? script.Id.ToString() : "new") + +
+ @if (script.Id > 0) + { + + @(script.Commands?.Count) + + + } + else + { + + -NEW- + + + } +
+ @if (script.Id > 0) + { +

Тригер порт №: 000

+ При включении + } +
+ } +
+
+
+
+
+
+ Скрипт + @if (CurrentScript.Id > 0) + { + @($"#{CurrentScript.Id}") + } + else + { + [не записан] + } +
+
+ + + + + + +
+ + +
Наименование скрипта.
+
+
+ + +
+ @if (CurrentScript.Id > 0) + { +
+ + + +
+ } + else + { +
+ + +
+ } +
+
+ + + + + + +
+
+
+
+
+ } +} +
+ +

@ModalBodyText

+
+ +@code { + List ScriptsAll = new(); + ScriptModelDB CurrentScript = new(); + + EditForm? _formRef; + InputRichTextComponent? _textBoxRef; + CommandsListComponent? _commandsListRef; + ScriptContentionComponent? _contentionsRef; + + bool CanSaveScript + { + get + { + return !string.IsNullOrWhiteSpace(CurrentScript.Name) && + (CurrentScript.Id < 1 || script_name_orign != CurrentScript.Name || script_desc_orign != CurrentScript.Description); + } + } + + bool script_init_del = false; + string script_name_orign = string.Empty; + string script_desc_orign = string.Empty; + + async Task DeleteScript() + { + if (!script_init_del) + { + script_init_del = true; + return; + } + + if (CurrentScript.Id > 0) + { + IsBusyProgress = true; + ApiResponse rest = await _refit.ScriptDelete(CurrentScript.Id); + if (!rest.IsSuccessStatusCode) + { + ModalBodyText = $"Ошибка: {rest.StatusCode}"; + Modal?.Open("Ошибка"); + return; + } + if (rest.Content is null) + { + ModalBodyText = $"rest.Content is null"; + Modal?.Open("Ошибка"); + return; + } + if (!rest.Content.IsSuccess) + { + ModalBodyText = rest.Content.Message; + Modal?.Open("Ошибка"); + return; + } + ScriptsAll.RemoveAt(ScriptsAll.FindIndex(x => x.Id == CurrentScript.Id)); + IsBusyProgress = false; + } + else + { + ScriptsAll.RemoveAt(ScriptsAll.FindIndex(x => x.Id == CurrentScript.Id)); + } + CurrentScript = ScriptsAll.FirstOrDefault() ?? new(); + script_init_del = false; + } + + /// + /// Сброс состояния формы + /// + /// Режимы сброса состояния формы + void ResetFormState(ResetFormModesEnum mode) + { + script_init_del = false; + if (mode == ResetFormModesEnum.EditToOrign) + { + script_name_orign = CurrentScript.Name; + script_desc_orign = CurrentScript.Description ?? string.Empty; + } + else + { + CurrentScript.Name = script_name_orign; + CurrentScript.Description = script_desc_orign; + } + } + + ModalWindowComponent? Modal { get; set; } + string ModalBodyText { get; set; } = string.Empty; + + protected override async Task OnInitializedAsync() + { + IsBusyProgress = true; + ApiResponse rest_all_scripts = await _refit.ScriptsGetAll(); + if (rest_all_scripts.Content?.Scripts is null) + { + _snackbar.Add("res.Content?.Scripts is null ошибка {45E0C870-67E6-4F33-AC1A-644C828148E9}", Severity.Error, conf => conf.DuplicatesBehavior = SnackbarDuplicatesBehavior.Allow); + return; + } + ScriptsAll = rest_all_scripts.Content.Scripts; + + if (ScriptsAll.Any()) + CurrentScript = ScriptsAll.First(); + + ResetFormState(ResetFormModesEnum.EditToOrign); + IsBusyProgress = false; + } + + void AddNewScript() + { + string new_name = string.Empty; + foreach (int i in Enumerable.Range(1, int.MaxValue)) + { + new_name = $"Новый скрипт {i}"; + if (!ScriptsAll.Any(x => x.Name.ToLower() == new_name.ToLower())) + break; + } + + int _id = ScriptsAll.Any() ? ScriptsAll.Min(x => x.Id) - 1 : 0; + if (_id > 0) + _id = 0; + + ScriptsAll.Add(new() { Id = _id, Commands = new(), Name = new_name }); + CurrentScript = ScriptsAll.Last(); + } + + async Task SaveScriptHandle() + { + IsBusyProgress = true; + ApiResponse rest = await _refit.ScriptUpdateOrCreate(new EntryDescriptionModel() { Id = CurrentScript.Id, Name = CurrentScript.Name, Description = CurrentScript.Description }); + if (rest.Content?.Scripts is null) + { + _snackbar.Add("rest.Content?.Scripts is null ошибка {093F4C03-E89C-40F9-931D-EDB389FF56A6}", Severity.Error, conf => conf.DuplicatesBehavior = SnackbarDuplicatesBehavior.Allow); + return; + } + + ScriptModelDB src = rest.Content.Scripts.First(x => x.Name == CurrentScript.Name); + CurrentScript.Id = src.Id; + CurrentScript.Name = src.Name; + CurrentScript.Description = src.Description; + ResetFormState(ResetFormModesEnum.EditToOrign); + + int[] rows_for_del = ScriptsAll.Where(x => x.Id > 0 && !rest.Content.Scripts.Any(y => y.Id == x.Id)).Select(x => x.Id).Distinct().ToArray(); + while (ScriptsAll.Any(x => rows_for_del.Contains(x.Id))) + { + ScriptsAll.RemoveAt(ScriptsAll.FindIndex(x => rows_for_del.Contains(x.Id))); + } + ScriptModelDB[] rows_for_add = rest.Content.Scripts.Where(x => x.Id != src.Id && !ScriptsAll.Any(y => y.Id == x.Id)).ToArray(); + if (rows_for_add.Any()) + { + ScriptsAll.AddRange(rows_for_add); + } + IsBusyProgress = false; + } +} \ No newline at end of file diff --git a/ab-log.web/ab-log.web.Client/Pages/TriggersPage.razor b/ab-log.web/ab-log.web.Client/Pages/TriggersPage.razor new file mode 100644 index 00000000..c49bee81 --- /dev/null +++ b/ab-log.web/ab-log.web.Client/Pages/TriggersPage.razor @@ -0,0 +1,423 @@ +@page "/triggers-page" + +@using RazorLib.Shared.navs.tabs +@using RazorLib.Shared; +@using SharedLib; +@using BlazorLib; +@using MudBlazor; +@using Refit; + +@inject IRefitScriptsService _refit_scripts; +@inject IRefitTriggersService _refit_trig; +@inject IRefitHardwaresService _refit_hw; +@inject ILogger _logger; +@inject ISnackbar _snack_bar; + +@inherits BlazorBusyComponentBaseModel + +Тригеры + + + +@if (IsBusyProgress) +{ +
+
+ Загрузка... +
+
+} +else +{ +
+
+ + + @foreach (TrigerModelDB trig in Triggers.OrderBy(x => x.Name)) + { + + @trig.Name + [#@(trig.Id)] + + } + + +
+
+ @if (int.Parse(selectedValue.ToString() ?? "0") == 0) + { +
+
+

Нет ни одного тригера.

+
+ +
+ } + else + { +
+
+
+ Тригер: '@(CurrentTrigger.Name)' + @if (CurrentTrigger.Id > 0) + { + @($"#{CurrentTrigger.Id}") + } + else + { + [не записан] + } +
+
+ + + + + + +
+
+
+ + +
Наименование скрипта.
+
+
+ + +
Запускаемая задача.
+
+
+
+
+ + +
+
+ + +
+ @if (CurrentTrigger.Id > 0) + { +
+ + + +
+ } + else + { +
+ + @if (trigger_init_del) + { + + } + +
+ } +
+
+ + + +
+
+
+ } +
+
+} + + +

@ModalBodyText

+
+ +@code { + public EntryNestedModel[] EntriesTreeHW { get; set; } = Array.Empty(); + + ConditionsComponent? conditions_ref; + MudList? _listRef; + + object _selVal = 0; + object selectedValue + { + get + { + if (_selVal.ToString() == "0" && _curTrig.Id != 0) + { + return _curTrig.Id; + } + if (_selVal.ToString() == "0" && Triggers.Any()) + { + _curTrig = Triggers.First(); + return _curTrig.Id; + } + return _selVal; + } + set + { + ResetFormToOrignState(); + _selVal = value; + if (_selVal.ToString() != _curTrig.Id.ToString() && int.TryParse(_selVal.ToString(), out int selected_id)) + { + _curTrig = Triggers.FirstOrDefault(x => x.Id == selected_id) ?? new(); + } + if (conditions_ref is not null) + conditions_ref?.Rest(_curTrig.Id, ConditionsTypesEnum.Trigger); + + trigger_name_orign = CurrentTrigger.Name; + trigger_desc_orign = CurrentTrigger.Description ?? ""; + trigger_is_off = CurrentTrigger.IsDisable; + trigger_script = CurrentTrigger.ScriptId; + } + } + + TrigerModelDB _curTrig = new(); + TrigerModelDB CurrentTrigger + { + get + { + if (_curTrig.Id == 0 && _selVal.ToString() != "0" && int.TryParse(_selVal.ToString(), out int selected_id)) + { + _curTrig = Triggers.FirstOrDefault(x => x.Id == selected_id) ?? new(); + } + + return _curTrig; + } + set + { + _curTrig = value; + + if (_selVal.ToString() != _curTrig.Id.ToString() && int.TryParse(_selVal.ToString(), out int selected_id)) + { + _selVal = Triggers.FirstOrDefault(x => x.Id == selected_id)?.Id ?? 0; + } + } + } + + EditForm? form; + InputRichTextComponent? _textBox; + + List Triggers = new(); + List Scripts = new(); + ShowMessagesComponent? showMessages; + + ModalWindowComponent? Modal { get; set; } + string ModalBodyText { get; set; } = string.Empty; + + bool CanSaveTrigger + { + get + { + return !string.IsNullOrWhiteSpace(CurrentTrigger.Name) && + (CurrentTrigger.Id < 1 || trigger_script != CurrentTrigger.ScriptId || trigger_is_off != CurrentTrigger.IsDisable || trigger_name_orign != CurrentTrigger.Name || trigger_desc_orign != CurrentTrigger.Description); + } + } + + protected override async Task OnInitializedAsync() + { + IsBusyProgress = true; + + ApiResponse rest_all_scripts = await _refit_scripts.ScriptsGetAll(); + + if (rest_all_scripts.Content?.Scripts is null) + { + _snack_bar.Add("rest_all_scripts.Content?.Scripts is null ошибка {5B557F50-0F44-40CD-A5B4-10A58F78D701}", Severity.Error, conf => conf.DuplicatesBehavior = SnackbarDuplicatesBehavior.Allow); + return; + } + + Scripts = rest_all_scripts.Content.Scripts; + + ApiResponse rest_all_triggers = await _refit_trig.TriggersGetAll(); + if (rest_all_triggers.Content?.Triggers is null) + { + _snack_bar.Add("rest_all_triggers.Content?.Triggers is null ошибка {4334BFB1-481E-460D-9E21-B8782DEA3DCA}", Severity.Error, conf => conf.DuplicatesBehavior = SnackbarDuplicatesBehavior.Allow); + return; + } + Triggers = new(rest_all_triggers.Content.Triggers.OrderBy(x => x.Name)); + if (Triggers.Any()) + _curTrig = Triggers.First(); + + ApiResponse rest_hw_tree = await _refit_hw.HardwaresGetTreeNestedEntries(); + if (rest_hw_tree.Content?.Entries is null) + { + _snack_bar.Add("rest_hw_tree.Content?.Entries is null ошибка {7A0F6B2C-8286-4CB5-84AB-7F954831FE94}", Severity.Error, conf => conf.DuplicatesBehavior = SnackbarDuplicatesBehavior.Allow); + return; + } + EntriesTreeHW = rest_hw_tree.Content.Entries; + + trigger_name_orign = _curTrig.Name; + trigger_desc_orign = _curTrig.Description ?? ""; + trigger_is_off = _curTrig.IsDisable; + trigger_script = _curTrig.ScriptId; + + ResetFormToOrignState(); + IsBusyProgress = false; + } + + string trigger_name_orign = string.Empty; + string trigger_desc_orign = string.Empty; + bool trigger_is_off = false; + int trigger_script; + // + bool trigger_init_del = false; + + void AddNewTrigger() + { + string new_name = string.Empty; + foreach (int i in Enumerable.Range(1, int.MaxValue)) + { + new_name = $"тригер new:{i}"; + if (!Triggers.Any(x => x.Name.ToLower() == new_name.ToLower())) + break; + } + + int _id = Triggers.Any() ? Triggers.Min(x => x.Id) - 1 : -1; + if (_id > -1) + _id = -1; + + Triggers.Add(new() { Id = _id, Name = new_name, Conditions = new() }); + selectedValue = Triggers.Last().Id; + } + + void ResetFormToOrignState() + { + trigger_init_del = false; + CurrentTrigger.Name = trigger_name_orign; + CurrentTrigger.Description = trigger_desc_orign; + CurrentTrigger.IsDisable = trigger_is_off; + CurrentTrigger.ScriptId = trigger_script; + _textBox?.SetValue(trigger_desc_orign); + } + + async Task DeleteTrigger() + { + if (!trigger_init_del) + { + trigger_init_del = true; + return; + } + IsBusyProgress = true; + if (CurrentTrigger.Id > 0) + { + var rest = await _refit_trig.TriggerDelete(CurrentTrigger.Id); + if (!rest.IsSuccessStatusCode) + { + ModalBodyText = $"Ошибка: {rest.StatusCode}"; + Modal?.Open("Ошибка"); + return; + } + if (rest.Content is null) + { + ModalBodyText = $"rest.Content is null"; + Modal?.Open("Ошибка"); + return; + } + if (!rest.Content.IsSuccess) + { + ModalBodyText = rest.Content.Message; + Modal?.Open("Ошибка"); + return; + } + Triggers.RemoveAt(Triggers.FindIndex(x => x.Id == CurrentTrigger.Id)); + } + else + { + Triggers.RemoveAt(Triggers.FindIndex(x => x.Id == CurrentTrigger.Id)); + } + + selectedValue = Triggers.FirstOrDefault()?.Id ?? 0; + + ResetFormToOrignState(); + + IsBusyProgress = false; + } + + async Task SaveTriggerHandle() + { + IsBusyProgress = true; + ApiResponse rest = await _refit_trig.TriggerUpdateOrCreate(CurrentTrigger); + + if (!rest.IsSuccessStatusCode) + { + ModalBodyText = $"Ошибка выполенния rest запроса: {rest.StatusCode}"; + Modal?.Open("Ошибка"); + IsBusyProgress = false; + return; + } + + if (rest.Content.IsSuccess != true) + { + ModalBodyText = rest.Content.Message; + Modal?.Open("Ошибка"); + IsBusyProgress = false; + return; + } + + showMessages?.ShowMessages(rest.Content.Messages); + + if (rest.Content.Triggers is null) + { + _snack_bar.Add("", Severity.Error, conf => conf.DuplicatesBehavior = SnackbarDuplicatesBehavior.Allow); + return; + } + + TrigerModelDB src = rest.Content.Triggers.First(x => x.Name == CurrentTrigger.Name); + _curTrig.Id = src.Id; + _curTrig.Name = src.Name; + _curTrig.Description = src.Description; + _curTrig.IsDisable = src.IsDisable; + _curTrig.ScriptId = src.ScriptId; + + trigger_name_orign = src.Name; + trigger_desc_orign = src.Description ?? ""; + trigger_is_off = src.IsDisable; + trigger_script = src.ScriptId; + ResetFormToOrignState(); + + int[] rows_for_del = Triggers.Where(x => x.Id > 0 && !rest.Content.Triggers.Any(y => y.Id == x.Id)).Select(x => x.Id).Distinct().ToArray(); + while (Triggers.Any(x => rows_for_del.Contains(x.Id))) + { + Triggers.RemoveAt(Triggers.FindIndex(x => rows_for_del.Contains(x.Id))); + } + TrigerModelDB[] rows_for_add = rest.Content.Triggers.Where(x => x.Id != src.Id && !Triggers.Any(y => y.Id == x.Id)).ToArray(); + if (rows_for_add.Any()) + { + Triggers.AddRange(rows_for_add); + } + + Triggers.RemoveAt(Triggers.FindIndex(x => x.Id == src.Id)); + Triggers.Add(src); + selectedValue = src.Id; + + IsBusyProgress = false; + } +} \ No newline at end of file diff --git a/ab-log.web/ab-log.web.client/Pages/Counter.razor b/ab-log.web/ab-log.web.client/Pages/Counter.razor deleted file mode 100644 index 6b9e8cb4..00000000 --- a/ab-log.web/ab-log.web.client/Pages/Counter.razor +++ /dev/null @@ -1,19 +0,0 @@ -@page "/counter" -@rendermode InteractiveWebAssembly - -Counter - -

Counter

- -

Current count: @currentCount

- - - -@code { - private int currentCount = 0; - - private void IncrementCount() - { - currentCount++; - } -} diff --git a/ab-log.web/ab-log.web.client/_Imports.razor b/ab-log.web/ab-log.web.client/_Imports.razor index e6c05314..83a16481 100644 --- a/ab-log.web/ab-log.web.client/_Imports.razor +++ b/ab-log.web/ab-log.web.client/_Imports.razor @@ -7,3 +7,10 @@ @using Microsoft.AspNetCore.Components.Web.Virtualization @using Microsoft.JSInterop @using ABLog4.web.client +@using RazorLib.Shared.hardwares +@using RazorLib.Shared.settings +@using RazorLib.Shared +@using RazorLib +@using BlazorLib +@using SharedLib +@using MudBlazor diff --git a/ab-log.web/ab-log.web.client/ab-log.web.client.csproj b/ab-log.web/ab-log.web.client/ab-log.web.client.csproj index 09106910..ca9ddd4e 100644 --- a/ab-log.web/ab-log.web.client/ab-log.web.client.csproj +++ b/ab-log.web/ab-log.web.client/ab-log.web.client.csproj @@ -28,4 +28,28 @@ + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + diff --git a/ab-log.web/ab-log.web/Components/_Imports.razor b/ab-log.web/ab-log.web/Components/_Imports.razor index 112bdf8e..274587ab 100644 --- a/ab-log.web/ab-log.web/Components/_Imports.razor +++ b/ab-log.web/ab-log.web/Components/_Imports.razor @@ -9,3 +9,6 @@ @using ABLog4.web @using ABLog4.web.client @using ABLog4.web.Components +@using MudBlazor +@using SharedLib +@using RazorLib diff --git a/old.v3/ab-log-rc/ab-log-rc.csproj b/old.v3/ab-log-rc/ab-log-rc.csproj index 9bff1ed2..980ec9b6 100644 --- a/old.v3/ab-log-rc/ab-log-rc.csproj +++ b/old.v3/ab-log-rc/ab-log-rc.csproj @@ -37,7 +37,7 @@ - + @@ -115,8 +115,8 @@ - - + + Always