ziffmedia/nova-select-plus
An enhanced Laravel Nova select field with searchable, AJAX-loaded options and dependent selects. It keeps resource forms fast when dealing with large option sets or dynamic relationships, using a familiar Nova field API.
Architecture fit
ziffmedia/nova-select-plus is a drop-in Laravel Nova field, not a standalone component. It slots into the existing Nova resource layer as a subclass of Nova's base Field plus a compiled Vue component registered through Nova's asset pipeline. That means it fits only where Nova already fits: admin/back-office panels in a Laravel monolith or a modular monolith with Nova installed as the operations surface. It is not a candidate for public-facing UI, API layers, or headless architectures. The architectural value is narrow but real — a searchable, optionally remote-loaded select resolves a genuine UX gap in Nova's stock Select field for relationship fields with large option sets (users, tenants, SKUs, accounts). If the product's admin surface is Nova, this is a legitimate "buy" decision; if Nova is being deprecated or wrapped behind an SPA, this package should be skipped entirely. v2.0.2 does not change this conclusion in either direction — it is a styling and integration fix, not an architectural change.
Integration feasibility
Low effort. Composer install, register the field in app/Nova, swap Select::make() for SelectPlus::make() on the target fields, and ship. No migrations, no schema changes, no service provider bootstrapping beyond Nova's auto-discovery. The realistic effort is concentrated in two places: (1) reworking option sources that currently return large eager-loaded arrays into a paginated/searchable endpoint, and (2) regression-testing index/detail forms where the field is used, particularly around validation rules and displayUsingLabels-style behavior. A single engineer can typically evaluate it in a day and integrate it across a handful of resources in under a sprint. The v2.0.2 fix is localized to Form.vue and field styling, so it does not raise integration effort — but it also means the field's reactive behavior has changed recently, which pushes dependsOn regression testing from "nice to have" to "required" in the pilot.
Technical risk Moderately elevated, and it is version-drift risk rather than code-quality risk. The picture is materially better than the previous assessment, but not resolved. Updated signals:
DependsOn integration on the Form.vue side) plus a maintainer-authored styling improvement. That is evidence of low-frequency but responsive maintenance — someone upstream still reads issues and merges PRs. Treat cadence as "slow, unpredictable, not dead."dependsOn is now a known-good surface, not a known gap. The previous assessment flagged dependsOn interaction as an open risk. A dedicated fix landing means the maintainers are aware of and invested in Nova's reactive-field contract. This meaningfully de-risks one of the three things that were most likely to break, though it must still be verified against our Nova major.DependsOn fix strongly implies a recent Nova major is in play, but implication is not evidence. Absence of an explicit compatibility statement is now the single biggest unknown.Offsetting all of it: MIT license means the small surface area (one field class, one Vue component) is forkable and self-patchable, and this release actually reinforces that — the changes are small, legible, and the kind of thing we could own. The blast radius of failure is confined to specific form fields, not data integrity. This remains a contained risk, not a platform risk.
Key questions
DependsOn fix work on the Nova major we are pinned to? This is now the single highest-value question and should be answered by a branch smoke test, not by reading the source.Form.vue fix change behavior for fields that don't use dependsOn, or for nested dependsOn chains we already rely on?onlyOnForms, and resolveUsing/displayUsing hooks we already rely on?Select, so an existing column needs no migration and a rollback is a one-line change?Stack fit Requires Laravel + Nova + a build pipeline that ships Nova's compiled assets. It assumes Nova's Vue runtime and its Tailwind-ish component styling; visual consistency with the rest of the Nova panel is inherited, not guaranteed — and v2.0.2 touches form field styling, so the pilot should include a visual review against surrounding fields rather than assuming visual parity holds. It does not fit Inertia/Livewire-first admin panels, Filament-based stacks, or anything where Nova is absent. For teams already on Nova, the fit is native — one composer dependency, no new runtime, no new datastore, no sidecar service.
Migration path
Adopt field-by-field, not package-wide. Identify the highest-pain selects first — typically relationship fields with hundreds-plus options where Nova's stock dropdown becomes unusable. For each: keep the stock Select in place, add SelectPlus behind a feature flag or a per-resource toggle, compare rendered output and submitted payloads, then swap. Because the stored value should be format-compatible with stock Select, rollback is a revert of a single line — treat that as a hard acceptance criterion before rollout. If remote loading is used, stand up the search endpoint alongside the existing option array so both paths exist during the transition. For any field using dependsOn, run the dependency chain explicitly in the pilot rather than assuming v2.0.2 fixed it for our Nova version.
Compatibility
Still the gating workstream, and v2.0.2 raises rather than lowers its priority — the release changes reactive-field behavior and styling, which are exactly the surfaces that differ across Nova majors. Before broader adoption, build a compatibility matrix: Nova major × Laravel major × PHP version, validated with a smoke test that (a) renders the field on create and update forms, (b) submits and persists a value, (c) resolves the display label on index and detail, (d) honors required/nullable validation, (e) survives an async option search round trip, and (f) — newly mandatory — drives a dependsOn parent/child pair, since that code path just changed. Pin the package to an exact version (2.0.2, not ^2.0); do not allow floating constraints. If the smoke test fails on our Nova version, the decision moves from "integrate" to "fork and patch" or "do not adopt," and that fork cost must be estimated before, not after, the first resource depends on it. Positively: a maintainer-authored DependsOn fix shrinks the expected size of that fork if we need one.
Sequencing
dependsOn case, confirm value-format parity and rollback safety.dependsOn if possible, ship to internal users, monitor for a release cycle.Maintenance
Revise the posture from "unmaintained" to "low-cadence, single-vendor." v2.0.2 demonstrates the project is not dead — a maintainer merged a real fix and took a community contribution — but it also demonstrates that the gap between releases is measured in years, so it cannot be relied on for time-sensitive compatibility work. Keep the "vendored responsibility" posture: assume we will apply our own patches for future Nova or Laravel compatibility. Budget roughly a few engineer-days per Nova major upgrade to validate and, if needed, patch; v2.0.2 reduces the risk that the DependsOn path specifically is the thing that breaks, but does not reduce the budget. The fork should live in a private repository or a VCS composer entry from day one, forked at v2.0.2, so that a patch is a normal PR rather than an emergency vendor-directory edit. Keep the diff against upstream minimal and documented; a heavily modified fork is a worse long-term asset than a purpose-built field.
Support
No vendor SLA, no paid support, no meaningful issue throughput — this release does not change that, though it does show the issue tracker is not entirely unread. Internal users reporting "the dropdown doesn't load" will still route to our team. Mitigate with a short internal note: what the field is, which resources use it, how to revert to stock Select, and who owns it. Treat community answers as unavailable and write our own troubleshooting entry for the predictable cases — remote endpoint failure, Nova asset cache staleness, and (newly worth documenting) dependsOn chains that stop re-rendering after a deploy, since that is now a recently-churned code path.
Scaling
Well-behaved at the low end, and the remote-loading path is precisely what makes it scale for large option sets — a paginated search endpoint beats eager-loading thousands of options into a page payload. Two scaling limits to watch: the search endpoint becomes a per-keystroke query source, so it needs debouncing, a result cap, and an index on the searched columns; and per-instance asset compilation grows trivially with one more field component, which is a non-issue. Horizontal scaling is unaffected — there is no new stateful service. Concurrency risk sits entirely on the search endpoint, not on the field itself. dependsOn chains add client-side request amplification on nested fields; cap and debounce there too.
Failure modes
dependsOn path but does not change the category. Mitigation: compatibility gate before every Nova bump, plus a tested one-line revert.nova:publish/asset build is in the deploy pipeline and that deploy ordering is asset-before-traffic.Ramp-up
Near-zero for anyone who knows Nova fields — the API surface mirrors stock Select, so developers can be productive in an hour. The real ramp-up is operational, not technical: on-call needs to recognize this component as a distinct failure domain, and the search endpoint (if adopted) is a new backend surface that needs monitoring, auth review, and query-performance ownership. A short internal runbook plus the compatibility matrix covers it. Do not let the low code-level complexity obscure the fact that this is a sporadically-maintained third-party component inside a paid, closed-source framework — v2.0.2 is a welcome signal but not a guarantee of future responsiveness, and the governance cost, not the engineering cost, is what needs a named owner.
How can I help you explore Laravel packages today?