From 5476445ccc2f23502f71da192f63aa0b9bcabdea Mon Sep 17 00:00:00 2001 From: Kyrch Date: Fri, 5 Jun 2026 08:21:56 -0300 Subject: [PATCH] feat: add id in some searching contexts (#1210) --- .env.example | 2 - .env.example-sail | 2 - .../Submission/SubmitNewAnimeAction.php | 100 --------- app/Filament/Components/Fields/BelongsTo.php | 1 + app/Filament/Components/Fields/Select.php | 1 + .../Providers/GlobalSearchScoutProvider.php | 5 +- .../Resources/Base/BaseListResources.php | 14 +- .../User/Submission/Pages/ListSubmissions.php | 13 -- .../User/Submission/Pages/ViewSubmission.php | 13 -- .../Resources/User/SubmissionResource.php | 143 ------------ .../Wiki/Anime/Theme/EntryResource.php | 5 - .../Submission/Components/SelectBuilder.php | 42 ---- .../Anime/Pages/CreateAnimeSubmission.php | 208 ------------------ .../Anime/Pages/ListAnimeSubmissions.php | 26 --- .../Resources/AnimeSubmissionResource.php | 118 ---------- .../Resources/BaseSubmissionResource.php | 142 ------------ .../Submission/Resources/Schema/AnimeForm.php | 73 ------ .../Resources/Schema/ArtistForm.php | 46 ---- .../Submission/Resources/Schema/EntryForm.php | 45 ---- .../Resources/Schema/ResourceForm.php | 47 ---- .../Resources/Schema/SeriesForm.php | 37 ---- .../Submission/Resources/Schema/SongForm.php | 29 --- .../Resources/Schema/StudioForm.php | 37 ---- .../Resources/Schema/SynonymForm.php | 33 --- .../Submission/Resources/Schema/ThemeForm.php | 37 ---- app/GraphQL/Queries/SearchQuery.php | 3 +- app/Models/Auth/User.php | 10 +- .../Filament/SubmissionPanelProvider.php | 55 ----- config/app.php | 1 - config/filament.php | 14 -- config/scout.php | 1 + lang/en/filament.php | 10 - lang/en/submissions.php | 31 --- 33 files changed, 21 insertions(+), 1323 deletions(-) delete mode 100644 app/Actions/Submission/SubmitNewAnimeAction.php delete mode 100644 app/Filament/Resources/User/Submission/Pages/ListSubmissions.php delete mode 100644 app/Filament/Resources/User/Submission/Pages/ViewSubmission.php delete mode 100644 app/Filament/Resources/User/SubmissionResource.php delete mode 100644 app/Filament/Submission/Components/SelectBuilder.php delete mode 100644 app/Filament/Submission/Resources/Anime/Pages/CreateAnimeSubmission.php delete mode 100644 app/Filament/Submission/Resources/Anime/Pages/ListAnimeSubmissions.php delete mode 100644 app/Filament/Submission/Resources/AnimeSubmissionResource.php delete mode 100644 app/Filament/Submission/Resources/BaseSubmissionResource.php delete mode 100644 app/Filament/Submission/Resources/Schema/AnimeForm.php delete mode 100644 app/Filament/Submission/Resources/Schema/ArtistForm.php delete mode 100644 app/Filament/Submission/Resources/Schema/EntryForm.php delete mode 100644 app/Filament/Submission/Resources/Schema/ResourceForm.php delete mode 100644 app/Filament/Submission/Resources/Schema/SeriesForm.php delete mode 100644 app/Filament/Submission/Resources/Schema/SongForm.php delete mode 100644 app/Filament/Submission/Resources/Schema/StudioForm.php delete mode 100644 app/Filament/Submission/Resources/Schema/SynonymForm.php delete mode 100644 app/Filament/Submission/Resources/Schema/ThemeForm.php delete mode 100644 app/Providers/Filament/SubmissionPanelProvider.php delete mode 100644 lang/en/submissions.php diff --git a/.env.example b/.env.example index 055a39540..eeefa2fe4 100644 --- a/.env.example +++ b/.env.example @@ -98,8 +98,6 @@ FFPROBE_BINARIES= # filament FILAMENT_URL=http://admin.animethemes.test FILAMENT_PATH= -FILAMENT_SUBMISSION_URL=http://admin.animethemes.test -FILAMENT_SUBMISSION_PATH=submission # filesystems FILESYSTEM_DISK=local diff --git a/.env.example-sail b/.env.example-sail index a022f4266..78a484586 100644 --- a/.env.example-sail +++ b/.env.example-sail @@ -96,8 +96,6 @@ FFPROBE_BINARIES= # filament FILAMENT_URL=http://admin.animethemes.test FILAMENT_PATH= -FILAMENT_SUBMISSION_URL=http://admin.animethemes.test -FILAMENT_SUBMISSION_PATH=submission # filesystems FILESYSTEM_DISK=local diff --git a/app/Actions/Submission/SubmitNewAnimeAction.php b/app/Actions/Submission/SubmitNewAnimeAction.php deleted file mode 100644 index b482a63b7..000000000 --- a/app/Actions/Submission/SubmitNewAnimeAction.php +++ /dev/null @@ -1,100 +0,0 @@ -create([ - Submission::ATTRIBUTE_SOURCE => Arr::get($data, Submission::ATTRIBUTE_SOURCE), - Submission::ATTRIBUTE_STATUS => SubmissionStatus::PENDING, - Submission::ATTRIBUTE_USER => $user->getKey(), - ]); - - $anime = SubmissionAnime::query()->create(Arr::get($data, 'anime')); - - $submission->submitted()->associate($anime); - - $this->handleSynonyms($submission, $data); - - // TODO: handle themes. - - $this->handleRelation($submission, $data, SubmissionAnime::RELATION_SERIES, SubmissionSeries::class, Series::class); - $this->handleRelation($submission, $data, SubmissionAnime::RELATION_RESOURCES, SubmissionResource::class, ExternalResource::class); - $this->handleRelation($submission, $data, SubmissionAnime::RELATION_STUDIOS, SubmissionStudio::class, Studio::class); - - DB::commit(); - } catch (Exception $e) { - DB::rollBack(); - - Log::error($e->getMessage()); - - throw $e; - } - } - - protected function handleSynonyms(Submission $submission, array $data): void - { - foreach (Arr::get($data, SubmissionAnime::RELATION_SYNONYMS) as $synonym) { - $submissionSynonym = SubmissionSynonym::query()->create($synonym); - - $submissionSynonym->submission()->attach([ - $submission->getKey() => [ - SubmissionComparison::ATTRIBUTE_ACTION => SubmissionComparisonAction::CREATE, - ], - ]); - } - } - - protected function handleRelation(Submission $submission, array $data, string $relation, string $submissionModel, string $model): void - { - $list = Arr::get($data, $relation, []); - - foreach ($list as $item) { - $type = Arr::string($item, 'type'); - - if ($type === 'create') { - SubmissionComparison::query()->create([ - SubmissionComparison::ATTRIBUTE_ACTION => SubmissionComparisonAction::CREATE, - SubmissionComparison::ATTRIBUTE_SUBMISSION => $submission->getKey(), - SubmissionComparison::ATTRIBUTE_SUBMITTED_TYPE => Relation::getMorphAlias($submissionModel), - SubmissionComparison::ATTRIBUTE_SUBMITTED_ID => $submissionModel::query()->create($item['data'])->getKey(), - ]); - } - - if ($type === 'attach') { - SubmissionComparison::query()->create([ - SubmissionComparison::ATTRIBUTE_ACTION => SubmissionComparisonAction::ATTACH, - SubmissionComparison::ATTRIBUTE_SUBMISSION => $submission->getKey(), - SubmissionComparison::ATTRIBUTE_ACTIONABLE_TYPE => Relation::getMorphAlias($model), - SubmissionComparison::ATTRIBUTE_ACTIONABLE_ID => $item['data']['id'], - ]); - } - } - } -} diff --git a/app/Filament/Components/Fields/BelongsTo.php b/app/Filament/Components/Fields/BelongsTo.php index 8e788af38..84306f175 100644 --- a/app/Filament/Components/Fields/BelongsTo.php +++ b/app/Filament/Components/Fields/BelongsTo.php @@ -77,6 +77,7 @@ class BelongsTo extends Select ->search() ->items() ) + ->merge($modelClass::query()->whereKey($this->escapeReservedChars($search))->get()) ->mapWithKeys(fn (Model $model): array => [$model->getKey() => static::getSearchLabelWithBlade($model, $this->withSubtitle)]) ->toArray() ); diff --git a/app/Filament/Components/Fields/Select.php b/app/Filament/Components/Fields/Select.php index 7004a83eb..d00d003b8 100644 --- a/app/Filament/Components/Fields/Select.php +++ b/app/Filament/Components/Fields/Select.php @@ -42,6 +42,7 @@ class Select extends ComponentsSelect }) ->items() ) + ->merge($modelClass::query()->whereKey($this->escapeReservedChars($search))->get()) ->mapWithKeys(fn (Model $model): array => [$model->getKey() => BelongsTo::getSearchLabelWithBlade($model)]) ->toArray() ); diff --git a/app/Filament/Providers/GlobalSearchScoutProvider.php b/app/Filament/Providers/GlobalSearchScoutProvider.php index b1db5118d..9366480ad 100644 --- a/app/Filament/Providers/GlobalSearchScoutProvider.php +++ b/app/Filament/Providers/GlobalSearchScoutProvider.php @@ -33,11 +33,14 @@ class GlobalSearchScoutProvider implements GlobalSearchProvider continue; } + $query = $this->escapeReservedChars($query); + $resourceResults = collect( - Search::getSearch($modelClass, new Criteria($this->escapeReservedChars($query))) + Search::getSearch($modelClass, new Criteria($query)) ->search(fn (Builder $builder) => $builder->with($resource::getEloquentQuery()->getEagerLoads())) ->items() ) + ->merge($modelClass::query()->whereKey($query)->get()) ->map(function (Model $record) use ($resource): ?GlobalSearchResult { $url = $resource::getUrl('view', ['record' => $record]); diff --git a/app/Filament/Resources/Base/BaseListResources.php b/app/Filament/Resources/Base/BaseListResources.php index 6326f1218..05bb80e5a 100644 --- a/app/Filament/Resources/Base/BaseListResources.php +++ b/app/Filament/Resources/Base/BaseListResources.php @@ -37,11 +37,15 @@ abstract class BaseListResources extends ListRecords $model = new $modelClass; if (filled($search = $this->getTableSearch())) { - $keys = Search::getSearch($modelClass, new Criteria($this->escapeReservedChars($search))) - ->search() - ->getCollection() - ->map(fn (Model $model) => $model->getKey()) - ->toArray(); + $search = $this->escapeReservedChars($search); + + $keys = is_numeric($search) + ? [$search] + : Search::getSearch($modelClass, new Criteria($search)) + ->search() + ->getCollection() + ->map(fn (Model $model) => $model->getKey()) + ->toArray(); $query ->whereIn($model->getKeyName(), $keys) diff --git a/app/Filament/Resources/User/Submission/Pages/ListSubmissions.php b/app/Filament/Resources/User/Submission/Pages/ListSubmissions.php deleted file mode 100644 index c015ea423..000000000 --- a/app/Filament/Resources/User/Submission/Pages/ListSubmissions.php +++ /dev/null @@ -1,13 +0,0 @@ -|null - */ - protected static ?string $model = Submission::class; - - public static function getModelLabel(): string - { - return __('filament.resources.singularLabel.submission'); - } - - public static function getPluralModelLabel(): string - { - return __('filament.resources.label.submissions'); - } - - public static function getNavigationGroup(): NavigationGroup - { - return NavigationGroup::USER; - } - - public static function getNavigationIcon(): Heroicon - { - return Heroicon::OutlinedLightBulb; - } - - public static function getRecordSlug(): string - { - return 'submissions'; - } - - public static function getRecordTitleAttribute(): string - { - return Submission::ATTRIBUTE_ID; - } - - public static function getEloquentQuery(): Builder - { - $query = parent::getEloquentQuery(); - - // Necessary to prevent lazy loading when loading related resources - return $query->with([ - Submission::RELATION_USER, - Submission::RELATION_ASSIGNEE, - ]); - } - - public static function form(Schema $schema): Schema - { - return $schema; - } - - public static function table(Table $table): Table - { - return parent::table($table) - ->columns([ - TextColumn::make(Submission::ATTRIBUTE_ID) - ->label(__('filament.fields.base.id')), - - TextColumn::make(Submission::ATTRIBUTE_STATUS) - ->label(__('filament.fields.submission.status')) - ->formatStateUsing(fn (SubmissionStatus $state): ?string => $state->localize()) - ->badge(), - - BelongsToColumn::make(Submission::RELATION_USER, UserResource::class), - - BelongsToColumn::make(Submission::RELATION_ASSIGNEE, UserResource::class) - ->label(__('filament.fields.submission.moderator')), - - TextColumn::make(Submission::ATTRIBUTE_FINISHED_AT) - ->label(__('filament.fields.submission.finished_at')) - ->dateTime(), - ]); - } - - public static function infolist(Schema $schema): Schema - { - return $schema - ->components([ - Section::make(static::getRecordTitle($schema->getRecord())) - ->schema([ - TextEntry::make(Submission::ATTRIBUTE_ID) - ->label(__('filament.fields.base.id')), - - TextEntry::make(Submission::ATTRIBUTE_STATUS) - ->label(__('filament.fields.submission.status')) - ->formatStateUsing(fn (SubmissionStatus $state): ?string => $state->localize()) - ->badge(), - - BelongsToEntry::make(Submission::RELATION_USER, UserResource::class), - - BelongsToEntry::make(Submission::RELATION_ASSIGNEE, UserResource::class) - ->label(__('filament.fields.submission.moderator')), - - TextEntry::make(Submission::ATTRIBUTE_FINISHED_AT) - ->label(__('filament.fields.submission.finished_at')) - ->dateTime(), - ]) - ->columns(3), - - TimestampSection::make(), - ]); - } - - /** - * @return array - */ - public static function getPages(): array - { - return [ - 'index' => ListSubmissions::route('/'), - 'view' => ViewSubmission::route('/{record:submission_id}'), - ]; - } -} diff --git a/app/Filament/Resources/Wiki/Anime/Theme/EntryResource.php b/app/Filament/Resources/Wiki/Anime/Theme/EntryResource.php index 941b7c017..26143d6b3 100644 --- a/app/Filament/Resources/Wiki/Anime/Theme/EntryResource.php +++ b/app/Filament/Resources/Wiki/Anime/Theme/EntryResource.php @@ -26,7 +26,6 @@ use App\Filament\Resources\Wiki\Anime\Theme\RelationManagers\EntryThemeRelationM use App\Filament\Resources\Wiki\Anime\ThemeResource; use App\Filament\Resources\Wiki\AnimeResource; use App\Filament\Resources\Wiki\SongResource; -use App\Filament\Submission\Resources\Anime\Pages\CreateAnimeSubmission; use App\Models\Wiki\Anime\AnimeTheme; use App\Models\Wiki\Anime\Theme\AnimeThemeEntry; use App\Models\Wiki\Song; @@ -167,10 +166,6 @@ class EntryResource extends BaseResource ->rule(new AnimeThemeEntryResourceLinkFormatRule(ResourceSite::YOUTUBE)) ->uri() ->saveRelationshipsUsing(function (AnimeThemeEntry $record, AttachResourceAction $action, ?Uri $state, $livewire): void { - if ($livewire instanceof CreateAnimeSubmission) { - return; - } - $action->handle($record, [ResourceSite::YOUTUBE->name => $state], [ResourceSite::YOUTUBE]); }), ]) diff --git a/app/Filament/Submission/Components/SelectBuilder.php b/app/Filament/Submission/Components/SelectBuilder.php deleted file mode 100644 index 6eafe189b..000000000 --- a/app/Filament/Submission/Components/SelectBuilder.php +++ /dev/null @@ -1,42 +0,0 @@ - $model - * @param class-string $form - */ - public function set(string $model, string $form): static - { - $singularLabel = Str::afterLast($this->getAddActionLabel(), ' '); - - $this->blockNumbers(false); - - $this->blocks([ - Block::make('create') - ->label(__('filament.buttons.create', ['label' => $singularLabel])) - ->schema(fn (Schema $schema) => $form::configure($schema)->getComponents()), - - Block::make('attach') - ->label(__('filament.buttons.attach', ['label' => $singularLabel])) - ->schema(fn ($livewire): array => [ - Select::make('id') - ->label($singularLabel) - ->useScout($livewire, $model), - ]), - ]); - - return $this; - } -} diff --git a/app/Filament/Submission/Resources/Anime/Pages/CreateAnimeSubmission.php b/app/Filament/Submission/Resources/Anime/Pages/CreateAnimeSubmission.php deleted file mode 100644 index 15bc27424..000000000 --- a/app/Filament/Submission/Resources/Anime/Pages/CreateAnimeSubmission.php +++ /dev/null @@ -1,208 +0,0 @@ -components([ - Textarea::make(Submission::ATTRIBUTE_SOURCE) - ->label(__('submissions.fields.base.source.name')) - ->helperText(__('submissions.fields.base.source.help')) - ->required() - ->rows(5), - - Tabs::make('tabs') - ->vertical() - ->columnSpanFull() - ->tabs([ - Tab::make('anime') - ->statePath('anime') - ->label(__('filament.resources.label.anime')) - ->columns(2) - ->schema(AnimeForm::configure($schema)->getComponents()), - - Tab::make(SubmissionAnime::RELATION_SYNONYMS) - ->label(__('filament.resources.label.synonyms')) - ->schema([ - Repeater::make(SubmissionAnime::RELATION_SYNONYMS) - ->label(__('filament.resources.label.synonyms')) - ->addActionLabel(__('filament.buttons.add', ['label' => __('filament.resources.singularLabel.synonym')])) - ->defaultItems(0) - ->schema(SynonymForm::configure($schema)->getComponents()), - ]), - - Tab::make(SubmissionAnime::RELATION_THEMES) - ->label(__('filament.resources.label.anime_themes')) - ->schema([ - Repeater::make(SubmissionAnime::RELATION_THEMES) - ->label(__('filament.resources.label.anime_themes')) - ->addActionLabel(__('filament.buttons.add', ['label' => __('filament.resources.singularLabel.anime_theme')])) - ->schema([ - Tabs::make('Tabs') - ->schema([ - Tab::make('theme') - ->label(__('filament.resources.singularLabel.anime_theme')) - ->schema(ThemeForm::configure($schema)->getComponents()), - - Tab::make('song') - ->label(__('filament.resources.singularLabel.song')) - ->schema([ - SelectBuilder::make('song') - ->label(__('filament.resources.singularLabel.song')) - ->addActionLabel(__('filament.buttons.add', ['label' => __('filament.resources.singularLabel.song')])) - ->maxItems(1) - ->reorderable(false) - ->set(Song::class, SongForm::class), - - Repeater::make('performances') - ->label(__('filament.resources.label.artists')) - ->live(true) - ->key('song.performances') - ->collapsible() - ->defaultItems(0) - ->columns(3) - ->columnSpanFull() - ->schema([ - SelectBuilder::make('artist') - ->label(__('filament.resources.singularLabel.artist')) - ->maxItems(1) - ->reorderable(false) - ->columnSpanFull() - ->set(Artist::class, ArtistForm::class), - - TextInput::make(SubmissionPerformance::ATTRIBUTE_AS) - ->label(__('filament.fields.performance.as.name')) - ->helperText(__('filament.fields.performance.as.help')), - - TextInput::make(SubmissionPerformance::ATTRIBUTE_ALIAS) - ->label(__('filament.fields.performance.alias.name')) - ->helperText(__('filament.fields.performance.alias.help')), - - Repeater::make('members') - ->label(__('filament.resources.label.members')) - ->helperText(__('filament.fields.performance.members.help')) - ->collapsible() - ->defaultItems(0) - ->columns(3) - ->columnSpanFull() - ->schema([ - SelectBuilder::make('member') - ->label(__('filament.fields.performance.member')) - ->maxItems(1) - ->reorderable(false) - ->columnSpanFull() - ->set(Artist::class, ArtistForm::class), - - TextInput::make(SubmissionPerformance::ATTRIBUTE_MEMBER_AS) - ->label(__('filament.fields.performance.member_as.name')) - ->helperText(__('filament.fields.performance.member_as.help')), - - TextInput::make(SubmissionPerformance::ATTRIBUTE_MEMBER_ALIAS) - ->label(__('filament.fields.performance.member_alias.name')) - ->helperText(__('filament.fields.performance.member_alias.help')), - ]), - ]), - ]), - - Tab::make('entries') - ->label(__('filament.resources.label.anime_theme_entries')) - ->schema([ - Repeater::make('entries') - ->label(__('filament.resources.label.anime_theme_entries')) - ->addActionLabel(__('filament.buttons.add', ['label' => __('filament.resources.singularLabel.anime_theme_entry')])) - ->schema(EntryForm::configure($schema)->getComponents()), - ]), - ]), - ]), - ]), - - Tab::make(SubmissionAnime::RELATION_SERIES) - ->label(__('filament.resources.label.series')) - ->schema([ - SelectBuilder::make(SubmissionAnime::RELATION_SERIES) - ->label(__('filament.resources.label.series')) - ->addActionLabel(__('filament.buttons.add', ['label' => __('filament.resources.singularLabel.series')])) - ->set(Series::class, SeriesForm::class), - ]), - - Tab::make(SubmissionAnime::RELATION_RESOURCES) - ->label(__('filament.resources.label.external_resources')) - ->schema([ - Repeater::make(SubmissionAnime::RELATION_RESOURCES) - ->label(__('filament.resources.label.external_resources')) - ->addActionLabel(__('filament.buttons.add', ['label' => __('filament.resources.singularLabel.external_resource')])) - ->defaultItems(0) - ->schema(ResourceForm::configure($schema)->getComponents()), - ]), - - Tab::make(SubmissionAnime::RELATION_STUDIOS) - ->label(__('filament.resources.label.studios')) - ->schema([ - SelectBuilder::make(SubmissionAnime::RELATION_STUDIOS) - ->label(__('filament.resources.label.studios')) - ->addActionLabel(__('filament.buttons.add', ['label' => __('filament.resources.singularLabel.studio')])) - ->set(Studio::class, StudioForm::class), - ]), - ]), - ]); - } - - // TODO: Refactor common submission creation logic - protected function handleRecordCreation(array $data): Model - { - new SubmitNewAnimeAction()->handle(Auth::user(), $data); - - $this->halt(); - - return new Submission(); - } - - protected function getCreateFormAction(): Action - { - return parent::getCreateFormAction() - ->label(__('submissions.buttons.submit')); - } - - protected function getCreateAnotherFormAction(): Action - { - return parent::getCreateAnotherFormAction() - ->label(__('submissions.buttons.submit_another')); - } -} diff --git a/app/Filament/Submission/Resources/Anime/Pages/ListAnimeSubmissions.php b/app/Filament/Submission/Resources/Anime/Pages/ListAnimeSubmissions.php deleted file mode 100644 index 76e8c1fad..000000000 --- a/app/Filament/Submission/Resources/Anime/Pages/ListAnimeSubmissions.php +++ /dev/null @@ -1,26 +0,0 @@ -|null - */ - protected static ?string $model = Submission::class; - - public static function getModelLabel(): string - { - return __('submissions.resources.singularLabel.anime'); - } - - public static function getPluralModelLabel(): string - { - return __('submissions.resources.label.anime'); - } - - public static function getNavigationIcon(): Heroicon - { - return Heroicon::OutlinedTv; - } - - public static function getRecordTitleAttribute(): string - { - return Submission::ATTRIBUTE_ID; - } - - public static function canGloballySearch(): bool - { - return true; - } - - public static function getRecordSlug(): string - { - return 'anime'; - } - - public static function getEloquentQuery(): Builder - { - $builder = parent::getEloquentQuery(); - - $builder->where( - fn (Builder $query) => $query->orWhere(Submission::ATTRIBUTE_ACTIONABLE_TYPE, Relation::getMorphAlias(Anime::class)) - ->orWhere(Submission::ATTRIBUTE_SUBMITTED_TYPE, Relation::getMorphAlias(SubmissionAnime::class)) - ); - - $builder->whereBelongsTo(Auth::user(), Submission::RELATION_USER); - - return $builder->with([ - Submission::RELATION_ACTIONABLE, - Submission::RELATION_SUBMITTED, - ]); - } - - public static function table(Table $table): Table - { - return parent::table($table) - ->columns([ - TextColumn::make(Submission::ATTRIBUTE_ID) - ->label(__('filament.fields.base.id')), - - TextColumn::make('name') - ->label(__('submissions.fields.submission.name')) - // @phpstan-ignore-next-line - ->state(fn (Submission $submission) => $submission->actionable?->getName() ?? $submission->submitted->getName()), - - TextColumn::make(Submission::ATTRIBUTE_STATUS) - ->label(__('submissions.fields.submission.status')) - ->formatStateUsing(fn (SubmissionStatus $state): string => $state->localize()) - ->badge(), - - TextColumn::make(Submission::ATTRIBUTE_FINISHED_AT) - ->label(__('submissions.fields.submission.finished_at')) - ->dateTime(), - ]); - } - - /** - * @return \Filament\Tables\Filters\BaseFilter[] - */ - public static function getFilters(): array - { - return []; - } - - /** - * @return array - */ - public static function getPages(): array - { - return [ - 'index' => ListAnimeSubmissions::route('/'), - 'create' => CreateAnimeSubmission::route('/submit'), - ]; - } -} diff --git a/app/Filament/Submission/Resources/BaseSubmissionResource.php b/app/Filament/Submission/Resources/BaseSubmissionResource.php deleted file mode 100644 index 97ccf14c7..000000000 --- a/app/Filament/Submission/Resources/BaseSubmissionResource.php +++ /dev/null @@ -1,142 +0,0 @@ -getKeyName(); - } - - public static function getRecordTitleAttribute(): string - { - return (new static::$model)->getKeyName(); - } - - public static function table(Table $table): Table - { - return $table - ->defaultSort(fn (Table $table): ?string => $table->hasSearch() ? null : static::getRecordRouteKeyName(), fn (Table $table): ?string => $table->hasSearch() ? null : 'desc') - ->filters(static::getFilters()) - ->filtersLayout(FiltersLayout::Modal) - ->filtersFormWidth(Width::FourExtraLarge) - ->filtersFormMaxHeight('400px') - ->recordActions(static::getActions()) - ->toolbarActions(static::getBulkActions()) - ->headerActions(static::getTableActions()) - ->recordUrl(fn (Model $record): string => static::getUrl('create', ['record' => $record])) - ->paginated([10, 25, 50, 100, 'all']) - ->defaultPaginationPageOption(25) - ->extremePaginationLinks() - ->deferLoading(! app()->runningUnitTests()); - } - - /** - * @return \Filament\Tables\Filters\BaseFilter[] - */ - public static function getFilters(): array - { - return [ - TrashedFilter::make() - ->visible(in_array(SoftDeletable::class, class_implements(static::getModel()))), - ]; - } - - /** - * @return Constraint[] - */ - public static function getConstraints(): array - { - return [ - DateConstraint::make(BaseModel::ATTRIBUTE_CREATED_AT) - ->label(__('filament.fields.base.created_at')), - - DateConstraint::make(BaseModel::ATTRIBUTE_UPDATED_AT) - ->label(__('filament.fields.base.updated_at')), - ]; - } - - /** - * @return array - */ - public static function getActions(): array - { - return [ - ...(Gate::allows('viewAny', static::$model) ? [ViewAction::make()] : []), - ]; - } - - /** - * @return Action[] - */ - public static function getRecordActions(): array - { - return []; - } - - /** - * @param array|null $actionsIncludedInGroup - * @return array - */ - public static function getBulkActions(?array $actionsIncludedInGroup = []): array - { - return []; - } - - /** - * @return array - */ - public static function getTableActions(): array - { - return []; - } - - public static function getEloquentQuery(): Builder - { - return parent::getEloquentQuery() - ->withoutGlobalScopes([ - SoftDeletingScope::class, - ]); - } - - /** - * @return array> - */ - public static function getBaseRelations(): array - { - return []; - } - - public static function getSlug(?Panel $panel = null): string - { - return 'submissions/'.static::getRecordSlug(); - } - - abstract public static function getRecordSlug(): string; -} diff --git a/app/Filament/Submission/Resources/Schema/AnimeForm.php b/app/Filament/Submission/Resources/Schema/AnimeForm.php deleted file mode 100644 index 3a163aba7..000000000 --- a/app/Filament/Submission/Resources/Schema/AnimeForm.php +++ /dev/null @@ -1,73 +0,0 @@ -components([ - TextInput::make(SubmissionAnime::ATTRIBUTE_NAME) - ->label(__('filament.fields.anime.name.name')) - ->helperText(__('filament.fields.anime.name.help')) - ->required() - ->maxLength(255) - ->afterStateUpdatedJs(<<<'JS' - $set('slug', slug($state ?? '')); - JS), - - TextInput::make(SubmissionAnime::ATTRIBUTE_SLUG) - ->label(__('filament.fields.anime.slug.name')) - ->helperText(__('filament.fields.anime.slug.help')) - ->required() - ->alphaDash() - ->maxLength(192) - ->unique(Anime::TABLE, Anime::ATTRIBUTE_SLUG), - - TextInput::make(SubmissionAnime::ATTRIBUTE_YEAR) - ->label(__('filament.fields.anime.year.name')) - ->helperText(__('filament.fields.anime.year.help')) - ->required() - ->integer() - ->length(4) - ->default(date('Y')) - ->minValue(1960) - ->maxValue(intval(date('Y')) + 1), - - Select::make(SubmissionAnime::ATTRIBUTE_SEASON) - ->label(__('filament.fields.anime.season.name')) - ->helperText(__('filament.fields.anime.season.help')) - ->options(AnimeSeason::asSelectArrayStyled()) - ->required() - ->enum(AnimeSeason::class) - ->default(AnimeSeason::getCurrentSeason()) - ->searchable() - ->allowHtml(), - - Select::make(SubmissionAnime::ATTRIBUTE_FORMAT) - ->label(__('filament.fields.anime.format.name')) - ->helperText(__('filament.fields.anime.format.help')) - ->options(AnimeFormat::class) - ->required(), - - MarkdownEditor::make(SubmissionAnime::ATTRIBUTE_SYNOPSIS) - ->label(__('filament.fields.anime.synopsis.name')) - ->helperText(__('filament.fields.anime.synopsis.help')) - ->columnSpan(2) - ->maxLength(65535), - ]) - ->columns(2); - } -} diff --git a/app/Filament/Submission/Resources/Schema/ArtistForm.php b/app/Filament/Submission/Resources/Schema/ArtistForm.php deleted file mode 100644 index 166ffa60d..000000000 --- a/app/Filament/Submission/Resources/Schema/ArtistForm.php +++ /dev/null @@ -1,46 +0,0 @@ -components([ - TextInput::make(SubmissionArtist::ATTRIBUTE_NAME) - ->label(__('filament.fields.artist.name.name')) - ->helperText(__('filament.fields.artist.name.help')) - ->required() - ->maxLength(192) - ->columnSpan(1) - ->afterStateUpdatedJs(<<<'JS' - $set('slug', slug($state ?? '')); - JS), - - TextInput::make(SubmissionArtist::ATTRIBUTE_SLUG) - ->label(__('filament.fields.artist.slug.name')) - ->helperText(__('filament.fields.artist.slug.help')) - ->columnSpan(1) - ->required() - ->alphaDash() - ->maxLength(192) - ->unique(Artist::TABLE, Artist::ATTRIBUTE_SLUG), - - MarkdownEditor::make(SubmissionArtist::ATTRIBUTE_INFORMATION) - ->label(__('filament.fields.artist.information.name')) - ->helperText(__('filament.fields.artist.information.help')) - ->columnSpanFull() - ->maxLength(65535), - ]) - ->columns(3); - } -} diff --git a/app/Filament/Submission/Resources/Schema/EntryForm.php b/app/Filament/Submission/Resources/Schema/EntryForm.php deleted file mode 100644 index 4289f7a8f..000000000 --- a/app/Filament/Submission/Resources/Schema/EntryForm.php +++ /dev/null @@ -1,45 +0,0 @@ -components([ - TextInput::make(SubmissionAnimeThemeEntry::ATTRIBUTE_VERSION) - ->label(__('filament.fields.anime_theme_entry.version.name')) - ->helperText(__('filament.fields.anime_theme_entry.version.help')) - ->default(1) - ->integer() - ->required(), - - TextInput::make(SubmissionAnimeThemeEntry::ATTRIBUTE_EPISODES) - ->label(__('filament.fields.anime_theme_entry.episodes.name')) - ->helperText(__('filament.fields.anime_theme_entry.episodes.help')) - ->maxLength(192), - - Checkbox::make(SubmissionAnimeThemeEntry::ATTRIBUTE_NSFW) - ->label(__('filament.fields.anime_theme_entry.nsfw.name')) - ->helperText(__('filament.fields.anime_theme_entry.nsfw.help')), - - Checkbox::make(SubmissionAnimeThemeEntry::ATTRIBUTE_SPOILER) - ->label(__('filament.fields.anime_theme_entry.spoiler.name')) - ->helperText(__('filament.fields.anime_theme_entry.spoiler.help')), - - TextInput::make(SubmissionAnimeThemeEntry::ATTRIBUTE_NOTES) - ->label(__('filament.fields.anime_theme_entry.notes.name')) - ->helperText(__('filament.fields.anime_theme_entry.notes.help')) - ->maxLength(192), - ]) - ->columns(1); - } -} diff --git a/app/Filament/Submission/Resources/Schema/ResourceForm.php b/app/Filament/Submission/Resources/Schema/ResourceForm.php deleted file mode 100644 index 0627f415c..000000000 --- a/app/Filament/Submission/Resources/Schema/ResourceForm.php +++ /dev/null @@ -1,47 +0,0 @@ -components([ - Select::make(SubmissionExternalResource::ATTRIBUTE_SITE) - ->label(__('filament.fields.external_resource.site.name')) - ->helperText(__('filament.fields.external_resource.site.help')) - ->options(ResourceSite::class) - ->required(), - - TextInput::make(SubmissionExternalResource::ATTRIBUTE_LINK) - ->label(__('filament.fields.external_resource.link.name')) - ->helperText(__('filament.fields.external_resource.link.help')) - ->required() - ->live() - ->uri() - ->partiallyRenderComponentsAfterStateUpdated([SubmissionExternalResource::ATTRIBUTE_SITE, SubmissionExternalResource::ATTRIBUTE_EXTERNAL_ID]) - ->afterStateUpdated(function (Set $set, ?string $state): void { - if ($state !== null) { - $set(SubmissionExternalResource::ATTRIBUTE_SITE, ResourceSite::valueOf($state) ?? ResourceSite::OFFICIAL_SITE); - $set(SubmissionExternalResource::ATTRIBUTE_EXTERNAL_ID, ResourceSite::parseIdFromLink($state)); - } - }), - - TextInput::make(SubmissionExternalResource::ATTRIBUTE_EXTERNAL_ID) - ->label(__('filament.fields.external_resource.external_id.name')) - ->helperText(__('filament.fields.external_resource.external_id.help')) - ->integer(), - ]) - ->columns(1); - } -} diff --git a/app/Filament/Submission/Resources/Schema/SeriesForm.php b/app/Filament/Submission/Resources/Schema/SeriesForm.php deleted file mode 100644 index 1560de4f8..000000000 --- a/app/Filament/Submission/Resources/Schema/SeriesForm.php +++ /dev/null @@ -1,37 +0,0 @@ -components([ - TextInput::make(SubmissionSeries::ATTRIBUTE_NAME) - ->label(__('filament.fields.series.name.name')) - ->helperText(__('filament.fields.series.name.help')) - ->required() - ->maxLength(192) - ->afterStateUpdatedJs(<<<'JS' - $set('slug', slug($state ?? '')); - JS), - - TextInput::make(SubmissionSeries::ATTRIBUTE_SLUG) - ->label(__('filament.fields.series.slug.name')) - ->helperText(__('filament.fields.series.slug.help')) - ->required() - ->alphaDash() - ->maxLength(192) - ->unique(Series::TABLE, Series::ATTRIBUTE_SLUG), - ]) - ->columns(1); - } -} diff --git a/app/Filament/Submission/Resources/Schema/SongForm.php b/app/Filament/Submission/Resources/Schema/SongForm.php deleted file mode 100644 index 9f2827513..000000000 --- a/app/Filament/Submission/Resources/Schema/SongForm.php +++ /dev/null @@ -1,29 +0,0 @@ -components([ - TextInput::make(SubmissionSong::ATTRIBUTE_TITLE) - ->label(__('filament.fields.song.title.name')) - ->helperText(__('filament.fields.song.title.help')) - ->required() - ->maxLength(192), - - TextInput::make(SubmissionSong::ATTRIBUTE_TITLE_NATIVE) - ->label(__('filament.fields.song.title_native.name')) - ->helperText(__('filament.fields.song.title_native.help')) - ->maxLength(192), - ]); - } -} diff --git a/app/Filament/Submission/Resources/Schema/StudioForm.php b/app/Filament/Submission/Resources/Schema/StudioForm.php deleted file mode 100644 index cee053939..000000000 --- a/app/Filament/Submission/Resources/Schema/StudioForm.php +++ /dev/null @@ -1,37 +0,0 @@ -components([ - TextInput::make(SubmissionStudio::ATTRIBUTE_NAME) - ->label(__('filament.fields.studio.name.name')) - ->helperText(__('filament.fields.studio.name.help')) - ->required() - ->maxLength(192) - ->afterStateUpdatedJs(<<<'JS' - $set('slug', slug($state ?? '')); - JS), - - TextInput::make(SubmissionStudio::ATTRIBUTE_SLUG) - ->label(__('filament.fields.studio.slug.name')) - ->helperText(__('filament.fields.studio.slug.help')) - ->required() - ->alphaDash() - ->maxLength(192) - ->unique(Studio::TABLE, Studio::ATTRIBUTE_SLUG), - ]) - ->columns(1); - } -} diff --git a/app/Filament/Submission/Resources/Schema/SynonymForm.php b/app/Filament/Submission/Resources/Schema/SynonymForm.php deleted file mode 100644 index 6f2517aff..000000000 --- a/app/Filament/Submission/Resources/Schema/SynonymForm.php +++ /dev/null @@ -1,33 +0,0 @@ -components([ - Select::make(SubmissionSynonym::ATTRIBUTE_TYPE) - ->label(__('filament.fields.synonym.type.name')) - ->helperText(__('filament.fields.synonym.type.help')) - ->options(SynonymType::class) - ->required(), - - TextInput::make(SubmissionSynonym::ATTRIBUTE_TEXT) - ->label(__('filament.fields.synonym.text.name')) - ->helperText(__('filament.fields.synonym.text.help')) - ->required() - ->maxLength(255), - ]) - ->columns(1); - } -} diff --git a/app/Filament/Submission/Resources/Schema/ThemeForm.php b/app/Filament/Submission/Resources/Schema/ThemeForm.php deleted file mode 100644 index cba5ea02a..000000000 --- a/app/Filament/Submission/Resources/Schema/ThemeForm.php +++ /dev/null @@ -1,37 +0,0 @@ -components([ - Select::make(SubmissionAnimeTheme::ATTRIBUTE_TYPE) - ->label(__('filament.fields.anime_theme.type.name')) - ->helperText(__('filament.fields.anime_theme.type.help')) - ->options(ThemeType::class) - ->required(), - - TextInput::make(SubmissionAnimeTheme::ATTRIBUTE_SEQUENCE) - ->label(__('filament.fields.anime_theme.sequence.name')) - ->helperText(__('filament.fields.anime_theme.sequence.help')) - ->integer(), - - Select::make(SubmissionAnimeTheme::ATTRIBUTE_GROUP) - ->label(__('filament.resources.singularLabel.group')) - ->useScout($schema->getLivewire(), Group::class), - ]) - ->columns(1); - } -} diff --git a/app/GraphQL/Queries/SearchQuery.php b/app/GraphQL/Queries/SearchQuery.php index 8ca8c7042..f5850b5a2 100644 --- a/app/GraphQL/Queries/SearchQuery.php +++ b/app/GraphQL/Queries/SearchQuery.php @@ -84,6 +84,7 @@ class SearchQuery $page, ); - return collect($searchBuilder->items()); + return collect($searchBuilder->items()) + ->when(is_numeric($term), fn (Collection $collection) => $collection->merge($modelClass::query()->whereKey($term)->get())); } } diff --git a/app/Models/Auth/User.php b/app/Models/Auth/User.php index 8c93cf168..e872903ad 100644 --- a/app/Models/Auth/User.php +++ b/app/Models/Auth/User.php @@ -49,13 +49,13 @@ use OwenIt\Auditing\Contracts\Auditable; use Spatie\Permission\Traits\HasRoles; /** + * @property Collection $assignedSubmissions * @property Carbon $created_at * @property string $email * @property Carbon|null $email_verified_at * @property Collection $externalprofiles * @property int $id * @property Collection $likes - * @property Collection $managedSubmissions * @property string $name * @property string $password * @property Collection $playlists @@ -100,9 +100,9 @@ class User extends Authenticatable implements Auditable, FilamentUser, HasAvatar final public const string ATTRIBUTE_TWO_FACTOR_RECOVERY_CODES = 'two_factor_recovery_codes'; final public const string ATTRIBUTE_TWO_FACTOR_SECRET = 'two_factor_secret'; + final public const string RELATION_ASSIGNED_SUBMISSIONS = 'assignedSubmissions'; final public const string RELATION_EXTERNAL_PROFILES = 'externalprofiles'; final public const string RELATION_LIKES = 'likes'; - final public const string RELATION_MANAGED_SUBMISSIONS = 'managedSubmissions'; final public const string RELATION_NOTIFICATIONS = 'notifications'; final public const string RELATION_PERMISSIONS = 'permissions'; final public const string RELATION_PROHIBITIONS = 'prohibitions'; @@ -170,10 +170,6 @@ class User extends Authenticatable implements Auditable, FilamentUser, HasAvatar */ public function canAccessPanel(Panel $panel): bool { - if ($panel->getId() === 'submission') { - return $this->hasAnyPermission(SpecialPermission::MAKE_SUBMISSION->value); - } - if ($this->hasVerifiedEmail() && $this->hasAnyPermission(SpecialPermission::VIEW_FILAMENT->value)) { return true; } @@ -223,7 +219,7 @@ class User extends Authenticatable implements Auditable, FilamentUser, HasAvatar /** * Get the submissions that the admin managed. */ - public function managedSubmissions(): HasMany + public function assignedSubmissions(): HasMany { return $this->hasMany(Submission::class, Submission::ATTRIBUTE_ASSIGNEE); } diff --git a/app/Providers/Filament/SubmissionPanelProvider.php b/app/Providers/Filament/SubmissionPanelProvider.php deleted file mode 100644 index 01939812a..000000000 --- a/app/Providers/Filament/SubmissionPanelProvider.php +++ /dev/null @@ -1,55 +0,0 @@ -id(Config::get('filament.submission.path')) - ->path(Config::get('filament.submission.path')) - ->domain(Config::get('filament.submission.domain')) - ->login() - ->maxContentWidth(Width::Full) - ->globalSearch(false) - ->colors([ - 'primary' => Color::Violet, - ]) - ->discoverResources(in: app_path('Filament/Submission/Resources'), for: 'App\Filament\Submission\Resources') - ->discoverPages(in: app_path('Filament/Submission/Pages'), for: 'App\Filament\Submission\Pages') - ->discoverWidgets(in: app_path('Filament/Submission/Widgets'), for: 'App\Filament\Submission\Widgets') - ->middleware([ - EncryptCookies::class, - AddQueuedCookiesToResponse::class, - StartSession::class, - AuthenticateSession::class, - ShareErrorsFromSession::class, - PreventRequestForgery::class, - SubstituteBindings::class, - DisableBladeIconComponents::class, - DispatchServingFilamentEvent::class, - ]) - ->authMiddleware([ - Authenticate::class, - ]); - } -} diff --git a/config/app.php b/config/app.php index 5245094b2..1267dfb14 100644 --- a/config/app.php +++ b/config/app.php @@ -232,7 +232,6 @@ return [ App\Providers\GraphQLServiceProvider::class, App\Providers\HorizonServiceProvider::class, App\Providers\PulseServiceProvider::class, - App\Providers\Filament\SubmissionPanelProvider::class, App\Providers\RouteServiceProvider::class, ])->toArray(), diff --git a/config/filament.php b/config/filament.php index b384b32a6..a460427ef 100644 --- a/config/filament.php +++ b/config/filament.php @@ -57,20 +57,6 @@ return [ 'path' => env('FILAMENT_PATH'), - /* - |-------------------------------------------------------------------------- - | Submission - |-------------------------------------------------------------------------- - | - | Submission-related configuration. - | - */ - - 'submission' => [ - 'domain' => env('FILAMENT_SUBMISSION_URL', env('FILAMENT_URL')), - 'path' => env('FILAMENT_SUBMISSION_PATH', ''), - ], - /* |-------------------------------------------------------------------------- | Default Filesystem Disk diff --git a/config/scout.php b/config/scout.php index 4f41ae356..86fdfe315 100644 --- a/config/scout.php +++ b/config/scout.php @@ -274,6 +274,7 @@ return [ ], 'search-parameters' => [ 'query_by' => 'name,synonyms', + 'query_by_weights' => '8,5', ], ], AnimeTheme::class => [ diff --git a/lang/en/filament.php b/lang/en/filament.php index 646928e50..35274c894 100644 --- a/lang/en/filament.php +++ b/lang/en/filament.php @@ -871,14 +871,6 @@ return [ 'prohibition' => [ 'name' => 'Name', ], - 'submission' => [ - 'finished_at' => 'Finished At', - 'locked' => 'Locked', - 'moderator' => 'Moderator', - 'moderator_notes' => 'Moderator Notes', - 'notes' => 'Notes', - 'status' => 'Status', - ], 'synonym' => [ 'text' => [ 'help' => 'For alternative titles, licensed titles, common abbreviations and/or shortenings.', @@ -1039,7 +1031,6 @@ return [ 'playlist_tracks' => 'Playlist Tracks', 'playlists' => 'Playlists', 'prohibitions' => 'Prohibitions', - 'submissions' => 'Submissions', 'roles' => 'Roles', 'sanctions' => 'Sanctions', 'series' => 'Series', @@ -1076,7 +1067,6 @@ return [ 'playlist' => 'Playlist', 'prohibition' => 'Prohibition', 'sanction' => 'Sanction', - 'submission' => 'Submission', 'role' => 'Role', 'series' => 'Series', 'song' => 'Song', diff --git a/lang/en/submissions.php b/lang/en/submissions.php deleted file mode 100644 index f54bbfbde..000000000 --- a/lang/en/submissions.php +++ /dev/null @@ -1,31 +0,0 @@ - [ - 'submit' => 'Submit', - 'submit_another' => 'Submit & Submit another', - ], - 'fields' => [ - 'base' => [ - 'source' => [ - 'help' => 'Add any relevant notes or sources that support this submission.', - 'name' => 'Sources', - ], - ], - 'submission' => [ - 'name' => 'Name', - 'finished_at' => 'Finished At', - 'status' => 'Status', - ], - ], - 'resources' => [ - 'label' => [ - 'anime' => 'Anime Submissions', - ], - 'singularLabel' => [ - 'anime' => 'Anime Submission', - ], - ], -];