From b3b0cf0fca5b9564ba52774c7ea79252dd80850e Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Tue, 21 Jul 2026 18:42:31 +0200 Subject: [PATCH] feat(webui): open contextual configured handbooks --- webui/package.json | 2 +- webui/src/layout/HelpMenu.tsx | 21 ++++++++++++++------- webui/src/layout/Titlebar.tsx | 2 +- webui/src/utils/helpContext.ts | 12 ++++++++++-- webui/tests/help-context.test.ts | 18 ++++++++++++++++++ webui/tsconfig.module-tests.json | 2 ++ 6 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 webui/tests/help-context.test.ts diff --git a/webui/package.json b/webui/package.json index 18293c8..322ecff 100644 --- a/webui/package.json +++ b/webui/package.json @@ -26,7 +26,7 @@ "test:dialog-focus": "rm -rf .component-test-build && mkdir -p .component-test-build && printf '{\"type\":\"commonjs\"}\\n' > .component-test-build/package.json && tsc -p tsconfig.component-tests.json && node .component-test-build/tests/dialog-focus.test.js && node scripts/test-dialog-focus-structure.mjs", "test:explorer-tree": "rm -rf .component-test-build && mkdir -p .component-test-build && printf '{\"type\":\"commonjs\"}\\n' > .component-test-build/package.json && tsc -p tsconfig.component-tests.json && node .component-test-build/tests/explorer-tree.test.js", "test:icon-button": "rm -rf .component-test-build && mkdir -p .component-test-build && printf '{\"type\":\"commonjs\"}\\n' > .component-test-build/package.json && tsc -p tsconfig.component-tests.json && node .component-test-build/tests/icon-button.test.js", - "test:module-capabilities": "rm -rf .module-test-build && mkdir -p .module-test-build && printf '{\"type\":\"commonjs\"}\n' > .module-test-build/package.json && tsc -p tsconfig.module-tests.json && node .module-test-build/tests/module-capabilities.test.js && node .module-test-build/tests/privacy-policy.test.js", + "test:module-capabilities": "rm -rf .module-test-build && mkdir -p .module-test-build && printf '{\"type\":\"commonjs\"}\n' > .module-test-build/package.json && tsc -p tsconfig.module-tests.json && node .module-test-build/tests/module-capabilities.test.js && node .module-test-build/tests/privacy-policy.test.js && node .module-test-build/tests/help-context.test.js", "test:module-permutations": "node scripts/test-module-permutations.mjs", "test:mail-components": "rm -rf .component-test-build && mkdir -p .component-test-build && printf '{\"type\":\"commonjs\"}\\n' > .component-test-build/package.json && tsc -p tsconfig.component-tests.json && node .component-test-build/tests/mail-components.test.js", "test:resource-access": "rm -rf .component-test-build && mkdir -p .component-test-build && printf '{\"type\":\"commonjs\"}\\n' > .component-test-build/package.json && tsc -p tsconfig.component-tests.json && node .component-test-build/tests/resource-access-explanation.test.js", diff --git a/webui/src/layout/HelpMenu.tsx b/webui/src/layout/HelpMenu.tsx index d370af9..e27731e 100644 --- a/webui/src/layout/HelpMenu.tsx +++ b/webui/src/layout/HelpMenu.tsx @@ -9,20 +9,23 @@ import { usePlatformModules } from "../platform/ModuleContext"; import type { PlatformWebModule } from "../types"; import { helpContextForPathname, helpQueryForContext, type HelpContext } from "../utils/helpContext"; import { usePlatformLanguage } from "../i18n/LanguageContext"; +import type { AuthInfo } from "../types"; +import { hasAnyScope } from "../utils/permissions"; const EXTERNAL_DOCS_BASE_URL = "https://govoplan.add-ideas.de"; -export default function HelpMenu() { +export default function HelpMenu({ auth }: { auth: AuthInfo | null }) { const [open, setOpen] = useState(false); const [aboutOpen, setAboutOpen] = useState(false); const [contextOpen, setContextOpen] = useState(false); const wrapRef = useRef(null); const location = useLocation(); const navigate = useGuardedNavigate(); - const helpContext = helpContextForPathname(location.pathname); + const helpContext = helpContextForPathname(location.pathname, location.search); const modules = usePlatformModules(); const { translateText } = usePlatformLanguage(); const docsAvailable = modules.some((module) => module.id === "docs" && module.routes?.some((route) => route.path === "/docs")); + const adminDocsAvailable = hasAnyScope(auth, ["docs:documentation:admin", "system:settings:read", "admin:settings:read"]); useEffect(() => { function openContextHelp(event: KeyboardEvent) { @@ -53,6 +56,7 @@ export default function HelpMenu() { function openDocs(type: "user" | "admin") { setOpen(false); + setContextOpen(false); if (!docsAvailable) { window.open(externalDocsUrl(type, helpContext), "_blank", "noopener,noreferrer"); return; @@ -87,15 +91,17 @@ export default function HelpMenu() { - + {adminDocsAvailable && + + }
i18n:govoplan-core.gitlab.9a9b09d9 } - {contextOpen && setContextOpen(false)} />} + {contextOpen && openDocs("user")} onClose={() => setContextOpen(false)} />} {aboutOpen && setAboutOpen(false)} />} ); @@ -106,7 +112,7 @@ function externalDocsUrl(type: "user" | "admin", context: HelpContext): string { return `${EXTERNAL_DOCS_BASE_URL}/?${params.toString()}`; } -function ContextHelpModal({ context, onClose }: {context: HelpContext;onClose: () => void;}) { +function ContextHelpModal({ context, onOpenDocs, onClose }: {context: HelpContext;onOpenDocs: () => void;onClose: () => void;}) { const { translateText } = usePlatformLanguage(); return (

{translateText("i18n:govoplan-core.next_actions.7b09055a")}

{translateText("i18n:govoplan-core.the_first_guided_help_content_can_cover_campaign.14a6bd8a")}

+
); diff --git a/webui/src/layout/Titlebar.tsx b/webui/src/layout/Titlebar.tsx index 7b50a54..7fac9d9 100644 --- a/webui/src/layout/Titlebar.tsx +++ b/webui/src/layout/Titlebar.tsx @@ -219,7 +219,7 @@ export default function Titlebar({ settings, auth, onAuthChange, maintenanceMode
- + {auth && notificationsAvailable &&