Allow users to select any extra field as vehicle identifier.

This commit is contained in:
DESKTOP-T0O5CDB\DESK-555BD 2024-10-23 10:52:41 -06:00
parent e3dccf0182
commit 23f97ebd46
11 changed files with 91 additions and 15 deletions

View File

@ -75,7 +75,8 @@ namespace CarCareTracker.Controllers
OdometerOptional = x.OdometerOptional, OdometerOptional = x.OdometerOptional,
ExtraFields = x.ExtraFields, ExtraFields = x.ExtraFields,
Tags = x.Tags, Tags = x.Tags,
DashboardMetrics = x.DashboardMetrics DashboardMetrics = x.DashboardMetrics,
VehicleIdentifier = x.VehicleIdentifier
}; };
//dashboard metrics //dashboard metrics
if (x.DashboardMetrics.Any()) if (x.DashboardMetrics.Any())
@ -122,7 +123,7 @@ namespace CarCareTracker.Controllers
if (vehicleReminders.Any()) if (vehicleReminders.Any())
{ {
var reminderUrgency = _reminderHelper.GetReminderRecordViewModels(vehicleReminders, 0, DateTime.Now); var reminderUrgency = _reminderHelper.GetReminderRecordViewModels(vehicleReminders, 0, DateTime.Now);
reminderUrgency = reminderUrgency.Select(x => new ReminderRecordViewModel { Id = x.Id, Date = x.Date, Urgency = x.Urgency, Description = $"{vehicle.Year} {vehicle.Make} {vehicle.Model} #{vehicle.LicensePlate} - {x.Description}" }).ToList(); reminderUrgency = reminderUrgency.Select(x => new ReminderRecordViewModel { Id = x.Id, Date = x.Date, Urgency = x.Urgency, Description = $"{vehicle.Year} {vehicle.Make} {vehicle.Model} #{StaticHelper.GetVehicleIdentifier(vehicle)} - {x.Description}" }).ToList();
reminders.AddRange(reminderUrgency); reminders.AddRange(reminderUrgency);
} }
} }

View File

@ -109,7 +109,7 @@ namespace CarCareTracker.Helper
string emailSubject = $"Vehicle Reminders From LubeLogger - {DateTime.Now.ToShortDateString()}"; string emailSubject = $"Vehicle Reminders From LubeLogger - {DateTime.Now.ToShortDateString()}";
//construct html table. //construct html table.
string emailBody = File.ReadAllText(emailTemplatePath); string emailBody = File.ReadAllText(emailTemplatePath);
emailBody = emailBody.Replace("{VehicleInformation}", $"{vehicle.Year} {vehicle.Make} {vehicle.Model} #{vehicle.LicensePlate}"); emailBody = emailBody.Replace("{VehicleInformation}", $"{vehicle.Year} {vehicle.Make} {vehicle.Model} #{StaticHelper.GetVehicleIdentifier(vehicle)}");
string tableBody = ""; string tableBody = "";
foreach(ReminderRecordViewModel reminder in reminders) foreach(ReminderRecordViewModel reminder in reminders)
{ {

View File

@ -298,6 +298,40 @@ namespace CarCareTracker.Helper
return "bi-file-bar-graph"; return "bi-file-bar-graph";
} }
} }
public static string GetVehicleIdentifier(Vehicle vehicle)
{
if (vehicle.VehicleIdentifier == "LicensePlate")
{
return vehicle.LicensePlate;
} else
{
if (vehicle.ExtraFields.Any(x=>x.Name == vehicle.VehicleIdentifier))
{
return vehicle.ExtraFields?.FirstOrDefault(x=>x.Name == vehicle.VehicleIdentifier)?.Value;
} else
{
return "N/A";
}
}
}
public static string GetVehicleIdentifier(VehicleViewModel vehicle)
{
if (vehicle.VehicleIdentifier == "LicensePlate")
{
return vehicle.LicensePlate;
}
else
{
if (vehicle.ExtraFields.Any(x => x.Name == vehicle.VehicleIdentifier))
{
return vehicle.ExtraFields?.FirstOrDefault(x => x.Name == vehicle.VehicleIdentifier)?.Value;
}
else
{
return "N/A";
}
}
}
//CSV Write Methods //CSV Write Methods
public static void WriteGenericRecordExportModel(CsvWriter _csv, IEnumerable<GenericRecordExportModel> genericRecords) public static void WriteGenericRecordExportModel(CsvWriter _csv, IEnumerable<GenericRecordExportModel> genericRecords)
{ {

View File

@ -28,5 +28,9 @@
/// </summary> /// </summary>
public string OdometerDifference { get; set; } = "0"; public string OdometerDifference { get; set; } = "0";
public List<DashboardMetric> DashboardMetrics { get; set; } = new List<DashboardMetric>(); public List<DashboardMetric> DashboardMetrics { get; set; } = new List<DashboardMetric>();
/// <summary>
/// Determines what is displayed in place of the license plate.
/// </summary>
public string VehicleIdentifier { get; set; } = "LicensePlate";
} }
} }

View File

@ -15,6 +15,7 @@
public bool OdometerOptional { get; set; } = false; public bool OdometerOptional { get; set; } = false;
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>(); public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
public List<string> Tags { get; set; } = new List<string>(); public List<string> Tags { get; set; } = new List<string>();
public string VehicleIdentifier { get; set; } = "LicensePlate";
//Dashboard Metric Attributes //Dashboard Metric Attributes
public List<DashboardMetric> DashboardMetrics { get; set; } = new List<DashboardMetric>(); public List<DashboardMetric> DashboardMetrics { get; set; } = new List<DashboardMetric>();
public int LastReportedMileage { get; set; } public int LastReportedMileage { get; set; }

View File

@ -76,7 +76,7 @@
<h5 class="card-title text-truncate garage-item-year" data-unit="@vehicle.Year">@($"{vehicle.Year}")</h5> <h5 class="card-title text-truncate garage-item-year" data-unit="@vehicle.Year">@($"{vehicle.Year}")</h5>
<h5 class="card-title text-truncate">@($"{vehicle.Make}")</h5> <h5 class="card-title text-truncate">@($"{vehicle.Make}")</h5>
<h5 class="card-title text-truncate">@($"{vehicle.Model}")</h5> <h5 class="card-title text-truncate">@($"{vehicle.Model}")</h5>
<p class="card-text text-truncate">@vehicle.LicensePlate</p> <p class="card-text text-truncate">@StaticHelper.GetVehicleIdentifier(vehicle)</p>
</div> </div>
</div> </div>
</div> </div>

View File

@ -7,7 +7,7 @@
} }
@model Vehicle @model Vehicle
@{ @{
ViewData["Title"] = $"{Model.Year} {Model.Make} {Model.Model} ({Model.LicensePlate})"; ViewData["Title"] = $"{Model.Year} {Model.Make} {Model.Model} ({StaticHelper.GetVehicleIdentifier(Model)})";
} }
@section Scripts { @section Scripts {
<script src="~/js/vehicle.js?v=@StaticHelper.VersionNumber"></script> <script src="~/js/vehicle.js?v=@StaticHelper.VersionNumber"></script>
@ -72,7 +72,7 @@
<div class="row"> <div class="row">
<div class="d-flex justify-content-between"> <div class="d-flex justify-content-between">
<button onclick="returnToGarage()" class="lubelogger-tab btn btn-secondary btn-md mt-1 mb-1"><i class="bi bi-arrow-left-square"></i></button> <button onclick="returnToGarage()" class="lubelogger-tab btn btn-secondary btn-md mt-1 mb-1"><i class="bi bi-arrow-left-square"></i></button>
<h1 class="text-truncate display-4">@($"{Model.Year} {Model.Make} {Model.Model}")<small class="text-body-secondary">@($"(#{Model.LicensePlate})")</small></h1> <h1 class="text-truncate display-4">@($"{Model.Year} {Model.Make} {Model.Model}")<small class="text-body-secondary">@($"(#{StaticHelper.GetVehicleIdentifier(Model)})")</small></h1>
<button onclick="editVehicle(@Model.Id)" class="lubelogger-tab btn btn-warning btn-md mt-1 mb-1"><i class="bi bi-pencil-square"></i></button> <button onclick="editVehicle(@Model.Id)" class="lubelogger-tab btn btn-warning btn-md mt-1 mb-1"><i class="bi bi-pencil-square"></i></button>
<div class="lubelogger-navbar-button"> <div class="lubelogger-navbar-button">
<button type="button" class="btn btn-adaptive" onclick="showMobileNav()"><i class="bi bi-list lubelogger-menu-icon"></i></button> <button type="button" class="btn btn-adaptive" onclick="showMobileNav()"><i class="bi bi-list lubelogger-menu-icon"></i></button>

View File

@ -21,9 +21,21 @@
<li class="list-group-item"> <li class="list-group-item">
<span class="display-6">@($"{Model.VehicleData.Year} {Model.VehicleData.Make} {Model.VehicleData.Model}")</span> <span class="display-6">@($"{Model.VehicleData.Year} {Model.VehicleData.Make} {Model.VehicleData.Model}")</span>
</li> </li>
<li class="list-group-item"> @if (!string.IsNullOrWhiteSpace(Model.VehicleData.LicensePlate))
<span class="lead">@Model.VehicleData.LicensePlate</span> {
</li> <li class="list-group-item">
<span class="lead">@Model.VehicleData.LicensePlate</span>
</li>
}
@foreach(ExtraField extraField in Model.VehicleData.ExtraFields)
{
if (!string.IsNullOrWhiteSpace(extraField.Value))
{
<li class="list-group-item">
<span class="lead">@($"{extraField.Name}: {extraField.Value}")</span>
</li>
}
}
<li class="list-group-item"> <li class="list-group-item">
<div class="row"> <div class="row">
<div class="col-4"> <div class="col-4">

View File

@ -44,10 +44,18 @@
<input type="text" id="@elementId" class="form-control @(field.IsRequired ? "extra-field-required" : "")" placeholder="@field.Name" value="@field.Value"> <input type="text" id="@elementId" class="form-control @(field.IsRequired ? "extra-field-required" : "")" placeholder="@field.Name" value="@field.Value">
</div> </div>
} }
<label for="inputIdentifier">@translator.Translate(userLanguage, "Identifier")</label>
<select class="form-select" id="inputIdentifier" )>
<!option value="LicensePlate" @(Model.VehicleIdentifier == "LicensePlate" ? "selected" : "")>@translator.Translate(userLanguage, "License Plate")</!option>
@foreach(ExtraField field in Model.ExtraFields)
{
<!option value="@field.Name" @(Model.VehicleIdentifier == field.Name ? "selected" : "")>@field.Name</!option>
}
</select>
</div> </div>
<div class="col-12 col-md-6"> <div class="col-12 col-md-6">
<label for="inputFuelType">@translator.Translate(userLanguage, "Fuel Type")</label> <label for="inputFuelType">@translator.Translate(userLanguage, "Fuel Type")</label>
<select class="form-select" onchange="checkCustomMonthInterval()" id="inputFuelType")> <select class="form-select" id="inputFuelType")>
<!option value="Gasoline" @(!Model.IsDiesel && !Model.IsElectric ? "selected" : "")>@translator.Translate(userLanguage, "Gasoline")</!option> <!option value="Gasoline" @(!Model.IsDiesel && !Model.IsElectric ? "selected" : "")>@translator.Translate(userLanguage, "Gasoline")</!option>
<!option value="Diesel" @(Model.IsDiesel ? "selected" : "")>@translator.Translate(userLanguage, "Diesel")</!option> <!option value="Diesel" @(Model.IsDiesel ? "selected" : "")>@translator.Translate(userLanguage, "Diesel")</!option>
<!option value="Electric" @(Model.IsElectric ? "selected" : "")>@translator.Translate(userLanguage, "Electric")</!option> <!option value="Electric" @(Model.IsElectric ? "selected" : "")>@translator.Translate(userLanguage, "Electric")</!option>

File diff suppressed because one or more lines are too long

View File

@ -49,6 +49,7 @@ function saveVehicle(isEdit) {
var vehicleOdometerDifference = parseInt(globalParseFloat($("#inputOdometerDifference").val())).toString(); var vehicleOdometerDifference = parseInt(globalParseFloat($("#inputOdometerDifference").val())).toString();
var vehiclePurchasePrice = $("#inputPurchasePrice").val(); var vehiclePurchasePrice = $("#inputPurchasePrice").val();
var vehicleSoldPrice = $("#inputSoldPrice").val(); var vehicleSoldPrice = $("#inputSoldPrice").val();
var vehicleIdentifier = $("#inputIdentifier").val();
var vehicleDashboardMetrics = $("#collapseMetricInfo :checked").map(function () { var vehicleDashboardMetrics = $("#collapseMetricInfo :checked").map(function () {
return this.value; return this.value;
}).toArray(); }).toArray();
@ -76,12 +77,26 @@ function saveVehicle(isEdit) {
} else { } else {
$("#inputModel").removeClass("is-invalid"); $("#inputModel").removeClass("is-invalid");
} }
if (vehicleLicensePlate.trim() == '') { if (vehicleIdentifier == "LicensePlate") {
hasError = true; if (vehicleLicensePlate.trim() == '') {
$("#inputLicensePlate").addClass("is-invalid"); hasError = true;
$("#inputLicensePlate").addClass("is-invalid");
} else {
$("#inputLicensePlate").removeClass("is-invalid");
}
} else { } else {
$("#inputLicensePlate").removeClass("is-invalid"); $("#inputLicensePlate").removeClass("is-invalid");
//check if extra fields have value.
var vehicleIdentifierExtraField = extraFields.extraFields.filter(x => x.name == vehicleIdentifier);
//check if extra field exists.
if (vehicleIdentifierExtraField.length == 0) {
$(".modal.fade.show").find(`.extra-field [placeholder='${vehicleIdentifier}']`).addClass("is-invalid");
hasError = true;
} else {
$(".modal.fade.show").find(`.extra-field [placeholder='${vehicleIdentifier}']`).removeClass("is-invalid");
}
} }
if (vehicleHasOdometerAdjustment) { if (vehicleHasOdometerAdjustment) {
//validate odometer adjustments //validate odometer adjustments
//validate multiplier //validate multiplier
@ -136,7 +151,8 @@ function saveVehicle(isEdit) {
odometerDifference: vehicleOdometerDifference, odometerDifference: vehicleOdometerDifference,
purchasePrice: vehiclePurchasePrice, purchasePrice: vehiclePurchasePrice,
soldPrice: vehicleSoldPrice, soldPrice: vehicleSoldPrice,
dashboardMetrics: vehicleDashboardMetrics dashboardMetrics: vehicleDashboardMetrics,
vehicleIdentifier: vehicleIdentifier
}, function (data) { }, function (data) {
if (data) { if (data) {
if (!isEdit) { if (!isEdit) {