added fields for odometer adjustments.
This commit is contained in:
@@ -14,7 +14,14 @@
|
||||
public bool UseHours { get; set; } = false;
|
||||
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
|
||||
public List<string> Tags { get; set; } = new List<string>();
|
||||
public string OdometerModifier { get; set; } = "1";
|
||||
public string OdometerAdjustment { get; set; } = "0";
|
||||
public bool HasOdometerAdjustment { get; set; } = false;
|
||||
/// <summary>
|
||||
/// Primarily used for vehicles with odometer units different from user's settings.
|
||||
/// </summary>
|
||||
public string OdometerMultiplier { get; set; } = "1";
|
||||
/// <summary>
|
||||
/// Primarily used for vehicles where the odometer does not reflect actual mileage.
|
||||
/// </summary>
|
||||
public string OdometerDifference { get; set; } = "0";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
</div>
|
||||
|
||||
<div class="modal fade" id="addVehicleModal" tabindex="-1" role="dialog">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-dialog modal-lg" role="document">
|
||||
<div class="modal-content" id="addVehicleModalContent">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal fade" id="editVehicleModal" tabindex="-1" role="dialog">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-dialog modal-lg" role="document">
|
||||
<div class="modal-content" id="editVehicleModalContent">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -26,50 +26,69 @@
|
||||
<div class="modal-body">
|
||||
<form class="form-inline">
|
||||
<div class="form-group">
|
||||
<label for="inputYear">@translator.Translate(userLanguage, "Year")</label>
|
||||
<input type="number" inputmode="numeric" id="inputYear" class="form-control" placeholder="@translator.Translate(userLanguage, "Year(must be after 1900)")" value="@(isNew ? "" : Model.Year)">
|
||||
<label for="inputMake">@translator.Translate(userLanguage, "Make")</label>
|
||||
<input type="text" id="inputMake" class="form-control" placeholder="@translator.Translate(userLanguage, "Make")" value="@Model.Make">
|
||||
<label for="inputModel">@translator.Translate(userLanguage, "Model")</label>
|
||||
<input type="text" id="inputModel" class="form-control" placeholder="@translator.Translate(userLanguage, "Model")" value="@Model.Model">
|
||||
<label for="inputLicensePlate">@translator.Translate(userLanguage, "License Plate")</label>
|
||||
<input type="text" id="inputLicensePlate" class="form-control" placeholder="@translator.Translate(userLanguage, "License Plate")" value="@Model.LicensePlate">
|
||||
<label for="inputPurchaseDate">@translator.Translate(userLanguage, "Purchased Date(optional)")</label>
|
||||
<input type="text" id="inputPurchaseDate" class="form-control" placeholder="@translator.Translate(userLanguage, "Purchased Date")" value="@Model.PurchaseDate">
|
||||
<label for="inputSoldDate">@translator.Translate(userLanguage, "Sold Date(optional)")</label>
|
||||
<input type="text" id="inputSoldDate" class="form-control" placeholder="@translator.Translate(userLanguage, "Sold Date")" value="@Model.SoldDate">
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" role="switch" id="inputIsElectric" checked="@Model.IsElectric">
|
||||
<label class="form-check-label" for="inputIsElectric">@translator.Translate(userLanguage, "Electric Vehicle")</label>
|
||||
</div>
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" role="switch" id="inputUseHours" checked="@Model.UseHours">
|
||||
<label class="form-check-label" for="inputUseHours">@translator.Translate(userLanguage, "Use Engine Hours")</label>
|
||||
</div>
|
||||
<label for="inputTag">@translator.Translate(userLanguage, "Tags(optional)")</label>
|
||||
<select multiple class="form-select" id="inputTag">
|
||||
@foreach (string tag in Model.Tags)
|
||||
{
|
||||
<!option value="@tag">@tag</!option>
|
||||
}
|
||||
</select>
|
||||
@foreach (ExtraField field in Model.ExtraFields)
|
||||
{
|
||||
var elementId = Guid.NewGuid();
|
||||
<div class="extra-field">
|
||||
<label for="@elementId">@field.Name</label>
|
||||
<input type="text" id="@elementId" class="form-control @(field.IsRequired ? "extra-field-required" : "")" placeholder="@field.Name" value="@field.Value">
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-6">
|
||||
<label for="inputYear">@translator.Translate(userLanguage, "Year")</label>
|
||||
<input type="number" inputmode="numeric" id="inputYear" class="form-control" placeholder="@translator.Translate(userLanguage, "Year(must be after 1900)")" value="@(isNew ? "" : Model.Year)">
|
||||
<label for="inputMake">@translator.Translate(userLanguage, "Make")</label>
|
||||
<input type="text" id="inputMake" class="form-control" placeholder="@translator.Translate(userLanguage, "Make")" value="@Model.Make">
|
||||
<label for="inputModel">@translator.Translate(userLanguage, "Model")</label>
|
||||
<input type="text" id="inputModel" class="form-control" placeholder="@translator.Translate(userLanguage, "Model")" value="@Model.Model">
|
||||
<label for="inputLicensePlate">@translator.Translate(userLanguage, "License Plate")</label>
|
||||
<input type="text" id="inputLicensePlate" class="form-control" placeholder="@translator.Translate(userLanguage, "License Plate")" value="@Model.LicensePlate">
|
||||
@foreach (ExtraField field in Model.ExtraFields)
|
||||
{
|
||||
var elementId = Guid.NewGuid();
|
||||
<div class="extra-field">
|
||||
<label for="@elementId">@field.Name</label>
|
||||
<input type="text" id="@elementId" class="form-control @(field.IsRequired ? "extra-field-required" : "")" placeholder="@field.Name" value="@field.Value">
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
@if (!string.IsNullOrWhiteSpace(Model.ImageLocation))
|
||||
{
|
||||
<label for="inputImage">@translator.Translate(userLanguage, "Replace picture(optional)")</label>
|
||||
<input onChange="uploadFileAsync(this)" type="file" accept=".png,.jpg,.jpeg" class="form-control-file" id="inputImage">
|
||||
} else
|
||||
{
|
||||
<label for="inputImage">@translator.Translate(userLanguage, "Upload a picture(optional)")</label>
|
||||
<input onChange="uploadFileAsync(this)" type="file" accept=".png,.jpg,.jpeg" class="form-control-file" id="inputImage">
|
||||
}
|
||||
<div class="col-12 col-md-6">
|
||||
<label for="inputPurchaseDate">@translator.Translate(userLanguage, "Purchased Date(optional)")</label>
|
||||
<input type="text" id="inputPurchaseDate" class="form-control" placeholder="@translator.Translate(userLanguage, "Purchased Date")" value="@Model.PurchaseDate">
|
||||
<label for="inputSoldDate">@translator.Translate(userLanguage, "Sold Date(optional)")</label>
|
||||
<input type="text" id="inputSoldDate" class="form-control" placeholder="@translator.Translate(userLanguage, "Sold Date")" value="@Model.SoldDate">
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" role="switch" id="inputIsElectric" checked="@Model.IsElectric">
|
||||
<label class="form-check-label" for="inputIsElectric">@translator.Translate(userLanguage, "Electric Vehicle")</label>
|
||||
</div>
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" role="switch" id="inputUseHours" checked="@Model.UseHours">
|
||||
<label class="form-check-label" for="inputUseHours">@translator.Translate(userLanguage, "Use Engine Hours")</label>
|
||||
</div>
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" role="switch" onchange="toggleOdometerAdjustment()" id="inputHasOdometerAdjustment" checked="@Model.HasOdometerAdjustment">
|
||||
<label class="form-check-label" for="inputHasOdometerAdjustment">@translator.Translate(userLanguage, "Odometer Adjustments")</label>
|
||||
</div>
|
||||
<div class="collapse @(Model.HasOdometerAdjustment ? "show" : "")" id="odometerAdjustments">
|
||||
<div>
|
||||
<label for="inputOdometerMultiplier">@translator.Translate(userLanguage, "Odometer Multiplier")</label>
|
||||
<input type="text" id="inputOdometerMultiplier" class="form-control" placeholder="@translator.Translate(userLanguage, "Odometer Multiplier")" value="@Model.OdometerMultiplier">
|
||||
<label for="inputOdometerDifference">@translator.Translate(userLanguage, "Odometer Difference")</label>
|
||||
<input type="text" id="inputOdometerDifference" class="form-control" placeholder="@translator.Translate(userLanguage, "Odometer Difference")" value="@Model.OdometerDifference">
|
||||
</div>
|
||||
</div>
|
||||
<label for="inputTag">@translator.Translate(userLanguage, "Tags(optional)")</label>
|
||||
<select multiple class="form-select" id="inputTag">
|
||||
@foreach (string tag in Model.Tags)
|
||||
{
|
||||
<!option value="@tag">@tag</!option>
|
||||
}
|
||||
</select>
|
||||
@if (!string.IsNullOrWhiteSpace(Model.ImageLocation))
|
||||
{
|
||||
<label for="inputImage">@translator.Translate(userLanguage, "Replace picture(optional)")</label>
|
||||
<input onChange="uploadFileAsync(this)" type="file" accept=".png,.jpg,.jpeg" class="form-control-file" id="inputImage">
|
||||
}
|
||||
else
|
||||
{
|
||||
<label for="inputImage">@translator.Translate(userLanguage, "Upload a picture(optional)")</label>
|
||||
<input onChange="uploadFileAsync(this)" type="file" accept=".png,.jpg,.jpeg" class="form-control-file" id="inputImage">
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -42,6 +42,9 @@ function saveVehicle(isEdit) {
|
||||
var vehicleLicensePlate = $("#inputLicensePlate").val();
|
||||
var vehicleIsElectric = $("#inputIsElectric").is(":checked");
|
||||
var vehicleUseHours = $("#inputUseHours").is(":checked");
|
||||
var vehicleHasOdometerAdjustment = $("#inputHasOdometerAdjustment").is(':checked');
|
||||
var vehicleOdometerMultiplier = $("#inputOdometerMultiplier").val();
|
||||
var vehicleOdometerDifference = parseInt(globalParseFloat($("#inputOdometerDifference").val())).toString();
|
||||
var extraFields = getAndValidateExtraFields(true);
|
||||
//validate
|
||||
var hasError = false;
|
||||
@@ -72,6 +75,23 @@ function saveVehicle(isEdit) {
|
||||
} else {
|
||||
$("#inputLicensePlate").removeClass("is-invalid");
|
||||
}
|
||||
if (vehicleHasOdometerAdjustment) {
|
||||
//validate odometer adjustments
|
||||
//validate multiplier
|
||||
if (vehicleOdometerMultiplier.trim() == '' || !isValidMoney(vehicleOdometerMultiplier)) {
|
||||
hasError = true;
|
||||
$("#inputOdometerMultiplier").addClass("is-invalid");
|
||||
} else {
|
||||
$("#inputOdometerMultiplier").removeClass("is-invalid");
|
||||
}
|
||||
//validate difference
|
||||
if (vehicleOdometerDifference.trim() == '' || isNaN(vehicleOdometerDifference)) {
|
||||
hasError = true;
|
||||
$("#inputOdometerDifference").addClass("is-invalid");
|
||||
} else {
|
||||
$("#inputOdometerDifference").removeClass("is-invalid");
|
||||
}
|
||||
}
|
||||
if (hasError) {
|
||||
return;
|
||||
}
|
||||
@@ -87,7 +107,10 @@ function saveVehicle(isEdit) {
|
||||
useHours: vehicleUseHours,
|
||||
extraFields: extraFields.extraFields,
|
||||
purchaseDate: vehiclePurchaseDate,
|
||||
soldDate: vehicleSoldDate
|
||||
soldDate: vehicleSoldDate,
|
||||
hasOdometerAdjustment: vehicleHasOdometerAdjustment,
|
||||
odometerMultiplier: vehicleOdometerMultiplier,
|
||||
odometerDifference: vehicleOdometerDifference
|
||||
}, function (data) {
|
||||
if (data) {
|
||||
if (!isEdit) {
|
||||
@@ -105,6 +128,14 @@ function saveVehicle(isEdit) {
|
||||
}
|
||||
});
|
||||
}
|
||||
function toggleOdometerAdjustment() {
|
||||
var isChecked = $("#inputHasOdometerAdjustment").is(':checked');
|
||||
if (isChecked) {
|
||||
$("#odometerAdjustments").collapse('show');
|
||||
} else {
|
||||
$("#odometerAdjustments").collapse('hide');
|
||||
}
|
||||
}
|
||||
function uploadFileAsync(event) {
|
||||
let formData = new FormData();
|
||||
formData.append("file", event.files[0]);
|
||||
|
||||
Reference in New Issue
Block a user