From 18a165fc404668f964f22561f93f989fb33b3cd8 Mon Sep 17 00:00:00 2001 From: Brock H Caldwell Date: Sat, 26 Jul 2025 15:46:43 -0500 Subject: [PATCH] wip: filter uses form object --- .../controllers/result_filter_controller.js | 4 +- src/Twig/Components/Filter.php | 10 ++ .../Form/UserMediaPreferencesForm.php | 15 +- templates/components/Filter.html.twig | 150 ++++-------------- templates/user/preferences.html.twig | 26 ++- 5 files changed, 76 insertions(+), 129 deletions(-) diff --git a/assets/controllers/result_filter_controller.js b/assets/controllers/result_filter_controller.js index 5bff603..0e00634 100644 --- a/assets/controllers/result_filter_controller.js +++ b/assets/controllers/result_filter_controller.js @@ -67,7 +67,7 @@ export default class extends Controller { this.languages.push(language); } }); - const preferred = JSON.parse(this.languageTarget.dataset.preferred); + const preferred = JSON.parse(this.languageTarget.dataset.preferred) ?? []; this.languageTarget.innerHTML = this.#serializeSelectOptions(this.languages); this.languageTarget.tomselect.items = preferred; } @@ -76,7 +76,7 @@ export default class extends Controller { if (!this.providers.includes(option.provider)) { this.providers.push(option.provider); } - const preferred = JSON.parse(this.providerTarget.dataset.preferred); + const preferred = JSON.parse(this.providerTarget.dataset.preferred) ?? []; this.providerTarget.innerHTML = this.#serializeSelectOptions(this.providers); this.providerTarget.tomselect.items = preferred; diff --git a/src/Twig/Components/Filter.php b/src/Twig/Components/Filter.php index 8a50910..8c85cf9 100644 --- a/src/Twig/Components/Filter.php +++ b/src/Twig/Components/Filter.php @@ -9,16 +9,21 @@ use App\User\Database\ResolutionList; use App\User\Dto\PreferenceOptions; use App\User\Dto\PreferenceOptionsFactory; use App\User\Dto\UserPreferencesFactory; +use App\User\Framework\Form\UserMediaPreferencesForm; use App\User\Framework\Repository\PreferencesRepository; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\SecurityBundle\Security; +use Symfony\Component\Form\FormInterface; use Symfony\UX\LiveComponent\Attribute\AsLiveComponent; +use Symfony\UX\LiveComponent\ComponentWithFormTrait; use Symfony\UX\LiveComponent\DefaultActionTrait; +use Symfony\UX\TwigComponent\Attribute\AsTwigComponent; #[AsLiveComponent] final class Filter extends AbstractController { use DefaultActionTrait; + use ComponentWithFormTrait; public array $preferences = []; @@ -43,4 +48,9 @@ final class Filter extends AbstractController { return CodecList::asSelectOptions(); } + + protected function instantiateForm(): FormInterface + { + return $this->createForm(UserMediaPreferencesForm::class, UserPreferencesFactory::createFromUser($this->getUser())); + } } diff --git a/src/User/Framework/Form/UserMediaPreferencesForm.php b/src/User/Framework/Form/UserMediaPreferencesForm.php index 694e326..e560c76 100644 --- a/src/User/Framework/Form/UserMediaPreferencesForm.php +++ b/src/User/Framework/Form/UserMediaPreferencesForm.php @@ -37,8 +37,16 @@ class UserMediaPreferencesForm extends AbstractType private function addChoiceField(FormBuilderInterface $builder, string $fieldName, array $choices): void { $question = [ - 'attr' => ['class' => 'w-64 text-input mb-4'], - 'label_attr' => ['class' => 'w-64 text-white block font-semibold mb-2'], + 'attr' => [ + 'class' => 'min-w-24 text-input mb-4', + 'data-result-filter-target' => $fieldName, + 'data-controller' => 'symfony--ux-autocomplete--autocomplete', + 'data-symfony--ux-autocomplete--autocomplete-tom-select-options-value' => '{"highlight":false}', + ], + 'row_attr' => [ + 'class' => 'filter-label' + ], + 'label_attr' => ['class' => 'text-white block font-semibold mb-2'], 'choices' => $this->addDefaultChoice($choices), 'required' => false, 'multiple' => true, @@ -50,6 +58,9 @@ class UserMediaPreferencesForm extends AbstractType { $resolver->setDefaults([ 'action' => $this->urlGenerator->generate('app_user_media_preferences_submit'), + 'attr' => [ + 'class' => 'filter-items w-full p-4 bg-black/20 border-2 border-orange-500 text-md text-gray-500 dark:text-gray-50 rounded-lg', + ] ]); } diff --git a/templates/components/Filter.html.twig b/templates/components/Filter.html.twig index 1c857f5..dec37a9 100644 --- a/templates/components/Filter.html.twig +++ b/templates/components/Filter.html.twig @@ -6,126 +6,42 @@ data-result-filter-tv-episode-list-outlet=".episode-list" data-action="change->result-filter#filter action-button:downloadSeason@window->result-filter#downloadSeason" > -
- + {% set preferences_form = form %} + {{ form_start(preferences_form) }} +
+ {{ form_row(preferences_form.resolution) }} + {{ form_row(preferences_form.codec) }} + {{ form_row(preferences_form.language) }} + {{ form_row(preferences_form.provider) }} + {{ form_row(preferences_form.quality) }} - + {% if results.media.mediaType == "tvshows" %} +
+ + +
+ {% endif %} +
- - - - - - - {% if results.media.mediaType == "tvshows" %} - - {% endif %} - - - -
+ + + {{ form_end(preferences_form) }} + {% if results.media.mediaType == "tvshows" %}
diff --git a/templates/user/preferences.html.twig b/templates/user/preferences.html.twig index f649905..cb9d624 100644 --- a/templates/user/preferences.html.twig +++ b/templates/user/preferences.html.twig @@ -6,16 +6,26 @@

Define a filter to be pre-applied to your download options.

- {{ form_start(preferences_form) }} - {{ form_row(preferences_form.language) }} - {{ form_row(preferences_form.quality) }} - {{ form_row(preferences_form.provider) }} - {{ form_row(preferences_form.resolution) }} - {{ form_row(preferences_form.codec) }} - - {{ form_end(preferences_form) }} +
+ {{ form_start(preferences_form.instantiateForm) }} +
+ {{ form_row(preferences_form.resolution) }} + {{ form_row(preferences_form.codec) }} + {{ form_row(preferences_form.language) }} + {{ form_row(preferences_form.provider) }} + {{ form_row(preferences_form.quality) }} +
+
+
+ +
+
+ {{ form_end(preferences_form) }} +
+
+

Change how your downloads are stored.