mirror of
https://github.com/hargata/lubelog.git
synced 2026-02-03 17:53:02 -06:00
add ability to link equipment to odometer record.
This commit is contained in:
parent
22090b7d7c
commit
64497ab55d
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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>();
|
||||
|
||||
@ -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
|
||||
{
|
||||
|
||||
@ -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>();
|
||||
}
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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))]
|
||||
|
||||
@ -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}
|
||||
|
||||
23
Views/Vehicle/Equipment/_EquipmentSelector.cshtml
Normal file
23
Views/Vehicle/Equipment/_EquipmentSelector.cshtml
Normal 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>
|
||||
}
|
||||
53
Views/Vehicle/Odometer/_OdometerHistory.cshtml
Normal file
53
Views/Vehicle/Odometer/_OdometerHistory.cshtml
Normal 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>
|
||||
@ -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())
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -67,6 +67,8 @@
|
||||
getVehiclePlanRecords(vehicleId);
|
||||
} else if (mode == "OdometerRecord") {
|
||||
getVehicleOdometerRecords(vehicleId);
|
||||
} else if (mode == "EquipmentRecord"){
|
||||
getVehicleEquipmentRecords(vehicleId);
|
||||
}
|
||||
} else {
|
||||
errorToast(genericErrorMessage());
|
||||
|
||||
@ -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');
|
||||
}
|
||||
}
|
||||
@ -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');
|
||||
}
|
||||
}
|
||||
@ -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({
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user