refactor(centralui): migrate Move/Rename/Compose dialogs to DialogService.ShowAsync host (T33b)
This commit is contained in:
@@ -17,33 +17,6 @@
|
||||
<div class="container-fluid mt-3">
|
||||
<ToastNotification @ref="_toast" />
|
||||
|
||||
<RenameFolderDialog @bind-IsVisible="_showRenameFolderDialog"
|
||||
FolderId="_renameFolderId"
|
||||
InitialName="@_renameFolderInitialName"
|
||||
ErrorMessage="@_renameFolderError"
|
||||
OnSubmit="SubmitRenameFolder" />
|
||||
|
||||
<MoveTemplateDialog @bind-IsVisible="_showMoveTemplateDialog"
|
||||
TemplateId="_moveTemplateId"
|
||||
TemplateName="@_moveTemplateName"
|
||||
FolderOptions="EnumerateFolderOptions()"
|
||||
ErrorMessage="@_moveTemplateError"
|
||||
OnSubmit="SubmitMoveTemplate" />
|
||||
|
||||
<MoveFolderDialog @bind-IsVisible="_showMoveFolderDialog"
|
||||
FolderId="_moveFolderId"
|
||||
FolderName="@_moveFolderName"
|
||||
FolderOptions="EnumerateFolderOptionsExcluding(_moveFolderId)"
|
||||
ErrorMessage="@_moveFolderError"
|
||||
OnSubmit="SubmitMoveFolder" />
|
||||
|
||||
<ComposeIntoDialog @bind-IsVisible="_showComposeDialog"
|
||||
SourceTemplateId="_composeSourceId"
|
||||
SourceName="@_composeSourceName"
|
||||
ParentOptions="EnumerateComposableParents(_composeSourceId)"
|
||||
ErrorMessage="@_composeError"
|
||||
OnSubmit="SubmitCompose" />
|
||||
|
||||
@if (_loading)
|
||||
{
|
||||
<LoadingSpinner IsLoading="true" />
|
||||
@@ -314,34 +287,26 @@
|
||||
}
|
||||
}
|
||||
|
||||
// Move-template dialog state
|
||||
private bool _showMoveTemplateDialog;
|
||||
private int _moveTemplateId;
|
||||
private string _moveTemplateName = string.Empty;
|
||||
private string? _moveTemplateError;
|
||||
|
||||
private void OpenMoveTemplateDialog(int templateId, string label)
|
||||
// Move-template dialog: opened via IDialogService.ShowAsync. The body returns
|
||||
// the picked folder id (null = Root) on Move, or null on Cancel; validation runs
|
||||
// here after the dialog closes and surfaces server guard failures via a toast.
|
||||
private async Task OpenMoveTemplateDialog(int templateId, string label)
|
||||
{
|
||||
_moveTemplateId = templateId;
|
||||
_moveTemplateName = label;
|
||||
_moveTemplateError = null;
|
||||
_showMoveTemplateDialog = true;
|
||||
}
|
||||
var result = await Dialog.ShowAsync<MoveTemplateDialog.MoveTemplateResult>(
|
||||
$"Move '{label}' to…",
|
||||
ctx => @<MoveTemplateDialog Context="ctx" FolderOptions="EnumerateFolderOptions()" />);
|
||||
if (result is null) return;
|
||||
|
||||
private async Task SubmitMoveTemplate((int TemplateId, int? NewFolderId) req)
|
||||
{
|
||||
_moveTemplateError = null;
|
||||
var user = await GetCurrentUserAsync();
|
||||
var result = await TemplateService.MoveTemplateAsync(req.TemplateId, req.NewFolderId, user);
|
||||
if (result.IsSuccess)
|
||||
var moved = await TemplateService.MoveTemplateAsync(templateId, result.NewFolderId, user);
|
||||
if (moved.IsSuccess)
|
||||
{
|
||||
_showMoveTemplateDialog = false;
|
||||
_toast.ShowSuccess($"Template '{_moveTemplateName}' moved.");
|
||||
_toast.ShowSuccess($"Template '{label}' moved.");
|
||||
await LoadTemplatesAsync();
|
||||
}
|
||||
else
|
||||
{
|
||||
_moveTemplateError = result.Error;
|
||||
_toast.ShowError(moved.Error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -373,34 +338,27 @@
|
||||
}
|
||||
}
|
||||
|
||||
// Move-folder dialog state
|
||||
private bool _showMoveFolderDialog;
|
||||
private int _moveFolderId;
|
||||
private string _moveFolderName = string.Empty;
|
||||
private string? _moveFolderError;
|
||||
|
||||
private void OpenMoveFolderDialog(int folderId, string label)
|
||||
// Move-folder dialog: opened via IDialogService.ShowAsync. The picker prunes the
|
||||
// folder + its descendants (server still validates cycles). The body returns the
|
||||
// picked parent id (null = Root) on Move, or null on Cancel; server guard failures
|
||||
// surface via a toast.
|
||||
private async Task OpenMoveFolderDialog(int folderId, string label)
|
||||
{
|
||||
_moveFolderId = folderId;
|
||||
_moveFolderName = label;
|
||||
_moveFolderError = null;
|
||||
_showMoveFolderDialog = true;
|
||||
}
|
||||
var result = await Dialog.ShowAsync<MoveFolderDialog.MoveFolderResult>(
|
||||
$"Move '{label}' to…",
|
||||
ctx => @<MoveFolderDialog Context="ctx" FolderOptions="EnumerateFolderOptionsExcluding(folderId)" />);
|
||||
if (result is null) return;
|
||||
|
||||
private async Task SubmitMoveFolder((int FolderId, int? NewParentId) req)
|
||||
{
|
||||
_moveFolderError = null;
|
||||
var user = await GetCurrentUserAsync();
|
||||
var result = await TemplateFolderService.MoveFolderAsync(req.FolderId, req.NewParentId, user);
|
||||
if (result.IsSuccess)
|
||||
var moved = await TemplateFolderService.MoveFolderAsync(folderId, result.NewParentId, user);
|
||||
if (moved.IsSuccess)
|
||||
{
|
||||
_showMoveFolderDialog = false;
|
||||
_toast.ShowSuccess($"Folder '{_moveFolderName}' moved.");
|
||||
_toast.ShowSuccess($"Folder '{label}' moved.");
|
||||
await LoadTemplatesAsync();
|
||||
}
|
||||
else
|
||||
{
|
||||
_moveFolderError = result.Error;
|
||||
_toast.ShowError(moved.Error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -467,34 +425,27 @@
|
||||
|
||||
private void DismissRootContextMenu() => _showRootMenu = false;
|
||||
|
||||
// Rename folder dialog state
|
||||
private bool _showRenameFolderDialog;
|
||||
private int _renameFolderId;
|
||||
private string _renameFolderInitialName = string.Empty;
|
||||
private string? _renameFolderError;
|
||||
|
||||
private void OpenRenameFolderDialog(int folderId, string currentName)
|
||||
// Rename folder dialog: opened via IDialogService.ShowAsync. The body seeds the
|
||||
// input from the current name and returns the trimmed new name on Save, or null on
|
||||
// Cancel; server guard failures surface via a toast.
|
||||
private async Task OpenRenameFolderDialog(int folderId, string currentName)
|
||||
{
|
||||
_renameFolderId = folderId;
|
||||
_renameFolderInitialName = currentName;
|
||||
_renameFolderError = null;
|
||||
_showRenameFolderDialog = true;
|
||||
}
|
||||
var newName = await Dialog.ShowAsync<string>(
|
||||
"Rename Folder",
|
||||
ctx => @<RenameFolderDialog Context="ctx" InitialName="@currentName" />,
|
||||
size: "modal-sm");
|
||||
if (string.IsNullOrWhiteSpace(newName)) return;
|
||||
|
||||
private async Task SubmitRenameFolder((int FolderId, string NewName) req)
|
||||
{
|
||||
_renameFolderError = null;
|
||||
var user = await GetCurrentUserAsync();
|
||||
var result = await TemplateFolderService.RenameFolderAsync(req.FolderId, req.NewName, user);
|
||||
var result = await TemplateFolderService.RenameFolderAsync(folderId, newName, user);
|
||||
if (result.IsSuccess)
|
||||
{
|
||||
_showRenameFolderDialog = false;
|
||||
_toast.ShowSuccess("Folder renamed.");
|
||||
await LoadTemplatesAsync();
|
||||
}
|
||||
else
|
||||
{
|
||||
_renameFolderError = result.Error;
|
||||
_toast.ShowError(result.Error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -545,17 +496,31 @@
|
||||
}
|
||||
|
||||
// ---- Compose-into dialog ----
|
||||
private bool _showComposeDialog;
|
||||
private int _composeSourceId;
|
||||
private string _composeSourceName = string.Empty;
|
||||
private string? _composeError;
|
||||
|
||||
private void OpenComposeDialog(Template source)
|
||||
// Opened via IDialogService.ShowAsync. The body returns the chosen parent template
|
||||
// + slot name on Compose (its own client-side guard keeps the button disabled until
|
||||
// both are set), or null on Cancel; server guard failures surface via a toast.
|
||||
private async Task OpenComposeDialog(Template source)
|
||||
{
|
||||
_composeSourceId = source.Id;
|
||||
_composeSourceName = source.Name;
|
||||
_composeError = null;
|
||||
_showComposeDialog = true;
|
||||
var sourceId = source.Id;
|
||||
var sourceName = source.Name;
|
||||
var result = await Dialog.ShowAsync<ComposeIntoDialog.ComposeResult>(
|
||||
$"Compose '{sourceName}' into…",
|
||||
ctx => @<ComposeIntoDialog Context="ctx"
|
||||
SourceName="@sourceName"
|
||||
ParentOptions="EnumerateComposableParents(sourceId)" />);
|
||||
if (result is null) return;
|
||||
|
||||
var user = await GetCurrentUserAsync();
|
||||
var composed = await TemplateService.AddCompositionAsync(result.ParentTemplateId, sourceId, result.SlotName, user);
|
||||
if (composed.IsSuccess)
|
||||
{
|
||||
_toast.ShowSuccess($"Composed '{sourceName}' as '{result.SlotName}'.");
|
||||
await LoadTemplatesAsync();
|
||||
}
|
||||
else
|
||||
{
|
||||
_toast.ShowError(composed.Error);
|
||||
}
|
||||
}
|
||||
|
||||
// Possible parents for a compose: every non-derived template except the source itself.
|
||||
@@ -568,23 +533,6 @@
|
||||
.Select(t => (t.Id, t.Name));
|
||||
}
|
||||
|
||||
private async Task SubmitCompose((int SourceTemplateId, int ParentTemplateId, string SlotName) req)
|
||||
{
|
||||
_composeError = null;
|
||||
var user = await GetCurrentUserAsync();
|
||||
var result = await TemplateService.AddCompositionAsync(req.ParentTemplateId, req.SourceTemplateId, req.SlotName, user);
|
||||
if (result.IsSuccess)
|
||||
{
|
||||
_showComposeDialog = false;
|
||||
_toast.ShowSuccess($"Composed '{_composeSourceName}' as '{req.SlotName}'.");
|
||||
await LoadTemplatesAsync();
|
||||
}
|
||||
else
|
||||
{
|
||||
_composeError = result.Error;
|
||||
}
|
||||
}
|
||||
|
||||
// ---- Composition leaf: rename + delete ----
|
||||
private async Task RenameComposition(TemplateComposition composition)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user