add ability to link equipment to odometer record.

This commit is contained in:
DESKTOP-T0O5CDB\DESK-555BD 2026-01-01 12:28:47 -07:00
parent 22090b7d7c
commit 64497ab55d
19 changed files with 292 additions and 15 deletions

View File

@ -36,7 +36,7 @@ namespace CarCareTracker.Controllers
}
result.Add(viewModel);
}
result = result.OrderByDescending(x => x.IsEquipped).ToList();
result = result.OrderByDescending(x => x.IsEquipped).ThenBy(x=>x.Description).ToList();
return PartialView("Equipment/_EquipmentRecords", result);
}
[HttpPost]
@ -71,6 +71,17 @@ namespace CarCareTracker.Controllers
{
return Redirect("/Error/Unauthorized");
}
var odometerRecords = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(result.VehicleId);
var linkedOdometerRecords = odometerRecords.Where(x => x.EquipmentRecordId.Contains(equipmentRecordId));
bool _useDescending = _config.GetUserConfig(User).UseDescending;
if (_useDescending)
{
linkedOdometerRecords = linkedOdometerRecords.OrderByDescending(x => x.Date).ThenByDescending(x => x.Mileage).ToList();
}
else
{
linkedOdometerRecords = linkedOdometerRecords.OrderBy(x => x.Date).ThenBy(x => x.Mileage).ToList();
}
//convert to Input object.
var convertedResult = new EquipmentRecordInput
{
@ -81,6 +92,7 @@ namespace CarCareTracker.Controllers
VehicleId = result.VehicleId,
Files = result.Files,
Tags = result.Tags,
OdometerRecords = linkedOdometerRecords.ToList(),
ExtraFields = StaticHelper.AddExtraFields(result.ExtraFields, _extraFieldDataAccess.GetExtraFieldsById((int)ImportMode.EquipmentRecord).ExtraFields)
};
return PartialView("Equipment/_EquipmentRecordModal", convertedResult);
@ -100,7 +112,7 @@ namespace CarCareTracker.Controllers
{
foreach(OdometerRecord linkedOdometerRecord in linkedOdometerRecords)
{
linkedOdometerRecord.EquipmentRecordId.RemoveAll(x=>x == equipmentRecordId);
linkedOdometerRecord.EquipmentRecordId.RemoveAll(x => x == equipmentRecordId);
_odometerRecordDataAccess.SaveOdometerRecordToVehicle(linkedOdometerRecord);
}
}
@ -112,9 +124,9 @@ namespace CarCareTracker.Controllers
return OperationResponse.Conditional(result, string.Empty, StaticHelper.GenericErrorMessage);
}
[HttpPost]
public IActionResult DeleteEquipmentRecordById(int collisionRecordId)
public IActionResult DeleteEquipmentRecordById(int equipmentRecordId)
{
var result = DeleteEquipmentRecordWithChecks(collisionRecordId);
var result = DeleteEquipmentRecordWithChecks(equipmentRecordId);
return Json(result);
}
}

View File

@ -165,6 +165,26 @@ namespace CarCareTracker.Controllers
}
}
break;
case ImportMode.EquipmentRecord:
{
var exportData = new List<EquipmentRecordExportModel> { new EquipmentRecordExportModel
{
Description = "Test",
Notes = "Test Note",
Tags = "test1 test2",
IsEquipped = true.ToString()
} };
using (var writer = new StreamWriter(fullExportFilePath))
{
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
//custom writer
StaticHelper.WriteEquipmentRecordExportModel(csv, exportData);
}
writer.Dispose();
}
}
break;
default:
return Json(OperationResponse.Failed("No parameters"));
}
@ -253,7 +273,7 @@ namespace CarCareTracker.Controllers
writer.Dispose();
}
return Json($"/{fileNameToExport}");
}
}
else
{
return Json(OperationResponse.Failed("No Records"));
@ -555,6 +575,33 @@ namespace CarCareTracker.Controllers
return Json(OperationResponse.Failed("No Records"));
}
}
else if (mode == ImportMode.EquipmentRecord)
{
var vehicleRecords = _equipmentRecordDataAccess.GetEquipmentRecordsByVehicleId(vehicleId);
if (vehicleRecords.Any())
{
var exportData = vehicleRecords.Select(x => new EquipmentRecordExportModel
{
Description = x.Description,
Tags = string.Join(" ", x.Tags),
Notes = x.Notes,
IsEquipped = x.IsEquipped.ToString(),
ExtraFields = x.ExtraFields
});
using (var writer = new StreamWriter(fullExportFilePath))
{
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
StaticHelper.WriteEquipmentRecordExportModel(csv, exportData);
}
}
return Json($"/{fileNameToExport}");
}
else
{
return Json(OperationResponse.Failed("No Records"));
}
}
else if (mode == ImportMode.GasRecord)
{
var vehicleRecords = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId);
@ -830,6 +877,19 @@ namespace CarCareTracker.Controllers
});
}
}
else if (mode == ImportMode.EquipmentRecord)
{
var convertedRecord = new EquipmentRecord()
{
VehicleId = vehicleId,
Description = importModel.Description,
Notes = string.IsNullOrWhiteSpace(importModel.Notes) ? "" : importModel.Notes,
Tags = string.IsNullOrWhiteSpace(importModel.Tags) ? [] : importModel.Tags.Split(" ").ToList(),
IsEquipped = bool.Parse(importModel.IsEquipped),
ExtraFields = importModel.ExtraFields.Any() ? importModel.ExtraFields.Select(x => new ExtraField { Name = x.Key, Value = x.Value, IsRequired = requiredExtraFields.Contains(x.Key) }).ToList() : new List<ExtraField>()
};
_equipmentRecordDataAccess.SaveEquipmentRecordToVehicle(convertedRecord);
}
else if (mode == ImportMode.SupplyRecord)
{
var convertedRecord = new SupplyRecord()

View File

@ -62,13 +62,26 @@ namespace CarCareTracker.Controllers
[HttpGet]
public IActionResult GetAddOdometerRecordPartialView(int vehicleId)
{
return PartialView("Odometer/_OdometerRecordModal", new OdometerRecordInput() { InitialMileage = _odometerLogic.GetLastOdometerRecordMileage(vehicleId, new List<OdometerRecord>()), ExtraFields = _extraFieldDataAccess.GetExtraFieldsById((int)ImportMode.OdometerRecord).ExtraFields });
return PartialView("Odometer/_OdometerRecordModal", new OdometerRecordInput() {
InitialMileage = _odometerLogic.GetLastOdometerRecordMileage(vehicleId, new List<OdometerRecord>()),
ExtraFields = _extraFieldDataAccess.GetExtraFieldsById((int)ImportMode.OdometerRecord).ExtraFields,
EquipmentRecords = _equipmentRecordDataAccess.GetEquipmentRecordsByVehicleId(vehicleId).OrderByDescending(x => x.IsEquipped).ThenBy(x => x.Description).ToList()
});
}
[HttpPost]
public IActionResult GetOdometerRecordsEditModal(List<int> recordIds)
public IActionResult GetOdometerRecordsEditModal(List<int> recordIds, int vehicleId)
{
var extraFields = _extraFieldDataAccess.GetExtraFieldsById((int)ImportMode.OdometerRecord).ExtraFields;
return PartialView("Odometer/_OdometerRecordsModal", new OdometerRecordEditModel { RecordIds = recordIds, EditRecord = new OdometerRecord { ExtraFields = extraFields } });
var equipmentRecords = _equipmentRecordDataAccess.GetEquipmentRecordsByVehicleId(vehicleId).OrderByDescending(x => x.IsEquipped).ThenBy(x => x.Description).ToList();
foreach(EquipmentRecord equipmentRecord in equipmentRecords)
{
equipmentRecord.IsEquipped = false;
}
return PartialView("Odometer/_OdometerRecordsModal", new OdometerRecordEditModel {
RecordIds = recordIds,
EditRecord = new OdometerRecord { ExtraFields = extraFields },
EquipmentRecords = equipmentRecords
});
}
[HttpPost]
public IActionResult SaveMultipleOdometerRecords(OdometerRecordEditModel editModel)
@ -79,6 +92,7 @@ namespace CarCareTracker.Controllers
var noteIsEdited = !string.IsNullOrWhiteSpace(editModel.EditRecord.Notes);
var tagsIsEdited = editModel.EditRecord.Tags.Any();
var extraFieldIsEdited = editModel.EditRecord.ExtraFields.Any();
var equipmentIsEdited = editModel.EditEquipment;
//handle clear overrides
if (tagsIsEdited && editModel.EditRecord.Tags.Contains("---"))
{
@ -133,6 +147,10 @@ namespace CarCareTracker.Controllers
}
}
}
if (equipmentIsEdited)
{
existingRecord.EquipmentRecordId = editModel.EditRecord.EquipmentRecordId;
}
result = _odometerRecordDataAccess.SaveOdometerRecordToVehicle(existingRecord);
}
return Json(OperationResponse.Conditional(result, string.Empty, StaticHelper.GenericErrorMessage));
@ -146,6 +164,12 @@ namespace CarCareTracker.Controllers
{
return Redirect("/Error/Unauthorized");
}
//check for equipment
var equipmentRecords = _equipmentRecordDataAccess.GetEquipmentRecordsByVehicleId(result.VehicleId).OrderByDescending(x => x.IsEquipped).ThenBy(x => x.Description).ToList();
foreach(EquipmentRecord equipmentRecord in equipmentRecords)
{
equipmentRecord.IsEquipped = result.EquipmentRecordId.Contains(equipmentRecord.Id);
}
//convert to Input object.
var convertedResult = new OdometerRecordInput
{
@ -158,7 +182,7 @@ namespace CarCareTracker.Controllers
Files = result.Files,
Tags = result.Tags,
ExtraFields = StaticHelper.AddExtraFields(result.ExtraFields, _extraFieldDataAccess.GetExtraFieldsById((int)ImportMode.OdometerRecord).ExtraFields),
EquipmentRecordId = result.EquipmentRecordId
EquipmentRecords = equipmentRecords
};
return PartialView("Odometer/_OdometerRecordModal", convertedResult);
}

View File

@ -703,6 +703,33 @@ namespace CarCareTracker.Helper
_csv.NextRecord();
}
}
public static void WriteEquipmentRecordExportModel(CsvWriter _csv, IEnumerable<EquipmentRecordExportModel> genericRecords)
{
var extraHeaders = genericRecords.SelectMany(x => x.ExtraFields).Select(y => y.Name).Distinct();
//write headers
_csv.WriteField(nameof(EquipmentRecordExportModel.Description));
_csv.WriteField(nameof(EquipmentRecordExportModel.Notes));
_csv.WriteField(nameof(EquipmentRecordExportModel.Tags));
_csv.WriteField(nameof(EquipmentRecordExportModel.IsEquipped));
foreach (string extraHeader in extraHeaders)
{
_csv.WriteField($"extrafield_{extraHeader}");
}
_csv.NextRecord();
foreach (EquipmentRecordExportModel genericRecord in genericRecords)
{
_csv.WriteField(genericRecord.Description);
_csv.WriteField(genericRecord.Notes);
_csv.WriteField(genericRecord.Tags);
_csv.WriteField(genericRecord.IsEquipped);
foreach (string extraHeader in extraHeaders)
{
var extraField = genericRecord.ExtraFields.Where(x => x.Name == extraHeader).FirstOrDefault();
_csv.WriteField(extraField != null ? extraField.Value : string.Empty);
}
_csv.NextRecord();
}
}
public static void WriteAttachmentExportModel(CsvWriter _csv, IEnumerable<AttachmentExportModel> genericRecords)
{
//write headers

View File

@ -12,10 +12,12 @@ namespace CarCareTracker.Logic
public class OdometerLogic: IOdometerLogic
{
private readonly IOdometerRecordDataAccess _odometerRecordDataAccess;
private readonly IEquipmentRecordDataAccess _equipmentRecordDataAccess;
private readonly ILogger<IOdometerLogic> _logger;
public OdometerLogic(IOdometerRecordDataAccess odometerRecordDataAccess, ILogger<IOdometerLogic> logger)
public OdometerLogic(IOdometerRecordDataAccess odometerRecordDataAccess, IEquipmentRecordDataAccess equipmentRecordDataAccess, ILogger<IOdometerLogic> logger)
{
_odometerRecordDataAccess = odometerRecordDataAccess;
_equipmentRecordDataAccess = equipmentRecordDataAccess;
_logger = logger;
}
public int GetLastOdometerRecordMileage(int vehicleId, List<OdometerRecord> odometerRecords)
@ -39,7 +41,13 @@ namespace CarCareTracker.Logic
}
var lastReportedMileage = GetLastOdometerRecordMileage(odometer.VehicleId, new List<OdometerRecord>());
odometer.InitialMileage = lastReportedMileage != default ? lastReportedMileage : odometer.Mileage;
//add equipment
var equipmentRecords = _equipmentRecordDataAccess.GetEquipmentRecordsByVehicleId(odometer.VehicleId);
var equippedEquipment = equipmentRecords.Where(x => x.IsEquipped);
if (equippedEquipment.Any())
{
odometer.EquipmentRecordId = equippedEquipment.Select(x => x.Id).ToList();
}
var result = _odometerRecordDataAccess.SaveOdometerRecordToVehicle(odometer);
return result;
}

View File

@ -30,6 +30,7 @@ namespace CarCareTracker.MapProfile
Map(m => m.Type).Name(["type"]);
Map(m => m.Priority).Name(["priority"]);
Map(m => m.Tags).Name(["tags"]);
Map(m => m.IsEquipped).Name(["isequipped"]);
Map(m => m.ExtraFields).Convert(row =>
{
var attributes = new Dictionary<string, string>();

View File

@ -10,6 +10,7 @@
public List<string> Tags { get; set; } = new List<string>();
public List<UploadedFiles> Files { get; set; } = new List<UploadedFiles>();
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
public List<OdometerRecord> OdometerRecords { get; set; } = new List<OdometerRecord>();
public EquipmentRecord ToEquipmentRecord() {
return new EquipmentRecord
{

View File

@ -4,5 +4,7 @@
{
public List<int> RecordIds { get; set; } = new List<int>();
public OdometerRecord EditRecord { get; set; } = new OdometerRecord();
public bool EditEquipment { get; set; } = false;
public List<EquipmentRecord> EquipmentRecords { get; set; } = new List<EquipmentRecord>();
}
}

View File

@ -12,6 +12,7 @@
public List<string> Tags { get; set; } = new List<string>();
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
public List<int> EquipmentRecordId { get; set; } = new List<int>();
public List<EquipmentRecord> EquipmentRecords { get; set; } = new List<EquipmentRecord>();
public OdometerRecord ToOdometerRecord() { return new OdometerRecord {
Id = Id,
VehicleId = VehicleId,

View File

@ -30,6 +30,7 @@ namespace CarCareTracker.Models
public string PartSupplier { get; set; }
public string PartQuantity { get; set; }
public string Tags { get; set; }
public string IsEquipped { get; set; }
public Dictionary<string,string> ExtraFields {get;set;}
}
@ -119,6 +120,18 @@ namespace CarCareTracker.Models
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
public List<UploadedFiles> Files { get; set; } = new List<UploadedFiles>();
}
public class EquipmentRecordExportModel
{
[JsonConverter(typeof(FromIntOptional))]
public string Id { get; set; }
public string Description { get; set; }
[JsonConverter(typeof(FromBoolOptional))]
public string IsEquipped { get; set; }
public string Notes { get; set; }
public string Tags { get; set; }
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
public List<UploadedFiles> Files { get; set; } = new List<UploadedFiles>();
}
public class ReminderExportModel
{
[JsonConverter(typeof(FromIntOptional))]

View File

@ -50,6 +50,10 @@
<div class="modal-footer">
@if (!isNew)
{
@if (Model.OdometerRecords.Any())
{
<button type="button" class="btn btn-warning" onclick="toggleOdometerHistory()"><i class="bi bi-speedometer"></i></button>
}
<button type="button" class="btn btn-danger" onclick="deleteEquipmentRecord(@Model.Id)" style="margin-right:auto;">@translator.Translate(userLanguage, "Delete")</button>
}
<button type="button" class="btn btn-secondary" onclick="hideAddEquipmentRecordModal()">@translator.Translate(userLanguage, "Cancel")</button>
@ -62,6 +66,7 @@
<button type="button" class="btn btn-primary" onclick="saveEquipmentRecordToVehicle(true)">@translator.Translate(userLanguage, "Edit Equipment Record")</button>
}
</div>
@await Html.PartialAsync("Odometer/_OdometerHistory", Model.OdometerRecords)
<script>
function getEquipmentRecordModelData() {
return { id: @Model.Id}

View File

@ -0,0 +1,23 @@
@inject IConfigHelper config
@inject ITranslationHelper translator
@using CarCareTracker.Helper
@model List<EquipmentRecord>
@{
var userLanguage = config.GetUserConfig(User).UserLanguage;
}
@if (Model.Any())
{
<div id="equipmentSelector">
<ul class="list-group">
@foreach (EquipmentRecord equipmentRecord in Model)
{
<li class="list-group-item text-start">
<input class="form-check-input" type="checkbox" value="@equipmentRecord.Id" id="equipmentCheck_@equipmentRecord.Id" checked="@equipmentRecord.IsEquipped">
<label class="form-check-label stretched-link" for="equipmentCheck_@equipmentRecord.Id">@equipmentRecord.Description</label>
</li>
}
</ul>
</div>
}

View File

@ -0,0 +1,53 @@
@using CarCareTracker.Helper
@inject IConfigHelper config
@inject ITranslationHelper translator
@model List<OdometerRecord>
@{
var userConfig = config.GetUserConfig(User);
var userLanguage = userConfig.UserLanguage;
}
<div id="odometerHistoryModalContainer" class="d-none">
<div class="modal-header">
<h5 class="modal-title">@translator.Translate(userLanguage, "Odometer History")</h5>
</div>
<div class="modal-body">
@if (Model.Any())
{
<div class="row">
<div class="col-12" style="max-height:50vh; overflow-y:auto;">
<table class="table table-hover">
<thead class="sticky-top">
<tr class="d-flex">
<th scope="col" class="col-3">@translator.Translate(userLanguage, "Date")</th>
<th scope="col" class="col-3">@translator.Translate(userLanguage, "Initial Odometer")</th>
<th scope="col" class="col-3">@translator.Translate(userLanguage, "Odometer")</th>
<th scope="col" class="col-3">@translator.Translate(userLanguage, "Distance")</th>
</tr>
</thead>
<tbody>
@foreach (OdometerRecord odometerHistory in Model)
{
<tr class="d-flex">
<td class="col-3">@StaticHelper.TruncateStrings(odometerHistory.Date.ToShortDateString())</td>
<td class="col-3">@odometerHistory.InitialMileage</td>
<td class="col-3">@odometerHistory.Mileage</td>
<td class="col-3">@(odometerHistory.DistanceTraveled == default ? "---" : odometerHistory.DistanceTraveled)</td>
</tr>
}
</tbody>
</table>
</div>
</div>
}
else
{
<div class="row">
<div class="col-12">
<div class="text-center">
<h4>@translator.Translate(userLanguage, "No odometer history")</h4>
</div>
</div>
</div>
}
</div>
</div>

View File

@ -77,6 +77,11 @@
<div class="col-md-6 col-12">
<label for="odometerRecordNotes">@translator.Translate(userLanguage,"Notes(optional)")<a class="link-underline link-underline-opacity-0" onclick="showLinks(this)"><i class="bi bi-markdown ms-2"></i></a></label>
<textarea id="odometerRecordNotes" class="form-control" rows="5">@Model.Notes</textarea>
@if (Model.EquipmentRecords.Any())
{
<label for="equipmentSelector">@translator.Translate(userLanguage, "Equipment")</label>
@await Html.PartialAsync("Equipment/_EquipmentSelector", Model.EquipmentRecords)
}
<div>
@await Html.PartialAsync("_UploadedFiles", Model.Files)
@await Html.PartialAsync("_FileUploader", Model.Files.Any())

View File

@ -31,6 +31,16 @@
<div class="col-md-6 col-12">
<label for="odometerRecordNotes">@translator.Translate(userLanguage, "Notes(use --- to clear all existing notes)")<a class="link-underline link-underline-opacity-0" onclick="showLinks(this)"><i class="bi bi-markdown ms-2"></i></a></label>
<textarea id="odometerRecordNotes" class="form-control" rows="5"></textarea>
<div class="@(Model.EquipmentRecords.Any() ? "" : "d-none")">
<div class="form-check form-switch form-check-inline">
<input class="form-check-input" type="checkbox" role="switch" id="equipmentEditCheck" onchange="toggleEquipmentEdit()">
<label class="form-check-label" for="equipmentEditCheck">@translator.Translate(userLanguage, "Edit Equipment")</label>
</div>
</div>
<div id="equipmentEditContainer" class="d-none">
<label for="equipmentSelector">@translator.Translate(userLanguage, "Equipment")</label>
@await Html.PartialAsync("Equipment/_EquipmentSelector", Model.EquipmentRecords)
</div>
</div>
</div>
</div>

View File

@ -67,6 +67,8 @@
getVehiclePlanRecords(vehicleId);
} else if (mode == "OdometerRecord") {
getVehicleOdometerRecords(vehicleId);
} else if (mode == "EquipmentRecord"){
getVehicleEquipmentRecords(vehicleId);
}
} else {
errorToast(genericErrorMessage());

View File

@ -113,4 +113,12 @@ function getAndValidateEquipmentRecordValues() {
tags: equipmentTags,
extraFields: extraFields.extraFields
}
}
function toggleOdometerHistory() {
let odometerHistoryContainer = $("#odometerHistoryModalContainer");
if (odometerHistoryContainer.hasClass('d-none')) {
odometerHistoryContainer.removeClass('d-none');
} else {
odometerHistoryContainer.addClass('d-none');
}
}

View File

@ -98,6 +98,7 @@ function getAndValidateOdometerRecordValues() {
var serviceTags = $("#odometerRecordTag").val();
var vehicleId = GetVehicleId().vehicleId;
var odometerRecordId = getOdometerRecordModelData().id;
var odometerEquipment = getSelectedEquipment();
//Odometer Adjustments
serviceMileage = GetAdjustedOdometer(odometerRecordId, serviceMileage);
//validation
@ -134,7 +135,8 @@ function getAndValidateOdometerRecordValues() {
notes: serviceNotes,
tags: serviceTags,
files: uploadedFiles,
extraFields: extraFields.extraFields
extraFields: extraFields.extraFields,
equipmentRecordId: odometerEquipment
}
}
@ -156,7 +158,8 @@ function editMultipleOdometerRecords(ids) {
if (ids.length < 2) {
return;
}
$.post('/Vehicle/GetOdometerRecordsEditModal', { recordIds: ids }, function (data) {
let vehicleId = GetVehicleId().vehicleId;
$.post('/Vehicle/GetOdometerRecordsEditModal', { recordIds: ids, vehicleId: vehicleId }, function (data) {
if (data) {
$("#odometerRecordModalContent").html(data);
//initiate datepicker
@ -175,6 +178,8 @@ function saveMultipleOdometerRecordsToVehicle() {
var odometerNotes = $("#odometerRecordNotes").val();
var odometerTags = $("#odometerRecordTag").val();
var odometerExtraFields = getAndValidateExtraFields();
let odometerEditEquipment = $('#equipmentEditCheck').is(':checked');
let odometerEquipment = getSelectedEquipment();
//validation
var hasError = false;
if (odometerMileage.trim() != '' && (isNaN(odometerMileageToParse) || parseInt(odometerMileageToParse) < 0)) {
@ -195,13 +200,15 @@ function saveMultipleOdometerRecordsToVehicle() {
}
var formValues = {
recordIds: recordsToEdit,
editEquipment: odometerEditEquipment,
editRecord: {
date: odometerDate,
initialMileage: initialOdometerMileageToParse,
mileage: odometerMileageToParse,
notes: odometerNotes,
tags: odometerTags,
extraFields: odometerExtraFields.extraFields
extraFields: odometerExtraFields.extraFields,
equipmentRecordId: odometerEquipment
}
}
$.post('/Vehicle/SaveMultipleOdometerRecords', { editModel: formValues }, function (data) {
@ -434,4 +441,18 @@ function duplicateDistanceToOtherVehicles(ids) {
errorToast(genericErrorMessage());
}
})
}
function getSelectedEquipment() {
var selectedEquipmentArray = [];
$("#equipmentSelector :checked").map(function () {
selectedEquipmentArray.push(this.value);
});
return selectedEquipmentArray;
}
function toggleEquipmentEdit() {
if ($('#equipmentEditCheck').is(":checked")) {
$('#equipmentEditContainer').removeClass('d-none');
} else {
$('#equipmentEditContainer').addClass('d-none');
}
}

View File

@ -860,7 +860,8 @@ function getSavedCSVExportParameters(mode) {
}
function exportVehicleData(mode) {
var vehicleId = GetVehicleId().vehicleId;
if (mode != 'PlanRecord') {
let bypassRecordTypes = ['PlanRecord', 'EquipmentRecord'];
if (!bypassRecordTypes.includes(mode)) {
$.get('/Vehicle/GetCSVExportParameters', function (paramData) {
if (paramData) {
Swal.fire({