relaticle/custom-fields
Laravel/Filament plugin that adds dynamic custom fields to any Eloquent model without database migrations. Supports 20+ field types, conditional visibility, multi-tenancy, CSV import/export, optional encryption, and custom field types.
Deterministic record lookups, a configurable search minimum, and an option-count threshold for option-backed selects. All three are reachable from a new selects config block, so 3.7 behaviour can be restored exactly.
RecordSelectInputComponent ran limit(50) with no orderBy, so the initial page was whatever the database returned and could differ between two renders of the same form. It now orders by the model key descending, which is deterministic and backed by the primary key index.
Measured on a seeded 50,000-row tenant with EXPLAIN (ANALYZE, BUFFERS):
| Variant | Plan | Time | Shared buffers |
|---|---|---|---|
| Model key desc (the new default) | Index Scan Backward on the primary key | 0.036 ms | 7 |
No ORDER BY (3.7 behaviour) |
Seq Scan stops at 50 rows | 0.043 ms | 4 |
updated_at desc, id desc |
Seq Scan 50,004 rows, top-N heapsort, Limit | 7.59 ms | 822 |
Determinism therefore costs nothing. Set record_lookup.order_column to 'updated_at' if you prefer most-recently-touched-first, and index that column when the lookup table is large. A configured column always gets the model key appended as a tiebreaker.
getSearchResultsForJs() returned [] below 2 characters. It now returns the unfiltered first page, and the minimum comes from record_lookup.min_search_length rather than a literal. The field's JavaScript reads the same value, so raising the minimum can no longer leave the client asking for a filtered search that the server answers with an unfiltered page.
SelectComponent and MultiSelectComponent called ->searchable() unconditionally, so a three-option status field rendered a search box above three items. They now gate on option count, default 10.
This is a taste change, not a bug fix. It carries no performance benefit: filtering for static options already happened client-side at zero server cost. The only effect is that the search box disappears on small option sets.
Opt-out: set custom-fields.selects.searchable_threshold to 0 to always render the search box, which is exactly the pre-3.8 behaviour.
'selects' => [
'searchable_threshold' => 10, // 0 always shows the search box (pre-3.8 behaviour)
'record_lookup' => [
'order_column' => null, // null means the model key, index-backed
'order_direction' => 'desc',
'limit' => 50,
'min_search_length' => 2,
],
],
Consumers who published config/custom-fields.php before 3.8 do not have this block. Every read passes the same value as its default, so nothing breaks and the new defaults apply.
Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.7.0...v3.8.0
Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.6.3...v3.7.0
Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.6.2...v3.6.3
Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.6.1...v3.6.2
Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.6.0...v3.6.1
Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.5.5...v3.6.0
Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.5.4...v3.5.5
Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.5.3...v3.5.4
Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.5.2...v3.5.3
Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.5.1...v3.5.2
Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.5.0...v3.5.1
Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.4.1...v3.5.0
$get('../../../entity_type'), which inside the field-management action modal (mountedActions.0.data.*) climbed past the form-data scope to the Livewire root and returned null, short-circuiting to an empty list. It now resolves entity_type/code via absolute data-scope paths, correct in both the action-modal and page-form contexts (#172).Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.4.0...v3.4.1
Is in → Is not in) reset the stored value to null, silently turning the condition into an "is in / is not in nothing" match. The value is now preserved whenever the new operator still takes one, and only cleared for value-less operators (is empty / is not empty) (#170).CustomFieldsPlugin::make()->sectionModalWidth(...) (a Width case or closure) or the custom-fields.management.section_modal_width config key. The default widens to screen-lg when section conditional visibility is enabled — previously the add-section modal stayed at 2xl, cramping the conditions row — and the create/edit modals now resolve to the same width (#170).Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.3.0...v3.4.0
SectionForm::extendSchemaUsing() — extend the custom-field section management form from application code (e.g. a service provider), with no subclassing or vendor patching. A single registration applies to both the Add and Edit section modals, and the callback receives the current schema plus the section's entity type, so extensions can be scoped per entity (#165).extra bag on CustomFieldSectionSettingsData — consumer-defined section settings bound under settings.extra.* now round-trip through the typed settings DTO (and through config import/export). Enables, for example, flagging a section to render as its own tab (#165).Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.2.1...v3.3.0
InfolistBuilder now evaluates each section's visibility against the record, mirroring the form path. Sections without conditions and field-level visibility are unaffected.Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.1.7...v3.2.0
Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.1.6...v3.1.7
postare/blade-mdi dependency with manukminasyan/blade-mdi, a Packagist-published fork that widens the illuminate/support constraint to include ^13.0. Same Postare\BladeMdi\ namespace, no source changes.composer require relaticle/custom-fields now works without extra setup.Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.1.4...v3.1.5
Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.1.3...v3.1.4
Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.1.2...v3.1.3
Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.1.1...v3.1.2
Full Changelog: https://github.com/relaticle/custom-fields/compare/v3.1.0...v3.1.1
normalizeValueForEvaluationaddslashes with json_encode for JS string escapinggetNormalizedFieldValuescreateSection actiongit ls-remote in changelog workflowFull Changelog: https://github.com/relaticle/custom-fields/compare/v3.0.14...v3.1.0
propaganistas/laravel-phonevendor/bin/custom-fields-upgrade)SYSTEM_SECTIONS feature flag for sectionless modelookup_type setting removed from text, number, date, and other non-relational field typesRun vendor/bin/custom-fields-upgrade to automatically migrate phone/email formats and lookup field settings.
CustomFields::form(), CustomFields::table(), CustomFields::infolist() builderscustom_field_options tableInteractsWithCustomFields trait moved to Relaticle\CustomFields\ConcernsCustomFieldsComponent::make()) in favor of builder APIHow can I help you explore Laravel packages today?