TourIAm/TIAMSharedUI/Pages/User/CardComponents/TransferCardComponent.razor

353 lines
13 KiB
Plaintext

@using AyCode.Core.Enums
@using AyCode.Services.Loggers
@using BlazorAnimation
@using TIAM.Core.Consts
@using TIAM.Core.Enums
@using TIAM.Entities.Transfers
@using TIAM.Models.Dtos.Users
@using TIAM.Services
@using TIAMSharedUI.Pages.Components.EditComponents
@using TIAMSharedUI.Pages.User.SysAdmins
@using TIAMSharedUI.Shared.Components.Cards
@using TIAMWebApp.Shared.Application.Interfaces
@using TIAMWebApp.Shared.Application.Models.ClientSide.UI
@using TIAMWebApp.Shared.Application.Models.ClientSide.UI.WizardModels
@using TIAMWebApp.Shared.Application.Services
@using TIAMWebApp.Shared.Application.Utility
@inject IEnumerable<IAcLogWriterClientBase> LogWriters
@inject IServiceProviderDataService ServiceProviderDataService
@inject AdminSignalRClient AdminSignalRClient;
@inject IWizardProcessor wizardProcessor
<DxPopup CssClass="popup-demo-events"
@bind-Visible="@_popupVisible"
ShowFooter="true"
CloseOnEscape="true"
CloseOnOutsideClick="false"
ShowCloseButton="false"
HeaderText="MessageBox"
Closing="EmailPopupClosing"
Closed="EmailPopupClosed"
SizeMode="SizeMode.Large">
<BodyContentTemplate>
@{
if(showResultMessage)
{
<h5>@resultMessage</h5>
}
else
{
<DynamicEditForm Data=@_messageWizardModel
OnSubmit="SubmitForm"
TitleString="New message"
ButtonTextString="Send message"
isEditing="true"
IgnoreReflection=@IgnoreList></DynamicEditForm>
}
}
</BodyContentTemplate>
<FooterContentTemplate Context="Context">
@{
if(showResultMessage)
{
<div class="popup-demo-events-footer">
<!--DxCheckBox CssClass="popup-demo-events-checkbox" @bind-Checked="@EulaAccepted">I accept the terms of the EULA</!--DxCheckBox-->
<!--DxButton CssClass="popup-demo-events-button ms-2" RenderStyle="ButtonRenderStyle.Primary" Text="OK" Click="Context.CloseCallback" /-->
<DxButton CssClass="popup-demo-events-button ms-2" RenderStyle="ButtonRenderStyle.Secondary" Text="Ok" Click="CancelCreateClick" />
</div>
}
else
{
<div class="popup-demo-events-footer">
<!--DxCheckBox CssClass="popup-demo-events-checkbox" @bind-Checked="@EulaAccepted">I accept the terms of the EULA</!--DxCheckBox-->
<!--DxButton CssClass="popup-demo-events-button ms-2" RenderStyle="ButtonRenderStyle.Primary" Text="OK" Click="Context.CloseCallback" /-->
<DxButton CssClass="popup-demo-events-button ms-2" RenderStyle="ButtonRenderStyle.Secondary" Text="Cancel" Click="CancelCreateClick" />
</div>
}
}
</FooterContentTemplate>
</DxPopup>
<DxTabs CssClass="no-padding">
<DxTabPage Text="Details">
<div class="e-card cw-480 p-3">
<div class="e-main d-flex align-items-center">
<div class="flex-shrink-0">
<img class="e-photo" src="_content/TIAMSharedUI/images/defaultavatar_60.png" alt="" />
</div>
<div class="e-info flex-grow-1 ms-3">
<div class="e-name">@($"{Context.FullName}")</div>
<p class="e-title"><i class="fa-solid fa-at"></i> @Context.ContactEmail</p>
<p class="e-title"><i class="fa-solid fa-phone"></i> @Context.ContactPhone</p>
</div>
</div>
<hr class="hr" />
<div class="row">
<div class="col-12 col-md-6">
@RenderDetailsItem("fa-solid fa-location-dot", "From", Context.FromAddress)
</div>
<div class="col-12 col-md-6">
@RenderDetailsItem("fa-solid fa-location-dot", "To", Context.ToAddress)
</div>
<hr class="hr" />
<div class="col-12 col-md-4">
@RenderDetailsItem("fa-solid fa-users", "Passengers", Context.PassengerCount.ToString())
</div>
<div class="col-12 col-md-4">
@RenderDetailsItem("fa-solid fa-suitcase-rolling", "Luggage", Context.LuggageCount.ToString())
</div>
<div class="col-12 col-md-4">
@RenderDetailsItem("fa-solid fa-hashtag", "Flight number", Context.FlightNumber)
</div>
<hr class="hr" />
<div class="col-12">
@RenderDetailsItem("fa-solid fa-hashtag", "Comment", Context.Comment)
</div>
<div class="col-12 col-md-6">
@RenderDetailsItem("fa-solid fa-list-check", "Status", TransferStatusModel.AllStatuses.FirstOrDefault(x => x.StatusValue == Context.TransferStatusType)!.StatusName)
</div>
<div class="col-9 col-md-5">
<DxComboBox Data="@DriverStatuses"
@bind-Value="@CurrentStatusType"
NullText="Select new status"
CssClass="form-field"
ValueFieldName="@nameof(TransferStatusModel.StatusValue)"
TextFieldName="@nameof(TransferStatusModel.StatusName)" />
</div>
<div class="col-3 col-md-1">
<DxButton CssClass="btn btn-primary" Click="SaveStatus" Enabled="@isSaveActive"> Save</DxButton>
</div>
@if (!Context.Paid)
{
<hr class="hr" />
<div class="col-3 col-md-1">
<DxButton CssClass="btn btn-primary" Click="PaidByCash">Paid in car</DxButton>
</div>
}
<p>@msg</p>
</div>
</div>
</DxTabPage>
<DxTabPage Text="Messages">
<div style="margin-top: 10px; margin-bottom: 10px;">
<DxButton Click="() => SendMail(Context)" Text="Send a message" RenderStyle="ButtonRenderStyle.Primary" />
</div>
<MessageDetailGridComponent ContextId="Context.Id" IsSenderEmailVisible="false" IsMessageTextVisible="false"></MessageDetailGridComponent>
</DxTabPage>
</DxTabs>
@code {
[Parameter] public Transfer Context { get; set; }
[Parameter] public EventCallback<string> DataChanged { get; set; }
private LoggerClient<TransferCardComponent> _logger = null!;
//Email
private bool showResultMessage = false;
private string resultMessage = string.Empty;
private List<UserModelDtoDetail> sysAdmins = [];
private MessageWizardModel _messageWizardModel = new();
private bool displayCard = true;
private bool _popupVisible;
public List<string> IgnoreList =
[
"ReceiverEmailAddress",
"ReceiverFullName",
"ReceiverId",
"SenderEmailAddress",
"SenderFullName",
"SenderId",
"ContextId",
"ContextType"
];
private static readonly IEnumerable<TransferStatusModel> DriverStatuses = TransferStatusModel.AllStatuses.Where(x => x.StatusValue is TransferStatusType.DriverConfirmed or
TransferStatusType.DriverEnRoute or TransferStatusType.PassengerPickup or TransferStatusType.Finished or TransferStatusType.UserCanceled);
// private static readonly IEnumerable<TransferStatusModel> Statuses = new[]
// {
// new TransferStatusModel(TransferStatusType.DriverConfirmed, "Driver confirmed"),
// new TransferStatusModel(TransferStatusType.DriverEnRoute, "Driver enroute"),
// new TransferStatusModel(TransferStatusType.PassengerPickup, "Passenger in car"),
// new TransferStatusModel(TransferStatusType.Finished, "Finished"),
// new TransferStatusModel(TransferStatusType.UserCanceled, "User cancelled"),
// };
private TransferStatusModel _currentStatusType;
public TransferStatusModel CurrentStatusType
{
get => _currentStatusType;
set
{
if (_currentStatusType != value)
{
_currentStatusType = value;
OnSelectedStatusChanged(value);
}
}
}
string msg;
private bool isSaveActive = false;
void OnSelectedStatusChanged(TransferStatusModel status)
{
if (status == null)
{
isSaveActive = false;
msg = "Status is null";
}
else
{
isSaveActive = true;
Context.TransferStatusType = (TransferStatusType)(Convert.ToInt16(status.StatusValue));
msg = $"Status changed: {status.StatusName} - {Context.TransferStatusType} !";
}
}
protected async Task SaveStatus()
{
isSaveActive = false;
var result = await AdminSignalRClient.PostDataAsync<Transfer>(SignalRTags.UpdateTransfer, Context);
if (result != null)
{
if (TransferStatusModel.AllStatuses.FirstOrDefault(x => x.StatusValue == result.TransferStatusType) == CurrentStatusType)
{
msg = $"Stataus saved";
StateHasChanged();
}
else
{
msg = "Some error occured, please try again later";
}
}
else
{
msg = "Some error occured during saving, please try again later";
}
await DataChanged.InvokeAsync(msg);
}
protected async Task PaidByCash()
{
Context.Paid = true;
var result = await AdminSignalRClient.PostDataAsync<Transfer>(SignalRTags.UpdateTransfer, Context);
if (result != null)
{
msg = $"Payment status saved";
StateHasChanged();
}
else
{
msg = "Some error occured during saving, please try again later";
}
await DataChanged.InvokeAsync(msg);
}
protected override async Task OnInitializedAsync()
{
_logger = new LoggerClient<TransferCardComponent>(LogWriters.ToArray());
sysAdmins = await AdminSignalRClient.GetByIdAsync<List<UserModelDtoDetail>>(SignalRTags.GetAllUserModelDtoDetails, TiamConstClient.SysAdmins[0]);
await base.OnInitializedAsync();
}
protected override Task OnParametersSetAsync()
{
CurrentStatusType = TransferStatusModel.AllStatuses.FirstOrDefault(x => x.StatusValue == Context.TransferStatusType)!;
return base.OnParametersSetAsync();
}
RenderFragment RenderDetailsItem(string iconCssClass, string caption, string value)
{
return @<div class="d-flex m-1 align-items-center">
<div class="icon-container flex-shrink-0">
<span class="dxbl-image m-1 @iconCssClass"></span>
</div>
<div class="text-container m-1 flex-grow-1 ms-2">
<label>@caption:</label>
<div>@value</div>
</div>
</div>;
}
void SendMail(Transfer item)
{
_logger.Info($"Preparing mail to {item.ContactEmail}, {item.Id}");
_messageWizardModel.Subject = $"[#{item.OrderId}] New message from guest";
_messageWizardModel.ReceiverId = TiamConstClient.SysAccounts["SystemEmailSender"];
//get first sysadmin
_messageWizardModel.ReceiverEmailAddress = sysAdmins[0].UserDto.EmailAddress;
_messageWizardModel.ReceiverFullName = "Admin user";
_messageWizardModel.SenderId = item.UserId;
_messageWizardModel.SenderEmailAddress = TiamConstClient.SystemEmailAddress;
_messageWizardModel.ContextId = item.Id;
_messageWizardModel.ContextType = MessageContextType.Transfer;
_popupVisible = true;
}
void CancelCreateClick()
{
showResultMessage = false;
resultMessage = "";
_popupVisible = false;
}
void EmailPopupClosed()
{
//cancel clicked
}
void EmailPopupClosing(PopupClosingEventArgs args)
{
//myModel = new TransferWizardModel();
_messageWizardModel = new MessageWizardModel();
}
public async Task SubmitForm(object result)
{
var messageModel = (result as MessageWizardModel)!;
_logger.Info(messageModel.Content);
var email = await wizardProcessor.ProcessWizardAsync<MessageWizardModel>(result.GetType(), messageModel);
if (email != null)
{
resultMessage = "Message sent";
}
else
{
resultMessage = $"Something went wrong, please try again later, or contact us by regular email at {TiamConstClient.SystemEmailAddress}!";
}
showResultMessage = true;
_logger.Info($"Submitted nested form: {result.GetType().FullName}");
}
}