From 6455af96bf5a7f9c1c3ee935ebd730416e200cd8 Mon Sep 17 00:00:00 2001 From: "DESKTOP-GENO133\\IvanPlex" Date: Tue, 26 Mar 2024 08:11:14 -0600 Subject: [PATCH 1/2] Add tag functionality to reminders. --- Controllers/VehicleController.cs | 3 ++- Helper/ReminderHelper.cs | 3 ++- Models/Reminder/ReminderRecord.cs | 1 + Models/Reminder/ReminderRecordInput.cs | 4 +++- Models/Reminder/ReminderRecordViewModel.cs | 1 + Views/Vehicle/_ReminderRecordModal.cshtml | 8 ++++++++ Views/Vehicle/_ReminderRecords.cshtml | 13 ++++++++++++- wwwroot/js/reminderrecord.js | 5 ++++- wwwroot/js/vehicle.js | 2 ++ 9 files changed, 35 insertions(+), 5 deletions(-) diff --git a/Controllers/VehicleController.cs b/Controllers/VehicleController.cs index 4031f5f..7d57ad9 100644 --- a/Controllers/VehicleController.cs +++ b/Controllers/VehicleController.cs @@ -1683,7 +1683,8 @@ namespace CarCareTracker.Controllers ReminderMileageInterval = result.ReminderMileageInterval, ReminderMonthInterval = result.ReminderMonthInterval, CustomMileageInterval = result.CustomMileageInterval, - CustomMonthInterval = result.CustomMonthInterval + CustomMonthInterval = result.CustomMonthInterval, + Tags = result.Tags }; return PartialView("_ReminderRecordModal", convertedResult); } diff --git a/Helper/ReminderHelper.cs b/Helper/ReminderHelper.cs index 3777846..2dc1932 100644 --- a/Helper/ReminderHelper.cs +++ b/Helper/ReminderHelper.cs @@ -73,7 +73,8 @@ namespace CarCareTracker.Helper Description = reminder.Description, Notes = reminder.Notes, Metric = reminder.Metric, - IsRecurring = reminder.IsRecurring + IsRecurring = reminder.IsRecurring, + Tags = reminder.Tags }; if (reminder.Metric == ReminderMetric.Both) { diff --git a/Models/Reminder/ReminderRecord.cs b/Models/Reminder/ReminderRecord.cs index cf3c06c..3c30098 100644 --- a/Models/Reminder/ReminderRecord.cs +++ b/Models/Reminder/ReminderRecord.cs @@ -14,5 +14,6 @@ public ReminderMileageInterval ReminderMileageInterval { get; set; } = ReminderMileageInterval.FiveThousandMiles; public ReminderMonthInterval ReminderMonthInterval { get; set; } = ReminderMonthInterval.OneYear; public ReminderMetric Metric { get; set; } = ReminderMetric.Date; + public List Tags { get; set; } = new List(); } } diff --git a/Models/Reminder/ReminderRecordInput.cs b/Models/Reminder/ReminderRecordInput.cs index d2fc7de..64cd9dd 100644 --- a/Models/Reminder/ReminderRecordInput.cs +++ b/Models/Reminder/ReminderRecordInput.cs @@ -14,6 +14,7 @@ public ReminderMileageInterval ReminderMileageInterval { get; set; } = ReminderMileageInterval.FiveThousandMiles; public ReminderMonthInterval ReminderMonthInterval { get; set; } = ReminderMonthInterval.OneYear; public ReminderMetric Metric { get; set; } = ReminderMetric.Date; + public List Tags { get; set; } = new List(); public ReminderRecord ToReminderRecord() { return new ReminderRecord @@ -29,7 +30,8 @@ ReminderMonthInterval = ReminderMonthInterval, CustomMileageInterval = CustomMileageInterval, CustomMonthInterval = CustomMonthInterval, - Notes = Notes + Notes = Notes, + Tags = Tags }; } } diff --git a/Models/Reminder/ReminderRecordViewModel.cs b/Models/Reminder/ReminderRecordViewModel.cs index 5a9f65a..7fb31b6 100644 --- a/Models/Reminder/ReminderRecordViewModel.cs +++ b/Models/Reminder/ReminderRecordViewModel.cs @@ -17,5 +17,6 @@ /// Recurring Reminders /// public bool IsRecurring { get; set; } = false; + public List Tags { get; set; } = new List(); } } diff --git a/Views/Vehicle/_ReminderRecordModal.cshtml b/Views/Vehicle/_ReminderRecordModal.cshtml index f97283a..cb59dc0 100644 --- a/Views/Vehicle/_ReminderRecordModal.cshtml +++ b/Views/Vehicle/_ReminderRecordModal.cshtml @@ -42,6 +42,14 @@ +
+ +
diff --git a/Views/Vehicle/_ReminderRecords.cshtml b/Views/Vehicle/_ReminderRecords.cshtml index 2fb11e6..4e66f67 100644 --- a/Views/Vehicle/_ReminderRecords.cshtml +++ b/Views/Vehicle/_ReminderRecords.cshtml @@ -6,6 +6,7 @@ var userConfig = config.GetUserConfig(User); var userLanguage = userConfig.UserLanguage; var hasRefresh = Model.Where(x => (x.Urgency == ReminderUrgency.VeryUrgent || x.Urgency == ReminderUrgency.PastDue) && x.IsRecurring).Any(); + var recordTags = Model.SelectMany(x => x.Tags).Distinct(); }
@@ -15,6 +16,16 @@ @($"{translator.Translate(userLanguage, "Very Urgent")}: {Model.Where(x=>x.Urgency == ReminderUrgency.VeryUrgent).Count()}") @($"{translator.Translate(userLanguage, "Urgent")}: {Model.Where(x => x.Urgency == ReminderUrgency.Urgent).Count()}") @($"{translator.Translate(userLanguage, "Not Urgent")}: {Model.Where(x => x.Urgency == ReminderUrgency.NotUrgent).Count()}") + @foreach (string recordTag in recordTags) + { + @recordTag + } + + @foreach (string recordTag in recordTags) + { + + } +
@@ -45,7 +56,7 @@ @foreach (ReminderRecordViewModel reminderRecord in Model) { - + @if (reminderRecord.Urgency == ReminderUrgency.VeryUrgent) { @translator.Translate(userLanguage, "Very Urgent") diff --git a/wwwroot/js/reminderrecord.js b/wwwroot/js/reminderrecord.js index 5159b39..c0f1f0e 100644 --- a/wwwroot/js/reminderrecord.js +++ b/wwwroot/js/reminderrecord.js @@ -3,6 +3,7 @@ if (data) { $("#reminderRecordModalContent").html(data); initDatePicker($('#reminderDate'), true); + initTagSelector($("#reminderRecordTag")); $("#reminderRecordModal").modal("show"); $('#reminderRecordModal').off('shown.bs.modal').on('shown.bs.modal', function () { if (getGlobalConfig().useMarkDown) { @@ -166,6 +167,7 @@ function getAndValidateReminderRecordValues() { var reminderIsRecurring = $("#reminderIsRecurring").is(":checked"); var reminderRecurringMonth = $("#reminderRecurringMonth").val(); var reminderRecurringMileage = $("#reminderRecurringMileage").val(); + var reminderTags = $("#reminderRecordTag").val(); var reminderCustomMileageInterval = customMileageInterval; var vehicleId = GetVehicleId().vehicleId; var reminderId = getReminderRecordModelData().id; @@ -215,7 +217,8 @@ function getAndValidateReminderRecordValues() { reminderMileageInterval: reminderRecurringMileage, reminderMonthInterval: reminderRecurringMonth, customMileageInterval: customMileageInterval, - customMonthInterval: customMonthInterval + customMonthInterval: customMonthInterval, + tags: reminderTags } } function createPlanRecordFromReminder(reminderRecordId) { diff --git a/wwwroot/js/vehicle.js b/wwwroot/js/vehicle.js index fb09a15..f018fbd 100644 --- a/wwwroot/js/vehicle.js +++ b/wwwroot/js/vehicle.js @@ -246,12 +246,14 @@ function showAddReminderModal(reminderModalInput) { $.post('/Vehicle/GetAddReminderRecordPartialView', { reminderModel: reminderModalInput }, function (data) { $("#reminderRecordModalContent").html(data); initDatePicker($('#reminderDate'), true); + initTagSelector($("#reminderRecordTag")); $("#reminderRecordModal").modal("show"); }); } else { $.post('/Vehicle/GetAddReminderRecordPartialView', function (data) { $("#reminderRecordModalContent").html(data); initDatePicker($('#reminderDate'), true); + initTagSelector($("#reminderRecordTag")); $("#reminderRecordModal").modal("show"); }); } From e4cb1831405b49afcde99c0efdce957f9ee6c81b Mon Sep 17 00:00:00 2001 From: "DESKTOP-GENO133\\IvanPlex" Date: Tue, 26 Mar 2024 08:40:30 -0600 Subject: [PATCH 2/2] improve readability on urgent reminder labels, filtering by tag now updates aggregate counts. --- Views/Vehicle/_ReminderRecords.cshtml | 14 ++++---- wwwroot/js/garage.js | 2 +- wwwroot/js/reminderrecord.js | 51 +++++++++++++++++++++++++++ wwwroot/js/shared.js | 2 +- 4 files changed, 60 insertions(+), 9 deletions(-) diff --git a/Views/Vehicle/_ReminderRecords.cshtml b/Views/Vehicle/_ReminderRecords.cshtml index 4e66f67..08e1b7c 100644 --- a/Views/Vehicle/_ReminderRecords.cshtml +++ b/Views/Vehicle/_ReminderRecords.cshtml @@ -11,14 +11,14 @@
- @($"{translator.Translate(userLanguage, "# of Reminders")}: {Model.Count()}") - @($"{translator.Translate(userLanguage, "Past Due")}: {Model.Where(x => x.Urgency == ReminderUrgency.PastDue).Count()}") - @($"{translator.Translate(userLanguage, "Very Urgent")}: {Model.Where(x=>x.Urgency == ReminderUrgency.VeryUrgent).Count()}") - @($"{translator.Translate(userLanguage, "Urgent")}: {Model.Where(x => x.Urgency == ReminderUrgency.Urgent).Count()}") - @($"{translator.Translate(userLanguage, "Not Urgent")}: {Model.Where(x => x.Urgency == ReminderUrgency.NotUrgent).Count()}") + @($"{translator.Translate(userLanguage, "# of Reminders")}: {Model.Count()}") + @($"{translator.Translate(userLanguage, "Past Due")}: {Model.Where(x => x.Urgency == ReminderUrgency.PastDue).Count()}") + @($"{translator.Translate(userLanguage, "Very Urgent")}: {Model.Where(x => x.Urgency == ReminderUrgency.VeryUrgent).Count()}") + @($"{translator.Translate(userLanguage, "Urgent")}: {Model.Where(x => x.Urgency == ReminderUrgency.Urgent).Count()}") + @($"{translator.Translate(userLanguage, "Not Urgent")}: {Model.Where(x => x.Urgency == ReminderUrgency.NotUrgent).Count()}") @foreach (string recordTag in recordTags) { - @recordTag + @recordTag } @foreach (string recordTag in recordTags) @@ -85,7 +85,7 @@ { @reminderRecord.Metric } - @reminderRecord.Description + @reminderRecord.Description @CarCareTracker.Helper.StaticHelper.TruncateStrings(reminderRecord.Notes) @if (hasRefresh) { diff --git a/wwwroot/js/garage.js b/wwwroot/js/garage.js index 38d6964..6355e1b 100644 --- a/wwwroot/js/garage.js +++ b/wwwroot/js/garage.js @@ -91,7 +91,7 @@ function generateReminderItem(id, urgency, description) { case "PastDue": return `

${encodeHTMLInput(description)}

`; case "Urgent": - return `

${encodeHTMLInput(description)}

`; + return `

${encodeHTMLInput(description)}

`; case "NotUrgent": return `

${encodeHTMLInput(description)}

`; } diff --git a/wwwroot/js/reminderrecord.js b/wwwroot/js/reminderrecord.js index c0f1f0e..8eb4272 100644 --- a/wwwroot/js/reminderrecord.js +++ b/wwwroot/js/reminderrecord.js @@ -242,4 +242,55 @@ function createPlanRecordFromReminder(reminderRecordId) { $("#planRecordModalContent").html(data); $("#planRecordModal").modal("show"); }); +} + +function filterReminderTable(sender) { + var rowData = $(`#reminder-tab-pane table tbody tr`); + if (sender == undefined) { + rowData.removeClass('override-hide'); + return; + } + var tagName = sender.textContent; + //check for other applied filters + if ($(sender).hasClass("bg-primary")) { + rowData.removeClass('override-hide'); + $(sender).removeClass('bg-primary'); + $(sender).addClass('bg-secondary'); + updateReminderAggregateLabels(); + } else { + //hide table rows. + rowData.addClass('override-hide'); + $(`[data-tags~='${tagName}']`).removeClass('override-hide'); + updateReminderAggregateLabels(); + if ($(".tagfilter.bg-primary").length > 0) { + //disabling other filters + $(".tagfilter.bg-primary").addClass('bg-secondary'); + $(".tagfilter.bg-primary").removeClass('bg-primary'); + } + $(sender).addClass('bg-primary'); + $(sender).removeClass('bg-secondary'); + } +} +function updateReminderAggregateLabels() { + //update main count + var newCount = $("[data-record-type='cost']").parent(":not('.override-hide')").length; + var countLabel = $("[data-aggregate-type='count']"); + countLabel.text(`${countLabel.text().split(':')[0]}: ${newCount}`); + //update labels + //paste due + var pastDueCount = $("tr td span.badge.text-bg-secondary").parents("tr:not('.override-hide')").length; + var pastDueLabel = $('[data-aggregate-type="pastdue-count"]'); + pastDueLabel.text(`${pastDueLabel.text().split(':')[0]}: ${pastDueCount}`); + //very urgent + var veryUrgentCount = $("tr td span.badge.text-bg-danger").parents("tr:not('.override-hide')").length; + var veryUrgentLabel = $('[data-aggregate-type="veryurgent-count"]'); + veryUrgentLabel.text(`${veryUrgentLabel.text().split(':')[0]}: ${veryUrgentCount}`); + //urgent + var urgentCount = $("tr td span.badge.text-bg-warning").parents("tr:not('.override-hide')").length; + var urgentLabel = $('[data-aggregate-type="urgent-count"]'); + urgentLabel.text(`${urgentLabel.text().split(':')[0]}: ${urgentCount}`); + //not urgent + var notUrgentCount = $("tr td span.badge.text-bg-success").parents("tr:not('.override-hide')").length; + var notUrgentLabel = $('[data-aggregate-type="noturgent-count"]'); + notUrgentLabel.text(`${notUrgentLabel.text().split(':')[0]}: ${notUrgentCount}`); } \ No newline at end of file diff --git a/wwwroot/js/shared.js b/wwwroot/js/shared.js index 6703cc9..c88ee9d 100644 --- a/wwwroot/js/shared.js +++ b/wwwroot/js/shared.js @@ -336,7 +336,7 @@ function updateAggregateLabels() { //Count var newCount = $("[data-record-type='cost']").parent(":not('.override-hide')").length; var countLabel = $("[data-aggregate-type='count']"); - countLabel.text(`${countLabel.text().split(':')[0]}: ${newCount}`) + countLabel.text(`${countLabel.text().split(':')[0]}: ${newCount}`); } function uploadVehicleFilesAsync(event) {