(function () { Array.prototype.push.apply($ocms.ocmsmenu,[ { lbl: $t.m_inv, id: 'm_inv', fnc: 'init:inv', ico: 'glyphicon glyphicon-list-alt'} ,{ lbl: $t.m_req, id: 'm_req', fnc: 'init:req', ico: 'glyphicon glyphicon-eur' } , { lbl: $t.m_bcd, id: 'm_bcd', fnc: 'init:bam', ico: 'glyphicon glyphicon-indent-right' } , { fnc: 'separator' } , { lbl: $t.m_rep, id: 'm_rep', fnc: 'init:rep', ico: 'glyphicon glyphicon-dashboard' } , { fnc: 'separator' } , { lbl: $t.m_todo, id: 'm_todo', fnc: () => { $('#contentframe').empty().load($ocms.url('todos')); $('#listframe').rC('fix').aC('hd'); }, ico: 'glyphicon glyphicon-sunglasses' } //, { lbl: $t.m_efa, id: 'm_efa', fnc: 'init:efa' } ]); })(); /* "Administration" is a single sidemenu dropdown (ocmsmenu supports nested items via `itm`) containing four buttons — Benutzerverwaltung (fn=usr), Gruppenverwaltung (fn=usrgrp), Systemüberwachung (fn=admin) and Spezialfunktionen (fn=specialties) — all restricted to users whose fds_sys authorization exceeds 4. One auth check gates the whole dropdown; it (and therefore all module scripts) is only added after that check resolves, so lower-privileged users never see it or fetch any module's code. Called from fis_main_go.js once the DOM (and the initial main menu) is ready. Returns a promise that settles once the menu is final. Systemüberwachung and Spezialfunktionen are hidden entries: they are only shown while the Administration dropdown is opened with the Shift key held (Shift+click on the toggle). A plain click hides them again, so the diagnostics/maintenance pages are never one accidental click away. The items still exist in the menu array, so the /admin and /specialties deep links (openModuleFromPath) keep working. */ $fis.addAdminMenuButtonsIfAuthorized = function () { if ($('#m_admin_grp').length > 0) { return Promise.resolve(); } // idempotent return $fis.getAuth('fds_sys').then(function (auth) { if ((auth || -1) > 4 && $('#m_admin_grp').length === 0) { $ocms.ocmsmenu.push({ lbl: $t.m_admin, id: 'm_admin_grp', ico: 'glyphicon glyphicon-cog', itm: [ { lbl: $t.m_usr, id: 'm_usr', fnc: 'init:usr', ico: 'glyphicon glyphicon-user' }, { lbl: $t.m_usrgrp, id: 'm_usrgrp', fnc: 'init:usrgrp', ico: 'glyphicon glyphicon-list' }, { lbl: $t.m_admin_status, id: 'm_admin', fnc: 'init:admin', ico: 'glyphicon glyphicon-dashboard', lclass: 'shift-only' }, { lbl: $t.m_specialties, id: 'm_specialties', fnc: 'init:specialties', ico: 'glyphicon glyphicon-wrench', lclass: 'shift-only' } ] }); /* Re-render the main menu cleanly: drop the previously generated menu list (never the .nav-right settings dropdown) and rebuild it from the array. */ $('#mainmenu').children('ul:not(.nav-right)').remove(); $('#mainmenu').ocmsmenu($ocms.ocmsmenu); $fis.bindShiftOnlyMenuItems($('#m_admin_grp')); } }).catch(function () { /* auth lookup failed → leave the menu unchanged */ }); }; /* Hides every `.shift-only` entry of a dropdown group and reveals them only for an opening initiated with Shift held. Bound on mousedown (fires before Bootstrap's click toggle, so the list is already in the right state when the dropdown becomes visible) and on keydown for keyboard users (Shift+Enter / Shift+Space on the focused toggle). */ $fis.bindShiftOnlyMenuItems = function (group) { let items = group.find('.shift-only').hide(); if (items.length === 0) { return; } let apply = function (e) { items.toggle(e.shiftKey === true); }; group.children('a.dropdown-toggle') .on('mousedown', apply) .on('keydown', function (e) { if (e.key === 'Enter' || e.key === ' ') { apply(e); } }); }; /* Deep link: the server renders the same SPA shell for every /{fn} URL (IntranetController.Index ignores fn), so opening e.g. /specialties directly would otherwise just show the dashboard. Opens the module named by the first path segment — but only one the user's menu actually offers (`init:` item, incl. the admin dropdown), so arbitrary paths, /do/… links and pre-auth flows never trigger a module load. Must run after the admin menu settled. */ $fis.openModuleFromPath = function () { let fn = (window.location.pathname.split('/')[1] || '').toLowerCase(); if (!/^[a-z]+$/.test(fn) || fn === 'home') { return; } let offered = false; let scan = function (items) { $.each(items || [], function (i, it) { if (it.fnc === 'init:' + fn) { offered = true; } if (it.itm) { scan(it.itm); } }); }; scan($ocms.ocmsmenu); if (offered) { $ocms.init(fn); } };