Skip to content

Commit 73ea2a6

Browse files
committed
Add fields
1 parent dc895a1 commit 73ea2a6

19 files changed

+1506
-25
lines changed

composer.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@
2121
],
2222
"require": {
2323
"php": "^8.1",
24+
"baspa/laravel-timezones": "^1.2",
2425
"filament/filament": "^3.0",
25-
"spatie/laravel-package-tools": "^1.15.0",
2626
"saade/filament-adjacency-list": "^3.2",
27+
"spatie/laravel-package-tools": "^1.15.0",
2728
"staudenmeir/laravel-adjacency-list": "^1.0"
2829
},
2930
"require-dev": {
@@ -75,4 +76,4 @@
7576
},
7677
"minimum-stability": "dev",
7778
"prefer-stable": true
78-
}
79+
}

src/Concerns/HasFieldsMapper.php

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,44 @@
22

33
namespace Vormkracht10\FilamentFields\Concerns;
44

5-
use Illuminate\Support\Collection;
65
use Livewire\Attributes\On;
76
use Vormkracht10\Fields\Fields;
8-
use Vormkracht10\FilamentFields\Contracts\FieldInspector;
7+
use Illuminate\Support\Collection;
98
use Vormkracht10\FilamentFields\Enums\Field;
9+
use Vormkracht10\FilamentFields\Fields\Tags;
10+
use Vormkracht10\FilamentFields\Fields\Text;
11+
use Vormkracht10\FilamentFields\Fields\Color;
12+
use Vormkracht10\FilamentFields\Fields\Radio;
13+
use Vormkracht10\FilamentFields\Fields\Select;
14+
use Vormkracht10\FilamentFields\Fields\Toggle;
15+
use Vormkracht10\FilamentFields\Fields\Checkbox;
16+
use Vormkracht10\FilamentFields\Fields\DateTime;
17+
use Vormkracht10\FilamentFields\Fields\KeyValue;
18+
use Vormkracht10\FilamentFields\Fields\Repeater;
19+
use Vormkracht10\FilamentFields\Fields\Textarea;
20+
use Vormkracht10\FilamentFields\Fields\RichEditor;
21+
use Vormkracht10\FilamentFields\Fields\CheckboxList;
1022
use Vormkracht10\FilamentFields\Models\Field as Model;
23+
use Vormkracht10\FilamentFields\Contracts\FieldInspector;
1124

1225
trait HasFieldsMapper
1326
{
1427
private FieldInspector $fieldInspector;
1528

16-
// TODO: Add the fields
1729
private const FIELD_TYPE_MAP = [
18-
// 'text' => Text::class,
19-
// 'textarea' => Textarea::class,
20-
// 'rich-editor' => RichEditor::class,
21-
// 'repeater' => Repeater::class,
22-
// 'select' => FieldsSelect::class,
23-
// 'checkbox' => Checkbox::class,
24-
// 'checkbox-list' => CheckboxList::class,
25-
// 'media' => Media::class,
26-
// 'key-value' => KeyValue::class,
27-
// 'radio' => Radio::class,
28-
// 'toggle' => Toggle::class,
29-
// 'color' => Color::class,
30-
// 'datetime' => DateTime::class,
31-
// 'tags' => Tags::class,
30+
'text' => Text::class,
31+
'textarea' => Textarea::class,
32+
'rich-editor' => RichEditor::class,
33+
'repeater' => Repeater::class,
34+
// 'select' => Select::class, WIP
35+
'checkbox' => Checkbox::class,
36+
// 'checkbox-list' => CheckboxList::class, WIP
37+
'key-value' => KeyValue::class,
38+
'radio' => Radio::class,
39+
'toggle' => Toggle::class,
40+
'color' => Color::class,
41+
'datetime' => DateTime::class,
42+
'tags' => Tags::class,
3243
];
3344

3445
public function boot(): void
@@ -101,7 +112,7 @@ private function resolveFormFields(): array
101112
$customFields = $this->resolveCustomFields();
102113

103114
return $this->record->fields
104-
->map(fn ($field) => $this->resolveFieldInput($field, $customFields))
115+
->map(fn($field) => $this->resolveFieldInput($field, $customFields))
105116
->filter()
106117
->values()
107118
->all();
@@ -110,11 +121,12 @@ private function resolveFormFields(): array
110121
private function resolveCustomFields(): Collection
111122
{
112123
return collect(Fields::getFields())
113-
->map(fn ($fieldClass) => new $fieldClass);
124+
->map(fn($fieldClass) => new $fieldClass);
114125
}
115126

116127
private function resolveFieldInput(Model $field, Collection $customFields): ?object
117128
{
129+
// TODO: Setting. shoud be dynamic
118130
$inputName = "setting.{$field->slug}";
119131

120132
// Try to resolve from standard field type map
@@ -129,4 +141,4 @@ private function resolveFieldInput(Model $field, Collection $customFields): ?obj
129141

130142
return null;
131143
}
132-
}
144+
}

src/Enums/ColorFormat.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
namespace Vormkracht10\FilamentFields\Enums;
4+
5+
use Vormkracht10\FilamentFields\Concerns\HasSerializableEnumArray;
6+
7+
enum ColorFormat: string
8+
{
9+
use HasSerializableEnumArray;
10+
11+
case HEX = 'hex';
12+
case RGB = 'rgb';
13+
case RGBA = 'rgba';
14+
case HSL = 'hsl';
15+
}

src/Enums/ToggleColor.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace Vormkracht10\FilamentFields\Enums;
4+
5+
use Vormkracht10\FilamentFields\Concerns\HasSerializableEnumArray;
6+
7+
enum ToggleColor: string
8+
{
9+
use HasSerializableEnumArray;
10+
11+
case DANGER = 'danger';
12+
case GRAY = 'gray';
13+
case INFO = 'info';
14+
case PRIMARY = 'primary';
15+
case SUCCESS = 'success';
16+
case WARNING = 'warning';
17+
}

src/Enums/ToolbarButton.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace Vormkracht10\FilamentFields\Enums;
4+
5+
use Vormkracht10\FilamentFields\Concerns\HasSerializableEnumArray;
6+
7+
enum ToolbarButton: string
8+
{
9+
use HasSerializableEnumArray;
10+
11+
case AttachFiles = 'attachFiles';
12+
case Blockquote = 'blockquote';
13+
case Bold = 'bold';
14+
case BulletList = 'bulletList';
15+
case CodeBlock = 'codeBlock';
16+
case H2 = 'h2';
17+
case H3 = 'h3';
18+
case Italic = 'italic';
19+
case Link = 'link';
20+
case OrderedList = 'orderedList';
21+
case Redo = 'redo';
22+
case Strike = 'strike';
23+
case Underline = 'underline';
24+
case Undo = 'undo';
25+
}

src/Fields/Base.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
<?php
22

3-
namespace Vormkracht10\Backstage\Fields;
3+
namespace Vormkracht10\FilamentFields\Fields;
44

55
use Filament\Forms;
66
use Filament\Support\Colors\Color;
77
use Vormkracht10\FilamentFields\Contracts\FieldContract;
88
use Vormkracht10\FilamentFields\Models\Field;
99

10-
abstract class FieldBase implements FieldContract
10+
abstract class Base implements FieldContract
1111
{
1212
public function getForm(): array
1313
{
@@ -89,4 +89,4 @@ protected static function ensureArray($value, string $delimiter = ','): array
8989

9090
return ! empty($value) ? explode($delimiter, $value) : [];
9191
}
92-
}
92+
}

src/Fields/Checkbox.php

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
namespace Vormkracht10\FilamentFields\Fields;
4+
5+
use Filament\Forms;
6+
use Filament\Forms\Components\Checkbox as Input;
7+
use Vormkracht10\FilamentFields\Contracts\FieldContract;
8+
use Vormkracht10\FilamentFields\Models\Field;
9+
10+
class Checkbox extends Base implements FieldContract
11+
{
12+
public static function getDefaultConfig(): array
13+
{
14+
return [
15+
...parent::getDefaultConfig(),
16+
'inline' => false,
17+
'accepted' => null,
18+
'declined' => null,
19+
];
20+
}
21+
22+
public static function make(string $name, Field $field): Input
23+
{
24+
$input = self::applyDefaultSettings(Input::make($name), $field);
25+
26+
$input = $input->label($field->name ?? self::getDefaultConfig()['label'] ?? null)
27+
->inline($field->config['inline'] ?? self::getDefaultConfig()['inline']);
28+
29+
if ($field->config['accepted'] ?? self::getDefaultConfig()['accepted']) {
30+
$input->accepted($field->config['accepted']);
31+
}
32+
33+
if ($field->config['declined'] ?? self::getDefaultConfig()['declined']) {
34+
$input->declined($field->config['declined']);
35+
}
36+
37+
return $input;
38+
}
39+
40+
public function getForm(): array
41+
{
42+
return [
43+
Forms\Components\Tabs::make()
44+
->schema([
45+
Forms\Components\Tabs\Tab::make('General')
46+
->label(__('General'))
47+
->schema([
48+
...parent::getForm(),
49+
]),
50+
Forms\Components\Tabs\Tab::make('Field specific')
51+
->label(__('Field specific'))
52+
->schema([
53+
Forms\Components\Grid::make(2)->schema([
54+
55+
Forms\Components\Toggle::make('config.inline')
56+
->label(__('Inline'))
57+
->inline(false),
58+
Forms\Components\Toggle::make('config.accepted')
59+
->label(__('Accepted'))
60+
->helperText(__('Requires the checkbox to be checked'))
61+
->inline(false),
62+
Forms\Components\Toggle::make('config.declined')
63+
->label(__('Declined'))
64+
->helperText(__('Requires the checkbox to be unchecked'))
65+
->inline(false),
66+
]),
67+
]),
68+
])->columnSpanFull(),
69+
];
70+
}
71+
}

src/Fields/CheckboxList.php

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
<?php
2+
3+
namespace Vormkracht10\FilamentFields\Fields;
4+
5+
use Filament\Forms;
6+
use Filament\Forms\Components\CheckboxList as Input;
7+
use Vormkracht10\Backstage\Concerns\HasOptions;
8+
use Vormkracht10\FilamentFields\Contracts\FieldContract;
9+
use Vormkracht10\FilamentFields\Models\Field;
10+
11+
class CheckboxList extends Base implements FieldContract
12+
{
13+
// use HasOptions;
14+
15+
public static function getDefaultConfig(): array
16+
{
17+
return [
18+
...parent::getDefaultConfig(),
19+
// ...self::getOptionsConfig(),
20+
'searchable' => false,
21+
'allowHtml' => false,
22+
'columns' => 1,
23+
'gridDirection' => 'row',
24+
'bulkToggleable' => false,
25+
'noSearchResultsMessage' => null,
26+
'searchPrompt' => null,
27+
'searchDebounce' => null,
28+
];
29+
}
30+
31+
public static function make(string $name, ?Field $field = null): Input
32+
{
33+
$input = self::applyDefaultSettings(Input::make($name), $field);
34+
35+
$input = $input->label($field->name ?? null)
36+
->searchable($field->config['searchable'] ?? self::getDefaultConfig()['searchable'])
37+
->allowHtml($field->config['allowHtml'] ?? self::getDefaultConfig()['allowHtml'])
38+
->options($field->config['options'] ?? self::getDefaultConfig()['options'])
39+
->descriptions($field->config['descriptions'] ?? self::getDefaultConfig()['descriptions'])
40+
->columns($field->config['columns'] ?? self::getDefaultConfig()['columns'])
41+
->gridDirection($field->config['gridDirection'] ?? self::getDefaultConfig()['gridDirection'])
42+
->bulkToggleable($field->config['bulkToggleable'] ?? self::getDefaultConfig()['bulkToggleable'])
43+
->noSearchResultsMessage($field->config['noSearchResultsMessage'] ?? self::getDefaultConfig()['noSearchResultsMessage'])
44+
->searchPrompt($field->config['searchPrompt'] ?? self::getDefaultConfig()['searchPrompt']);
45+
46+
if (isset($field->config['searchDebounce'])) {
47+
$input->searchDebounce($field->config['searchDebounce']);
48+
}
49+
50+
// $input = self::addOptionsToInput($input, $field);
51+
52+
return $input;
53+
}
54+
55+
public function getForm(): array
56+
{
57+
return [
58+
Forms\Components\Tabs::make()
59+
->schema([
60+
Forms\Components\Tabs\Tab::make('General')
61+
->label(__('General'))
62+
->schema([
63+
...parent::getForm(),
64+
]),
65+
Forms\Components\Tabs\Tab::make('Field specific')
66+
->label(__('Field specific'))
67+
->schema([
68+
Forms\Components\Grid::make(3)
69+
->schema([
70+
Forms\Components\Toggle::make('config.searchable')
71+
->label(__('Searchable'))
72+
->live(debounce: 250)
73+
->inline(false),
74+
Forms\Components\Toggle::make('config.allowHtml')
75+
->label(__('Allow HTML'))
76+
->inline(false),
77+
Forms\Components\Toggle::make('config.bulkToggleable')
78+
->label(__('Bulk toggle'))
79+
->inline(false),
80+
]),
81+
// self::optionFormFields(),
82+
Forms\Components\Grid::make(2)
83+
->schema([
84+
Forms\Components\TextInput::make('config.columns')
85+
->numeric()
86+
->minValue(1)
87+
->label(__('Columns')),
88+
Forms\Components\Select::make('config.gridDirection')
89+
->options([
90+
'row' => __('Row'),
91+
'column' => __('Column'),
92+
])
93+
->label(__('Grid direction')),
94+
//
95+
Forms\Components\TextInput::make('config.noSearchResultsMessage')
96+
->label(__('No search results message'))
97+
->visible(fn(Forms\Get $get): bool => $get('config.searchable')),
98+
Forms\Components\TextInput::make('config.searchPrompt')
99+
->label(__('Search prompt'))
100+
->visible(fn(Forms\Get $get): bool => $get('config.searchable')),
101+
Forms\Components\TextInput::make('config.searchDebounce')
102+
->numeric()
103+
->minValue(0)
104+
->step(100)
105+
->label(__('Search debounce'))
106+
->visible(fn(Forms\Get $get): bool => $get('config.searchable')),
107+
]),
108+
]),
109+
])->columnSpanFull(),
110+
];
111+
}
112+
}

0 commit comments

Comments
 (0)