Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
@using NoteBookmark.SharedUI.Components.Shared
@using NoteBookmark.Domain
@using Microsoft.FluentUI.AspNetCore.Components

<FluentDialog @ref="dialogRef">
<NoteDialog Content="@Content" Title="@Title" OnClose="@HandleClose" />
</FluentDialog>

@code {
[Parameter]
public Note? Content { get; set; }

[Parameter]
public string? Title { get; set; }

[Parameter]
public EventCallback<NoteDialogResult> OnClose { get; set; }

private FluentDialog? dialogRef;

private async Task HandleClose(NoteDialogResult result)
{
await OnClose.InvokeAsync(result);
}
}
21 changes: 13 additions & 8 deletions src/NoteBookmark.BlazorApp.Tests/Tests/NoteDialogTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ namespace NoteBookmark.BlazorApp.Tests.Tests;
///
/// NoteDialog now uses EventCallback&lt;NoteDialogResult&gt; instead of Dialog.CloseAsync(),
/// removing the FluentDialog cascade dependency and enabling unit tests.
/// Tests use NoteDialogTestWrapper to provide the required FluentDialog cascading parameter.
/// </summary>
public sealed class NoteDialogTests : BunitContext
{
Expand All @@ -26,7 +27,7 @@ public void NoteDialog_CreateMode_RendersFormFields()
{
var note = new Note { PostId = "post-1" };

var cut = Render<NoteDialog>(p => p
var cut = Render<NoteDialogTestWrapper>(p => p
.Add(x => x.Content, note)
.Add(x => x.Title, "Add a note"));

Expand All @@ -38,32 +39,36 @@ public void NoteDialog_CreateMode_ShowsSaveAndCancelButtons()
{
var note = new Note { PostId = "post-1" };

var cut = Render<NoteDialog>(p => p
var cut = Render<NoteDialogTestWrapper>(p => p
.Add(x => x.Content, note)
.Add(x => x.Title, "Add a note"));

cut.Markup.Should().Contain("Save");
cut.Markup.Should().Contain("Cancel");
var markup = cut.Markup;
markup.Should().Contain("Save");
markup.Should().Contain("Cancel");
}

[Fact]
public void NoteDialog_EditMode_ShowsDeleteButton()
{
var note = new Note { PostId = "post-1", RowKey = "existing-row-key" };

var cut = Render<NoteDialog>(p => p
var cut = Render<NoteDialogTestWrapper>(p => p
.Add(x => x.Content, note)
.Add(x => x.Title, "Edit note"));

cut.Markup.Should().Contain("Delete");
var markup = cut.Markup;
markup.Should().Contain("Delete");
markup.Should().Contain("Save");
markup.Should().Contain("Cancel");
}

[Fact]
public void NoteDialog_ExistingTags_DisplaysAsBadges()
{
var note = new Note { PostId = "post-1", Tags = "csharp, blazor" };

var cut = Render<NoteDialog>(p => p
var cut = Render<NoteDialogTestWrapper>(p => p
.Add(x => x.Content, note)
.Add(x => x.Title, "Add a note"));

Expand All @@ -76,7 +81,7 @@ public void NoteDialog_CategorySelect_ContainsCategoriesFromDomain()
{
var note = new Note { PostId = "post-1" };

var cut = Render<NoteDialog>(p => p
var cut = Render<NoteDialogTestWrapper>(p => p
.Add(x => x.Content, note)
.Add(x => x.Title, "Add a note"));

Expand Down
3 changes: 2 additions & 1 deletion src/NoteBookmark.SharedUI/Components/Pages/Posts.razor
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,8 @@
Title = "Add a note",
PreventDismissOnOverlayClick = true,
PreventScroll = true,

PrimaryAction = "Save",
SecondaryAction = "Cancel"
});

var result = await dialog.Result;
Expand Down
39 changes: 11 additions & 28 deletions src/NoteBookmark.SharedUI/Components/Shared/NoteDialog.razor
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,6 @@

@rendermode InteractiveServer

<!-- Header -->
<div class="note-dialog-header">
<FluentStack VerticalAlignment="VerticalAlignment.Center">
<FluentIcon Value="@(new Icons.Regular.Size24.WindowApps())" />
<FluentLabel Typo="Typography.PaneHeader">
@(Dialog?.Instance?.Parameters?.Title ?? Title)
</FluentLabel>
</FluentStack>
</div>

<!-- Body -->
<div class="note-dialog-body">
Expand Down Expand Up @@ -62,26 +53,18 @@
</EditForm>
</div>

<!-- Footer -->
<div class="note-dialog-footer">
<FluentButton Appearance="Appearance.Accent"
Disabled="@(!_note.Validate())"
OnClick="@SaveAsync">
Save
</FluentButton>
<FluentButton Appearance="Appearance.Neutral"
OnClick="@CancelAsync">
Cancel
</FluentButton>
<FluentDialogFooter>
@if (_isEditMode)
{
<FluentButton Appearance="Appearance.Accent"
Color="Color.Danger"
OnClick="@DeleteAsync">
Delete
</FluentButton>
}
</div>
{
<FluentButton Appearance="Appearance.Accent" Color="Color.Danger" OnClick="@DeleteAsync">Delete</FluentButton>
}
<FluentSpacer />

<FluentButton Appearance="Appearance.Accent"
OnClick="@SaveAsync"
Disabled="@(!_note.Validate())">Save</FluentButton>
<FluentButton Appearance="Appearance.Neutral" OnClick="@CancelAsync">Cancel</FluentButton>
</FluentDialogFooter>

@code {
[Parameter]
Expand Down
20 changes: 20 additions & 0 deletions src/NoteBookmark.SharedUI/Components/Shared/NoteDialog.razor.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
::deep .note-dialog-footer {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px 0;
gap: 8px;
}

::deep .note-dialog-footer-left {
display: flex;
align-items: center;
flex: 0 0 auto;
}

::deep .note-dialog-footer-right {
display: flex;
align-items: center;
gap: 8px;
flex: 0 0 auto;
}
Loading