I have a movie collection. I added a “search” box to filter results based on different criteria.
Here is part of the code based on a Corvid tutorial (thanks!) and using The Movie Database API:
import {getMoviePoster, getGenresList} from 'backend/tmdbModule';
import wixData from 'wix-data';
let lastFilterTitle;
let lastFilterRating;
let lastFilterRuntime;
let lastFilterDateBefore;
let lastFilterDateAfter;
let lastFilterTag;
let debounceTimer;
$w.onReady(function () {
initComp();
});
function initComp() {
$w("#listRepeater").onItemReady( ($item, itemData, index) => {
const poster = $item("#Poster");
const ratings = $item("#ratingDisplay");
// Displays 5-star rating underneath each poster
if(!itemData.rating) {
ratings.hide();
$item("#nostars").show();
} else {
ratings.rating = itemData.rating / 2;
}
// Gets posters from TMDB
getMoviePoster(itemData.title)
.then(poster_path => {
poster.src = "https://image.tmdb.org/t/p/w300" + poster_path;
poster.fitMode = "fixedWidth";
poster.show();
})
});
// Populates genres selection tags
getGenresList()
.then(list => {
let options = list.genres.map(function(row) {
return { value : row.id.toString(), label : row.name }
})
$w('#genresTags').options = options;
})
}
function filter(title, rating, runtime, datebefore, dateafter, tags) {
if (lastFilterTitle !== title || lastFilterRating !== rating || lastFilterRuntime !== runtime || lastFilterDateBefore !== datebefore || lastFilterDateAfter !== dateafter || lastFilterTag !== tags) {
let newFilter = wixData.filter();
if (title)
newFilter = newFilter.contains('originalTitle', title);
if (rating)
newFilter = newFilter.ge('rating', rating);
if (runtime)
newFilter = newFilter.le('runtime', runtime);
if (datebefore)
newFilter = newFilter.ge('releaseDate', datebefore);
if (dateafter)
newFilter = newFilter.le('releaseDate', dateafter);
if (tags)
newFilter = newFilter.hasSome('genres', tags);
$w('#moviesDataset').setFilter(newFilter);
lastFilterTitle = title;
lastFilterRating = rating;
lastFilterRuntime = runtime;
lastFilterDateBefore = datebefore;
lastFilterDateAfter = dateafter;
lastFilterTag = tags;
}
}
The rest of the code just calls the filter function for each input element’s onChange event. Example:
export function genresTags_change(event) {
filter(lastFilterTitle, lastFilterRating, lastFilterRuntime, lastFilterDateBefore, lastFilterDateAfter, $w('#genresTags').value);
}
Everything is working EXCEPT the selection tags. When I select one genre, nothing shows. Every movie has at least one genre. The genres field is of course an array. Here’s an example:
[
{
"id": 28,
"name": "Action"
},
{
"id": 53,
"name": "Thriller"
}
]
What am I doing wrong??