83 lines
2.3 KiB
JavaScript
83 lines
2.3 KiB
JavaScript
|
|
/**
|
||
|
|
* Initializes standard UI components inside a dynamically-loaded HTML fragment
|
||
|
|
* (e.g. detail drawer body). Mirrors the subset of app-init.js components that
|
||
|
|
* make sense inside content fragments — layout/topbar/global components are
|
||
|
|
* intentionally excluded since those live in the shell, not the fragment.
|
||
|
|
*
|
||
|
|
* Consumers:
|
||
|
|
* import { initFragmentContent } from '/js/core/app-fragment-init.js';
|
||
|
|
* initFragmentContent(contentEl);
|
||
|
|
*
|
||
|
|
* Each initializer is best-effort: failures are logged but do not abort the
|
||
|
|
* remaining initializers so one broken component cannot silently break all
|
||
|
|
* interactive elements in the fragment.
|
||
|
|
*/
|
||
|
|
|
||
|
|
import { initTabs } from '../components/app-tabs.js';
|
||
|
|
import { initConfirmActions } from '../components/app-confirm-actions.js';
|
||
|
|
import { initLookupFields } from '../components/app-lookup-field.js';
|
||
|
|
import { initAutoSubmit } from '../components/app-auto-submit.js';
|
||
|
|
import { initFileUpload } from '../components/app-file-upload.js';
|
||
|
|
|
||
|
|
const INITIALIZERS = [
|
||
|
|
{
|
||
|
|
name: 'tabs',
|
||
|
|
selector: '[data-app-component="tabs"]',
|
||
|
|
run: (root) => initTabs(root),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: 'confirm-actions',
|
||
|
|
selector: '[data-confirm]',
|
||
|
|
run: (root) => initConfirmActions(root),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: 'lookup-field',
|
||
|
|
selector: '[data-lookup-field]',
|
||
|
|
run: (root) => initLookupFields(root),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: 'auto-submit',
|
||
|
|
selector: '[data-auto-submit]',
|
||
|
|
run: (root) => initAutoSubmit(root),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: 'file-upload',
|
||
|
|
selector: '[data-app-component="file-upload"]',
|
||
|
|
run: (root) => initFileUpload(root),
|
||
|
|
},
|
||
|
|
];
|
||
|
|
|
||
|
|
const refreshFsLightboxSafe = () => {
|
||
|
|
if (typeof window !== 'undefined' && typeof window.refreshFsLightbox === 'function') {
|
||
|
|
try {
|
||
|
|
window.refreshFsLightbox();
|
||
|
|
} catch (err) {
|
||
|
|
console.warn('[fragment-init] refreshFsLightbox failed', err);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Initialize all known components within the given fragment root.
|
||
|
|
*
|
||
|
|
* @param {HTMLElement} contentEl — the container holding freshly-injected HTML
|
||
|
|
*/
|
||
|
|
export function initFragmentContent(contentEl) {
|
||
|
|
if (!(contentEl instanceof HTMLElement)) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
for (const { name, selector, run } of INITIALIZERS) {
|
||
|
|
if (!contentEl.querySelector(selector)) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
try {
|
||
|
|
run(contentEl);
|
||
|
|
} catch (err) {
|
||
|
|
console.warn(`[fragment-init] ${name} failed`, err);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
refreshFsLightboxSafe();
|
||
|
|
}
|