gekich/nova-range-filter
A Laravel Nova filter package that adds range-based filtering to Nova resources, letting users narrow records by numeric or date ranges from the filter panel. A small, low-adoption add-on for simple interval filtering in admin panels.
Architecture fit. The package occupies a well-defined extension point in Nova: a Laravel\Nova\Filters\Filter subclass with an accompanying Vue component that emits a {min, max} payload, applied server-side as a whereBetween (or equivalent) on the resource query. Nova filters are registered per-resource via filters(), so adoption is additive — no core modification, no service-provider coupling beyond asset registration. Architectural footprint is genuinely small: likely one filter class plus one compiled JS asset. That is the package's only real strength.
Integration feasibility. Low effort in the happy path: composer require, publish assets, add the filter to a resource's filters() array, pass a column name. Realistically 1–4 hours for a first filter, under a day for a resource group. The blocker is version scope: the description scopes to "Nova v3+", but Nova 4 moved to Vue 3 / Inertia and a different asset pipeline (nova.mix), and Nova 5 continues that lineage. A v3-era compiled component will not reliably mount in a Nova 4/5 filters panel. This is the decisive feasibility question.
Technical risk. High, concentrated in ownership rather than code quality:
| Risk | Severity | Note |
|---|---|---|
| Archived upstream | High | No patches, no security response, no Nova 4/5 support |
| Adoption (1 star, 0 dependents) | High | Effectively unexercised in production; edge cases unvalidated |
| Compiled JS asset | Medium | Opaque, unauditable, carries stale frontend deps |
| Type handling | Medium | Int/decimal/date/null semantics are the usual failure surface for range filters |
| Supply chain | Low–Medium | Old Packagist release, possibly abandoned-flagged |
The code is small enough that "risk" is really "you will own it." That is a fork-and-maintain decision, not a dependency decision.
Key questions.
apply() signature and asset the v3 generation only?min > max?whereBetween on the raw column, and does it compose correctly with soft deletes and other active filters?Stack fit. Clean only on Laravel 8/9 + Nova 3 with an existing filter-driven admin. On Nova 4/5 or PHP 8.2+, treat as incompatible until proven otherwise.
Migration path. Three viable routes, in ascending cost:
app/Nova/Filters, keep the MIT attribution, drop the Composer dependency. Preserves the UI work, removes the abandonment risk, and gives us the patch surface. Preferred default.RangeFilter base class plus a small Vue component is ~1–2 engineer-days against Nova's documented filter API. Worth it if we need Nova 4/5 or custom type handling.Compatibility. Verify against the pinned Nova version before commitment. Confirm the filter class signature matches our Nova major, and confirm assets publish and render in the filters dropdown. Run it on one resource, not the whole admin.
Sequencing.
toSql()/query log.whereBetween clause, tag it internally.Maintenance. Upstream maintenance is zero — archived, single star, no dependents. Every future Nova upgrade becomes our problem. Whether adopted or forked, budget for someone owning the Vue component and its Nova-major compatibility. A fork is cheap to hold but accrues a small, permanent tax.
Support. No vendor, no community, no issue backlog to lean on. Internal documentation of the fork and its query semantics is mandatory, not optional.
Scaling. The filter itself is O(1) overhead — a single predicate appended to an already-bounded index query. The real scaling risk is database-side: whereBetween on an unindexed column turns a filtered index view into a table scan. Confirm composite indexes exist on (tenant/scope columns, filtered column) before enabling on large tables. This is the most likely production regression and it will look like the package's fault.
Failure modes.
min > max returning empty sets.>= null style predicates.Each is cheap to prevent with one integration test on the generated query plus one UI smoke test.
Ramp-up. Negligible for a Laravel/Nova-fluent engineer — hours. The cost is not learning the package; it is the decision overhead of carrying an archived dependency and the discipline to fork it the moment the first patch is needed.
Recommendation. Do not adopt as a live Composer dependency. Treat it as reference implementation: spike it, then vendor the code or reimplement against Nova's filter API. The opportunity signal (6.81) reflects a real gap — Nova lacks a polished range filter — but this package's adoption profile (1 star, 0 dependents, archived) means we are buying a starting point, not a maintained component.
How can I help you explore Laravel packages today?