Release govoplan-reporting v0.1.21: preserve calculated measure bindings

This commit is contained in:
2026-09-08 01:32:52 +02:00
parent d7e7890291
commit f2e42cecfe
8 changed files with 125 additions and 17 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@govoplan/reporting-webui",
"version": "0.1.20",
"version": "0.1.21",
"private": true,
"type": "module",
"main": "src/index.ts",
@@ -17,7 +17,7 @@
"test:interface-pattern": "node scripts/test-interface-pattern.mjs"
},
"peerDependencies": {
"@govoplan/core-webui": "^0.1.18",
"@govoplan/core-webui": "^0.1.45",
"lucide-react": "^1.23.0",
"react": ">=19.2.7 <20",
"react-dom": ">=19.2.7 <20",
+2
View File
@@ -10,6 +10,8 @@ assert.ok(page.includes("PageScrollViewport"), "Reporting owns bounded catalogue
assert.ok(page.includes("DataGrid"), "Tabular report results use the shared grid");
assert.ok(page.includes("<Dialog"), "Save and schedule operations use shared dialogs");
assert.ok(page.includes("createDrillContext"), "Aggregate detail uses an actor-bound drill context");
assert.match(page, /id: "drill",\s*header: "Detail",\s*columnType: "actions",\s*sticky: "end"/, "Result drill-down controls use the shared pinned action-column contract");
assert.match(page, /<TableActionGroup actions=\{\[\{\s*id: "drill"/, "Drill-down renders the shared measurable action surface");
assert.ok(page.includes("AccessExplanation"), "Policy-hidden fields, rows, and actions are explained");
assert.ok(page.includes("PublishDialog"), "Publication targets use the shared dialog surface");
assert.ok(provider.includes("disabledReason={runDisabledReason}"), "Governed report blockers remain keyboard-explainable");
+12 -7
View File
@@ -34,6 +34,7 @@ import { FormGrid,
SelectionListItem,
SelectionListItemContent,
StatusBadge,
TableActionGroup,
ToggleSwitch,
hasScope,
WorkspaceActionBar,
@@ -543,7 +544,7 @@ function ReportTable({ execution, onDrill }: { execution: ReportExecution; onDri
const [page, setPage] = useState(0);
useEffect(() => setPage(0), [execution.execution_id]);
const columns = useMemo<DataGridColumn<Record<string, unknown>>[]>(() => {
const result = execution.schema.map((field) => ({
const result: DataGridColumn<Record<string, unknown>>[] = execution.schema.map((field) => ({
id: field.name,
header: humanize(field.name),
width: "1fr",
@@ -559,16 +560,20 @@ function ReportTable({ execution, onDrill }: { execution: ReportExecution; onDri
result.push({
id: "drill",
header: "Detail",
columnType: "actions",
sticky: "end",
resizable: false,
align: "right",
width: 74,
minWidth: 74,
maxWidth: 74,
render: (row) => (
<IconButton
label="Show authorized contributing rows"
icon={<ChevronRight size={16} />}
variant="ghost"
onClick={() => onDrill(row)}
/>
<TableActionGroup actions={[{
id: "drill",
label: "Show authorized contributing rows",
icon: <ChevronRight size={16} aria-hidden="true" />,
onClick: () => onDrill(row)
}]} />
)
});
}