marshmallow/nova-date-range-field
marshmallow/nova-date-range-field is a Laravel Nova field that adds a date range picker for selecting start and end dates. It helps manage date ranges in Nova resources, useful for admin forms and filters.
Architecture fit. Unchanged in substance: this is a presentation-layer plugin for Laravel Nova, the first-party (Laravel-owned) admin panel. A Nova field is a thin contract — a PHP class extending Laravel\Nova\Fields\Field declaring resolve/fill, plus a Vue component and a compiled asset bundle registered through Nova::script() or the package's service provider. It belongs in the admin surface only and should never be a dependency of domain, API, or reporting code. That keeps blast radius low if the field persists to two ordinary date/datetime columns. If it persists a serialized range into a single JSON or string column, the decision escapes the admin layer and constrains exports, BI, whereBetween reporting, and any future non-Nova UI. The release notes do not touch persistence, so confirming the storage contract remains the single highest-value task before committing.
Integration feasibility. The major feasibility blocker identified previously — Nova 5 compatibility — is now addressed. PR #5 ("added support for nova 5") ships in 5.0.0, so the package is viable on current Nova. The version jump from 1.0.6 to 5.0.0 is the more consequential detail: the maintainer has adopted a numbering scheme that tracks the Nova major (a common convention in the Nova add-on ecosystem). The practical implication is that Nova 4 and Nova 5 are now on divergent major lines, and we must not assume a single release supports both. Mechanically it remains a composer install, provider auto-discovery, asset publish, and one line in fields(). The wiring is hours; the risk sits in tag hygiene and in whether the 5.0.0 branch carries forward the 1.0.6 bugfix and the Vue 3 / Inertia asset pipeline correctly. Note the changelog's compare link is v1.0.6...5.0.0 — inconsistent tag prefixes suggest loose release hygiene, so verify the actual Packagist versions and their composer.json Nova constraints rather than trusting the notes.
Technical risk. Materially improved but still thin on ecosystem signal: 3 stars, 0 dependents, a score of 0.105, single publishing organization (Marshmallow, a Dutch agency with a broad portfolio of small Nova add-ons). Two positive data points now exist where there was previously inference:
Undefined array key) came from @shuvroroy, a first-time contributor outside the agency, and was merged. That is weak but real evidence of a maintained issue queue rather than a dormant repo.Still absent from the metadata: any declared test suite or CI matrix, any stated Nova/PHP/Laravel support range, and any community canary traffic. The compiled dist/ bundle remains an opaque supply-chain artifact whose reproducibility from the Vue source we cannot confirm. A six-month Nova-major lag is acceptable for an admin field but should be treated as the expected window, not a worst case — plan the Nova upgrade runbook around it. If the host app is still on Nova 4, the risk shifts: 1.0.6 is now a legacy branch, and it is unclear whether the PR #2 bugfix was backported to it.
Key questions to answer before adoption.
Undefined array key fix backported to it? What is the support policy for Nova 4 users?v1.0.6 vs 5.0.0 prefix inconsistency)?dist/ build reproducibly from it against the Vue 3 / Inertia pipeline Nova 5 requires?end >= start), and is that server-side or client-only?Stack fit. The assumed target is a Laravel 10/11/12 application on Nova 5, PHP 8.1+, using the standard Nova resource pattern. Fit is now good on Nova 5, which was previously the open question. Fit remains good on Nova 4 via the 1.0.x line, but with the caveat that it appears to be a frozen branch and should be treated as a short-term bridge rather than a supported platform. Fit degrades sharply if the host app has central-timezone storage conventions the field does not respect, or if range data is already consumed by reporting queries that assume a specific column layout.
Migration path. The three postures are unchanged, with version-pinning guidance added:
composer require marshmallow/nova-date-range-field, publish assets, use the field class directly in resources. Fastest; every call site now names a third-party namespace.App\Nova\Fields\DateRange extends Marshmallow\...\DateRange) and reference only the local class in resources. Swapping packages, forking, or replacing with a hand-rolled pair of Date fields becomes a one-file change with zero resource churn. It also gives a natural place to enforce app-wide timezone and range-validation defaults, and — now that the upstream major version tracks the Nova major — a single place to absorb the next namespace or API shift.If the existing UI is two separate Nova Date fields, the data model likely already matches what this field wants, making the swap presentational and reversible. If a single-column format is in play, treat it as a schema migration with a backfill and dual-read window, not a UI swap.
Compatibility and sequencing. The Nova 5 constraint is now satisfiable, so this moves from "hard stop" to "verify." Sequence:
composer.json at tag 5.0.0, the README, and the Vue source; answer the storage, timezone, and Nova 4/5 support-scope questions. Confirm Packagist tag names match the changelog.^5.0; Nova 4 host → ^1.0 with an eye on the Nova 5 upgrade as the forcing function.nova:publish/build pipeline and does not collide with app-side asset compilation.composer.lock and add a note to the Nova upgrade runbook, including the ~6-month observed lag for Nova-major support as the planning assumption.Note that a future Nova 6 upgrade becomes a coupled upgrade: Nova and this package must move together, and the admin field will block the Nova bump until upstream ships.
Maintenance. Low ongoing effort in steady state — a pinned dependency with no runtime services. The 5.0.0 release improves the outlook by demonstrating the maintainer does track Nova majors, which was previously unproven. The real cost remains event-driven: every Nova major triggers a compatibility review gated on the maintainer's responsiveness. Budget a half-day per Nova major plus the observed ~6-month upstream lag in the upgrade plan, with the local wrapper making a revert to two Date fields a contained change. Track the upstream repo for release activity; a 12-month silence on a Nova-adjacent package should be treated as an abandonment signal. Watch specifically whether the 1.0.x branch receives further fixes — silence there while 5.x advances is the leading indicator of an EOL'd Nova 4 path.
Support. Self-supported. The package is small enough that the source is the documentation, which is acceptable for a field of this size, but there is no vendor escalation path for picker edge cases. The merged external bugfix is a mild positive for issue responsiveness. Establish internally who owns the wrapper class and the timezone convention, since both are application-level decisions the package will not make for us.
Scaling impact. Negligible on the server: this is a form input, not a data-processing component. The only scaling-relevant concern is query shape — if range data is filtered with whereBetween in Nova filters or dashboards, ensure the underlying columns are indexed and the range predicate is sargable. Client-side picker performance is irrelevant at any realistic admin concurrency.
Failure modes.
| Failure | Trigger | Blast radius | Mitigation |
|---|---|---|---|
| Field stops rendering after Nova upgrade | Nova 6 released, package unpatched | Resources using the field break | Local wrapper; revert path to two Date fields; plan ~6-month lag |
| Nova 4 line silently frozen | Maintainer focuses on 5.x, 1.0.x unmaintained | Nova 4 hosts accrue unfixed bugs | Treat 1.0.x as a bridge; schedule Nova 5 upgrade; fork if needed |
| Bugfix not backported | PR #2 merged only to 5.x | Known Undefined array key defect persists on Nova 4 |
Verify changelog scope; test the specific failure path |
| Version/tag confusion | Inconsistent tag prefixes (v1.0.6 vs 5.0.0) |
Wrong version resolved; assets mismatched to Nova major | Pin exact tag in composer.lock; verify Packagist |
| Compiled asset overwritten or missing | nova:publish / app build pipeline |
Field renders blank or stale UI | Pin asset tag; document publish step; CI smoke test |
| Vue 2 asset residue | Bundle not rebuilt for Vue 3 / Inertia | Field unusable on Nova 5 despite declared support | Rebuild from source in the spike; verify in browser |
| Timezone drift | Server/app/user tz mismatch at day boundaries | Off-by-one-day range records, wrong reports | Explicit tz convention, server-side validation, test at DST edges |
| Storage mismatch | JSON/single-column persistence discovered late | Schema rework, downstream query breakage | Answer storage question in step 1 |
| Validation gap | Client-only range ordering | Invalid ranges persisted | Enforce end >= start server-side in the FormRequest |
Ramp-up. Low: a Laravel developer familiar with Nova understands this field in well under an hour, and the wrapper class keeps the learning curve confined to whoever owns that file. The non-obvious knowledge — timezone convention, the asset publish step, and now the Nova-major-to-package-major version mapping — should be written into the team's Nova conventions doc rather than left in a PR description. Overall this remains a reasonable, cheap, contained bet for an admin-only date range input, and 5.0.0 improves the case by resolving the Nova 5 question and demonstrating Nova-major tracking; the low ecosystem-maturity signal still argues for the wrapper, an exact version pin, and confirming the storage contract before adopting.
How can I help you explore Laravel packages today?