Aller au contenu

Filtres et recherche

Dans le store pinia, ajoutez un objet filtesqui contient vos critères de recherche et filtres parmis les mémoires affichés dans la salle.

Ajoutez le getters nommé filteredMemories qui vous permettra d'afficher les mémoires filtrées et/celles qui correspondent à la recherche en temps réel (donc vous allez faire un v-forsur filteredMemories pour dynamiser votre affichage).

stores/memoryStore.js

export const useMemoryStore = defineStore('memory', {
    state: () => ({
        rooms: [],
        memories: [],

        filters: {
            searchQuery: '',      // Recherche textuelle
            selectedTags: [],     // Tags sélectionnés
            dateOrder: null,      // Odre plus récent ou plus ancien en premier
            selectedRoomId: null  // Salle sélectionnée (optionnel)
        }
    }),

    getters: {
        // Mémoires filtrées selon tous les critères
        filteredMemories: (state) => {

            // ========================================
            // Filtrer par recherche textuelle
            // ========================================

            // Vérifier si une recherche textuelle a été saisie
            // trim() enlève les espaces au début et à la fin
            if (state.filters.searchQuery.trim()) {

                // Convertir la recherche en minuscules pour une recherche insensible à la casse
                const query = state.filters.searchQuery.toLowerCase();

                // Filtrer le tableau de mémoires
                memories = memories.filter(function(memory) {

                    // Convertir le titre en minuscules
                    const titleInLowerCase = memory.title.toLowerCase();

                    // Convertir la description en minuscules
                    const descriptionInLowerCase = memory.description.toLowerCase();

                    // Vérifier si le titre contient la recherche
                    const titleContainsQuery = titleInLowerCase.includes(query);

                    // Vérifier si la description contient la recherche
                    const descriptionContainsQuery = descriptionInLowerCase.includes(query);

                    // Garder la mémoire SI :
                    // - le titre contient la recherche OU
                    // - la description contient la recherche
                    return titleContainsQuery || descriptionContainsQuery;
                });
            }


            // ========================================
            // Filtrer par tags
            // ========================================

            // Vérifier si des tags ont été sélectionnés
            if (state.filters.selectedTags.length > 0) {

                // Filtrer le tableau de mémoires
                memories = memories.filter(function(memory) {

                    // Pour chaque mémoire, vérifier si elle possède AU MOINS UN des tags sélectionnés
                    // some() retourne true si AU MOINS UN élément satisfait la condition
                    const hasAtLeastOneSelectedTag = state.filters.selectedTags.some(function(selectedTag) {

                    // Vérifier si le tag sélectionné est dans les tags de la mémoire
                    // includes() retourne true si l'élément est trouvé
                    const memoryHasThisTag = memory.tags.includes(selectedTag);

                    return memoryHasThisTag;
                    });

                    // Garder la mémoire SI elle a au moins un des tags sélectionnés
                    return hasAtLeastOneSelectedTag;
                });
            }

            // ========================================
            // Trier les résultats par date
            // ========================================

            // Trier le tableau par date décroissante (plus récent en premier)
            memories.sort(function(memoryA, memoryB) {

                // Convertir les chaînes de dates en objets Date
                const dateA = new Date(memoryA.date);
                const dateB = new Date(memoryB.date);

                // Soustraire les dates selon l'ordre choisi
                // Si le résultat est positif : B sera placé avant A
                // Si le résultat est négatif : A sera placé avant B
                // Si le résultat est 0 : les dates sont égales (ordre inchangé)

                if (state.filters.dateOrder=="asc"){
                    // ASCENDANT : Du plus ancien au plus récent
                    // dateA - dateB : si dateA < dateB → résultat négatif → A avant B ✅
                    return dateA - dateB;
                }else {
                    // DESCENDANT : Du plus récent au plus ancien
                    // dateB - dateA : si dateB > dateA → résultat positif → B avant A ✅
                    return dateB - dateA;
                }
            });


            // ========================================
            // Retourner le résultat final
            // ========================================

            // Retourner le tableau de mémoires après tous les filtres et le tri
            return memories;
        }
    },


    actions: {
        // Mettre à jour la recherche textuelle
        setSearchQuery(query) {
            this.filters.searchQuery = query;
        },

        // Ajouter/retirer un tag des filtres
        toggleTag(tag) {
            const index = this.filters.selectedTags.indexOf(tag);
            if (index > -1) {
                this.filters.selectedTags.splice(index, 1);
            } else {
                this.filters.selectedTags.push(tag);
            }
        },

        // Action pour définir l'ordre de tri par date
        setDateOrder(order) {

            if (order === 'asc' || order === 'desc') {
                this.filters.dateOrder = order;
            } else {
                console.warn('Ordre invalide. Utilisez "asc" ou "desc".');
            }
        },

   }
});