pavloniym/nova-action-buttons
Adds configurable action buttons to Laravel Nova resources, letting you trigger custom actions, links, or dialog workflows directly from index and detail views. Buttons are defined with simple PHP/JSON configuration and support flexible styling and visibility rules.
Architecture fit. pavloniym/nova-action-buttons is a Nova 5 field type, not a framework or parallel admin layer. It renders existing Laravel\Nova\Actions\Action classes as buttons on index and detail views, so it inherits the authorization model already in the app (canSee/canRun/policies), confirmText() dialogs, onlyOnIndex/onlyOnDetail scoping, and the normal action lifecycle. No new persistence, no queue or worker, no external service, no second permission system to reconcile. For a team standardized on Laravel + Nova as internal admin substrate, this is a UI-surface addition rather than a platform commitment. The one architectural claim it makes is "configuration over Vue" — replacing bespoke Nova custom tools/cards with declarative button definitions. That trade is favourable for standard row-level workflows (approve, refund, retry, resend, escalate) and unfavourable the moment a workflow needs multi-step forms, wizards, or bespoke layout.
Integration feasibility. High, conditional on Nova 5. Composer install with package auto-discovery; no infrastructure prerequisites beyond an existing Nova 5 install. The binding constraint is the Nova major version: v2.x targets Nova 5, and mixing it with Nova 4 fails at render time (class-not-found / signature errors), not at install time — an expensive debugging mode if the version gate isn't verified first. Critically, v2.0.1 contains no code changes; it is a re-tag of v2.0.0 cut from cleaned-up main history. v2.0.0 is the actual upgrade event and the only source of Nova 5 breaking-change detail (PHP/Nova floors, renamed button APIs). Feasibility must be assessed against v2.0.0's notes, which are not reproduced in the 2.0.1 release document — the single largest information gap before committing engineering time.
Technical risk, ranked, because a TPM needs to know what actually kills the initiative:
canSee policy evaluations per page load. Fine for normal policies; a problem if canSee performs DB or API calls.Key questions, required before greenlight, in priority order:
onlyOnIndex/onlyOnDetail, lenses, relationship indexes, and per-row canSee, or does it bypass Nova visibility resolution anywhere?vendor/ after each upgrade)?handle() methods idempotent — i.e. does the application, not the package, own double-submit safety?Stack fit. Laravel Nova 5, which practically implies PHP 8.1+ and Laravel 10/11. Confirm the package's own composer.json constraints resolve against the exact laravel/nova version pinned in composer.lock before any planning estimate is produced. Not viable for Nova 3/4 fleets without pinning an earlier major — and running mixed package majors across a multi-app portfolio is itself upgrade friction that should be priced in, not waved away.
Migration path. Treat v2.0.0 as the breaking release and v2.0.1 as a no-op. If on v1.x, plan migration only after the Nova 5 upgrade lands; effort is a function of v2.0.0's changes (renamed classes, changed signatures) plus whatever Nova 5 itself forced. If already on 2.0.0, there is literally nothing to do — pin ^2.0 and move on. The TPM action is to correct any roadmap line saying "adopt 2.0.1 features": there are none, and scheduling against them wastes a sprint.
Compatibility. Two matrices must be checked, not one: package-against-Nova and Nova-against-Laravel/PHP. The package is a passenger on Nova's constraints. Validate against the exact Nova patch version running in production, not "Nova 5" generically.
Sequencing.
canSee/canRun/policy), confirmation modals, onlyOnIndex/onlyOnDetail scoping, lens and relationship-index contexts, index render time before/after, narrow-viewport layout.Build vs. buy framing. "Buy" here is adoption of an MIT package; "build" is an in-house Nova custom tool or card in Vue. The package wins decisively on cost and time-to-ship for standard button-triggered actions with confirmation modals. Build in-house only when the workflow exceeds what a button plus modal can express, or when the dependency's maintainer risk has become unacceptable for that specific surface — in which case the fork option under MIT is cheaper than a rewrite. Also budget for the convention work, not just the dependency: agreeing which actions belong on the row versus in the toolbar is a product decision that outlives the package choice.
Maintenance. Small surface area — a couple of files, config-driven, no component library to keep in step. Ongoing cost is roughly "re-verify after every Nova upgrade," plus a diff of any published Blade overrides against vendor/. Budget a half-day per Nova point release for re-verification, and never upgrade this package independently of Nova. MIT license keeps the fork option open, which is the real maintenance backstop.
Support. Internal-facing only — keep it out of anything customer-visible. Two interaction paradigms (dropdown versus button) carry real cognitive cost for admins, so publish a short convention: which actions get row buttons, and why. That document is what prevents "why is refund a button but cancel a dropdown" tickets. Day-to-day support burden is low; the escalation path for breakage is the named fork owner, not the maintainer's issue tracker.
Scaling. Two axes. First, rows × buttons: authorization cost grows linearly with both, so a 50-row index with six buttons is ~300 policy evaluations; keep canSee cheap (no DB or API calls) or move expensive checks into policy caching. Second, portfolio: every additional Nova app adds a version-skew surface. Standardize the package major per Nova major and document it centrally.
Failure modes, with the operator-visible symptom:
handle() → duplicate refunds/emails from a visible, easily double-clicked target. Application-owned, not package-owned — make idempotency a review checklist item.canSee. Keep authorization on the action class.Ramp-up. Days for one resource with a Laravel-fluent engineer; no Vue work required, which is the whole point. The learning curve is Nova internals (fields, actions, authorization resolution), not this package. Plan a two-week pilot with the four metrics above and a named owner; that is sufficient evidence to justify or kill broader rollout.
How can I help you explore Laravel packages today?