Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Nova Time Field Laravel Package

laraning/nova-time-field

A Laravel Nova custom field that adds a clean time picker to your resources, letting you store and edit time-only values with ease. Simple to install and configure, it integrates seamlessly with Nova forms, detail, and index views.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • The package is a thin subclass of Laravel\Nova\Fields\Field plus a compiled Vue 2 component wrapping flatpickr. There is no service layer, no schema, no config file, and no migration surface — it is a presentation-layer dependency that plugs into the existing Nova resource contract.
  • It fits only teams already standardized on Laravel Nova, and realistically only the Nova 3-era field API. It does not drive Nova adoption, and it does not expand the platform's capability beyond "time-of-day input rendered correctly in the admin panel."
  • The functional boundary is narrow and honest: pick a time of day, render it back. It explicitly does not own timezone semantics, date+time composition, ranges, recurrence, or duration math. Those remain product and model-layer decisions, which is the right split for a UI helper.

Integration feasibility

  • Low effort. composer require laraning/nova-time-field:^1.2, then use Laraning\NovaTimeField\Time; in a resource's fields() method. Package discovery handles asset registration if the provider calls Nova::script() / Nova::style().
  • The PHP side is small enough that "read src/Time.php" is a legitimate discovery step, not a code audit. A TPM can fund an hour of engineering review and get a complete behavioural picture: format methods, nullable handling, seconds toggle, component override.
  • The real integration cost is not installation — it is the smoke test and the acceptance criteria around time semantics (display format vs. stored precision, nullability, validation rules).

Technical risk

Risk Severity Notes
Nova 4/5 incompatibility High Prebuilt dist/ bundle is a 2020-era Vue 2 artifact with no reproducible build path on our toolchain. Symptom: field registers but renders blank, or 404 on the compiled JS.
Stale release cadence High Last release 2020-11-29. No security-patching SLA, no maintenance commitment, no upstream responsiveness expectation.
handleChange signature deviation Medium v1.2 overrode Nova's handleChange to fix a JS exception, with the maintainer explicitly noting it does not match the Nova method signature and would be "optimised later." Anything riding Nova's change pipeline (dependsOn, reactive hiding, readonly toggles) is suspect.
Timezone drift Medium The picker emits a wall-clock string with no timezone. Carbon-casting the attribute makes Laravel interpret it in app.timezone, producing off-by-one-hour bugs.
Seconds precision mismatch Medium Display and storage precision are configured independently; TIME(0) with a seconds picker truncates silently, TIME(6) with H:i yields 10:15:00.000000 in queries.
Empty string vs. null Low A cleared picker may submit '', which fails date_format:H:i and can break sortable() ordering.
Zero dependents / no support corpus Medium 61 stars, 0 dependents. Issue searches come up empty; every failure is an investigation, not a lookup.

Key questions to resolve before approval

  1. Which Nova major are we on, and is an upgrade on the roadmap? This single answer determines whether the package is a drop-in or a vendoring project.
  2. Are the times we store wall-clock values or timezone-bound datetimes? If the latter, this field is the wrong tool and no amount of configuration fixes it.
  3. What precision is the contract? Seconds or not — decided once, applied in the field, the validation rules, and the migration together.
  4. Who owns the fork if the upstream goes quiet? A named engineer and a budgeted vendoring effort, or the package does not ship.
  5. Is this on a critical path? If time entry gates a revenue or compliance workflow, treat it as internal code from day one.

Integration Approach

Stack fit

  • Requires an existing Laravel + Nova installation. Verify compatibility mechanically before writing field code: open the package's composer.json and compare its laravel/nova constraint against the installed Nova version. Let Composer be the first gate — a blocked install is a clean, cheap signal.
  • No new runtime services, no queue workers, no storage dependencies. Footprint is one Composer entry plus a published JS asset.

Migration path

  1. Pin. laraning/nova-time-field:^1.2. Do not target dev-master on a package with a multi-year release gap.
  2. Spike on a throwaway branch. Install, register one field on one low-traffic resource, and confirm the asset loads (browser network tab before anything else).
  3. Smoke-test the round trip. Create, save, edit, inspect the raw column. Five minutes of work that catches the majority of real failures, because most reported "UI bugs" are storage-format bugs.
  4. Vendor if any gate fails. Copy the PHP field and Vue component into app/Nova/Fields/ or nova-components/, rebuild against our own toolchain, and restore a standard handleChange. A few hours of engineering; it eliminates the largest ongoing risk and is the recommended end state for anything with a Nova upgrade on the roadmap.

Compatibility

  • Gate the rollout on Nova 3-era API compatibility, not on the package description. Treat a blank render or console error about an unknown component as a version mismatch, not a bug to debug.
  • If dist/ assets belong under public/vendor/, run php artisan nova:publish as part of the documented install steps — missing compiled assets are far more common than logic defects.
  • Re-verify dependsOn / reactive visibility explicitly if used. The v1.2 override touches exactly that path.

Sequencing

Phase Deliverable Exit criteria
0 — Discovery Nova version confirmed, src/Time.php read, method names verified against the installed tag Written note of the actual public API; no reliance on the README
1 — Spike Field on one throwaway resource, create/edit/detail/index all exercised Round-trip test passes; raw DB value asserted
2 — Pilot One real internal feature (shift planning, appointment slots, operating hours, time logging) Product acceptance criteria for nullability, precision, and validation signed off
3 — Standardize or vendor Either a documented usage pattern, or a vendored copy owned by the team Ownership assigned; upgrade runbook written

Ship the pilot to one workflow, not to every time-based field at once. The dependency is cheap to evaluate and cheap to remove; sequencing it as a per-field convenience keeps both options open.

Minimum usage pattern

Time::make('Opens At', 'opens_at')
    ->rules('nullable', 'date_format:H:i')
    ->sortable(),

Plus one assertion that pays for itself on every Nova upgrade:

$this->assertSame('09:30:00', $slot->fresh()->getRawOriginal('opens_at'));

Operational Impact

Maintenance

  • No release cadence to plan around. Budget the package as "usable with contingency," not dependable and not abandoned.
  • Assign a named owner. The maintenance task is not patching — it is re-verifying on every Nova upgrade and on every Laravel major, and being ready to vendor.
  • The v1.2 handleChange workaround is technical debt inherited at install time. Do not carry it forward into a fork; replace it with the correct signature.
  • No configuration surface exists (no config/, no migrations, no publishable settings). All behaviour is per-field in the resource. If anyone starts looking for a config file, the answer is no — stop.

Support

  • External support is effectively zero: 61 stars, zero dependents, no troubleshooting corpus. Issue searches will return nothing useful.
  • Institutionalize knowledge instead: one engineer reads the entire package once (an hour), and the resulting notes become the runbook. Any future failure then becomes a fix rather than an investigation.
  • Document the debugging order so on-call does not improvise: browser console → network tab for missing compiled asset → nova:publish → composer show laraning/nova-time-field to confirm installed version → raw database value → validation output.

Scaling

  • Negligible runtime cost. It is a form widget and a string renderer; there is no query amplification, no background processing, no per-request overhead beyond the asset load.
  • sortable() works because the underlying value is a plain string sorted by the database — this scales fine but makes column type and precision decisions load-bearing for index-view ordering.
  • The scaling constraint is organizational, not technical: the more resources that adopt the field, the larger the surface a Nova upgrade has to re-verify. Keep adoption deliberately scoped.

Failure modes and triage

Symptom Likely cause First action
Field renders blank Nova 4/5 vs. Vue 2 bundle mismatch Console + network tab; treat as vendor signal
404 on field JS Asset not published php artisan nova:publish
Time off by one hour Carbon cast interpreting wall-clock in app.timezone Store as string/TIME; convert only at the boundary
Seconds silently dropped TIME(0) column with seconds picker Align precision across field, rules, migration
Save fails on cleared field '' submitted to NOT NULL column nullable in rules; normalize '' to null
dependsOn misbehaves v1.2 handleChange signature deviation Re-test on every Nova upgrade; fix when vendoring
Sort order looks wrong Empty strings vs. nulls in the column Normalize nulls; verify raw values

Ramp-up

  • Engineer: roughly one hour to read the package and one spike session to integrate. Method names must be verified against the installed tag — field packages differ and the README will not save you.
  • Product: the real ramp-up is deciding semantics, not learning the tool. Acceptance criteria to settle before the first shipping resource:
    • Display format (12/24-hour, seconds) — cosmetic, does not change parsing.
    • Stored precision, applied consistently in field, validation, and schema.
    • Nullability contract, including what a cleared picker submits.
    • Whether the value is a wall-clock time or a timezone-bound timestamp.
    • Which workflows are in scope: appointment slots, shift planning, operating hours, time logging — and explicitly not timezone-aware scheduling, recurring events, or duration math.
  • Stakeholder line: a low-cost MIT-licensed field that saves engineering hours on simple internal time-entry screens; not a strategic platform component. Approve as a tactical dependency for non-critical workflows, with a standing contingency to vendor or replace if time features become business-critical or a Nova upgrade lands.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
octoberrain/html
octoberrain/extension
octoberrain/exception
octoberrain/contracts
frankyso/ipaymu
3mdikram/worldmoneywords
snowsoft/config
itmosoft/laravel-subscriptions
larva/laravel-ai-qwen
diephp/sequences
users-au/socialite-provider
twidpay/twid-logger
mrnewport/laravel-plaid
mrnewport/laravel-repo
mrnewport/laravel-docsign
mrnewport/laravel-stow
mrnewport/laravel-flow
mrnewport/laravel-priceable
mrnewport/laravel-nestedterms
fredmeng/laravel-apidoc-generator