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

200 lines
7.4 KiB
Plaintext

@using BlazorAnimation
@using TIAM.Core.Enums
@using TIAM.Entities.Transfers
@using TIAM.Services
@using TIAMSharedUI.Shared.Components.Cards
@using TIAMWebApp.Shared.Application.Interfaces
@using TIAMWebApp.Shared.Application.Models.ClientSide.UI
@using TIAMWebApp.Shared.Application.Services
@inject IServiceProviderDataService ServiceProviderDataService
@inject AdminSignalRClient AdminSignalRClient;
<div class="e-card cw-480">
<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", AllStatuses.FirstOrDefault(x => x.StatusValue == (byte)Context.TransferStatusType).StatusName)
</div>
<div class="col-9 col-md-5">
<DxComboBox Data="@Statuses"
@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>
@code {
[Parameter] public Transfer Context { get; set; }
[Parameter]
public EventCallback<string> DataChanged { get; set; }
private static readonly IEnumerable<TransferStatusModel> Statuses = new[]
{
new TransferStatusModel(Convert.ToByte(TransferStatusType.DriverConfirmed), "Driver confirmed"),
new TransferStatusModel(Convert.ToByte(TransferStatusType.DriverEnRoute), "Driver enroute"),
new TransferStatusModel(Convert.ToByte(TransferStatusType.PassengerPickup), "Passenger in car"),
new TransferStatusModel(Convert.ToByte(TransferStatusType.Finished), "Finished"),
new TransferStatusModel(Convert.ToByte(TransferStatusType.UserCanceled), "User cancelled"),
};
private static readonly List<TransferStatusModel> AllStatuses = new()
{
new TransferStatusModel(Convert.ToByte(TransferStatusType.OrderSubmitted), "Order submitted"),
new TransferStatusModel(Convert.ToByte(TransferStatusType.OrderConfirmed), "Order confirmed"),
new TransferStatusModel(Convert.ToByte(TransferStatusType.AssignedToDriver), "Assigned to driver"),
new TransferStatusModel(Convert.ToByte(TransferStatusType.DriverConfirmed), "Driver confirmed"),
new TransferStatusModel(Convert.ToByte(TransferStatusType.DriverEnRoute), "Driver enroute"),
new TransferStatusModel(Convert.ToByte(TransferStatusType.PassengerPickup), "Passenger in car"),
new TransferStatusModel(Convert.ToByte(TransferStatusType.Finished), "Finished"),
new TransferStatusModel(Convert.ToByte(TransferStatusType.UserCanceled), "User cancelled"),
new TransferStatusModel(Convert.ToByte(TransferStatusType.AdminDenied), "Admin 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 (AllStatuses.FirstOrDefault(x => x.StatusValue == (byte)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()
{
await base.OnInitializedAsync();
}
protected override Task OnParametersSetAsync()
{
CurrentStatusType = AllStatuses.FirstOrDefault(x => x.StatusValue == (byte)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>;
}
}