Skip to content

Commit ad145f5

Browse files
Merge pull request #64 from gigili/main
Feat: Add more property support to custom fields
2 parents b360f6a + 5c590dd commit ad145f5

File tree

2 files changed

+136
-45
lines changed

2 files changed

+136
-45
lines changed

README.md

+71-27
Original file line numberDiff line numberDiff line change
@@ -294,47 +294,91 @@ return [
294294
'show_custom_fields' => true,
295295
'custom_fields' => [
296296
'custom_field_1' => [
297-
'type' => 'text',
298-
'label' => 'Custom Textfield 1',
299-
'placeholder' => 'Custom Field 1',
300-
'required' => true,
301-
'rules' => 'required|string|max:255',
297+
'type' => 'text', // required
298+
'label' => 'Custom Textfield 1', // required
299+
'placeholder' => 'Custom Field 1', // optional
300+
'required' => true, // optional
301+
'rules' => [], // optional
302+
'hint_icon' => '', // optional
303+
'hint' => '', // optional
304+
'suffix_icon' => '', // optional
305+
'prefix_icon' => '', // optional
306+
'default' => '', // optional
307+
'column_span' => 'full', // optional
308+
'autocomplete' => false, // optional
302309
],
303310
'custom_field_2' => [
304-
'type' => 'password',
305-
'label' => 'Custom Password field 2',
306-
'placeholder' => 'Custom Password Field 2',
307-
'required' => true,
308-
'rules' => 'required|string|max:255',
311+
'type' => 'password', // required
312+
'label' => 'Custom Password field 2', // required
313+
'placeholder' => 'Custom Password Field 2', // optional
314+
'required' => true, // optional
315+
'rules' => [], // optional
316+
'hint_icon' => '', // optional
317+
'hint' => '', // optional
318+
'default' => '', // optional
319+
'column_span' => 'full',
320+
'revealable' => true, // optional
321+
'autocomplete' => true, // optional
309322
],
310323
'custom_field_3' => [
311-
'type' => 'select',
312-
'label' => 'Custom Select 3',
313-
'placeholder' => 'Select',
314-
'required' => true,
324+
'type' => 'select', // required
325+
'label' => 'Custom Select 3', // required
326+
'placeholder' => 'Select', // optional
327+
'required' => true, // optional
315328
'options' => [
316329
'option_1' => 'Option 1',
317330
'option_2' => 'Option 2',
318331
'option_3' => 'Option 3',
319-
],
332+
], // optional
333+
'selectable_placeholder' => true // optional
334+
'native' => true // optional
335+
'preload' => true // optional
336+
'suffix_icon' => '', // optional
337+
'default' => '', // optional
338+
'searchable' => true, // optional
339+
'column_span' => 'full', // optional
340+
'rules' => [], // optional
341+
'hint_icon' => '', // optional
342+
'hint' => '', // optional
320343
],
321344
'custom_field_4' => [
322-
'type' =>'textarea',
323-
'label' => 'Custom Textarea 4',
324-
'placeholder' => 'Textarea',
325-
'rows' => '3',
326-
'required' => true,
345+
'type' =>'textarea', // required
346+
'label' => 'Custom Textarea 4', // required
347+
'placeholder' => 'Textarea', // optional
348+
'rows' => '3', // optional
349+
'required' => true, // optional
350+
'hint_icon' => '', // optional
351+
'hint' => '', // optional
352+
'default' => '', // optional
353+
'rules' => [], // optional
354+
'column_span' => 'full', // optional
327355
],
328356
'custom_field_5' => [
329-
'type' => 'datetime',
330-
'label' => 'Custom Datetime 5',
331-
'placeholder' => 'Datetime',
332-
'seconds' => false,
357+
'type' => 'datetime', // required
358+
'label' => 'Custom Datetime 5', // required
359+
'placeholder' => 'Datetime', // optional
360+
'seconds' => false, // optional
361+
'required' => true, // optional
362+
'hint_icon' => '', // optional
363+
'hint' => '', // optional
364+
'default' => '', // optional
365+
'suffix_icon' => '', // optional
366+
'prefix_icon' => '', // optional
367+
'rules' => [], // optional
368+
'format' => 'Y-m-d H:i:s', // optional
369+
'time' => true, // optional
370+
'native' => true, // optional
371+
'column_span' => 'full', // optional
333372
],
334373
'custom_field_6' => [
335-
'type' => 'boolean',
336-
'label' => 'Custom Boolean 6',
337-
'placeholder' => 'Boolean'
374+
'type' => 'boolean', // required
375+
'label' => 'Custom Boolean 6', // required
376+
'placeholder' => 'Boolean', // optional
377+
'hint_icon' => '', // optional
378+
'hint' => '', // optional
379+
'default' => '', // optional
380+
'rules' => [], // optional
381+
'column_span' => 'full', // optional
338382
],
339383
]
340384
];

src/Livewire/CustomFieldsForm.php

+65-18
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public function form(Form $form): Form
4949
Forms\Components\Section::make(__('filament-edit-profile::default.custom_fields'))
5050
->aside()
5151
->description(__('filament-edit-profile::default.custom_fields_description'))
52+
->columns()
5253
->schema($fields),
5354
])
5455
->model($this->getUser())
@@ -84,9 +85,10 @@ private static function createFieldFromString(string $fieldKey, array $field): ?
8485

8586
return $class::make($fieldKey)
8687
->label(__($field['label']))
87-
->placeholder(__($field['placeholder']))
88-
->required($field['required'])
89-
->rules($field['rules']);
88+
->placeholder(__($field['placeholder'] ?? null))
89+
->required($field['required'] ?? false)
90+
->columnSpan($field['column_span'] ?? 'full')
91+
->rules($field['rules'] ?? []);
9092

9193
} catch (Throwable $exception) {
9294
}
@@ -96,51 +98,96 @@ private static function createTextInput(string $fieldKey, array $field): TextInp
9698
{
9799
return TextInput::make($fieldKey)
98100
->label(__($field['label']))
99-
->placeholder(__($field['placeholder']))
100-
->required($field['required'])
101-
->rules($field['rules']);
101+
->placeholder(__($field['placeholder'] ?? null))
102+
->required($field['required'] ?? false)
103+
->hintIcon($field['hint_icon'] ?? null)
104+
->hint(__($field['hint'] ?? null))
105+
->suffixIcon($field['suffix_icon'] ?? null)
106+
->prefixIcon($field['prefix_icon'] ?? null)
107+
->default($field['default'] ?? null)
108+
->rules($field['rules'] ?? [])
109+
->autocomplete($field['autocomplete'] ?? false)
110+
->columnSpan($field['column_span'] ?? 'full');
102111
}
103112

104113
private static function createPasswordInput(string $fieldKey, array $field): TextInput
105114
{
106115
return TextInput::make($fieldKey)
107116
->label(__($field['label']))
108-
->placeholder(__($field['placeholder']))
109-
->required($field['required'])
117+
->placeholder(__($field['placeholder'] ?? null))
118+
->hintIcon($field['hint_icon'] ?? null)
119+
->hint(__($field['hint'] ?? null))
120+
->required($field['required'] ?? false)
121+
->revealable($field['revealable'] ?? true)
122+
->autocomplete($field['autocomplete'] ?? true)
110123
->password()
111-
->rules($field['rules']);
124+
->default($field['default'] ?? null)
125+
->rules($field['rules'] ?? [])
126+
->columnSpan($field['column_span'] ?? 'full');
112127
}
113128

114129
private static function createCheckbox(string $fieldKey, array $field): Checkbox
115130
{
116131
return Checkbox::make($fieldKey)
117-
->label(__($field['label']));
132+
->label(__($field['label']))
133+
->required($field['required'] ?? false)
134+
->hintIcon($field['hint_icon'] ?? null)
135+
->hint(__($field['hint'] ?? null))
136+
->default($field['default'] ?? null)
137+
->rules($field['rules'] ?? [])
138+
->columnSpan($field['column_span'] ?? 'full');
118139
}
119140

120141
private static function createSelect(string $fieldKey, array $field): Select
121142
{
122143
return Select::make($fieldKey)
123144
->label(__($field['label']))
124-
->placeholder(__($field['placeholder']))
125-
->options($field['options'])
126-
->required($field['required']);
145+
->placeholder(__($field['placeholder'] ?? null))
146+
->options($field['options'] ?? [])
147+
->required($field['required'] ?? false)
148+
->selectablePlaceholder($field['selectable_placeholder'] ?? true)
149+
->native($field['native'] ?? true)
150+
->preload($field['preload'] ?? true)
151+
->suffixIcon($field['suffix_icon'] ?? null)
152+
->default($field['default'] ?? null)
153+
->searchable($field['searchable'] ?? true)
154+
->columnSpan($field['column_span'] ?? 'full')
155+
->hint($field['hint'] ?? null)
156+
->hintIcon($field['hint_icon'] ?? null)
157+
->rules($field['rules'] ?? []);
127158
}
128159

129160
private static function createTextarea(string $fieldKey, array $field): Textarea
130161
{
131162
return Textarea::make($fieldKey)
132163
->label(__($field['label']))
133-
->placeholder(__($field['placeholder']))
134-
->rows($field['rows'])
135-
->required($field['required']);
164+
->placeholder(__($field['placeholder'] ?? null))
165+
->required($field['required'] ?? false)
166+
->hintIcon($field['hint_icon'] ?? null)
167+
->hint(__($field['hint'] ?? null))
168+
->default($field['default'] ?? null)
169+
->rules($field['rules'] ?? [])
170+
->rows($field['rows'] ?? 3)
171+
->columnSpan($field['column_span'] ?? 'full');
136172
}
137173

138174
private static function createDateTimePicker(string $fieldKey, array $field): DateTimePicker
139175
{
140176
return DateTimePicker::make($fieldKey)
141177
->label(__($field['label']))
142-
->placeholder(__($field['placeholder']))
143-
->seconds($field['seconds']);
178+
->placeholder(__($field['placeholder'] ?? null))
179+
->required($field['required'] ?? false)
180+
->hintIcon($field['hint_icon'] ?? null)
181+
->hint(__($field['hint'] ?? null))
182+
->suffixIcon($field['suffix_icon'] ?? null)
183+
->prefixIcon($field['prefix_icon'] ?? null)
184+
->default($field['default'] ?? null)
185+
->rules($field['rules'] ?? [])
186+
->format($field['format'] ?? 'Y-m-d H:i:s')
187+
->time($field['time'] ?? true)
188+
->native($field['native'] ?? true)
189+
->columnSpan($field['column_span'] ?? 'full')
190+
->seconds($field['seconds'] ?? true);
144191
}
145192

146193
public function updateCustomFields(): void

0 commit comments

Comments
 (0)