all kinds of updates to make decimal odometer input possible.

This commit is contained in:
DESKTOP-T0O5CDB\DESK-555BD
2024-11-14 09:07:00 -07:00
parent 92c0c103be
commit 2f1b585893
21 changed files with 56 additions and 32 deletions

View File

@@ -350,7 +350,7 @@ namespace CarCareTracker.Controllers
vehicleHistory.ReportParameters = reportParameter;
vehicleHistory.VehicleData = _dataAccess.GetVehicleById(vehicleId);
var maxMileage = _vehicleLogic.GetMaxMileage(vehicleId);
vehicleHistory.Odometer = maxMileage.ToString("N0");
vehicleHistory.Odometer = maxMileage.ToString("N1");
var minMileage = _vehicleLogic.GetMinMileage(vehicleId);
var distanceTraveled = maxMileage - minMileage;
if (!string.IsNullOrWhiteSpace(vehicleHistory.VehicleData.PurchaseDate))
@@ -364,7 +364,7 @@ namespace CarCareTracker.Controllers
try
{
daysOwned = (DateTime.Parse(endDate) - DateTime.Parse(vehicleHistory.VehicleData.PurchaseDate)).Days;
vehicleHistory.DaysOwned = daysOwned.ToString("N0");
vehicleHistory.DaysOwned = daysOwned.ToString("N1");
}
catch (Exception ex)
{
@@ -401,7 +401,7 @@ namespace CarCareTracker.Controllers
vehicleHistory.TotalCost = serviceRecords.Sum(x => x.Cost) + repairRecords.Sum(x => x.Cost) + upgradeRecords.Sum(x => x.Cost) + taxRecords.Sum(x => x.Cost);
if (distanceTraveled != default)
{
vehicleHistory.DistanceTraveled = distanceTraveled.ToString("N0");
vehicleHistory.DistanceTraveled = distanceTraveled.ToString("N1");
vehicleHistory.TotalCostPerMile = vehicleHistory.TotalCost / distanceTraveled;
vehicleHistory.TotalGasCostPerMile = vehicleHistory.TotalGasCost / distanceTraveled;
}

View File

@@ -1,4 +1,5 @@
using LiteDB;
using CarCareTracker.Models;
using LiteDB;
namespace CarCareTracker.Helper;
@@ -15,6 +16,29 @@ public class LiteDBHelper: ILiteDBHelper
if (db == null)
{
db = new LiteDatabase(StaticHelper.DbName);
if (db.UserVersion == 0)
{
//migration required to convert ints to decimals
var collections = db.GetCollectionNames();
foreach (string collection in collections)
{
var documents = db.GetCollection(collection);
foreach (var document in documents.FindAll())
{
if (document.ContainsKey(nameof(GenericRecord.Mileage)))
{
document[nameof(GenericRecord.Mileage)] = Convert.ToDecimal(document[nameof(GenericRecord.Mileage)].AsInt32);
//check for initial mileage as well
if (document.ContainsKey(nameof(OdometerRecord.InitialMileage)))
{
document[nameof(OdometerRecord.InitialMileage)] = Convert.ToDecimal(document[nameof(OdometerRecord.InitialMileage)].AsInt32);
}
documents.Update(document);
}
}
}
db.UserVersion = 1;
}
}
}
public LiteDatabase GetLiteDB()

View File

@@ -44,7 +44,7 @@
<div class="d-flex justify-content-between">
<div>
<span class="ms-2"><i class="bi bi-speedometer me-2"></i>@vehicle.LastReportedMileage.ToString("N0")</span>
<span class="ms-2"><i class="bi bi-speedometer me-2"></i>@vehicle.LastReportedMileage.ToString("N1")</span>
</div>
@if (vehicle.HasReminders)
{

View File

@@ -24,7 +24,7 @@
</div>
<label for="collisionRecordMileage">@translator.Translate(userLanguage, "Odometer")</label>
<div class="input-group">
<input type="number" inputmode="numeric" id="collisionRecordMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"Odometer reading when repaired")" value="@(isNew || Model.Mileage == default ? "" : Model.Mileage)">
<input type="text" inputmode="decimal" id="collisionRecordMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"Odometer reading when repaired")" value="@(isNew || Model.Mileage == default ? "" : Model.Mileage)">
@if (isNew)
{
<div class="input-group-text">

View File

@@ -53,7 +53,7 @@
</div>
<label for="gasRecordMileage">@($"{translator.Translate(userLanguage,"Odometer Reading")}({distanceUnit})")</label>
<div class="input-group">
<input type="number" inputmode="numeric" id="gasRecordMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"Odometer reading when refueled")" value="@(isNew || Model.GasRecord.Mileage == default ? "" : Model.GasRecord.Mileage)">
<input type="text" inputmode="decimal" id="gasRecordMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"Odometer reading when refueled")" value="@(isNew || Model.GasRecord.Mileage == default ? "" : Model.GasRecord.Mileage)">
@if (isNew)
{
<div class="input-group-text">

View File

@@ -21,7 +21,7 @@
<span class="input-group-text"><i class="bi bi-calendar-event"></i></span>
</div>
<label for="gasRecordMileage">@translator.Translate(userLanguage, "Odometer")</label>
<input type="number" inputmode="numeric" id="gasRecordMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"(multiple)")">
<input type="text" inputmode="decimal" id="gasRecordMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"(multiple)")">
<label for="gasRecordConsumption">@translator.Translate(userLanguage, "Fuel Consumption")</label>
<input type="text" inputmode="decimal" onkeydown="interceptDecimalKeys(event)" onkeyup="fixDecimalInput(this, 3)" id="gasRecordConsumption" class="form-control" placeholder="@translator.Translate(userLanguage,"(multiple)")">
<label for="gasRecordCost">@translator.Translate(userLanguage, "Cost")</label>

View File

@@ -21,7 +21,7 @@
<span class="input-group-text"><i class="bi bi-calendar-event"></i></span>
</div>
<label for="genericRecordMileage">@translator.Translate(userLanguage,"Odometer")</label>
<input type="number" inputmode="numeric" id="genericRecordMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"(multiple)")">
<input type="text" inputmode="decimal" id="genericRecordMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"(multiple)")">
<label for="genericRecordDescription">@translator.Translate(userLanguage, "Description")</label>
<input type="text" id="genericRecordDescription" class="form-control" placeholder="@translator.Translate(userLanguage,"(multiple)")">
<label for="genericRecordCost">@translator.Translate(userLanguage, "Cost")</label>

View File

@@ -44,7 +44,7 @@
</div>
<label for="initialOdometerRecordMileage">@translator.Translate(userLanguage, "Initial Odometer")</label>
<div class="input-group">
<input type="number" inputmode="numeric" id="initialOdometerRecordMileage" @(Model.InitialMileage != default ? "disabled" : "") class="form-control" placeholder="@translator.Translate(userLanguage,"Initial Odometer reading")" value="@(Model.InitialMileage)">
<input type="text" inputmode="decimal" id="initialOdometerRecordMileage" @(Model.InitialMileage != default ? "disabled" : "") class="form-control" placeholder="@translator.Translate(userLanguage,"Initial Odometer reading")" value="@(Model.InitialMileage)">
@if (Model.InitialMileage != default)
{
<div class="input-group-text">
@@ -54,7 +54,7 @@
</div>
<label for="odometerRecordMileage">@translator.Translate(userLanguage,"Odometer")</label>
<div class="input-group">
<input type="number" inputmode="numeric" id="odometerRecordMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"Odometer reading")" value="@(isNew ? "" : Model.Mileage)">
<input type="text" inputmode="decimal" id="odometerRecordMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"Odometer reading")" value="@(isNew ? "" : Model.Mileage)">
@if (isNew)
{
<div class="input-group-text">

View File

@@ -21,9 +21,9 @@
<span class="input-group-text"><i class="bi bi-calendar-event"></i></span>
</div>
<label for="initialOdometerRecordMileage">@translator.Translate(userLanguage, "Initial Odometer")</label>
<input type="number" inputmode="numeric" id="initialOdometerRecordMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"(multiple)")">
<input type="text" inputmode="decimal" id="initialOdometerRecordMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"(multiple)")">
<label for="odometerRecordMileage">@translator.Translate(userLanguage, "Odometer")</label>
<input type="number" inputmode="numeric" id="odometerRecordMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"(multiple)")">
<input type="text" inputmode="decimal" id="odometerRecordMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"(multiple)")">
<label for="odometerRecordTag">@translator.Translate(userLanguage, "Tags(use --- to clear all existing tags)")</label>
<select multiple class="form-select" id="odometerRecordTag"></select>
@foreach (ExtraField field in Model.EditRecord.ExtraFields)

View File

@@ -33,7 +33,7 @@
<label class="form-check-label" for="reminderMetricOdometer">@translator.Translate(userLanguage,"Odometer")</label>
</div>
<div class="input-group">
<input type="number" inputmode="numeric" id="reminderMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"Future Odometer Reading")" value="@(isNew ? "" : Model.Mileage)">
<input type="text" inputmode="decimal" id="reminderMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"Future Odometer Reading")" value="@(isNew ? "" : Model.Mileage)">
@if (isNew)
{
<div class="input-group-text">

View File

@@ -24,7 +24,7 @@
</div>
<label for="serviceRecordMileage">@translator.Translate(userLanguage, "Odometer")</label>
<div class="input-group">
<input type="number" inputmode="numeric" id="serviceRecordMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"Odometer reading when serviced")" value="@(isNew || Model.Mileage == default ? "" : Model.Mileage)">
<input type="text" inputmode="decimal" id="serviceRecordMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"Odometer reading when serviced")" value="@(isNew || Model.Mileage == default ? "" : Model.Mileage)">
@if (isNew)
{
<div class="input-group-text">

View File

@@ -24,7 +24,7 @@
</div>
<label for="upgradeRecordMileage">@translator.Translate(userLanguage, "Odometer")</label>
<div class="input-group">
<input type="number" inputmode="numeric" id="upgradeRecordMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"Odometer reading when upgraded/modded")" value="@(isNew || Model.Mileage == default ? "" : Model.Mileage)">
<input type="text" inputmode="decimal" id="upgradeRecordMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"Odometer reading when upgraded/modded")" value="@(isNew || Model.Mileage == default ? "" : Model.Mileage)">
@if (isNew)
{
<div class="input-group-text">

View File

@@ -143,7 +143,7 @@
}
</td>
<td class="col-2 text-truncate flex-grow-1 flex-shrink-1 @(Model.ReportParameters.VisibleColumns.Contains(nameof(GenericReportModel.Date)) ? "" : "d-none")">@reportData.Date.ToShortDateString()</td>
<td class="col-2 text-truncate flex-grow-1 flex-shrink-1 @(Model.ReportParameters.VisibleColumns.Contains(nameof(GenericReportModel.Odometer)) ? "" : "d-none")">@(reportData.Odometer == default ? "---" : reportData.Odometer.ToString("N0"))</td>
<td class="col-2 text-truncate flex-grow-1 flex-shrink-1 @(Model.ReportParameters.VisibleColumns.Contains(nameof(GenericReportModel.Odometer)) ? "" : "d-none")">@(reportData.Odometer == default ? "---" : reportData.Odometer.ToString("N1"))</td>
<td class="col-3 text-truncate flex-grow-1 flex-shrink-1 @(Model.ReportParameters.VisibleColumns.Contains(nameof(GenericReportModel.Description)) ? "" : "d-none")">@reportData.Description</td>
<td class="col-2 text-truncate flex-grow-1 flex-shrink-1 @(Model.ReportParameters.VisibleColumns.Contains(nameof(GenericReportModel.Cost)) ? "" : "d-none")">@((hideZero && reportData.Cost == default) ? "---" : reportData.Cost.ToString("C"))</td>
<td class="col-4 flex-grow-1 flex-shrink-1 text-wrap text-break @(Model.ReportParameters.VisibleColumns.Contains(nameof(GenericReportModel.Notes)) ? "" : "d-none")">@StaticHelper.TruncateStrings(reportData.Notes, 100)</td>

View File

@@ -91,7 +91,7 @@ function saveCollisionRecordToVehicle(isEdit) {
}
function getAndValidateCollisionRecordValues() {
var collisionDate = $("#collisionRecordDate").val();
var collisionMileage = parseInt(globalParseFloat($("#collisionRecordMileage").val())).toString();
var collisionMileage = globalParseFloat($("#collisionRecordMileage").val()).toString();
var collisionDescription = $("#collisionRecordDescription").val();
var collisionCost = $("#collisionRecordCost").val();
var collisionNotes = $("#collisionRecordNotes").val();

View File

@@ -88,7 +88,7 @@ function saveGasRecordToVehicle(isEdit) {
}
function getAndValidateGasRecordValues() {
var gasDate = $("#gasRecordDate").val();
var gasMileage = parseInt(globalParseFloat($("#gasRecordMileage").val())).toString();
var gasMileage = globalParseFloat($("#gasRecordMileage").val()).toString();
var gasGallons = $("#gasRecordGallons").val();
var gasCost = $("#gasRecordCost").val();
var gasCostType = $("#gasCostType").val();
@@ -468,7 +468,7 @@ function editMultipleGasRecords(ids) {
function saveMultipleGasRecordsToVehicle() {
var gasDate = $("#gasRecordDate").val();
var gasMileage = $("#gasRecordMileage").val();
var gasMileageToParse = parseInt(globalParseFloat($("#gasRecordMileage").val())).toString();
var gasMileageToParse = globalParseFloat($("#gasRecordMileage").val()).toString();
var gasConsumption = $("#gasRecordConsumption").val();
var gasCost = $("#gasRecordCost").val();
var gasNotes = $("#gasRecordNotes").val();

View File

@@ -91,8 +91,8 @@ function saveOdometerRecordToVehicle(isEdit) {
}
function getAndValidateOdometerRecordValues() {
var serviceDate = $("#odometerRecordDate").val();
var initialOdometerMileage = parseInt(globalParseFloat($("#initialOdometerRecordMileage").val())).toString();
var serviceMileage = parseInt(globalParseFloat($("#odometerRecordMileage").val())).toString();
var initialOdometerMileage = globalParseFloat($("#initialOdometerRecordMileage").val()).toString();
var serviceMileage = globalParseFloat($("#odometerRecordMileage").val()).toString();
var serviceNotes = $("#odometerRecordNotes").val();
var serviceTags = $("#odometerRecordTag").val();
var vehicleId = GetVehicleId().vehicleId;
@@ -166,8 +166,8 @@ function saveMultipleOdometerRecordsToVehicle() {
var odometerDate = $("#odometerRecordDate").val();
var initialOdometerMileage = $("#initialOdometerRecordMileage").val();
var odometerMileage = $("#odometerRecordMileage").val();
var initialOdometerMileageToParse = parseInt(globalParseFloat($("#initialOdometerRecordMileage").val())).toString();
var odometerMileageToParse = parseInt(globalParseFloat($("#odometerRecordMileage").val())).toString();
var initialOdometerMileageToParse = globalParseFloat($("#initialOdometerRecordMileage").val()).toString();
var odometerMileageToParse = globalParseFloat($("#odometerRecordMileage").val()).toString();
var odometerNotes = $("#odometerRecordNotes").val();
var odometerTags = $("#odometerRecordTag").val();
var odometerExtraFields = getAndValidateExtraFields();

View File

@@ -180,7 +180,7 @@ function markDoneReminderRecord(reminderRecordId, e) {
function getAndValidateReminderRecordValues() {
var reminderDate = $("#reminderDate").val();
var reminderMileage = parseInt(globalParseFloat($("#reminderMileage").val())).toString();
var reminderMileage = globalParseFloat($("#reminderMileage").val()).toString();
var reminderDescription = $("#reminderDescription").val();
var reminderNotes = $("#reminderNotes").val();
var reminderOption = $('#reminderOptions input:radio:checked').val();

View File

@@ -91,7 +91,7 @@ function saveServiceRecordToVehicle(isEdit) {
}
function getAndValidateServiceRecordValues() {
var serviceDate = $("#serviceRecordDate").val();
var serviceMileage = parseInt(globalParseFloat($("#serviceRecordMileage").val())).toString();
var serviceMileage = globalParseFloat($("#serviceRecordMileage").val()).toString();
var serviceDescription = $("#serviceRecordDescription").val();
var serviceCost = $("#serviceRecordCost").val();
var serviceNotes = $("#serviceRecordNotes").val();

View File

@@ -46,7 +46,7 @@ function saveVehicle(isEdit) {
var vehicleOdometerOptional = $("#inputOdometerOptional").is(":checked");
var vehicleHasOdometerAdjustment = $("#inputHasOdometerAdjustment").is(':checked');
var vehicleOdometerMultiplier = $("#inputOdometerMultiplier").val();
var vehicleOdometerDifference = parseInt(globalParseFloat($("#inputOdometerDifference").val())).toString();
var vehicleOdometerDifference = globalParseFloat($("#inputOdometerDifference").val()).toString();
var vehiclePurchasePrice = $("#inputPurchasePrice").val();
var vehicleSoldPrice = $("#inputSoldPrice").val();
var vehicleIdentifier = $("#inputIdentifier").val();

View File

@@ -91,7 +91,7 @@ function saveUpgradeRecordToVehicle(isEdit) {
}
function getAndValidateUpgradeRecordValues() {
var upgradeDate = $("#upgradeRecordDate").val();
var upgradeMileage = parseInt(globalParseFloat($("#upgradeRecordMileage").val())).toString();
var upgradeMileage = globalParseFloat($("#upgradeRecordMileage").val()).toString();
var upgradeDescription = $("#upgradeRecordDescription").val();
var upgradeCost = $("#upgradeRecordCost").val();
var upgradeNotes = $("#upgradeRecordNotes").val();

View File

@@ -414,7 +414,7 @@ function saveGenericRecord() {
function getAndValidateGenericRecordValues() {
var genericDate = $("#genericRecordDate").val();
var genericMileage = $("#genericRecordMileage").val();
var genericMileageToParse = parseInt(globalParseFloat($("#genericRecordMileage").val())).toString();
var genericMileageToParse = globalParseFloat($("#genericRecordMileage").val()).toString();
var genericDescription = $("#genericRecordDescription").val();
var genericCost = $("#genericRecordCost").val();
var genericNotes = $("#genericRecordNotes").val();
@@ -458,7 +458,7 @@ function getRecordsDeltaStats(recordIds) {
var costReadings = [];
//get all of the odometer readings
recordIds.map(x => {
var odometerReading = parseInt($(`tr[data-rowId='${x}'] td[data-column='odometer']`).text());
var odometerReading = globalParseFloat($(`tr[data-rowId='${x}'] td[data-column='odometer']`).text());
if (!isNaN(odometerReading)) {
odometerReadings.push(odometerReading);
}
@@ -505,7 +505,7 @@ function GetAdjustedOdometer(id, odometerInput) {
return odometerInput;
}
//apply odometer adjustments first.
var adjustedOdometer = parseInt(odometerInput) + parseInt(GetVehicleId().odometerDifference);
var adjustedOdometer = globalParseFloat(odometerInput) + globalParseFloat(GetVehicleId().odometerDifference);
//apply odometer multiplier.
adjustedOdometer *= globalParseFloat(GetVehicleId().odometerMultiplier);
return adjustedOdometer.toFixed(0);
@@ -640,7 +640,7 @@ function getLastOdometerReadingAndIncrement(odometerFieldName) {
confirmButtonText: 'Add',
focusConfirm: false,
preConfirm: () => {
const odometerIncrement = parseInt(globalParseFloat($("#inputOdometerIncrement").val()));
const odometerIncrement = globalParseFloat($("#inputOdometerIncrement").val());
if (isNaN(odometerIncrement) || odometerIncrement <= 0) {
Swal.showValidationMessage(`Please enter a non-zero amount to increment`);
}