diff --git a/TIAM.Services/SignalRTags.cs b/TIAM.Services/SignalRTags.cs index 6011991b..d55f0f33 100644 --- a/TIAM.Services/SignalRTags.cs +++ b/TIAM.Services/SignalRTags.cs @@ -13,9 +13,9 @@ public class SignalRTags : AcSignalRTags [SignalMessageTag(typeof(SignalPostJsonDataMessage), typeof(SignalResponseMessage), null, null)] public const int UpdateTransferAsync = 7; public const int AddTransferAsync = 8; - public const int DeleteTransferAsync = 9; + public const int RemoveTransferAsync = 9; public const int GetCompaniesAsync = 10; public const int UpdateCompanyAsync = 11; - public const int CreateCompanyAsync = 12; - public const int DeleteCompanyAsync = 13; + public const int AddCompanyAsync = 12; + public const int RemoveCompanyAsync = 13; } \ No newline at end of file diff --git a/TIAMSharedUI/Pages/User/MyServiceProviders.razor b/TIAMSharedUI/Pages/User/MyServiceProviders.razor index 65ec8a5b..801c282c 100644 --- a/TIAMSharedUI/Pages/User/MyServiceProviders.razor +++ b/TIAMSharedUI/Pages/User/MyServiceProviders.razor @@ -10,11 +10,13 @@ @using AyCode.Services.Loggers @using TIAMWebApp.Shared.Application.Services @using AyCode.Core.Helpers +@using TIAMSharedUI.Shared.Components.Grids @layout AdminLayout @inject IEnumerable LogWriters @inject IStringLocalizer localizer @inject ISessionService SessionService @inject IServiceProviderDataService ServiceProviderDataService +@inject AdminSignalRClient AdminSignalRClient;

Properties

@@ -62,14 +64,14 @@ *@ - @@ -83,7 +85,7 @@ - + @@ -107,8 +109,7 @@ @code { private LoggerClient _logger; - IGrid Grid { get; set; } - Company[]? ServiceProviderData { get; set; } + private CompanyGrid _gridCompany; public ServiceProviderWizardModel myModel = new ServiceProviderWizardModel(); @@ -145,7 +146,7 @@ protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) - await Grid.StartEditRowAsync(0); + await _gridCompany.StartEditRowAsync(0); } void Grid_CustomizeEditModel(GridCustomizeEditModelEventArgs e) @@ -158,34 +159,6 @@ } } - async Task Grid_EditModelSaving(GridEditModelSavingEventArgs e) - { - if (e.IsNew) - //add new orderData to orderData array - _logger.Info("New orderData added"); - //await NwindDataService.InsertEmployeeAsync((EditableEmployee)e.EditModel); - else - _logger.Info("orderData updated"); - //modify orderData where orderData.Name == e.EditModel.Name - - //await NwindDataService.UpdateEmployeeAsync((EditableEmployee)e.DataItem, (EditableEmployee)e.EditModel); - - await UpdateDataAsync(); - } - async Task Grid_DataItemDeleting(GridDataItemDeletingEventArgs e) - { - //await NwindDataService.RemoveEmployeeAsync((EditableEmployee)e.DataItem); - //remove orderData from orderData array - _logger.Info("orderData deleted"); - //await UpdateDataAsync(); - } - async Task UpdateDataAsync() - { - //DataSource = await NwindDataService.GetEmployeesEditableAsync(); - //refresh grid - _logger.Info("orderData grid refreshed"); - } - protected override Task OnInitializedAsync() { _logger = new LoggerClient(LogWriters.ToArray()); diff --git a/TIAMSharedUI/Pages/User/SysAdmins/ManageServiceProviders.razor b/TIAMSharedUI/Pages/User/SysAdmins/ManageServiceProviders.razor index 87137cf9..5dee744d 100644 --- a/TIAMSharedUI/Pages/User/SysAdmins/ManageServiceProviders.razor +++ b/TIAMSharedUI/Pages/User/SysAdmins/ManageServiceProviders.razor @@ -20,6 +20,7 @@ @using MessagePack.Resolvers @using AyCode.Core.Extensions; @using AyCode.Utils.Extensions +@using TIAMSharedUI.Shared.Components.Grids @layout AdminLayout @inject IEnumerable LogWriters @inject IStringLocalizer localizer @@ -27,7 +28,7 @@ @inject IServiceProviderDataService serviceProviderDataService @inject IUserDataService userDataService @inject ISessionService sessionService -@inject DevAdminSignalClient devAdminSignalClient; +@inject AdminSignalRClient AdminSignalRClient; Admin - Companies
@@ -35,11 +36,9 @@

Manage transfers here!

- + - + @* *@
- + @@ -113,8 +112,7 @@ if (keyField.IsNullOrEmpty()) { - string buttonText = "Set owner"; - + } else { @@ -122,17 +120,17 @@ } } - + @* - - *@ + + *@ @* - + *@ @@ -154,7 +152,7 @@ - +
@@ -174,28 +172,32 @@ //public Transfer myModel = new Transfer(); - public List ServiceProviderDataList { get; set; } + //public List ServiceProviderDataList { get; set; } + + private bool _sendMailPopupVisible; + private bool _setOwnerPopupVisible; + + private CompanyGrid _gridCompany; + private bool _autoCollapseDetailRow; - bool SendMailPopupVisible { get; set; } - bool SetOwnerPopupVisible { get; set; } public List IgnoreList = [ "ReceiverEmailAddress", - "ReceiverFullName", - "ReceiverId", - "SenderEmailAddress", - "SenderFullName", - "SenderId", - "ContextId", + "ReceiverFullName", + "ReceiverId", + "SenderEmailAddress", + "SenderFullName", + "SenderId", + "ContextId", ]; private MessageWizardModel _messageWizardModel = new(); private string Email { get; set; } = "email@email.com"; string EmailMask { get; set; } = @"(\w|[.-])+@(\w|-)+\.(\w|-){2,4}"; + DateTime StartDate { get; set; } = DateTime.Today; DxSchedulerDataStorage _dataStorage = new(); - - + void SendMail(Company item) { _logger.Info($"Sending mail to {item.OwnerId}, {item.Id}"); @@ -204,14 +206,14 @@ _messageWizardModel.SenderEmailAddress = ""; _messageWizardModel.ReceiverEmailAddress = ""; _messageWizardModel.ReceiverFullName = ""; - SendMailPopupVisible = true; + _sendMailPopupVisible = true; } void SetOwnerPopup(Company item) { _logger.Info($"Setting owner of {item.OwnerId}, {item.Id}"); - SetOwnerPopupVisible = true; + _setOwnerPopupVisible = true; } async Task SetOwner(Guid CompanyId) @@ -222,23 +224,22 @@ //overwrite ServiceProvider ownerid var target = await serviceProviderDataService.GetServiceProviderByIdAsync(CompanyId); if (target == null) - { + { return null; } else { target.OwnerId = userModelDto.Id; - var result = await serviceProviderDataService.UpdateServiceProviderAsync(target); + var result = await serviceProviderDataService.UpdateServiceProviderAsync(target); + return result; - } - } void CancelCreateClick() { - SendMailPopupVisible = false; + _sendMailPopupVisible = false; } void EulaPopupClosed() { @@ -300,102 +301,35 @@ companyEditModel.OwnerId = Guid.Empty; companyEditModel.ProfileId = Guid.NewGuid(); } - - } - - async Task Grid_EditModelSaving(GridEditModelSavingEventArgs e) - { - Company resultCompany = null; - if (e.IsNew) - { - _logger.Info("New company adding"); - resultCompany = await serviceProviderDataService.CreateServiceProviderAsync((Company)e.EditModel); - } - else - { - _logger.Info("company updating at id " + ((Company)e.EditModel).Id); - - resultCompany = await serviceProviderDataService.UpdateServiceProviderAsync((Company)e.EditModel); - - } - - if (resultCompany!=null) - { - //TODO: ne a teljes grid-et refresh-eljük, elég lenne csak az adott sort! - J. - await UpdateDataAsync(); - } - } - - async Task Grid_DataItemDeleting(GridDataItemDeletingEventArgs e) - { - var company = (Company)e.DataItem; - //await NwindDataService.RemoveEmployeeAsync((EditableEmployee)e.DataItem); - //remove orderData from orderData array - _logger.Info($"companyData deleting; companyId: {company.Id}"); - - var response = await devAdminSignalClient.PostDataAsync(SignalRTags.DeleteCompanyAsync, company); - - //resultCompany = await serviceProviderDataService.DeleteServiceProviderAsync(company.Id); - //await UpdateDataAsync(); - } - - async Task UpdateDataAsync() - { - ServiceProviderDataList = await serviceProviderDataService.GetServiceProvidersAsync(); - //StateHasChanged(); - _logger.Info("orderData grid refreshed"); } protected override async Task OnInitializedAsync() { _logger = new LoggerClient(LogWriters.ToArray()); - await UpdateDataAsync(); - - //var transfers = await devAdminSignalClient.GetAllAsync>(SignalRTags.GetTransfersAsync); - //InitializeDataSources(transfers ?? []); - - - //InitializeDataSources(await transferDataService.GetTransfersAsync()); - - base.OnInitializedAsync(); + await base.OnInitializedAsync(); } - - - - void ColumnChooserButton_Click() { - Grid2.ShowColumnChooser(); + _gridCompany.ShowColumnChooser(); } - IGrid Grid2 { get; set; } - object MasterGridData { get; set; } - bool AutoCollapseDetailRow { get; set; } - protected override void OnAfterRender(bool firstRender) { if (firstRender) { - Grid2.ExpandDetailRow(0); + _gridCompany.ExpandDetailRow(0); } } void AutoCollapseDetailRow_Changed(bool newValue) { - AutoCollapseDetailRow = newValue; + _autoCollapseDetailRow = newValue; if (!newValue) return; - Grid2.BeginUpdate(); - Grid2.CollapseAllDetailRows(); - Grid2.ExpandDetailRow(0); - Grid2.EndUpdate(); + _gridCompany.BeginUpdate(); + _gridCompany.CollapseAllDetailRows(); + _gridCompany.ExpandDetailRow(0); + _gridCompany.EndUpdate(); } -} - - - - - - - } \ No newline at end of file +} \ No newline at end of file diff --git a/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor b/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor index 8167071a..3dd18d81 100644 --- a/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor +++ b/TIAMSharedUI/Pages/User/SysAdmins/ManageTransfers.razor @@ -11,15 +11,10 @@ @using TIAMWebApp.Shared.Application.Models.PageModels @using TIAMWebApp.Shared.Application.Utility @using AyCode.Services.Loggers -@using AyCode.Services.SignalRs -@using TIAMWebApp.Shared.Application.Services -@using MessagePack -@using MessagePack.Resolvers -@using AyCode.Core.Extensions; -@using AyCode.Core -@using AyCode.Core.Helpers -@using AyCode.Interfaces.Entities @using TIAM.Services +@using TIAMWebApp.Shared.Application.Services +@using TIAMSharedUI.Shared.Components +@using TIAMSharedUI.Shared.Components.Grids @using TIAM.Models.Dtos.Users @layout AdminLayout @inject IEnumerable LogWriters @@ -27,7 +22,7 @@ @inject IWizardProcessor wizardProcessor @inject ITransferDataService transferDataService @inject ISessionService sessionService -@inject DevAdminSignalClient devAdminSignalClient; +@inject AdminSignalRClient AdminSignalRClient; Transfers
@@ -37,7 +32,7 @@
- +@* + + *@ + @@ -160,7 +170,7 @@ @EditFormContext.GetEditor("FromAddress") - + @@ -179,8 +189,7 @@ - - + @@ -204,7 +213,7 @@ - + @@ -222,39 +231,32 @@ @code { private LoggerClient _logger; - //public Transfer myModel = new Transfer(); - - public List TransferDataList { get; set; } - - bool PopupVisible { get; set; } - - - IGrid Grid2 { get; set; } - object MasterGridData { get; set; } - bool AutoCollapseDetailRow { get; set; } + private bool _popupVisible; + private bool _autoCollapseDetailRow; + private TransferGrid _gridTransfer; public List IgnoreList = [ "ReceiverEmailAddress", - "ReceiverFullName", - "ReceiverId", - "SenderEmailAddress", - "SenderFullName", - "SenderId", - "ContextId", + "ReceiverFullName", + "ReceiverId", + "SenderEmailAddress", + "SenderFullName", + "SenderId", + "ContextId", ]; public List Statuses { get; set; } = [ new(Convert.ToInt16(TransferStatusType.OrderSubmitted), "Order submitted"), - new(Convert.ToInt16(TransferStatusType.OrderConfirmed), "Order confirmed"), - new(Convert.ToInt16(TransferStatusType.AssignedToDriver), "Assigned to driver"), - new(Convert.ToInt16(TransferStatusType.DriverConfirmed), "Driver confirmed"), - new(Convert.ToInt16(TransferStatusType.DriverEnRoute), "Driver enroute"), - new(Convert.ToInt16(TransferStatusType.PassengerPickup), "Passenger in car"), - new(Convert.ToInt16(TransferStatusType.Finished), "Finished"), - new(Convert.ToInt16(TransferStatusType.UserCanceled), "User cancelled"), - new(Convert.ToInt16(TransferStatusType.AdminDenied), "Admin cancelled") + new(Convert.ToInt16(TransferStatusType.OrderConfirmed), "Order confirmed"), + new(Convert.ToInt16(TransferStatusType.AssignedToDriver), "Assigned to driver"), + new(Convert.ToInt16(TransferStatusType.DriverConfirmed), "Driver confirmed"), + new(Convert.ToInt16(TransferStatusType.DriverEnRoute), "Driver enroute"), + new(Convert.ToInt16(TransferStatusType.PassengerPickup), "Passenger in car"), + new(Convert.ToInt16(TransferStatusType.Finished), "Finished"), + new(Convert.ToInt16(TransferStatusType.UserCanceled), "User cancelled"), + new(Convert.ToInt16(TransferStatusType.AdminDenied), "Admin cancelled") ]; private MessageWizardModel _messageWizardModel = new(); @@ -273,19 +275,21 @@ _messageWizardModel.SenderEmailAddress = "info@touriam.com"; _messageWizardModel.ReceiverEmailAddress = item.ContactEmail; _messageWizardModel.ReceiverFullName = item.FullName; - PopupVisible = true; + _popupVisible = true; } void CancelCreateClick() { - PopupVisible = false; + _popupVisible = false; } + void EulaPopupClosed() { //cancel clicked } + void EulaPopupClosing(PopupClosingEventArgs args) { //myModel = new TransferWizardModel(); @@ -299,7 +303,7 @@ { var messageModel = result as MessageWizardModel; messageModel.ContextId = _messageWizardModel.ContextId; - //messageModel.SenderId = sessionService.User.UserId; + //messageModel.SenderId = sessionService.User.UserId; string FormatEmailContent() { @@ -307,11 +311,12 @@

Dear {messageModel.SenderFullName},

-

{messageModel.Content}:

+

{messageModel.Content}:

Best regards,
Tour I Am team

"; } + messageModel.Content = FormatEmailContent(); _logger.Info(messageModel.Content); @@ -322,22 +327,23 @@ void Grid_CustomizeElement(GridCustomizeElementEventArgs e) { - if (e.ElementType == GridElementType.DataRow && (System.Byte)e.Grid.GetRowValue(e.VisibleIndex, "TransferStatusType") == 5) + if (e.ElementType == GridElementType.DataRow && (byte)e.Grid.GetRowValue(e.VisibleIndex, "TransferStatusType") == 5) { e.CssClass = "bg-important"; } - else if (e.ElementType == GridElementType.DataRow && (System.Byte)e.Grid.GetRowValue(e.VisibleIndex, "TransferStatusType") > 5 && (System.Byte)e.Grid.GetRowValue(e.VisibleIndex, "TransferStatusType") < 35) + else if (e.ElementType == GridElementType.DataRow && (byte)e.Grid.GetRowValue(e.VisibleIndex, "TransferStatusType") > 5 && (byte)e.Grid.GetRowValue(e.VisibleIndex, "TransferStatusType") < 35) { e.CssClass = "bg-attention"; } - else if (e.ElementType == GridElementType.DataRow && (System.Byte)e.Grid.GetRowValue(e.VisibleIndex, "TransferStatusType") == 35) + else if (e.ElementType == GridElementType.DataRow && (byte)e.Grid.GetRowValue(e.VisibleIndex, "TransferStatusType") == 35) { e.CssClass = "bg-finished"; } - else if (e.ElementType == GridElementType.DataRow && (System.Byte)e.Grid.GetRowValue(e.VisibleIndex, "TransferStatusType") > 35) + else if (e.ElementType == GridElementType.DataRow && (byte)e.Grid.GetRowValue(e.VisibleIndex, "TransferStatusType") > 35) { e.CssClass = "bg-cancel"; } + if (e.ElementType == GridElementType.HeaderCell) { e.Style = "background-color: rgba(0, 0, 0, 0.08)"; @@ -361,64 +367,35 @@ transferEditModel.ContactEmail = "your@email.address"; } - async Task Grid_DataItemDeleting(GridDataItemDeletingEventArgs e) + private void DataSourceChanged(IList transfers) { - var transfer = (Transfer)e.DataItem; + _logger.Info("DataSourceChanged called"); - //await NwindDataService.RemoveEmployeeAsync((EditableEmployee)e.DataItem); - //remove orderData from orderData array - _logger.Info("transfer delete"); - - PostDataToServerAsync(transfer, SignalRTags.DeleteTransferAsync, true).Forget(); - //await UpdateDataAsync(); + InitializeAppointments(transfers); } - - async Task Grid_EditModelSaving(GridEditModelSavingEventArgs e) + private void DataSourceItemChanging(Transfer transfer) { - var transfer = (Transfer)e.EditModel; - var logText = e.IsNew ? "add" : "update"; - - _logger.Info($"EditModelSaving, {logText} transfer; transferId " + transfer.Id); - - PostDataToServerAsync(transfer, e.IsNew ? SignalRTags.AddTransferAsync : SignalRTags.UpdateTransferAsync).Forget(); - - //await transferDataService.CreateTransfer((TransferWizardModel)e.EditModel); - //transfer = await transferDataService.UpdateTransferAsync(transfer); + _logger.Info("DataSourceItemChanging called"); } - private Task PostDataToServerAsync(T transfer, int messageTag, bool isDelete = false) where T : Transfer //IEntityGuid + private void DataSourceItemChanged(Transfer transfer) { - _logger.Info("PostDataToServerAsync called; transferId " + transfer.Id); - - RefreshDataSources(transfer, isDelete); //egyből látszódik a változás a grid-ben, nem csak a callback lefutásakor! felhasználóbarátabb... - J. - - return devAdminSignalClient.PostDataAsync(messageTag, transfer, repsonse => - { - if (repsonse.Status != SignalResponseStatus.Success || repsonse.ResponseData == null) - { - UpdateAllDataAsync().Forget(); - return; - } - - RefreshDataSources(repsonse.ResponseData, isDelete); - StateHasChanged(); - }); - - //transfer = await devAdminSignalClient.PostDataAsync(SignalRTags.UpdateTransferAsync, transfer); + _logger.Info("DataSourceItemChanged called"); } - private void RefreshDataSources(Transfer transfer, bool isDelete) + private void DataItemSaving(GridEditModelSavingEventArgs e) { - var transferIndex = TransferDataList.FindIndex(x => x.Id == transfer.Id); + _logger.Info("DataItemSaving called"); + } - if (isDelete && transferIndex > -1) TransferDataList.RemoveAt(transferIndex); - else - { - if (transferIndex > -1) TransferDataList[transferIndex] = transfer; - else TransferDataList.Add(transfer); - } + private void DataItemDeleting(GridDataItemDeletingEventArgs e) + { + _logger.Info($"DataItemDeleting OnItemDeleting"); + } + private void RefreshAppointments(Transfer transfer, bool isDelete) + { var appointmentIndex = AppointmentModels.FindIndex(x => x.SourceId == transfer.Id); if (isDelete && appointmentIndex > -1) AppointmentModels.RemoveAt(appointmentIndex); else @@ -430,41 +407,20 @@ } } - public Task UpdateAllDataAsync() - { - _logger.Info("UpdateAllDataAsync called"); - - return devAdminSignalClient.GetAllAsync>(SignalRTags.GetTransfersAsync, response => - { - if (response.Status == SignalResponseStatus.Error) - return; - - InitializeDataSources(response.ResponseData ?? []); - StateHasChanged(); - }); - } - protected override Task OnInitializedAsync() { _logger = new LoggerClient(LogWriters.ToArray()); - UpdateAllDataAsync().Forget(); - - //var transfers = await devAdminSignalClient.GetAllAsync>(SignalRTags.GetTransfersAsync); - //InitializeDataSources(transfers ?? []); - - - //InitializeDataSources(await transferDataService.GetTransfersAsync()); - return base.OnInitializedAsync(); } - private void InitializeDataSources(List transferDataList) + private void InitializeAppointments(ICollection transferDataList) { - TransferDataList = transferDataList; - AppointmentModels = new List(TransferDataList.Count); + _logger.Info("InitializeAppointments called"); - foreach (var transfer in TransferDataList) + AppointmentModels = new List(transferDataList.Count); + + foreach (var transfer in transferDataList) { // var bnm = DataStorage.CreateAppointmentItem(); // bnm.Start = transfer.Appointment; @@ -502,7 +458,7 @@ void ColumnChooserButton_Click() { - Grid2.ShowColumnChooser(); + _gridTransfer.ShowColumnChooser(); } @@ -510,24 +466,18 @@ { if (firstRender) { - Grid2.ExpandDetailRow(0); + _gridTransfer.ExpandDetailRow(0); } } + void AutoCollapseDetailRow_Changed(bool newValue) { - AutoCollapseDetailRow = newValue; + _autoCollapseDetailRow = newValue; if (!newValue) return; - Grid2.BeginUpdate(); - Grid2.CollapseAllDetailRows(); - Grid2.ExpandDetailRow(0); - Grid2.EndUpdate(); + _gridTransfer.BeginUpdate(); + _gridTransfer.CollapseAllDetailRows(); + _gridTransfer.ExpandDetailRow(0); + _gridTransfer.EndUpdate(); } -} - - - - - - - } \ No newline at end of file +} \ No newline at end of file diff --git a/TIAMSharedUI/Shared/Components/Grids/CompanyDetailGrid.cs b/TIAMSharedUI/Shared/Components/Grids/CompanyDetailGrid.cs new file mode 100644 index 00000000..7e3d2de8 --- /dev/null +++ b/TIAMSharedUI/Shared/Components/Grids/CompanyDetailGrid.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Components; + +namespace TIAMSharedUI.Shared.Components.Grids; + +public class CompanyDetailGrid : CompanyGrid +{ + protected override Task SetParametersAsyncCore(ParameterView parameters) + { + var isFirst = IsFirstInitializeParameters; + + return base.SetParametersAsyncCore(parameters); + + if (isFirst) + { + } + } +} \ No newline at end of file diff --git a/TIAMSharedUI/Shared/Components/Grids/CompanyGrid.cs b/TIAMSharedUI/Shared/Components/Grids/CompanyGrid.cs new file mode 100644 index 00000000..b8cf1f58 --- /dev/null +++ b/TIAMSharedUI/Shared/Components/Grids/CompanyGrid.cs @@ -0,0 +1,32 @@ +using Microsoft.AspNetCore.Components; +using TIAM.Entities.ServiceProviders; +using TIAM.Services; + +namespace TIAMSharedUI.Shared.Components.Grids; + +public class CompanyGrid : TiamGrid +{ + public CompanyGrid() : base() + { + GridName = nameof(CompanyGrid); + + GetAllMessageTag = SignalRTags.GetCompaniesAsync; + AddMessageTag = SignalRTags.AddCompanyAsync; + UpdateMessageTag = SignalRTags.UpdateCompanyAsync; + RemoveMessageTag = SignalRTags.RemoveCompanyAsync; + } + + protected override Task SetParametersAsyncCore(ParameterView parameters) + { + if (!IsFirstInitializeParameters) + { + //ShowFilterRow = true; + //ShowGroupPanel = true; + //AllowSort = false; + + //etc... + } + + return base.SetParametersAsyncCore(parameters); + } +} \ No newline at end of file diff --git a/TIAMSharedUI/Shared/Components/Grids/TiamGrid.cs b/TIAMSharedUI/Shared/Components/Grids/TiamGrid.cs new file mode 100644 index 00000000..f649de48 --- /dev/null +++ b/TIAMSharedUI/Shared/Components/Grids/TiamGrid.cs @@ -0,0 +1,209 @@ +using System.ComponentModel; +using AyCode.Core.Helpers; +using AyCode.Interfaces.Entities; +using AyCode.Services.SignalRs; +using AyCode.Utils.Extensions; +using DevExpress.Blazor; +using DevExpress.Blazor.Internal; +using Microsoft.AspNetCore.Components; +using TIAMWebApp.Shared.Application.Services; +using TIAMWebApp.Shared.Application.Utility; + +namespace TIAMSharedUI.Shared.Components.Grids +{ + public class TiamGrid : DxGrid where TDataItem : class, IEntityGuid + { + protected bool IsFirstInitializeParameters; + private IList? _dataSource; + private string _gridLogName; + + + public TiamGrid() : base() + { } + + [Parameter] public LoggerClient Logger { get; set; } + [Parameter] public string GridName { get; set; } + [Parameter] public AcSignalRClientBase SignalRClient { get; set; } + + [Parameter] public int GetAllMessageTag { get; set; } + [Parameter] public int GetItemMessageTag { get; set; } + [Parameter] public int AddMessageTag { get; set; } + [Parameter] public int UpdateMessageTag { get; set; } + [Parameter] public int RemoveMessageTag { get; set; } + + [Parameter] + [DefaultValue(null)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "BL0007:Component parameters should be auto properties", Justification = "")] + public IList? DataSource + { + get + { + if (_dataSource == null && Data != null) + { + Logger.Error($"{_gridLogName} Use the DataSource parameter instead of Data!"); + throw new NullReferenceException($"{_gridLogName} Use the DataSource parameter instead of Data!"); + } + + return _dataSource; + } + set + { + _dataSource = value; + Data = _dataSource; + + OnDataSourceChanged.InvokeAsync(_dataSource); + } + } + + protected override void OnInitialized() + { + if (Logger == null) + throw new NullReferenceException($"[{GetType().Name}] Logger == null"); + + if (SignalRClient == null) + Logger.Error($"[{GetType().Name}] SignalRClient == null"); + + base.OnInitialized(); + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + await base.OnAfterRenderAsync(firstRender); + + if (firstRender) RefreshDataSourceAsync().Forget(); + } + + protected new EventCallback DataItemDeleting { get; set; } + [Parameter] public EventCallback OnDataItemDeleting{ get; set; } + + protected new EventCallback EditModelSaving { get; set; } + [Parameter] public EventCallback OnDataItemSaving { get; set; } + + + [Parameter] public EventCallback> OnDataSourceChanged { get; set; } + [Parameter] public EventCallback OnDataSourceItemChanging { get; set; } + [Parameter] public EventCallback OnDataSourceItemChanged { get; set; } + + private async Task OnItemSaving(GridEditModelSavingEventArgs e) + { + var dataItem = (e.EditModel as TDataItem)!; + var logText = e.IsNew ? "add" : "update"; + + Logger.Info($"{_gridLogName} OnItemSaving {logText}; Id: {dataItem.Id}"); + + await OnDataItemSaving.InvokeAsync(e); + + if (e.Cancel) + { + Logger.Debug($"{_gridLogName} OnItemSaving {logText} canceled; Id: {dataItem.Id}"); + return; + } + + PostDataToServerAsync(dataItem, e.IsNew ? AddMessageTag : UpdateMessageTag).Forget(); + + //await transferDataService.CreateTransfer((TransferWizardModel)e.EditModel); + //transfer = await transferDataService.UpdateTransferAsync(transfer); + } + + private async Task OnItemDeleting(GridDataItemDeletingEventArgs e) + { + Logger.Info($"{_gridLogName} OnItemDeleting"); + + await OnDataItemDeleting.InvokeAsync(e); + + if (e.Cancel) + { + Logger.Debug($"{_gridLogName} OnItemDeleting canceled"); + return; + } + + var dataItem = (e.DataItem as TDataItem)!; + PostDataToServerAsync(dataItem, RemoveMessageTag, true).Forget(); + } + + public virtual Task RefreshDataSourceAsync() + { + Logger.Info($"{_gridLogName} UpdateAllDataAsync called"); + + //if (GetAllMessageTag == 0) return Task.CompletedTask; + + return SignalRClient.GetAllAsync>(GetAllMessageTag, response => + { + if (response.Status == SignalResponseStatus.Error) + return; + + BeginUpdate(); + DataSource = response.ResponseData ?? []; + EndUpdate(); + + InvokeAsync(StateHasChanged).Forget(); + }); + } + + public virtual async Task PostDataToServerAsync(TDataItem dataItem, int messageTag, bool isDelete = false) + { + Logger.Info($"{_gridLogName} PostDataToServerAsync called; transferId " + dataItem.Id); + + //if (messageTag == 0) return; + + await OnDataSourceItemChanging.InvokeAsync(dataItem); + RefreshDataSourceItem(dataItem, isDelete, false); //egyből látszódik a változás a grid-ben, nem csak a callback lefutásakor! felhasználóbarátabb... - J. + + SignalRClient.PostDataAsync(messageTag, dataItem, async repsonse => + { + if (repsonse.Status != SignalResponseStatus.Success || repsonse.ResponseData == null) + { + RefreshDataSourceAsync().Forget(); + return; + } + + RefreshDataSourceItem(repsonse.ResponseData, isDelete); + + await OnDataSourceItemChanged.InvokeAsync(dataItem); + await InvokeAsync(StateHasChanged); + }).Forget(); + + //transfer = await devAdminSignalClient.PostDataAsync(SignalRTags.UpdateTransferAsync, transfer); + } + + public void RefreshDataSourceItem(TDataItem dataItem, bool isDelete, bool invokeItemChanged = true) + { + var transferIndex = _dataSource.FindIndex(x => x.Id == dataItem.Id); + + if (isDelete && transferIndex > -1) _dataSource.RemoveAt(transferIndex); + else + { + if (transferIndex > -1) _dataSource[transferIndex] = dataItem; + else _dataSource.Add(dataItem); + } + } + + protected override Task SetParametersAsyncCore(ParameterView parameters) + { + if (!IsFirstInitializeParameters) + { + base.DataItemDeleting = EventCallback.Factory.Create(this, OnItemDeleting); + base.EditModelSaving = EventCallback.Factory.Create(this, OnItemSaving); + + //ShowFilterRow = true; + //PageSize = 4; + //ShowGroupPanel = true; + //AllowSort = false; + + IsFirstInitializeParameters = true; + } + + return base.SetParametersAsyncCore(parameters); + } + + protected override void OnParametersSet() + { + base.OnParametersSet(); + + if (GridName.IsNullOrWhiteSpace()) GridName = $"{typeof(TDataItem).Name}Grid"; + + _gridLogName = $"[{GridName}]"; + + } + } +} diff --git a/TIAMSharedUI/Shared/Components/Grids/TransferDetailGrid.cs b/TIAMSharedUI/Shared/Components/Grids/TransferDetailGrid.cs new file mode 100644 index 00000000..abd9f576 --- /dev/null +++ b/TIAMSharedUI/Shared/Components/Grids/TransferDetailGrid.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Components; + +namespace TIAMSharedUI.Shared.Components.Grids; + +public class TransferDetailGrid : TransferGrid +{ + protected override Task SetParametersAsyncCore(ParameterView parameters) + { + var isFirst = IsFirstInitializeParameters; + + return base.SetParametersAsyncCore(parameters); + + if (isFirst) + { + } + } +} \ No newline at end of file diff --git a/TIAMSharedUI/Shared/Components/Grids/TransferGrid.cs b/TIAMSharedUI/Shared/Components/Grids/TransferGrid.cs new file mode 100644 index 00000000..8dfabc7d --- /dev/null +++ b/TIAMSharedUI/Shared/Components/Grids/TransferGrid.cs @@ -0,0 +1,32 @@ +using Microsoft.AspNetCore.Components; +using TIAM.Entities.Transfers; +using TIAM.Services; + +namespace TIAMSharedUI.Shared.Components.Grids; + +public class TransferGrid : TiamGrid +{ + public TransferGrid() : base() + { + GridName = nameof(TransferGrid); + + GetAllMessageTag = SignalRTags.GetTransfersAsync; + AddMessageTag = SignalRTags.AddTransferAsync; + UpdateMessageTag = SignalRTags.UpdateTransferAsync; + RemoveMessageTag = SignalRTags.RemoveTransferAsync; + } + + protected override Task SetParametersAsyncCore(ParameterView parameters) + { + if (!IsFirstInitializeParameters) + { + //ShowFilterRow = true; + //ShowGroupPanel = true; + //AllowSort = false; + + //etc... + } + + return base.SetParametersAsyncCore(parameters); + } +} \ No newline at end of file diff --git a/TIAMSharedUI/Shared/Components/TiamErrorBoundaryComponent.razor b/TIAMSharedUI/Shared/Components/TiamErrorBoundaryComponent.razor index c49e81d5..d813cd0d 100644 --- a/TIAMSharedUI/Shared/Components/TiamErrorBoundaryComponent.razor +++ b/TIAMSharedUI/Shared/Components/TiamErrorBoundaryComponent.razor @@ -28,15 +28,13 @@ else //public PopupMessageBox PopupMessageBox { get; private set; } = default!; - [Parameter] - public string LoggerCategory { get; set; } - [Parameter] - public EventCallback OnError { get; set; } + [Parameter] public string LoggerCategory { get; set; } + [Parameter] public EventCallback OnError { get; set; } protected override void OnInitialized() { _logger = new LoggerClient(LoggerCategory, LogWriters.ToArray()); - + base.OnInitialized(); } @@ -44,7 +42,7 @@ else // { // } - protected override Task OnErrorAsync(Exception exception) + protected override async Task OnErrorAsync(Exception exception) { _currentError = exception; @@ -54,18 +52,22 @@ else try { - _logger.Error($"An error occurred: {exception.Message}", exception, categoryName, memberName); + _logger.Writer()?.Error($"An error occurred: {exception.Message}", exception, categoryName, memberName); } catch (Exception loggerException) { - jsRuntime.InvokeVoidAsync("console.error", $"{nameof(TiamErrorBoundaryComponent)}->OnErrorAsync; Logger error! {loggerException}"); + await jsRuntime.InvokeVoidAsync("console.error", $"{nameof(TiamErrorBoundaryComponent)}->OnErrorAsync; Logger error! {loggerException}"); - jsRuntime.InvokeVoidAsync("console.error", $"{nameof(TiamErrorBoundaryComponent)}->{memberName}; An error occurred: {exception}"); + await jsRuntime.InvokeVoidAsync("console.error", $"{nameof(TiamErrorBoundaryComponent)}->{memberName}; An error occurred: {exception}"); //jsRuntime.InvokeVoidAsync("console.warn", $"{nameof(TiamErrorBoundaryComponent)}->{memberName}; Error details: {exception.StackTrace}"); } + await Task.Delay(500); //KELL IDE, KÜLÖNBEN NEM MEGY KI A LOG A SZERVERRE! - J. + //ShowErrorNotification("An unexpected error occurred. Please try again later."); - return OnError.HasDelegate ? OnError.InvokeAsync(exception) : base.OnErrorAsync(exception); + + if (OnError.HasDelegate) await OnError.InvokeAsync(exception); + else await base.OnErrorAsync(exception); } // private void ShowErrorNotification(string message) @@ -77,4 +79,5 @@ else { _currentError = null; } -} \ No newline at end of file +} + diff --git a/TIAMWebApp/Client/Program.cs b/TIAMWebApp/Client/Program.cs index b65e8d1a..28cda571 100644 --- a/TIAMWebApp/Client/Program.cs +++ b/TIAMWebApp/Client/Program.cs @@ -44,7 +44,7 @@ builder.Services.AddSingleton(x => new ResourceManager("TIAMWebApp.Client.Resour builder.Services.AddSingleton(); builder.Services.AddSingleton(); //builder.Services.AddSingleton(); -builder.Services.AddSingleton(); +builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddScoped(); diff --git a/TIAMWebApp/Server/Services/DevAdminSignalRhub.cs b/TIAMWebApp/Server/Services/DevAdminSignalRhub.cs index c3bc3e7c..42315714 100644 --- a/TIAMWebApp/Server/Services/DevAdminSignalRhub.cs +++ b/TIAMWebApp/Server/Services/DevAdminSignalRhub.cs @@ -92,7 +92,7 @@ public class DevAdminSignalRHub(AdminDal adminDal, ServiceProviderAPIController return; - case SignalRTags.CreateCompanyAsync: + case SignalRTags.AddCompanyAsync: //var createCompany = message!.MessagePackTo>().PostData; @@ -100,7 +100,7 @@ public class DevAdminSignalRHub(AdminDal adminDal, ServiceProviderAPIController //await ResponseToCaller(messageTag, new SignalResponseMessage(SignalResponseStatus.Success, createCompany), requestId); return; - case SignalRTags.DeleteCompanyAsync: + case SignalRTags.RemoveCompanyAsync: var deleteCompany = message!.MessagePackTo>().PostData; await adminDal.RemoveCompanyAsync(deleteCompany.Id); diff --git a/TIAMWebApp/Shared/Services/AcSignalRClientBase.cs b/TIAMWebApp/Shared/Services/AcSignalRClientBase.cs index 4620251b..416beca6 100644 --- a/TIAMWebApp/Shared/Services/AcSignalRClientBase.cs +++ b/TIAMWebApp/Shared/Services/AcSignalRClientBase.cs @@ -21,7 +21,7 @@ using TIAMWebApp.Shared.Application.Utility; namespace TIAMWebApp.Shared.Application.Services { - public class DevAdminSignalClient(IEnumerable logWriters) : AcSignalRClientBase("DevAdminHub", logWriters); + public class AdminSignalRClient(IEnumerable logWriters) : AcSignalRClientBase("DevAdminHub", logWriters); public abstract class AcSignalRClientBase : IAcSignalRHubClient { @@ -162,6 +162,9 @@ namespace TIAMWebApp.Shared.Application.Services public virtual Task SendMessageToServerAsync(int messageTag, ISignalRMessage? message, Action> responseCallback) { + if (messageTag == 0) + Logger.Error($"SendMessageToServerAsync; messageTag == 0"); + var requestId = AcDomain.NextUniqueInt32; _responseByRequestId[requestId] = new Action>(responseMessage => diff --git a/TIAMWebApp/Shared/Services/ServiceProviderDataService.cs b/TIAMWebApp/Shared/Services/ServiceProviderDataService.cs index c5647bfe..28fd9f22 100644 --- a/TIAMWebApp/Shared/Services/ServiceProviderDataService.cs +++ b/TIAMWebApp/Shared/Services/ServiceProviderDataService.cs @@ -29,14 +29,14 @@ namespace TIAMWebApp.Shared.Application.Services private readonly ISecureStorageHandler secureStorageHandler; private readonly LoggerClient _logger; - private DevAdminSignalClient _devAdminSignalClient; + private AdminSignalRClient _adminSignalRClient; - public ServiceProviderDataService(HttpClient http, ISecureStorageHandler secureStorageHandler, DevAdminSignalClient devAdminSignalClient, IEnumerable logWriters) + public ServiceProviderDataService(HttpClient http, ISecureStorageHandler secureStorageHandler, AdminSignalRClient adminSignalRClient, IEnumerable logWriters) { this.http = http; this.secureStorageHandler = secureStorageHandler; - _devAdminSignalClient = devAdminSignalClient; + _adminSignalRClient = adminSignalRClient; _logger = new LoggerClient(logWriters.ToArray()); } @@ -98,7 +98,7 @@ namespace TIAMWebApp.Shared.Application.Services //17. public Task GetPropertiesByOwnerIdAsync(Guid id, Action?> callback) { - return _devAdminSignalClient.GetByIdAsync>(SignalRTags.GetPropertiesByOwnerIdAsync, id, response => + return _adminSignalRClient.GetByIdAsync>(SignalRTags.GetPropertiesByOwnerIdAsync, id, response => { if (response.Status == SignalResponseStatus.Error) callback.Invoke(null); @@ -112,7 +112,7 @@ namespace TIAMWebApp.Shared.Application.Services //17. public async Task?> GetPropertiesByOwnerIdAsync(Guid id) { - var companyPropertiesByOwner = await _devAdminSignalClient.GetByIdAsync>(SignalRTags.GetPropertiesByOwnerIdAsync, id); + var companyPropertiesByOwner = await _adminSignalRClient.GetByIdAsync>(SignalRTags.GetPropertiesByOwnerIdAsync, id); if (companyPropertiesByOwner != null) _logger.DetailConditional($"companyPropertiesByOwner: {string.Join("; ", companyPropertiesByOwner.Values)}"); return companyPropertiesByOwner; @@ -146,7 +146,7 @@ namespace TIAMWebApp.Shared.Application.Services //16. public async Task> GetServiceProvidersAsync() { - var companies = await _devAdminSignalClient.GetAllAsync>(SignalRTags.GetCompaniesAsync); + var companies = await _adminSignalRClient.GetAllAsync>(SignalRTags.GetCompaniesAsync); if (companies != null) _logger.DetailConditional($"companies: {string.Join("; ", companies.Count)}"); return companies; @@ -167,7 +167,7 @@ namespace TIAMWebApp.Shared.Application.Services //14. public async Task UpdateServiceProviderAsync(Company company) { - var result = await _devAdminSignalClient.PostDataAsync(SignalRTags.UpdateCompanyAsync, company); + var result = await _adminSignalRClient.PostDataAsync(SignalRTags.UpdateCompanyAsync, company); return result; }