From 5204a71b00c217f7f8d1843b229985945ea55fe9 Mon Sep 17 00:00:00 2001 From: "DESKTOP-T0O5CDB\\DESK-555BD" Date: Mon, 19 Feb 2024 21:57:11 -0700 Subject: [PATCH] added option to bulk move records across service, upgrade, and repair. --- Controllers/VehicleController.cs | 51 ++++++++++ Helper/StaticHelper.cs | 9 +- Views/Vehicle/_CollisionRecords.cshtml | 10 +- Views/Vehicle/_ServiceRecords.cshtml | 10 +- Views/Vehicle/_UpgradeRecords.cshtml | 10 +- wwwroot/js/vehicle.js | 128 ++++++++++++++++++++++--- 6 files changed, 197 insertions(+), 21 deletions(-) diff --git a/Controllers/VehicleController.cs b/Controllers/VehicleController.cs index baf56c0..08da45b 100644 --- a/Controllers/VehicleController.cs +++ b/Controllers/VehicleController.cs @@ -2040,6 +2040,57 @@ namespace CarCareTracker.Controllers } return Json(result); } + public IActionResult MoveRecords(List recordIds, ImportMode source, ImportMode destination) + { + var genericRecord = new GenericRecord(); + bool result = false; + foreach(int recordId in recordIds) + { + //get + switch (source) + { + case ImportMode.ServiceRecord: + genericRecord = _serviceRecordDataAccess.GetServiceRecordById(recordId); + break; + case ImportMode.RepairRecord: + genericRecord = _collisionRecordDataAccess.GetCollisionRecordById(recordId); + break; + case ImportMode.UpgradeRecord: + genericRecord = _upgradeRecordDataAccess.GetUpgradeRecordById(recordId); + break; + } + //save + switch (destination) + { + case ImportMode.ServiceRecord: + result = _serviceRecordDataAccess.SaveServiceRecordToVehicle(StaticHelper.GenericToServiceRecord(genericRecord)); + break; + case ImportMode.RepairRecord: + result = _collisionRecordDataAccess.SaveCollisionRecordToVehicle(StaticHelper.GenericToRepairRecord(genericRecord)); + break; + case ImportMode.UpgradeRecord: + result = _upgradeRecordDataAccess.SaveUpgradeRecordToVehicle(StaticHelper.GenericToUpgradeRecord(genericRecord)); + break; + } + //delete + if (result) + { + switch (source) + { + case ImportMode.ServiceRecord: + _serviceRecordDataAccess.DeleteServiceRecordById(recordId); + break; + case ImportMode.RepairRecord: + _collisionRecordDataAccess.DeleteCollisionRecordById(recordId); + break; + case ImportMode.UpgradeRecord: + _upgradeRecordDataAccess.DeleteUpgradeRecordById(recordId); + break; + } + } + } + return Json(result); + } #endregion } diff --git a/Helper/StaticHelper.cs b/Helper/StaticHelper.cs index fcc9696..047c9b2 100644 --- a/Helper/StaticHelper.cs +++ b/Helper/StaticHelper.cs @@ -130,7 +130,8 @@ namespace CarCareTracker.Helper Files = input.Files, Notes = input.Notes, Tags = input.Tags, - ExtraFields = input.ExtraFields + ExtraFields = input.ExtraFields, + RequisitionHistory = input.RequisitionHistory }; } public static CollisionRecord GenericToRepairRecord(GenericRecord input) @@ -145,7 +146,8 @@ namespace CarCareTracker.Helper Files = input.Files, Notes = input.Notes, Tags = input.Tags, - ExtraFields = input.ExtraFields + ExtraFields = input.ExtraFields, + RequisitionHistory = input.RequisitionHistory }; } public static UpgradeRecord GenericToUpgradeRecord(GenericRecord input) @@ -160,7 +162,8 @@ namespace CarCareTracker.Helper Files = input.Files, Notes = input.Notes, Tags = input.Tags, - ExtraFields = input.ExtraFields + ExtraFields = input.ExtraFields, + RequisitionHistory = input.RequisitionHistory }; } diff --git a/Views/Vehicle/_CollisionRecords.cshtml b/Views/Vehicle/_CollisionRecords.cshtml index 95c00d7..d6ea871 100644 --- a/Views/Vehicle/_CollisionRecords.cshtml +++ b/Views/Vehicle/_CollisionRecords.cshtml @@ -68,7 +68,7 @@ @foreach (CollisionRecord collisionRecord in Model) { - + @collisionRecord.Date.ToShortDateString() @collisionRecord.Mileage @collisionRecord.Description @@ -87,4 +87,10 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/Views/Vehicle/_ServiceRecords.cshtml b/Views/Vehicle/_ServiceRecords.cshtml index 4427c69..7d33667 100644 --- a/Views/Vehicle/_ServiceRecords.cshtml +++ b/Views/Vehicle/_ServiceRecords.cshtml @@ -68,7 +68,7 @@ @foreach (ServiceRecord serviceRecord in Model) { - + @serviceRecord.Date.ToShortDateString() @serviceRecord.Mileage @serviceRecord.Description @@ -88,4 +88,10 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/Views/Vehicle/_UpgradeRecords.cshtml b/Views/Vehicle/_UpgradeRecords.cshtml index fac82ab..d4611ee 100644 --- a/Views/Vehicle/_UpgradeRecords.cshtml +++ b/Views/Vehicle/_UpgradeRecords.cshtml @@ -68,7 +68,7 @@ @foreach (UpgradeRecord upgradeRecord in Model) { - + @upgradeRecord.Date.ToShortDateString() @upgradeRecord.Mileage @upgradeRecord.Description @@ -86,4 +86,10 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/wwwroot/js/vehicle.js b/wwwroot/js/vehicle.js index 826b3df..3aa529f 100644 --- a/wwwroot/js/vehicle.js +++ b/wwwroot/js/vehicle.js @@ -328,6 +328,68 @@ function moveRecord(recordId, source, dest) { } }); } +function moveRecords(ids, source, dest) { + if (ids.length == 0) { + return; + } + $("#workAroundInput").show(); + var friendlySource = ""; + var friendlyDest = ""; + var hideModalCallBack; + var refreshDataCallBack; + var recordVerbiage = selectedRow.length > 1 ? "these records" : "this record"; + switch (source) { + case "ServiceRecord": + friendlySource = "Service Records"; + hideModalCallBack = hideAddServiceRecordModal; + refreshDataCallBack = getVehicleServiceRecords; + break; + case "RepairRecord": + friendlySource = "Repairs"; + hideModalCallBack = hideAddCollisionRecordModal; + refreshDataCallBack = getVehicleCollisionRecords; + break; + case "UpgradeRecord": + friendlySource = "Upgrades"; + hideModalCallBack = hideAddUpgradeRecordModal; + refreshDataCallBack = getVehicleUpgradeRecords; + break; + } + switch (dest) { + case "ServiceRecord": + friendlyDest = "Service Records"; + break; + case "RepairRecord": + friendlyDest = "Repairs"; + break; + case "UpgradeRecord": + friendlyDest = "Upgrades"; + break; + } + + Swal.fire({ + title: "Confirm Move?", + text: `Move ${recordVerbiage} from ${friendlySource} to ${friendlyDest}?`, + showCancelButton: true, + confirmButtonText: "Move", + confirmButtonColor: "#dc3545" + }).then((result) => { + if (result.isConfirmed) { + $.post('/Vehicle/MoveRecords', { recordIds: ids, source: source, destination: dest }, function (data) { + if (data) { + hideModalCallBack(); + successToast("Records Moved"); + var vehicleId = GetVehicleId().vehicleId; + refreshDataCallBack(vehicleId); + } else { + errorToast(genericErrorMessage()); + } + }); + } else { + $("#workAroundInput").hide(); + } + }); +} var selectedRow = []; var isDragging = false; $(window).on('mouseup', function (e) { @@ -337,23 +399,26 @@ $(window).on('mousedown', function (e) { rangeMouseDown(e); }); $(window).on('keydown', function (e) { - if (e.ctrlKey && e.which == 65) { - e.preventDefault(); - e.stopPropagation(); - selectedRow = []; - $('.vehicleDetailTabContainer .table tbody tr').addClass('table-active'); - $('.vehicleDetailTabContainer .table tbody tr').map((index, elem) => { - selectedRow.push($(elem).attr('data-rowId')); - }); + var userOnInput = $(e.target).is("input") || $(e.target).is("textarea"); + if (!userOnInput) { + if (e.ctrlKey && e.which == 65) { + e.preventDefault(); + e.stopPropagation(); + clearSelectedRows(); + $('.vehicleDetailTabContainer .table tbody tr').addClass('table-active'); + $('.vehicleDetailTabContainer .table tbody tr').map((index, elem) => { + addToSelectedRows($(elem).attr('data-rowId')); + }); + } } }) function rangeMouseDown(e) { if (isRightClick(e)) { return; } - if (!e.ctrlKey) { - selectedRow = []; - $('.table tr').removeClass('table-active'); + var contextMenuAction = $(e.target).is(".table-context-menu > li > .dropdown-item") + if (!e.ctrlKey && !contextMenuAction) { + clearSelectedRows(); } isDragging = true; @@ -368,6 +433,9 @@ function isRightClick(e) { return false; } function rangeMouseUp(e) { + if ($(".table-context-menu").length > 0) { + $(".table-context-menu").hide(); + } if (isRightClick(e)) { return; } @@ -377,8 +445,44 @@ function rangeMouseUp(e) { function rangeMouseMove(e) { if (isDragging) { if (!$(e).hasClass('table-active')) { - selectedRow.push($(e).attr('data-rowId')); + addToSelectedRows($(e).attr('data-rowId')); $(e).addClass('table-active'); } } +} +function addToSelectedRows(id) { + if (selectedRow.findIndex(x=> x == id) == -1) { + selectedRow.push(id); + } +} +function clearSelectedRows() { + selectedRow = []; + $('.table tr').removeClass('table-active'); +} +function showTableContextMenu(e) { + if (event != undefined) { + event.preventDefault(); + } + $(".table-context-menu").show(); + $(".table-context-menu").css({ + position: "absolute", + left: getMenuPosition(event.clientX, 'width', 'scrollLeft'), + top: getMenuPosition(event.clientY, 'height', 'scrollTop') + }); + if (!$(e).hasClass('table-active')) { + clearSelectedRows(); + addToSelectedRows($(e).attr('data-rowId')); + $(e).addClass('table-active'); + } +} +function getMenuPosition(mouse, direction, scrollDir) { + var win = $(window)[direction](), + scroll = $(window)[scrollDir](), + menu = $(".table-context-menu")[direction](), + position = mouse + scroll; + + // opening menu would pass the side of the page + if (mouse + menu > win && menu < mouse) + position -= menu; + return position; } \ No newline at end of file