optimistdigital/nova-inline-text-field
A Laravel Nova field that lets you edit text values directly in the resource index table. Click a cell, type, and save without opening the detail page, making admin updates faster and keeping data entry inline, simple, and frictionless.
Architecture fit. This is a single-purpose Nova field, not a subsystem: one PHP field class plus a Vue component, no config file, no migration, no service to operate. For a TPM that is the entire architectural argument — the integration surface is one line in a resource's fields() and the blast radius is one column on one admin screen. It fits wherever Nova already owns the admin surface; it does not fit anywhere else. There is no path to reusing it in a customer-facing UI, and attempting that is a scope error, not an engineering challenge.
The one thing to resolve before anything else. Our sources disagree on what the package is. The description and PM notes describe inline editing from the index (click, type, AJAX save). At least one internal review reads it as a display-only presentation helper. These are different products: an editable field raises validation-bypass, authorization, and audit-trail questions; a display-only field raises essentially none. This is a half-day of reading src/InlineText.php end to end plus one field on a scratch resource — and it gates every risk statement below. Do not let a plan, a sprint commitment, or a stakeholder expectation get built on the wrong reading. Treat the resolution of this ambiguity as a named deliverable with an owner, not a background assumption.
Integration feasibility. Feasible and cheap if the prerequisites hold: Nova 4.x or 5.x, Laravel 10/11, PHP 8.1+. The real cost is not the package — it is Nova's private Composer repository credentials in both local and CI. Budget roughly a day for credentials, first install, and a boot smoke test. The composer require itself is minutes. Teams on Nova 3 or Laravel 8 would need the 2.x line, which is a different major and a different review; do not silently mix majors across a fleet of panels.
Technical risk. Three risks, ranked:
InlineText method incompatibility with its parent Nova class — in PHP that is a "declaration must be compatible" fatal at class load, which takes down the whole Nova panel rather than degrading one field. The package overrides Nova internals, and Nova ships on its own cadence with no upstream changelog we can diff against. Breakage surfaces after a Nova upgrade or in production, never during our code review. Mitigation is procedural, not technical: pin ^3.0.1 (never 3.0.0), gate Nova upgrades behind staging, and add a request-level boot smoke test to CI.authorizedToUpdate? Does it fire Eloquent events? If either answer is no, observers, activity logs, audit tables, and search indexes drift silently, and the divergence compounds with usage volume. Enforce rules on the field and policy on the endpoint regardless of the answer, and keep a model-level observer as an audit backstop.Key questions to close before approval.
authorizedToUpdate?sortable() honored on the field, and do we need it on any candidate column? Read the class before promising it in a spec.Stack fit. Nova field, Nova panel, Nova-adjacent resources only. Confirm the FQCN from src/ before writing code — the vendor namespace (optimistdigital) and the GitHub org (outl1ne) have diverged, and the class name is not always obvious from the repo name. There is nothing to publish: no config, no migration, no vendor:publish step. If someone is hunting for a config file to tune, the answer is that the field class is the config.
Migration path. There is no migration in the data sense — no schema change — but there is a behavioural migration: the moment an inline field goes live, the ops workflow for that attribute changes from "open record, edit, save" to "edit in the table." Scope that deliberately. Start with one low-traffic resource and one short single-value string: a display name, label, title, or status line. If a field is currently edited through a form that performs side effects (slug generation, cache invalidation, notifications, denormalized column updates), it is not a migration candidate — those belong in a later tranche or not at all.
Compatibility.
^3.0.1. Never adopt 3.0.0; if it appears in a composer.lock, that is a patch to ship today, not next sprint. Add it to the dependency-review checklist.php artisan nova:publish, and check the browser console before touching PHP.Sequencing.
/nova in an empty panel before adding any field. A fatal here should be found in a bare panel, not on a resource page.InlineText gives us one place to swap the package for a ~100-line custom field if it goes stale. Subclassing inherits the exact fragility the 3.0.1 fix was repairing, on every Nova minor bump./nova as an authenticated user (a fatal at class load is not catchable by a unit test but is catchable by a request test), plus a feature test POSTing to the Nova update endpoint asserting both happy path and 403.Placement conventions worth standardising early. ->onlyOnIndex() for high-frequency edits, ->onlyOnDetail() where the value is informative but shouldn't be inline, both by default only when the blast radius is genuinely low. Encode these in the wrapper so the convention is enforced by code rather than by review comments.
Maintenance. Near-zero on our side in the happy path; the maintenance burden sits with a small upstream team on someone else's release cadence. Our obligations are: keep the wrapper thin, keep the version pinned, keep the boot smoke test in CI, and keep a fork-or-replace note in the repo with a named owner. The cost we actually carry is re-validation on Nova upgrades — treat "we upgraded Nova" as a change that requires re-running the four pilot paths in staging. This is the single recurring operational cost of adoption, and it scales with how many resources use the field, not with how many teams do.
Support. GitHub issues only. No SLA, no vendor channel, no commercial backing. That is acceptable for a convenience dependency on an internal admin surface and unacceptable for anything the business depends on at runtime. Say this out loud in the adoption record rather than discovering it during an incident. Internal support cost is low but not zero: whoever owns the wrapper owns the triage when a field goes blank or a save silently no-ops.
Scaling. Scales fine in the dimension that matters here — a handful of fields across a handful of resources. It does not scale in two directions: breadth (usage across many resources multiplies the re-validation cost per Nova upgrade and multiplies exposure to the bus factor) and complexity (rich text, long-form content, validation-heavy workflows, multi-field inline editing are explicitly out of scope — stretching the field there is where the risk lives). Cap the initial footprint deliberately. The correct posture is a narrow, well-understood tranche of commodity edits, not a campaign to inline-enable the panel.
Failure modes and their signatures.
/nova in CI and by the staging pass on every Nova upgrade. This is the reason 3.0.1 is the floor.php artisan route:list | grep nova), reading the JSON response body in the network tab, and confirming the field's attribute matches the model attribute exactly.php artisan nova:publish, check the console.Ramp-up. Low for engineers who already know Nova — one line in fields(), familiar field configuration, no new mental model. The ramp-up cost is concentrated in platform work rather than developer learning: Nova Composer credentials in local and CI, documented and cached deliberately with an owner and an expiry plan; the boot smoke test; the wrapper; the staging gate on Nova upgrades. Budget roughly a day for that platform work regardless of how many engineers use the field. The PM implication is that the first adoption should be funded as a small, measured pilot with a before/after metric attached — if the time-to-complete-edit improvement doesn't show up on the first resource, the honest answer is to stop at one field rather than roll it out and inherit the upgrade-revalidation cost across the panel.
How can I help you explore Laravel packages today?