This commit is contained in:
Adam 2024-06-01 16:05:50 +02:00
commit 93923a7c4f
8 changed files with 75 additions and 69 deletions

View File

@ -88,8 +88,8 @@
Logger="_logger" Logger="_logger"
SignalRClient="AdminSignalRClient" SignalRClient="AdminSignalRClient"
OnDataSourceChanged="DataSourceChanged" OnDataSourceChanged="DataSourceChanged"
OnDataSourceItemChanging="DataSourceItemChanging" OnDataItemChanging="DataSourceItemChanging"
OnDataSourceItemChanged="DataSourceItemChanged" OnDataItemChanged="DataSourceItemChanged"
OnDataItemDeleting="DataItemDeleting" OnDataItemDeleting="DataItemDeleting"
OnDataItemSaving="DataItemSaving" OnDataItemSaving="DataItemSaving"

View File

@ -10,10 +10,10 @@ public class CompanyGrid : TiamGrid<Company>
{ {
GridName = nameof(CompanyGrid); GridName = nameof(CompanyGrid);
GetAllMessageTag = SignalRTags.GetCompaniesAsync; GetAllMessageTag = SignalRTags.GetCompanies;
AddMessageTag = SignalRTags.AddCompanyAsync; AddMessageTag = SignalRTags.AddCompany;
UpdateMessageTag = SignalRTags.UpdateCompanyAsync; UpdateMessageTag = SignalRTags.UpdateCompany;
RemoveMessageTag = SignalRTags.RemoveCompanyAsync; RemoveMessageTag = SignalRTags.RemoveCompany;
} }
protected override Task SetParametersAsyncCore(ParameterView parameters) protected override Task SetParametersAsyncCore(ParameterView parameters)

View File

@ -5,7 +5,9 @@ using AyCode.Services.SignalRs;
using AyCode.Utils.Extensions; using AyCode.Utils.Extensions;
using DevExpress.Blazor; using DevExpress.Blazor;
using DevExpress.Blazor.Internal; using DevExpress.Blazor.Internal;
using DevExpress.Blazor.Navigation.Internal;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms;
using TIAMWebApp.Shared.Application.Services; using TIAMWebApp.Shared.Application.Services;
using TIAMWebApp.Shared.Application.Utility; using TIAMWebApp.Shared.Application.Utility;
@ -17,7 +19,6 @@ namespace TIAMSharedUI.Shared.Components.Grids
private IList<TDataItem>? _dataSource; private IList<TDataItem>? _dataSource;
private string _gridLogName; private string _gridLogName;
public TiamGrid() : base() public TiamGrid() : base()
{ } { }
@ -31,6 +32,16 @@ namespace TIAMSharedUI.Shared.Components.Grids
[Parameter] public int UpdateMessageTag { get; set; } [Parameter] public int UpdateMessageTag { get; set; }
[Parameter] public int RemoveMessageTag { get; set; } [Parameter] public int RemoveMessageTag { get; set; }
protected new EventCallback<GridDataItemDeletingEventArgs> DataItemDeleting { get; set; }
[Parameter] public EventCallback<GridDataItemDeletingEventArgs> OnDataItemDeleting{ get; set; }
protected new EventCallback<GridEditModelSavingEventArgs> EditModelSaving { get; set; }
[Parameter] public EventCallback<GridEditModelSavingEventArgs> OnDataItemSaving { get; set; }
[Parameter] public EventCallback<IList<TDataItem>> OnDataSourceChanged { get; set; }
[Parameter] public EventCallback<TDataItem> OnDataItemChanging { get; set; }
[Parameter] public EventCallback<TDataItem> OnDataItemChanged { get; set; }
[Parameter] [Parameter]
[DefaultValue(null)] [DefaultValue(null)]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "BL0007:Component parameters should be auto properties", Justification = "<Pending>")] [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "BL0007:Component parameters should be auto properties", Justification = "<Pending>")]
@ -73,20 +84,21 @@ namespace TIAMSharedUI.Shared.Components.Grids
if (firstRender) RefreshDataSourceAsync().Forget(); if (firstRender) RefreshDataSourceAsync().Forget();
} }
protected new EventCallback<GridDataItemDeletingEventArgs> DataItemDeleting { get; set; } public Task AddDataItem(TDataItem dataItem) => PostDataToServerAsync(dataItem, AddMessageTag);
[Parameter] public EventCallback<GridDataItemDeletingEventArgs> OnDataItemDeleting{ get; set; } public Task UpdateDataItem(TDataItem dataItem) => PostDataToServerAsync(dataItem, UpdateMessageTag);
public Task RemoveDataItem(TDataItem dataItem) => PostDataToServerAsync(dataItem, RemoveMessageTag);
protected new EventCallback<GridEditModelSavingEventArgs> EditModelSaving { get; set; } public Task RemoveDataItem(Guid id)
[Parameter] public EventCallback<GridEditModelSavingEventArgs> OnDataItemSaving { get; set; } {
var dataItem = _dataSource.FirstOrDefault(x => x.Id == id);
return dataItem == null ? Task.CompletedTask : RemoveDataItem(dataItem);
[Parameter] public EventCallback<IList<TDataItem>> OnDataSourceChanged { get; set; } }
[Parameter] public EventCallback<TDataItem> OnDataSourceItemChanging { get; set; }
[Parameter] public EventCallback<TDataItem> OnDataSourceItemChanged { get; set; }
private async Task OnItemSaving(GridEditModelSavingEventArgs e) private async Task OnItemSaving(GridEditModelSavingEventArgs e)
{ {
var dataItem = (e.EditModel as TDataItem)!; var dataItem = (e.EditModel as TDataItem)!;
var logText = e.IsNew ? "add" : "update"; var logText = e.IsNew ? "add" : "update";
Logger.Info($"{_gridLogName} OnItemSaving {logText}; Id: {dataItem.Id}"); Logger.Info($"{_gridLogName} OnItemSaving {logText}; Id: {dataItem.Id}");
@ -99,10 +111,8 @@ namespace TIAMSharedUI.Shared.Components.Grids
return; return;
} }
PostDataToServerAsync(dataItem, e.IsNew ? AddMessageTag : UpdateMessageTag).Forget(); if (e.IsNew) await AddDataItem(dataItem);
else await UpdateDataItem(dataItem);
//await transferDataService.CreateTransfer((TransferWizardModel)e.EditModel);
//transfer = await transferDataService.UpdateTransferAsync(transfer);
} }
private async Task OnItemDeleting(GridDataItemDeletingEventArgs e) private async Task OnItemDeleting(GridDataItemDeletingEventArgs e)
@ -118,7 +128,7 @@ namespace TIAMSharedUI.Shared.Components.Grids
} }
var dataItem = (e.DataItem as TDataItem)!; var dataItem = (e.DataItem as TDataItem)!;
PostDataToServerAsync(dataItem, RemoveMessageTag, true).Forget(); await RemoveDataItem(dataItem);
} }
public virtual Task RefreshDataSourceAsync() public virtual Task RefreshDataSourceAsync()
@ -140,33 +150,33 @@ namespace TIAMSharedUI.Shared.Components.Grids
}); });
} }
public virtual async Task PostDataToServerAsync(TDataItem dataItem, int messageTag, bool isDelete = false) protected virtual async Task PostDataToServerAsync(TDataItem dataItem, int messageTag, bool isDelete = false)
{ {
Logger.Info($"{_gridLogName} PostDataToServerAsync called; transferId " + dataItem.Id); Logger.Info($"{_gridLogName} PostDataToServerAsync called; transferId " + dataItem.Id);
//if (messageTag == 0) return; //if (messageTag == 0) return;
await OnDataSourceItemChanging.InvokeAsync(dataItem); await OnDataItemChanging.InvokeAsync(dataItem);
if (dataItem.Id.IsNullOrEmpty()) dataItem.Id = Guid.NewGuid(); if (dataItem.Id.IsNullOrEmpty()) dataItem.Id = Guid.NewGuid();
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. RefreshDataItem(dataItem, isDelete); //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 => SignalRClient.PostDataAsync(messageTag, dataItem, async repsonse =>
{ {
if (repsonse.Status != SignalResponseStatus.Success || repsonse.ResponseData == null || !RefreshDataSourceItem(repsonse.ResponseData, isDelete)) if (repsonse.Status != SignalResponseStatus.Success || repsonse.ResponseData == null || !RefreshDataItem(repsonse.ResponseData, isDelete))
{ {
RefreshDataSourceAsync().Forget(); RefreshDataSourceAsync().Forget();
return; return;
} }
await OnDataSourceItemChanged.InvokeAsync(dataItem); await OnDataItemChanged.InvokeAsync(dataItem);
await InvokeAsync(StateHasChanged); InvokeAsync(StateHasChanged).Forget();
}).Forget(); }).Forget();
//transfer = await devAdminSignalClient.PostDataAsync(SignalRTags.UpdateTransferAsync, transfer); //transfer = await devAdminSignalClient.PostDataAsync(SignalRTags.UpdateTransferAsync, transfer);
} }
public bool RefreshDataSourceItem(TDataItem dataItem, bool isDelete, bool invokeItemChanged = true) public bool RefreshDataItem(TDataItem dataItem, bool isDelete)
{ {
if (dataItem.Id.IsNullOrEmpty()) if (dataItem.Id.IsNullOrEmpty())
{ {

View File

@ -10,10 +10,10 @@ public class TransferGrid : TiamGrid<Transfer>
{ {
GridName = nameof(TransferGrid); GridName = nameof(TransferGrid);
GetAllMessageTag = SignalRTags.GetTransfersAsync; GetAllMessageTag = SignalRTags.GetTransfers;
AddMessageTag = SignalRTags.AddTransferAsync; AddMessageTag = SignalRTags.AddTransfer;
UpdateMessageTag = SignalRTags.UpdateTransferAsync; UpdateMessageTag = SignalRTags.UpdateTransfer;
RemoveMessageTag = SignalRTags.RemoveTransferAsync; RemoveMessageTag = SignalRTags.RemoveTransfer;
} }
protected override Task SetParametersAsyncCore(ParameterView parameters) protected override Task SetParametersAsyncCore(ParameterView parameters)

View File

@ -82,7 +82,7 @@ namespace TIAMWebApp.Server.Controllers
} }
} }
[SignalR(SignalRTags.AddCompanyAsync, MethodParamType.Object, typeof(Company))] [SignalR(SignalRTags.AddCompany)]
public async Task<string> AddCompanyAsync(Company company) public async Task<string> AddCompanyAsync(Company company)
{ {
if (company.Id.IsNullOrEmpty()) company.Id = Guid.NewGuid(); if (company.Id.IsNullOrEmpty()) company.Id = Guid.NewGuid();
@ -107,7 +107,7 @@ namespace TIAMWebApp.Server.Controllers
[AllowAnonymous] [AllowAnonymous]
[HttpGet] [HttpGet]
[Route(APIUrls.GetServiceProvidersRouteName)] [Route(APIUrls.GetServiceProvidersRouteName)]
[SignalR(SignalRTags.GetCompaniesAsync, MethodParamType.None)] [SignalR(SignalRTags.GetCompanies)]
public async Task<string> GetServiceProviders() public async Task<string> GetServiceProviders()
{ {
return await adminDal.GetServiceProvidersJsonAsync(); return await adminDal.GetServiceProvidersJsonAsync();
@ -138,7 +138,7 @@ namespace TIAMWebApp.Server.Controllers
[AllowAnonymous] [AllowAnonymous]
[HttpPost] [HttpPost]
[Route(APIUrls.UpdateServiceProviderRouteName)] [Route(APIUrls.UpdateServiceProviderRouteName)]
[SignalR(SignalRTags.UpdateCompanyAsync, MethodParamType.Object, typeof(Company))] [SignalR(SignalRTags.UpdateCompany)]
public async Task<string> UpdateServiceProvider(Company companyToModify) public async Task<string> UpdateServiceProvider(Company companyToModify)
{ {
_logger.Info($"UpdateServiceProvider called! + {companyToModify.Id}"); _logger.Info($"UpdateServiceProvider called! + {companyToModify.Id}");
@ -153,7 +153,7 @@ namespace TIAMWebApp.Server.Controllers
[HttpPost] [HttpPost]
[Route(APIUrls.GetServiceProvidersByOwnerIdRouteName)] [Route(APIUrls.GetServiceProvidersByOwnerIdRouteName)]
[Tags("Finished", "ServiceProvider")] [Tags("Finished", "ServiceProvider")]
[SignalR(SignalRTags.GetPropertiesByOwnerIdAsync, MethodParamType.Id)] [SignalR(SignalRTags.GetPropertiesByOwnerId)]
public async Task<Dictionary<Guid, string>> GetServiceProvidersByOwnerId([FromBody] Guid ownerId) public async Task<Dictionary<Guid, string>> GetServiceProvidersByOwnerId([FromBody] Guid ownerId)
{ {
_logger.Info($@"GetServiceProvidersByOwnerId called with ownerId: {ownerId}"); _logger.Info($@"GetServiceProvidersByOwnerId called with ownerId: {ownerId}");

View File

@ -1,5 +1,6 @@
using System.Text.Json; using System.Text.Json;
using AyCode.Core.Loggers; using AyCode.Core.Loggers;
using AyCode.Services.SignalRs;
using AyCode.Utils.Extensions; using AyCode.Utils.Extensions;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@ -380,7 +381,7 @@ namespace TIAMWebApp.Server.Controllers
[Authorize] [Authorize]
[HttpGet] [HttpGet]
[Route(APIUrls.GetTransfersRouteName)] [Route(APIUrls.GetTransfersRouteName)]
[SignalR(SignalRTags.GetTransfersAsync, MethodParamType.None)] [SignalR(SignalRTags.GetTransfers)]
public async Task<string> GetTransfers() public async Task<string> GetTransfers()
{ {
//var token = _authService.GetAuthTokenFromRequest(Request); //var token = _authService.GetAuthTokenFromRequest(Request);
@ -406,7 +407,7 @@ namespace TIAMWebApp.Server.Controllers
[AllowAnonymous] [AllowAnonymous]
[HttpPost] [HttpPost]
[Route(APIUrls.UpdateTransferRouteName)] [Route(APIUrls.UpdateTransferRouteName)]
[SignalR(SignalRTags.UpdateTransferAsync, MethodParamType.Object, typeof(Transfer))] [SignalR(SignalRTags.UpdateTransfer)]
public async Task<Transfer> UpdateTransfer(Transfer transferToModify) public async Task<Transfer> UpdateTransfer(Transfer transferToModify)
{ {
_logger.Info($"UpdateTransfer called! + {Request?.ReadFormAsync()}"); _logger.Info($"UpdateTransfer called! + {Request?.ReadFormAsync()}");

View File

@ -17,6 +17,7 @@ using System.Runtime.CompilerServices;
using MessagePack; using MessagePack;
using System.Security.Cryptography.Xml; using System.Security.Cryptography.Xml;
using DevExpress.XtraPrinting.Native.WebClientUIControl; using DevExpress.XtraPrinting.Native.WebClientUIControl;
using DevExpress.XtraReports.Parameters;
namespace TIAMWebApp.Server.Services; namespace TIAMWebApp.Server.Services;
@ -34,30 +35,25 @@ public static class ExtensionMethods
} }
} }
public enum MethodParamType : byte public class MethodInfoModel<TAttribute> where TAttribute : TagAttribute
{ {
None = 0, public Type? ParameterType { get; init; } = null;
Id = 5, public TAttribute Attribute { get; init; }
Object = 10 public MethodInfo MethodInfo { get; init; }
}
[AttributeUsage(AttributeTargets.Method)] public MethodInfoModel(TAttribute attribute, MethodInfo methodInfo)
public class TagAttribute(int messageTag) : Attribute {
{ Attribute = attribute;
public int MessageTag { get; init; } = messageTag; MethodInfo = methodInfo;
}
[AttributeUsage(AttributeTargets.Method)] var parameters = methodInfo.GetParameters();
public class SignalRAttribute(int messageTag, MethodParamType methodParamType, Type paramType = null) : TagAttribute(messageTag)
{
public MethodParamType MethodParamType { get; init; } = methodParamType;
public Type ParamType { get; init; } = paramType;
}
public class MethodInfoModel<TAttribute>(TAttribute attribute, MethodInfo methodInfo) where TAttribute : TagAttribute if (parameters.Length > 1)
{ throw new Exception("MethodInfoModel; parameters.Length > 1");
public TAttribute Attribute { get; set; } = attribute;
public MethodInfo MethodInfo { get; set; } = methodInfo; if (parameters.Length == 1)
ParameterType = parameters[0].ParameterType;
}
} }
public class DynamicMethodCallModel<TAttribute> where TAttribute : TagAttribute public class DynamicMethodCallModel<TAttribute> where TAttribute : TagAttribute
@ -142,23 +138,22 @@ public class DevAdminSignalRHub : Hub<ISignalRHubItemServer>, IAcSignalRHubServe
if (!methodsByDeclaringObject.MethodsByMessageTag.TryGetValue(messageTag, out var methodInfoModel)) continue; if (!methodsByDeclaringObject.MethodsByMessageTag.TryGetValue(messageTag, out var methodInfoModel)) continue;
object[]? paramValues = null; object[]? paramValues = null;
var parameters = methodInfoModel.MethodInfo.GetParameters();
logText = $"Found the dynamic method for the tag! tag: {messageTag}; method: {methodsByDeclaringObject.InstanceObject.GetType().Name}.{methodInfoModel.MethodInfo.Name}"; logText = $"Found dynamic method for the tag! tag: {messageTag}; method: {methodsByDeclaringObject.InstanceObject.GetType().Name}.{methodInfoModel.MethodInfo.Name}";
if (parameters.Length > 0) if (methodInfoModel.ParameterType != null)
{ {
_logger.Debug($"{logText}({parameters[0].ParameterType.Name})"); _logger.Debug($"{logText}({methodInfoModel.ParameterType.Name})");
paramValues = new object[1]; paramValues = new object[1];
if (parameters[0].ParameterType == typeof(Guid) || parameters[0].ParameterType == typeof(Guid?)) if (methodInfoModel.ParameterType == typeof(Guid) || methodInfoModel.ParameterType == typeof(Guid?))
{ {
paramValues[0] = message!.MessagePackTo<SignalRequestByIdMessage>().Id; paramValues[0] = message!.MessagePackTo<SignalRequestByIdMessage>().Id;
} }
else else
{ {
var msg = message!.MessagePackTo<SignalPostJsonDataMessage<object>>(MessagePackSerializerOptions.Standard); var msg = message!.MessagePackTo<SignalPostJsonDataMessage<object>>(MessagePackSerializerOptions.Standard);
paramValues[0] = msg.PostDataJson.JsonTo(parameters[0].ParameterType)!; paramValues[0] = msg.PostDataJson.JsonTo(methodInfoModel.ParameterType)!;
} }
} }
else _logger.Debug($"{logText}()"); else _logger.Debug($"{logText}()");
@ -168,11 +163,11 @@ public class DevAdminSignalRHub : Hub<ISignalRHubItemServer>, IAcSignalRHubServe
return; return;
} }
_logger.Debug($"Not found the dynamic method for the tag! tag: {messageTag};"); _logger.Debug($"Not found dynamic method for the tag! tag: {messageTag};");
switch (messageTag) switch (messageTag)
{ {
case SignalRTags.RemoveCompanyAsync: case SignalRTags.RemoveCompany:
var deleteCompany = message!.MessagePackTo<SignalPostJsonDataMessage<Company>>().PostData; var deleteCompany = message!.MessagePackTo<SignalPostJsonDataMessage<Company>>().PostData;
await _adminDal.RemoveCompanyAsync(deleteCompany.Id); await _adminDal.RemoveCompanyAsync(deleteCompany.Id);

View File

@ -98,7 +98,7 @@ namespace TIAMWebApp.Shared.Application.Services
//17. //17.
public Task GetPropertiesByOwnerIdAsync(Guid id, Action<Dictionary<Guid, string>?> callback) public Task GetPropertiesByOwnerIdAsync(Guid id, Action<Dictionary<Guid, string>?> callback)
{ {
return _adminSignalRClient.GetByIdAsync<Dictionary<Guid, string>>(SignalRTags.GetPropertiesByOwnerIdAsync, id, response => return _adminSignalRClient.GetByIdAsync<Dictionary<Guid, string>>(SignalRTags.GetPropertiesByOwnerId, id, response =>
{ {
if (response.Status == SignalResponseStatus.Error) if (response.Status == SignalResponseStatus.Error)
callback.Invoke(null); callback.Invoke(null);
@ -112,7 +112,7 @@ namespace TIAMWebApp.Shared.Application.Services
//17. //17.
public async Task<Dictionary<Guid, string>?> GetPropertiesByOwnerIdAsync(Guid id) public async Task<Dictionary<Guid, string>?> GetPropertiesByOwnerIdAsync(Guid id)
{ {
var companyPropertiesByOwner = await _adminSignalRClient.GetByIdAsync<Dictionary<Guid, string>>(SignalRTags.GetPropertiesByOwnerIdAsync, id); var companyPropertiesByOwner = await _adminSignalRClient.GetByIdAsync<Dictionary<Guid, string>>(SignalRTags.GetPropertiesByOwnerId, id);
if (companyPropertiesByOwner != null) _logger.DetailConditional($"companyPropertiesByOwner: {string.Join("; ", companyPropertiesByOwner.Values)}"); if (companyPropertiesByOwner != null) _logger.DetailConditional($"companyPropertiesByOwner: {string.Join("; ", companyPropertiesByOwner.Values)}");
return companyPropertiesByOwner; return companyPropertiesByOwner;
@ -146,7 +146,7 @@ namespace TIAMWebApp.Shared.Application.Services
//16. //16.
public async Task<List<Company>> GetServiceProvidersAsync() public async Task<List<Company>> GetServiceProvidersAsync()
{ {
var companies = await _adminSignalRClient.GetAllAsync<List<Company>>(SignalRTags.GetCompaniesAsync); var companies = await _adminSignalRClient.GetAllAsync<List<Company>>(SignalRTags.GetCompanies);
if (companies != null) _logger.DetailConditional($"companies: {string.Join("; ", companies.Count)}"); if (companies != null) _logger.DetailConditional($"companies: {string.Join("; ", companies.Count)}");
return companies; return companies;
@ -167,7 +167,7 @@ namespace TIAMWebApp.Shared.Application.Services
//14. //14.
public async Task<Company> UpdateServiceProviderAsync(Company company) public async Task<Company> UpdateServiceProviderAsync(Company company)
{ {
var result = await _adminSignalRClient.PostDataAsync(SignalRTags.UpdateCompanyAsync, company); var result = await _adminSignalRClient.PostDataAsync(SignalRTags.UpdateCompany, company);
return result; return result;
} }