dani03
dani03 621 XP
a posé

problème avec filtre avec vue Js

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

stevymarlino
a répondu

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
dani03 621 XP
a répondu

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

stevymarlino
a répondu
Meilleure réponse
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
dani03 621 XP
a répondu

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
dani03 621 XP
a répondu

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

stevymarlino
a répondu

super alors bao.

Il faut Se connecter ou Créer un compte pour participer à cette conversation.