ampeco/nova-date-range-filter
A Laravel Nova filter for narrowing resource index queries by date or datetime columns. Add it to a Nova filter panel so users can choose start and end dates and apply the range to supported model fields.
Architecture fit (TPM lens). This is a Laravel Nova filter — a self-contained extension that plugs into Nova's admin-panel filter pipeline and touches nothing else. There are no models, migrations, service providers, queues, or middleware, so there is no cross-cutting blast radius to map. The worst-case failure is one dropdown in an internal tool. That is exactly the profile a TPM wants for a low-ceremony admin utility: cheap to adopt, cheap to contain, and cheap to rip out. The decision is a dependency-policy decision, not an architecture decision.
Integration feasibility. Mechanically trivial — a composer require, then one line in a resource's filters() per filtered column. Zero configuration, zero data work, zero background jobs. The one real prerequisite is a paid Laravel Nova license, which is a procurement gate rather than an engineering one, but it belongs on the decision record because it gates the entire evaluation.
Technical risk (and how to budget it). This is where the TPM attention goes. The last release was 2021-09-28; Nova 4 shipped in 2022 and Nova 5 after that, both carrying frontend and filter-contract changes. A 2021 component is almost certainly pinned to Nova 3.x-era Vue 2 tooling. At 35 stars and zero dependents there is no community absorbing maintenance, and no evidence of recent commits. The concrete risks are: (a) incompatibility with the target Nova major, (b) unmaintained exposure to future Nova breaking changes, and (c) silent failure where the filter renders but emits a malformed or no-op constraint. Separately, modern Nova ships native date filtering, so the package's core reason to exist may already be covered — in which case adding it is a net-negative to our dependency count. All risks are contained to the admin panel; none carry revenue, compliance, or customer-facing exposure.
Key questions for the decision record.
Stack fit. Clean only if the host is on the Nova 3.x-era stack this was built against. On a modern Nova 4/5 stack, assume incompatibility until proven otherwise. Everything else — Laravel 8/9 conventions, Composer autoloading, Vue compiled through Nova's asset pipeline — is standard, so there is no exotic coupling to negotiate. The decision reduces to a version-alignment check, not an architecture review.
Migration path — two options, one recommendation.
app/Nova/Filters/ class, drop the Composer dependency. Removes upstream risk while preserving behavior, and is cheap precisely because the component is small. The TPM framing is simple: choose between a deferred unknown cost (A) and a small known one-time cost (B).Compatibility — validate three things early, deliberately. The Nova major constraint in the package's composer.json, the Vue version Nova's asset build expects, and the declared PHP/Laravel ranges. Given the 2021 release date, expect constraints that conflict with a current lockfile. Composer will surface this in minutes — treat a version conflict as a clean, fast rejection signal rather than something to engineer around.
Sequencing — keep it off the critical path. Slot it as an isolated enhancement, never on a release train: (1) confirm the Nova version and whether native filters already suffice; (2) if a genuine gap remains, spike the in-house vendor path on a branch; (3) validate in staging against real data and real indexes; (4) ship through normal code review with a short decision record. Steps 1–2 are measured in hours, so schedule risk is negligible provided it stays off the release train. That discipline is what keeps a low-value utility from becoming a schedule surprise.
Maintenance. Adopted as-is, ongoing maintenance is effectively zero — which is the problem, not the benefit. There is no upstream to ride, so any future breakage lands on us. The honest accounting is a dependency whose maintenance cost is deferred to the next Nova upgrade. Vendoring converts that unknown deferred cost into a small, known, one-time cost — the better trade for a component this size and the one I would defend to engineering leadership.
Support. No vendor, no issue triage, no peer network — 35 stars and zero dependents means nobody to lean on when it breaks. Mitigation is documentation: record the decision, the Nova version it was validated against, and the fallback (native filters or the in-house class) so the next engineer is not surprised by an unmaintained package sitting in the lockfile. A short ADR is the cheapest insurance available.
Scaling. Irrelevant at the package level — a filter is per-request UI, not a throughput concern. The only scaling-adjacent risk is query shape: a range predicate on an unindexed date column in a large table will slow admin list views as data grows. Verify the index on the filtered column independently of the package — that is our responsibility, not the vendor's, and it is the same work whether we adopt or reimplement.
Failure modes — ranked by likelihood.
All are contained to the admin panel; none touch customer-facing paths; none carry revenue or compliance exposure.
Ramp-up. Near-zero for any Laravel developer — registration is one line in filters(). The real cost is investigation: determining Nova compatibility will likely exceed the effort of reimplementing the filter by hand, which is itself the argument for going in-house. Budget roughly half a day for a Nova-fluent engineer to evaluate and either adopt or vendor, and make the call explicitly rather than letting it drift into the lockfile by default.
Recommendation. Low value, low risk, low justification. Verify native Nova coverage first — that is the most likely reason to skip it entirely. If a gap genuinely exists, vendor the ~100–200 lines into application code, pin nothing, document the decision, and treat the package as reference source and prior art. The pattern is the asset; the package is not.
How can I help you explore Laravel packages today?