diff --git a/Controllers/VehicleController.cs b/Controllers/VehicleController.cs index 879548c..8ceddee 100644 --- a/Controllers/VehicleController.cs +++ b/Controllers/VehicleController.cs @@ -103,34 +103,12 @@ namespace CarCareTracker.Controllers _serviceRecordDataAccess.DeleteAllServiceRecordsByVehicleId(vehicleId) && _collisionRecordDataAccess.DeleteAllCollisionRecordsByVehicleId(vehicleId) && _taxRecordDataAccess.DeleteAllTaxRecordsByVehicleId(vehicleId) && - _noteDataAccess.DeleteNoteByVehicleId(vehicleId) && + _noteDataAccess.DeleteAllNotesByVehicleId(vehicleId) && _reminderRecordDataAccess.DeleteAllReminderRecordsByVehicleId(vehicleId) && _upgradeRecordDataAccess.DeleteAllUpgradeRecordsByVehicleId(vehicleId) && _dataAccess.DeleteVehicle(vehicleId); return Json(result); } - [HttpPost] - public IActionResult SaveNoteToVehicle(Note newNote) - { - //check if there is already an existing note for this vehicle. - var existingNote = _noteDataAccess.GetNoteByVehicleId(newNote.VehicleId); - if (existingNote.Id != default) - { - newNote.Id = existingNote.Id; - } - var result = _noteDataAccess.SaveNoteToVehicleId(newNote); - return Json(result); - } - [HttpGet] - public IActionResult GetNoteByVehicleId(int vehicleId) - { - var existingNote = _noteDataAccess.GetNoteByVehicleId(vehicleId); - if (existingNote.Id != default) - { - return Json(existingNote.NoteText); - } - return Json(""); - } #region "Bulk Imports" [HttpGet] public IActionResult GetBulkImportModalPartialView(ImportMode mode) @@ -744,5 +722,36 @@ namespace CarCareTracker.Controllers return Json(result); } #endregion + #region "Notes" + [HttpGet] + public IActionResult GetNotesByVehicleId(int vehicleId) + { + var result = _noteDataAccess.GetNotesByVehicleId(vehicleId); + return PartialView("_Notes", result); + } + [HttpPost] + public IActionResult SaveNoteToVehicleId(Note note) + { + var result = _noteDataAccess.SaveNoteToVehicle(note); + return Json(result); + } + [HttpGet] + public IActionResult GetAddNotePartialView() + { + return PartialView("_NoteModal", new Note()); + } + [HttpGet] + public IActionResult GetNoteForEditById(int noteId) + { + var result = _noteDataAccess.GetNoteById(noteId); + return PartialView("_NoteModal", result); + } + [HttpPost] + public IActionResult DeleteNoteById(int noteId) + { + var result = _noteDataAccess.DeleteNoteById(noteId); + return Json(result); + } + #endregion } } diff --git a/External/Implementations/NoteDataAccess.cs b/External/Implementations/NoteDataAccess.cs index 727e4c7..596cb83 100644 --- a/External/Implementations/NoteDataAccess.cs +++ b/External/Implementations/NoteDataAccess.cs @@ -9,16 +9,24 @@ namespace CarCareTracker.External.Implementations { private static string dbName = StaticHelper.DbName; private static string tableName = "notes"; - public Note GetNoteByVehicleId(int vehicleId) + public List GetNotesByVehicleId(int vehicleId) { using (var db = new LiteDatabase(dbName)) { var table = db.GetCollection(tableName); - var noteToReturn = table.FindOne(Query.EQ(nameof(Note.VehicleId), vehicleId)); - return noteToReturn ?? new Note(); + var noteToReturn = table.Find(Query.EQ(nameof(Note.VehicleId), vehicleId)); + return noteToReturn.ToList() ?? new List(); }; } - public bool SaveNoteToVehicleId(Note note) + public Note GetNoteById(int noteId) + { + using (var db = new LiteDatabase(dbName)) + { + var table = db.GetCollection(tableName); + return table.FindById(noteId); + }; + } + public bool SaveNoteToVehicle(Note note) { using (var db = new LiteDatabase(dbName)) { @@ -27,12 +35,21 @@ namespace CarCareTracker.External.Implementations return true; }; } - public bool DeleteNoteByVehicleId(int vehicleId) + public bool DeleteNoteById(int noteId) { using (var db = new LiteDatabase(dbName)) { var table = db.GetCollection(tableName); - table.DeleteMany(Query.EQ(nameof(Note.VehicleId), vehicleId)); + table.Delete(noteId); + return true; + }; + } + public bool DeleteAllNotesByVehicleId(int vehicleId) + { + using (var db = new LiteDatabase(dbName)) + { + var table = db.GetCollection(tableName); + var notes = table.DeleteMany(Query.EQ(nameof(Note.VehicleId), vehicleId)); return true; }; } diff --git a/External/Interfaces/INoteDataAccess.cs b/External/Interfaces/INoteDataAccess.cs index 302aaa9..c3505b6 100644 --- a/External/Interfaces/INoteDataAccess.cs +++ b/External/Interfaces/INoteDataAccess.cs @@ -4,8 +4,10 @@ namespace CarCareTracker.External.Interfaces { public interface INoteDataAccess { - public Note GetNoteByVehicleId(int vehicleId); - public bool SaveNoteToVehicleId(Note note); - bool DeleteNoteByVehicleId(int vehicleId); + public List GetNotesByVehicleId(int vehicleId); + public Note GetNoteById(int noteId); + public bool SaveNoteToVehicle(Note note); + public bool DeleteNoteById(int noteId); + public bool DeleteAllNotesByVehicleId(int vehicleId); } } diff --git a/Models/Note.cs b/Models/Note.cs index 4365377..eb8e59e 100644 --- a/Models/Note.cs +++ b/Models/Note.cs @@ -4,6 +4,7 @@ { public int Id { get; set; } public int VehicleId { get; set; } + public string Description { get; set; } public string NoteText { get; set; } } } diff --git a/Views/Vehicle/Index.cshtml b/Views/Vehicle/Index.cshtml index cb81220..a71598c 100644 --- a/Views/Vehicle/Index.cshtml +++ b/Views/Vehicle/Index.cshtml @@ -10,6 +10,7 @@ + }
@@ -57,21 +58,7 @@
-
-
-
- - -
-
-
-
-
- -
-
-
-
+
diff --git a/Views/Vehicle/_NoteModal.cshtml b/Views/Vehicle/_NoteModal.cshtml new file mode 100644 index 0000000..2dcff4c --- /dev/null +++ b/Views/Vehicle/_NoteModal.cshtml @@ -0,0 +1,45 @@ +@model Note +@{ + var isNew = Model.Id == 0; +} + + + + \ No newline at end of file diff --git a/Views/Vehicle/_Notes.cshtml b/Views/Vehicle/_Notes.cshtml new file mode 100644 index 0000000..ca73e23 --- /dev/null +++ b/Views/Vehicle/_Notes.cshtml @@ -0,0 +1,40 @@ +@model List +
+
+
+ @($"# of Notes: {Model.Count()}") +
+
+ +
+
+
+
+
+ + + + + + + + + @foreach (Note note in Model) + { + + + + + } + +
DescriptionNote
@note.Description@note.NoteText
+
+
+ + + \ No newline at end of file diff --git a/wwwroot/js/note.js b/wwwroot/js/note.js new file mode 100644 index 0000000..5187cf5 --- /dev/null +++ b/wwwroot/js/note.js @@ -0,0 +1,90 @@ +function showAddNoteModal() { + $.get('/Vehicle/GetAddNotePartialView', function (data) { + if (data) { + $("#noteModalContent").html(data); + $('#noteModal').modal('show'); + } + }); +} +function showEditNoteModal(noteId) { + $.get(`/Vehicle/GetNoteForEditById?noteId=${noteId}`, function (data) { + if (data) { + $("#noteModalContent").html(data); + $('#noteModal').modal('show'); + } + }); +} +function hideAddNoteModal() { + $('#noteModal').modal('hide'); +} +function deleteNote(noteId) { + $("#workAroundInput").show(); + Swal.fire({ + title: "Confirm Deletion?", + text: "Deleted Notes cannot be restored.", + showCancelButton: true, + confirmButtonText: "Delete", + confirmButtonColor: "#dc3545" + }).then((result) => { + if (result.isConfirmed) { + $.post(`/Vehicle/DeleteNoteById?noteId=${noteId}`, function (data) { + if (data) { + hideAddNoteModal(); + successToast("Note Deleted"); + var vehicleId = GetVehicleId().vehicleId; + getVehicleNote(vehicleId); + } else { + errorToast("An error has occurred, please try again later."); + } + }); + } else { + $("#workAroundInput").hide(); + } + }); +} +function saveNoteToVehicle(isEdit) { + //get values + var formValues = getAndValidateNoteValues(); + //validate + if (formValues.hasError) { + errorToast("Please check the form data"); + return; + } + //save to db. + $.post('/Vehicle/SaveNoteToVehicleId', { note: formValues }, function (data) { + if (data) { + successToast(isEdit ? "Note Updated" : "Note Added."); + hideAddNoteModal(); + getVehicleNote(formValues.vehicleId); + } else { + errorToast("An error has occurred, please try again later."); + } + }) +} +function getAndValidateNoteValues() { + var noteDescription = $("#noteDescription").val(); + var noteText = $("#noteTextArea").val(); + var vehicleId = GetVehicleId().vehicleId; + var noteId = getNoteModelData().id; + //validation + var hasError = false; + if (noteDescription.trim() == '') { //eliminates whitespace. + hasError = true; + $("#noteDescription").addClass("is-invalid"); + } else { + $("#noteDescription").removeClass("is-invalid"); + } + if (noteText.trim() == '') { + hasError = true; + $("#noteTextArea").addClass("is-invalid"); + } else { + $("#noteTextArea").removeClass("is-invalid"); + } + return { + id: noteId, + hasError: hasError, + vehicleId: vehicleId, + description: noteDescription, + noteText: noteText + } +} \ No newline at end of file diff --git a/wwwroot/js/vehicle.js b/wwwroot/js/vehicle.js index 6ead7ed..22510d5 100644 --- a/wwwroot/js/vehicle.js +++ b/wwwroot/js/vehicle.js @@ -63,15 +63,18 @@ $(document).ready(function () { case "upgrade-tab": $("#upgrade-tab-pane").html(""); break; + case "notes-tab": + $("#notes-tab-pane").html(""); + break; } }); getVehicleServiceRecords(vehicleId); }); function getVehicleNote(vehicleId) { - $.get(`/Vehicle/GetNoteByVehicleId?vehicleId=${vehicleId}`, function (data) { + $.get(`/Vehicle/GetNotesByVehicleId?vehicleId=${vehicleId}`, function (data) { if (data) { - $("#noteTextArea").val(data); + $("#notes-tab-pane").html(data); } }); } @@ -111,7 +114,6 @@ function getVehicleTaxRecords(vehicleId) { $.get(`/Vehicle/GetTaxRecordsByVehicleId?vehicleId=${vehicleId}`, function (data) { if (data) { $("#tax-tab-pane").html(data); - getVehicleHaveImportantReminders(vehicleId); } }); }