From 304ffd68aeea642b15469eaab04a44c2280a724e Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 23 Jul 2024 21:03:34 +0200 Subject: [PATCH] WIP --- .../EditComponents/DynamicEditForm.razor | 4 +- .../Pages/Components/FullNameEditor.razor | 4 +- .../TransferCardComponent.razor | 195 +++++++++++++++--- .../TransferCardComponent.razor.css | 29 +++ .../User/Drivers/DriverManageTransfers.razor | 117 ++++++++--- TIAMSharedUI/wwwroot/css/TourIAm.css | 4 + TIAMSharedUI/wwwroot/images/defaultavatar.png | Bin 0 -> 8048 bytes .../wwwroot/images/defaultavatar_60.png | Bin 0 -> 3379 bytes 8 files changed, 291 insertions(+), 62 deletions(-) create mode 100644 TIAMSharedUI/Pages/User/CardComponents/TransferCardComponent.razor.css create mode 100644 TIAMSharedUI/wwwroot/images/defaultavatar.png create mode 100644 TIAMSharedUI/wwwroot/images/defaultavatar_60.png diff --git a/TIAMSharedUI/Pages/Components/EditComponents/DynamicEditForm.razor b/TIAMSharedUI/Pages/Components/EditComponents/DynamicEditForm.razor index 62d53e6c..d6a55cb0 100644 --- a/TIAMSharedUI/Pages/Components/EditComponents/DynamicEditForm.razor +++ b/TIAMSharedUI/Pages/Components/EditComponents/DynamicEditForm.razor @@ -9,8 +9,6 @@ @using TIAMWebApp.Shared.Application.Utility @inject IEnumerable LogWriters -

Edit Form

- @if (isEditing) { (j); - editor.AddAttribute(j++, "NullText", "Please tell us your name."); + editor.AddAttribute(j++, "NullText", "Full name"); editor.AddAttribute(j++, "FirstNameChanged", EventCallback.Factory.Create(this, result => { _logger.DetailConditional($"FirstName changed to {result}"); diff --git a/TIAMSharedUI/Pages/Components/FullNameEditor.razor b/TIAMSharedUI/Pages/Components/FullNameEditor.razor index 844a735b..35b8a470 100644 --- a/TIAMSharedUI/Pages/Components/FullNameEditor.razor +++ b/TIAMSharedUI/Pages/Components/FullNameEditor.razor @@ -1,7 +1,7 @@ @using AyCode.Blazor.Components.Components -

+

@NullText -

+ - -
-
-
-
- Transfers - -
-
- -
-
-
-
- -
- -
-
+
+
+
+ +
+
+
@($"{Context.FullName}")
+

@Context.ContactEmail

+

@Context.ContactPhone

+
+
+ +
+
+ @RenderDetailsItem("fa-solid fa-location-dot", "From", Context.FromAddress) +
+
+ @RenderDetailsItem("fa-solid fa-location-dot", "To", Context.ToAddress) +
+
+
+ @RenderDetailsItem("fa-solid fa-users", "Passengers", Context.PassengerCount.ToString()) +
+
+ @RenderDetailsItem("fa-solid fa-suitcase-rolling", "Luggage", Context.LuggageCount.ToString()) +
+
+ @RenderDetailsItem("fa-solid fa-hashtag", "Flight number", Context.FlightNumber) +
+
+
+ @RenderDetailsItem("fa-solid fa-hashtag", "Comment", Context.Comment) +
+
+ @RenderDetailsItem("fa-solid fa-list-check", "Status", AllStatuses.FirstOrDefault(x => x.StatusValue == (byte)Context.TransferStatusType).StatusName) +
+
+ + +
+
+ Save +
+ + +

@msg

+
+
+ @code { - [Parameter] public Guid ContextID { get; set; } + [Parameter] public Transfer Context { get; set; } + + [Parameter] + public EventCallback DataChanged { get; set; } + + private static readonly IEnumerable 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 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(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 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 @
+
+ +
+
+ +
@value
+
+
; + } } diff --git a/TIAMSharedUI/Pages/User/CardComponents/TransferCardComponent.razor.css b/TIAMSharedUI/Pages/User/CardComponents/TransferCardComponent.razor.css new file mode 100644 index 00000000..ca9b8b1d --- /dev/null +++ b/TIAMSharedUI/Pages/User/CardComponents/TransferCardComponent.razor.css @@ -0,0 +1,29 @@ +.e-name { + margin-bottom: 0.25rem; + font-size: 1.25rem; + font-weight: 500; + line-height: 1.2; +} + +.e-email { + font-size: 0.75rem; + text-decoration: underline; + margin-bottom: 0; +} + +.e-title { + font-size: 0.875rem; + margin-bottom: 0.5rem; +} + +.e-details .text-container label { + font-size: 0.8125rem; + line-height: 1rem; +} + +.e-details .text-container { + font-size: 0.875rem; + line-height: 1.125rem; + white-space: nowrap; +} + diff --git a/TIAMSharedUI/Pages/User/Drivers/DriverManageTransfers.razor b/TIAMSharedUI/Pages/User/Drivers/DriverManageTransfers.razor index 18a0c748..08943bd8 100644 --- a/TIAMSharedUI/Pages/User/Drivers/DriverManageTransfers.razor +++ b/TIAMSharedUI/Pages/User/Drivers/DriverManageTransfers.razor @@ -6,6 +6,7 @@ @using TIAM.Resources @using TIAM.Services @using TIAMSharedUI.Pages.Components +@using TIAMSharedUI.Pages.User.CardComponents @using TIAMSharedUI.Pages.User.SysAdmins @using TIAMSharedUI.Shared @using TIAMWebApp.Shared.Application.Interfaces @@ -67,11 +68,30 @@
- +
- + + + + @foreach (var (transfer, i) in Items) + { + + + +
+ +
+
+
+ } +
+
+
@@ -82,22 +102,22 @@
+ Logger="_logger" + GetAllMessageTag="SignalRTags.GetTransfersByUserProductMappingId" + SignalRClient="AdminSignalRClient" + ContextIds="new object[] {driverId}" + OnDataSourceChanged="DataSourceChanged" + OnGridItemChanging="DataSourceItemChanging" + OnGridItemChanged="DataSourceItemChanged" + OnGridItemDeleting="DataItemDeleting" + OnGridEditModelSaving="DataItemSaving" + CustomizeElement="Grid_CustomizeElement" + CustomizeEditModel="Grid_CustomizeEditModel" + EditMode="GridEditMode.EditForm" + ColumnResizeMode="GridColumnResizeMode.NextColumn" + AllowSelectRowByClick="false" + PageSize="13" + ShowFilterRow="true"> @@ -119,7 +139,7 @@ - + @@ -202,7 +222,7 @@ - +
@@ -224,8 +244,7 @@
-
- +
@@ -243,6 +262,12 @@ private bool _popupVisible; private TransferGrid _gridTransfer; + private List? transfers = []; + IEnumerable<(Transfer, int)> Items = []; + + AccordionExpandMode ExpandMode { get; set; } = AccordionExpandMode.SingleOrNone; + AccordionExpandCollapseAction ExpandCollapseAction { get; set; } = AccordionExpandCollapseAction.HeaderClick; + public List IgnoreList = [ "ReceiverEmailAddress", @@ -277,10 +302,17 @@ DateTime StartDate { get; set; } = DateTime.Today; DxSchedulerDataStorage _dataStorage = new(); - protected override Task OnParametersSetAsync() + private void RefreshComponent() + { + StateHasChanged(); + } + + protected override async Task OnParametersSetAsync() { driverId = DriverId; - return base.OnParametersSetAsync(); + // transfers = await AdminSignalRClient.GetByIdAsync>(SignalRTags.GetTransfersByUserProductMappingId, DriverId); + + } void SendMail(Transfer item) @@ -381,6 +413,31 @@ } } + string GetCustomColor(TransferStatusType transferStatusType) + { + + var transferStatusByte = (byte)transferStatusType; + + switch (transferStatusByte) + { + case 5: + return "bg-important"; + + case > 5 and < 35: + return "bg-attention"; + + case 35: + return "bg-finished"; + + case > 35: + return "bg-cancel"; + + default: + return ""; + } + + } + void Grid_CustomizeEditModel(GridCustomizeEditModelEventArgs e) { if (!e.IsNew) return; @@ -457,11 +514,17 @@ _logger.Info($"DataItemDeleting OnItemDeleting"); } - protected override Task OnInitializedAsync() + protected override async Task OnInitializedAsync() { _logger = new LoggerClient(LogWriters.ToArray()); - - return base.OnInitializedAsync(); + if (transfers != null) + { + var test = DriverId.ToString(); + transfers = await AdminSignalRClient.GetByIdAsync>(SignalRTags.GetTransfersByUserProductMappingId, DriverId); + Items = transfers.Select((item, index) => (item, index)); + } + + await base.OnInitializedAsync(); } private void InitializeAppointments(ICollection transferDataList) diff --git a/TIAMSharedUI/wwwroot/css/TourIAm.css b/TIAMSharedUI/wwwroot/css/TourIAm.css index f23f2b43..47df5915 100644 --- a/TIAMSharedUI/wwwroot/css/TourIAm.css +++ b/TIAMSharedUI/wwwroot/css/TourIAm.css @@ -483,6 +483,10 @@ select:focus-visible { -o-background-size: cover; background-size: cover; } + .container-fluid { + padding-left: 0px; + padding-right: 0px; + } } /*forms end*/ diff --git a/TIAMSharedUI/wwwroot/images/defaultavatar.png b/TIAMSharedUI/wwwroot/images/defaultavatar.png new file mode 100644 index 0000000000000000000000000000000000000000..048343de1883dede080439a785f62243126055a4 GIT binary patch literal 8048 zcmV-$ACKUPP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00007 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 YbBga{rY3wxm7g^Z>zr+i*80W%7XtElOaK4? literal 0 HcmV?d00001