vyuldashev/nova-column-filter
A Laravel Nova filter that lets you filter resources directly by their table columns. Configure which columns are searchable and in what order, giving users a quick, native way to narrow down resource lists without building custom filter classes.
Architecture fit. For a TPM the relevant fact is that this is a leaf dependency with near-zero architectural footprint. It hooks only into Laravel Nova's filter extension point — registered in a resource's filters() method, rendering in the index filter panel, appending a where constraint to the index query. No service providers, migrations, published assets, queue or cache surface. That means the adoption is reversible and low-blast-radius: the program risk is not "does this destabilize the platform," it is "is the maintenance ownership worth it." The decisive architectural gate is Nova itself — a commercial per-site licensed product. If the org is not on Nova, the package is dead on arrival and the assessment ends there.
Integration feasibility. Trivial to wire (composer require, one array entry, a column reference), so the engineering effort is not the constraint — governance is. The TPM's job is to frame this as a bounded, timeboxed spike (one engineer, 1–2 days) that produces a go/no-go, not an open-ended platform bet. The two gates that determine go/no-go:
Technical risk. As a program-level risk register:
app/Nova/Filters/ under our namespace and drop the Composer dependency.where must compose with Nova's indexQuery and authorization pipeline so a user cannot filter their way into another tenant's data. Must be verified explicitly, not assumed.Key questions.
composer.json allow them? (Blocking.)indexQuery and Nova's authorization pipeline? (Blocking.)=, like, in, between) or only a single select?SelectFilter/BooleanFilter already cover it and this dependency buys nothing?Stack fit. Laravel + Nova + Composer, nothing exotic. The deploy artifact is a lockfile change; rollback is a revert. No migrations, no external services, no workers. Blast radius confined to Nova index screens on internal admin resources. For a TPM this is the desirable shape: a change one team can ship and reverse without a cross-team release train.
Where it fits. Back-office index screens where operators need ad-hoc narrowing — status, tenant, region, created-at buckets, partial email/phone lookups — on the long tail of resources that do not each justify a bespoke filter class. It is a convenience shim, not a platform primitive. Explicitly out of scope and to be stated as such to stakeholders: relationship filters, multi-select across related models, authorization-sensitive views, and full-text relevance (use Nova search/Scout).
Migration path (milestones).
app/Nova/Filters/, verify the license permits it, drop the Composer dependency, own it outright. One readable file is cheaper to own than to track.SelectFilter, plus a mandatory indexed-column rule and a review-checklist item for column allowlisting.Compatibility. Check PHP, illuminate/support, and laravel/nova constraints together. Because Nova resolves from nova.laravel.com, CI needs Nova credentials — verify the package's constraints don't create a resolution conflict that blocks deploys (a failed composer update in a pipeline is an outage for admin tooling). Confirm the target Nova major before investing beyond the source read-through.
Sequencing (with gates).
Maintenance. Effectively ours from day one. With zero dependents there is no community to absorb Nova upgrades — budget a few hours per Nova major, or vendor the class and stop treating it as an external dependency. Be explicit with stakeholders that the ongoing ownership cost exceeds the original acquisition cost; it is small but real, and it belongs in the admin-tooling line item, not assumed away. Prefer vendoring over a floating dependency so upgrades are an explicit decision rather than automatic lockfile drift.
Support. No vendor, no SLA, no CVE pathway. Internal owner is the admin-tooling or platform team. Keep it on the admin-tooling on-call surface, not the core product surface. Establish a policy call — once — on third-party code in admin paths that touch PII: pinning, vendoring, and auditing rules. That decision outlives this package and is the durable output of this evaluation.
Scaling. Scales in the direction that matters: adding resources and columns is cheap configuration, which is the whole value proposition. It does not scale into complex filtering (relationships, cross-model, authorization-aware scoping) — pushing it there generates the exact fight-with-the-framework work it was meant to eliminate. Enforce the boundary: indexed columns only, allowlisted columns only.
Failure modes to plan for.
indexQuery/authorization composition before rollout.SelectFilter/BooleanFilter.Ramp-up. Low and bounded: one reference filter plus a documented pattern, a code-review checklist, and a short convention note cover the team. Plan for the TPM-facing communication: executives get the one-paragraph "cheap accelerator, timeboxed spike, downside bounded to 1–2 engineer-days, upside measurable in reduced admin-tooling tickets"; engineering gets the "vendor, pin, test, audit injection and scoping before ship" brief. If the source audit turns up anything uncomfortable, the fallback — write the equivalent ourselves in 3–5 days — is already budgeted and low-cost, which is what lets this stay a cheap experiment rather than a platform bet.
How can I help you explore Laravel packages today?