rpj/daterangepicker
Laravel package that adds a ready-made date range picker field to Blade forms, wrapping the popular daterangepicker widget with sensible defaults and server-side parsing so you can collect, validate, and read start/end dates cleanly in PHP.
Architecture fit. The package is a thin UI adapter with a query-building tail: a service provider, a config file, publishable assets, and one filter/field class. It does not touch the domain layer, request pipeline, middleware, or persistence. That makes architectural coupling genuinely low — the risk is not "this reshapes our application," it's "this is a small, unmaintained artefact sitting on a screen operators use daily."
Fit is conditional on which artefact actually ships. The repository description describes a generic Laravel Blade date-range component (configurable formats, presets, locale, publishable assets); the release notes describe a Laravel Nova 4 filter. Those are different products with different integration points (NovaServiceProvider::filters() / a resource's filters() vs. a Blade view). Resolving this is the first gate, not a footnote — it determines whether the package is usable outside Nova at all.
Integration feasibility. Engineering effort is low (hours, not days). The real cost is verification: reading shipped source, a staging install against Nova 5, asserting the emitted SQL, and a license review. If diligent verification exceeds roughly one to two days — the cost of building the equivalent Nova field in-house — "build" wins by default. That's the honest break-even.
Technical risk, ranked:
null — none of these throw.whereBetween('created_at', ...) on an unindexed column full-scans.Key questions to answer before committing:
Nova\Filters\Filter, Nova\Fields\Field, or a plain ViewComponent?apply() receive, and does it fail open or closed on blank input?$to inclusive of the full end day? Which timezone is the user's selection parsed in?created_at indexed on every target table? Do we cap the selectable range server-side?composer why-not rpj/daterangepicker 0.0.11 and composer why-not laravel/nova ^5 come back clean?Stack fit. Laravel + Nova 4/5 on PHP 8.x. Nova's private Composer repository must be reachable from every environment — every Docker build, CI runner, and fresh laptop needs NOVA_USERNAME/NOVA_PASSWORD or an auth.json. The resulting "package not found" failure looks like the daterangepicker's fault and is not; call this out in the runbook before the first CI failure.
Migration path and sequencing. Treat this as a follow-on to the Nova 4→5 upgrade, not a bundle with it. Release 0.0.11 only widens a constraint; that positioning is plausible but unverified. Bundling the two means a broken admin panel with two plausible causes.
Recommended sequence:
vendor/rpj/daterangepicker/src/ and composer.json on a scratch branch — five minutes, resolves the artefact question.nova:publish, optimize:clear, hard-reload.parseRange() method.filters().Compatibility discipline. Pin exactly — "rpj/daterangepicker": "0.0.11" with no caret or tilde. At 0.0.x, both operators permit breaking changes on a patch bump. Disable Dependabot auto-merge for this package explicitly, and require a human to read the diff on every bump. If a transitive illuminate/* pin conflicts, it can block the whole Nova upgrade, not just this feature — hence the sequencing above.
Fallback path. Two options, both cheap: (a) build the filter in-house (~1–2 days plus permanent ownership of ~200 lines of Vue/serialization), or (b) add a repositories entry pointing at a VCS fork you control, so "maintainer disappears" is a composer require change rather than an incident. Choose one before production, and confirm what state the package publishes (config, migrations, compiled assets) — that's the state you now own across Nova upgrades.
Boundary hygiene. Keep the picker dumb. Validate from/to server-side with date|before_or_equal:to; never trust a client-supplied combined string like "2025-01-01 - 2025-01-31" without re-parsing. For queued exports, pass the already-resolved range into the job payload as ISO-8601 strings — jobs that re-derive their own range silently shift boundaries between click and worker run.
Maintenance. Single maintainer, zero dependents, no test suite, no CI matrix, one-line release notes. This belongs in the "single-maintainer utility" tier: pinned exactly, excluded from business-critical paths, and assigned a named owner who reviews it on every Nova major release. Write that into the upgrade checklist now, while the context is fresh — otherwise it becomes tribal knowledge that leaves with whoever integrated it.
Support. None stated. Assume self-support: budget reading the shipped source on every version bump, and keep the fork mirror warm. The extension points are clean (subclass the shipped filter, override apply()/options(), publish and edit config, override the Vue component only if forced). The moment anyone patches files in vendor/, you've taken ownership of a package you didn't want to own.
Scaling. The cost centre is the query, not the component. Confirm an index on created_at on every target table before enabling a three-year range against a table with millions of rows, and cap the range server-side (e.g., reject ranges over 366 days) rather than trusting the UI to be sensible. For large exports, chunk the read and push to a queue rather than running a wide whereBetween synchronously in an admin request.
Failure modes. Dominated by silence, which is the expensive kind:
nova:publish, then hard-reload, then check public/vendor/ for the package's assets. Nine times in ten it's stale compiled JS.null → serialization change on a Nova minor bump.illuminate/* pin conflict.Mitigate with two cheap tests in CI: a contract test asserting the emitted SQL and bindings for an inclusive day range, and a one-assertion smoke test that the filter registers on the resource. Those convert "operator finds it in a browser" into "CI finds it in a merge."
Ramp-up. Low for any Laravel developer — an hour to read the source, half a day to land the first screen. The hidden cost is debugging Nova's asset pipeline, which is unfamiliar territory for most backend developers and where the majority of integration time actually goes. Budget for that, not for the PHP.
Portfolio position. This supports a small, well-bounded admin UX capability, not a platform bet. The defensible case for saying yes is blast-radius containment: admin plane only, no public request path, no data-plane writes. The same signals — 5 stars, 0 dependents, no tests, GPL-3.0 — would disqualify it in a customer-facing service. Approve it as a scoped feature enabler with a named owner and a fork fallback; do not let it become load-bearing.
How can I help you explore Laravel packages today?