diff --git a/composer.lock b/composer.lock index de5c5bb0..5458eeca 100644 --- a/composer.lock +++ b/composer.lock @@ -2813,16 +2813,16 @@ }, { "name": "lara-zeus/list-group", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/lara-zeus/list-group.git", - "reference": "3d23f8726f1b66c1e191326ae14eda1c4bf21e72" + "reference": "c4fb7ca637556561d982231258d7cb20112ea17e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lara-zeus/list-group/zipball/3d23f8726f1b66c1e191326ae14eda1c4bf21e72", - "reference": "3d23f8726f1b66c1e191326ae14eda1c4bf21e72", + "url": "https://api.github.com/repos/lara-zeus/list-group/zipball/c4fb7ca637556561d982231258d7cb20112ea17e", + "reference": "c4fb7ca637556561d982231258d7cb20112ea17e", "shasum": "" }, "require": { @@ -2831,11 +2831,11 @@ "spatie/laravel-package-tools": "^1.16" }, "require-dev": { - "larastan/larastan": "^2.0", "laravel/pint": "^1.0", - "nunomaduro/collision": "^7.0", + "nunomaduro/collision": "^8.0", + "nunomaduro/larastan": "^2.0.1", "nunomaduro/phpinsights": "^2.8", - "orchestra/testbench": "^8.0", + "orchestra/testbench": "^9.0", "phpstan/extension-installer": "^1.1" }, "type": "library", @@ -2895,7 +2895,7 @@ "type": "github" } ], - "time": "2025-06-11T19:19:30+00:00" + "time": "2025-10-22T17:55:07+00:00" }, { "name": "lara-zeus/spatie-translatable", @@ -3022,16 +3022,16 @@ }, { "name": "laravel/framework", - "version": "v12.35.0", + "version": "v12.35.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "9583ef9e405a71d5b8c04ff6efd05a7ef9a5baef" + "reference": "d6d6e3cb68238e2fb25b440f222442adef5a8a15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/9583ef9e405a71d5b8c04ff6efd05a7ef9a5baef", - "reference": "9583ef9e405a71d5b8c04ff6efd05a7ef9a5baef", + "url": "https://api.github.com/repos/laravel/framework/zipball/d6d6e3cb68238e2fb25b440f222442adef5a8a15", + "reference": "d6d6e3cb68238e2fb25b440f222442adef5a8a15", "shasum": "" }, "require": { @@ -3237,7 +3237,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-10-21T15:15:41+00:00" + "time": "2025-10-23T15:25:03+00:00" }, { "name": "laravel/prompts", @@ -10199,16 +10199,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.89.0", + "version": "v3.89.1", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "4dd6768cb7558440d27d18f54909eee417317ce9" + "reference": "f34967da2866ace090a2b447de1f357356474573" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/4dd6768cb7558440d27d18f54909eee417317ce9", - "reference": "4dd6768cb7558440d27d18f54909eee417317ce9", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/f34967da2866ace090a2b447de1f357356474573", + "reference": "f34967da2866ace090a2b447de1f357356474573", "shasum": "" }, "require": { @@ -10290,7 +10290,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.89.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.89.1" }, "funding": [ { @@ -10298,7 +10298,7 @@ "type": "github" } ], - "time": "2025-10-18T19:30:16+00:00" + "time": "2025-10-24T12:05:10+00:00" }, { "name": "hamcrest/hamcrest-php", diff --git a/src/Concerns/HasOptions.php b/src/Concerns/HasOptions.php index 53d537d9..6273c7a7 100644 --- a/src/Concerns/HasOptions.php +++ b/src/Concerns/HasOptions.php @@ -2,21 +2,14 @@ namespace LaraZeus\Bolt\Concerns; -use Filament\Actions\Action; use Filament\Forms\Components\ColorPicker; -use Filament\Forms\Components\Repeater; -use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; use Filament\Forms\Components\Toggle; use Filament\Schemas\Components\Grid; -use Filament\Schemas\Components\Utilities\Get; -use Filament\Schemas\Components\Utilities\Set; use Guava\IconPicker\Forms\Components\IconPicker; use LaraZeus\Accordion\Forms\Accordion; -use LaraZeus\Bolt\BoltPlugin; use LaraZeus\Bolt\Concerns\Options\DataSource; use LaraZeus\Bolt\Concerns\Options\Visibility; -use LaraZeus\Bolt\Facades\Bolt; trait HasOptions { @@ -80,85 +73,6 @@ public static function hiddenLabel(): Grid ->columns(1); } - public static function dataSource(): Grid - { - $dataSources = BoltPlugin::getModel('Collection')::get() - ->mapWithKeys(function ($item, $key) { - return [ - $key => [ - 'title' => $item['name'], - 'class' => $item['id'], - ], - ]; - }) - ->toBase() - ->merge( - Bolt::availableDataSource() - ->mapWithKeys(function ($item, $key) { - return [ - $key => [ - 'title' => $item['title'], - 'class' => $item['class'], - ], - ]; - }) - ) - ->pluck('title', 'class'); - - return Grid::make() - ->schema([ - Select::make('options.dataSource') - ->createOptionAction(fn (Action $action) => $action->hidden(auth()->user()->cannot('create', BoltPlugin::getModel('Collection')))) - ->required() - ->createOptionForm([ - TextInput::make('name') - ->live(onBlur: true) - ->label(__('zeus-bolt::forms.options.collections.label')) - ->required() - ->maxLength(255) - ->columnSpan(2), - Repeater::make('values') - ->grid([ - 'default' => 1, - 'md' => 2, - 'lg' => 3, - ]) - ->label(__('zeus-bolt::forms.options.collections.values')) - ->columnSpan(2) - ->columns(1) - ->schema([ - TextInput::make('itemValue') - ->live(onBlur: true) - ->afterStateUpdated(function (Set $set, Get $get, string $operation) { - $set('itemKey', $get('itemValue')); - }) - ->required() - ->label(__('zeus-bolt::forms.options.collections.values')) - ->hint(__('zeus-bolt::forms.options.collections.value_hint')), - TextInput::make('itemKey') - ->live(onBlur: true) - ->required() - ->label(__('zeus-bolt::forms.options.collections.key')) - ->hint(__('what store in the form')), - Toggle::make('itemIsDefault') - ->label(__('zeus-bolt::forms.options.collections.is_default')), - ]), - ]) - ->createOptionUsing(function (array $data) { - $collectionModel = BoltPlugin::getModel('Collection'); - $collection = new $collectionModel; - $collection->fill($data); - $collection->save(); - - return $collection->id; - }) - ->options($dataSources) - ->label(__('zeus-bolt::forms.options.data_source.label')), - ]) - ->columnSpanFull() - ->columns(1); - } - public static function htmlID(): Grid { return Grid::make() diff --git a/src/Filament/Resources/CollectionResource/Pages/CreateCollection.php b/src/Filament/Resources/CollectionResource/Pages/CreateCollection.php index e2c7fc83..93edb87b 100644 --- a/src/Filament/Resources/CollectionResource/Pages/CreateCollection.php +++ b/src/Filament/Resources/CollectionResource/Pages/CreateCollection.php @@ -4,8 +4,19 @@ use Filament\Resources\Pages\CreateRecord; use LaraZeus\Bolt\Filament\Resources\CollectionResource; +use LaraZeus\SpatieTranslatable\Actions\LocaleSwitcher; +use LaraZeus\SpatieTranslatable\Resources\Pages\CreateRecord\Concerns\Translatable; class CreateCollection extends CreateRecord { + use Translatable; + protected static string $resource = CollectionResource::class; + + protected function getHeaderActions(): array + { + return [ + LocaleSwitcher::make(), + ]; + } } diff --git a/src/Filament/Resources/CollectionResource/Pages/EditCollection.php b/src/Filament/Resources/CollectionResource/Pages/EditCollection.php index 31fb2254..d2759420 100644 --- a/src/Filament/Resources/CollectionResource/Pages/EditCollection.php +++ b/src/Filament/Resources/CollectionResource/Pages/EditCollection.php @@ -5,9 +5,13 @@ use Filament\Resources\Pages\EditRecord; use LaraZeus\Bolt\Filament\Resources\CollectionResource; use LaraZeus\Bolt\Filament\Resources\CollectionResource\Widgets\EditCollectionWarning; +use LaraZeus\SpatieTranslatable\Actions\LocaleSwitcher; +use LaraZeus\SpatieTranslatable\Resources\Pages\EditRecord\Concerns\Translatable; class EditCollection extends EditRecord { + use Translatable; + protected static string $resource = CollectionResource::class; protected function getHeaderWidgets(): array @@ -16,4 +20,11 @@ protected function getHeaderWidgets(): array EditCollectionWarning::class, ]; } + + protected function getHeaderActions(): array + { + return [ + LocaleSwitcher::make(), + ]; + } } diff --git a/src/Filament/Resources/CollectionResource/Pages/ListCollections.php b/src/Filament/Resources/CollectionResource/Pages/ListCollections.php index 64784adb..00b32a44 100644 --- a/src/Filament/Resources/CollectionResource/Pages/ListCollections.php +++ b/src/Filament/Resources/CollectionResource/Pages/ListCollections.php @@ -5,14 +5,19 @@ use Filament\Actions\CreateAction; use Filament\Resources\Pages\ListRecords; use LaraZeus\Bolt\Filament\Resources\CollectionResource; +use LaraZeus\SpatieTranslatable\Actions\LocaleSwitcher; +use LaraZeus\SpatieTranslatable\Resources\Pages\ListRecords\Concerns\Translatable; class ListCollections extends ListRecords { + use Translatable; + protected static string $resource = CollectionResource::class; protected function getHeaderActions(): array { return [ + LocaleSwitcher::make(), CreateAction::make(), ]; } diff --git a/src/Models/Collection.php b/src/Models/Collection.php index 160446c1..9b9322bd 100644 --- a/src/Models/Collection.php +++ b/src/Models/Collection.php @@ -7,8 +7,10 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\SoftDeletes; +use JsonException; use LaraZeus\Bolt\Concerns\HasUpdates; use LaraZeus\Bolt\Database\Factories\CollectionFactory; +use Spatie\Translatable\HasTranslations; /** * @property string $updated_at @@ -17,13 +19,16 @@ class Collection extends Model { use HasFactory; + use HasTranslations; use HasUpdates; use SoftDeletes; protected $guarded = []; + public $translatable = ['name', 'values']; + protected $casts = [ - 'values' => 'collection', + 'values' => 'array', ]; public function getTable(): string @@ -47,6 +52,52 @@ public function getValuesListAttribute(): ?string return null; } + public function getNameAttribute($value) + { + if ($this->hasTranslation('name')) { + return $value; + } + + return $this->getRawOriginal('name'); + } + + /** + * @throws JsonException + */ + public function getValuesAttribute($value) + { + if ($this->hasTranslation('values')) { + return $value; + } + + if (filled($this->getRawOriginal('values'))) { + return json_decode($this->getRawOriginal('values'), true, 512, JSON_THROW_ON_ERROR); + } + + return $this->getRawOriginal('values'); + } + + /** + * @param $value + * @return \Illuminate\Support\Collection + */ + /*public function getValuesAttribute($value) + { + if($value instanceof \Illuminate\Support\Collection){ + return $value; + } + if(empty($value)){ + return collect(); + } + if(is_array($value)){ + return collect($value); + } + if(is_string($value)){ + return collect(json_encode($value)); + } + return collect($value); + }*/ + protected static function newFactory(): Factory { return CollectionFactory::new();