From edce0c576d80872d41cb953f171227de98327e72 Mon Sep 17 00:00:00 2001 From: Brock H Caldwell Date: Tue, 22 Apr 2025 22:55:59 -0500 Subject: [PATCH] wip-feat: season filter --- .../controllers/result_filter_controller.js | 54 ++++++------------- assets/controllers/tv_results_controller.js | 17 ++++++ templates/search/result.html.twig | 19 ++++--- templates/torrentio/tvshows.html.twig | 4 +- 4 files changed, 45 insertions(+), 49 deletions(-) diff --git a/assets/controllers/result_filter_controller.js b/assets/controllers/result_filter_controller.js index 26286ca..92ff17b 100644 --- a/assets/controllers/result_filter_controller.js +++ b/assets/controllers/result_filter_controller.js @@ -14,9 +14,10 @@ export default class extends Controller { seasons = [] static outlets = ['movie-results', 'tv-results'] - static targets = ['resolution', 'codec', 'language', 'provider', 'season', 'episode'] + static targets = ['resolution', 'codec', 'language', 'provider', 'season'] static values = { - 'media-type': String + 'media-type': String, + 'episodes': Array, } async movieResultsOutletConnected(outlet) { @@ -34,8 +35,6 @@ export default class extends Controller { outlet.options.forEach((option) => { this.addLanguages(option, option.dataset); this.addProviders(option, option.dataset); - // this.addSeasons(option, props); - // this.addEpisodes(option, props); }) } @@ -65,32 +64,7 @@ export default class extends Controller { } - addSeasons(option, props) { - if (!this.seasons.includes(parseInt(props['season']))) { - this.seasons.push(parseInt(props['season'])); - } - - this.seasonTarget.innerHTML = ''; - this.seasonTarget.innerHTML += this.seasons.sort((a, b) => a - b) - .filter((season) => parseInt(season)) - .map((season) => '') - .join(''); - this.seasonTarget.querySelectorAll('option')[1].selected = true; - } - - addEpisodes(option, props) { - if (!this.episodes.includes(parseInt(props['episodeNumber']))) { - this.episodes.push(parseInt(props['episodeNumber'])); - } - - this.episodeTarget.innerHTML = this.episodes.sort((a, b) => a - b) - .filter((episode) => parseInt(episode)) - .map((episode) => '') - .join(''); - - } - - filter() { + async filter() { let results = []; this.activeFilter = { "resolution": this.resolutionTarget.value, @@ -107,8 +81,8 @@ export default class extends Controller { } const filterOperation = (resultList) => { - if (resultList.options.length <= 0) { - return false; + if (false === resultList.isActive) { + return; } let firstIncluded = true; @@ -121,12 +95,10 @@ export default class extends Controller { "codec": option.querySelector('#codec').textContent.trim(), "provider": option.querySelector('#provider').textContent.trim(), "languages": JSON.parse(option.dataset['languages']), - // "codec": option.querySelector('#codec').textContent, } let include = true; option.classList.remove('hidden'); - // option.selectInput.checked = false; for (let [key, value] of Object.entries(this.activeFilter)) { if (value === "") { @@ -164,13 +136,17 @@ export default class extends Controller { resultList.countTarget.innerText = count; } }); - // resultList.getOptionCountEl().innerHTML = `${count} options`; - // resultList.getSelectedCountEl().innerHTML = `${selectedCount} selected`; - this.dispatch('setSeason', { - detail: {season: parseInt(this.activeFilter.season)} - }); } + if ("tvshows" === this.mediaTypeValue) { + await results.forEach(async (list) => { + if (list.seasonValue === this.seasonTarget.value) { + await list.setActive(); + } else { + list.setInActive(); + } + }) + } results.forEach((list) => filterOperation(list)); } } diff --git a/assets/controllers/tv_results_controller.js b/assets/controllers/tv_results_controller.js index b2ec0f8..e37e136 100644 --- a/assets/controllers/tv_results_controller.js +++ b/assets/controllers/tv_results_controller.js @@ -18,6 +18,7 @@ export default class extends Controller { static outlets = ['loading-icon'] options = [] + optionsLoaded = false async connect() { await this.setOptions(); @@ -30,11 +31,27 @@ export default class extends Controller { .then(response => { this.element.innerHTML = response; this.options = this.element.querySelectorAll('tbody tr'); + this.optionsLoaded = true; this.loadingIconOutlet.increaseCount(); }); } } + async setActive() { + this.activeValue = true; + this.element.classList.remove('hidden'); + await this.setOptions(); + } + + setInActive() { + this.activeValue = false; + this.element.classList.add('hidden'); + } + + isActive() { + return this.activeValue; + } + toggleList() { this.listTarget.classList.toggle('hidden'); } diff --git a/templates/search/result.html.twig b/templates/search/result.html.twig index 36b805b..d43bf2a 100644 --- a/templates/search/result.html.twig +++ b/templates/search/result.html.twig @@ -72,16 +72,19 @@ {% if results.media.mediaType == "tvshows" %} - +{# #} {% endif %} diff --git a/templates/torrentio/tvshows.html.twig b/templates/torrentio/tvshows.html.twig index 17acb58..92a539e 100644 --- a/templates/torrentio/tvshows.html.twig +++ b/templates/torrentio/tvshows.html.twig @@ -54,7 +54,7 @@ {% for result in results.results %} - + {{ result.size }} @@ -71,7 +71,7 @@ {{ result.provider }} - {{ result.languageFlags }} + {{ result.languageFlags|raw }}