add missing record types to attachment export

This commit is contained in:
DESKTOP-T0O5CDB\DESK-555BD 2026-01-03 10:16:04 -07:00
parent 21384f2213
commit 4509eff284
7 changed files with 186 additions and 65 deletions

View File

@ -577,6 +577,24 @@ namespace CarCareTracker.Controllers
} }
return PartialView("_VehicleSelector", vehiclesStored); return PartialView("_VehicleSelector", vehiclesStored);
} }
public ActionResult GetVehicleSelectorOdometer(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("_VehicleSelectorOdometer", vehiclesStored);
}
[Authorize(Roles = nameof(UserData.IsRootUser))] [Authorize(Roles = nameof(UserData.IsRootUser))]
[HttpGet] [HttpGet]
public IActionResult GetCustomWidgetEditor() public IActionResult GetCustomWidgetEditor()

View File

@ -431,6 +431,50 @@ namespace CarCareTracker.Controllers
Files = x.Files Files = x.Files
})); }));
} }
if (exportTabs.Contains(ImportMode.PlanRecord))
{
var records = _planRecordDataAccess.GetPlanRecordsByVehicleId(vehicleId).Where(x => x.Files.Any());
attachmentData.AddRange(records.Select(x => new GenericReportModel
{
DataType = ImportMode.PlanRecord,
Date = x.DateCreated,
Odometer = 0,
Files = x.Files
}));
}
if (exportTabs.Contains(ImportMode.SupplyRecord))
{
var records = _supplyRecordDataAccess.GetSupplyRecordsByVehicleId(vehicleId).Where(x => x.Files.Any());
attachmentData.AddRange(records.Select(x => new GenericReportModel
{
DataType = ImportMode.SupplyRecord,
Date = x.Date,
Odometer = 0,
Files = x.Files
}));
}
if (exportTabs.Contains(ImportMode.InspectionRecord))
{
var records = _inspectionRecordDataAccess.GetInspectionRecordsByVehicleId(vehicleId).Where(x => x.Files.Any());
attachmentData.AddRange(records.Select(x => new GenericReportModel
{
DataType = ImportMode.InspectionRecord,
Date = x.Date,
Odometer = x.Mileage,
Files = x.Files
}));
}
if (exportTabs.Contains(ImportMode.EquipmentRecord))
{
var records = _equipmentRecordDataAccess.GetEquipmentRecordsByVehicleId(vehicleId).Where(x => x.Files.Any());
attachmentData.AddRange(records.Select(x => new GenericReportModel
{
DataType = ImportMode.EquipmentRecord,
Date = DateTime.Now,
Odometer = 0,
Files = x.Files
}));
}
if (attachmentData.Any()) if (attachmentData.Any())
{ {
attachmentData = attachmentData.OrderBy(x => x.Date).ThenBy(x => x.Odometer).ToList(); attachmentData = attachmentData.OrderBy(x => x.Date).ThenBy(x => x.Odometer).ToList();
@ -782,5 +826,10 @@ namespace CarCareTracker.Controllers
var widgets = _fileHelper.GetWidgets(); var widgets = _fileHelper.GetWidgets();
return PartialView("_ReportWidgets", widgets); return PartialView("_ReportWidgets", widgets);
} }
[HttpGet]
public IActionResult GetImportModeSelector()
{
return PartialView("_ImportModeSelector");
}
} }
} }

View File

@ -0,0 +1,32 @@
@inject IConfigHelper config
@inject ITranslationHelper translator
@using CarCareTracker.Helper
@model List<Vehicle>
@{
var userLanguage = config.GetUserConfig(User).UserLanguage;
}
@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>
<div class="mt-2">
<div class="form-check form-check-inline">
<input type="checkbox" id="checkShiftOdometer" class="form-check-input me-1" />
<label for="checkShiftOdometer" class="form-check-label">@translator.Translate(userLanguage, "Shift Odometer")</label>
</div>
</div>
} else
{
<div id="vehicleSelector"><span class="lead">@translator.Translate(userLanguage, "No Vehicles Available")</span></div>
}

View File

@ -0,0 +1,56 @@
@inject IConfigHelper config
@inject ITranslationHelper translator
@using CarCareTracker.Helper
@{
var userLanguage = config.GetUserConfig(User).UserLanguage;
}
<div id="attachmentTabs">
<ul class="list-group">
<li class="list-group-item text-start">
<input class="form-check-input" type="checkbox" value="PlanRecord" id="exportPlanRecord">
<label class="form-check-label stretched-link" for="exportPlanRecord">@translator.Translate(userLanguage, "Planner")</label>
</li>
<li class="list-group-item text-start">
<input class="form-check-input" type="checkbox" value="OdometerRecord" id="exportOdometerRecord">
<label class="form-check-label stretched-link" for="exportOdometerRecord">@translator.Translate(userLanguage, "Odometer")</label>
</li>
<li class="list-group-item text-start">
<input class="form-check-input" type="checkbox" value="ServiceRecord" id="exportServiceRecord">
<label class="form-check-label stretched-link" for="exportServiceRecord">@translator.Translate(userLanguage, "Service Records")</label>
</li>
<li class="list-group-item text-start">
<input class="form-check-input" type="checkbox" value="RepairRecord" id="exportRepairRecord">
<label class="form-check-label stretched-link" for="exportRepairRecord">@translator.Translate(userLanguage, "Repairs")</label>
</li>
<li class="list-group-item text-start">
<input class="form-check-input" type="checkbox" value="UpgradeRecord" id="exportUpgradeRecord">
<label class="form-check-label stretched-link" for="exportUpgradeRecord">@translator.Translate(userLanguage, "Upgrades")</label>
</li>
<li class="list-group-item text-start">
<input class="form-check-input" type="checkbox" value="GasRecord" id="exportGasRecord">
<label class="form-check-label stretched-link" for="exportGasRecord">@translator.Translate(userLanguage, "Fuel")</label>
</li>
<li class="list-group-item text-start">
<input class="form-check-input" type="checkbox" value="SupplyRecord" id="exportSupplyRecord">
<label class="form-check-label stretched-link" for="exportSupplyRecord">@translator.Translate(userLanguage, "Supplies")</label>
</li>
<li class="list-group-item text-start">
<input class="form-check-input" type="checkbox" value="TaxRecord" id="exportTaxRecord">
<label class="form-check-label stretched-link" for="exportTaxRecord">@translator.Translate(userLanguage, "Taxes")</label>
</li>
<li class="list-group-item text-start">
<input class="form-check-input" type="checkbox" value="NoteRecord" id="exportNoteRecord">
<label class="form-check-label stretched-link" for="exportNoteRecord">@translator.Translate(userLanguage, "Notes")</label>
</li>
<li class="list-group-item text-start">
<input class="form-check-input" type="checkbox" value="InspectionRecord" id="exportInspectionRecord">
<label class="form-check-label stretched-link" for="exportInspectionRecord">@translator.Translate(userLanguage, "Inspections")</label>
</li>
<li class="list-group-item text-start">
<input class="form-check-input" type="checkbox" value="EquipmentRecord" id="exportEquipmentRecord">
<label class="form-check-label stretched-link" for="exportEquipmentRecord">@translator.Translate(userLanguage, "Equipment")</label>
</li>
</ul>
</div>

File diff suppressed because one or more lines are too long

View File

@ -404,17 +404,12 @@ function duplicateDistanceToOtherVehicles(ids) {
if (ids.length == 0) { if (ids.length == 0) {
return; return;
} }
$.get(`/Home/GetVehicleSelector?vehicleId=${GetVehicleId().vehicleId}`, function (data) { $.get(`/Home/GetVehicleSelectorOdometer?vehicleId=${GetVehicleId().vehicleId}`, function (data) {
if (data) { if (data) {
let appendHtml = data + `<div class='mt-2'>
<div class='form-check form-check-inline'>
<input type="checkbox" id="checkShiftOdometer" class="form-check-input me-1">
<label for="checkShiftOdometer" class='form-check-label'>Shift Odometer</label>
</div>`
//prompt user to select a vehicle //prompt user to select a vehicle
Swal.fire({ Swal.fire({
title: 'Duplicate Distance to Vehicle(s)', title: 'Duplicate Distance to Vehicle(s)',
html: appendHtml, html: data,
confirmButtonText: 'Duplicate', confirmButtonText: 'Duplicate',
focusConfirm: false, focusConfirm: false,
preConfirm: () => { preConfirm: () => {

View File

@ -321,64 +321,35 @@ function refreshCollaborators() {
}); });
} }
function exportAttachments() { function exportAttachments() {
Swal.fire({ $.get(`/Vehicle/GetImportModeSelector?vehicleId=${GetVehicleId().vehicleId}`, function (selectorData) {
title: 'Export Attachments', Swal.fire({
html: ` title: 'Export Attachments',
<div id='attachmentTabs'> html: selectorData,
<div class='form-check form-check-inline'> confirmButtonText: 'Export',
<input type="checkbox" id="exportServiceRecord" class="form-check-input me-1" value='ServiceRecord'> showCancelButton: true,
<label for="exportServiceRecord" class='form-check-label'>Service Record</label> focusConfirm: false,
</div> preConfirm: () => {
<div class='form-check form-check-inline'> var selectedExportTabs = $("#attachmentTabs :checked").map(function () {
<input type="checkbox" id="exportRepairRecord" class="form-check-input me-1" value='RepairRecord'> return this.value;
<label for="exportRepairRecord" class='form-check-label'>Repairs</label> });
</div> if (selectedExportTabs.toArray().length == 0) {
<div class='form-check form-check-inline'> Swal.showValidationMessage(`Please make at least one selection`)
<input type="checkbox" id="exportUpgradeRecord" class="form-check-input me-1" value='UpgradeRecord'>
<label for="exportUpgradeRecord" class='form-check-label'>Upgrades</label>
</div>
<div class='form-check form-check-inline'>
<input type="checkbox" id="exportGasRecord" class="form-check-input me-1" value='GasRecord'>
<label for="exportGasRecord" class='form-check-label'>Fuel</label>
</div>
<div class='form-check form-check-inline'>
<input type="checkbox" id="exportTaxRecord" class="form-check-input me-1" value='TaxRecord'>
<label for="exportTaxRecord" class='form-check-label'>Taxes</label>
</div>
<div class='form-check form-check-inline'>
<input type="checkbox" id="exportOdometerRecord" class="form-check-input me-1" value='OdometerRecord'>
<label for="exportOdometerRecord" class='form-check-label'>Odometer</label>
</div>
<div class='form-check form-check-inline'>
<input type="checkbox" id="exportNoteRecord" class="form-check-input me-1" value='NoteRecord'>
<label for="exportNoteRecord" class='form-check-label'>Notes</label>
</div>
</div>
`,
confirmButtonText: 'Export',
showCancelButton: true,
focusConfirm: false,
preConfirm: () => {
var selectedExportTabs = $("#attachmentTabs :checked").map(function () {
return this.value;
});
if (selectedExportTabs.toArray().length == 0) {
Swal.showValidationMessage(`Please make at least one selection`)
}
return { selectedTabs: selectedExportTabs.toArray() }
},
}).then(function (result) {
if (result.isConfirmed) {
var vehicleId = GetVehicleId().vehicleId;
$.post('/Vehicle/GetVehicleAttachments', { vehicleId: vehicleId, exportTabs: result.value.selectedTabs }, function (data) {
if (data.success) {
window.location.href = data.message;
} else {
errorToast(data.message);
} }
}) return { selectedTabs: selectedExportTabs.toArray() }
} },
}); }).then(function (result) {
if (result.isConfirmed) {
var vehicleId = GetVehicleId().vehicleId;
$.post('/Vehicle/GetVehicleAttachments', { vehicleId: vehicleId, exportTabs: result.value.selectedTabs }, function (data) {
if (data.success) {
window.location.href = data.message;
} else {
errorToast(data.message);
}
})
}
});
})
} }
function showDataTable(elemClicked) { function showDataTable(elemClicked) {
var vehicleId = GetVehicleId().vehicleId; var vehicleId = GetVehicleId().vehicleId;