Merge pull request #688 from hargata/Hargata/526

Add functionality to duplicate records to other vehicles.
This commit is contained in:
Hargata Softworks 2024-11-01 21:08:59 -06:00 committed by GitHub
commit 59fa7b6a1d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 263 additions and 1 deletions

View File

@ -505,6 +505,24 @@ namespace CarCareTracker.Controllers
return Json(new OperationResponse() { Success = false, Message = StaticHelper.GenericErrorMessage });
}
}
public ActionResult GetVehicleSelector(int vehicleId)
{
var vehiclesStored = _dataAccess.GetVehicles();
if (!User.IsInRole(nameof(UserData.IsRootUser)))
{
vehiclesStored = _userLogic.FilterUserVehicles(vehiclesStored, GetUserID());
}
if (vehicleId != default)
{
vehiclesStored.RemoveAll(x => x.Id == vehicleId);
}
var userConfig = _config.GetUserConfig(User);
if (userConfig.HideSoldVehicles)
{
vehiclesStored.RemoveAll(x => !string.IsNullOrWhiteSpace(x.SoldDate));
}
return PartialView("_VehicleSelector", vehiclesStored);
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{

View File

@ -494,6 +494,7 @@ namespace CarCareTracker.Controllers
}
return Json(result);
}
[HttpPost]
public IActionResult DuplicateRecords(List<int> recordIds, ImportMode importMode)
{
bool result = false;
@ -573,6 +574,125 @@ namespace CarCareTracker.Controllers
return Json(result);
}
[HttpPost]
public IActionResult DuplicateRecordsToOtherVehicles(List<int> recordIds, List<int> vehicleIds, ImportMode importMode)
{
bool result = false;
if (!recordIds.Any() || !vehicleIds.Any())
{
return Json(result);
}
foreach (int recordId in recordIds)
{
switch (importMode)
{
case ImportMode.ServiceRecord:
{
var existingRecord = _serviceRecordDataAccess.GetServiceRecordById(recordId);
existingRecord.Id = default;
foreach(int vehicleId in vehicleIds)
{
existingRecord.VehicleId = vehicleId;
result = _serviceRecordDataAccess.SaveServiceRecordToVehicle(existingRecord);
}
}
break;
case ImportMode.RepairRecord:
{
var existingRecord = _collisionRecordDataAccess.GetCollisionRecordById(recordId);
existingRecord.Id = default;
foreach (int vehicleId in vehicleIds)
{
existingRecord.VehicleId = vehicleId;
result = _collisionRecordDataAccess.SaveCollisionRecordToVehicle(existingRecord);
}
}
break;
case ImportMode.UpgradeRecord:
{
var existingRecord = _upgradeRecordDataAccess.GetUpgradeRecordById(recordId);
existingRecord.Id = default;
foreach (int vehicleId in vehicleIds)
{
existingRecord.VehicleId = vehicleId;
result = _upgradeRecordDataAccess.SaveUpgradeRecordToVehicle(existingRecord);
}
}
break;
case ImportMode.GasRecord:
{
var existingRecord = _gasRecordDataAccess.GetGasRecordById(recordId);
existingRecord.Id = default;
foreach (int vehicleId in vehicleIds)
{
existingRecord.VehicleId = vehicleId;
result = _gasRecordDataAccess.SaveGasRecordToVehicle(existingRecord);
}
}
break;
case ImportMode.TaxRecord:
{
var existingRecord = _taxRecordDataAccess.GetTaxRecordById(recordId);
existingRecord.Id = default;
foreach (int vehicleId in vehicleIds)
{
existingRecord.VehicleId = vehicleId;
result = _taxRecordDataAccess.SaveTaxRecordToVehicle(existingRecord);
}
}
break;
case ImportMode.SupplyRecord:
{
var existingRecord = _supplyRecordDataAccess.GetSupplyRecordById(recordId);
existingRecord.Id = default;
foreach (int vehicleId in vehicleIds)
{
existingRecord.VehicleId = vehicleId;
result = _supplyRecordDataAccess.SaveSupplyRecordToVehicle(existingRecord);
}
}
break;
case ImportMode.NoteRecord:
{
var existingRecord = _noteDataAccess.GetNoteById(recordId);
existingRecord.Id = default;
foreach (int vehicleId in vehicleIds)
{
existingRecord.VehicleId = vehicleId;
result = _noteDataAccess.SaveNoteToVehicle(existingRecord);
}
}
break;
case ImportMode.OdometerRecord:
{
var existingRecord = _odometerRecordDataAccess.GetOdometerRecordById(recordId);
existingRecord.Id = default;
foreach (int vehicleId in vehicleIds)
{
existingRecord.VehicleId = vehicleId;
result = _odometerRecordDataAccess.SaveOdometerRecordToVehicle(existingRecord);
}
}
break;
case ImportMode.ReminderRecord:
{
var existingRecord = _reminderRecordDataAccess.GetReminderRecordById(recordId);
existingRecord.Id = default;
foreach (int vehicleId in vehicleIds)
{
existingRecord.VehicleId = vehicleId;
result = _reminderRecordDataAccess.SaveReminderRecordToVehicle(existingRecord);
}
}
break;
}
}
if (result)
{
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"Duplicated multiple {importMode.ToString()} - Ids: {string.Join(",", recordIds)} - to Vehicle Ids: {string.Join(",", vehicleIds)}");
}
return Json(result);
}
[HttpPost]
public IActionResult GetGenericRecordModal(List<int> recordIds, ImportMode dataType)
{
var extraFields = _extraFieldDataAccess.GetExtraFieldsById((int)dataType).ExtraFields;

View File

@ -0,0 +1,19 @@
@using CarCareTracker.Helper
@model List<Vehicle>
@if (Model.Any())
{
<div id="vehicleSelector">
<ul class="list-group">
@foreach (Vehicle vehicle in Model)
{
<li class="list-group-item text-start">
<input class="form-check-input" type="checkbox" value="@vehicle.Id" id="vehicleCheck_@vehicle.Id">
<label class="form-check-label stretched-link" for="vehicleCheck_@vehicle.Id">@($"{vehicle.Year} {vehicle.Make} {vehicle.Model} ({StaticHelper.GetVehicleIdentifier(vehicle)})")</label>
</li>
}
</ul>
</div>
} else
{
<div id="vehicleSelector"><span class="lead">No Vehicles Available</span></div>
}

View File

@ -168,6 +168,7 @@
<li><a class="dropdown-item" href="#" onclick="moveRecords(selectedRow, 'RepairRecord', 'UpgradeRecord')">@translator.Translate(userLanguage, "Upgrades")</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#" onclick="duplicateRecords(selectedRow, 'RepairRecord')">@translator.Translate(userLanguage, "Duplicate")</a></li>
<li><a class="dropdown-item" href="#" onclick="duplicateRecordsToOtherVehicles(selectedRow, 'RepairRecord')">@translator.Translate(userLanguage, "Duplicate To Vehicle")</a></li>
<li><a class="dropdown-item" href="#" onclick="deleteRecords(selectedRow, 'RepairRecord')">@translator.Translate(userLanguage, "Delete")</a></li>
<li><hr class="context-menu-active-multiple dropdown-divider"></li>
<li><a class="context-menu-active-multiple dropdown-item" href="#" onclick="getRecordsDeltaStats(selectedRow)">@translator.Translate(userLanguage, "Statistics")</a></li>

View File

@ -234,6 +234,7 @@
<li><a class="context-menu-active-multiple dropdown-item" href="#" onclick="editMultipleGasRecords(selectedRow)">@translator.Translate(userLanguage, "Edit Multiple")</a></li>
<li><hr class="context-menu-multiple dropdown-divider"></li>
<li><a class="dropdown-item" href="#" onclick="duplicateRecords(selectedRow, 'GasRecord')">@translator.Translate(userLanguage, "Duplicate")</a></li>
<li><a class="dropdown-item" href="#" onclick="duplicateRecordsToOtherVehicles(selectedRow, 'GasRecord')">@translator.Translate(userLanguage, "Duplicate To Vehicle")</a></li>
<li><a class="dropdown-item" href="#" onclick="deleteRecords(selectedRow, 'GasRecord')">@translator.Translate(userLanguage, "Delete")</a></li>
<li><hr class="context-menu-odometer-adjustment dropdown-divider"></li>
<li><a class="context-menu-odometer-adjustment dropdown-item" href="#" onclick="adjustRecordsOdometer(selectedRow, 'GasRecord')">@translator.Translate(userLanguage, "Adjust Odometer")</a></li>

View File

@ -77,5 +77,6 @@
<li><a class="dropdown-item" href="#" onclick="pinNotes(selectedRow, false, false)">@translator.Translate(userLanguage, "Unpin")</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#" onclick="duplicateRecords(selectedRow, 'NoteRecord')">@translator.Translate(userLanguage, "Duplicate")</a></li>
<li><a class="dropdown-item" href="#" onclick="duplicateRecordsToOtherVehicles(selectedRow, 'NoteRecord')">@translator.Translate(userLanguage, "Duplicate To Vehicle")</a></li>
<li><a class="dropdown-item" href="#" onclick="deleteRecords(selectedRow, 'NoteRecord')">@translator.Translate(userLanguage, "Delete")</a></li>
</ul>

View File

@ -166,6 +166,7 @@
<li><a class="context-menu-multiple context-menu-deselect-all dropdown-item" href="#" onclick="recalculateDistance()">@translator.Translate(userLanguage, "Recalculate Distance")</a></li>
<li><hr class="context-menu-multiple dropdown-divider"></li>
<li><a class="dropdown-item" href="#" onclick="duplicateRecords(selectedRow, 'OdometerRecord')">@translator.Translate(userLanguage, "Duplicate")</a></li>
<li><a class="dropdown-item" href="#" onclick="duplicateRecordsToOtherVehicles(selectedRow, 'OdometerRecord')">@translator.Translate(userLanguage, "Duplicate To Vehicle")</a></li>
<li><a class="dropdown-item" href="#" onclick="deleteRecords(selectedRow, 'OdometerRecord')">@translator.Translate(userLanguage, "Delete")</a></li>
<li><hr class="context-menu-odometer-adjustment dropdown-divider"></li>
<li><a class="context-menu-odometer-adjustment dropdown-item" href="#" onclick="adjustRecordsOdometer(selectedRow, 'OdometerRecord')">@translator.Translate(userLanguage, "Adjust Odometer")</a></li>

View File

@ -121,6 +121,7 @@
<li><a class="context-menu-multiple context-menu-deselect-all dropdown-item" href="#" onclick="clearSelectedRows()">@translator.Translate(userLanguage, "Deselect All")</a></li>
<li><hr class="context-menu-multiple dropdown-divider"></li>
<li><a class="dropdown-item" href="#" onclick="duplicateRecords(selectedRow, 'ReminderRecord')">@translator.Translate(userLanguage, "Duplicate")</a></li>
<li><a class="dropdown-item" href="#" onclick="duplicateRecordsToOtherVehicles(selectedRow, 'ReminderRecord')">@translator.Translate(userLanguage, "Duplicate To Vehicle")</a></li>
<li><a class="dropdown-item" href="#" onclick="deleteRecords(selectedRow, 'ReminderRecord')">@translator.Translate(userLanguage, "Delete")</a></li>
</ul>

View File

@ -166,6 +166,7 @@
<li><a class="dropdown-item" href="#" onclick="moveRecords(selectedRow, 'ServiceRecord', 'UpgradeRecord')">@translator.Translate(userLanguage, "Upgrades")</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#" onclick="duplicateRecords(selectedRow, 'ServiceRecord')">@translator.Translate(userLanguage, "Duplicate")</a></li>
<li><a class="dropdown-item" href="#" onclick="duplicateRecordsToOtherVehicles(selectedRow, 'ServiceRecord')">@translator.Translate(userLanguage, "Duplicate To Vehicle")</a></li>
<li><a class="dropdown-item" href="#" onclick="deleteRecords(selectedRow, 'ServiceRecord')">@translator.Translate(userLanguage, "Delete")</a></li>
<li><hr class="context-menu-active-multiple dropdown-divider"></li>
<li><a class="context-menu-active-multiple dropdown-item" href="#" onclick="getRecordsDeltaStats(selectedRow)">@translator.Translate(userLanguage, "Statistics")</a></li>

View File

@ -179,6 +179,7 @@
<li><a class="context-menu-multiple context-menu-deselect-all dropdown-item" href="#" onclick="clearSelectedRows()">@translator.Translate(userLanguage, "Deselect All")</a></li>
<li><hr class="context-menu-multiple dropdown-divider"></li>
<li><a class="dropdown-item" href="#" onclick="duplicateRecords(selectedRow, 'SupplyRecord')">@translator.Translate(userLanguage, "Duplicate")</a></li>
<li><a class="dropdown-item" href="#" onclick="duplicateRecordsToOtherVehicles(selectedRow, 'SupplyRecord')">@translator.Translate(userLanguage, "Duplicate To Vehicle")</a></li>
<li><a class="dropdown-item" href="#" onclick="deleteRecords(selectedRow, 'SupplyRecord')">@translator.Translate(userLanguage, "Delete")</a></li>
</ul>
@if (userColumnPreferences.Any())

View File

@ -155,6 +155,7 @@
<li><a class="context-menu-multiple context-menu-deselect-all dropdown-item" href="#" onclick="clearSelectedRows()">@translator.Translate(userLanguage, "Deselect All")</a></li>
<li><hr class="context-menu-multiple dropdown-divider"></li>
<li><a class="dropdown-item" href="#" onclick="duplicateRecords(selectedRow, 'TaxRecord')">@translator.Translate(userLanguage, "Duplicate")</a></li>
<li><a class="dropdown-item" href="#" onclick="duplicateRecordsToOtherVehicles(selectedRow, 'TaxRecord')">@translator.Translate(userLanguage, "Duplicate To Vehicle")</a></li>
<li><a class="dropdown-item" href="#" onclick="deleteRecords(selectedRow, 'TaxRecord')">@translator.Translate(userLanguage, "Delete")</a></li>
</ul>
@if (userColumnPreferences.Any())

View File

@ -167,6 +167,7 @@
<li><a class="dropdown-item" href="#" onclick="moveRecords(selectedRow, 'UpgradeRecord', 'RepairRecord')">@translator.Translate(userLanguage, "Repairs")</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#" onclick="duplicateRecords(selectedRow, 'UpgradeRecord')">@translator.Translate(userLanguage, "Duplicate")</a></li>
<li><a class="dropdown-item" href="#" onclick="duplicateRecordsToOtherVehicles(selectedRow, 'UpgradeRecord')">@translator.Translate(userLanguage, "Duplicate To Vehicle")</a></li>
<li><a class="dropdown-item" href="#" onclick="deleteRecords(selectedRow, 'UpgradeRecord')">@translator.Translate(userLanguage, "Delete")</a></li>
<li><hr class="context-menu-active-multiple dropdown-divider"></li>
<li><a class="context-menu-active-multiple dropdown-item" href="#" onclick="getRecordsDeltaStats(selectedRow)">@translator.Translate(userLanguage, "Statistics")</a></li>

File diff suppressed because one or more lines are too long

View File

@ -849,6 +849,85 @@ function duplicateRecords(ids, source) {
}
});
}
function duplicateRecordsToOtherVehicles(ids, source) {
if (ids.length == 0) {
return;
}
$("#workAroundInput").show();
var friendlySource = "";
var refreshDataCallBack;
var recordVerbiage = ids.length > 1 ? `these ${ids.length} records` : "this record";
switch (source) {
case "ServiceRecord":
friendlySource = "Service Records";
refreshDataCallBack = getVehicleServiceRecords;
break;
case "RepairRecord":
friendlySource = "Repairs";
refreshDataCallBack = getVehicleCollisionRecords;
break;
case "UpgradeRecord":
friendlySource = "Upgrades";
refreshDataCallBack = getVehicleUpgradeRecords;
break;
case "TaxRecord":
friendlySource = "Taxes";
refreshDataCallBack = getVehicleTaxRecords;
break;
case "SupplyRecord":
friendlySource = "Supplies";
refreshDataCallBack = getVehicleSupplyRecords;
break;
case "NoteRecord":
friendlySource = "Notes";
refreshDataCallBack = getVehicleNotes;
break;
case "OdometerRecord":
friendlySource = "Odometer Records";
refreshDataCallBack = getVehicleOdometerRecords;
break;
case "ReminderRecord":
friendlySource = "Reminders";
refreshDataCallBack = getVehicleReminders;
break;
case "GasRecord":
friendlySource = "Fuel Records";
refreshDataCallBack = getVehicleGasRecords;
break;
}
$.get(`/Home/GetVehicleSelector?vehicleId=${GetVehicleId().vehicleId}`, function (data) {
if (data) {
//prompt user to select a vehicle
Swal.fire({
title: 'Duplicate to Vehicle(s)',
html: data,
confirmButtonText: 'Duplicate',
focusConfirm: false,
preConfirm: () => {
//validate
var selectedVehicleData = getAndValidateSelectedVehicle();
if (selectedVehicleData.hasError) {
Swal.showValidationMessage(`You must select a vehicle`);
}
return { selectedVehicleData }
},
}).then(function (result) {
if (result.isConfirmed) {
$.post('/Vehicle/DuplicateRecordsToOtherVehicles', { recordIds: ids, vehicleIds: result.value.selectedVehicleData.ids, importMode: source}, function (data) {
if (data) {
successToast(`${ids.length} Record(s) Duplicated`);
} else {
errorToast(genericErrorMessage());
}
});
}
});
} else {
errorToast(genericErrorMessage());
}
})
}
var selectedRow = [];
var isDragging = false;
$(window).on('mouseup', function (e) {

View File

@ -572,6 +572,23 @@ function showMultipleRemindersSelector() {
$("#recurringReminderInput").show();
}
}
function getAndValidateSelectedVehicle() {
var selectedVehiclesArray = [];
$("#vehicleSelector :checked").map(function () {
selectedVehiclesArray.push(this.value);
});
if (selectedVehiclesArray.length == 0) {
return {
hasError: true,
ids: []
}
} else {
return {
hasError: false,
ids: selectedVehiclesArray
}
}
}
function getAndValidateSelectedRecurringReminder() {
if ($("#multipleRemindersCheck").is(":checked")) {
//validate multiple reminders