Allow users to filter records by tags in the consolidated report.

This commit is contained in:
DESKTOP-T0O5CDB\DESK-555BD 2024-12-07 11:50:59 -07:00
parent 1b736b36f8
commit 32db884620
6 changed files with 73 additions and 25 deletions

View File

@ -393,6 +393,25 @@ namespace CarCareTracker.Controllers
var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId);
var taxRecords = _taxRecordDataAccess.GetTaxRecordsByVehicleId(vehicleId);
var gasRecords = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId);
//filter by tags
if (reportParameter.Tags.Any())
{
if (reportParameter.TagFilter == TagFilter.Exclude)
{
serviceRecords.RemoveAll(x => x.Tags.Any(y => reportParameter.Tags.Contains(y)));
repairRecords.RemoveAll(x => x.Tags.Any(y => reportParameter.Tags.Contains(y)));
upgradeRecords.RemoveAll(x => x.Tags.Any(y => reportParameter.Tags.Contains(y)));
taxRecords.RemoveAll(x => x.Tags.Any(y => reportParameter.Tags.Contains(y)));
gasRecords.RemoveAll(x => x.Tags.Any(y => reportParameter.Tags.Contains(y)));
} else if (reportParameter.TagFilter == TagFilter.IncludeOnly)
{
serviceRecords.RemoveAll(x => !x.Tags.Any(y => reportParameter.Tags.Contains(y)));
repairRecords.RemoveAll(x => !x.Tags.Any(y => reportParameter.Tags.Contains(y)));
upgradeRecords.RemoveAll(x => !x.Tags.Any(y => reportParameter.Tags.Contains(y)));
taxRecords.RemoveAll(x => !x.Tags.Any(y => reportParameter.Tags.Contains(y)));
gasRecords.RemoveAll(x => !x.Tags.Any(y => reportParameter.Tags.Contains(y)));
}
}
bool useMPG = _config.GetUserConfig(User).UseMPG;
bool useUKMPG = _config.GetUserConfig(User).UseUKMPG;
string preferredFuelMileageUnit = _config.GetUserConfig(User).PreferredGasMileageUnit;

8
Enum/TagFilter.cs Normal file
View File

@ -0,0 +1,8 @@
namespace CarCareTracker.Models
{
public enum TagFilter
{
Exclude = 0,
IncludeOnly = 1
}
}

View File

@ -2,7 +2,9 @@
{
public class ReportParameter
{
public List<string> VisibleColumns { get; set; } = new List<string>();
public List<string> ExtraFields { get; set; } = new List<string>();
public List<string> VisibleColumns { get; set; } = new List<string>();
public List<string> ExtraFields { get; set; } = new List<string>();
public TagFilter TagFilter { get; set; } = TagFilter.Exclude;
public List<string> Tags { get; set; } = new List<string>();
}
}

View File

@ -6,21 +6,29 @@
var userLanguage = userConfig.UserLanguage;
}
@model ReportParameter
<div id="columnSelector">
<ul class="list-group">
@foreach(string column in Model.VisibleColumns)
{
<li class="list-group-item text-start">
<input class="form-check-input column-default" type="checkbox" value="@column" id="visibleColumn_@column" checked>
<label class="form-check-label stretched-link" for="visibleColumn_@column">@(translator.Translate(userLanguage, column == nameof(GenericReportModel.DataType) ? "Type" : column))</label>
</li>
}
@foreach(string extraField in Model.ExtraFields)
{
<li class="list-group-item text-start">
<input class="form-check-input column-extrafield" type="checkbox" value="@extraField" id="extraField_@extraField">
<label class="form-check-label stretched-link" for="extraField_@extraField">@extraField</label>
</li>
}
</ul>
</div>
<div id="columnSelector" style="max-height:50vh; overflow-y:auto;">
<ul class="list-group">
@foreach (string column in Model.VisibleColumns)
{
<li class="list-group-item text-start">
<input class="form-check-input column-default" type="checkbox" value="@column" id="visibleColumn_@column" checked>
<label class="form-check-label stretched-link" for="visibleColumn_@column">@(translator.Translate(userLanguage, column == nameof(GenericReportModel.DataType) ? "Type" : column))</label>
</li>
}
@foreach (string extraField in Model.ExtraFields)
{
<li class="list-group-item text-start">
<input class="form-check-input column-extrafield" type="checkbox" value="@extraField" id="extraField_@extraField">
<label class="form-check-label stretched-link" for="extraField_@extraField">@extraField</label>
</li>
}
</ul>
</div>
<h2 class="swal2-title">Filter by Tags</h2>
<div class="mt-2 text-start">
<select class="form-select" id="tagSelector">
<!option value="@TagFilter.Exclude">@translator.Translate(userLanguage, "Exclude Records with these Tags")</!option>
<!option value="@TagFilter.IncludeOnly">@translator.Translate(userLanguage, "Only Include Records with these Tags")</!option>
</select>
<select multiple id="tagSelectorInput"></select>
</div>

File diff suppressed because one or more lines are too long

View File

@ -4,6 +4,8 @@
function getAndValidateSelectedColumns() {
var reportVisibleColumns = [];
var reportExtraFields = [];
var tagFilterMode = $("#tagSelector").val();
var tagsToFilter = $("#tagSelectorInput").val();
$("#columnSelector :checked").map(function () {
if ($(this).hasClass('column-default')) {
reportVisibleColumns.push(this.value);
@ -15,13 +17,17 @@ function getAndValidateSelectedColumns() {
return {
hasError: true,
visibleColumns: [],
extraFields: []
extraFields: [],
tagFilter: tagFilterMode,
tags: []
}
} else {
return {
hasError: false,
visibleColumns: reportVisibleColumns,
extraFields: reportExtraFields
extraFields: reportExtraFields,
tagFilter: tagFilterMode,
tags: tagsToFilter
}
}
}
@ -36,10 +42,14 @@ function getSavedReportParameters() {
//load selected checkboxes
selectedReportColumns.extraFields.map(x => {
$(`[value='${x}'].column-extrafield`).prop('checked', true);
})
});
selectedReportColumns.visibleColumns.map(x => {
$(`[value='${x}'].column-default`).prop('checked', true);
})
});
$("#tagSelector").val(selectedReportColumns.tagFilter);
selectedReportColumns.tags.map(x => {
$("#tagSelectorInput").append(`<option value='${x}'>${x}</option>`)
});
}
}
function generateVehicleHistoryReport() {
@ -62,6 +72,7 @@ function generateVehicleHistoryReport() {
},
didOpen: () => {
getSavedReportParameters();
initTagSelector($("#tagSelectorInput"));
}
}).then(function (result) {
if (result.isConfirmed) {