problème avec filtre avec vue Js

dani03 @dani03 551 XP a posé dans
Résolu

Bonjour a tous j'essaie de filtrer les elements aux click selon une proprieté sauf qu'il ne filtre pas vraiment

<div class="btn-group" role="group" aria-label="Basic example">
<button @click="filterUsers('Complet')" type="button" class="btn btn-outline-success">Complet</button>
<button @click="filterUsers('Incomplet')" type="button" class="btn btn-outline-warning">Incomplet</button>
<button @click="filterUsers('En attente')" type="button" class="btn btn-outline-secondary">En attente</button>
</div>

et sur la boucle :

<tr v-for="user in filterrdUsers" :key="user.id">
<td> <a> {{ user.lastname }} {{ user.firstname }}</a>
</td>
</tr>

et le vue js :

Vue.createApp({
data() {
return {
//les proprietés
users: <?php echo json_encode($users) ?>,
totalNumbersDocuments: <?php echo json_encode($totalNumbersDocuments) ?>,
filter: ''
}
},
computed: {
filteredUsers() {
if (this.filter) {
 
//recuperation de tout les utilisateurs avec le status correspondant
 
this.users = this.users.filter(user => this.documentListCompleted(user.nombre_documents,
this.totalNumbersDocuments).text === this.filter);
}
return this.users;
},
},
// les methode qu'on souhaite appeler après un click ou une action
methods: {
// on change le status du filtre
filterUsers(status) {
this.filter = status;
 
},
 
 
 
 
documentListCompleted(nombreDocumentUser, nombreDocumentTotal) {
let completedStatus = {};
 
if (nombreDocumentUser !== 0 && nombreDocumentUser < nombreDocumentTotal) {
completedStatus.text = "Incomplet";
completedStatus.icon = '<i class="fa-regular fa-hourglass-half"></i>';
completedStatus.color = "btn-warning";
return completedStatus
} else if (nombreDocumentUser === nombreDocumentTotal) {
completedStatus.text = "Complet";
completedStatus.icon = '<i class="fa-solid fa-check"></i>';
completedStatus.color = "btn-success";
return completedStatus
} else if (nombreDocumentUser === 0) {
completedStatus.text = "En attente";
completedStatus.icon = '<i class="fa-regular fa-hourglass-half"></i>';
completedStatus.color = "btn-outline-secondary";
return completedStatus
}
 
},
 
},
 
watch: {
//pour surveiller une propriete le nom de la fonction doit être le meme que celui de la
//proprieté
users() {
console.log("user changed")
 
},
 
},
 
}).mount("#userListDocuments")

si quelqu'un a une solution svp

  • Salut @dani03

    Je vois qu'ici tu a mail écris le nom de ta fonction

    // retire filterrdUsers et remplace par filteredUsers
    <tr v-for="user in filteredUsers" :key="user.id">
    <td>
    <a> {{ user.lastname }} {{ user.firstname }}</a>
    </td>
    </tr>
  • dani03
    dani @dani03

    salut @stevymarlino oui j'ai modifié mais je n'arrive toujours pas a filtré lorsque je change le contenu de ma propriétié users

  • Réponse acceptée
    computed: {
    filteredUsers() {
    if (this.filter) {
    //recuperation de tout les utilisateurs avec le status correspondant
    return this.users.filter(user => {
    let status = this.documentListCompleted(user.nombre_documents, this.totalNumbersDocuments);
    return status.text === this.filter;
    });
    }
    return this.users;
    }
    },

    modifie ta fonction filteredUsers pour que ça retourne un nouveau tableau filtré, en lieu et place de muté this.users

  • dani03
    dani @dani03

    j'ai modifié comme tu as dis @stevymarlino mais maintenant mon tableau ne se met pas à jour j'ai ajouté une proprieté mais elle n'a pas trop d'incidence je filtre bien Capture d’écran 2024-06-18 à 11.38.51.png

    // vue pour les status complet imcomplet
    Vue.createApp({
    data() {
    return {
    //les propriétés
    originalUsers: <?php echo json_encode($users) ?>, // Liste originale des utilisateurs
    users: <?php echo json_encode($users) ?>, // Liste d'utilisateurs à afficher
    totalNumbersDocuments: <?php echo json_encode($totalNumbersDocuments) ?>,
    filter: ''
    }
    },
    watch: {
    filter(newFilter) {
    // Appliquer le filtre et mettre à jour la liste des utilisateurs à afficher
    console.log(this.filter, this.filteredUsers)
    this.users = this.filteredUsers;
    }
    },
    computed: {
    filteredUsers() {
    if (this.filter) {
    // Récupération de tous les utilisateurs avec le status correspondant
    return this.originalUsers.filter(user => {
    let status = this.documentListCompleted(user.nombre_documents, this.totalNumbersDocuments);
    return status.text === this.filter;
    });
     
    }
    return this.originalUsers;
    }
    },
    methods: {
    filterUsers(status) {
    this.filter = status;
    // Mettre à jour la liste des utilisateurs à afficher en fonction du filtre
    let usersFiltrer = this.filteredUsers;
     
    this.users = usersFiltrer;
    },
    documentListCompleted(nombreDocumentUser, nombreDocumentTotal) {
    if (nombreDocumentUser === 0) {
    return {
    text: "En attente",
    icon: '<i class="fa-regular fa-hourglass-half"></i>',
    color: "btn-outline-secondary"
    };
    } else if (nombreDocumentUser === nombreDocumentTotal) {
    return {
    text: "Complet",
    icon: '<i class="fa-solid fa-check"></i>',
    color: "btn-success"
    };
    } else {
    return {
    text: "Incomplet",
    icon: '<i class="fa-regular fa-hourglass-half"></i>',
    color: "btn-warning"
    };
    }
    }
    },
    mounted() {
    console.log(this.users);
    }
    }).mount("#userListDocuments");

    ma boucle j'utilise users ici et pas filteredUsers parce que je mets a jour dans le watcher ma propriete users . je ne sais pas si c'est la bonne méthode de faire

    <tr v-for="user in users" :key="user.id">
    <td> <a> {{ user.lastname }} {{ user.firstname }}</a>
    </td>
     
    <td> <span>{{ user.email }}</span></td>
     
    <td> <span>{{ user.nombre_documents }} sur <?= $totalNumbersDocuments ?> documents</span> </td>
     
    <td>
    <!-- on utlise la methode documentListCompleted de notre methode en bas de page en vue Js -->
    <span class="btn btn-sm" :class="documentListCompleted(user.nombre_documents, totalNumbersDocuments).color">
    <span v-html="documentListCompleted(user.nombre_documents, totalNumbersDocuments).icon"></span>
    <span> {{ documentListCompleted(user.nombre_documents, totalNumbersDocuments).text }} </span>
    </span>
     
    </td>
     
    <td>
    <a :href="'<?= site_url("document-user/") ?>'+user['slug-name']" class="btn btn-sm btn-outline-primary"><i class=" me-1 fa-regular fa-eye"></i> Consulter les documents</a>
     
    </td>
     
    </tr>

    mais je reussis à filtrer sauf que l'affichage ne se met pas à jour et j'ai une erreur après le 2eme click Capture d’écran 2024-06-18 à 11.48.31.png

  • dani03
    dani @dani03

    ça fonctionne c'est une problème avec mon DOM qui fait juste cette erreur

  • super alors bao.

Veuillez vous connecter ou créer un compte pour participer à cette conversation.