outl1ne/nova-multiselect-filter
A Laravel Nova filter package that adds a searchable multiselect dropdown, letting users filter resources by several values at once instead of only one. It's a simple drop-in replacement for Nova's default filter UI, easy to install, configure, and customize for any resource.
Architecture fit. This package is a narrow, additive Laravel Nova extension: a PHP filter class plus a Vue component that renders a searchable multi-select control and hands the selected values to apply(), typically as a whereIn. It introduces no service, datastore, queue, or scheduled work, and it lives entirely inside Nova's existing filter pipeline on the admin plane. That shape is the core of the TPM case: the blast radius is confined to an internal UI surface, removal is a Composer removal plus deleting filter registrations, and the decision can be made incrementally rather than as a platform commitment. The corollary is equally important — it should not be scoped or sold as a general query-builder, saved-view, or reporting-filter capability. If the roadmap need drifts toward those, this package is the wrong tool and the decision should be re-opened rather than stretched.
Integration feasibility. Engineering cost is genuinely small: composer require, a filter class extending the package base, an options() method, an apply() method, and registration in a Resource's filters(). No migrations, no config publishing, no data backfill. The real gate is compatibility, not effort: Nova major version, PHP version, and the Vue major that the installed Nova ships. Nova's filter and front-end contracts are not a stable public API, so the package's tested-version claims and release history are the best available proxy for fit. Note the metadata quality issue — the listed last release (2026-10-27) is future-dated and the composite score is low (22.69) against 46 stars and 0 listed dependents. That combination must be reconciled against actual repository tags, changelog, and composer.json constraints before a pilot is scheduled. It is a due-diligence item, not a blocker, but it should not be waved through.
Technical risk. Four risks matter at the TPM altitude:
The MIT license and small code surface make forkability high and lock-in low — that is the primary mitigant and the reason this can be approved as a tactical dependency at all.
Key questions.
apply() target a plain column, a JSON field, or a relationship, and is that documented and configurable?options() resolvers respect authorization, tenant scoping, and per-user visibility? Leaking option labels across tenants is a compliance issue, not a UX nit.Stack fit. Appropriate only where Laravel Nova is already the admin surface — a Laravel monolith with Nova on top, or a Nova admin layer over an existing application. It adds no value for Filament, bespoke admin UIs, or separate reporting/BI tools. If the requirement is single-select filtering only, Nova's built-in SelectFilter likely suffices and this package should not be adopted at all. Getting this "no" decision recorded is part of the TPM's job, not an afterthought.
Migration path. Low-risk and additive, with a clean rollback. The right path is a feature-branch dependency, registration on one low-traffic Resource, validation of rendered UI and generated SQL against production-like data, then expansion Resource by Resource. There is no data migration and no customer-facing surface, so the decision can be staged rather than bought whole. That property — cheap to try, cheap to reverse — is the main reason to run the experiment rather than debate it.
Compatibility. Before committing, confirm the package's supported Nova range against the installed Nova, confirm PHP version fit, confirm the Vue component targets the same Vue major Nova ships, and check for conflicts with existing filter packages, custom filter components, lenses, or toolbar customizations that alter filter rendering. Compatibility verification is the primary engineering cost of adoption and should be estimated explicitly rather than assumed to be near zero. Pin the version in composer.json from day one.
Sequencing. Frame this as a gated pilot with explicit exit criteria:
Maintenance. Steady-state maintenance is low because the footprint is small, but the package rides on Nova's internal filter APIs, which are not a stable contract. The correct budgeting model is verification time at every Nova upgrade, not continuous maintenance. Pin the version, keep a fork-ready posture, and treat the low dependent count plus the questionable release metadata as a prompt to check maintainer health before adoption. If upstream activity is thin, plan for internal ownership rather than assuming community support will carry it.
Support. Community-supported, not vendor-supported. Outl1ne's Nova portfolio is reassuring but does not constitute a commitment. Assign ownership explicitly: one PHP/Laravel engineer who can read and modify the filter class, and one front-end-capable engineer who can touch the Vue component. Without that pairing the package becomes a single-person dependency sitting in a workflow internal users touch daily — an availability risk, not just a code risk.
Scaling. Runtime cost is dominated by the generated query, not the package. Multi-select filters can produce large IN clauses; ensure filtered columns are indexed and cap or paginate option lists where cardinality is high. The UI does not inherently paginate options, so very large option sets degrade admin page loads. Option resolvers that hit the database run during index serialization and should be cached or kept cheap. This is admin-plane scaling — invisible to customers, but visible to the users whose productivity the pilot is supposed to prove.
Failure modes.
empty($value) and validate against production-like data.options() as a security-relevant surface, not a convenience.Ramp-up. For a Laravel developer, usage is learnable in under an hour: install, extend the base filter, define options, implement apply(), register on a Resource, test. The TPM's leverage is concentrated at the pilot and governance layer — bounding scope, pre-committing success metrics, assigning ownership, and scheduling compatibility checks into the Nova upgrade cycle — rather than expecting engineering to absorb indefinite upstream risk. Front-end customization or repair is a separate skill requirement and should be planned for, not assumed.
How can I help you explore Laravel packages today?