added global search

This commit is contained in:
DESKTOP-GENO133\IvanPlex 2024-04-04 10:46:43 -06:00
parent 7202fda38e
commit fa557e5f76
8 changed files with 247 additions and 0 deletions

View File

@ -9,6 +9,7 @@ using CarCareTracker.MapProfile;
using System.Security.Claims;
using CarCareTracker.Logic;
using CarCareTracker.Filter;
using System.Text.Json;
namespace CarCareTracker.Controllers
{
@ -2340,6 +2341,83 @@ namespace CarCareTracker.Controllers
}
#endregion
#region "Shared Methods"
[HttpPost]
[TypeFilter(typeof(CollaboratorFilter))]
public IActionResult SearchRecords(int vehicleId, string searchQuery)
{
List<SearchResult> searchResults = new List<SearchResult>();
if (string.IsNullOrWhiteSpace(searchQuery))
{
return Json(searchResults);
}
foreach(ImportMode visibleTab in _config.GetUserConfig(User).VisibleTabs)
{
switch (visibleTab)
{
case ImportMode.ServiceRecord:
{
var results = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId);
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.ServiceRecord, Description = $"{x.Date.ToShortDateString()} - {x.Description}" }));
}
break;
case ImportMode.RepairRecord:
{
var results = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId);
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.RepairRecord, Description = $"{x.Date.ToShortDateString()} - {x.Description}" }));
}
break;
case ImportMode.UpgradeRecord:
{
var results = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId);
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.UpgradeRecord, Description = $"{x.Date.ToShortDateString()} - {x.Description}" }));
}
break;
case ImportMode.TaxRecord:
{
var results = _taxRecordDataAccess.GetTaxRecordsByVehicleId(vehicleId);
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.TaxRecord, Description = $"{x.Date.ToShortDateString()} - {x.Description}" }));
}
break;
case ImportMode.SupplyRecord:
{
var results = _supplyRecordDataAccess.GetSupplyRecordsByVehicleId(vehicleId);
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.SupplyRecord, Description = $"{x.Date.ToShortDateString()} - {x.Description}" }));
}
break;
case ImportMode.PlanRecord:
{
var results = _planRecordDataAccess.GetPlanRecordsByVehicleId(vehicleId);
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.PlanRecord, Description = $"{x.DateCreated.ToShortDateString()} - {x.Description}" }));
}
break;
case ImportMode.OdometerRecord:
{
var results = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId);
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.OdometerRecord, Description = $"{x.Date.ToShortDateString()} - {x.Mileage}" }));
}
break;
case ImportMode.GasRecord:
{
var results = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId);
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.GasRecord, Description = $"{x.Date.ToShortDateString()} - {x.Mileage}" }));
}
break;
case ImportMode.NoteRecord:
{
var results = _noteDataAccess.GetNotesByVehicleId(vehicleId);
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.NoteRecord, Description = $"{x.Description}" }));
}
break;
case ImportMode.ReminderRecord:
{
var results = _reminderRecordDataAccess.GetReminderRecordsByVehicleId(vehicleId);
searchResults.AddRange(results.Where(x => JsonSerializer.Serialize(x).Contains(searchQuery)).Select(x => new SearchResult { Id = x.Id, RecordType = ImportMode.ReminderRecord, Description = $"{x.Description}" }));
}
break;
}
}
return PartialView("_GlobalSearchResult", searchResults);
}
[TypeFilter(typeof(CollaboratorFilter))]
public IActionResult GetMaxMileage(int vehicleId)
{

View File

@ -259,5 +259,33 @@ namespace CarCareTracker.Helper
};
httpClient.PostAsJsonAsync(webhookURL, httpParams);
}
public static string GetImportModeIcon(ImportMode importMode)
{
switch (importMode)
{
case ImportMode.ServiceRecord:
return "bi-card-checklist";
case ImportMode.RepairRecord:
return "bi-exclamation-octagon";
case ImportMode.UpgradeRecord:
return "bi-wrench-adjustable";
case ImportMode.TaxRecord:
return "bi-currency-dollar";
case ImportMode.SupplyRecord:
return "bi-shop";
case ImportMode.PlanRecord:
return "bi-bar-chart-steps";
case ImportMode.OdometerRecord:
return "bi-speedometer";
case ImportMode.GasRecord:
return "bi-fuel-pump";
case ImportMode.NoteRecord:
return "bi-journal-bookmark";
case ImportMode.ReminderRecord:
return "bi-bell";
default:
return "bi-file-bar-graph";
}
}
}
}

9
Models/SearchResult.cs Normal file
View File

@ -0,0 +1,9 @@
namespace CarCareTracker.Models
{
public class SearchResult
{
public int Id { get; set; }
public ImportMode RecordType { get; set; }
public string Description { get; set; }
}
}

View File

@ -0,0 +1,34 @@
@using CarCareTracker.Helper
@inject IConfigHelper config
@inject ITranslationHelper translator
@model List<SearchResult>
@{
var userConfig = config.GetUserConfig(User);
var userLanguage = userConfig.UserLanguage;
}
<div style="max-height:50vh; overflow-y:auto;">
@if (Model.Any())
{
@foreach (SearchResult result in Model)
{
<div class="row border p-2 m-1" onclick="loadGlobalSearchResult(@result.Id, '@result.RecordType')" style="cursor:pointer;">
<div class="col-1">
<i class="bi @StaticHelper.GetImportModeIcon(result.RecordType)"></i>
</div>
<div class="col-11">
@result.Description
</div>
</div>
}
} else
{
<div class="row border p-2 m-1">
<div class="col-1">
<i class="bi bi-ban"></i>
</div>
<div class="col-11">
@translator.Translate(userLanguage, "No Data Found")
</div>
</div>
}
</div>

View File

@ -117,6 +117,9 @@
</div>
</div>
<div class="col-md-3 col-12 chartContainer">
<div class="d-grid">
<button onclick="showGlobalSearch()" class="btn btn-secondary btn-md mt-1 mb-1">@translator.Translate(userLanguage, "Search")<i class="bi ms-2 bi-search"></i></button>
</div>
<div class="d-grid">
<button onclick="generateVehicleHistoryReport()" class="btn btn-secondary btn-md mt-1 mb-1">@translator.Translate(userLanguage, "Vehicle Maintenance Report")<i class="bi ms-2 bi-box-arrow-in-up-right"></i></button>
</div>
@ -126,4 +129,17 @@
</div>
</div>
</div>
<div class="modal fade" data-bs-focus="false" id="globalSearchModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content" id="globalSearchModalContent">
<div class="modal-body">
<div class="input-group input-group-lg">
<input type="text" id="globalSearchInput" onkeyup="handleGlobalSearchKeyPress(event)" class="form-control" placeholder="@translator.Translate(userLanguage,"Search by Keyword(Case Sensitive)")">
<button type="button" class="btn btn-outline-secondary" onclick="performGlobalSearch()"><i class="bi bi-search"></i></button>
</div>
<div id="globalSearchModalResults"></div>
</div>
</div>
</div>
</div>
<div id="vehicleHistoryReport" class="showOnPrint"></div>

View File

@ -140,4 +140,72 @@ function exportAttachments() {
})
}
});
}
function showGlobalSearch() {
$('#globalSearchModal').modal('show');
}
function hideGlobalSearch() {
$('#globalSearchModal').modal('hide');
}
function performGlobalSearch() {
var searchQuery = $('#globalSearchInput').val();
if (searchQuery.trim() == '') {
$('#globalSearchInput').addClass('is-invalid');
} else {
$('#globalSearchInput').removeClass('is-invalid');
}
$.post('/Vehicle/SearchRecords', { vehicleId: GetVehicleId().vehicleId, searchQuery: searchQuery }, function (data) {
$('#globalSearchModalResults').html(data);
});
}
function handleGlobalSearchKeyPress(event) {
if (event.keyCode == 13) {
performGlobalSearch();
}
}
function loadGlobalSearchResult(recordId, recordType) {
hideGlobalSearch();
switch (recordType) {
case "ServiceRecord":
$('#servicerecord-tab').tab('show');
waitForElement('#serviceRecordModalContent', showEditServiceRecordModal, recordId);
break;
case "RepairRecord":
$('#accident-tab').tab('show');
waitForElement('#collisionRecordModalContent', showEditCollisionRecordModal, recordId);
break;
case "UpgradeRecord":
$('#upgrade-tab').tab('show');
waitForElement('#upgradeRecordModalContent', showEditUpgradeRecordModal, recordId);
break;
case "TaxRecord":
$('#tax-tab').tab('show');
waitForElement('#taxRecordModalContent', showEditTaxRecordModal, recordId);
break;
case "SupplyRecord":
$('#supply-tab').tab('show');
waitForElement('#supplyRecordModalContent', showEditSupplyRecordModal, recordId);
break;
case "NoteRecord":
$('#notes-tab').tab('show');
waitForElement('#noteModalContent', showEditNoteModal, recordId);
break;
case "OdometerRecord":
$('#odometer-tab').tab('show');
waitForElement('#odometerRecordModalContent', showEditOdometerRecordModal, recordId);
break;
case "ReminderRecord":
$('#reminder-tab').tab('show');
waitForElement('#reminderRecordModalContent', showEditReminderRecordModal, recordId);
break;
case "GasRecord":
$('#gas-tab').tab('show');
waitForElement('#gasRecordModalContent', showEditGasRecordModal, recordId);
break;
case "PlanRecord":
$('#plan-tab').tab('show');
waitForElement('#planRecordModalContent', showEditPlanRecordModal, recordId);
break;
}
}

View File

@ -1079,4 +1079,14 @@ function copyToClipboard(e) {
}
function noPropagation() {
event.stopPropagation();
}
var checkExist;
function waitForElement(element, callBack, callBackParameter) {
checkExist = setInterval(function () {
if ($(`${element}`).length) {
callBack(callBackParameter);
clearInterval(checkExist);
}
}, 100); // check every 100ms
}

View File

@ -75,6 +75,10 @@ $(document).ready(function () {
$("#odometer-tab-pane").html("");
break;
}
$(`.lubelogger-tab #${e.target.id}`).addClass('active');
$(`.lubelogger-mobile-nav #${e.target.id}`).addClass('active');
$(`.lubelogger-tab #${e.relatedTarget.id}`).removeClass('active');
$(`.lubelogger-mobile-nav #${e.relatedTarget.id}`).removeClass('active');
});
var defaultTab = GetDefaultTab().tab;
switch (defaultTab) {