Driver history grouped by date,

Hotel more clean transfer list
Hotel create transfer reload button after saved last transfer
Save message first then send message in email
Create guest user if email is not in userDb, set referral Id fixed
Some more little cleanups
This commit is contained in:
Adam 2024-07-29 10:57:55 +02:00
parent 6bfd97beba
commit 0662bb77a7
9 changed files with 192 additions and 161 deletions

View File

@ -31,7 +31,7 @@ else
<div class="card cw-480">
<div class="card-header text-center py-3">
<h4>Details</h4>
<DxButton Click="StartEditing" RenderStyle="ButtonRenderStyle.Primary">Edit</DxButton>
@* <DxButton Click="StartEditing" RenderStyle="ButtonRenderStyle.Primary">Create new</DxButton> *@
</div>
<div class="card-body">
@CreateCardView()
@ -190,6 +190,8 @@ else
editor.AddAttribute(j++, "Date", property.GetValue(Data));
editor.AddAttribute(j++, "DateExpression", lambda);
editor.AddAttribute(j++, "CssClass", "form-field");
editor.AddAttribute(j++, "TimeSectionVisible", true);
editor.AddAttribute(j++, "TimeSectionScrollPickerFormat", "tt h m");
editor.AddAttribute(j++, "DateChanged", EventCallback.Factory.Create<DateTime>(this, str => { property.SetValue(Data, str); }));
editor.CloseComponent();
break;

View File

@ -128,6 +128,38 @@
</DxScheduler>
</div>
</DxTabPage>
<DxTabPage Text="History">
<div class="d-flex flex-column mb-4 pb-2">
<TransferDetailGrid @ref="_gridTransfer"
Logger="_logger"
GetAllMessageTag="SignalRTags.GetTransfersByUserProductMappingId"
SignalRClient="AdminSignalRClient"
ContextIds="new object[] {driverId}"
CustomizeElement="Grid_CustomizeElement"
ShowGroupPanel="true"
CustomGroup="Grid_CustomGroup"
CustomizeGroupValueDisplayText="Grid_CustomizeGroupValueDisplayText"
EditMode="GridEditMode.EditForm"
ColumnResizeMode="GridColumnResizeMode.NextColumn"
AllowSelectRowByClick="false"
PageSize="13"
ShowFilterRow="true">
<Columns>
<DxGridDataColumn FieldName="Id" ShowInColumnChooser="AcDomain.IsDeveloperVersion" Visible="AcDomain.IsDeveloperVersion" DisplayFormat="N" />
<DxGridDataColumn FieldName="Appointment" SortOrder="GridColumnSortOrder.Descending" GroupIndex="0" GroupInterval="GridColumnGroupInterval.Custom" DisplayFormat="g" Width="125" />
<DxGridDataColumn FieldName="OrderId" Caption="Order" SortIndex="1" SortOrder="GridColumnSortOrder.Descending" Width="70" />
<DxGridDataColumn FieldName="FromAddress" />
<DxGridDataColumn FieldName="ToAddress" />
<DxGridDataColumn FieldName="Created" DisplayFormat="g" Width="125" Visible="false" CaptionAlignment="GridTextAlignment.Center" TextAlignment="GridTextAlignment.Center" />
</Columns>
</TransferDetailGrid>
</div>
</DxTabPage>
</DxTabs>
</div>
</div>
@ -143,7 +175,7 @@
[Parameter] public Guid DriverId { get; set; }
private Guid driverId;
private LoggerClient<DriverManageTransfers> _logger;
private TransferGrid _gridTransfer;
private bool _popupVisible;
private List<Transfer>? transfers = [];
@ -153,6 +185,14 @@
AccordionExpandMode ExpandMode { get; set; } = AccordionExpandMode.SingleOrNone;
AccordionExpandCollapseAction ExpandCollapseAction { get; set; } = AccordionExpandCollapseAction.HeaderClick;
private MessageWizardModel _messageWizardModel = new();
public List<AppointmentModel> AppointmentModels { get; set; } = null!;
DateTime StartDate { get; set; } = DateTime.Today;
DxSchedulerDataStorage _dataStorage = new();
public List<string> IgnoreList =
[
"ReceiverEmailAddress",
@ -177,15 +217,71 @@
new(Convert.ToByte(TransferStatusType.AdminDenied), "Admin cancelled")
];
void Grid_CustomizeElement(GridCustomizeElementEventArgs e)
{
try
{
if (e.ElementType == GridElementType.HeaderCell)
{
e.Style = "background-color: rgba(0, 0, 0, 0.08)";
e.CssClass = "header-bold";
}
if (e.ElementType != GridElementType.DataRow) return;
private MessageWizardModel _messageWizardModel = new();
var transferStatus = e.Grid?.GetRowValue(e.VisibleIndex, "TransferStatusType");
if (transferStatus == null) return;
public List<AppointmentModel> AppointmentModels { get; set; } = null!;
var transferStatusByte = (byte)transferStatus;
DateTime StartDate { get; set; } = DateTime.Today;
DxSchedulerDataStorage _dataStorage = new();
switch (transferStatusByte)
{
case 5:
e.CssClass = "bg-important";
break;
case > 5 and < 35:
e.CssClass = "bg-attention";
break;
case 35:
e.CssClass = "bg-finished";
break;
case > 35:
e.CssClass = "bg-cancel";
break;
}
}
catch (Exception ex)
{
_logger.Error($"Grid_CustomizeElement; {ex.Message}", ex);
}
}
void Grid_CustomGroup(GridCustomGroupEventArgs e)
{
if (e.FieldName == "Appointment")
{
e.SameGroup = Grid_CompareColumnValues(((DateTime)e.Value1).Date, ((DateTime)e.Value2).Date);
e.Handled = true;
}
}
bool Grid_CompareColumnValues(DateTime value1, DateTime value2)
{
if (value1 == value2)
return true;
else
return false;
}
void Grid_CustomizeGroupValueDisplayText(GridCustomizeGroupValueDisplayTextEventArgs e)
{
if (e.FieldName == "Appointment")
{
string displayText = ((DateTime)e.Value).Date.ToString();
e.DisplayText = displayText;
}
}
private void RefreshComponent()
{
StateHasChanged();

View File

@ -1,5 +1,8 @@
@page "/user/createAndManageTransfer"
@using AyCode.Core.Consts
@using AyCode.Core.Helpers
@using TIAM.Entities.Products
@using TIAM.Entities.ServiceProviders
@using TIAM.Entities.Transfers
@using TIAM.Services
@using TIAMSharedUI.Pages.Components.EditComponents
@ -7,6 +10,7 @@
@using AyCode.Services.Loggers
@using TIAMWebApp.Shared.Application.Interfaces;
@using TIAMWebApp.Shared.Application.Models.ClientSide.UI.WizardModels
@using TIAMWebApp.Shared.Application.Models.PageModels
@using TIAMWebApp.Shared.Application.Services
@using TIAMWebApp.Shared.Application.Utility
@layout AdminLayout
@ -15,6 +19,7 @@
@inject IUserDataService UserDataService
@inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inject AdminSignalRClient _adminSignalRClient
@inject NavigationManager navManager
<PageTitle>Create transfer</PageTitle>
@ -44,6 +49,11 @@
<DynamicEditForm Data="Data" isEditing="true" IgnoreReflection="TransferIgnorList" OnSubmit="SubmitForm"></DynamicEditForm>
</div>
<div class="row py-3">
<DxButton RenderStyle="ButtonRenderStyle.Primary" Click="@Reload" Visible="@isReloadVisible">Reload</DxButton>
</div>
</div>
</div>
@ -52,7 +62,7 @@
@code {
private LoggerClient<CreateAndManageTransfer> _logger;
private TransferWizardModel Data;
private TransferWizardModel Data = new();
private List<Product> Hotels = new List<Product>();
private Product SelectedHotel;
public List<string> TransferIgnorList = new List<string>
@ -67,7 +77,7 @@
nameof(TransferWizardModel.ReferralId),
nameof(TransferWizardModel.Price)
};
private bool isReloadVisible = false;
protected override void OnInitialized()
{
@ -92,11 +102,60 @@
var valami = ((TransferWizardModel)result).CopyToTransfer();
valami.Id = Guid.NewGuid();
valami.ProductId = SelectedHotel.Id;
var user = await UserDataService.GetUserByEmailAsync(valami.ContactEmail);
if (user != null && user.Id != Guid.Empty)
{
//user exists already
var userDetail = await UserDataService.GetUserDetailByIdAsync(user.Id);
valami.ReferralId = userDetail.UserDto.RefferalId;
valami.UserId = userDetail.Id;
}
else
{
//create a guest user and set referralId
var registration = new RegistrationModel();
//TODO: Refractor to userDataService
// var random = new Random();
// const string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
// var password = new string(Enumerable.Repeat(chars, 10)
// .Select(s => s[random.Next(s.Length)]).ToArray());
var password = AcCharsGenerator.NewPassword(AcConst.MinPasswordLength, 16);
registration.Email = valami.ContactEmail;
registration.PhoneNumber = valami.ContactPhone;
registration.Password = password;
//get list with one member!
var productOwner = await _adminSignalRClient.GetByIdAsync<List<Company>>(SignalRTags.GetCompaniesById, SelectedHotel.ServiceProviderId);
registration.ReferralId = productOwner[0].AffiliateId;
var createResult = await UserDataService.CreateGuestUser(registration);
if(createResult.isSuccess)
{
if (createResult.user != null)
{
valami.UserId = createResult.user.Id;
}
}
_logger.Info("New user created added");
}
//valami.ProductId = SessionService.User.UserId; //TODO ProductID!
// await WizardProcessor.ProcessWizardAsync<TransferDestinationWizardModel>(result.GetType(), result);
var saveResult = await _adminSignalRClient.PostDataAsync<Transfer>(SignalRTags.AddTransfer, valami);
_logger.Info($"Submitted nested form: {result.GetType().FullName}, {valami.ToAddress}, {valami.FromAddress}, {valami.ProductId}");
_logger.Info($"Submitted form: {result.GetType().FullName}, {valami.ToAddress}, {valami.FromAddress}, {valami.ProductId}");
isReloadVisible = true;
}
public void Reload()
{
Data = new TransferWizardModel();
isReloadVisible = false;
StateHasChanged();
}
}

View File

@ -102,26 +102,14 @@
</NavLink>
}
</CellDisplayTemplate>
</DxGridDataColumn>
<DxGridDataColumn FieldName="Revenue" Caption="Revenue" Width="70" CaptionAlignment="GridTextAlignment.Center" />
</DxGridDataColumn>
<DxGridDataColumn FieldName="FullName" />
<DxGridDataColumn FieldName="ContactPhone" Width="120" />
<DxGridDataColumn FieldName="ContactEmail" Width="120">
</DxGridDataColumn>
<DxGridDataColumn FieldName="PaymentId" DisplayFormat="N" Visible="false" />
<DxGridDataColumn Caption="Paid" FieldName="Paid" Width="75" TextAlignment="GridTextAlignment.Center" CaptionAlignment="GridTextAlignment.Center" />
<DxGridDataColumn FieldName="TransferStatusType" Caption="Status" SortIndex="0" Width="120" SortOrder="GridColumnSortOrder.Ascending" SortMode="GridColumnSortMode.Value">
<CellDisplayTemplate>
@{
TransferStatusModel keyField = Statuses.FirstOrDefault(x => x.StatusValue == (byte)context.Value)!;
string transferStatusText = keyField.StatusName;
<text>@transferStatusText</text>
}
</CellDisplayTemplate>
</DxGridDataColumn>
<DxGridDataColumn FieldName="ReferralId" DisplayFormat="N" Visible="false" />
</DxGridDataColumn>
<DxGridDataColumn FieldName="ReferralId" DisplayFormat="N" Visible="true" />
<DxGridDataColumn FieldName="Comment" Caption="Comment" />
<DxGridDataColumn FieldName="Created" DisplayFormat="g" Width="125" Visible="false" CaptionAlignment="GridTextAlignment.Center" TextAlignment="GridTextAlignment.Center" />
</Columns>
@ -143,9 +131,7 @@
</div>
<div class="d-flex flex-row mb-4 pb-2">
<h4> Some <span class="small text-muted"> conclusion </span></h4>
</div>
</div>
<div class="card-footer py-2 px-4">
<div class="d-flex justify-content-between">

View File

@ -31,15 +31,13 @@
<div class=" col-12">
<Animation Effect="@Effect.FadeIn" Speed="@Speed.Fast" Delay="@TimeSpan.FromMilliseconds(250)">
<div class="card">
<div class="d-flex flex-column mb-4 pb-2">
<div class="align-self-end pl-2 pb-2">
<DxButton Text="Column Chooser"
RenderStyle="ButtonRenderStyle.Secondary"
IconCssClass="btn-column-chooser"
Click="ColumnChooserButton_Click" />
</div>
<div class="d-flex flex-column mb-4 pb-2">
<CarGridComponent DetailExpandButtonDisplayMode="GridDetailExpandButtonDisplayMode.Auto" GetAllTag="SignalRTags.GetAllCars"></CarGridComponent>
<CarGridComponent
@ref="@Grid"
DetailExpandButtonDisplayMode="GridDetailExpandButtonDisplayMode.Auto"
GetAllTag="SignalRTags.GetAllCars">
</CarGridComponent>
</div>
@ -57,123 +55,9 @@
private LoggerClient<ManageUserProductMappings> _logger;
//public UserModelDtoDetail UserModelDtoDetail = new();
bool PopupVisible { get; set; }
IGrid Grid { get; set; }
CarGridComponent Grid { get; set; }
//object? MasterGridData { get; set; }
public List<string> IgnoreList =
[
"ReceiverEmailAddress",
"ReceiverId",
"SenderEmailAddress",
"SenderId",
"ContextId"
];
void Grid_CustomizeElement(GridCustomizeElementEventArgs e)
{
if (e.ElementType == GridElementType.DataRow && e.VisibleIndex % 2 == 1)
{
e.CssClass = "bg-alt";
}
else if (e.ElementType == GridElementType.HeaderCell)
{
e.Style = "background-color: rgba(0, 0, 0, 0.08); font-style=bold";
}
}
void Grid_CustomizeEditModel(GridCustomizeEditModelEventArgs e)
{
if (!e.IsNew) return;
var userEditModel = (UserModelDtoDetail)e.EditModel; //TODO not valid cast
userEditModel.Id = Guid.NewGuid();
userEditModel.UserDto = new UserDtoDetail
{
AffiliateId = Guid.NewGuid(),
EmailAddress = "",
PhoneNumber = ""
};
userEditModel.ProfileDto = new TIAM.Entities.Profiles.Profile
{
Name = "New user"
};
userEditModel.Products = [];
userEditModel.ServiceProviders = [];
userEditModel.UserProductMappings = [];
}
async Task Grid_EditModelSaving(GridEditModelSavingEventArgs e)
{
var userModelDtoDetail = ((UserModelDtoDetail)e.EditModel);
if (e.IsNew)
{
//add new orderData to orderData array
var registration = new RegistrationModel();
//TODO: Refractor to userDataService
// var random = new Random();
// const string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
// var password = new string(Enumerable.Repeat(chars, 10)
// .Select(s => s[random.Next(s.Length)]).ToArray());
var password = AcCharsGenerator.NewPassword(AcConst.MinPasswordLength, 16);
registration.Email = userModelDtoDetail.UserDto.EmailAddress;
registration.PhoneNumber = userModelDtoDetail.UserDto.PhoneNumber;
registration.Password = password;
registration.ReferralId = null;
await UserDataService.CreateGuestUser(registration);
_logger.Info("New user created added");
}
else
{
_logger.Info("orderData updated at id " + userModelDtoDetail.Id);
//await transferDataService.UpdateTransferAsync((TransferWizardModel)e.EditModel);
//modify transferData where transferData.Id == e.EditModel.Id
}
//get transfer from TransferData by Id
// foreach (var transferToModify in (List<Transfer>)TransferData)
// {
// myModel = (Transfer)e.EditModel;
// if (transferToModify.Id == myModel.Id)
// {
// //transferToModify.Driver = myModel.Driver;
// }
// }
//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)
{
//await NwindDataService.RemoveEmployeeAsync((EditableEmployee)e.DataItem);
//remove orderData from orderData array
_logger.Info("orderData deleted");
//await UpdateDataAsync();
}
async Task UpdateDataAsync()
{
//refresh grid
_logger.Info("orderData grid refreshed");
}
protected override async Task OnInitializedAsync()
{
_logger = new LoggerClient<ManageUserProductMappings>(LogWriters.ToArray());
@ -181,9 +65,6 @@
base.OnInitialized();
}
void ColumnChooserButton_Click()
{
Grid.ShowColumnChooser();
}
}

View File

@ -13,6 +13,9 @@ using TIAM.Services;
using AyCode.Core.Loggers;
using AyCode.Core.Extensions;
using TIAM.Entities.Products;
using AyCode.Core.Consts;
using AyCode.Core;
using TIAM.Core.Consts;
namespace TIAMWebApp.Server.Controllers
{
@ -54,12 +57,12 @@ namespace TIAMWebApp.Server.Controllers
var messageElement = message.Message;
_logger.Debug(message.Message.Subject);
messageElement.EmailAddress = "noreply@anataworld.com";
messageElement.EmailAddress = TiamConstClient.SystemEmailAddress;
await _adminDal.AddEmailMessageAsync(messageElement);
var result = await _messageSenderService.SendMessageAsync(messageElement, (int)message.MessageType);
//_adminDal.AddEmailMessageAsync((TIAM.Entities.Emails.EmailMessage)SerializedMessageSenderModel.Message);
await _adminDal.AddEmailMessageAsync(messageElement);
_logger.Debug($"SendEmail result: {result}");
return Ok(result);

View File

@ -27,7 +27,7 @@ namespace TIAMWebApp.Server.Controllers
[Authorize]
[ApiController]
[Route("api/v1/[controller]")]
public class ServiceProviderAPIController(AdminDal adminDal, IEnumerable<IAcLogWriterBase> logWriters) : ControllerBase
public class ServiceProviderAPIController(AdminDal adminDal, IWebHostEnvironment env, IEnumerable<IAcLogWriterBase> logWriters) : ControllerBase
{
private readonly TIAM.Core.Loggers.Logger<ServiceProviderAPIController> _logger = new(logWriters.ToArray());
@ -510,7 +510,8 @@ namespace TIAMWebApp.Server.Controllers
var qrCodeData = qrGenerator.CreateQrCode($"https://touriam.com/{productId}", QRCodeGenerator.ECCLevel.Q);
var qrCode = new QRCode(qrCodeData);
//Bitmap qrCodeImage = qrCode.GetGraphic(20);
var rootpath = System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), "assets");
//var rootpath = System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), "assets");
var rootpath = System.IO.Path.Combine(env.WebRootPath, "assets");
var qrCodeImage = qrCode.GetGraphic(20, Color.DarkMagenta, Color.White, (Bitmap)Bitmap.FromFile(rootpath + "/myimage.png"));
_logger.Info($@"qrCodeLogo: {rootpath}/myimage.png");
var ms = new MemoryStream();

View File

@ -8,6 +8,9 @@
<PropertyGroup>
<WasmEnableSIMD>false</WasmEnableSIMD>
</PropertyGroup>
<ItemGroup>
<None Include="wwwroot\Assets\myimage.png" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="AutoMapper" Version="13.0.1" />

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB