dani03
dani03 621 XP
asked

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
posted

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
posted

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
posted
Best answer
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
posted

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
posted

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

stevymarlino
posted

super alors bao.

You need Log in or Create an account to join the conversation.