Release govoplan-dist-lists v0.1.21: unify interface contracts and documentation
This commit is contained in:
+2
-2
@@ -4,13 +4,13 @@ build-backend = "setuptools.build_meta"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "govoplan-dist-lists"
|
name = "govoplan-dist-lists"
|
||||||
version = "0.1.20"
|
version = "0.1.21"
|
||||||
description = "GovOPlaN operational distribution lists and governed audience expansion."
|
description = "GovOPlaN operational distribution lists and governed audience expansion."
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.12"
|
requires-python = ">=3.12"
|
||||||
authors = [{ name = "GovOPlaN" }]
|
authors = [{ name = "GovOPlaN" }]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"govoplan-core>=0.1.18",
|
"govoplan-core>=0.1.45",
|
||||||
]
|
]
|
||||||
|
|
||||||
[tool.setuptools.packages.find]
|
[tool.setuptools.packages.find]
|
||||||
|
|||||||
@@ -2,4 +2,4 @@
|
|||||||
|
|
||||||
__all__ = ["__version__"]
|
__all__ = ["__version__"]
|
||||||
|
|
||||||
__version__ = "0.1.20"
|
__version__ = "0.1.21"
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ from govoplan_dist_lists.backend.dsar_provider import (
|
|||||||
|
|
||||||
MODULE_ID = "dist_lists"
|
MODULE_ID = "dist_lists"
|
||||||
MODULE_NAME = "Distribution Lists"
|
MODULE_NAME = "Distribution Lists"
|
||||||
MODULE_VERSION = "0.1.20"
|
MODULE_VERSION = "0.1.21"
|
||||||
|
|
||||||
READ_SCOPE = "dist_lists:list:read"
|
READ_SCOPE = "dist_lists:list:read"
|
||||||
WRITE_SCOPE = "dist_lists:list:write"
|
WRITE_SCOPE = "dist_lists:list:write"
|
||||||
@@ -106,6 +106,21 @@ ROLE_TEMPLATES = (
|
|||||||
)
|
)
|
||||||
|
|
||||||
DOCUMENTATION = (
|
DOCUMENTATION = (
|
||||||
|
DocumentationTopic(
|
||||||
|
id="dist_lists.workspace-layout",
|
||||||
|
title="Distribution Lists workspace actions",
|
||||||
|
summary="Find collection-wide commands in their consistent workspace position.",
|
||||||
|
body="Reload and New distribution list use the persistent full-width workspace header at the upper right; Reload sits immediately before creation. Selecting a record, changing filters, or opening an editor does not move these collection-wide commands into the left pane. Member editing and saving stay with the selected list; membership, provenance, and delivery semantics are unchanged. Existing permissions, disabled-state rules, and unsaved-change guards still apply. Administrators configure authority through the existing permission system; no new permission or automatic operation is introduced.",
|
||||||
|
layer="static",
|
||||||
|
documentation_types=("user", "admin"),
|
||||||
|
audience=("user", "module_admin", "operator"),
|
||||||
|
order=5,
|
||||||
|
translations={"de": {
|
||||||
|
"title": "Verteilerlisten: Aktionen im Arbeitsbereich",
|
||||||
|
"summary": "Sammlungsweite Aktionen an ihrer einheitlichen Position im Arbeitsbereich finden.",
|
||||||
|
"body": "Neu laden und Neue Verteilerliste stehen oben rechts in der dauerhaft sichtbaren, arbeitsbereichsweiten Leiste; Neu laden steht unmittelbar vor dem Anlegen. Auswahl, Filterwechsel und Bearbeitung verschieben diese sammlungsweiten Aktionen nicht in den linken Bereich. Bearbeiten der Mitglieder und Speichern bleiben bei der ausgewählten Liste; Mitgliedschaft, Herkunftsnachweise und Zustellungssemantik ändern sich nicht. Bestehende Berechtigungen, Deaktivierungsregeln und der Schutz ungespeicherter Änderungen gelten weiterhin. Administratoren konfigurieren Rechte im bestehenden Berechtigungssystem; es entstehen weder neue Rechte noch automatische Vorgänge.",
|
||||||
|
}},
|
||||||
|
),
|
||||||
DocumentationTopic(
|
DocumentationTopic(
|
||||||
id=f"{MODULE_ID}.data-subject-requests",
|
id=f"{MODULE_ID}.data-subject-requests",
|
||||||
title="Distribution-list data-subject requests",
|
title="Distribution-list data-subject requests",
|
||||||
@@ -176,7 +191,8 @@ DOCUMENTATION = (
|
|||||||
body=(
|
body=(
|
||||||
"Distribution Lists owns reusable mixed recipient definitions and expansion snapshots. "
|
"Distribution Lists owns reusable mixed recipient definitions and expansion snapshots. "
|
||||||
"Address lists remain in the addresses module and represent address-domain groupings only. "
|
"Address lists remain in the addresses module and represent address-domain groupings only. "
|
||||||
"Workflow and Tasks own Umlauf execution state, ordering, deadlines, escalation, and completion."
|
"Workflow and Tasks own Umlauf execution state, ordering, deadlines, escalation, and completion. "
|
||||||
|
"Entry editing and result-explanation controls use the shared action-column layout and stay reachable at the right edge when wide tables are scrolled."
|
||||||
),
|
),
|
||||||
layer="available",
|
layer="available",
|
||||||
documentation_types=("admin", "user"),
|
documentation_types=("admin", "user"),
|
||||||
@@ -212,7 +228,8 @@ DOCUMENTATION = (
|
|||||||
"body": (
|
"body": (
|
||||||
"Distribution Lists führt wiederverwendbare gemischte Empfängerdefinitionen und Erweiterungsschnappschüsse. "
|
"Distribution Lists führt wiederverwendbare gemischte Empfängerdefinitionen und Erweiterungsschnappschüsse. "
|
||||||
"Adresslisten verbleiben im Modul Addresses und bilden ausschließlich Gruppierungen des Adressbereichs ab. "
|
"Adresslisten verbleiben im Modul Addresses und bilden ausschließlich Gruppierungen des Adressbereichs ab. "
|
||||||
"Workflow und Tasks führen Ausführungszustand, Reihenfolge, Fristen, Eskalation und Abschluss von Umläufen."
|
"Workflow und Tasks führen Ausführungszustand, Reihenfolge, Fristen, Eskalation und Abschluss von Umläufen. "
|
||||||
|
"Die Steuerelemente zum Bearbeiten von Einträgen und Erläutern von Ergebnissen verwenden das gemeinsame Aktionsspaltenlayout und bleiben beim Scrollen breiter Tabellen am rechten Rand erreichbar."
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
+3
-2
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@govoplan/dist-lists-webui",
|
"name": "@govoplan/dist-lists-webui",
|
||||||
"version": "0.1.20",
|
"version": "0.1.21",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
@@ -14,10 +14,11 @@
|
|||||||
"./styles/dist-lists.css": "./src/styles/dist-lists.css"
|
"./styles/dist-lists.css": "./src/styles/dist-lists.css"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
"test:action-layout": "node scripts/test-action-layout.mjs",
|
||||||
"typecheck": "tsc --noEmit"
|
"typecheck": "tsc --noEmit"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@govoplan/core-webui": "^0.1.18",
|
"@govoplan/core-webui": "^0.1.45",
|
||||||
"lucide-react": "^1.23.0",
|
"lucide-react": "^1.23.0",
|
||||||
"react": ">=19.2.7 <20",
|
"react": ">=19.2.7 <20",
|
||||||
"react-dom": ">=19.2.7 <20",
|
"react-dom": ">=19.2.7 <20",
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import assert from "node:assert/strict";
|
||||||
|
import { readFileSync } from "node:fs";
|
||||||
|
|
||||||
|
const page = readFileSync(new URL("../src/features/distributionLists/DistributionListsPage.tsx", import.meta.url), "utf8");
|
||||||
|
assert.match(page, /id: "actions",\s*header: "Actions",\s*columnType: "actions",\s*width: 205,\s*sticky: "end"/);
|
||||||
|
assert.match(page, /id: "actions",\s*header: "Details",\s*columnType: "actions",\s*width: 90,\s*sticky: "end"/);
|
||||||
|
assert.match(page, /<TableActionGroup actions=\{\[\{\s*id: "explain"/);
|
||||||
|
assert.match(page, /<DataGridRowActions/);
|
||||||
|
console.log("Distribution List controls use the shared action-column contract.");
|
||||||
@@ -37,6 +37,7 @@ import { DialogSection, FormGrid, ActionToolbar,
|
|||||||
SelectionListItemContent,
|
SelectionListItemContent,
|
||||||
StatePanel,
|
StatePanel,
|
||||||
StatusBadge,
|
StatusBadge,
|
||||||
|
TableActionGroup,
|
||||||
ToggleSwitch,
|
ToggleSwitch,
|
||||||
WorkspaceActionBar,
|
WorkspaceActionBar,
|
||||||
WorkspaceFrame,
|
WorkspaceFrame,
|
||||||
@@ -412,6 +413,7 @@ export default function DistributionListsPage({ settings, auth }: Props) {
|
|||||||
{
|
{
|
||||||
id: "actions",
|
id: "actions",
|
||||||
header: "Actions",
|
header: "Actions",
|
||||||
|
columnType: "actions",
|
||||||
width: 205,
|
width: 205,
|
||||||
sticky: "end",
|
sticky: "end",
|
||||||
render: (entry, index) => (
|
render: (entry, index) => (
|
||||||
@@ -487,15 +489,16 @@ export default function DistributionListsPage({ settings, auth }: Props) {
|
|||||||
{
|
{
|
||||||
id: "actions",
|
id: "actions",
|
||||||
header: "Details",
|
header: "Details",
|
||||||
|
columnType: "actions",
|
||||||
width: 90,
|
width: 90,
|
||||||
sticky: "end",
|
sticky: "end",
|
||||||
render: (row) => (
|
render: (row) => (
|
||||||
<IconButton
|
<TableActionGroup actions={[{
|
||||||
label="Explain this result"
|
id: "explain",
|
||||||
icon={<Eye size={16} />}
|
label: "Explain this result",
|
||||||
variant="ghost"
|
icon: <Eye size={16} aria-hidden="true" />,
|
||||||
onClick={() => setExplanationTarget(row)}
|
onClick: () => setExplanationTarget(row)
|
||||||
/>
|
}]} />
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
], []);
|
], []);
|
||||||
@@ -540,6 +543,21 @@ export default function DistributionListsPage({ settings, auth }: Props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<WorkspaceFrame as="main" height="viewport" surface="plain" className="dist-lists-page" label="Distribution lists workspace">
|
<WorkspaceFrame as="main" height="viewport" surface="plain" className="dist-lists-page" label="Distribution lists workspace">
|
||||||
|
<WorkspaceActionBar
|
||||||
|
scope="workspace"
|
||||||
|
variant="collection"
|
||||||
|
refreshable
|
||||||
|
reloadAction={{ onReload: () => void reload(selectedId), loading: loading || busy }}
|
||||||
|
contextActions={<strong>Distribution Lists</strong>}
|
||||||
|
createAction={<IconButton
|
||||||
|
label="New distribution list"
|
||||||
|
icon={<Plus size={17} />}
|
||||||
|
variant="primary"
|
||||||
|
disabled={!canWrite}
|
||||||
|
disabledReason={!canWrite ? DIST_LISTS_I18N.writeReason : undefined}
|
||||||
|
onClick={() => requestDiscard(() => setCreateOpen(true))}
|
||||||
|
/>}
|
||||||
|
/>
|
||||||
<WorkspaceLayout
|
<WorkspaceLayout
|
||||||
variant="split"
|
variant="split"
|
||||||
primarySize="compact"
|
primarySize="compact"
|
||||||
@@ -550,21 +568,6 @@ export default function DistributionListsPage({ settings, auth }: Props) {
|
|||||||
contentLabel="Distribution list workspace"
|
contentLabel="Distribution list workspace"
|
||||||
contentClassName="dist-lists-workspace"
|
contentClassName="dist-lists-workspace"
|
||||||
primary={<>
|
primary={<>
|
||||||
<WorkspaceActionBar
|
|
||||||
scope="collection-pane"
|
|
||||||
variant="collection"
|
|
||||||
refreshable
|
|
||||||
reloadAction={{ onReload: () => void reload(selectedId), loading: loading || busy }}
|
|
||||||
contextActions={<strong>Distribution Lists</strong>}
|
|
||||||
createAction={<IconButton
|
|
||||||
label="New distribution list"
|
|
||||||
icon={<Plus size={17} />}
|
|
||||||
variant="primary"
|
|
||||||
disabled={!canWrite}
|
|
||||||
disabledReason={!canWrite ? DIST_LISTS_I18N.writeReason : undefined}
|
|
||||||
onClick={() => requestDiscard(() => setCreateOpen(true))}
|
|
||||||
/>}
|
|
||||||
/>
|
|
||||||
<FilterBar surface="panel">
|
<FilterBar surface="panel">
|
||||||
<input
|
<input
|
||||||
type="search"
|
type="search"
|
||||||
|
|||||||
Reference in New Issue
Block a user