Skip to content

Commit 449f6e6

Browse files
committed
Squashed 'packages/fields/' changes from 1520150..07f5929
07f5929 fix: reordering bug with drag n drop in repeater (#47) df174de fix: selecting relationship options (#46) git-subtree-dir: packages/fields git-subtree-split: 07f5929d60b10abadafee0759b93c5d5f83380e6
1 parent 3d5e87c commit 449f6e6

File tree

2 files changed

+63
-4
lines changed

2 files changed

+63
-4
lines changed

src/Concerns/HasSelectableValues.php

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,23 @@ protected function selectableValuesFormFields(string $type, string $label, strin
288288
Select::make('relationKey')
289289
->label(__('Key Column'))
290290
->helperText(__('The column to use as the unique identifier/value for each option'))
291-
->options(fn (Get $get) => $get('relationKey_options') ?? [])
291+
->options(function (Get $get) {
292+
$resource = $get('resource');
293+
if (! $resource) {
294+
return [];
295+
}
296+
297+
$model = static::resolveResourceModel($resource);
298+
if (! $model) {
299+
return [];
300+
}
301+
302+
$columns = Schema::getColumnListing($model->getTable());
303+
304+
return collect($columns)->mapWithKeys(function ($column) {
305+
return [$column => Str::title($column)];
306+
})->toArray();
307+
})
292308
->searchable()
293309
->visible(fn (Get $get): bool => ! empty($get('resource')))
294310
->required(
@@ -298,7 +314,23 @@ protected function selectableValuesFormFields(string $type, string $label, strin
298314
Select::make('relationValue')
299315
->label(__('Display Column'))
300316
->helperText(__('The column to use as the display text/label for each option'))
301-
->options(fn (Get $get) => $get('relationValue_options') ?? [])
317+
->options(function (Get $get) {
318+
$resource = $get('resource');
319+
if (! $resource) {
320+
return [];
321+
}
322+
323+
$model = static::resolveResourceModel($resource);
324+
if (! $model) {
325+
return [];
326+
}
327+
328+
$columns = Schema::getColumnListing($model->getTable());
329+
330+
return collect($columns)->mapWithKeys(function ($column) {
331+
return [$column => Str::title($column)];
332+
})->toArray();
333+
})
302334
->searchable()
303335
->visible(fn (Get $get): bool => ! empty($get('resource')))
304336
->required(fn (Get $get): bool => ! empty($get('resource'))),

src/Fields/Repeater.php

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,14 @@ public static function make(string $name, ?Field $field = null): Input
5959
{
6060
$input = self::applyDefaultSettings(Input::make($name), $field);
6161

62+
$isReorderable = $field->config['reorderable'] ?? self::getDefaultConfig()['reorderable'];
63+
$isReorderableWithButtons = $field->config['reorderableWithButtons'] ?? self::getDefaultConfig()['reorderableWithButtons'];
64+
6265
$input = $input->label($field->name ?? self::getDefaultConfig()['label'] ?? null)
6366
->addActionLabel($field->config['addActionLabel'] ?? self::getDefaultConfig()['addActionLabel'])
6467
->addable($field->config['addable'] ?? self::getDefaultConfig()['addable'])
6568
->deletable($field->config['deletable'] ?? self::getDefaultConfig()['deletable'])
66-
->reorderable($field->config['reorderable'] ?? self::getDefaultConfig()['reorderable'])
69+
->reorderable($isReorderable)
6770
->collapsible($field->config['collapsible'] ?? self::getDefaultConfig()['collapsible'])
6871
->cloneable($field->config['cloneable'] ?? self::getDefaultConfig()['cloneable'])
6972
->columns($field->config['columns'] ?? self::getDefaultConfig()['columns']);
@@ -72,10 +75,34 @@ public static function make(string $name, ?Field $field = null): Input
7275
$input = $input->compact();
7376
}
7477

75-
if ($field->config['reorderableWithButtons'] ?? self::getDefaultConfig()['reorderableWithButtons']) {
78+
if ($isReorderableWithButtons) {
7679
$input = $input->reorderableWithButtons();
7780
}
7881

82+
// Fix for Filament Forms v4.2.0 reorder bug
83+
// The default reorder action has a bug where array_flip() creates integer values
84+
// that get merged with the state array, causing type errors
85+
if ($isReorderable || $isReorderableWithButtons) {
86+
$input = $input->reorderAction(function ($action) {
87+
return $action->action(function (array $arguments, Input $component): void {
88+
$currentState = $component->getRawState();
89+
$newOrder = $arguments['items'];
90+
91+
// Reorder the items based on the new order
92+
$reorderedItems = [];
93+
foreach ($newOrder as $oldIndex) {
94+
if (isset($currentState[$oldIndex])) {
95+
$reorderedItems[] = $currentState[$oldIndex];
96+
}
97+
}
98+
99+
$component->rawState($reorderedItems);
100+
$component->callAfterStateUpdated();
101+
$component->shouldPartiallyRenderAfterActionsCalled() ? $component->partiallyRender() : null;
102+
});
103+
});
104+
}
105+
79106
if ($field && ! $field->relationLoaded('children')) {
80107
$field->load('children');
81108
}

0 commit comments

Comments
 (0)