Files
Fuchs_Intranet/Fuchs/js/intranet/fis_main_menu.js
T
Stefan 9569c1b65e
Playwright Tests / test (push) Canceled after 0s
feat: Enhance invoice file backup procedure to include JSON snapshots
- Updated the stored procedure `fds__admin_backupAndClearInvoiceFile.sql` to back up not only the invoice file but also JSON snapshots of related data (invoices, items, details, service requests) to ensure consistency and traceability.
- Modified the table structure of `fds__invoice_file_backups` to accommodate new JSON columns for storing these snapshots.
- Added an ADR (0030) document to outline the decision and rationale behind these changes, emphasizing the importance of maintaining a consistent set of data alongside the backed-up file.
2026-09-17 22:39:01 +02:00

79 lines
4.8 KiB
JavaScript

(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:<fn>` 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); }
};