From 2b4dd482f3e6ce7ee594881d29583e678bb7fb18 Mon Sep 17 00:00:00 2001 From: s4luorth Date: Thu, 1 Oct 2026 08:58:10 +0200 Subject: [PATCH] =?UTF-8?q?Staff-Rolle:=20Modulleiste=20auf=20Produktion?= =?UTF-8?q?=20+=20Neuer=20Auftrag=20beschr=C3=A4nken?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Directus 11 kennt keine rollenbasierte Modulleiste -> neue Hook-Extension skrift-access filtert settings.read fuer Nicht-Admins auf die beiden Module skrift-produktion und skrift-neuauftrag. Admins unveraendert. Co-Authored-By: Claude Opus 4.8 --- .../dist/index.js | 35 +++++++++++++++++++ .../package.json | 13 +++++++ 2 files changed, 48 insertions(+) create mode 100644 extensions/directus-extension-skrift-access/dist/index.js create mode 100644 extensions/directus-extension-skrift-access/package.json diff --git a/extensions/directus-extension-skrift-access/dist/index.js b/extensions/directus-extension-skrift-access/dist/index.js new file mode 100644 index 0000000..700580a --- /dev/null +++ b/extensions/directus-extension-skrift-access/dist/index.js @@ -0,0 +1,35 @@ +/** + * Skrift – Zugriffsbeschränkung Modulleiste + * --------------------------------------------------------------------------- + * Directus 11 kennt keine rollenbasierte Modulleiste (nur global). Dieser + * settings.read-Filter blendet für NICHT-Admins (= Rolle Staff im Admin) alle + * Module aus außer: + * - skrift-produktion (Produktions-Dashboard) + * - skrift-neuauftrag (Neuer Auftrag) + * + * Admins bleiben unberührt. Kunden nutzen die separate App (app.skrift.de), + * nicht die Directus-Admin-Oberfläche – daher reicht der Admin-Check. + */ +const ERLAUBT = ['skrift-produktion', 'skrift-neuauftrag']; + +function nurProduktion(bar) { + const vorhanden = (Array.isArray(bar) ? bar : []) + .filter((m) => m && m.type === 'module' && ERLAUBT.includes(m.id)); + // In fester Reihenfolge, fehlende ergänzen, alle aktiv. + return ERLAUBT.map((id) => { + const treffer = vorhanden.find((m) => m.id === id); + return { ...(treffer || { type: 'module', id }), type: 'module', id, enabled: true }; + }); +} + +export default (register) => { + register.filter('settings.read', (payload, _meta, context) => { + const acc = context && context.accountability; + if (!acc || acc.admin) return payload; // Admins unverändert; System-Reads (acc null) ebenfalls. + const anpassen = (s) => { + if (s && typeof s === 'object' && 'module_bar' in s) s.module_bar = nurProduktion(s.module_bar); + return s; + }; + return Array.isArray(payload) ? payload.map(anpassen) : anpassen(payload); + }); +}; diff --git a/extensions/directus-extension-skrift-access/package.json b/extensions/directus-extension-skrift-access/package.json new file mode 100644 index 0000000..5e8bd37 --- /dev/null +++ b/extensions/directus-extension-skrift-access/package.json @@ -0,0 +1,13 @@ +{ + "name": "directus-extension-skrift-access", + "version": "1.0.0", + "private": true, + "type": "module", + "description": "Beschränkt die Modulleiste für Nicht-Admins (Rolle Staff) auf Produktions-Dashboard + Neuer Auftrag (settings.read-Filter).", + "directus:extension": { + "type": "hook", + "path": "dist/index.js", + "source": "dist/index.js", + "host": "^11.0.0" + } +}