63 lines
1.4 KiB
JavaScript
63 lines
1.4 KiB
JavaScript
import { compose, filter, equals, indexBy, partial, prop, pipe } from 'ramda'
|
|
|
|
const search = (query, members) => {
|
|
if (query === '' || query === 'all') {
|
|
return members
|
|
} else {
|
|
const normalizedQuery = query.toLowerCase()
|
|
return members.filter(
|
|
(member) => member.name.toLowerCase().includes(normalizedQuery)
|
|
)
|
|
}
|
|
}
|
|
|
|
const filterByStatus = (status, members) => {
|
|
if (status === '' || status === 'all') {
|
|
return members
|
|
} else {
|
|
return members.filter(
|
|
(member) => member.status === status
|
|
)
|
|
}
|
|
}
|
|
|
|
const filterByRole = (role, rolesByDisplayname, members) => {
|
|
const getRoleNameFromDisplayName = (_role) => rolesByDisplayname[_role].name
|
|
|
|
if (role === '' || role === 'all') {
|
|
return members
|
|
} else {
|
|
return members.filter(
|
|
(member) => getRoleNameFromDisplayName(member.role) === role
|
|
)
|
|
}
|
|
}
|
|
|
|
export default {
|
|
name: 'members-list',
|
|
|
|
props: {
|
|
members: Array,
|
|
choices: Array,
|
|
},
|
|
|
|
data: function () {
|
|
return {
|
|
searchValue: '',
|
|
status: '',
|
|
role: '',
|
|
rolesByDisplayName: indexBy(prop('display_name'), this.choices),
|
|
}
|
|
},
|
|
|
|
computed: {
|
|
searchedList: function () {
|
|
return pipe(
|
|
partial(search, [this.searchValue]),
|
|
partial(filterByStatus, [this.status]),
|
|
partial(filterByRole, [this.role, this.rolesByDisplayName]),
|
|
)(this.members)
|
|
}
|
|
},
|
|
}
|