Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
132 commits
Select commit Hold shift + click to select a range
b035808
refactor: add record and through parameters to component interfaces
ManukMinasyan Sep 5, 2026
31e130d
ci: run tests and docs build for the 4.x branch
ManukMinasyan Sep 5, 2026
6c62d47
refactor: rename value resolver contract and collapse single-impl int…
ManukMinasyan Sep 5, 2026
6063a19
docs: state which collapsed class newly became final
ManukMinasyan Sep 5, 2026
b746c2e
refactor: drop v1-era upgrade tooling, keep the upgrade step framework
ManukMinasyan Sep 5, 2026
5c9baef
fix: finish the 4.0 wording in the upgrade command and pin the valida…
ManukMinasyan Sep 5, 2026
1079282
chore: consistency sweep for 4.0
ManukMinasyan Sep 5, 2026
4771ad3
refactor: close every class that is not a documented seam
ManukMinasyan Sep 6, 2026
7902c02
docs: publish the supported extension points
ManukMinasyan Sep 6, 2026
9310c6c
feat: review every feature flag default at the major
ManukMinasyan Sep 6, 2026
ffa6e5c
test: turn the three skipped tests into real ones
ManukMinasyan Sep 6, 2026
3115e01
fix: close the gaps the 4a review found
ManukMinasyan Sep 6, 2026
b23befe
docs: say why each reviewed flag default holds, not what it does
ManukMinasyan Sep 6, 2026
15cd6d5
refactor: group the field schema builder into concern traits
ManukMinasyan Sep 6, 2026
94d23d1
refactor: move the visibility js emitter out of the frontend service
ManukMinasyan Sep 6, 2026
a1f9aeb
refactor: split the visibility condition row out of the component
ManukMinasyan Sep 6, 2026
cd3331e
docs: correct the seam list and the section-width claim
ManukMinasyan Sep 6, 2026
1f01c4b
refactor: close the remaining service providers
ManukMinasyan Sep 6, 2026
b5df120
chore: analyse the livewire and management ui
ManukMinasyan Sep 6, 2026
bb892de
chore: raise phpstan to level 6
ManukMinasyan Sep 6, 2026
0b7b724
docs: record the phpstan level contributors have to keep
ManukMinasyan Sep 6, 2026
807530a
fix: render livewire views through the view factory
ManukMinasyan Sep 6, 2026
846e304
fix: reject closure components in AbstractComponentFactory with a cle…
ManukMinasyan Sep 6, 2026
60541b0
fix: handle json_encode and preg_split failures in rich editor import…
ManukMinasyan Sep 6, 2026
4f92452
fix: validate entity type before instantiation in UniqueCustomFieldValue
ManukMinasyan Sep 6, 2026
cfc8425
chore: tolerate the scope generics drift between laravel 12 and 13
ManukMinasyan Sep 6, 2026
4b0ab2d
fix: read model schema from the model's own connection
ManukMinasyan Sep 6, 2026
e375a16
docs: correct the field type registration array shape
ManukMinasyan Sep 6, 2026
3af899f
test: run the suite against postgres and mysql in ci
ManukMinasyan Sep 6, 2026
41b7c41
test: close phase 1 review nits on docs and factory fixtures
ManukMinasyan Sep 6, 2026
5a25d14
fix: exclude jsonb columns from model attribute discovery
ManukMinasyan Sep 6, 2026
e9297c8
docs: name both accepted phpstan ignore kinds
ManukMinasyan Sep 6, 2026
44ea4c4
docs: make the database matrix instructions runnable
ManukMinasyan Sep 6, 2026
aac9444
feat: give select options a machine-readable category
ManukMinasyan Sep 6, 2026
784ac3e
feat: query select options by category
ManukMinasyan Sep 6, 2026
8acd9ec
feat: set an option category from the field editor
ManukMinasyan Sep 6, 2026
ad1b841
docs: document option categories and seed them from the migrator
ManukMinasyan Sep 6, 2026
d393f3e
refactor: keep option category docblocks to types
ManukMinasyan Sep 6, 2026
2318f7c
feat(relationships): add cardinality enum and table name config
ManukMinasyan Sep 6, 2026
d42fcfe
feat(relationships): add relationship definitions table and model
ManukMinasyan Sep 6, 2026
60bf2d6
fix: stop the options repeater dropping settings it did not show
ManukMinasyan Sep 6, 2026
4406b14
docs: correct the feature-flag and option-model snippets
ManukMinasyan Sep 6, 2026
04f7bf4
feat(relationships): add edge ledger table and link model
ManukMinasyan Sep 6, 2026
9cf1fe5
fix: give every feature flag a package default
ManukMinasyan Sep 6, 2026
2fb382c
fix(relationships): correct slot key type, table prefix, and null keys
ManukMinasyan Sep 6, 2026
3cc78b8
feat(relationships): add definition create and delete services
ManukMinasyan Sep 6, 2026
9af6622
docs: document the relationship tables and their migration behaviour
ManukMinasyan Sep 6, 2026
d460305
feat(relationships): add link actor resolver contract
ManukMinasyan Sep 6, 2026
3e701cf
test: restore the table prefix the partial-index test sets
ManukMinasyan Sep 6, 2026
4f167b1
feat(relationships): add diff-based link writer with events
ManukMinasyan Sep 6, 2026
8235698
feat(relationships): reject a definition end that resolves to no model
ManukMinasyan Sep 6, 2026
66b7bb4
docs: say which relationship columns key_type governs
ManukMinasyan Sep 6, 2026
01e3cea
feat(relationships): route record fields through the link writer
ManukMinasyan Sep 6, 2026
cfbaee2
feat(relationships): read record field values from the edge ledger
ManukMinasyan Sep 6, 2026
7317f84
fix(relationships): hold link events until the write commits
ManukMinasyan Sep 6, 2026
8486fe7
fix(relationships): unpair and delete slots outside the tenant scope
ManukMinasyan Sep 6, 2026
522a669
test: clear the guardable-column cache after every test
ManukMinasyan Sep 6, 2026
830e70e
feat(relationships): link-backed table filter, sort, and search for r…
ManukMinasyan Sep 6, 2026
c8ce287
perf(relationships): skip the definition lookup for non-record fields
ManukMinasyan Sep 6, 2026
b777457
style: separate the assignment block rector 2.6 flags in ci
ManukMinasyan Sep 6, 2026
540142d
fix(relationships): keep unmigrated record fields on their 3.x table …
ManukMinasyan Sep 6, 2026
ea2967e
fix(relationships): roll the record back when a link write is rejected
ManukMinasyan Sep 6, 2026
d300c70
feat(relationships): validate cardinality before link writes
ManukMinasyan Sep 6, 2026
58c1ac0
feat(relationships): cascade link cleanup on force delete
ManukMinasyan Sep 6, 2026
298605a
fix(relationships): match Filament's search rules and settle null sor…
ManukMinasyan Sep 6, 2026
f20c07f
feat(relationships): add record-links migration step to upgrade command
ManukMinasyan Sep 6, 2026
7cbc211
fix(relationships): drop a rejected custom-field payload from the tem…
ManukMinasyan Sep 6, 2026
1c99a2a
fix(relationships): read a link's ends by direction, not by id value
ManukMinasyan Sep 6, 2026
204530e
test(relationships): pin the tenant the migration step stamps on links
ManukMinasyan Sep 6, 2026
a033105
test: pin the list-table fixture so sorting and search never tie
ManukMinasyan Sep 6, 2026
116cb26
refactor(relationships): read every record target from its definition
ManukMinasyan Sep 6, 2026
9fe92a7
feat(relationships): configure a record field as a relationship
ManukMinasyan Sep 6, 2026
d535def
feat(relationships): drop lookup_type and the settings it implied
ManukMinasyan Sep 6, 2026
d860ff8
refactor: delete the reflection helper into Filament internals
ManukMinasyan Sep 6, 2026
c23d77b
style: drop redundant parentheses in the entity-type resolver
ManukMinasyan Sep 6, 2026
9c1d19d
fix(relationships): measure the migration against the ledger, not the…
ManukMinasyan Sep 6, 2026
2b2a835
fix(relationships): drop dangling ids and key migrated codes per tenant
ManukMinasyan Sep 6, 2026
74344e7
fix(relationships): let cardinality alone cap a record field
ManukMinasyan Sep 6, 2026
895dfc2
refactor: give RecordColumnView its own file
ManukMinasyan Sep 6, 2026
74714e2
fix(relationships): gate the column drop on definitions, not on values
ManukMinasyan Sep 6, 2026
8de4d44
chore: lock rector at the version ci resolves and drop an unused import
ManukMinasyan Sep 6, 2026
d56f9ab
feat(ui): add the flavor registry surfaces render through
ManukMinasyan Sep 6, 2026
7fce162
fix(relationships): read an edge by its end, not by the record on it
ManukMinasyan Sep 6, 2026
62f04c2
fix(relationships): give a paired field a section when the target has…
ManukMinasyan Sep 6, 2026
2f34cf3
feat(tables): classify to-one relations a table can read fields through
ManukMinasyan Sep 6, 2026
48b987c
fix(relationships): let a record field fail without taking the page w…
ManukMinasyan Sep 6, 2026
edf30e6
fix(ui): validate the flavor config at boot, not per render
ManukMinasyan Sep 6, 2026
3cc62b2
test(relationships): run the lookup translation on every driver, and …
ManukMinasyan Sep 6, 2026
427d663
feat(tables): read, sort and search custom fields through a to-one re…
ManukMinasyan Sep 6, 2026
fa232fd
feat(tables): filter custom fields through a to-one relation
ManukMinasyan Sep 6, 2026
549e0c9
fix: write record field links by definition, not the relationships flag
ManukMinasyan Sep 6, 2026
be823e2
fix(ui): report a bad flavor in the console instead of throwing
ManukMinasyan Sep 6, 2026
6ccbc3d
docs(tables): document through relations and pin the eager-load contract
ManukMinasyan Sep 6, 2026
cc522bd
fix: stop gating link cleanup and eager loading on the relationships …
ManukMinasyan Sep 6, 2026
9a80930
docs: stop claiming the relationships flag gates nothing else
ManukMinasyan Sep 6, 2026
c55e924
feat(ui): read a relationship as a sentence between two entity cards
ManukMinasyan Sep 6, 2026
1705307
docs: match the config comment to the links wording elsewhere
ManukMinasyan Sep 6, 2026
5ddf8b3
fix: unpair a deleted slot field regardless of the relationships flag
ManukMinasyan Sep 6, 2026
4528778
fix(tables): sort a self through-relation by the aliased key
ManukMinasyan Sep 6, 2026
ceecaf5
docs: state the relationship-table memo scope and what the flag creates
ManukMinasyan Sep 6, 2026
2f0f4f6
feat(ui): draw a linked record as a chip that says where it came from
ManukMinasyan Sep 6, 2026
aa75514
feat(ui): pick a field type from a grid and read the pairs in the table
ManukMinasyan Sep 6, 2026
01a5e6d
test(ui): render the configurator's own children, not only its frame
ManukMinasyan Sep 6, 2026
c5d2553
fix(ui): announce a selection after it lands, not before
ManukMinasyan Sep 6, 2026
2ec8e67
chore: lock larastan and filament at the versions ci resolves
ManukMinasyan Sep 6, 2026
4400b0a
fix(ui): set a polished view only when one resolves
ManukMinasyan Sep 6, 2026
8d1a29c
fix(tables): sort a through column the way the cell reads it
ManukMinasyan Sep 6, 2026
b146345
fix(ui): resolve the configurator view through the flavor registry
ManukMinasyan Sep 6, 2026
ac75268
fix(tables): validate, search and hide a record column like every oth…
ManukMinasyan Sep 6, 2026
83aa211
fix: save an emptied field, open the record form on its defaults
ManukMinasyan Sep 6, 2026
24500d1
fix(ui): confirm one record's move, and count in words
ManukMinasyan Sep 6, 2026
e8cb9fb
fix(ui): draw the type grid from the field's own options
ManukMinasyan Sep 6, 2026
1e7ef7a
test(ui): run the forked surfaces in both flavors in ci
ManukMinasyan Sep 6, 2026
d768604
feat: split record and relationship into two field types
ManukMinasyan Sep 6, 2026
b3a701e
feat: paste a list of choice options instead of clicking each one
ManukMinasyan Sep 6, 2026
81c8553
feat: give the record field back its own configuration
ManukMinasyan Sep 6, 2026
2480732
feat: draw each link type the surfaces it has always had
ManukMinasyan Sep 6, 2026
917b5ac
docs: say which link type to pick, and that record kept its face
ManukMinasyan Sep 6, 2026
c8eaa25
feat: give workflow states their own field type
ManukMinasyan Sep 6, 2026
6b230e8
fix: prove a field visible before an empty state clears it
ManukMinasyan Sep 6, 2026
f679399
feat: ask for a category only where an option is a state
ManukMinasyan Sep 6, 2026
d0ddf43
fix: keep the far end of a record field where the user left it
ManukMinasyan Sep 6, 2026
1175f9b
test: pin what the picker remembers after a failed round trip
ManukMinasyan Sep 6, 2026
fa0d854
feat: seed a status field and its categories from a preset
ManukMinasyan Sep 6, 2026
a3bd903
docs: rewrite the 4.0 upgrade guide and document relationships
ManukMinasyan Sep 6, 2026
1899a12
docs: correct the soft-delete read and the cardinality direction
ManukMinasyan Sep 6, 2026
854180a
fix: close out status encryptability, options guard and colour toggle…
ManukMinasyan Sep 6, 2026
8e8713a
fix: allow a system-defined field to change type within its data type
ManukMinasyan Sep 6, 2026
69dfd6e
fix: type CustomField query builder methods to the calling subclass
ManukMinasyan Sep 6, 2026
7ec714a
fix: make the field management page usable on a phone
ManukMinasyan Sep 6, 2026
e097402
feat: let the linked records be reordered from the picker
ManukMinasyan Sep 6, 2026
1074181
build: compile the 4.0 styles into the shipped stylesheet
ManukMinasyan Sep 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .github/instructions/filament.instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Do NOT flag `Filament\Schemas\Components\Component` as incorrect.

- Custom field types live in `src/FieldTypeSystem/Definitions/`
- Validation capabilities live in `src/Validation/Capabilities/`
- Each capability implements `Relaticle\CustomFields\Contracts\ValidationCapability`
- Each capability implements `Relaticle\CustomFields\Contracts\ValidationCapabilityInterface`
- `DateConstraintValue` is a Spatie Laravel Data class -- use `::from()` for hydration, not manual construction

# Data Patterns
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ name: Docs
# caught on the pull request instead of after the merge, when only the deploy runs.
on:
pull_request:
branches: [3.x]
branches: [3.x, 4.x]

permissions:
contents: read
Expand Down
57 changes: 52 additions & 5 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: Tests

on:
push:
branches: [3.x]
branches: [3.x, 4.x]
pull_request:
branches: [3.x]
branches: [3.x, 4.x]
workflow_call:

permissions:
Expand Down Expand Up @@ -41,18 +41,57 @@ jobs:
tests:
runs-on: ubuntu-latest
strategy:
fail-fast: true
fail-fast: false
matrix:
php: [8.4]
laravel: [12.*, 13.*]
stability: [prefer-stable]
db: [sqlite, pgsql, mysql]
flavor: [polished]
include:
- laravel: 12.*
testbench: 10.*
- laravel: 13.*
testbench: 11.*
# The forked UI surfaces render twice, so one leg reads them in the other flavor.
# A flavor no base combination carries adds a leg rather than converting one, and an
# earlier include never reaches a combination a later one creates, so it spells out
# every key it needs.
- php: 8.4
laravel: 13.*
stability: prefer-stable
db: sqlite
flavor: native
testbench: 11.*

name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.stability }}
name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.db }} - ${{ matrix.flavor }}

services:
postgres:
image: postgres:17
env:
POSTGRES_USER: root
POSTGRES_PASSWORD: password
POSTGRES_DB: custom_fields_test
ports:
- 5432:5432
options: >-
--health-cmd="pg_isready"
--health-interval=10s
--health-timeout=5s
--health-retries=5
mysql:
image: mysql:8.4
env:
MYSQL_ALLOW_EMPTY_PASSWORD: yes
MYSQL_DATABASE: custom_fields_test
ports:
- 3306:3306
options: >-
--health-cmd="mysqladmin ping"
--health-interval=10s
--health-timeout=5s
--health-retries=5

steps:
- name: Checkout code
Expand All @@ -62,7 +101,7 @@ jobs:
uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # 2.37.2
with:
php-version: ${{ matrix.php }}
extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo
extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, pdo_pgsql, pgsql, pdo_mysql, mysqli, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo
coverage: none

- name: Install dependencies
Expand All @@ -80,6 +119,14 @@ jobs:
run: vendor/bin/rector --dry-run --no-progress-bar

- name: Run Pest
env:
DB_CONNECTION: ${{ matrix.db }}
DB_HOST: 127.0.0.1
DB_PORT: ${{ matrix.db == 'pgsql' && '5432' || '3306' }}
DB_DATABASE: custom_fields_test
DB_USERNAME: root
DB_PASSWORD: ${{ matrix.db == 'pgsql' && 'password' || '' }}
CUSTOM_FIELDS_UI_FLAVOR: ${{ matrix.flavor }}
run: vendor/bin/pest --ci

gate:
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ A powerful Laravel/Filament plugin for adding dynamic custom fields to any Eloqu
## Features

- **20+ Field Types** - Text, date, select, file upload, rich editor, and more
- **Record Links** - Link records to records, one-way or paired, stored in an edge ledger
- **Workflow States** - Status fields whose options carry a machine-readable category
- **Conditional Visibility** - Show/hide fields based on other field values
- **Multi-tenancy** - Complete tenant isolation and context management
- **Filament Integration** - Forms, tables, infolists, and admin interface
Expand Down
Loading