Release govoplan-idm v0.1.25: unify interface contracts and documentation
Module Package Release / publish-packages (push) Successful in 11s

This commit is contained in:
2026-09-08 01:32:43 +02:00
parent 5c7586f6d9
commit 46e09d0c68
9 changed files with 32 additions and 14 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@govoplan/idm-webui",
"version": "0.1.24",
"version": "0.1.25",
"private": true,
"type": "module",
"main": "src/index.ts",
@@ -17,7 +17,7 @@
"./styles/idm.css": "./src/styles/idm.css"
},
"peerDependencies": {
"@govoplan/core-webui": "^0.1.18",
"@govoplan/core-webui": "^0.1.45",
"@vitejs/plugin-react": "^5.2.0",
"lucide-react": "^1.23.0",
"react": ">=19.2.7 <20",
@@ -38,5 +38,7 @@ assert(api.includes("/api/v1/idm/typed-groups") && api.includes("/api/v1/idm/rel
assert(moduleSource.includes('"idm:relationship:read"') && moduleSource.includes('"idm:relationship:write"'), "Relationship-only administrators can enter the IDM product surface");
assert(translations.includes('"Typed groups and identity relationships": "Typisierte Gruppen und Identitätsbeziehungen"') && translations.includes('"Revoked": "Widerrufen"'), "The relationship administration vocabulary has German reference translations");
assert(!relationships.includes("window.confirm"), "Relationship administration does not use browser-native consequential confirmation");
assert(relationships.includes('<ContentGrid columns={1}>') && (relationships.match(/bodyLayout="table"/g) ?? []).length === 2, "Typed groups and effective relationships use spaced full-width table cards");
assert(!relationships.includes('className="idm-muted idm-card-note"') && changes.includes('bodyLayout="table"') && page.includes('bodyLayout="table"'), "All IDM collection tables share the table-card treatment without a repeated tagline");
console.log("IDM surfaces satisfy the recorded interface pattern-language contract.");
@@ -347,6 +347,7 @@ export default function FunctionAssignmentChangesPanel({ settings, auth, model,
<>
{error && <DismissibleAlert tone="danger" resetKey={error}>{error}</DismissibleAlert>}
<Card
bodyLayout="table"
title="Function requests and grants"
collapsible
collapseKey="idm.function-assignment-changes"
+1 -1
View File
@@ -835,7 +835,7 @@ export default function IdmPage({ settings, auth }: IdmPageProps) {
<TypedRelationshipsPanel settings={settings} auth={auth} />
{canReadAssignments && <Card title="i18n:govoplan-idm.assignments.a0d19ec5" collapsible collapseKey="idm.assignments" actions={<AdminIconButton label="i18n:govoplan-idm.add_assignment.08f2a0d5" icon={<Plus size={16} aria-hidden="true" />} variant="primary" disabled={!canManage || busy || !model.functions.length} disabledReason={idmDisabledReason(false, busy, canManage) ?? (!model.functions.length ? IDM_INTERFACE_I18N.noFunctions : undefined)} onClick={openCreateAssignment} />}>
{canReadAssignments && <Card bodyLayout="table" title="i18n:govoplan-idm.assignments.a0d19ec5" collapsible collapseKey="idm.assignments" actions={<AdminIconButton label="i18n:govoplan-idm.add_assignment.08f2a0d5" icon={<Plus size={16} aria-hidden="true" />} variant="primary" disabled={!canManage || busy || !model.functions.length} disabledReason={idmDisabledReason(false, busy, canManage) ?? (!model.functions.length ? IDM_INTERFACE_I18N.noFunctions : undefined)} onClick={openCreateAssignment} />}>
<DataGrid
id="idm-organization-function-assignments"
rows={assignments}
@@ -1,4 +1,4 @@
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { useCallback, useEffect, useMemo, useRef, useState, type JSX } from "react";
import { Eye, Pencil, Plus, RefreshCw, Trash2 } from "lucide-react";
import {
ActionBlockerHint,
@@ -7,6 +7,7 @@ import {
ApiError,
Button,
Card,
ContentGrid,
DataGrid,
DateTimeField,
Dialog,
@@ -385,7 +386,9 @@ export default function TypedRelationshipsPanel({ settings, auth }: Props) {
)}
<LoadingFrame loading={loading} label="Loading typed groups and relationships">
<ContentGrid columns={1}>
<Card
bodyLayout="table"
title="Typed groups"
collapsible
collapseKey="idm.typed-groups"
@@ -419,6 +422,7 @@ export default function TypedRelationshipsPanel({ settings, auth }: Props) {
</Card>
<Card
bodyLayout="table"
title="Effective identity relationships"
collapsible
collapseKey="idm.identity-relationships"
@@ -449,8 +453,8 @@ export default function TypedRelationshipsPanel({ settings, auth }: Props) {
)}
>
<DataGrid id="idm-identity-relationships" rows={relationships} columns={relationshipColumns} getRowKey={(row) => row.id} emptyText="No identity relationships found." initialFit="container" />
<p className="idm-muted idm-card-note">Business membership is an institutional fact. It does not grant application permissions; Access evaluates authority separately.</p>
</Card>
</ContentGrid>
</LoadingFrame>
{renderGroupEditor()}
-4
View File
@@ -24,10 +24,6 @@
width: 100%;
}
.idm-card-note {
margin-top: 12px;
}
.idm-check-list {
display: grid;
gap: 10px;