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

Filament Quick Add Select Laravel Package

cocosmos/filament-quick-add-select

Add a quickAdd() method to any Filament Select with a relationship so users can instantly create and select new options right from the search dropdown. No modals, no interruptions—just type, click "+ Add", and keep working. Supports multiple selects and custom labels.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • Single-purpose package that extends Filament\Forms\Components\Select through Laravel's macro system and registers via a service provider with package auto-discovery. No core Filament files are patched, no schema changes, no published assets beyond optional translations — a very small architectural surface area.
  • Behavior model is: intercept the search-results payload, inject a synthetic "+ Add ''" option, and on selection create the related model server-side through a Livewire round-trip, then swap the placeholder for the real record ID. This is a UI-layer convenience that mutates persistent state, which is the crux of the evaluation.
  • Fits squarely in the Filament 4/5 + Laravel 11–13 + PHP 8.2+ envelope. If the estate is on Filament 3, this is not an option (no backport in the changelog).
  • It is a peer convenience to Filament's native createOptionForm() modal rather than a replacement; the README positions it explicitly as the fast path, with createOptionForm() retained for models with required attributes.

Integration feasibility

  • Integration cost is near zero: composer require, then ->quickAdd() on any relationship Select. Rollout is per-field and opt-in, which makes this trivially pilotable and trivially reversible — the strongest argument in its favor.
  • Configuration levers are adequate for governance: conditional enabled: closure, custom label: (string template or closure), and resetSearch: for context-sensitive UX (e.g., tagging-style multi-selects want the search preserved; single-select forms may want it cleared).
  • Translation publishing is a one-command operation, and eight locales ship in-box (EN, FR, DE, ES, ID, IT, PT, AR), which removes the usual i18n tax for a non-English panel.

Technical risk

  • Ecosystem validation is absent. 18 stars, 0 dependents, single maintainer. There is no production corpus to infer behavior from; treat every claim in the README as untested at scale.
  • Partial record creation is the dominant functional risk. Only the title attribute (typically name) is populated. Any model with required non-nullable columns, DB-level constraints, observers, or invariants enforced in booted() will either reject the write or silently persist an incomplete row. This must be triaged per target model, not per package.
  • Authorization is opt-in, not default-on. ->quickAdd() without an enabled: guard lets any user who can reach the form create records in the related table. There is no evident built-in policy check. This is the single most important integration constraint and must be a hard coding standard, not a review comment.
  • Macro binding to internals. The mechanism hooks search-result generation, which is not a documented Filament extension point. Each Filament major bump is a potential silent break — and silent breaks here mean either the feature vanishing or, worse, malformed creation.
  • Master-data hygiene. A search term becomes a record name, unvalidated and uncanonicalized. Typo variants, casing drift, and trailing whitespace will accrete in lookup tables. Duplicate creation under concurrent users is also unguarded.
  • Track record of self-inflicted defects. 1.0.2 fixed a missing namespace declaration that made the package unloadable; 1.0.3 fixed a translation namespace producing raw keys; 1.1.2 fixed PostgreSQL case-sensitivity in search via whereLike. The maintainer is responsive (issue #9 produced both the closure-label fix and resetSearch), but early releases carried defects that a stricter test gate would have caught.

Key questions

  1. Does creation run through Filament's policy/authorization layer, and does it respect modifyQueryUsing scopes and multi-tenancy — i.e., can a user create a record into a tenant they don't belong to?
  2. Are Eloquent model events, creating observers, and validation rules fired on the created record, or is it a raw create()?
  3. How does the macro coexist with a Select that also declares createOptionForm() or createOptionUsing() — defined precedence?
  4. What is actual test coverage behind composer test, and does it cover multi-select pivot attachment and authorization-negative cases?
  5. Does search-term canonicalization (trim, case-fold, uniqueness check) happen anywhere before insert, or is the raw term written verbatim?
  6. What is the maintainer's stated compatibility commitment across Filament majors — is there a CI matrix against Filament 5?

Integration Approach

Stack fit

  • Qualifies if and only if the target panel is Filament 4.x or 5.x on Laravel 11–13 / PHP 8.2+. Any Filament 3 surface is out of scope and should be excluded from the rollout plan explicitly.
  • Best-fit targets are low-cardinality reference tables with a single human-readable label column and no business invariants: professions, categories, skills, tags, industries, jurisdictions.
  • Poor-fit targets are anything with required extra attributes, financial or contractual meaning, workflow state, or regulatory identity — those stay on createOptionForm().

Migration path

  • Purely additive. No data migration, no schema change, no backfill. Adoption is a code-level annotation per field; removal is deleting the method call.
  • There is no "big bang" requirement, which is unusual and welcome for a package in this maturity band — the blast radius is containable to individual form fields.

Compatibility

  • Relationship selects only; options-array selects are unsupported by design.
  • Multi-select works, but confirm pivot behavior for BelongsToMany with additional pivot columns before relying on it.
  • Coexistence with a same-model createOptionForm() should be verified per field rather than assumed.
  • Non-English panels are covered out of the box; verify RTL rendering for the Arabic locale against your theme.

Sequencing

  1. Gate first. Establish a coding standard that every ->quickAdd() carries an enabled: auth()->user()->can('create', Model::class) guard. Enforce in review and, ideally, a static check.
  2. Pin and baseline. Pin the package version; confirm the Filament minor in the lockfile; capture the current Composer resolution in CI.
  3. Pilot on one internal, low-risk reference table — something where a malformed row is an annoyance, not an incident.
  4. Instrument before broadening. Add a query for duplicate-name clusters on the pilot table and a log line on creation, so typo and race behavior is observable rather than anecdotal.
  5. Broaden to user-facing forms only for models verified as single-attribute-creatable; convert the rest to createOptionForm().
  6. Document the boundary in the team's Filament conventions doc so new fields don't get ->quickAdd() by reflex.

Operational Impact

Maintenance

  • Single-maintainer package with a modest but real release cadence (1.0.0 through 1.3.1, with feature and fix releases interleaved) and Dependabot now configured. Positive signal, but the bus factor is one.
  • Ongoing maintenance burden is not the package itself — it is the Filament upgrade cycle. Because the macro hooks a non-public extension point, budget an explicit compatibility check at every Filament major, and be prepared to vendor-fork. The MIT license makes forking viable; plan for that contingency rather than discovering it during an upgrade crunch.

Support

  • Effectively self-support. With zero dependents there is no community knowledge base, no Stack Overflow corpus, and no third-party integration write-ups. Internal documentation must carry the weight.
  • The maintainer has demonstrated willingness to act on filed issues (the PostgreSQL whereLike fix and the resetSearch/closure-label work both trace to issue #9), so a contribution-back path is realistic — but do not treat upstream SLA as a dependency.

Scaling

  • The scaling risk is data, not throughput. Every user keystroke that finds no match is a potential new row. On a table with a handful of curators this is fine; on a table exposed to hundreds of users in a free-text field, cardinality grows superlinearly with typo rate.
  • Mitigate with a uniqueness constraint on the label column where semantically correct, plus a periodic dedupe/merge job. Without that, reporting joins on the lookup table will degrade in quality long before they degrade in latency.
  • Server-side load added per creation is one extra Livewire round-trip and one insert — negligible against typical Filament admin traffic.

Failure modes

Failure Impact Mitigation
Model has required attributes Insert fails or persists incomplete row Exclude such models; use createOptionForm()
Missing authorization guard Unauthorized record creation / cross-tenant write Mandatory enabled: policy closure
Typo/duplicate records Master-data pollution, degrading downstream reports Unique constraint + dedupe job
Concurrent creation of same term Duplicate rows, no error to user DB unique index; accept-and-resolve UX
Filament major upgrade Macro silently no-ops or errors Pinted version, upgrade-gate test, fork fallback
Missing translation key Raw key rendered in UI Publish and review lang/vendor/quick-add/
Case-sensitive search on PostgreSQL Term appears "not found" when it exists, creating a duplicate Resolved in 1.1.2; verify on your PG version

Ramp-up

  • Developer ramp-up is essentially zero — one method call, self-describing name, README examples cover single, multiple, custom label, conditional enable, and search reset.
  • End-user ramp-up is also near zero; the "+ Add ''" affordance is discovered in the same dropdown where the user was already searching, and it removes six steps from the documented workflow. This is the package's genuine value: it converts an abandonment point (search fails → user leaves the form) into a completion.
  • The training that does matter is for implementers, not users: when not to apply ->quickAdd(), and that the authorization guard is non-optional. Encode both in the conventions doc and in PR review rather than in a wiki nobody reads.

Bottom line for the TPM: low-cost, low-risk-to-integrate, moderate-risk-to-operate. Approve for pilot on single-attribute reference tables behind a mandatory authorization guard, with a pin-and-fork contingency for Filament upgrades and a dedupe strategy in place before broadening beyond internal users. Do not adopt for master data carrying business rules or regulatory meaning.

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.
mehedimi/laravel-amp-mail
happones/laravel-vue-i18n-generator
jwerd/inertia-table
siberfx/flysystem-wasabi
hollyit/token-replace
ippanelcom/laravel-sdk
adachsoft/changelog-linter
adachsoft/collection
payerurl/telegrambot-crypto-payment-instant-payout
dskripchenko/laravel-hybrid-search
riorizkyrainey/lara-ced
mehedimi/static-vel
zharp/zharp
nonsapiens/bigquery-model-sync
lgu-bayambang-ict-office/lgu-laravel-development-standards
andydefer/laravel-support
se7enxweb/flysystem
lampwick/laravel
jeslage/statamic-emojis
micahdshackelford/rmap-laravel