Playwright Tests / test (push) Canceled after 0s
- Added MailerAttachmentPolicy for validating email attachments against server rules. - Introduced fis.specialties.js for managing hidden maintenance actions via an admin interface. - Created fis.specialties.scss for styling the specialties management UI. - Added German localization for specialties management in fis.specialties_txt_de.js. - Developed CSS for specialties management in fis.specialties.css. - Implemented server-side stored procedure fds__admin_backupAndClearInvoiceFile for backing up and clearing invoice files. - Created fds__invoice_file_backups table to store backup records of invoice files.
3.6 KiB
3.6 KiB
status, lastUpdated, applyTo, relatedDecisions
| status | lastUpdated | applyTo | relatedDecisions | |||||
|---|---|---|---|---|---|---|---|---|
| Active | 2026-09-17 |
|
|
Admin "Specialties" page (/specialties)
Summary
An admin-only page that surfaces the otherwise hidden maintenance actions as
cards, each a small form. It exists so support does not need SSMS or a
hand-crafted POST for actions like resetting an invoice's stored PDF. It is
a regular lazily loaded frontend module (fn = specialties), gated like the
rest of the Administration menu (fds_sys > 4), and reachable both from the
menu (Administration → Spezialfunktionen) and by opening the URL
/specialties directly.
How it works
- Module load follows the standard contract (see
admin-system-status.md): the menu iteminit:specialties→$ocms.init('specialties')→POST /do/specialties/auth→ whenmanage > 0, importweb/fis.specialties.de.js+fis.specialties.cssand callinit2.IntranetController.Specialties.csanswers only that auth probe (sameGetSystemAdminAuthAsyncgate as the Admin module) and 401s everything else. - Deep link.
IntranetController.Indexrenders the same SPA shell for every/{fn}URL and ignoresfn; there is no client router.fis_main_go.jstherefore calls$fis.openModuleFromPath()once the admin menu has settled: it takes the first path segment and calls$ocms.init(fn)only if the user's menu offers aninit:<fn>item (admin dropdown included). A non-admin opening/specialtiessees the dashboard, as before; arbitrary paths never trigger a module load. - Cards.
fis.specialties.jskeeps an arraycardsof builder functions. Each card istitle + description + <form> + result box;$spc.submit(c, { button, confirm, run, report })wires HTML5 validation, aconfirm(), thepostXTcall (run(values)returns the request) and the inline result (report(response)→{ ok, lines }). The card calls the action's real endpoint — every such endpoint enforces the admin gate itself; the page adds no authority. - Current cards
- Rechnungsdatei zurücksetzen (Soft-Delete) →
POST /do/admin/backupclearinvoicefile/<internal Id>(ADR 0027). Shows the outcome and the blob backup URI, or the German text for the service'sreason(invoice_not_found,not_final,external,no_file,db_error). An invoice without a stored file (hasFilefromfds__getInvoice) is answeredno_filebefore any blob copy, so repeated clicks leave no sparebackup_*blobs.
- Rechnungsdatei zurücksetzen (Soft-Delete) →
- Adding a card: append a builder to
cards, add its texts tofis.specialties_txt_de.js, runnpx gulp min. No server change is needed unless the action itself is new. - Build: bundle entries in
Fuchs/bdlconfig.json(intranet:specialties); generated files underwwwroot/web/.
Key files
Fuchs/Controllers/IntranetController.Specialties.cs— auth probe.Fuchs/Controllers/IntranetController.cs—"specialties"case inDo.Fuchs/js/intranet/modules/fis.specialties.js/_txt_de.js/.scss.Fuchs/js/intranet/fis_main_menu.js— menu item +openModuleFromPath.Fuchs/js/intranet/fis_main_go.js— deep link after menu settles.Fuchs/js/intranet/fis_texts_gui_de.js—m_specialtieslabel.