diff --git a/app/Filament/Resources/Categories/CategoryResource.php b/app/Filament/Resources/Categories/CategoryResource.php index 1a7bd09f1..5a42ed771 100644 --- a/app/Filament/Resources/Categories/CategoryResource.php +++ b/app/Filament/Resources/Categories/CategoryResource.php @@ -19,6 +19,7 @@ use Filament\Actions\ViewAction; use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; +use Filament\Forms\Components\Toggle; use Filament\Infolists\Components\TextEntry; use Filament\Notifications\Notification; use Filament\Resources\Resource; @@ -146,12 +147,27 @@ public static function table(Table $table): Table ->afterStateUpdated(function (Set $set, $state) { if ($state) { $set('category', null); + $set('new_category', null); + $set('create_new_category', false); } }) ->searchable(), + Toggle::make('create_new_category') + ->label('Create new category') + ->helperText('Enable to create a new category instead of selecting an existing one.') + ->live() + ->disabled(fn (Get $get) => ! $get('playlist')) + ->afterStateUpdated(function (Set $set, $state) { + if ($state) { + $set('category', null); + } else { + $set('new_category', null); + } + }), Select::make('category') ->label('Custom Category') ->disabled(fn (Get $get) => ! $get('playlist')) + ->hidden(fn (Get $get) => $get('create_new_category')) ->helperText(fn (Get $get) => ! $get('playlist') ? 'Select a custom playlist first.' : 'Select the category you would like to assign to the selected series to.') ->options(function ($get) { $customList = CustomPlaylist::find($get('playlist')); @@ -161,16 +177,46 @@ public static function table(Table $table): Table ->toArray() : []; }) ->searchable(), + TextInput::make('new_category') + ->label('New Category Name') + ->helperText('Enter a name for the new category to create.') + ->hidden(fn (Get $get) => ! $get('create_new_category')) + ->disabled(fn (Get $get) => ! $get('playlist')) + ->required(fn (Get $get) => $get('create_new_category')) + ->maxLength(255), ]) ->action(function ($record, array $data): void { $playlist = CustomPlaylist::findOrFail($data['playlist']); $playlist->series()->syncWithoutDetaching($record->series()->pluck('id')); - $tags = $playlist->categoryTags()->get(); - $tag = $playlist->categoryTags()->where('name->en', $data['category'])->first(); - foreach ($record->series()->cursor() as $series) { - // Need to detach any existing tags from this playlist first - $series->detachTags($tags); - $series->attachTag($tag); + + // Determine which tag to use (existing or new) + $tag = null; + if ($data['create_new_category'] && $data['new_category']) { + // Create new category tag + $tagType = $playlist->uuid.'-category'; + $existingTag = \Spatie\Tags\Tag::where('type', $tagType) + ->where('name->en', $data['new_category']) + ->first(); + if ($existingTag) { + $tag = $existingTag; + } else { + $tag = \Spatie\Tags\Tag::create([ + 'name' => ['en' => $data['new_category']], + 'type' => $tagType, + ]); + $playlist->attachTag($tag); + } + } elseif ($data['category']) { + $tag = $playlist->categoryTags()->where('name->en', $data['category'])->first(); + } + + if ($tag) { + $tags = $playlist->categoryTags()->get(); + foreach ($record->series()->cursor() as $series) { + // Need to detach any existing tags from this playlist first + $series->detachTags($tags); + $series->attachTag($tag); + } } })->after(function () { Notification::make() @@ -309,12 +355,27 @@ public static function table(Table $table): Table ->afterStateUpdated(function (Set $set, $state) { if ($state) { $set('category', null); + $set('new_category', null); + $set('create_new_category', false); } }) ->searchable(), + Toggle::make('create_new_category') + ->label('Create new category') + ->helperText('Enable to create a new category instead of selecting an existing one.') + ->live() + ->disabled(fn (Get $get) => ! $get('playlist')) + ->afterStateUpdated(function (Set $set, $state) { + if ($state) { + $set('category', null); + } else { + $set('new_category', null); + } + }), Select::make('category') ->label('Custom Category') ->disabled(fn (Get $get) => ! $get('playlist')) + ->hidden(fn (Get $get) => $get('create_new_category')) ->helperText(fn (Get $get) => ! $get('playlist') ? 'Select a custom playlist first.' : 'Select the category you would like to assign to the selected series to.') ->options(function ($get) { $customList = CustomPlaylist::find($get('playlist')); @@ -324,17 +385,45 @@ public static function table(Table $table): Table ->toArray() : []; }) ->searchable(), + TextInput::make('new_category') + ->label('New Category Name') + ->helperText('Enter a name for the new category to create.') + ->hidden(fn (Get $get) => ! $get('create_new_category')) + ->disabled(fn (Get $get) => ! $get('playlist')) + ->required(fn (Get $get) => $get('create_new_category')) + ->maxLength(255), ]) ->action(function (Collection $records, array $data): void { $playlist = CustomPlaylist::findOrFail($data['playlist']); + + // Determine which tag to use (existing or new) + $tag = null; + if ($data['create_new_category'] && $data['new_category']) { + // Create new category tag + $tagType = $playlist->uuid.'-category'; + $existingTag = \Spatie\Tags\Tag::where('type', $tagType) + ->where('name->en', $data['new_category']) + ->first(); + if ($existingTag) { + $tag = $existingTag; + } else { + $tag = \Spatie\Tags\Tag::create([ + 'name' => ['en' => $data['new_category']], + 'type' => $tagType, + ]); + $playlist->attachTag($tag); + } + } elseif ($data['category']) { + $tag = $playlist->categoryTags()->where('name->en', $data['category'])->first(); + } + $tags = $playlist->categoryTags()->get(); - $tag = $data['category'] ? $playlist->categoryTags()->where('name->en', $data['category'])->first() : null; foreach ($records as $record) { // Sync the series to the custom playlist // This will add the series to the playlist without detaching existing ones // Prevents duplicates in the playlist $playlist->series()->syncWithoutDetaching($record->series()->pluck('id')); - if ($data['category']) { + if ($tag) { foreach ($record->series()->cursor() as $series) { // Need to detach any existing tags from this playlist first $series->detachTags($tags); diff --git a/app/Filament/Resources/Categories/Pages/ViewCategory.php b/app/Filament/Resources/Categories/Pages/ViewCategory.php index 45701287b..52219ec89 100644 --- a/app/Filament/Resources/Categories/Pages/ViewCategory.php +++ b/app/Filament/Resources/Categories/Pages/ViewCategory.php @@ -10,6 +10,8 @@ use Filament\Actions\Action; use Filament\Actions\ActionGroup; use Filament\Forms\Components\Select; +use Filament\Forms\Components\TextInput; +use Filament\Forms\Components\Toggle; use Filament\Notifications\Notification; use Filament\Resources\Pages\ViewRecord; use Filament\Schemas\Components\Utilities\Get; @@ -35,12 +37,27 @@ protected function getHeaderActions(): array ->afterStateUpdated(function (Set $set, $state) { if ($state) { $set('category', null); + $set('new_category', null); + $set('create_new_category', false); } }) ->searchable(), + Toggle::make('create_new_category') + ->label('Create new category') + ->helperText('Enable to create a new category instead of selecting an existing one.') + ->live() + ->disabled(fn (Get $get) => ! $get('playlist')) + ->afterStateUpdated(function (Set $set, $state) { + if ($state) { + $set('category', null); + } else { + $set('new_category', null); + } + }), Select::make('category') ->label('Custom Category') ->disabled(fn (Get $get) => ! $get('playlist')) + ->hidden(fn (Get $get) => $get('create_new_category')) ->helperText(fn (Get $get) => ! $get('playlist') ? 'Select a custom playlist first.' : 'Select the category you would like to assign to the series to.') ->options(function ($get) { $customList = CustomPlaylist::find($get('playlist')); @@ -50,13 +67,41 @@ protected function getHeaderActions(): array ->toArray() : []; }) ->searchable(), + TextInput::make('new_category') + ->label('New Category Name') + ->helperText('Enter a name for the new category to create.') + ->hidden(fn (Get $get) => ! $get('create_new_category')) + ->disabled(fn (Get $get) => ! $get('playlist')) + ->required(fn (Get $get) => $get('create_new_category')) + ->maxLength(255), ]) ->action(function ($record, array $data): void { $playlist = CustomPlaylist::findOrFail($data['playlist']); $playlist->series()->syncWithoutDetaching($record->series()->pluck('id')); - if ($data['category']) { - $tags = $playlist->categoryTags()->get(); + + // Determine which tag to use (existing or new) + $tag = null; + if ($data['create_new_category'] && $data['new_category']) { + // Create new category tag + $tagType = $playlist->uuid.'-category'; + $existingTag = \Spatie\Tags\Tag::where('type', $tagType) + ->where('name->en', $data['new_category']) + ->first(); + if ($existingTag) { + $tag = $existingTag; + } else { + $tag = \Spatie\Tags\Tag::create([ + 'name' => ['en' => $data['new_category']], + 'type' => $tagType, + ]); + $playlist->attachTag($tag); + } + } elseif ($data['category']) { $tag = $playlist->categoryTags()->where('name->en', $data['category'])->first(); + } + + if ($tag) { + $tags = $playlist->categoryTags()->get(); foreach ($record->series()->cursor() as $series) { // Need to detach any existing tags from this playlist first $series->detachTags($tags); diff --git a/app/Filament/Resources/Channels/ChannelResource.php b/app/Filament/Resources/Channels/ChannelResource.php index a3449c6a3..a09546586 100644 --- a/app/Filament/Resources/Channels/ChannelResource.php +++ b/app/Filament/Resources/Channels/ChannelResource.php @@ -458,12 +458,27 @@ public static function getTableBulkActions($addToCustom = true): array ->afterStateUpdated(function (Set $set, $state) { if ($state) { $set('category', null); + $set('new_group', null); + $set('create_new_group', false); } }) ->searchable(), + Toggle::make('create_new_group') + ->label('Create new group') + ->helperText('Enable to create a new group instead of selecting an existing one.') + ->live() + ->disabled(fn (Get $get) => ! $get('playlist')) + ->afterStateUpdated(function (Set $set, $state) { + if ($state) { + $set('category', null); + } else { + $set('new_group', null); + } + }), Select::make('category') ->label('Custom Group') ->disabled(fn (Get $get) => ! $get('playlist')) + ->hidden(fn (Get $get) => $get('create_new_group')) ->helperText(fn (Get $get) => ! $get('playlist') ? 'Select a custom playlist first.' : 'Select the group you would like to assign to the selected channel(s) to.') ->options(function ($get) { $customList = CustomPlaylist::find($get('playlist')); @@ -473,13 +488,40 @@ public static function getTableBulkActions($addToCustom = true): array ->toArray() : []; }) ->searchable(), + TextInput::make('new_group') + ->label('New Group Name') + ->helperText('Enter a name for the new group to create.') + ->hidden(fn (Get $get) => ! $get('create_new_group')) + ->disabled(fn (Get $get) => ! $get('playlist')) + ->required(fn (Get $get) => $get('create_new_group')) + ->maxLength(255), ]) ->action(function (Collection $records, array $data): void { $playlist = CustomPlaylist::findOrFail($data['playlist']); $playlist->channels()->syncWithoutDetaching($records->pluck('id')); - if ($data['category']) { - $tags = $playlist->groupTags()->get(); + + // Determine which tag to use (existing or new) + $tag = null; + if ($data['create_new_group'] && $data['new_group']) { + // Create new group tag + $existingTag = \Spatie\Tags\Tag::where('type', $playlist->uuid) + ->where('name->en', $data['new_group']) + ->first(); + if ($existingTag) { + $tag = $existingTag; + } else { + $tag = \Spatie\Tags\Tag::create([ + 'name' => ['en' => $data['new_group']], + 'type' => $playlist->uuid, + ]); + $playlist->attachTag($tag); + } + } elseif ($data['category']) { $tag = $playlist->groupTags()->where('name->en', $data['category'])->first(); + } + + if ($tag) { + $tags = $playlist->groupTags()->get(); foreach ($records as $record) { // Need to detach any existing tags from this playlist first $record->detachTags($tags); diff --git a/app/Filament/Resources/Groups/GroupResource.php b/app/Filament/Resources/Groups/GroupResource.php index 2f89c76da..ea65d2c54 100644 --- a/app/Filament/Resources/Groups/GroupResource.php +++ b/app/Filament/Resources/Groups/GroupResource.php @@ -170,12 +170,27 @@ public static function table(Table $table): Table ->afterStateUpdated(function (Set $set, $state) { if ($state) { $set('category', null); + $set('new_group', null); + $set('create_new_group', false); } }) ->searchable(), + Toggle::make('create_new_group') + ->label('Create new group') + ->helperText('Enable to create a new group instead of selecting an existing one.') + ->live() + ->disabled(fn (Get $get) => ! $get('playlist')) + ->afterStateUpdated(function (Set $set, $state) { + if ($state) { + $set('category', null); + } else { + $set('new_group', null); + } + }), Select::make('category') ->label('Custom Group') ->disabled(fn (Get $get) => ! $get('playlist')) + ->hidden(fn (Get $get) => $get('create_new_group')) ->helperText(fn (Get $get) => ! $get('playlist') ? 'Select a custom playlist first.' : 'Select the group you would like to assign to the selected channel(s) to.') ->options(function ($get) { $customList = CustomPlaylist::find($get('playlist')); @@ -185,13 +200,40 @@ public static function table(Table $table): Table ->toArray() : []; }) ->searchable(), + TextInput::make('new_group') + ->label('New Group Name') + ->helperText('Enter a name for the new group to create.') + ->hidden(fn (Get $get) => ! $get('create_new_group')) + ->disabled(fn (Get $get) => ! $get('playlist')) + ->required(fn (Get $get) => $get('create_new_group')) + ->maxLength(255), ]) ->action(function ($record, array $data): void { $playlist = CustomPlaylist::findOrFail($data['playlist']); $playlist->channels()->syncWithoutDetaching($record->channels()->pluck('id')); - if ($data['category']) { - $tags = $playlist->groupTags()->get(); + + // Determine which tag to use (existing or new) + $tag = null; + if ($data['create_new_group'] && $data['new_group']) { + // Create new group tag + $existingTag = \Spatie\Tags\Tag::where('type', $playlist->uuid) + ->where('name->en', $data['new_group']) + ->first(); + if ($existingTag) { + $tag = $existingTag; + } else { + $tag = \Spatie\Tags\Tag::create([ + 'name' => ['en' => $data['new_group']], + 'type' => $playlist->uuid, + ]); + $playlist->attachTag($tag); + } + } elseif ($data['category']) { $tag = $playlist->groupTags()->where('name->en', $data['category'])->first(); + } + + if ($tag) { + $tags = $playlist->groupTags()->get(); foreach ($record->channels()->cursor() as $channel) { // Need to detach any existing tags from this playlist first $channel->detachTags($tags); @@ -486,12 +528,27 @@ public static function table(Table $table): Table ->afterStateUpdated(function (Set $set, $state) { if ($state) { $set('category', null); + $set('new_group', null); + $set('create_new_group', false); } }) ->searchable(), + Toggle::make('create_new_group') + ->label('Create new group') + ->helperText('Enable to create a new group instead of selecting an existing one.') + ->live() + ->disabled(fn (Get $get) => ! $get('playlist')) + ->afterStateUpdated(function (Set $set, $state) { + if ($state) { + $set('category', null); + } else { + $set('new_group', null); + } + }), Select::make('category') ->label('Custom Group') ->disabled(fn (Get $get) => ! $get('playlist')) + ->hidden(fn (Get $get) => $get('create_new_group')) ->helperText(fn (Get $get) => ! $get('playlist') ? 'Select a custom playlist first.' : 'Select the group you would like to assign to the selected channel(s) to.') ->options(function ($get) { $customList = CustomPlaylist::find($get('playlist')); @@ -501,17 +558,44 @@ public static function table(Table $table): Table ->toArray() : []; }) ->searchable(), + TextInput::make('new_group') + ->label('New Group Name') + ->helperText('Enter a name for the new group to create.') + ->hidden(fn (Get $get) => ! $get('create_new_group')) + ->disabled(fn (Get $get) => ! $get('playlist')) + ->required(fn (Get $get) => $get('create_new_group')) + ->maxLength(255), ]) ->action(function (Collection $records, array $data): void { $playlist = CustomPlaylist::findOrFail($data['playlist']); + + // Determine which tag to use (existing or new) + $tag = null; + if ($data['create_new_group'] && $data['new_group']) { + // Create new group tag + $existingTag = \Spatie\Tags\Tag::where('type', $playlist->uuid) + ->where('name->en', $data['new_group']) + ->first(); + if ($existingTag) { + $tag = $existingTag; + } else { + $tag = \Spatie\Tags\Tag::create([ + 'name' => ['en' => $data['new_group']], + 'type' => $playlist->uuid, + ]); + $playlist->attachTag($tag); + } + } elseif ($data['category']) { + $tag = $playlist->groupTags()->where('name->en', $data['category'])->first(); + } + $tags = $playlist->groupTags()->get(); - $tag = $data['category'] ? $playlist->groupTags()->where('name->en', $data['category'])->first() : null; foreach ($records as $record) { // Sync the channels to the custom playlist // This will add the channels to the playlist without detaching existing ones // Prevents duplicates in the playlist $playlist->channels()->syncWithoutDetaching($record->channels()->pluck('id')); - if ($data['category']) { + if ($tag) { foreach ($record->channels()->cursor() as $channel) { // Need to detach any existing tags from this playlist first $channel->detachTags($tags); diff --git a/app/Filament/Resources/Groups/Pages/ViewGroup.php b/app/Filament/Resources/Groups/Pages/ViewGroup.php index 7de84aa56..6321c614f 100644 --- a/app/Filament/Resources/Groups/Pages/ViewGroup.php +++ b/app/Filament/Resources/Groups/Pages/ViewGroup.php @@ -43,12 +43,27 @@ protected function getHeaderActions(): array ->afterStateUpdated(function (Set $set, $state) { if ($state) { $set('category', null); + $set('new_group', null); + $set('create_new_group', false); } }) ->searchable(), + Toggle::make('create_new_group') + ->label('Create new group') + ->helperText('Enable to create a new group instead of selecting an existing one.') + ->live() + ->disabled(fn (Get $get) => ! $get('playlist')) + ->afterStateUpdated(function (Set $set, $state) { + if ($state) { + $set('category', null); + } else { + $set('new_group', null); + } + }), Select::make('category') ->label('Custom Group') ->disabled(fn (Get $get) => ! $get('playlist')) + ->hidden(fn (Get $get) => $get('create_new_group')) ->helperText(fn (Get $get) => ! $get('playlist') ? 'Select a custom playlist first.' : 'Select the group you would like to assign to the channels to.') ->options(function ($get) { $customList = CustomPlaylist::find($get('playlist')); @@ -58,13 +73,40 @@ protected function getHeaderActions(): array ->toArray() : []; }) ->searchable(), + TextInput::make('new_group') + ->label('New Group Name') + ->helperText('Enter a name for the new group to create.') + ->hidden(fn (Get $get) => ! $get('create_new_group')) + ->disabled(fn (Get $get) => ! $get('playlist')) + ->required(fn (Get $get) => $get('create_new_group')) + ->maxLength(255), ]) ->action(function ($record, array $data): void { $playlist = CustomPlaylist::findOrFail($data['playlist']); $playlist->channels()->syncWithoutDetaching($record->channels()->pluck('id')); - if ($data['category']) { - $tags = $playlist->groupTags()->get(); + + // Determine which tag to use (existing or new) + $tag = null; + if ($data['create_new_group'] && $data['new_group']) { + // Create new group tag + $existingTag = \Spatie\Tags\Tag::where('type', $playlist->uuid) + ->where('name->en', $data['new_group']) + ->first(); + if ($existingTag) { + $tag = $existingTag; + } else { + $tag = \Spatie\Tags\Tag::create([ + 'name' => ['en' => $data['new_group']], + 'type' => $playlist->uuid, + ]); + $playlist->attachTag($tag); + } + } elseif ($data['category']) { $tag = $playlist->groupTags()->where('name->en', $data['category'])->first(); + } + + if ($tag) { + $tags = $playlist->groupTags()->get(); foreach ($record->channels()->cursor() as $channel) { // Need to detach any existing tags from this playlist first $channel->detachTags($tags); diff --git a/app/Filament/Resources/Series/SeriesResource.php b/app/Filament/Resources/Series/SeriesResource.php index 5542bf6e6..14065c2c4 100644 --- a/app/Filament/Resources/Series/SeriesResource.php +++ b/app/Filament/Resources/Series/SeriesResource.php @@ -487,12 +487,27 @@ public static function getTableBulkActions($addToCustom = true): array ->afterStateUpdated(function (Set $set, $state) { if ($state) { $set('category', null); + $set('new_category', null); + $set('create_new_category', false); } }) ->searchable(), + Toggle::make('create_new_category') + ->label('Create new category') + ->helperText('Enable to create a new category instead of selecting an existing one.') + ->live() + ->disabled(fn (Get $get) => ! $get('playlist')) + ->afterStateUpdated(function (Set $set, $state) { + if ($state) { + $set('category', null); + } else { + $set('new_category', null); + } + }), Select::make('category') ->label('Custom Category') ->disabled(fn (Get $get) => ! $get('playlist')) + ->hidden(fn (Get $get) => $get('create_new_category')) ->helperText(fn (Get $get) => ! $get('playlist') ? 'Select a custom playlist first.' : 'Select the category you would like to assign to the selected series to.') ->options(function ($get) { $customList = CustomPlaylist::find($get('playlist')); @@ -502,13 +517,41 @@ public static function getTableBulkActions($addToCustom = true): array ->toArray() : []; }) ->searchable(), + TextInput::make('new_category') + ->label('New Category Name') + ->helperText('Enter a name for the new category to create.') + ->hidden(fn (Get $get) => ! $get('create_new_category')) + ->disabled(fn (Get $get) => ! $get('playlist')) + ->required(fn (Get $get) => $get('create_new_category')) + ->maxLength(255), ]) ->action(function (Collection $records, array $data): void { $playlist = CustomPlaylist::findOrFail($data['playlist']); $playlist->series()->syncWithoutDetaching($records->pluck('id')); - if ($data['category']) { - $tags = $playlist->categoryTags()->get(); + + // Determine which tag to use (existing or new) + $tag = null; + if ($data['create_new_category'] && $data['new_category']) { + // Create new category tag + $tagType = $playlist->uuid.'-category'; + $existingTag = \Spatie\Tags\Tag::where('type', $tagType) + ->where('name->en', $data['new_category']) + ->first(); + if ($existingTag) { + $tag = $existingTag; + } else { + $tag = \Spatie\Tags\Tag::create([ + 'name' => ['en' => $data['new_category']], + 'type' => $tagType, + ]); + $playlist->attachTag($tag); + } + } elseif ($data['category']) { $tag = $playlist->categoryTags()->where('name->en', $data['category'])->first(); + } + + if ($tag) { + $tags = $playlist->categoryTags()->get(); foreach ($records as $record) { // Need to detach any existing tags from this playlist first $record->detachTags($tags); diff --git a/app/Filament/Resources/VodGroups/Pages/ViewVodGroup.php b/app/Filament/Resources/VodGroups/Pages/ViewVodGroup.php index 7e9014289..22fc941c3 100644 --- a/app/Filament/Resources/VodGroups/Pages/ViewVodGroup.php +++ b/app/Filament/Resources/VodGroups/Pages/ViewVodGroup.php @@ -11,6 +11,7 @@ use Filament\Actions\DeleteAction; use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; +use Filament\Forms\Components\Toggle; use Filament\Notifications\Notification; use Filament\Resources\Pages\ViewRecord; use Filament\Schemas\Components\Utilities\Get; @@ -36,12 +37,27 @@ protected function getHeaderActions(): array ->afterStateUpdated(function (Set $set, $state) { if ($state) { $set('category', null); + $set('new_group', null); + $set('create_new_group', false); } }) ->searchable(), + Toggle::make('create_new_group') + ->label('Create new group') + ->helperText('Enable to create a new group instead of selecting an existing one.') + ->live() + ->disabled(fn (Get $get) => ! $get('playlist')) + ->afterStateUpdated(function (Set $set, $state) { + if ($state) { + $set('category', null); + } else { + $set('new_group', null); + } + }), Select::make('category') ->label('Custom Group') ->disabled(fn (Get $get) => ! $get('playlist')) + ->hidden(fn (Get $get) => $get('create_new_group')) ->helperText(fn (Get $get) => ! $get('playlist') ? 'Select a custom playlist first.' : 'Select the group you would like to assign to the channels to.') ->options(function ($get) { $customList = CustomPlaylist::find($get('playlist')); @@ -51,13 +67,40 @@ protected function getHeaderActions(): array ->toArray() : []; }) ->searchable(), + TextInput::make('new_group') + ->label('New Group Name') + ->helperText('Enter a name for the new group to create.') + ->hidden(fn (Get $get) => ! $get('create_new_group')) + ->disabled(fn (Get $get) => ! $get('playlist')) + ->required(fn (Get $get) => $get('create_new_group')) + ->maxLength(255), ]) ->action(function ($record, array $data): void { $playlist = CustomPlaylist::findOrFail($data['playlist']); $playlist->channels()->syncWithoutDetaching($record->channels()->pluck('id')); - if ($data['category']) { - $tags = $playlist->groupTags()->get(); + + // Determine which tag to use (existing or new) + $tag = null; + if ($data['create_new_group'] && $data['new_group']) { + // Create new group tag + $existingTag = \Spatie\Tags\Tag::where('type', $playlist->uuid) + ->where('name->en', $data['new_group']) + ->first(); + if ($existingTag) { + $tag = $existingTag; + } else { + $tag = \Spatie\Tags\Tag::create([ + 'name' => ['en' => $data['new_group']], + 'type' => $playlist->uuid, + ]); + $playlist->attachTag($tag); + } + } elseif ($data['category']) { $tag = $playlist->groupTags()->where('name->en', $data['category'])->first(); + } + + if ($tag) { + $tags = $playlist->groupTags()->get(); foreach ($record->channels()->cursor() as $channel) { // Need to detach any existing tags from this playlist first $channel->detachTags($tags); diff --git a/app/Filament/Resources/VodGroups/VodGroupResource.php b/app/Filament/Resources/VodGroups/VodGroupResource.php index cbeb7889d..5cbee819e 100644 --- a/app/Filament/Resources/VodGroups/VodGroupResource.php +++ b/app/Filament/Resources/VodGroups/VodGroupResource.php @@ -19,6 +19,7 @@ use Filament\Actions\ViewAction; use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; +use Filament\Forms\Components\Toggle; use Filament\Infolists\Components\TextEntry; use Filament\Notifications\Notification; use Filament\Resources\Resource; @@ -164,12 +165,27 @@ public static function table(Table $table): Table ->afterStateUpdated(function (Set $set, $state) { if ($state) { $set('category', null); + $set('new_group', null); + $set('create_new_group', false); } }) ->searchable(), + Toggle::make('create_new_group') + ->label('Create new group') + ->helperText('Enable to create a new group instead of selecting an existing one.') + ->live() + ->disabled(fn (Get $get) => ! $get('playlist')) + ->afterStateUpdated(function (Set $set, $state) { + if ($state) { + $set('category', null); + } else { + $set('new_group', null); + } + }), Select::make('category') ->label('Custom Group') ->disabled(fn (Get $get) => ! $get('playlist')) + ->hidden(fn (Get $get) => $get('create_new_group')) ->helperText(fn (Get $get) => ! $get('playlist') ? 'Select a custom playlist first.' : 'Select the group you would like to assign to the selected channel(s) to.') ->options(function ($get) { $customList = CustomPlaylist::find($get('playlist')); @@ -179,13 +195,40 @@ public static function table(Table $table): Table ->toArray() : []; }) ->searchable(), + TextInput::make('new_group') + ->label('New Group Name') + ->helperText('Enter a name for the new group to create.') + ->hidden(fn (Get $get) => ! $get('create_new_group')) + ->disabled(fn (Get $get) => ! $get('playlist')) + ->required(fn (Get $get) => $get('create_new_group')) + ->maxLength(255), ]) ->action(function ($record, array $data): void { $playlist = CustomPlaylist::findOrFail($data['playlist']); $playlist->channels()->syncWithoutDetaching($record->channels()->pluck('id')); - if ($data['category']) { - $tags = $playlist->groupTags()->get(); + + // Determine which tag to use (existing or new) + $tag = null; + if ($data['create_new_group'] && $data['new_group']) { + // Create new group tag + $existingTag = \Spatie\Tags\Tag::where('type', $playlist->uuid) + ->where('name->en', $data['new_group']) + ->first(); + if ($existingTag) { + $tag = $existingTag; + } else { + $tag = \Spatie\Tags\Tag::create([ + 'name' => ['en' => $data['new_group']], + 'type' => $playlist->uuid, + ]); + $playlist->attachTag($tag); + } + } elseif ($data['category']) { $tag = $playlist->groupTags()->where('name->en', $data['category'])->first(); + } + + if ($tag) { + $tags = $playlist->groupTags()->get(); foreach ($record->channels()->cursor() as $channel) { // Need to detach any existing tags from this playlist first $channel->detachTags($tags); @@ -358,12 +401,27 @@ public static function table(Table $table): Table ->afterStateUpdated(function (Set $set, $state) { if ($state) { $set('category', null); + $set('new_group', null); + $set('create_new_group', false); } }) ->searchable(), + Toggle::make('create_new_group') + ->label('Create new group') + ->helperText('Enable to create a new group instead of selecting an existing one.') + ->live() + ->disabled(fn (Get $get) => ! $get('playlist')) + ->afterStateUpdated(function (Set $set, $state) { + if ($state) { + $set('category', null); + } else { + $set('new_group', null); + } + }), Select::make('category') ->label('Custom Group') ->disabled(fn (Get $get) => ! $get('playlist')) + ->hidden(fn (Get $get) => $get('create_new_group')) ->helperText(fn (Get $get) => ! $get('playlist') ? 'Select a custom playlist first.' : 'Select the group you would like to assign to the selected channel(s) to.') ->options(function ($get) { $customList = CustomPlaylist::find($get('playlist')); @@ -373,17 +431,44 @@ public static function table(Table $table): Table ->toArray() : []; }) ->searchable(), + TextInput::make('new_group') + ->label('New Group Name') + ->helperText('Enter a name for the new group to create.') + ->hidden(fn (Get $get) => ! $get('create_new_group')) + ->disabled(fn (Get $get) => ! $get('playlist')) + ->required(fn (Get $get) => $get('create_new_group')) + ->maxLength(255), ]) ->action(function (Collection $records, array $data): void { $playlist = CustomPlaylist::findOrFail($data['playlist']); + + // Determine which tag to use (existing or new) + $tag = null; + if ($data['create_new_group'] && $data['new_group']) { + // Create new group tag + $existingTag = \Spatie\Tags\Tag::where('type', $playlist->uuid) + ->where('name->en', $data['new_group']) + ->first(); + if ($existingTag) { + $tag = $existingTag; + } else { + $tag = \Spatie\Tags\Tag::create([ + 'name' => ['en' => $data['new_group']], + 'type' => $playlist->uuid, + ]); + $playlist->attachTag($tag); + } + } elseif ($data['category']) { + $tag = $playlist->groupTags()->where('name->en', $data['category'])->first(); + } + $tags = $playlist->groupTags()->get(); - $tag = $data['category'] ? $playlist->groupTags()->where('name->en', $data['category'])->first() : null; foreach ($records as $record) { // Sync the channels to the custom playlist // This will add the channels to the playlist without detaching existing ones // Prevents duplicates in the playlist $playlist->channels()->syncWithoutDetaching($record->channels()->pluck('id')); - if ($data['category']) { + if ($tag) { foreach ($record->channels()->cursor() as $channel) { // Need to detach any existing tags from this playlist first $channel->detachTags($tags); diff --git a/app/Filament/Resources/Vods/VodResource.php b/app/Filament/Resources/Vods/VodResource.php index f9d7977cd..c8c84390d 100644 --- a/app/Filament/Resources/Vods/VodResource.php +++ b/app/Filament/Resources/Vods/VodResource.php @@ -694,12 +694,27 @@ public static function getTableBulkActions($addToCustom = true): array ->afterStateUpdated(function (Set $set, $state) { if ($state) { $set('category', null); + $set('new_group', null); + $set('create_new_group', false); } }) ->searchable(), + Toggle::make('create_new_group') + ->label('Create new group') + ->helperText('Enable to create a new group instead of selecting an existing one.') + ->live() + ->disabled(fn (Get $get) => ! $get('playlist')) + ->afterStateUpdated(function (Set $set, $state) { + if ($state) { + $set('category', null); + } else { + $set('new_group', null); + } + }), Select::make('category') ->label('Custom Group') ->disabled(fn (Get $get) => ! $get('playlist')) + ->hidden(fn (Get $get) => $get('create_new_group')) ->helperText(fn (Get $get) => ! $get('playlist') ? 'Select a custom playlist first.' : 'Select the group you would like to assign to the selected channel(s) to.') ->options(function ($get) { $customList = CustomPlaylist::find($get('playlist')); @@ -709,13 +724,40 @@ public static function getTableBulkActions($addToCustom = true): array ->toArray() : []; }) ->searchable(), + TextInput::make('new_group') + ->label('New Group Name') + ->helperText('Enter a name for the new group to create.') + ->hidden(fn (Get $get) => ! $get('create_new_group')) + ->disabled(fn (Get $get) => ! $get('playlist')) + ->required(fn (Get $get) => $get('create_new_group')) + ->maxLength(255), ]) ->action(function (Collection $records, array $data): void { $playlist = CustomPlaylist::findOrFail($data['playlist']); $playlist->channels()->syncWithoutDetaching($records->pluck('id')); - if ($data['category']) { - $tags = $playlist->groupTags()->get(); + + // Determine which tag to use (existing or new) + $tag = null; + if ($data['create_new_group'] && $data['new_group']) { + // Create new group tag + $existingTag = \Spatie\Tags\Tag::where('type', $playlist->uuid) + ->where('name->en', $data['new_group']) + ->first(); + if ($existingTag) { + $tag = $existingTag; + } else { + $tag = \Spatie\Tags\Tag::create([ + 'name' => ['en' => $data['new_group']], + 'type' => $playlist->uuid, + ]); + $playlist->attachTag($tag); + } + } elseif ($data['category']) { $tag = $playlist->groupTags()->where('name->en', $data['category'])->first(); + } + + if ($tag) { + $tags = $playlist->groupTags()->get(); foreach ($records as $record) { // Need to detach any existing tags from this playlist first $record->detachTags($tags);