Playwright Tests / test (push) Canceled after 0s
- 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.
79 lines
4.8 KiB
JavaScript
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); }
|
|
}; |