refactor(webui): adopt semantic workspace actions

This commit is contained in:
2026-08-19 18:47:46 +02:00
parent ce334fee7d
commit d005065e50
+31 -37
View File
@@ -10,7 +10,6 @@ import {
Paperclip, Paperclip,
Pencil, Pencil,
Plus, Plus,
RefreshCw,
Reply, Reply,
Search, Search,
Send, Send,
@@ -20,7 +19,6 @@ import {
} from "lucide-react"; } from "lucide-react";
import { FormGrid, import { FormGrid,
ActionBlockerHint, ActionBlockerHint,
ActionToolbar,
Button, Button,
ConfirmDialog, ConfirmDialog,
CountBadge, CountBadge,
@@ -43,6 +41,7 @@ import { FormGrid,
usePlatformLanguage, usePlatformLanguage,
useUnsavedChanges, useUnsavedChanges,
useUnsavedDraftGuard, useUnsavedDraftGuard,
WorkspaceActionBar,
type ApiSettings, type ApiSettings,
type AuthInfo type AuthInfo
} from "@govoplan/core-webui"; } from "@govoplan/core-webui";
@@ -589,29 +588,25 @@ export default function PostboxPage({
<main className="workspace-data-page module-entry-page postbox-page"> <main className="workspace-data-page module-entry-page postbox-page">
<div className="postbox-shell"> <div className="postbox-shell">
<aside className="postbox-directory" data-view-surface="postbox.inbox.directory"> <aside className="postbox-directory" data-view-surface="postbox.inbox.directory">
<ActionToolbar surface="panel-header" className="postbox-bar"> <WorkspaceActionBar
<div className="postbox-bar-title"> scope="collection-pane"
variant="collection"
refreshable
reloadAction={{ onReload: () => void loadDirectory(), loading: loadingDirectory || busy }}
className="postbox-bar"
contextActions={<div className="postbox-bar-title">
<Inbox size={17} aria-hidden="true" /> <Inbox size={17} aria-hidden="true" />
<strong>Postbox</strong> <strong>Postbox</strong>
<DocumentationHelpLink reference={POSTBOX_DOCUMENTATION} /> </div>}
</div> helpAction={<DocumentationHelpLink reference={POSTBOX_DOCUMENTATION} />}
<div className="postbox-icon-actions"> createAction={<IconButton
<IconButton
label="New unified view" label="New unified view"
icon={<Plus size={16} />} icon={<Plus size={16} />}
onClick={openNewGrouping} onClick={openNewGrouping}
disabled={busy} disabled={busy}
disabledReason={postboxBusyReason(false, busy)} disabledReason={postboxBusyReason(false, busy)}
/>}
/> />
<IconButton
label="Refresh"
icon={<RefreshCw size={16} />}
onClick={() => requestDiscard(() => void loadDirectory())}
disabled={loadingDirectory || busy}
disabledReason={postboxBusyReason(loadingDirectory, busy)}
/>
</div>
</ActionToolbar>
<div className="postbox-scope-control"> <div className="postbox-scope-control">
<label htmlFor="postbox-scope">Inbox view</label> <label htmlFor="postbox-scope">Inbox view</label>
@@ -688,8 +683,13 @@ export default function PostboxPage({
</aside> </aside>
<section className="postbox-message-list" data-view-surface="postbox.inbox.messages"> <section className="postbox-message-list" data-view-surface="postbox.inbox.messages">
<ActionToolbar surface="panel-header" className="postbox-bar"> <WorkspaceActionBar
<div className="postbox-bar-title"> scope="collection-pane"
variant="collection"
refreshable
reloadAction={{ onReload: () => void loadMessages(), loading: loadingMessages || busy, label: "Refresh messages" }}
className="postbox-bar"
contextActions={<div className="postbox-bar-title">
{selectedPostbox ? ( {selectedPostbox ? (
<> <>
<Building2 size={17} aria-hidden="true" /> <Building2 size={17} aria-hidden="true" />
@@ -707,24 +707,15 @@ export default function PostboxPage({
</> </>
)} )}
<CountBadge tone="neutral">{total}</CountBadge> <CountBadge tone="neutral">{total}</CountBadge>
</div> </div>}
<div className="postbox-icon-actions"> createAction={<IconButton
<IconButton
label="New message" label="New message"
icon={<Send size={16} />} icon={<Send size={16} />}
onClick={openCompose} onClick={openCompose}
disabled={Boolean(composeDisabledReason)} disabled={Boolean(composeDisabledReason)}
disabledReason={composeDisabledReason} disabledReason={composeDisabledReason}
/>}
/> />
<IconButton
label="Refresh messages"
icon={<RefreshCw size={16} />}
onClick={() => requestDiscard(() => void loadMessages())}
disabled={loadingMessages || busy}
disabledReason={postboxBusyReason(loadingMessages, busy)}
/>
</div>
</ActionToolbar>
<div className="postbox-message-filters"> <div className="postbox-message-filters">
<FilterBar surface="control" wrap="never" className="postbox-search-row"> <FilterBar surface="control" wrap="never" className="postbox-search-row">
<input <input
@@ -852,12 +843,15 @@ export default function PostboxPage({
</section> </section>
<section className="postbox-detail"> <section className="postbox-detail">
<ActionToolbar surface="panel-header" className="postbox-bar"> <WorkspaceActionBar
<div className="postbox-bar-title"> scope="detail-pane"
variant="detail"
className="postbox-bar"
contextActions={<div className="postbox-bar-title">
<MailOpen size={17} aria-hidden="true" /> <MailOpen size={17} aria-hidden="true" />
<strong>{selectedMessage?.subject || "Message"}</strong> <strong>{selectedMessage?.subject || "Message"}</strong>
</div> </div>}
<div className="button-row compact-actions"> primaryActions={<div className="button-row compact-actions">
<Button <Button
onClick={openReply} onClick={openReply}
disabled={Boolean(replyDisabledReason)} disabled={Boolean(replyDisabledReason)}
@@ -872,8 +866,8 @@ export default function PostboxPage({
> >
<CheckCheck size={16} /> Acknowledge <CheckCheck size={16} /> Acknowledge
</Button> </Button>
</div> </div>}
</ActionToolbar> />
{selectedMessage ? ( {selectedMessage ? (
<MessageDetail <MessageDetail
message={selectedMessage} message={selectedMessage}