Repository navigation
Consolidate frontend tooling with Vite+ and fix dashboard request lifecycles - #706
Conversation
Apply the shared formatter conventions to frontend files whose changes are entirely formatting. Preserve their runtime behavior, upstream names, comments and structure. Keep this mechanical pass separate so Git blame can ignore it without hiding the dashboard fixes or tooling changes that follow. Files that also require functional changes stay with their corresponding changes.
Bring Horizon, Telescope, the exception renderer, Workbench, Wayfinder and the AI workbench into one pnpm workspace with a shared dependency catalog and lockfile. Keep application skeletons independent and preserve package-local build outputs for Composer distribution. Pin Vite+ and its matching core and Vitest versions, declare direct dependencies, retain distinct supported Tailwind majors, and remove superseded npm locks and policy files. Preserve the release-age policy and explicitly allow only the required dependency build script. Use native Vite+ formatting, linting, type checking, test projects and task selection. Generate Wayfinder fixtures before quality checks so the commands work on a fresh installation, and keep cached-route testing in its owning package. Validate frozen installs, all member builds, test discovery and generated TypeScript output.
Move existing Telescope and Wayfinder tests to the bundled Vite+ test APIs while preserving their behavioral assertions. Express negative generated-route argument checks through expectTypeOf and retain the separate generated-output compiler check. Give Wayfinder test builds isolated temporary directories with cleanup instead of a shared fixed path. Apply the shared formatter to these test files as part of their runner migration. Normal and cached route tests, generated TypeScript checks and the complete JavaScript suite pass.
Use the shared test runner and formatter while retaining the classic-script SDK and its public browser API. Mark asynchronous dispatches whose handlers already own response and error reporting with void, and remove an unused catch binding. Regenerate the Terser output and verify the browser SDK tests against both source and minified distributions. Keep minification explicit rather than introducing a bundler wrapper or changing how applications load the SDK.
Calculate the inclusive starting index once for tagged failed jobs and use it for both tag selection and returned row indices. Preserve the upstream zero cursor alias so initial requests and later pages agree about their position. Declare getJobs indexFrom as an integer in the repository contract and implementation, matching the existing strictly typed indexJobs call and its callers. Cover absent, zero, initial and next-page cursors in the controller regression test. Targeted formatting, static analysis and Horizon PHP tests pass.
Make Poll await an explicit callback, prevent overlapping ticks, report failures and release its busy state after settlement. Retain the existing polling intervals and visibility behavior, with focused overlap and recovery coverage. Release Alert modal listeners, timers and instances on unmount, and fix its accessible label. Keep Chart.js instances non-reactive so animation cleanup sees the original instance and destroy charts when their component is removed. Key the root view by route path to refresh resource screens while retaining query-only updates. Use package-based Bootstrap Sass with the existing light and dark themes, disable unused Bootstrap color-mode generation, and remove obsolete transition styles and script attributes. Verify modal and chart lifecycles against real browser assets.
Return every polling request to Poll and wait for all dashboard requests to settle before reporting failures. List screens cancel superseded reads and reads owned by an unmounted screen, skip refreshes during user loads, and ignore late canceled responses. Remove duplicate initial loads and redundant route watchers. Reset failed-job pagination when searching, encode search through Axios parameters, and use after-index cursors consistently. Clear search timers on unmount. Release retry state after failures and explain unconfirmed retries; retain the success cooldown while leaving refreshes to existing polling. Update monitoring tags only after successful requests, preserve newer drafts and avoid duplicate displayed tags. Handle both numeric and DateInterval delayed-job values. Add focused regression coverage for request settlement, list navigation, cursor boundaries, retries and monitoring behavior; verify the screens using real compiled assets.
Update recording state only after the toggle succeeds, prevent overlapping toggle requests and release the pending state on failure. Report changes that could not be confirmed and reload cleared entries only after success. Exercise these paths through the real mounted application entry. Wait for the initial monitoring list before enabling additions. Capture submitted tags, preserve newer drafts, deduplicate successful additions and change displayed tags only after successful mutations. Report failed additions and deletions through the existing alert. Replace monitoring select-and-insert with one native upsert of unique tags so concurrent requests cannot collide on the tag primary key. All shipped database grammars support upsert; a custom DB::extend connection now needs upsert support in its grammar. Retain strict database errors without an insert fallback. Existing storage coverage and focused dashboard tests pass.
Drop the unused bootstrap import and empty module from the authentication frontend. Keep Alpine initialization in its existing entry and preserve the Workbench asset publication contract. The workspace build and independent application browser check pass.
Commit the dashboard, exception renderer and Workbench outputs generated from the shared workspace and reviewed source changes. Replace the obsolete Workbench chunk and update its manifest while preserving all PHP-consumed filenames and inline classic-script behavior. Verify repeat builds produce identical output, exercise the distributed assets in browser and exported-application checks, and compare compressed bundle sizes. Composer installations continue to receive ready-to-use assets without requiring Node or access to the monorepo catalog. AI workbench build output remains untracked.
Replace the separate frontend installations with a pinned setup-vp action and one frozen workspace install. Run shared source checks, builds, JavaScript tests, cached Wayfinder tests and generated-output type checking sequentially. Trust the mounted checkout before container Git commands. Fail with affected filenames and contributor instructions when distributed outputs differ or new chunks are untracked. CI verifies committed assets without publishing them or making commits. Add weekly Dependabot updates for the root catalog and independent skeleton, preserve the seven-day version-update cooldown, and group coupled Vite+ toolchain updates. Retain the existing GitHub Actions updates and independent skeleton installation workflow.
Document native Vite+ installation, quality checks, tests, builds and dependency updates from the components workspace. Explain the independent skeleton boundary and how contributors work on frontend source while maintainers regenerate distributed assets before merge. Record the approved formatter adaptation for maintained ports and the formatting-only commit in the Git blame ignore file. Describe local blame configuration and preserve upstream structure and naming as the maintenance reference. Update the AI workbench instructions and active plan to match the implemented commands and verified behavior. Keep post-merge dependency graph verification and upstream-sync guidance updates explicit until publishing is authorized.
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the
|
|
@coderabbitai review |
|
|
@cubic-dev-ai review |
@binaryfire cubic can't start this review because your workspace has reached its free monthly review limit. cubic has reviewed 123,074 of the 120,000 allowed lines of code this month. Reviews resume on 10 November 2026 (in 13 days). Paid plans include much higher monthly review limits. Upgrade now to resume reviews. To help optimise your usage, you can tune cubic to get the most out of your usage limits:
|
PR Summary by QodoConsolidate frontend tooling and harden dashboard request lifecycles
AI Description
Diagram
High-Level Assessment
Files changed (170)
|
Code Review by Qodo
1. Fast tag-removal failures hide their error
|
Symfony HTTP Foundation now accepts the cookie name zero. Keep the enum regression test focused on its actual contract: direct strings and enum-backed names must follow native Cookie validation across the supported Symfony versions. Use only native construction inside the exception probe, then exercise CookieJar outside that catch so assertions cannot be swallowed. Verify the test with HTTP Foundation 8.1.9 and the Cookie suite with 8.1.10 without changing runtime behavior or raising the dependency minimum.
Symfony Console 8.1.10 recognizes built-in named styles regardless of case. Match that behavior when measuring visible text and preserving trailing style tags during grapheme replacement, so uppercase tags do not affect layout or get partially overwritten. Require Console 8.1.10 in Prompts and the development root, and change only the named-style regex groups. Preserve escape handling, unknown tags and terminal control parsing without adding formatter allocations or runtime version checks. Extend the existing formatter-parity and trailing-tag tests with mixed-case and uppercase inputs. Both cases fail before their fixes and pass afterward; targeted formatting, Prompts static analysis and the affected suites pass.
Describe the required case-insensitive Prompts handling and native cookie-validation parity exposed by fresh dependency resolution. Keep the active plan aligned with the final design and the remaining PR, CI and post-merge work.
Raise every existing split-package Console requirement to ^8.1.10, matching the development root and Prompts. The repository checks external dependency constraints for exact consistency, so the earlier root and Prompts update also needs to be reflected in the other declarations. Preserve the shared manifest invariant and all package-specific metadata assertions. No runtime code or new test machinery is needed. The Composer consistency suite, complete package metadata selection and validation of every changed manifest pass. Update the active plan to describe the shared requirement.
The framework frontends currently use separate installations, lockfiles and build commands. This makes shared dependency updates harder to maintain and allows the dashboards and other shipped assets to drift. This change puts their development tooling in one Vite+/pnpm workspace and fixes dashboard request and cleanup bugs found while validating the migration.
Shared tooling
.git-blame-ignore-revs. Existing component names, Options API organization and upstream structure remain recognizable.Dashboard fixes
Horizon polling now waits for its requests and skips overlapping ticks. Dashboard refreshes wait for every request to settle, including when one fails. List screens cancel superseded reads and reads belonging to a screen that has been left, skip refreshes during user loads, and clear search timers on unmount.
Failed-job searches reset pagination and encode their parameters correctly. Tagged pagination uses the same starting index for selection and returned rows. Navigation remounts resource screens when the path changes while preserving query-only updates. Failed retries release their pending state and explain that the result could not be confirmed.
Modal instances, listeners and timers are cleaned up on unmount. Chart.js instances remain non-reactive so their animation cleanup uses the correct object identity. Horizon uses the supported Bootstrap line while keeping its own light and dark themes.
Telescope updates recording state only after a successful response, prevents overlapping toggles, and reloads cleared entries only after success. Both dashboards update monitoring tags after successful requests and preserve newer input drafts. Telescope stores monitored tags with a native upsert to avoid concurrent duplicate-key failures. All shipped database grammars support this; custom connection grammars need upsert support.
CI and maintenance
Prompts now matches Symfony Console's case-insensitive built-in style names when measuring text and preserving closing tags. It requires Console 8.1.10, where that behavior was fixed. Cookie enum-name coverage follows native Symfony validation across supported versions, including versions that accept
0as a cookie name; cookie runtime behavior is unchanged.One JavaScript job installs the frozen workspace, checks source, builds assets, verifies committed outputs, and runs the registered tests and Wayfinder type checks. Asset verification catches both modified files and new untracked chunks, with instructions for rebuilding them. CI does not publish or commit generated files.
Dependabot updates the workspace catalog and independent skeleton separately, with coupled toolchain updates grouped. Contributor documentation covers installation, commands, dependency updates and asset regeneration. Contributors can submit source changes; maintainers regenerate assets before merging.
Verification
Note
Migrate frontend monorepo to Vite+ and fix Horizon/Telescope request lifecycles
vpcommandsPoll.vuenow awaits a requiredcallbackprop instead of emittingpollevents, and all dashboard/list screens pass refresh methods through it with immediate polling disabledAbortControllerwith stale-response guards, unmount hooks abort requests and dispose Bootstrap modals and Chart instances, and failed retry/monitoring requests show alerts instead of mutating staterefreshStatsPeriodicallyusesPromise.allSettledand only sets ready when all three requests succeed; Telescope's recording toggle and clear-entries handlers await requests before changing state; monitoring tags use upserts inDatabaseEntriesRepository.monitorsymfony/consoleto^8.1.10in all package composer.json files and formats the frontend codebase with the Vite+ formatterv-ifin batches/index.vue contain invalid object-expression syntax that may break Vue template compilationMacroscope summarized 2e6d3f2.