tunezilla/dynamic-action-fields
Laravel package for defining dynamic, configurable fields on actions, letting you build and render action forms at runtime instead of hardcoding inputs. Useful for customizable admin workflows, reusable action classes, and flexible user-defined input handling.
Architecture fit. The package sits on a single, well-understood seam in Laravel Nova: Action::fields() is resolved when an action is serialized for its modal. Any workflow whose inputs vary by selected resource, acting user, tenant, or prior selection otherwise forces forked action classes or a pile of conditionals in one method. The package wraps that seam in an opt-in trait or base class. It touches nothing in resources, models, Nova bootstrapping, queues, or storage — blast radius is confined to the action layer of an internal admin panel.
For a TPM, that narrowness is the leverage: it turns "one bespoke admin screen per variable-input workflow" into a repeatable, estimable unit of work. Once the pattern is proven on one action, the remaining conversions are template work that can be scoped, batched, and parallelized across engineers rather than treated as individual favors. That is the program-level value — not the feature itself.
Flag one scope ambiguity immediately: the repo name and title say Laravel Nova, while the summary prose says "your application's actions." Record it as Nova-specific in the dependency register. Do not let anyone assume it generalizes.
Integration feasibility. Composer-installable, MIT, no transitive weight beyond Nova. Per-action effort is hours, not days. The binding constraint is not effort but compatibility: Nova is paid and closed-source, its action serialization and field APIs have shifted across 4.x into 5.x, and this package declares whatever its single maintainer has tested. Treat the first action as a spike with a hard exit criterion, not as the first item in a rollout.
Technical risk, in priority order:
Key questions that gate the delivery commitment (each needs a named owner and a date, or the rollout is aspirational):
dependsOn / withMeta without double-serialization?All but the first are answerable in a one-day spike. Nova compatibility requires that spike to run against your installed version specifically. These answers convert a vague "we could use this" into a go/no-go decision the team can actually take.
Stack fit. Requires Laravel + Nova on PHP 8.x; plugs into the existing service-provider flow with no new runtime services, queues, or storage. Because it is UI-layer only, it stays off the critical path for APIs and background workloads — the property that makes an immature dependency tolerable here. It is additive only if you already run Nova; it is not an input to a Nova-versus-alternatives decision, and should be explicitly excluded from that debate.
Migration path. Non-destructive and incremental. Convert one low-risk action first while keeping the existing static fields() implementation behind the trait, so rollback is a one-line revert. Do not batch-refactor. Convert, observe in production for a defined window, then batch by priority. This creates a real go/no-go gate with an observable outcome rather than a paper review.
Compatibility. Pin the package version and the Nova minor inside a joint constraint window. Treat every Nova upgrade as a coordinated change that includes re-verifying converted actions — add that line permanently to the Nova upgrade checklist so it is a standing cost, not a surprise. The highest-leverage artifact in the whole integration is a smoke test per converted action that opens the modal and asserts the expected field set; wire it into CI so a Nova bump fails loudly there rather than silently in front of an operator. With a closed-source dependency and no upstream canary, that test is your compatibility signal.
Sequencing:
type select surfacing a second field). Verify rendering, validation, and submitted payload shape against the static baseline.Keep the trait behind a single base class so a swap is mechanical, and maintain a live inventory of every action that depends on it. That inventory plus the smoke tests are the two artifacts that keep this from becoming invisible infrastructure.
Maintenance. Low ongoing code maintenance, moderate ongoing compatibility maintenance. Upkeep is dictated by a closed-source vendor's release cadence, not by the package. Expect to re-validate on each Nova minor and budget it as a recurring line item rather than a one-off. Assign explicit ownership — a named engineer and a backup. An unowned dynamic-fields integration rots quietly, and its failure mode is silent: nothing breaks until an operator opens a modal and gets the wrong form.
Support. Effectively self-support. At 18 stars and zero dependents, community answers will be thin and Stack Overflow coverage near zero; there is no one to escalate to. The real support asset is internal documentation: which actions use dynamic fields, what each resolves against, why, and who owns it. Budget for reading source directly — a competent Laravel engineer can hold the whole trait in their head in an afternoon. Keep the vendor-fork contingency funded (half a day) so abandonment is an inconvenience, not an incident.
Scaling. Runtime scaling is a non-issue: resolution fires per modal open and is bounded by field count, not data volume. The scaling risk is organizational. Dependent actions grow monotonically, and each is an independent place a Nova upgrade can break — so the cost of a Nova bump grows linearly with adoption while the maintenance capacity to absorb it does not. Mitigate with the inventory, the per-action smoke tests, and base-class indirection that keeps an upstream swap mechanical. Cap adoption until the pattern has survived at least one Nova minor upgrade in production; that upgrade is the real test of whether this becomes a durable layer or a recurring tax.
Failure modes to name up front, with detection and mitigation:
Ramp-up. Roughly half a day for a Laravel engineer to read the source and understand the resolution hook, plus a day for the first spike. Per-action conversion time drops sharply after the first two as the pattern and the test harness are reused. Onboard by pairing on a conversion rather than by documentation alone, and report progress in program terms — actions converted, recurring ticket classes eliminated, engineering hours avoided, and per-upgrade re-verification cost — not in features shipped. The business case here is internal tooling ROI and engineering velocity; frame it that way and keep it out of any customer-facing narrative.
How can I help you explore Laravel packages today?