This repository has been archived on 2021-09-06. You can view files and clone it, but cannot push or open issues or pull requests.
vuejs_course/2021-09-04_composition-13-d.../src/components/users/UserList.vue

91 lines
2.0 KiB
Vue

<template>
<base-container>
<h2>Active Users</h2>
<base-search @search="updateSearch" :search-term="enteredSearchTerm"></base-search>
<div>
<button @click="sort('asc')" :class="{selected: sorting === 'asc'}">Sort Ascending</button>
<button @click="sort('desc')" :class="{selected: sorting === 'desc'}">Sort Descending</button>
</div>
<ul>
<user-item
v-for="user in displayedUsers"
:key="user.id"
:user-name="user.fullName"
:id="user.id"
@list-projects="$emit('list-projects', $event)"
></user-item>
</ul>
</base-container>
</template>
<script>
import UserItem from './UserItem.vue';
export default {
components: {
UserItem,
},
props: ['users'],
data() {
return {
enteredSearchTerm: '',
activeSearchTerm: '',
sorting: null,
};
},
computed: {
availableUsers() {
let users = [];
if (this.activeSearchTerm) {
users = this.users.filter((usr) =>
usr.fullName.includes(this.activeSearchTerm)
);
} else if (this.users) {
users = this.users;
}
return users;
},
displayedUsers() {
if (!this.sorting) {
return this.availableUsers;
}
return this.availableUsers.slice().sort((u1, u2) => {
if (this.sorting === 'asc' && u1.fullName > u2.fullName) {
return 1;
} else if (this.sorting === 'asc') {
return -1;
} else if (this.sorting === 'desc' && u1.fullName > u2.fullName) {
return -1;
} else {
return 1;
}
});
},
},
methods: {
updateSearch(val) {
this.enteredSearchTerm = val;
},
sort(mode) {
this.sorting = mode;
},
},
watch: {
enteredSearchTerm(val) {
setTimeout(() => {
if (val === this.enteredSearchTerm) {
this.activeSearchTerm = val;
}
}, 300);
}
},
};
</script>
<style scoped>
ul {
list-style: none;
margin: 0;
padding: 0;
}
</style>