Summary: Upgrade Filament to v5 (Livewire v4), replace Filament v4-only plugins, add first-party JSON renderer, and harden Monitoring/Ops UX guardrails. What I changed: Composer: upgraded filament/filament → v5, removed pepperfm/filament-json and lara-zeus/torch-filament, added torchlight/engine. Views: replaced JSON viewer with json-viewer.blade.php and updated snapshot display. Tests: added DB-only + tenant-isolation guard tests under Monitoring and OpsUx, plus Filament smoke tests. Specs: added/updated specs/057-filament-v5-upgrade/* (spec, tasks, plan, quickstart, research). Formatting: ran Pint; ran full test suite (641 passed, 5 skipped). Validation: Ran ./vendor/bin/sail artisan test (full suite) — all tests passed. Ran ./vendor/bin/sail pint --dirty — formatting applied. Ran npm run build locally (Vite) — assets generated. Notes / Rollback: Rollback: revert composer.json/composer.lock and build assets; documented in quickstart.md. One pending app migration was noted during validation; ensure migrations are applied in staging before deploy. Reviewers: @frontend, @backend (adjust as needed) Spec links: spec.md tasks.md quickstart.md Co-authored-by: Ahmed Darrazi <ahmeddarrazi@adsmac.local> Reviewed-on: #66
72 lines
2.2 KiB
JavaScript
72 lines
2.2 KiB
JavaScript
(() => {
|
|
// TenantPilot shim: ensure Livewire interceptMessage callbacks run in a safe order.
|
|
// This prevents Filament's notifications asset (and others) from calling an undefined
|
|
// animation callback when onSuccess fires before onFinish.
|
|
if (typeof window === 'undefined') {
|
|
return;
|
|
}
|
|
|
|
const Livewire = window.Livewire;
|
|
|
|
if (!Livewire || typeof Livewire.interceptMessage !== 'function') {
|
|
return;
|
|
}
|
|
|
|
if (Livewire.__tenantpilotInterceptMessageShimApplied) {
|
|
return;
|
|
}
|
|
|
|
const original = Livewire.interceptMessage.bind(Livewire);
|
|
|
|
Livewire.interceptMessage = (handler) => {
|
|
if (typeof handler !== 'function') {
|
|
return original(handler);
|
|
}
|
|
|
|
return original((context) => {
|
|
if (!context || typeof context !== 'object') {
|
|
return handler(context);
|
|
}
|
|
|
|
const originalOnFinish = context.onFinish;
|
|
const originalOnSuccess = context.onSuccess;
|
|
|
|
if (typeof originalOnFinish !== 'function' || typeof originalOnSuccess !== 'function') {
|
|
return handler(context);
|
|
}
|
|
|
|
const finishCallbacks = [];
|
|
|
|
const onFinish = (callback) => {
|
|
if (typeof callback === 'function') {
|
|
finishCallbacks.push(callback);
|
|
}
|
|
|
|
return originalOnFinish(callback);
|
|
};
|
|
|
|
const onSuccess = (callback) => {
|
|
return originalOnSuccess((...args) => {
|
|
// Ensure any registered finish callbacks are run before success callbacks.
|
|
// We don't swallow errors; we just stabilize ordering.
|
|
for (const finishCallback of finishCallbacks) {
|
|
finishCallback(...args);
|
|
}
|
|
|
|
if (typeof callback === 'function') {
|
|
return callback(...args);
|
|
}
|
|
});
|
|
};
|
|
|
|
return handler({
|
|
...context,
|
|
onFinish,
|
|
onSuccess,
|
|
});
|
|
});
|
|
};
|
|
|
|
Livewire.__tenantpilotInterceptMessageShimApplied = true;
|
|
})();
|