From 7af043aae4a6dfbfecee6c7c2a0126bc80b03911 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 14 Jan 2026 14:06:37 +0000 Subject: [PATCH 1/5] Initial plan From 0e3a24a51f91cb85993eb1056f5c4bcdc9162d82 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 14 Jan 2026 14:15:07 +0000 Subject: [PATCH 2/5] Add edit and delete functionality for notes Co-authored-by: fboucher <2404846+fboucher@users.noreply.github.com> --- .../Endpoints/NoteEndpointsTests.cs | 105 +++++++++++++++++ src/NoteBookmark.Api/DataStorageService.cs | 20 ++++ src/NoteBookmark.Api/NoteEnpoints.cs | 49 ++++++++ .../Components/Pages/NoteEditor.razor | 106 ++++++++++++++++++ .../Components/Pages/Posts.razor | 7 +- src/NoteBookmark.BlazorApp/PostNoteClient.cs | 18 +++ 6 files changed, 304 insertions(+), 1 deletion(-) create mode 100644 src/NoteBookmark.BlazorApp/Components/Pages/NoteEditor.razor diff --git a/src/NoteBookmark.Api.Tests/Endpoints/NoteEndpointsTests.cs b/src/NoteBookmark.Api.Tests/Endpoints/NoteEndpointsTests.cs index c1bd0be..565d0da 100644 --- a/src/NoteBookmark.Api.Tests/Endpoints/NoteEndpointsTests.cs +++ b/src/NoteBookmark.Api.Tests/Endpoints/NoteEndpointsTests.cs @@ -158,6 +158,111 @@ public async Task UpdatePostReadStatus_UpdatesAllPostsWithNotes() // This would require additional verification logic based on the actual implementation } + [Fact] + public async Task GetNote_WithValidNoteId_ReturnsNote() + { + // Arrange + var testPost = await CreateAndSaveTestPost(); + var testNote = CreateTestNote(); + testNote.PostId = testPost.RowKey; + await _client.PostAsJsonAsync("/api/notes/note", testNote); + + // Act + var response = await _client.GetAsync($"/api/notes/note/{testNote.RowKey}"); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.OK); + + var retrievedNote = await response.Content.ReadFromJsonAsync(); + retrievedNote.Should().NotBeNull(); + retrievedNote!.RowKey.Should().Be(testNote.RowKey); + retrievedNote.Comment.Should().Be(testNote.Comment); + } + + [Fact] + public async Task GetNote_WithInvalidNoteId_ReturnsNotFound() + { + // Arrange + var nonExistentNoteId = "non-existent-note-id"; + + // Act + var response = await _client.GetAsync($"/api/notes/note/{nonExistentNoteId}"); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.NotFound); + } + + [Fact] + public async Task UpdateNote_WithValidNote_ReturnsOk() + { + // Arrange + var testPost = await CreateAndSaveTestPost(); + var testNote = CreateTestNote(); + testNote.PostId = testPost.RowKey; + await _client.PostAsJsonAsync("/api/notes/note", testNote); + + // Update the note + testNote.Comment = "Updated comment"; + testNote.Tags = "updated, tags"; + + // Act + var response = await _client.PutAsJsonAsync("/api/notes/note", testNote); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.OK); + + var updatedNote = await response.Content.ReadFromJsonAsync(); + updatedNote.Should().NotBeNull(); + updatedNote!.Comment.Should().Be("Updated comment"); + updatedNote.Tags.Should().Be("updated, tags"); + } + + [Fact] + public async Task UpdateNote_WithInvalidNote_ReturnsBadRequest() + { + // Arrange + var invalidNote = new Note(); // Missing required comment + + // Act + var response = await _client.PutAsJsonAsync("/api/notes/note", invalidNote); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.BadRequest); + } + + [Fact] + public async Task DeleteNote_WithValidNoteId_ReturnsOk() + { + // Arrange + var testPost = await CreateAndSaveTestPost(); + var testNote = CreateTestNote(); + testNote.PostId = testPost.RowKey; + await _client.PostAsJsonAsync("/api/notes/note", testNote); + + // Act + var response = await _client.DeleteAsync($"/api/notes/note/{testNote.RowKey}"); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.OK); + + // Verify the note is deleted + var getResponse = await _client.GetAsync($"/api/notes/note/{testNote.RowKey}"); + getResponse.StatusCode.Should().Be(HttpStatusCode.NotFound); + } + + [Fact] + public async Task DeleteNote_WithInvalidNoteId_ReturnsNotFound() + { + // Arrange + var nonExistentNoteId = "non-existent-note-id"; + + // Act + var response = await _client.DeleteAsync($"/api/notes/note/{nonExistentNoteId}"); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.NotFound); + } + // Helper methods private async Task SeedTestNotes() { diff --git a/src/NoteBookmark.Api/DataStorageService.cs b/src/NoteBookmark.Api/DataStorageService.cs index 3fbb8fa..c744eb4 100644 --- a/src/NoteBookmark.Api/DataStorageService.cs +++ b/src/NoteBookmark.Api/DataStorageService.cs @@ -179,6 +179,26 @@ public void CreateNote(Note note) } } + public Note? GetNote(string rowKey) + { + var tblNote = GetNoteTable(); + var result = tblNote.Query(filter: $"RowKey eq '{rowKey}'"); + Note? note = result.FirstOrDefault(); + return note; + } + + public bool DeleteNote(string rowKey) + { + var tblNote = GetNoteTable(); + var existingNote = tblNote.Query(filter: $"RowKey eq '{rowKey}'").FirstOrDefault(); + if (existingNote != null) + { + tblNote.DeleteEntity(existingNote.PartitionKey, existingNote.RowKey); + return true; + } + return false; + } + public async Task GetSettings() { diff --git a/src/NoteBookmark.Api/NoteEnpoints.cs b/src/NoteBookmark.Api/NoteEnpoints.cs index 77d36f3..59bc41b 100644 --- a/src/NoteBookmark.Api/NoteEnpoints.cs +++ b/src/NoteBookmark.Api/NoteEnpoints.cs @@ -27,6 +27,15 @@ public static void MapNoteEndpoints(this IEndpointRouteBuilder app) endpoints.MapGet("/UpdatePostReadStatus", UpdatePostReadStatus) .WithDescription("Update the read status of all posts to true if they have a note referencing them."); + + endpoints.MapGet("/note/{rowKey}", GetNote) + .WithDescription("Get a specific note by its row key."); + + endpoints.MapPut("/note", UpdateNote) + .WithDescription("Update an existing note"); + + endpoints.MapDelete("/note/{rowKey}", DeleteNote) + .WithDescription("Delete a note"); } static Results, BadRequest> CreateNote(Note note, @@ -115,4 +124,44 @@ private static async Task> UpdatePostReadStatus(TableSer return TypedResults.BadRequest(); } } + + static Results, NotFound> GetNote(string rowKey, + TableServiceClient tblClient, + BlobServiceClient blobClient) + { + var dataStorageService = new DataStorageService(tblClient, blobClient); + var note = dataStorageService.GetNote(rowKey); + return note == null ? TypedResults.NotFound() : TypedResults.Ok(note); + } + + static Results, BadRequest> UpdateNote(Note note, + TableServiceClient tblClient, + BlobServiceClient blobClient) + { + try + { + if (!note.Validate()) + { + return TypedResults.BadRequest(); + } + + var dataStorageService = new DataStorageService(tblClient, blobClient); + dataStorageService.CreateNote(note); + return TypedResults.Ok(note); + } + catch (Exception ex) + { + Console.WriteLine($"An error occurred while updating a note: {ex.Message}"); + return TypedResults.BadRequest(); + } + } + + static Results DeleteNote(string rowKey, + TableServiceClient tblClient, + BlobServiceClient blobClient) + { + var dataStorageService = new DataStorageService(tblClient, blobClient); + var result = dataStorageService.DeleteNote(rowKey); + return result ? TypedResults.Ok() : TypedResults.NotFound(); + } } diff --git a/src/NoteBookmark.BlazorApp/Components/Pages/NoteEditor.razor b/src/NoteBookmark.BlazorApp/Components/Pages/NoteEditor.razor new file mode 100644 index 0000000..cc67b4f --- /dev/null +++ b/src/NoteBookmark.BlazorApp/Components/Pages/NoteEditor.razor @@ -0,0 +1,106 @@ +@page "/noteeditor/{noteId}" + +@using NoteBookmark.BlazorApp +@using NoteBookmark.Domain +@inject PostNoteClient client +@inject NavigationManager Navigation +@inject IToastService toastService + +@rendermode InteractiveServer + +Edit Note + +

Edit Note

+ +@if (note == null) +{ +

Loading...

+} +else +{ + + + + + +
+ + @foreach (var category in _categories) + { + @category + } + +
+ +
+ +
+ +
+ +
+
+ + + Save + Back to List + Delete + +
+} + + +@code { + [Parameter] + public string? noteId { get; set; } + + private Note? note; + private List _categories = NoteCategories.GetCategories(); + + protected override async Task OnInitializedAsync() + { + if (!string.IsNullOrEmpty(noteId)) + { + note = await client.GetNote(noteId); + } + } + + private async Task SaveNote() + { + if (note != null) + { + var result = await client.UpdateNote(note); + if (result) + { + toastService.ShowSuccess("Note updated successfully!"); + Navigation.NavigateTo("/posts"); + } + else + { + toastService.ShowError("Failed to update note. Please try again."); + } + } + } + + private void BackToList() + { + Navigation.NavigateTo("/posts"); + } + + private async Task DeleteNoteAsync() + { + if (note != null) + { + var result = await client.DeleteNote(note.RowKey); + if (result) + { + toastService.ShowSuccess("Note deleted successfully!"); + Navigation.NavigateTo("/posts"); + } + else + { + toastService.ShowError("Failed to delete note. Please try again."); + } + } + } +} diff --git a/src/NoteBookmark.BlazorApp/Components/Pages/Posts.razor b/src/NoteBookmark.BlazorApp/Components/Pages/Posts.razor index e43e68f..100c03f 100644 --- a/src/NoteBookmark.BlazorApp/Components/Pages/Posts.razor +++ b/src/NoteBookmark.BlazorApp/Components/Pages/Posts.razor @@ -35,7 +35,7 @@ } else { - + } @@ -117,6 +117,11 @@ Navigation.NavigateTo($"posteditor/{postId}"); } + private void EditNoteForPost(string noteId) + { + Navigation.NavigateTo($"noteeditor/{noteId}"); + } + private async Task AddNewPost() { if (!string.IsNullOrEmpty(newPostUrl)) diff --git a/src/NoteBookmark.BlazorApp/PostNoteClient.cs b/src/NoteBookmark.BlazorApp/PostNoteClient.cs index 65e6a49..b6d734f 100644 --- a/src/NoteBookmark.BlazorApp/PostNoteClient.cs +++ b/src/NoteBookmark.BlazorApp/PostNoteClient.cs @@ -31,6 +31,24 @@ public async Task CreateNote(Note note) response.EnsureSuccessStatusCode(); } + public async Task GetNote(string noteId) + { + var note = await httpClient.GetFromJsonAsync($"api/notes/note/{noteId}"); + return note; + } + + public async Task UpdateNote(Note note) + { + var response = await httpClient.PutAsJsonAsync("api/notes/note", note); + return response.IsSuccessStatusCode; + } + + public async Task DeleteNote(string noteId) + { + var response = await httpClient.DeleteAsync($"api/notes/note/{noteId}"); + return response.IsSuccessStatusCode; + } + public async Task CreateReadingNotes() { var rnCounter = await httpClient.GetStringAsync("api/settings/GetNextReadingNotesCounter"); From 39afc6287f3ddfa8957ee07b2acd5169369acf28 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 14 Jan 2026 14:17:53 +0000 Subject: [PATCH 3/5] Add error handling and delete confirmation to NoteEditor Co-authored-by: fboucher <2404846+fboucher@users.noreply.github.com> --- .../Components/Pages/NoteEditor.razor | 71 +++++++++++++++---- 1 file changed, 57 insertions(+), 14 deletions(-) diff --git a/src/NoteBookmark.BlazorApp/Components/Pages/NoteEditor.razor b/src/NoteBookmark.BlazorApp/Components/Pages/NoteEditor.razor index cc67b4f..684fcb3 100644 --- a/src/NoteBookmark.BlazorApp/Components/Pages/NoteEditor.razor +++ b/src/NoteBookmark.BlazorApp/Components/Pages/NoteEditor.razor @@ -5,6 +5,7 @@ @inject PostNoteClient client @inject NavigationManager Navigation @inject IToastService toastService +@inject IDialogService DialogService @rendermode InteractiveServer @@ -44,7 +45,7 @@ else Save Back to List - Delete + Delete } @@ -61,7 +62,20 @@ else { if (!string.IsNullOrEmpty(noteId)) { - note = await client.GetNote(noteId); + try + { + note = await client.GetNote(noteId); + if (note == null) + { + toastService.ShowError("Note not found."); + Navigation.NavigateTo("/posts"); + } + } + catch (Exception) + { + toastService.ShowError("Failed to load note. Please try again."); + Navigation.NavigateTo("/posts"); + } } } @@ -69,15 +83,22 @@ else { if (note != null) { - var result = await client.UpdateNote(note); - if (result) + try { - toastService.ShowSuccess("Note updated successfully!"); - Navigation.NavigateTo("/posts"); + var result = await client.UpdateNote(note); + if (result) + { + toastService.ShowSuccess("Note updated successfully!"); + Navigation.NavigateTo("/posts"); + } + else + { + toastService.ShowError("Failed to update note. Please check your input and try again."); + } } - else + catch (Exception) { - toastService.ShowError("Failed to update note. Please try again."); + toastService.ShowError("An error occurred while updating the note. Please try again."); } } } @@ -87,19 +108,41 @@ else Navigation.NavigateTo("/posts"); } + private async Task ShowDeleteConfirmation() + { + var dialog = await DialogService.ShowConfirmationAsync( + "Are you sure you want to delete this note? This action cannot be undone.", + "Confirm Delete", + "Delete", + "Cancel"); + + var result = await dialog.Result; + if (!result.Cancelled) + { + await DeleteNoteAsync(); + } + } + private async Task DeleteNoteAsync() { if (note != null) { - var result = await client.DeleteNote(note.RowKey); - if (result) + try { - toastService.ShowSuccess("Note deleted successfully!"); - Navigation.NavigateTo("/posts"); + var result = await client.DeleteNote(note.RowKey); + if (result) + { + toastService.ShowSuccess("Note deleted successfully!"); + Navigation.NavigateTo("/posts"); + } + else + { + toastService.ShowError("Failed to delete note. The note may not exist anymore."); + } } - else + catch (Exception) { - toastService.ShowError("Failed to delete note. Please try again."); + toastService.ShowError("An error occurred while deleting the note. Please try again."); } } } From 814309738d3ff88f0c35b43eb7d9a3d6bdda774e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 15 Jan 2026 13:05:25 +0000 Subject: [PATCH 4/5] Refactor to reuse NoteDialog for both create and edit Co-authored-by: fboucher <2404846+fboucher@users.noreply.github.com> --- .../Components/Pages/NoteEditor.razor | 149 ------------------ .../Components/Pages/Posts.razor | 71 +++++++-- .../Components/Shared/NoteDialog.razor | 35 +++- src/NoteBookmark.Domain/NoteDialogResult.cs | 7 + 4 files changed, 99 insertions(+), 163 deletions(-) delete mode 100644 src/NoteBookmark.BlazorApp/Components/Pages/NoteEditor.razor create mode 100644 src/NoteBookmark.Domain/NoteDialogResult.cs diff --git a/src/NoteBookmark.BlazorApp/Components/Pages/NoteEditor.razor b/src/NoteBookmark.BlazorApp/Components/Pages/NoteEditor.razor deleted file mode 100644 index 684fcb3..0000000 --- a/src/NoteBookmark.BlazorApp/Components/Pages/NoteEditor.razor +++ /dev/null @@ -1,149 +0,0 @@ -@page "/noteeditor/{noteId}" - -@using NoteBookmark.BlazorApp -@using NoteBookmark.Domain -@inject PostNoteClient client -@inject NavigationManager Navigation -@inject IToastService toastService -@inject IDialogService DialogService - -@rendermode InteractiveServer - -Edit Note - -

Edit Note

- -@if (note == null) -{ -

Loading...

-} -else -{ - - - - - -
- - @foreach (var category in _categories) - { - @category - } - -
- -
- -
- -
- -
-
- - - Save - Back to List - Delete - -
-} - - -@code { - [Parameter] - public string? noteId { get; set; } - - private Note? note; - private List _categories = NoteCategories.GetCategories(); - - protected override async Task OnInitializedAsync() - { - if (!string.IsNullOrEmpty(noteId)) - { - try - { - note = await client.GetNote(noteId); - if (note == null) - { - toastService.ShowError("Note not found."); - Navigation.NavigateTo("/posts"); - } - } - catch (Exception) - { - toastService.ShowError("Failed to load note. Please try again."); - Navigation.NavigateTo("/posts"); - } - } - } - - private async Task SaveNote() - { - if (note != null) - { - try - { - var result = await client.UpdateNote(note); - if (result) - { - toastService.ShowSuccess("Note updated successfully!"); - Navigation.NavigateTo("/posts"); - } - else - { - toastService.ShowError("Failed to update note. Please check your input and try again."); - } - } - catch (Exception) - { - toastService.ShowError("An error occurred while updating the note. Please try again."); - } - } - } - - private void BackToList() - { - Navigation.NavigateTo("/posts"); - } - - private async Task ShowDeleteConfirmation() - { - var dialog = await DialogService.ShowConfirmationAsync( - "Are you sure you want to delete this note? This action cannot be undone.", - "Confirm Delete", - "Delete", - "Cancel"); - - var result = await dialog.Result; - if (!result.Cancelled) - { - await DeleteNoteAsync(); - } - } - - private async Task DeleteNoteAsync() - { - if (note != null) - { - try - { - var result = await client.DeleteNote(note.RowKey); - if (result) - { - toastService.ShowSuccess("Note deleted successfully!"); - Navigation.NavigateTo("/posts"); - } - else - { - toastService.ShowError("Failed to delete note. The note may not exist anymore."); - } - } - catch (Exception) - { - toastService.ShowError("An error occurred while deleting the note. Please try again."); - } - } - } -} diff --git a/src/NoteBookmark.BlazorApp/Components/Pages/Posts.razor b/src/NoteBookmark.BlazorApp/Components/Pages/Posts.razor index 100c03f..b6cac71 100644 --- a/src/NoteBookmark.BlazorApp/Components/Pages/Posts.razor +++ b/src/NoteBookmark.BlazorApp/Components/Pages/Posts.razor @@ -100,26 +100,75 @@ var result = await dialog.Result; if (!result.Cancelled && result.Data != null) { - var note = (Note)result.Data; - await client.CreateNote(note); - ShowConfirmationMessage(); - await LoadPosts(); + var dialogResult = (NoteDialogResult)result.Data; + if (dialogResult.Action == "Save" && dialogResult.Note != null) + { + await client.CreateNote(dialogResult.Note); + toastService.ShowSuccess("Note created successfully!"); + await LoadPosts(); + } } } - private void ShowConfirmationMessage() - { - toastService.ShowSuccess("Note created successfully!"); - } - private void EditNote(string postId) { Navigation.NavigateTo($"posteditor/{postId}"); } - private void EditNoteForPost(string noteId) + private async Task EditNoteForPost(string noteId) { - Navigation.NavigateTo($"noteeditor/{noteId}"); + try + { + var existingNote = await client.GetNote(noteId); + if (existingNote == null) + { + toastService.ShowError("Note not found."); + return; + } + + IDialogReference dialog = await DialogService.ShowDialogAsync(existingNote, new DialogParameters(){ + Title = "Edit note", + PreventDismissOnOverlayClick = true, + PreventScroll = true, + }); + + var result = await dialog.Result; + if (!result.Cancelled && result.Data != null) + { + var dialogResult = (NoteDialogResult)result.Data; + + if (dialogResult.Action == "Delete" && dialogResult.Note != null) + { + var deleteResult = await client.DeleteNote(dialogResult.Note.RowKey); + if (deleteResult) + { + toastService.ShowSuccess("Note deleted successfully!"); + await LoadPosts(); + } + else + { + toastService.ShowError("Failed to delete note. Please try again."); + } + } + else if (dialogResult.Action == "Save" && dialogResult.Note != null) + { + var updateResult = await client.UpdateNote(dialogResult.Note); + if (updateResult) + { + toastService.ShowSuccess("Note updated successfully!"); + await LoadPosts(); + } + else + { + toastService.ShowError("Failed to update note. Please try again."); + } + } + } + } + catch (Exception) + { + toastService.ShowError("An error occurred. Please try again."); + } } private async Task AddNewPost() diff --git a/src/NoteBookmark.BlazorApp/Components/Shared/NoteDialog.razor b/src/NoteBookmark.BlazorApp/Components/Shared/NoteDialog.razor index 396cb5b..196d654 100644 --- a/src/NoteBookmark.BlazorApp/Components/Shared/NoteDialog.razor +++ b/src/NoteBookmark.BlazorApp/Components/Shared/NoteDialog.razor @@ -56,6 +56,14 @@ OnClick="@CancelAsync"> Cancel
+ @if (_isEditMode) + { + + Delete + + } @code { @@ -68,19 +76,35 @@ private Domain.Note _note = default!; private List _categories = NoteCategories.GetCategories(); + private bool _isEditMode = false; protected override void OnInitialized() { - _note = new Note{PostId = Content.PostId}; + // Check if we're editing an existing note or creating a new one + _isEditMode = !string.IsNullOrEmpty(Content.RowKey) && Content.RowKey != Guid.Empty.ToString(); + + if (_isEditMode) + { + // Editing mode - use the existing note data + _note = Content; + } + else + { + // Create mode - create a new note with the PostId + _note = new Note { PostId = Content.PostId }; + } } private async Task SaveAsync() { - _note.DateAdded = DateTime.UtcNow; + if (!_isEditMode) + { + _note.DateAdded = DateTime.UtcNow; + } if (_note.Validate()) { - await Dialog.CloseAsync(_note); + await Dialog.CloseAsync(new NoteDialogResult { Action = "Save", Note = _note }); } } @@ -89,5 +113,10 @@ await Dialog.CancelAsync(); } + private async Task DeleteAsync() + { + await Dialog.CloseAsync(new NoteDialogResult { Action = "Delete", Note = _note }); + } + } diff --git a/src/NoteBookmark.Domain/NoteDialogResult.cs b/src/NoteBookmark.Domain/NoteDialogResult.cs new file mode 100644 index 0000000..691f609 --- /dev/null +++ b/src/NoteBookmark.Domain/NoteDialogResult.cs @@ -0,0 +1,7 @@ +namespace NoteBookmark.Domain; + +public class NoteDialogResult +{ + public string Action { get; set; } = "Save"; + public Note? Note { get; set; } +} From 72cdb7e3e5b919bb2179bb10fb6b7e98143315f9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 15 Jan 2026 13:07:29 +0000 Subject: [PATCH 5/5] Improve null safety with pattern matching Co-authored-by: fboucher <2404846+fboucher@users.noreply.github.com> --- src/NoteBookmark.BlazorApp/Components/Pages/Posts.razor | 7 ++----- .../Components/Shared/NoteDialog.razor | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/NoteBookmark.BlazorApp/Components/Pages/Posts.razor b/src/NoteBookmark.BlazorApp/Components/Pages/Posts.razor index b6cac71..1d2672d 100644 --- a/src/NoteBookmark.BlazorApp/Components/Pages/Posts.razor +++ b/src/NoteBookmark.BlazorApp/Components/Pages/Posts.razor @@ -98,9 +98,8 @@ }); var result = await dialog.Result; - if (!result.Cancelled && result.Data != null) + if (!result.Cancelled && result.Data is NoteDialogResult dialogResult) { - var dialogResult = (NoteDialogResult)result.Data; if (dialogResult.Action == "Save" && dialogResult.Note != null) { await client.CreateNote(dialogResult.Note); @@ -133,10 +132,8 @@ }); var result = await dialog.Result; - if (!result.Cancelled && result.Data != null) + if (!result.Cancelled && result.Data is NoteDialogResult dialogResult) { - var dialogResult = (NoteDialogResult)result.Data; - if (dialogResult.Action == "Delete" && dialogResult.Note != null) { var deleteResult = await client.DeleteNote(dialogResult.Note.RowKey); diff --git a/src/NoteBookmark.BlazorApp/Components/Shared/NoteDialog.razor b/src/NoteBookmark.BlazorApp/Components/Shared/NoteDialog.razor index 196d654..a3821be 100644 --- a/src/NoteBookmark.BlazorApp/Components/Shared/NoteDialog.razor +++ b/src/NoteBookmark.BlazorApp/Components/Shared/NoteDialog.razor @@ -81,7 +81,7 @@ protected override void OnInitialized() { // Check if we're editing an existing note or creating a new one - _isEditMode = !string.IsNullOrEmpty(Content.RowKey) && Content.RowKey != Guid.Empty.ToString(); + _isEditMode = !string.IsNullOrEmpty(Content.RowKey) && !Content.RowKey.Equals(Guid.Empty.ToString(), StringComparison.OrdinalIgnoreCase); if (_isEditMode) {