itainathaniel/nova-admin-notes
A Laravel Nova package for adding internal admin notes to Nova resources. Keep contextual comments and reminders alongside records, giving teams a simple place to document decisions or follow-ups without leaving the admin panel.
Add the package and publish its assets/views so the autosave behaviour is visible in your codebase rather than buried in vendor/:
composer require <vendor>/<package>
php artisan vendor:publish --tag=<package>-views
php artisan vendor:publish --tag=<package>-config # if a config file is offered
Look first at the published Blade view — as of 1.0.2 it is the single place that controls both the <textarea> markup and the autosave timer, so it is where you will spend most of your debugging time.
The first use case to wire up is a plain edit form with a persisted draft: render the component, point its save endpoint at a controller/Livewire action that writes the current field value to your model (or a drafts table), and confirm a save lands roughly every seven seconds while you type. Once that round-trip works, the rest of the package is refinement.
If the component is used inside Livewire, the simplest integration is a wire:model-backed property plus a save() action; if it is plain Blade + Alpine, you will be posting to a named route. Verify which of the two the package ships before writing glue code.
Treat autosave as an idempotent upsert, not a create. The timer fires on a fixed cadence regardless of whether anything changed, so your handler should update-or-create by a stable key (draft_id, model_id + user_id) and be safe to call repeatedly.
Debounce the consumer side, not the producer side. The package fires on its own 7-second schedule; if you also want an immediate save on blur or on a keyboard shortcut, expose a manual save path in your controller so both entry points share one code path.
Return enough state for the UI to be honest. Respond with something like {saved_at: "...", version: 3} so your own layer can render "Saved 12s ago" instead of guessing. Do not assume the package renders a save indicator — verify against the published view.
Guard against overlapping requests. A 7-second interval can race a slow request on a poor connection. Use AbortController or a simple in-flight boolean in your script so an older payload cannot overwrite a newer one.
Scope drafts to the authenticated user. With an ambient timer, forgetting where('user_id', auth()->id()) on the draft lookup is the fastest way to leak another user's in-progress text.
Test the handler directly, not the timer. Feature-test the save action with $this->postJson(...), asserting idempotency across two calls; the interval itself is not worth a browser test unless you are already running Dusk.
The 7-second interval is not configurable in 1.0.2. Issue #2 introduced it as a fixed value, so tuning cadence means editing the published view or wrapping the component with your own script. Pin the version if that matters, and open an issue asking for a config or prop.
The new 50vh height is a component-level style. Your own textarea { height: ... } rules may lose to it depending on specificity, and 50vh is tall on desktop and cramped on a phone in landscape. Override via your own class or a CSS custom property rather than editing the published view, so future package updates do not clobber your change.
Layout shift on first paint. Switching to 50vh means the form reflows compared to earlier versions; check any screenshot tests or fixed-height containers around the component.
Autosave will fire on untouched forms. If you render the component on a create page, the first tick can create an empty draft row. Either gate the save on non-empty content or delay enabling the timer until the field is dirty.
Debugging silent failures. Autosave errors are easy to miss because nobody is watching the network tab. Log every save attempt server-side with the resulting status, and surface a "last saved" timestamp from real server state rather than client optimism.
Extension point to watch: the published view is your override surface for timer cadence, height, and indicator markup. Anything you cannot express there is a package change request — track upstream issues rather than forking, since the 1.0.x line is still moving quickly.
How can I help you explore Laravel packages today?