From d40040efd8de7b0354a10d16a81045b0e54de4f7 Mon Sep 17 00:00:00 2001 From: Johann Hoffmann Date: Tue, 21 Jul 2026 18:07:23 +0200 Subject: [PATCH 1/7] added new fkey to tbl_widget for system.tbl_berechtigung; check for permission status during load & in widget picker; if widget was already picked/configured but not permitted anymore -> show a generalized "missing permission" screen via fallback component during widget init; --- .../api/frontend/v1/dashboard/Widget.php | 3 + public/js/components/Dashboard/Item.js | 15 ++- .../js/components/Dashboard/Widget/Picker.js | 12 ++- .../DashboardWidget/MissingPermission.js | 21 ++++ system/dbupdate_3.4.php | 1 + .../77757_widgets_berechtigungen.php | 57 ++++++++++ system/phrasesupdate.php | 100 ++++++++++++++++++ 7 files changed, 204 insertions(+), 5 deletions(-) create mode 100644 public/js/components/DashboardWidget/MissingPermission.js create mode 100644 system/dbupdate_3.4/77757_widgets_berechtigungen.php diff --git a/application/controllers/api/frontend/v1/dashboard/Widget.php b/application/controllers/api/frontend/v1/dashboard/Widget.php index ac8c682e8..99865b6db 100644 --- a/application/controllers/api/frontend/v1/dashboard/Widget.php +++ b/application/controllers/api/frontend/v1/dashboard/Widget.php @@ -101,6 +101,9 @@ class Widget extends FHCAPI_Controller $tmpsetup = json_decode($widget->setup); $tmpsetup->file = absoluteJsImportUrl($tmpsetup->file); $widget->setup = $tmpsetup; + $widget->permitted = empty($widget->berechtigung_kurzbz) + || $this->permissionlib->isBerechtigt($widget->berechtigung_kurzbz); + return $widget; }, $widgets); diff --git a/public/js/components/Dashboard/Item.js b/public/js/components/Dashboard/Item.js index 20c195178..a1623df58 100644 --- a/public/js/components/Dashboard/Item.js +++ b/public/js/components/Dashboard/Item.js @@ -1,5 +1,6 @@ import BsModal from "../Bootstrap/Modal.js"; import HeightTransition from "../Tranistion/HeightTransition.js"; +import MissingPermissionWidget from "../DashboardWidget/MissingPermission.js"; import { enableDragDropTouch } from "../../../../vendor/drag-drop-touch-js/dragdroptouch/dist/drag-drop-touch.esm.min.js"; @@ -113,6 +114,12 @@ export default { isPinned() { return this.place?.pinned ? true : false; }, + permitted() { + // widgets without a linked permission (or before the template loaded) + // are considered permitted; the backend sets permitted === false only + // when the user is missing the widget's required permission + return this.widgetTemplate?.permitted !== false; + }, ready() { return this.component && this.arguments !== null; }, @@ -178,7 +185,11 @@ export default { && this.widgetTemplate.widget_id && this.widgetTemplate.arguments ) { - let component = (await import(this.widgetTemplate.setup.file)).default; + // render the "missing permission" screen instead of the actual + // widget when the user does not hold the widget's linked permission + let component = this.permitted + ? (await import(this.widgetTemplate.setup.file)).default + : MissingPermissionWidget; this.$options.components["widget" + this.widgetTemplate.widget_id] = component; this.component = "widget" + this.widgetTemplate.widget_id; this.arguments = { ...this.widgetTemplate.arguments, ...this.config }; @@ -280,7 +291,7 @@ export default { ({ callbacks: {} }), + computed: { + // filter widgets away the user has no permissions for + availableWidgets() { + return (this.widgets || []).filter(widget => widget.permitted !== false); + } + }, methods: { getWidget() { return new Promise((resolve,reject) => { @@ -37,17 +43,17 @@ export default { Date: Fri, 2 Oct 2026 13:14:41 +0200 Subject: [PATCH 7/7] Fixed Saving of Entwicklungsteam --- include/entwicklungsteam.class.php | 88 +++++++++++++++++++++--------- include/mitarbeiter.class.php | 18 ++++++ 2 files changed, 81 insertions(+), 25 deletions(-) diff --git a/include/entwicklungsteam.class.php b/include/entwicklungsteam.class.php index b88c3971e..ec68f6918 100644 --- a/include/entwicklungsteam.class.php +++ b/include/entwicklungsteam.class.php @@ -21,6 +21,7 @@ * Manuela Thamer */ require_once(dirname(__FILE__).'/basis_db.class.php'); +require_once(dirname(__FILE__).'/mitarbeiter.class.php'); class entwicklungsteam extends basis_db { @@ -43,7 +44,6 @@ class entwicklungsteam extends basis_db public $ext_id; public $besqual; - public $studiengang_kz_old; /** * Konstruktor @@ -74,7 +74,7 @@ class entwicklungsteam extends basis_db $qry = "SELECT * FROM bis.tbl_entwicklungsteam JOIN bis.tbl_besqual USING(besqualcode) WHERE entwicklungsteam_id=".$this->db_add_param($entwicklungsteam_id); - $qry.=";"; + $qry.=";"; if($this->db_query($qry)) { @@ -147,6 +147,11 @@ class entwicklungsteam extends basis_db $this->errormsg = 'Es muss ein Mitarbeiter angegeben werden'; return false; } + if(!$this->checkIfExistingUid($this->mitarbeiter_uid)) + { + $this->errormsg = 'Bitte einen Eintrag aus dem Dropdown Personensuche auswählen!'; + return false; + } if($this->studiengang_kz=='') { $this->errormsg = 'Es muss ein Studiengang angegeben werden'; @@ -162,6 +167,26 @@ class entwicklungsteam extends basis_db $this->errormsg = 'Endedatum darf nicht vor Anfangsdatum liegen'; return false; } + + if($this->beginn != '') + { + $beginnParts = explode('-', $this->beginn); + if (!checkdate((int)$beginnParts[1], (int)$beginnParts[2], (int)$beginnParts[0])) { + $this->errormsg = 'Anfangsdatum ist ungültig'; + return false; + } + } + + if($this->ende != '') + { + $endeParts = explode('-', $this->ende); + if (!checkdate((int)$endeParts[1], (int)$endeParts[2], (int)$endeParts[0])) + { + $this->errormsg = 'Endedatum ist ungültig'; + return false; + } + } + return true; } @@ -183,30 +208,28 @@ class entwicklungsteam extends basis_db //Neuen Datensatz anlegen $qry = "INSERT INTO bis.tbl_entwicklungsteam (mitarbeiter_uid, studiengang_kz, besqualcode, beginn, ende, updateamum, updatevon, insertamum, insertvon) VALUES (". - $this->db_add_param($this->mitarbeiter_uid).', '. - $this->db_add_param($this->studiengang_kz, FHC_INTEGER).', '. - $this->db_add_param($this->besqualcode, FHC_INTEGER).', '. - $this->db_add_param($this->beginn).', '. - $this->db_add_param($this->ende).', '. - $this->db_add_param($this->updateamum).', '. - $this->db_add_param($this->updatevon).', '. - $this->db_add_param($this->insertamum).', '. - $this->db_add_param($this->insertvon).');'; + $this->db_add_param($this->mitarbeiter_uid).', '. + $this->db_add_param($this->studiengang_kz, FHC_INTEGER).', '. + $this->db_add_param($this->besqualcode, FHC_INTEGER).', '. + $this->db_add_param($this->beginn).', '. + $this->db_add_param($this->ende).', '. + $this->db_add_param($this->updateamum).', '. + $this->db_add_param($this->updatevon).', '. + $this->db_add_param($this->insertamum).', '. + $this->db_add_param($this->insertvon).');'; } else { - if($this->studiengang_kz_old=='') - $this->studiengang_kz_old = $this->studiengang_kz; - //Bestehenden Datensatz aktualisieren $qry= "UPDATE bis.tbl_entwicklungsteam SET". - " besqualcode=".$this->db_add_param($this->besqualcode, FHC_INTEGER).",". - " beginn=".$this->db_add_param($this->beginn).",". - " studiengang_kz=".$this->db_add_param($this->studiengang_kz, FHC_INTEGER).",". - " ende=".$this->db_add_param($this->ende).",". - " updateamum=".$this->db_add_param($this->updateamum).",". - " updatevon=".$this->db_add_param($this->updatevon). - " WHERE entwicklungsteam_id=".$this->db_add_param($this->entwicklungsteam_id).";"; + " besqualcode=".$this->db_add_param($this->besqualcode, FHC_INTEGER).",". + " beginn=".$this->db_add_param($this->beginn).",". + " studiengang_kz=".$this->db_add_param($this->studiengang_kz, FHC_INTEGER).",". + " ende=".$this->db_add_param($this->ende).",". + " mitarbeiter_uid=".$this->db_add_param($this->mitarbeiter_uid).",". + " updateamum=".$this->db_add_param($this->updateamum).",". + " updatevon=".$this->db_add_param($this->updatevon). + " WHERE entwicklungsteam_id=".$this->db_add_param($this->entwicklungsteam_id).";"; } if($this->db_query($qry)) @@ -234,7 +257,7 @@ class entwicklungsteam extends basis_db if($studiengang_kz!=null) $qry.=" AND studiengang_kz=".$this->db_add_param($studiengang_kz); - $qry.=";"; + $qry.=";"; if($this->db_query($qry)) { @@ -316,7 +339,7 @@ class entwicklungsteam extends basis_db if ($sort != null) { - $qry .= " ORDER BY ".$sort; + $qry .= " ORDER BY ".$sort; } $qry .= ";"; @@ -364,7 +387,7 @@ class entwicklungsteam extends basis_db $bismeldung_jahr = $datetime->format('Y'); //laden des Datensatzes - $qry = "SELECT tbl_entwicklungsteam.*, tbl_besqual.*, tbl_studiengang.studiengang_kz, tbl_studiengang.melderelevant + $qry = "SELECT tbl_entwicklungsteam.*, tbl_besqual.*, tbl_studiengang.studiengang_kz, tbl_studiengang.melderelevant FROM bis.tbl_entwicklungsteam JOIN bis.tbl_besqual USING(besqualcode) JOIN public.tbl_studiengang USING(studiengang_kz) @@ -375,7 +398,7 @@ class entwicklungsteam extends basis_db if($studiengang_kz!=null) $qry.=" AND studiengang_kz=".$this->db_add_param($studiengang_kz); - $qry.=";"; + $qry.=";"; if($this->db_query($qry)) { @@ -407,5 +430,20 @@ class entwicklungsteam extends basis_db return false; } } + + /* + * Überprüft, ob die übergebene Uid in der Tabelle tbl_mitarbeiter vorhanden ist + * @param String $uid UID des Mitarbeiters + * @return true wenn vorhanden, false wenn nicht + */ + private function checkIfExistingUid($uid) + { + $mitarbeiter = new mitarbeiter(); + + if(!$mitarbeiter->checkIfExistingUid($uid)) + return false; + + return true; + } } ?> diff --git a/include/mitarbeiter.class.php b/include/mitarbeiter.class.php index 1517122c2..7138b8578 100644 --- a/include/mitarbeiter.class.php +++ b/include/mitarbeiter.class.php @@ -1995,5 +1995,23 @@ class mitarbeiter extends benutzer return true; } } + + /** + * Prueft ob eine existierende ma_uid übergeben wurde + * @param String $mitarbeiter_uid mitarbeiter_uid + * @return bool True wenn mitarbeiter_uid vorhanden sonst false. + */ + public function checkIfExistingUid($mitarbeiter_uid) + { + $qry = "Select 1 from public.tbl_mitarbeiter where mitarbeiter_uid =".$this->db_add_param($mitarbeiter_uid); + + if ($result = $this->db_query($qry)) + { + if ($this->db_num_rows($result) > 0) + return true; + else + return false; + } + } } ?>