diff --git a/app/Actions/Models/List/Playlist/FixPlaylistAction.php b/app/Actions/Models/List/Playlist/FixPlaylistAction.php new file mode 100644 index 000000000..1eb548c06 --- /dev/null +++ b/app/Actions/Models/List/Playlist/FixPlaylistAction.php @@ -0,0 +1,142 @@ +sendMessage("Fetching tracks for playlist ID: {$playlist->getKey()}...", $context, 'info'); + + /** @var Collection $tracks */ + $tracks = PlaylistTrack::where(PlaylistTrack::ATTRIBUTE_PLAYLIST, $playlist->getKey()) + ->orderBy(PlaylistTrack::ATTRIBUTE_ID) + ->get() + ->keyBy(PlaylistTrack::ATTRIBUTE_ID); + + // Find the playlist and get the first_id + $this->sendMessage("Fetching playlist details...", $context, 'info'); + + $first_id = $playlist->first_id; + + // Initialize arrays for ordered tracks and visited tracks + $orderedTracks = []; + $visitedTracks = []; + + // Start at the first_id and follow the next_id chain + $this->sendMessage("Reconstructing the playlist order...", $context, 'info'); + + $current_id = $first_id; + + while ($current_id !== null) { + if (isset($visitedTracks[$current_id])) { + // If we encounter a previously visited track, we've detected a cycle + $this->sendMessage("Cycle detected at track ID: $current_id, stopping...", $context, 'warn'); + break; + } + + // Mark the current track as visited and add to ordered tracks + $visitedTracks[$current_id] = true; + $orderedTracks[] = $current_id; + + // Get the next track in sequence + $currentTrack = $tracks[$current_id]; + $current_id = $currentTrack->next_id; + } + + // Check if we have traversed all tracks; if not, some tracks are broken + if (count($orderedTracks) != count($tracks)) { + $this->sendMessage("Detected broken tracks, attempting to add them to the end of the list...", $context, 'warn'); + + // Find all tracks that were not visited (potentially broken) + $remainingTracks = $tracks->filter(function ($track) use ($visitedTracks) { + return !isset($visitedTracks[$track->track_id]); + }); + + // Add remaining tracks to the end, preserving the existing order as much as possible + foreach ($remainingTracks as $remainingTrack) { + $orderedTracks[] = $remainingTrack->track_id; + } + } + + // Update the previous_id and next_id for all tracks in the correct order + $this->sendMessage("Updating track links (previous_id and next_id)...", $context, 'info'); + DB::transaction(function () use ($orderedTracks, $tracks, $playlist, $context) { + $previous_id = null; + + foreach ($orderedTracks as $index => $track_id) { + $track = $tracks[$track_id]; + + // Get the next track in the sequence or set null if it's the last one + $next_id = $orderedTracks[$index + 1] ?? null; + + // Update the previous_id and next_id for the track + $track->previous_id = $previous_id; + $track->next_id = $next_id; + $track->save(); + + // Move the previous_id pointer forward + $previous_id = $track_id; + } + + // Update the playlist's first_id and last_id + $playlist->first_id = $orderedTracks[0]; + $playlist->last_id = $orderedTracks[count($orderedTracks) - 1]; + $playlist->save(); + + $this->sendMessage("Playlist first_id and last_id updated successfully.", $context, 'info'); + }); + + $this->sendMessage("Playlist fixed successfully.", $context, 'info'); + return 1; + } + + /** + * Send the message given the context. + * + * @param string $message + * @param mixed $context + * @param string $type + * @return void + */ + protected function sendMessage(string $message, mixed $context, string $type): void + { + if (is_null($context)) { + return; + } + + $translatedType = match (true) { + $context === 'log' => match ($type) { + 'warn' => 'warning', + default => $type, + }, + default => $type, + }; + + match (true) { + $context instanceof Command => $context->$translatedType($message), + $context === 'log' => Log::$translatedType($message), + default => null, + }; + } +} diff --git a/app/Actions/Models/Wiki/AttachResourceAction.php b/app/Actions/Models/Wiki/AttachResourceAction.php index e3af77148..1b7a9444d 100644 --- a/app/Actions/Models/Wiki/AttachResourceAction.php +++ b/app/Actions/Models/Wiki/AttachResourceAction.php @@ -25,7 +25,7 @@ class AttachResourceAction * @param ResourceSite[] $sites * @return void */ - public function handle(BaseModel&HasResources $model,array $fields, array $sites): void + public function handle(BaseModel&HasResources $model, array $fields, array $sites): void { foreach ($sites as $resourceSite) { $link = Arr::get($fields, $resourceSite->name); diff --git a/app/Actions/Models/Wiki/BackfillSongAction.php b/app/Actions/Models/Wiki/BackfillSongAction.php index 1fe7a9abb..664a805b7 100644 --- a/app/Actions/Models/Wiki/BackfillSongAction.php +++ b/app/Actions/Models/Wiki/BackfillSongAction.php @@ -30,14 +30,10 @@ class BackfillSongAction extends BackfillAction * * @param Song $song * @param string $lnkto - * @param array|null $fields - * @param ResourceSite[]|null $sites */ public function __construct( Song $song, protected readonly string $lnkto, - protected readonly ?array $fields = [], - protected readonly ?array $sites = [], ) { parent::__construct($song); } @@ -54,13 +50,9 @@ public function handle(): ActionResult try { DB::beginTransaction(); - // Attach other resources - $attachResourceAction = new AttachResourceAction(); - - $attachResourceAction->handle($this->getModel(), $this->fields, $this->sites); - // Request to lnk.to site - $response = Http::get($this->lnkto); + $response = Http::get($this->lnkto) + ->throw(); $pattern = '/]*class="[^"]*music-service-list__link[^"]*js-redirect[^"]*"[^>]*href="([^"]+)"[^>]*data-label="([^"]*)"[^>]*>/i'; diff --git a/app/Concerns/Filament/Actions/Discord/DiscordThreadActionTrait.php b/app/Concerns/Filament/Actions/Discord/DiscordThreadActionTrait.php index 1435c14af..bc65957ed 100644 --- a/app/Concerns/Filament/Actions/Discord/DiscordThreadActionTrait.php +++ b/app/Concerns/Filament/Actions/Discord/DiscordThreadActionTrait.php @@ -25,8 +25,8 @@ protected function setUp(): void { parent::setUp(); - $this->label(__('filament.actions.anime.discord.thread.name')); - $this->icon('heroicon-o-chat-bubble-left-right'); + $this->label(__('filament.actions.anime.discord_thread.name')); + $this->icon(__('filament-icons.actions.anime.discord_thread')); $this->authorize('create', DiscordThread::class); diff --git a/app/Concerns/Filament/Actions/Models/AssignHashidsActionTrait.php b/app/Concerns/Filament/Actions/Models/List/AssignHashidsActionTrait.php similarity index 90% rename from app/Concerns/Filament/Actions/Models/AssignHashidsActionTrait.php rename to app/Concerns/Filament/Actions/Models/List/AssignHashidsActionTrait.php index c04b98cdd..77d9b17fc 100644 --- a/app/Concerns/Filament/Actions/Models/AssignHashidsActionTrait.php +++ b/app/Concerns/Filament/Actions/Models/List/AssignHashidsActionTrait.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace App\Concerns\Filament\Actions\Models; +namespace App\Concerns\Filament\Actions\Models\List; use App\Actions\Models\AssignHashidsAction as AssignHashids; use App\Contracts\Models\HasHashids; @@ -26,7 +26,7 @@ protected function setUp(): void { parent::setUp(); - $this->label(__('filament.actions.models.assign_hashids.name')); + $this->label(__('filament.actions.models.list.assign_hashids.name')); $this->authorize('update', Playlist::class); diff --git a/app/Concerns/Filament/Actions/Models/Wiki/Anime/BackfillAnimeActionTrait.php b/app/Concerns/Filament/Actions/Models/Wiki/Anime/BackfillAnimeActionTrait.php index 31ceda5d2..95d53119e 100644 --- a/app/Concerns/Filament/Actions/Models/Wiki/Anime/BackfillAnimeActionTrait.php +++ b/app/Concerns/Filament/Actions/Models/Wiki/Anime/BackfillAnimeActionTrait.php @@ -54,7 +54,7 @@ protected function setUp(): void parent::setUp(); $this->label(__('filament.actions.anime.backfill.name')); - $this->icon('heroicon-o-bars-4'); + $this->icon(__('filament-icons.actions.anime.backfill')); $this->authorize('create', Anime::class); diff --git a/app/Concerns/Filament/Actions/Models/Wiki/AttachImageActionTrait.php b/app/Concerns/Filament/Actions/Models/Wiki/AttachImageActionTrait.php index 8c82439ad..170b0f281 100644 --- a/app/Concerns/Filament/Actions/Models/Wiki/AttachImageActionTrait.php +++ b/app/Concerns/Filament/Actions/Models/Wiki/AttachImageActionTrait.php @@ -32,7 +32,7 @@ protected function setUp(): void parent::setUp(); $this->label(__('filament.actions.models.wiki.attach_image.name')); - $this->icon('heroicon-o-photo'); + $this->icon(__('filament-icons.actions.models.wiki.attach_image')); $this->authorize('create', Image::class); diff --git a/app/Concerns/Filament/Actions/Models/Wiki/AttachResourceActionTrait.php b/app/Concerns/Filament/Actions/Models/Wiki/AttachResourceActionTrait.php index 02c15eff4..f0f8b924b 100644 --- a/app/Concerns/Filament/Actions/Models/Wiki/AttachResourceActionTrait.php +++ b/app/Concerns/Filament/Actions/Models/Wiki/AttachResourceActionTrait.php @@ -36,7 +36,7 @@ protected function setUp(): void parent::setUp(); $this->label(__('filament.actions.models.wiki.attach_resource.name')); - $this->icon('heroicon-o-queue-list'); + $this->icon(__('filament-icons.actions.models.wiki.attach_resource')); $this->modalWidth(MaxWidth::FourExtraLarge); diff --git a/app/Concerns/Filament/Actions/Models/Wiki/Video/BackfillAudioActionTrait.php b/app/Concerns/Filament/Actions/Models/Wiki/Video/BackfillAudioActionTrait.php index 01446a326..b058ec0a2 100644 --- a/app/Concerns/Filament/Actions/Models/Wiki/Video/BackfillAudioActionTrait.php +++ b/app/Concerns/Filament/Actions/Models/Wiki/Video/BackfillAudioActionTrait.php @@ -44,7 +44,7 @@ protected function setUp(): void $this->label(__('filament.actions.video.backfill.name')); - $this->icon('heroicon-o-speaker-wave'); + $this->icon(__('filament-icons.actions.video.backfill')); $this->authorize('create', Audio::class); diff --git a/app/Concerns/Filament/Actions/Storage/Base/DeleteActionTrait.php b/app/Concerns/Filament/Actions/Storage/Base/DeleteActionTrait.php index 2bccd8fba..3f57262e3 100644 --- a/app/Concerns/Filament/Actions/Storage/Base/DeleteActionTrait.php +++ b/app/Concerns/Filament/Actions/Storage/Base/DeleteActionTrait.php @@ -24,7 +24,7 @@ protected function setUp(): void $this->color('danger'); - $this->icon('heroicon-m-trash'); + $this->icon(__('filament-icons.actions.base.delete')); } /** diff --git a/app/Concerns/Filament/Actions/Storage/Base/MoveActionTrait.php b/app/Concerns/Filament/Actions/Storage/Base/MoveActionTrait.php index 330794ced..9c2ac4c16 100644 --- a/app/Concerns/Filament/Actions/Storage/Base/MoveActionTrait.php +++ b/app/Concerns/Filament/Actions/Storage/Base/MoveActionTrait.php @@ -26,7 +26,7 @@ protected function setUp(): void { parent::setUp(); - $this->icon('heroicon-o-arrow-long-right'); + $this->icon(__('filament-icons.actions.storage.move')); } /** diff --git a/app/Concerns/Filament/Actions/Storage/MoveAllActionTrait.php b/app/Concerns/Filament/Actions/Storage/MoveAllActionTrait.php index 6714f908b..3f71b128c 100644 --- a/app/Concerns/Filament/Actions/Storage/MoveAllActionTrait.php +++ b/app/Concerns/Filament/Actions/Storage/MoveAllActionTrait.php @@ -34,8 +34,8 @@ protected function setUp(): void { parent::setUp(); - $this->label(__('filament.actions.base.moveAll')); - $this->icon('heroicon-o-arrow-long-right'); + $this->label(__('filament.actions.base.move_all')); + $this->icon(__('filament-icons.actions.base.move_all')); $this->authorize('create', [Audio::class, Video::class, VideoScript::class]); diff --git a/app/Concerns/Models/CanCreateExternalResource.php b/app/Concerns/Models/CanCreateExternalResource.php index d5f8d8e7a..c5cdc3835 100644 --- a/app/Concerns/Models/CanCreateExternalResource.php +++ b/app/Concerns/Models/CanCreateExternalResource.php @@ -8,6 +8,7 @@ use App\Enums\Models\Wiki\ResourceSite; use App\Models\BaseModel; use App\Models\Wiki\ExternalResource; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\Log; /** @@ -28,7 +29,7 @@ trait CanCreateExternalResource public function createResource(string $url, ResourceSite $site, (BaseModel&HasResources)|null $model = null): ExternalResource { $url = $this->ensureHttpsUrl($url); - $id = $site::parseIdFromLink($url); + $id = ResourceSite::parseIdFromLink($url); if ($model instanceof BaseModel) { $urlPattern = $site->getUrlCaptureGroups($model); @@ -37,15 +38,17 @@ public function createResource(string $url, ResourceSite $site, (BaseModel&HasRe $url = $site->formatResourceLink($model::class, intval($matches[2]), $matches[2], $matches[1]); } - if ($id !== null && !$site->usesIdInLink()) { + if ($id !== null && $site->usesIdInLink()) { $url = $site->formatResourceLink($model::class, intval($id), $id); } } $resource = ExternalResource::query() ->where(ExternalResource::ATTRIBUTE_SITE, $site->value) - ->where(ExternalResource::ATTRIBUTE_LINK, $url) - ->orWhere(ExternalResource::ATTRIBUTE_LINK, $url . '/') + ->where(function (Builder $query) use ($url) { + return $query->where(ExternalResource::ATTRIBUTE_LINK, $url) + ->orWhere(ExternalResource::ATTRIBUTE_LINK, $url . '/'); + }) ->first(); if ($resource === null) { diff --git a/app/Console/Commands/Models/PlaylistFixCommand.php b/app/Console/Commands/Models/PlaylistFixCommand.php index 35bb72446..b5686ff46 100644 --- a/app/Console/Commands/Models/PlaylistFixCommand.php +++ b/app/Console/Commands/Models/PlaylistFixCommand.php @@ -4,12 +4,10 @@ namespace App\Console\Commands\Models; +use App\Actions\Models\List\Playlist\FixPlaylistAction; use App\Console\Commands\BaseCommand; use App\Models\List\Playlist; -use App\Models\List\Playlist\PlaylistTrack; use Illuminate\Contracts\Validation\Validator; -use Illuminate\Support\Collection; -use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator as ValidatorFacade; /** @@ -48,90 +46,7 @@ public function handle(): int return 0; } - // Fetch all tracks in the playlist and index them by track_id - $this->info("Fetching tracks for playlist ID: $playlistId..."); - - /** @var Collection $tracks */ - $tracks = PlaylistTrack::where(PlaylistTrack::ATTRIBUTE_PLAYLIST, $playlistId) - ->orderBy(PlaylistTrack::ATTRIBUTE_ID) - ->get() - ->keyBy(PlaylistTrack::ATTRIBUTE_ID); - - // Find the playlist and get the first_id - $this->info("Fetching playlist details..."); - - $first_id = $playlist->first_id; - - // Initialize arrays for ordered tracks and visited tracks - $orderedTracks = []; - $visitedTracks = []; - - // Start at the first_id and follow the next_id chain - $this->info("Reconstructing the playlist order..."); - - $current_id = $first_id; - - while ($current_id !== null) { - if (isset($visitedTracks[$current_id])) { - // If we encounter a previously visited track, we've detected a cycle - $this->warn("Cycle detected at track ID: $current_id, stopping..."); - break; - } - - // Mark the current track as visited and add to ordered tracks - $visitedTracks[$current_id] = true; - $orderedTracks[] = $current_id; - - // Get the next track in sequence - $currentTrack = $tracks[$current_id]; - $current_id = $currentTrack->next_id; - } - - // Check if we have traversed all tracks; if not, some tracks are broken - if (count($orderedTracks) != count($tracks)) { - $this->warn("Detected broken tracks, attempting to add them to the end of the list..."); - - // Find all tracks that were not visited (potentially broken) - $remainingTracks = $tracks->filter(function ($track) use ($visitedTracks) { - return !isset($visitedTracks[$track->track_id]); - }); - - // Add remaining tracks to the end, preserving the existing order as much as possible - foreach ($remainingTracks as $remainingTrack) { - $orderedTracks[] = $remainingTrack->track_id; - } - } - - // Update the previous_id and next_id for all tracks in the correct order - $this->info("Updating track links (previous_id and next_id)..."); - DB::transaction(function () use ($orderedTracks, $tracks, $playlist) { - $previous_id = null; - - foreach ($orderedTracks as $index => $track_id) { - $track = $tracks[$track_id]; - - // Get the next track in the sequence or set null if it's the last one - $next_id = $orderedTracks[$index + 1] ?? null; - - // Update the previous_id and next_id for the track - $track->previous_id = $previous_id; - $track->next_id = $next_id; - $track->save(); - - // Move the previous_id pointer forward - $previous_id = $track_id; - } - - // Update the playlist's first_id and last_id - $playlist->first_id = $orderedTracks[0]; - $playlist->last_id = $orderedTracks[count($orderedTracks) - 1]; - $playlist->save(); - - $this->info("Playlist first_id and last_id updated successfully."); - }); - - $this->info("Playlist fixed successfully."); - return 1; + return new FixPlaylistAction()->handle($playlist, $this); } /** diff --git a/app/Filament/Actions/Models/AssignHashidsAction.php b/app/Filament/Actions/Models/List/AssignHashidsAction.php similarity index 62% rename from app/Filament/Actions/Models/AssignHashidsAction.php rename to app/Filament/Actions/Models/List/AssignHashidsAction.php index fce2e1878..7d2f729f3 100644 --- a/app/Filament/Actions/Models/AssignHashidsAction.php +++ b/app/Filament/Actions/Models/List/AssignHashidsAction.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace App\Filament\Actions\Models; +namespace App\Filament\Actions\Models\List; -use App\Concerns\Filament\Actions\Models\AssignHashidsActionTrait; +use App\Concerns\Filament\Actions\Models\List\AssignHashidsActionTrait; use App\Filament\Actions\BaseAction; /** diff --git a/app/Filament/BulkActions/Models/Wiki/Video/VideoDiscordNotificationBulkAction.php b/app/Filament/BulkActions/Models/Wiki/Video/VideoDiscordNotificationBulkAction.php index 9b6deab11..1b2a4fe9e 100644 --- a/app/Filament/BulkActions/Models/Wiki/Video/VideoDiscordNotificationBulkAction.php +++ b/app/Filament/BulkActions/Models/Wiki/Video/VideoDiscordNotificationBulkAction.php @@ -32,7 +32,7 @@ protected function setUp(): void $this->modalWidth(MaxWidth::Large); $this->label(__('filament.bulk_actions.discord.notification.name')); - $this->icon(__('filament.bulk_actions.discord.notification.icon')); + $this->icon(__('filament-icons.bulk_actions.discord.notification')); $this->authorize('create', DiscordThread::class); } diff --git a/app/Filament/BulkActions/Storage/Wiki/Video/DeleteVideoBulkAction.php b/app/Filament/BulkActions/Storage/Wiki/Video/DeleteVideoBulkAction.php index 90d6691f7..1ad58e419 100644 --- a/app/Filament/BulkActions/Storage/Wiki/Video/DeleteVideoBulkAction.php +++ b/app/Filament/BulkActions/Storage/Wiki/Video/DeleteVideoBulkAction.php @@ -24,7 +24,7 @@ protected function setUp(): void parent::setUp(); $this->label(__('filament.actions.video.delete.name')); - $this->icon(__('filament.actions.video.delete.icon')); + $this->icon(__('filament-icons.actions.base.delete')); $this->color('danger'); } diff --git a/app/Filament/Components/Columns/TextColumn.php b/app/Filament/Components/Columns/TextColumn.php index b6b0643b1..629e0746e 100644 --- a/app/Filament/Components/Columns/TextColumn.php +++ b/app/Filament/Components/Columns/TextColumn.php @@ -22,6 +22,6 @@ public function copyableWithMessage(bool $condition = true): static return $this ->copyable($condition) ->copyMessage(__('filament.actions.base.copied')) - ->icon('heroicon-o-clipboard'); + ->icon(__('filament-icons.actions.base.copied')); } } \ No newline at end of file diff --git a/app/Filament/Components/Fields/BelongsTo.php b/app/Filament/Components/Fields/BelongsTo.php index 04b54c72b..8203d17fc 100644 --- a/app/Filament/Components/Fields/BelongsTo.php +++ b/app/Filament/Components/Fields/BelongsTo.php @@ -90,6 +90,7 @@ protected function tryScout(string $model): static if (in_array(Searchable::class, class_uses_recursive($model))) { return $this ->getSearchResultsUsing(function (string $search) use ($model) { + $search = preg_replace('/[^A-Za-z0-9 ]/', '', $search); /** @phpstan-ignore-next-line */ return $model::search($search) ->take(25) diff --git a/app/Filament/Components/Fields/Select.php b/app/Filament/Components/Fields/Select.php index b1d720d22..9496ae954 100644 --- a/app/Filament/Components/Fields/Select.php +++ b/app/Filament/Components/Fields/Select.php @@ -31,6 +31,7 @@ public function useScout(mixed $livewire, string $model, ?string $loadRelation = ->searchable() ->getOptionLabelUsing(fn ($state) => BelongsTo::getSearchLabelWithBlade($model::find($state))) ->getSearchResultsUsing(function (string $search) use ($livewire, $model, $loadRelation) { + $search = preg_replace('/[^A-Za-z0-9 ]/', '', $search); /** @phpstan-ignore-next-line */ return $model::search($search) ->query(function (Builder $query) use ($livewire) { diff --git a/app/Filament/Components/Infolist/TextEntry.php b/app/Filament/Components/Infolist/TextEntry.php index b45707f1b..88a04c3b3 100644 --- a/app/Filament/Components/Infolist/TextEntry.php +++ b/app/Filament/Components/Infolist/TextEntry.php @@ -22,6 +22,6 @@ public function copyableWithMessage(bool $condition = true): static return $this ->copyable($condition) ->copyMessage(__('filament.actions.base.copied')) - ->icon('heroicon-o-clipboard'); + ->icon(__('filament-icons.actions.base.copied')); } } \ No newline at end of file diff --git a/app/Filament/Dashboards/AdminDashboard.php b/app/Filament/Dashboards/AdminDashboard.php index a7dd4f8af..0562643d2 100644 --- a/app/Filament/Dashboards/AdminDashboard.php +++ b/app/Filament/Dashboards/AdminDashboard.php @@ -54,7 +54,7 @@ public static function getNavigationLabel(): string */ public static function getNavigationIcon(): string { - return __('filament.dashboards.icon.admin');; + return __('filament-icons.dashboards.admin');; } /** diff --git a/app/Filament/Dashboards/DeveloperDashboard.php b/app/Filament/Dashboards/DeveloperDashboard.php index b1bf1b709..87ee2a3d1 100644 --- a/app/Filament/Dashboards/DeveloperDashboard.php +++ b/app/Filament/Dashboards/DeveloperDashboard.php @@ -51,7 +51,7 @@ public static function getNavigationLabel(): string */ public static function getNavigationIcon(): string { - return __('filament.dashboards.icon.dev');; + return __('filament-icons.dashboards.dev');; } /** diff --git a/app/Filament/Dashboards/WikiDashboard.php b/app/Filament/Dashboards/WikiDashboard.php index 976405863..1518a1fd5 100644 --- a/app/Filament/Dashboards/WikiDashboard.php +++ b/app/Filament/Dashboards/WikiDashboard.php @@ -41,7 +41,7 @@ public static function getNavigationLabel(): string */ public static function getNavigationIcon(): string { - return __('filament.dashboards.icon.wiki');; + return __('filament-icons.dashboards.wiki');; } /** diff --git a/app/Filament/HeaderActions/Base/EditHeaderAction.php b/app/Filament/HeaderActions/Base/EditHeaderAction.php index ac1591feb..52face0b0 100644 --- a/app/Filament/HeaderActions/Base/EditHeaderAction.php +++ b/app/Filament/HeaderActions/Base/EditHeaderAction.php @@ -22,6 +22,6 @@ protected function setUp(): void parent::setUp(); $this->label(__('filament.actions.base.edit')); - $this->icon('heroicon-o-pencil-square'); + $this->icon(__('filament-icons.actions.base.edit')); } } diff --git a/app/Filament/HeaderActions/Models/AssignHashidsHeaderAction.php b/app/Filament/HeaderActions/Models/List/AssignHashidsHeaderAction.php similarity index 64% rename from app/Filament/HeaderActions/Models/AssignHashidsHeaderAction.php rename to app/Filament/HeaderActions/Models/List/AssignHashidsHeaderAction.php index a0f04f4a1..71027a81f 100644 --- a/app/Filament/HeaderActions/Models/AssignHashidsHeaderAction.php +++ b/app/Filament/HeaderActions/Models/List/AssignHashidsHeaderAction.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace App\Filament\HeaderActions\Models; +namespace App\Filament\HeaderActions\Models\List; -use App\Concerns\Filament\Actions\Models\AssignHashidsActionTrait; +use App\Concerns\Filament\Actions\Models\List\AssignHashidsActionTrait; use App\Filament\HeaderActions\BaseHeaderAction; /** diff --git a/app/Filament/HeaderActions/Models/List/External/SyncExternalProfileHeaderAction.php b/app/Filament/HeaderActions/Models/List/External/SyncExternalProfileHeaderAction.php new file mode 100644 index 000000000..7ef2c0d54 --- /dev/null +++ b/app/Filament/HeaderActions/Models/List/External/SyncExternalProfileHeaderAction.php @@ -0,0 +1,32 @@ +label(__('filament.actions.models.list.sync_profile.name')); + $this->icon(__('filament-icons.actions.models.list.sync_profile')); + + $this->authorize('update', $this->getRecord()); + + $this->action(fn (ExternalProfile $record, SyncExternalProfileAction $sync) => $sync->handle($record)); + } +} \ No newline at end of file diff --git a/app/Filament/HeaderActions/Models/List/FixPlaylistHeaderAction.php b/app/Filament/HeaderActions/Models/List/FixPlaylistHeaderAction.php new file mode 100644 index 000000000..b33b9f4b2 --- /dev/null +++ b/app/Filament/HeaderActions/Models/List/FixPlaylistHeaderAction.php @@ -0,0 +1,31 @@ +label(__('filament.actions.models.list.fix_playlist.name')); + + $this->authorize('update', $this->getRecord()); + + $this->action(fn (Playlist $record, FixPlaylistAction $fix) => $fix->handle($record)); + } +} \ No newline at end of file diff --git a/app/Filament/Providers/GlobalSearchScoutProvider.php b/app/Filament/Providers/GlobalSearchScoutProvider.php index 53a0aacba..64248f85c 100644 --- a/app/Filament/Providers/GlobalSearchScoutProvider.php +++ b/app/Filament/Providers/GlobalSearchScoutProvider.php @@ -18,7 +18,7 @@ class GlobalSearchScoutProvider implements GlobalSearchProvider { /** * Get the results for the global search. - * + * * @param string $query * @return GlobalSearchResults|null */ @@ -31,6 +31,7 @@ public function getResults(string $query): ?GlobalSearchResults continue; } + $query = preg_replace('/[^A-Za-z0-9 ]/', '', $query); $search = $resource::getModel()::search($query); $resourceResults = $search diff --git a/app/Filament/Resources/Admin/ActionLog.php b/app/Filament/Resources/Admin/ActionLog.php index 4782871d9..ef1bbe6e0 100644 --- a/app/Filament/Resources/Admin/ActionLog.php +++ b/app/Filament/Resources/Admin/ActionLog.php @@ -84,7 +84,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.action_logs'); + return __('filament-icons.resources.action_logs'); } /** diff --git a/app/Filament/Resources/Admin/Announcement.php b/app/Filament/Resources/Admin/Announcement.php index fde1a3db4..67fe28500 100644 --- a/app/Filament/Resources/Admin/Announcement.php +++ b/app/Filament/Resources/Admin/Announcement.php @@ -72,7 +72,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.announcements'); + return __('filament-icons.resources.announcements'); } /** diff --git a/app/Filament/Resources/Admin/Dump.php b/app/Filament/Resources/Admin/Dump.php index b1d1ed590..c25061b1b 100644 --- a/app/Filament/Resources/Admin/Dump.php +++ b/app/Filament/Resources/Admin/Dump.php @@ -77,7 +77,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.dumps'); + return __('filament-icons.resources.dumps'); } /** diff --git a/app/Filament/Resources/Admin/Feature.php b/app/Filament/Resources/Admin/Feature.php index 98ef3f76d..18f27f8c7 100644 --- a/app/Filament/Resources/Admin/Feature.php +++ b/app/Filament/Resources/Admin/Feature.php @@ -74,7 +74,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.features'); + return __('filament-icons.resources.features'); } /** diff --git a/app/Filament/Resources/Admin/FeaturedTheme.php b/app/Filament/Resources/Admin/FeaturedTheme.php index b8acb782f..25abe4141 100644 --- a/app/Filament/Resources/Admin/FeaturedTheme.php +++ b/app/Filament/Resources/Admin/FeaturedTheme.php @@ -92,7 +92,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.featured_themes'); + return __('filament-icons.resources.featured_themes'); } /** diff --git a/app/Filament/Resources/Admin/Report.php b/app/Filament/Resources/Admin/Report.php index 7316ff9d4..de0a02fee 100644 --- a/app/Filament/Resources/Admin/Report.php +++ b/app/Filament/Resources/Admin/Report.php @@ -78,7 +78,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.reports'); + return __('filament-icons.resources.reports'); } /** diff --git a/app/Filament/Resources/Admin/Report/ReportStep.php b/app/Filament/Resources/Admin/Report/ReportStep.php index be2c7209a..bd8d4cdb4 100644 --- a/app/Filament/Resources/Admin/Report/ReportStep.php +++ b/app/Filament/Resources/Admin/Report/ReportStep.php @@ -81,7 +81,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.report_steps'); + return __('filament-icons.resources.report_steps'); } /** diff --git a/app/Filament/Resources/Auth/Permission.php b/app/Filament/Resources/Auth/Permission.php index f47a5d8d7..41ec09e5e 100644 --- a/app/Filament/Resources/Auth/Permission.php +++ b/app/Filament/Resources/Auth/Permission.php @@ -81,7 +81,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.permissions'); + return __('filament-icons.resources.permissions'); } /** diff --git a/app/Filament/Resources/Auth/Role.php b/app/Filament/Resources/Auth/Role.php index 05b876090..603e04400 100644 --- a/app/Filament/Resources/Auth/Role.php +++ b/app/Filament/Resources/Auth/Role.php @@ -89,7 +89,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.roles'); + return __('filament-icons.resources.roles'); } /** diff --git a/app/Filament/Resources/Auth/User.php b/app/Filament/Resources/Auth/User.php index 4df875e38..4f8b42529 100644 --- a/app/Filament/Resources/Auth/User.php +++ b/app/Filament/Resources/Auth/User.php @@ -86,7 +86,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.users'); + return __('filament-icons.resources.users'); } /** @@ -166,7 +166,8 @@ public static function table(Table $table): Table TextColumn::make(UserModel::ATTRIBUTE_EMAIL) ->label(__('filament.fields.user.email')) - ->icon('heroicon-m-envelope'), + ->icon(__('filament-icons.fields.user.email')) + ->searchable(isIndividual: true), ]); } @@ -195,7 +196,7 @@ public static function infolist(Infolist $infolist): Infolist TextEntry::make(UserModel::ATTRIBUTE_EMAIL) ->label(__('filament.fields.user.email')) - ->icon('heroicon-m-envelope'), + ->icon(__('filament-icons.fields.user.email')), TextEntry::make(UserModel::ATTRIBUTE_ID) ->label(__('filament.fields.base.id')), diff --git a/app/Filament/Resources/Base/BaseEditResource.php b/app/Filament/Resources/Base/BaseEditResource.php index b92603d9b..4de5ade6a 100644 --- a/app/Filament/Resources/Base/BaseEditResource.php +++ b/app/Filament/Resources/Base/BaseEditResource.php @@ -35,7 +35,7 @@ protected function getHeaderActions(): array ForceDeleteHeaderAction::make(), ]) - ->icon('heroicon-o-trash') + ->icon(__('filament-icons.actions.base.group_delete')) ->color('danger'), RestoreHeaderAction::make(), diff --git a/app/Filament/Resources/BaseResource.php b/app/Filament/Resources/BaseResource.php index 93aeb1f5a..586b17451 100644 --- a/app/Filament/Resources/BaseResource.php +++ b/app/Filament/Resources/BaseResource.php @@ -158,7 +158,7 @@ public static function getActions(): array ForceDeleteAction::make(), ]) - ->icon('heroicon-o-trash') + ->icon(__('filament-icons.actions.base.group_delete')) ->color('danger'), RestoreAction::make(), diff --git a/app/Filament/Resources/Discord/DiscordThread.php b/app/Filament/Resources/Discord/DiscordThread.php index 1296a1d92..7545d1d48 100644 --- a/app/Filament/Resources/Discord/DiscordThread.php +++ b/app/Filament/Resources/Discord/DiscordThread.php @@ -88,7 +88,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.discord_thread'); + return __('filament-icons.resources.discord_thread'); } /** diff --git a/app/Filament/Resources/Document/Page.php b/app/Filament/Resources/Document/Page.php index c2625da35..e7059b891 100644 --- a/app/Filament/Resources/Document/Page.php +++ b/app/Filament/Resources/Document/Page.php @@ -85,7 +85,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.pages'); + return __('filament-icons.resources.pages'); } /** diff --git a/app/Filament/Resources/List/External/ExternalEntry.php b/app/Filament/Resources/List/External/ExternalEntry.php index bfbc7abaa..c5afb2570 100644 --- a/app/Filament/Resources/List/External/ExternalEntry.php +++ b/app/Filament/Resources/List/External/ExternalEntry.php @@ -87,7 +87,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.external_entries'); + return __('filament-icons.resources.external_entries'); } /** diff --git a/app/Filament/Resources/List/External/Pages/EditExternalProfile.php b/app/Filament/Resources/List/External/Pages/EditExternalProfile.php index 6d814b63e..b5d46b7a4 100644 --- a/app/Filament/Resources/List/External/Pages/EditExternalProfile.php +++ b/app/Filament/Resources/List/External/Pages/EditExternalProfile.php @@ -4,8 +4,10 @@ namespace App\Filament\Resources\List\External\Pages; +use App\Filament\HeaderActions\Models\List\External\SyncExternalProfileHeaderAction; use App\Filament\Resources\List\ExternalProfile; use App\Filament\Resources\Base\BaseEditResource; +use Filament\Actions\ActionGroup; /** * Class EditExternalProfile. @@ -23,9 +25,12 @@ class EditExternalProfile extends BaseEditResource */ protected function getHeaderActions(): array { - return array_merge( - parent::getHeaderActions(), - [], - ); + return [ + ...parent::getHeaderActions(), + + ActionGroup::make([ + SyncExternalProfileHeaderAction::make('sync-profile'), + ]), + ]; } } diff --git a/app/Filament/Resources/List/External/Pages/ListExternalProfiles.php b/app/Filament/Resources/List/External/Pages/ListExternalProfiles.php index e7f4d3a39..a9706503f 100644 --- a/app/Filament/Resources/List/External/Pages/ListExternalProfiles.php +++ b/app/Filament/Resources/List/External/Pages/ListExternalProfiles.php @@ -42,6 +42,7 @@ protected function applySearchToTableQuery(Builder $query): Builder $this->applyColumnSearchesToTableQuery($query); if (filled($search = $this->getTableSearch())) { + $search = preg_replace('/[^A-Za-z0-9 ]/', '', $search); $query->whereIn(ExternalProfileModel::ATTRIBUTE_ID, ExternalProfileModel::search($search)->take(25)->keys()); } diff --git a/app/Filament/Resources/List/ExternalProfile.php b/app/Filament/Resources/List/ExternalProfile.php index 769003d49..a82821e84 100644 --- a/app/Filament/Resources/List/ExternalProfile.php +++ b/app/Filament/Resources/List/ExternalProfile.php @@ -85,7 +85,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.external_profiles'); + return __('filament-icons.resources.external_profiles'); } /** diff --git a/app/Filament/Resources/List/Playlist.php b/app/Filament/Resources/List/Playlist.php index 4434d9022..fb83aeb71 100644 --- a/app/Filament/Resources/List/Playlist.php +++ b/app/Filament/Resources/List/Playlist.php @@ -5,7 +5,7 @@ namespace App\Filament\Resources\List; use App\Enums\Models\List\PlaylistVisibility; -use App\Filament\Actions\Models\AssignHashidsAction; +use App\Filament\Actions\Models\List\AssignHashidsAction; use App\Filament\Components\Columns\BelongsToColumn; use App\Filament\Components\Columns\TextColumn; use App\Filament\Components\Fields\BelongsTo; @@ -88,7 +88,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.playlists'); + return __('filament-icons.resources.playlists'); } /** diff --git a/app/Filament/Resources/List/Playlist/Pages/EditPlaylist.php b/app/Filament/Resources/List/Playlist/Pages/EditPlaylist.php index 382d2b8e7..f40861ab0 100644 --- a/app/Filament/Resources/List/Playlist/Pages/EditPlaylist.php +++ b/app/Filament/Resources/List/Playlist/Pages/EditPlaylist.php @@ -4,10 +4,12 @@ namespace App\Filament\Resources\List\Playlist\Pages; -use App\Filament\HeaderActions\Models\AssignHashidsHeaderAction; +use App\Filament\HeaderActions\Models\List\AssignHashidsHeaderAction; +use App\Filament\HeaderActions\Models\List\FixPlaylistHeaderAction; use App\Filament\Resources\List\Playlist; use App\Filament\Resources\Base\BaseEditResource; use App\Models\List\Playlist as PlaylistModel; +use Filament\Actions\ActionGroup; /** * Class EditPlaylist. @@ -25,13 +27,16 @@ class EditPlaylist extends BaseEditResource */ protected function getHeaderActions(): array { - return array_merge( - parent::getHeaderActions(), - [ + return [ + ...parent::getHeaderActions(), + + ActionGroup::make([ AssignHashidsHeaderAction::make('assign-hashids') ->setConnection('playlists') - ->authorize('update', PlaylistModel::class) - ], - ); + ->authorize('update', PlaylistModel::class), + + FixPlaylistHeaderAction::make('fix-playlist'), + ]), + ]; } } diff --git a/app/Filament/Resources/List/Playlist/Pages/ListPlaylists.php b/app/Filament/Resources/List/Playlist/Pages/ListPlaylists.php index 8b260075f..a5ff78373 100644 --- a/app/Filament/Resources/List/Playlist/Pages/ListPlaylists.php +++ b/app/Filament/Resources/List/Playlist/Pages/ListPlaylists.php @@ -42,6 +42,7 @@ protected function applySearchToTableQuery(Builder $query): Builder $this->applyColumnSearchesToTableQuery($query); if (filled($search = $this->getTableSearch())) { + $search = preg_replace('/[^A-Za-z0-9 ]/', '', $search); $query->whereIn(PlaylistModel::ATTRIBUTE_ID, PlaylistModel::search($search)->take(25)->keys()); } diff --git a/app/Filament/Resources/List/Playlist/Track.php b/app/Filament/Resources/List/Playlist/Track.php index 797216fb5..978596899 100644 --- a/app/Filament/Resources/List/Playlist/Track.php +++ b/app/Filament/Resources/List/Playlist/Track.php @@ -4,7 +4,7 @@ namespace App\Filament\Resources\List\Playlist; -use App\Filament\Actions\Models\AssignHashidsAction; +use App\Filament\Actions\Models\List\AssignHashidsAction; use App\Filament\Components\Columns\BelongsToColumn; use App\Filament\Components\Columns\TextColumn; use App\Filament\Components\Fields\BelongsTo; @@ -90,7 +90,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.playlist_tracks'); + return __('filament-icons.resources.playlist_tracks'); } /** diff --git a/app/Filament/Resources/List/Playlist/Track/Pages/EditTrack.php b/app/Filament/Resources/List/Playlist/Track/Pages/EditTrack.php index a85777140..e5ea6b9c5 100644 --- a/app/Filament/Resources/List/Playlist/Track/Pages/EditTrack.php +++ b/app/Filament/Resources/List/Playlist/Track/Pages/EditTrack.php @@ -4,7 +4,7 @@ namespace App\Filament\Resources\List\Playlist\Track\Pages; -use App\Filament\HeaderActions\Models\AssignHashidsHeaderAction; +use App\Filament\HeaderActions\Models\List\AssignHashidsHeaderAction; use App\Filament\Resources\List\Playlist\Track; use App\Filament\Resources\Base\BaseEditResource; use App\Models\List\Playlist\PlaylistTrack; diff --git a/app/Filament/Resources/Wiki/Anime.php b/app/Filament/Resources/Wiki/Anime.php index 6754e7d51..a9b4267c9 100644 --- a/app/Filament/Resources/Wiki/Anime.php +++ b/app/Filament/Resources/Wiki/Anime.php @@ -100,7 +100,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.anime'); + return __('filament-icons.resources.anime'); } /** @@ -378,7 +378,7 @@ public static function getActions(): array AttachAnimeResourceAction::make('attach-anime-streaming-resource') ->label(__('filament.actions.models.wiki.attach_streaming_resource.name')) - ->icon('heroicon-o-tv') + ->icon(__('filament-icons.actions.anime.attach_streaming_resource')) ->sites($streamingResourceSites), ]), ], diff --git a/app/Filament/Resources/Wiki/Anime/Pages/EditAnime.php b/app/Filament/Resources/Wiki/Anime/Pages/EditAnime.php index a2b845862..60914c1d9 100644 --- a/app/Filament/Resources/Wiki/Anime/Pages/EditAnime.php +++ b/app/Filament/Resources/Wiki/Anime/Pages/EditAnime.php @@ -52,7 +52,7 @@ protected function getHeaderActions(): array AttachAnimeResourceHeaderAction::make('attach-anime-streaming-resource') ->label(__('filament.actions.models.wiki.attach_streaming_resource.name')) - ->icon('heroicon-o-tv') + ->icon(__('filament-icons.actions.anime.attach_streaming_resource')) ->sites($streamingResourceSites), ]), ], diff --git a/app/Filament/Resources/Wiki/Anime/Pages/ListAnimes.php b/app/Filament/Resources/Wiki/Anime/Pages/ListAnimes.php index 916cb1594..836ebd390 100644 --- a/app/Filament/Resources/Wiki/Anime/Pages/ListAnimes.php +++ b/app/Filament/Resources/Wiki/Anime/Pages/ListAnimes.php @@ -59,6 +59,7 @@ protected function applySearchToTableQuery(Builder $query): Builder $this->applyColumnSearchesToTableQuery($query); if (filled($search = $this->getTableSearch())) { + $search = preg_replace('/[^A-Za-z0-9 ]/', '', $search); $query->whereIn(AnimeModel::ATTRIBUTE_ID, AnimeModel::search($search)->take(25)->keys()); } diff --git a/app/Filament/Resources/Wiki/Anime/Synonym.php b/app/Filament/Resources/Wiki/Anime/Synonym.php index 70b896ec4..6483fc8a8 100644 --- a/app/Filament/Resources/Wiki/Anime/Synonym.php +++ b/app/Filament/Resources/Wiki/Anime/Synonym.php @@ -86,7 +86,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.anime_synonyms'); + return __('filament-icons.resources.anime_synonyms'); } /** diff --git a/app/Filament/Resources/Wiki/Anime/Synonym/Pages/ListSynonyms.php b/app/Filament/Resources/Wiki/Anime/Synonym/Pages/ListSynonyms.php index 908c8a6ae..6bb64ad12 100644 --- a/app/Filament/Resources/Wiki/Anime/Synonym/Pages/ListSynonyms.php +++ b/app/Filament/Resources/Wiki/Anime/Synonym/Pages/ListSynonyms.php @@ -42,6 +42,7 @@ protected function applySearchToTableQuery(Builder $query): Builder $this->applyColumnSearchesToTableQuery($query); if (filled($search = $this->getTableSearch())) { + $search = preg_replace('/[^A-Za-z0-9 ]/', '', $search); $query->whereIn(AnimeSynonym::ATTRIBUTE_ID, AnimeSynonym::search($search)->take(25)->keys()); } diff --git a/app/Filament/Resources/Wiki/Anime/Theme.php b/app/Filament/Resources/Wiki/Anime/Theme.php index 23e01d411..7eea5fefe 100644 --- a/app/Filament/Resources/Wiki/Anime/Theme.php +++ b/app/Filament/Resources/Wiki/Anime/Theme.php @@ -106,7 +106,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.anime_themes'); + return __('filament-icons.resources.anime_themes'); } /** diff --git a/app/Filament/Resources/Wiki/Anime/Theme/Entry.php b/app/Filament/Resources/Wiki/Anime/Theme/Entry.php index 0717e215e..280452f85 100644 --- a/app/Filament/Resources/Wiki/Anime/Theme/Entry.php +++ b/app/Filament/Resources/Wiki/Anime/Theme/Entry.php @@ -93,7 +93,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.anime_theme_entries'); + return __('filament-icons.resources.anime_theme_entries'); } /** diff --git a/app/Filament/Resources/Wiki/Anime/Theme/Entry/Pages/ListEntries.php b/app/Filament/Resources/Wiki/Anime/Theme/Entry/Pages/ListEntries.php index a770e3b4e..ebc6baa21 100644 --- a/app/Filament/Resources/Wiki/Anime/Theme/Entry/Pages/ListEntries.php +++ b/app/Filament/Resources/Wiki/Anime/Theme/Entry/Pages/ListEntries.php @@ -42,6 +42,7 @@ protected function applySearchToTableQuery(Builder $query): Builder $this->applyColumnSearchesToTableQuery($query); if (filled($search = $this->getTableSearch())) { + $search = preg_replace('/[^A-Za-z0-9 ]/', '', $search); $query->whereIn(AnimeThemeEntry::ATTRIBUTE_ID, AnimeThemeEntry::search($search)->take(25)->keys()); } diff --git a/app/Filament/Resources/Wiki/Anime/Theme/Pages/ListThemes.php b/app/Filament/Resources/Wiki/Anime/Theme/Pages/ListThemes.php index a98497f32..43a9a7d97 100644 --- a/app/Filament/Resources/Wiki/Anime/Theme/Pages/ListThemes.php +++ b/app/Filament/Resources/Wiki/Anime/Theme/Pages/ListThemes.php @@ -42,6 +42,7 @@ protected function applySearchToTableQuery(Builder $query): Builder $this->applyColumnSearchesToTableQuery($query); if (filled($search = $this->getTableSearch())) { + $search = preg_replace('/[^A-Za-z0-9 ]/', '', $search); $query->whereIn(AnimeTheme::ATTRIBUTE_ID, AnimeTheme::search($search)->take(25)->keys()); } diff --git a/app/Filament/Resources/Wiki/Artist.php b/app/Filament/Resources/Wiki/Artist.php index 9f3e7d637..51185c70b 100644 --- a/app/Filament/Resources/Wiki/Artist.php +++ b/app/Filament/Resources/Wiki/Artist.php @@ -92,7 +92,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.artists'); + return __('filament-icons.resources.artists'); } /** diff --git a/app/Filament/Resources/Wiki/Artist/Pages/ListArtists.php b/app/Filament/Resources/Wiki/Artist/Pages/ListArtists.php index e5e6d934b..925c0eb5f 100644 --- a/app/Filament/Resources/Wiki/Artist/Pages/ListArtists.php +++ b/app/Filament/Resources/Wiki/Artist/Pages/ListArtists.php @@ -58,6 +58,7 @@ protected function applySearchToTableQuery(Builder $query): Builder $this->applyColumnSearchesToTableQuery($query); if (filled($search = $this->getTableSearch())) { + $search = preg_replace('/[^A-Za-z0-9 ]/', '', $search); $query->whereIn(ArtistModel::ATTRIBUTE_ID, ArtistModel::search($search)->take(25)->keys()); } diff --git a/app/Filament/Resources/Wiki/Audio.php b/app/Filament/Resources/Wiki/Audio.php index d2febfe3c..7e72cdaa8 100644 --- a/app/Filament/Resources/Wiki/Audio.php +++ b/app/Filament/Resources/Wiki/Audio.php @@ -82,7 +82,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.audios'); + return __('filament-icons.resources.audios'); } /** diff --git a/app/Filament/Resources/Wiki/ExternalResource.php b/app/Filament/Resources/Wiki/ExternalResource.php index 6e1877090..413a397c1 100644 --- a/app/Filament/Resources/Wiki/ExternalResource.php +++ b/app/Filament/Resources/Wiki/ExternalResource.php @@ -88,7 +88,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.external_resources'); + return __('filament-icons.resources.external_resources'); } /** diff --git a/app/Filament/Resources/Wiki/Group.php b/app/Filament/Resources/Wiki/Group.php index c91b457f8..efb198b4a 100644 --- a/app/Filament/Resources/Wiki/Group.php +++ b/app/Filament/Resources/Wiki/Group.php @@ -78,7 +78,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.groups'); + return __('filament-icons.resources.groups'); } /** diff --git a/app/Filament/Resources/Wiki/Image.php b/app/Filament/Resources/Wiki/Image.php index 96209033e..42f0bc5bc 100644 --- a/app/Filament/Resources/Wiki/Image.php +++ b/app/Filament/Resources/Wiki/Image.php @@ -87,7 +87,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.images'); + return __('filament-icons.resources.images'); } /** diff --git a/app/Filament/Resources/Wiki/Series.php b/app/Filament/Resources/Wiki/Series.php index 9c9072102..074607c72 100644 --- a/app/Filament/Resources/Wiki/Series.php +++ b/app/Filament/Resources/Wiki/Series.php @@ -80,7 +80,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.series'); + return __('filament-icons.resources.series'); } /** diff --git a/app/Filament/Resources/Wiki/Series/Pages/ListSeries.php b/app/Filament/Resources/Wiki/Series/Pages/ListSeries.php index d55ef4a49..cdb59fb6e 100644 --- a/app/Filament/Resources/Wiki/Series/Pages/ListSeries.php +++ b/app/Filament/Resources/Wiki/Series/Pages/ListSeries.php @@ -42,6 +42,7 @@ protected function applySearchToTableQuery(Builder $query): Builder $this->applyColumnSearchesToTableQuery($query); if (filled($search = $this->getTableSearch())) { + $search = preg_replace('/[^A-Za-z0-9 ]/', '', $search); $query->whereIn(SeriesModel::ATTRIBUTE_ID, SeriesModel::search($search)->take(25)->keys()); } diff --git a/app/Filament/Resources/Wiki/Song.php b/app/Filament/Resources/Wiki/Song.php index bc3a9aa93..3072f144d 100644 --- a/app/Filament/Resources/Wiki/Song.php +++ b/app/Filament/Resources/Wiki/Song.php @@ -85,7 +85,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.songs'); + return __('filament-icons.resources.songs'); } /** @@ -197,7 +197,8 @@ public static function infolist(Infolist $infolist): Infolist TextEntry::make(SongModel::ATTRIBUTE_TITLE) ->label(__('filament.fields.song.title.name')) ->copyableWithMessage(), - ]), + ]) + ->columns(2), Section::make(__('filament.fields.base.timestamps')) ->schema(parent::timestamps()) diff --git a/app/Filament/Resources/Wiki/Song/Pages/ListSongs.php b/app/Filament/Resources/Wiki/Song/Pages/ListSongs.php index 657512154..f9d5fd8a2 100644 --- a/app/Filament/Resources/Wiki/Song/Pages/ListSongs.php +++ b/app/Filament/Resources/Wiki/Song/Pages/ListSongs.php @@ -53,6 +53,7 @@ protected function applySearchToTableQuery(Builder $query): Builder $this->applyColumnSearchesToTableQuery($query); if (filled($search = $this->getTableSearch())) { + $search = preg_replace('/[^A-Za-z0-9 ]/', '', $search); $query->whereIn(SongModel::ATTRIBUTE_ID, SongModel::search($search)->take(25)->keys()); } diff --git a/app/Filament/Resources/Wiki/Studio.php b/app/Filament/Resources/Wiki/Studio.php index 9a523c287..3afc29542 100644 --- a/app/Filament/Resources/Wiki/Studio.php +++ b/app/Filament/Resources/Wiki/Studio.php @@ -88,7 +88,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.studios'); + return __('filament-icons.resources.studios'); } /** diff --git a/app/Filament/Resources/Wiki/Studio/Pages/ListStudios.php b/app/Filament/Resources/Wiki/Studio/Pages/ListStudios.php index 8e6f68e3a..cc1191f8b 100644 --- a/app/Filament/Resources/Wiki/Studio/Pages/ListStudios.php +++ b/app/Filament/Resources/Wiki/Studio/Pages/ListStudios.php @@ -54,6 +54,7 @@ protected function applySearchToTableQuery(Builder $query): Builder $this->applyColumnSearchesToTableQuery($query); if (filled($search = $this->getTableSearch())) { + $search = preg_replace('/[^A-Za-z0-9 ]/', '', $search); $query->whereIn(StudioModel::ATTRIBUTE_ID, StudioModel::search($search)->take(25)->keys()); } diff --git a/app/Filament/Resources/Wiki/Video.php b/app/Filament/Resources/Wiki/Video.php index aacf36c00..1880041ef 100644 --- a/app/Filament/Resources/Wiki/Video.php +++ b/app/Filament/Resources/Wiki/Video.php @@ -99,7 +99,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.videos'); + return __('filament-icons.resources.videos'); } /** diff --git a/app/Filament/Resources/Wiki/Video/Pages/ListVideos.php b/app/Filament/Resources/Wiki/Video/Pages/ListVideos.php index 4292e18b6..b0c4978a7 100644 --- a/app/Filament/Resources/Wiki/Video/Pages/ListVideos.php +++ b/app/Filament/Resources/Wiki/Video/Pages/ListVideos.php @@ -51,6 +51,7 @@ protected function applySearchToTableQuery(Builder $query): Builder $this->applyColumnSearchesToTableQuery($query); if (filled($search = $this->getTableSearch())) { + $search = preg_replace('/[^A-Za-z0-9 ]/', '', $search); $query->whereIn(VideoModel::ATTRIBUTE_ID, VideoModel::search($search)->take(25)->keys()); } diff --git a/app/Filament/Resources/Wiki/Video/Script.php b/app/Filament/Resources/Wiki/Video/Script.php index d43e73656..5f305f2ad 100644 --- a/app/Filament/Resources/Wiki/Video/Script.php +++ b/app/Filament/Resources/Wiki/Video/Script.php @@ -80,7 +80,7 @@ public static function getNavigationGroup(): string */ public static function getNavigationIcon(): string { - return __('filament.resources.icon.video_scripts'); + return __('filament-icons.resources.video_scripts'); } /** diff --git a/app/Filament/TableActions/Models/Discord/DiscordEditMessageTableAction.php b/app/Filament/TableActions/Models/Discord/DiscordEditMessageTableAction.php index bdfcd7a44..0902b978f 100644 --- a/app/Filament/TableActions/Models/Discord/DiscordEditMessageTableAction.php +++ b/app/Filament/TableActions/Models/Discord/DiscordEditMessageTableAction.php @@ -34,7 +34,7 @@ protected function setUp(): void parent::setUp(); $this->label(__('filament.table_actions.discord_thread.message.edit.name')); - $this->icon(__('filament.table_actions.discord_thread.message.edit.icon')); + $this->icon(__('filament-icons.table_actions.discord_thread.message.edit')); $this->authorize('forcedeleteany', DiscordThread::class); } diff --git a/app/Filament/TableActions/Models/Discord/DiscordSendMessageTableAction.php b/app/Filament/TableActions/Models/Discord/DiscordSendMessageTableAction.php index 0e1c90598..557fed13c 100644 --- a/app/Filament/TableActions/Models/Discord/DiscordSendMessageTableAction.php +++ b/app/Filament/TableActions/Models/Discord/DiscordSendMessageTableAction.php @@ -31,7 +31,7 @@ protected function setUp(): void parent::setUp(); $this->label(__('filament.table_actions.discord_thread.message.send.name')); - $this->icon(__('filament.table_actions.discord_thread.message.send.icon')); + $this->icon(__('filament-icons.table_actions.discord_thread.message.send')); $this->authorize('forcedeleteany', DiscordThread::class); } diff --git a/app/Filament/TableActions/Repositories/Storage/ReconcileStorageTableAction.php b/app/Filament/TableActions/Repositories/Storage/ReconcileStorageTableAction.php index 502a6e2df..58fd5402e 100644 --- a/app/Filament/TableActions/Repositories/Storage/ReconcileStorageTableAction.php +++ b/app/Filament/TableActions/Repositories/Storage/ReconcileStorageTableAction.php @@ -27,7 +27,7 @@ protected function setUp(): void { parent::setUp(); - $this->icon(__('filament.table_actions.base.reconcile.icon')); + $this->icon(__('filament-icons.table_actions.base.reconcile')); } /** diff --git a/app/Filament/TableActions/Storage/Admin/DumpTableAction.php b/app/Filament/TableActions/Storage/Admin/DumpTableAction.php index 0b4a1e9aa..c2b82fd2d 100644 --- a/app/Filament/TableActions/Storage/Admin/DumpTableAction.php +++ b/app/Filament/TableActions/Storage/Admin/DumpTableAction.php @@ -31,7 +31,7 @@ protected function setUp(): void { parent::setUp(); - $this->icon(__('filament.table_actions.dump.dump.icon')); + $this->icon(__('filament-icons.table_actions.dump.dump')); $this->authorize('create', Dump::class); } diff --git a/app/Filament/TableActions/Storage/Base/PruneTableAction.php b/app/Filament/TableActions/Storage/Base/PruneTableAction.php index 29f4bf9f0..f2ab63da6 100644 --- a/app/Filament/TableActions/Storage/Base/PruneTableAction.php +++ b/app/Filament/TableActions/Storage/Base/PruneTableAction.php @@ -23,7 +23,7 @@ protected function setUp(): void { parent::setUp(); - $this->icon(__('filament.table_actions.base.prune.icon')); + $this->icon(__('filament-icons.table_actions.base.prune')); } /** diff --git a/app/Filament/TableActions/Storage/Base/UploadTableAction.php b/app/Filament/TableActions/Storage/Base/UploadTableAction.php index f4eaa2e9e..eb340f83a 100644 --- a/app/Filament/TableActions/Storage/Base/UploadTableAction.php +++ b/app/Filament/TableActions/Storage/Base/UploadTableAction.php @@ -29,7 +29,7 @@ protected function setUp(): void { parent::setUp(); - $this->icon(__('filament.table_actions.base.upload.icon')); + $this->icon(__('filament-icons.table_actions.base.upload')); } /** diff --git a/app/Http/Middleware/Models/RecordView.php b/app/Http/Middleware/Models/RecordView.php index b0e6d1b20..fc0cda981 100644 --- a/app/Http/Middleware/Models/RecordView.php +++ b/app/Http/Middleware/Models/RecordView.php @@ -56,7 +56,7 @@ public function terminate(Request $request, Response $response): void { if (Feature::for(null)->active(FeatureConstants::ALLOW_VIEW_RECORDING)) { views($this->model)->cooldown(now()->addMinutes(5))->record(); - defer(fn () => ViewAggregate::query()->whereMorphedTo(ViewAggregate::ATTRIBUTE_VIEWABLE, $this->model)->increment(ViewAggregate::ATTRIBUTE_VALUE)); + ViewAggregate::query()->whereMorphedTo(ViewAggregate::ATTRIBUTE_VIEWABLE, $this->model)->increment(ViewAggregate::ATTRIBUTE_VALUE); } } } diff --git a/lang/en/filament-icons.php b/lang/en/filament-icons.php new file mode 100644 index 000000000..719750e23 --- /dev/null +++ b/lang/en/filament-icons.php @@ -0,0 +1,99 @@ + [ + 'anime' => [ + 'attach_streaming_resource' => 'heroicon-o-tv', + 'backfill' => 'heroicon-o-bars-4', + 'discord_thread' => 'heroicon-o-chat-bubble-left-right', + ], + 'base' => [ + 'copied' => 'heroicon-o-clipboard', + 'delete' => 'heroicon-m-trash', + 'edit' => 'heroicon-o-pencil-square', + 'group_delete' => 'heroicon-o-trash', + 'move_all' => 'heroicon-o-arrow-long-right', + ], + 'models' => [ + 'list' => [ + 'sync_profile' => 'heroicon-o-arrow-path', + ], + 'wiki' => [ + 'attach_image' => 'heroicon-o-photo', + 'attach_resource' => 'heroicon-o-queue-list', + ], + ], + 'storage' => [ + 'move' => 'heroicon-o-arrow-long-right', + ], + 'video' => [ + 'backfill' => 'heroicon-o-speaker-wave', + ], + ], + 'bulk_actions' => [ + 'discord' => [ + 'notification' => 'heroicon-o-bell', + ], + ], + 'dashboards' => [ + 'admin' => 'heroicon-m-chart-bar', + 'dev' => 'heroicon-m-code-bracket', + 'wiki' => 'heroicon-m-chart-bar', + ], + 'fields' => [ + 'user' => [ + 'email' => 'heroicon-m-envelope', + ], + ], + 'resources' => [ + 'action_logs' => 'heroicon-o-rectangle-stack', + 'anime_synonyms' => 'heroicon-o-globe-alt', + 'anime_theme_entries' => 'heroicon-o-list-bullet', + 'anime_themes' => 'heroicon-o-list-bullet', + 'anime' => 'heroicon-o-tv', + 'announcements' => 'heroicon-o-megaphone', + 'artists' => 'heroicon-o-user-circle', + 'audios' => 'heroicon-o-speaker-wave', + 'discord_thread' => 'heroicon-o-chat-bubble-left-right', + 'dumps' => 'heroicon-o-circle-stack', + 'external_entries' => 'heroicon-o-list-bullet', + 'external_profiles' => 'heroicon-o-list-bullet', + 'external_resources' => 'heroicon-o-arrow-top-right-on-square', + 'features' => 'heroicon-o-cog-6-tooth', + 'featured_themes' => 'heroicon-o-calendar-days', + 'groups' => 'heroicon-o-folder-open', + 'images' => 'heroicon-o-photo', + 'members' => '', + 'pages' => 'heroicon-o-document-text', + 'permissions' => 'heroicon-o-information-circle', + 'playlist_tracks' => 'heroicon-o-play', + 'playlists' => 'heroicon-o-play', + 'reports' => 'heroicon-o-light-bulb', + 'report_steps' => 'heroicon-o-light-bulb', + 'roles' => 'heroicon-o-briefcase', + 'series' => 'heroicon-o-folder', + 'songs' => 'heroicon-o-musical-note', + 'studios' => 'heroicon-o-building-office', + 'users' => 'heroicon-o-users', + 'video_scripts' => 'heroicon-o-document-text', + 'videos' => 'heroicon-o-film', + ], + 'table_actions' => [ + 'base' => [ + 'reconcile' => 'heroicon-o-arrow-path', + 'prune' => 'heroicon-o-trash', + 'upload' => 'heroicon-o-arrow-up-tray', + ], + 'discord_thread' => [ + 'message' => [ + 'edit' => 'heroicon-o-pencil-square', + 'send' => 'heroicon-o-chat-bubble-left', + ], + ], + 'dump' => [ + 'dump' => 'heroicon-o-circle-stack', + ], + ], +]; \ No newline at end of file diff --git a/lang/en/filament.php b/lang/en/filament.php index c9efea836..3a37f80f2 100644 --- a/lang/en/filament.php +++ b/lang/en/filament.php @@ -67,10 +67,8 @@ ], 'name' => 'Backfill Anime', ], - 'discord' => [ - 'thread' => [ - 'name' => 'Create Discord Thread', - ], + 'discord_thread' => [ + 'name' => 'Create Discord Thread', ], ], 'audio' => [ @@ -93,7 +91,7 @@ 'detach' => 'Detach', 'edit' => 'Edit', 'forcedelete' => 'Force Delete', - 'moveAll' => 'Move All', + 'move_all' => 'Move All', 'restore' => 'Restore', 'view' => 'View', ], @@ -192,16 +190,22 @@ ], ], 'models' => [ - 'assign_hashids' => [ - 'name' => 'Assign Hashids', - 'confirmButtonText' => 'Assign', - ], 'list' => [ + 'assign_hashids' => [ + 'name' => 'Assign Hashids', + 'confirmButtonText' => 'Assign', + ], 'external_profile' => [ 'create' => [ 'name' => 'Create External Profile', ], ], + 'fix_playlist' => [ + 'name' => 'Fix Playlist Cycles', + ], + 'sync_profile' => [ + 'name' => 'Sync External Profile', + ], ], 'wiki' => [ 'attach_resource' => [ @@ -419,7 +423,6 @@ ], 'delete' => [ 'confirmText' => 'Remove Video from configured storage disks and from the database?', - 'icon' => 'heroicon-m-trash', 'name' => 'Remove Video', ], 'move' => [ @@ -439,7 +442,6 @@ ], 'discord' => [ 'notification' => [ - 'icon' => 'heroicon-o-bell', 'name' => 'Create Discord Notification', 'should_send' => [ 'help' => 'If yes, the notification will be created.', @@ -456,11 +458,6 @@ 'add' => 'Add', ], 'dashboards' => [ - 'icon' => [ - 'admin' => 'heroicon-m-chart-bar', - 'dev' => 'heroicon-m-code-bracket', - 'wiki' => 'heroicon-m-chart-bar', - ], 'label' => [ 'admin' => 'Admin', 'dev' => 'Developer', @@ -927,39 +924,6 @@ 'list' => 'List', 'wiki' => 'Wiki', ], - 'icon' => [ - 'action_logs' => 'heroicon-o-rectangle-stack', - 'anime_synonyms' => 'heroicon-o-globe-alt', - 'anime_theme_entries' => 'heroicon-o-list-bullet', - 'anime_themes' => 'heroicon-o-list-bullet', - 'anime' => 'heroicon-o-tv', - 'announcements' => 'heroicon-o-megaphone', - 'artists' => 'heroicon-o-user-circle', - 'audios' => 'heroicon-o-speaker-wave', - 'discord_thread' => 'heroicon-o-chat-bubble-left-right', - 'dumps' => 'heroicon-o-circle-stack', - 'external_entries' => 'heroicon-o-list-bullet', - 'external_profiles' => 'heroicon-o-list-bullet', - 'external_resources' => 'heroicon-o-arrow-top-right-on-square', - 'features' => 'heroicon-o-cog-6-tooth', - 'featured_themes' => 'heroicon-o-calendar-days', - 'groups' => 'heroicon-o-folder-open', - 'images' => 'heroicon-o-photo', - 'members' => '', - 'pages' => 'heroicon-o-document-text', - 'permissions' => 'heroicon-o-information-circle', - 'playlist_tracks' => 'heroicon-o-play', - 'playlists' => 'heroicon-o-play', - 'reports' => 'heroicon-o-light-bulb', - 'report_steps' => 'heroicon-o-light-bulb', - 'roles' => 'heroicon-o-briefcase', - 'series' => 'heroicon-o-folder', - 'songs' => 'heroicon-o-musical-note', - 'studios' => 'heroicon-o-building-office', - 'users' => 'heroicon-o-users', - 'video_scripts' => 'heroicon-o-document-text', - 'videos' => 'heroicon-o-film', - ], 'label' => [ 'action_logs' => 'Action Logs', 'anime_synonyms' => 'Anime Synonyms', @@ -1028,25 +992,12 @@ ], ], 'table_actions' => [ - 'base' => [ - 'prune' => [ - 'icon' => 'heroicon-o-trash', - ], - 'reconcile' => [ - 'icon' => 'heroicon-o-arrow-path', - ], - 'upload' => [ - 'icon' => 'heroicon-o-arrow-up-tray', - ], - ], 'discord_thread' => [ 'message' => [ 'edit' => [ - 'icon' => 'heroicon-o-pencil-square', 'name' => 'Edit Message', ], 'send' => [ - 'icon' => 'heroicon-o-chat-bubble-left', 'name' => 'Send Message', ], 'channelId' => [ @@ -1119,11 +1070,6 @@ ], ], ], - 'dump' => [ - 'dump' => [ - 'icon' => 'heroicon-o-circle-stack', - ], - ], ], 'tabs' => [ 'anime' => [