mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-18 15:17:25 +01:00
Party roster sorter: Member Modal Component (#9472)
* modify sort options for party members * add unittest for membersModalComponent sort * updates as requested in PR * removed duplicates for `class` and `background` from flavour text * fix linting error thrown by travis ci
This commit is contained in:
31
test/client/unit/specs/components/groups/membersModal.js
Normal file
31
test/client/unit/specs/components/groups/membersModal.js
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import Vue from 'vue';
|
||||||
|
import MembersModalComponent from 'client/components/groups/membersModal.vue';
|
||||||
|
|
||||||
|
describe('Members Modal Component', () => {
|
||||||
|
describe('Party Sort', () => {
|
||||||
|
let CTor;
|
||||||
|
let vm;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
CTor = Vue.extend(MembersModalComponent);
|
||||||
|
vm = new CTor().$mount();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
vm.$destroy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have an empty object as sort-option at start', () => {
|
||||||
|
const defaultData = vm.data();
|
||||||
|
expect(defaultData.sortOption).to.eq({});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should accept sort-option object', () => {
|
||||||
|
const sortOption = vm.data().sortOption[0];
|
||||||
|
vm.sort(sortOption);
|
||||||
|
Vue.nextTick(() => {
|
||||||
|
expect(vm.data().sortOption).to.eq(sortOption);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -16,7 +16,7 @@ div
|
|||||||
.col-5.offset-1
|
.col-5.offset-1
|
||||||
span.dropdown-label {{ $t('sortBy') }}
|
span.dropdown-label {{ $t('sortBy') }}
|
||||||
b-dropdown(:text="$t('sort')", right=true)
|
b-dropdown(:text="$t('sort')", right=true)
|
||||||
b-dropdown-item(v-for='sortOption in sortOptions', @click='sort(sortOption.value)', :key='sortOption.value') {{sortOption.text}}
|
b-dropdown-item(v-for='sortOption in sortOptions', @click='sort(sortOption)', :key='sortOption.value') {{sortOption.text}}
|
||||||
.row(v-if='invites.length > 0')
|
.row(v-if='invites.length > 0')
|
||||||
.col-6.offset-3.nav
|
.col-6.offset-3.nav
|
||||||
.nav-item(@click='viewMembers()', :class="{active: selectedPage === 'members'}") {{ $t('members') }}
|
.nav-item(@click='viewMembers()', :class="{active: selectedPage === 'members'}") {{ $t('members') }}
|
||||||
@@ -172,7 +172,9 @@ div
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import sortBy from 'lodash/sortBy';
|
// import sortBy from "lodash/sortBy";
|
||||||
|
import orderBy from 'lodash/orderBy';
|
||||||
|
import isEmpty from 'lodash/isEmpty';
|
||||||
import { mapState } from 'client/libs/store';
|
import { mapState } from 'client/libs/store';
|
||||||
|
|
||||||
import removeMemberModal from 'client/components/members/removeMemberModal';
|
import removeMemberModal from 'client/components/members/removeMemberModal';
|
||||||
@@ -190,27 +192,83 @@ export default {
|
|||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
sortOption: '',
|
sortOption: {},
|
||||||
selectedPage: 'members',
|
selectedPage: 'members',
|
||||||
members: [],
|
members: [],
|
||||||
invites: [],
|
invites: [],
|
||||||
memberToRemove: {},
|
memberToRemove: {},
|
||||||
sortOptions: [
|
sortOptions: [
|
||||||
{
|
|
||||||
value: 'level',
|
|
||||||
text: this.$t('tier'),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'name',
|
|
||||||
text: this.$t('name'),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'lvl',
|
|
||||||
text: this.$t('level'),
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
value: 'class',
|
value: 'class',
|
||||||
text: this.$t('class'),
|
text: this.$t('class'),
|
||||||
|
order: 'asc',
|
||||||
|
param: 'stats.class',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'background',
|
||||||
|
text: this.$t('background'),
|
||||||
|
order: 'asc',
|
||||||
|
param: 'preferences.background',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'date-joined-asc',
|
||||||
|
text: this.$t('sortDateJoinedAsc'),
|
||||||
|
order: 'asc',
|
||||||
|
param: 'auth.timestamps.created',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'date-joined-desc',
|
||||||
|
text: this.$t('sortDateJoinedDesc'),
|
||||||
|
order: 'desc',
|
||||||
|
param: 'auth.timestamps.created',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'login-asc',
|
||||||
|
text: this.$t('sortLoginAsc'),
|
||||||
|
order: 'asc',
|
||||||
|
param: 'auth.timestamps.loggedin',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'login-desc',
|
||||||
|
text: this.$t('sortLoginDesc'),
|
||||||
|
order: 'desc',
|
||||||
|
param: 'auth.timestamps.loggedin',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'level-asc',
|
||||||
|
text: this.$t('sortLevelAsc'),
|
||||||
|
order: 'asc',
|
||||||
|
param: 'stats.lvl',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'level-desc',
|
||||||
|
text: this.$t('sortLevelDesc'),
|
||||||
|
order: 'desc',
|
||||||
|
param: 'stats.lvl',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'name-asc',
|
||||||
|
text: this.$t('sortNameAsc'),
|
||||||
|
order: 'asc',
|
||||||
|
param: 'profile.name',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'name-desc',
|
||||||
|
text: this.$t('sortNameDesc'),
|
||||||
|
order: 'desc',
|
||||||
|
param: 'profile.name',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'tier-asc',
|
||||||
|
text: this.$t('sortTierAsc'),
|
||||||
|
order: 'asc',
|
||||||
|
param: 'contributor.level',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'tier-desc',
|
||||||
|
text: this.$t('sortTierDesc'),
|
||||||
|
order: 'desc',
|
||||||
|
param: 'contributor.level',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
searchTerm: '',
|
searchTerm: '',
|
||||||
@@ -249,24 +307,18 @@ export default {
|
|||||||
|
|
||||||
if (this.searchTerm) {
|
if (this.searchTerm) {
|
||||||
sortedMembers = sortedMembers.filter(member => {
|
sortedMembers = sortedMembers.filter(member => {
|
||||||
return member.profile.name.toLowerCase().indexOf(this.searchTerm.toLowerCase()) !== -1;
|
return (
|
||||||
|
member.profile.name
|
||||||
|
.toLowerCase()
|
||||||
|
.indexOf(this.searchTerm.toLowerCase()) !== -1
|
||||||
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.sortOption) return sortedMembers;
|
if (!isEmpty(this.sortOption)) {
|
||||||
|
// Use the memberlist filtered by searchTerm
|
||||||
sortedMembers = sortBy(this.members, [(member) => {
|
sortedMembers = orderBy(sortedMembers, [this.sortOption.param], [this.sortOption.order]);
|
||||||
if (this.sortOption === 'tier') {
|
}
|
||||||
if (!member.contributor) return;
|
|
||||||
return member.contributor.level;
|
|
||||||
} else if (this.sortOption === 'name') {
|
|
||||||
return member.profile.name;
|
|
||||||
} else if (this.sortOption === 'lvl') {
|
|
||||||
return member.stats.lvl;
|
|
||||||
} else if (this.sortOption === 'class') {
|
|
||||||
return member.stats.class;
|
|
||||||
}
|
|
||||||
}]);
|
|
||||||
|
|
||||||
return sortedMembers;
|
return sortedMembers;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -102,15 +102,18 @@
|
|||||||
"optionalMessage": "Optional message",
|
"optionalMessage": "Optional message",
|
||||||
"yesRemove": "Yes, remove them",
|
"yesRemove": "Yes, remove them",
|
||||||
"foreverAlone": "Can't like your own message. Don't be that person.",
|
"foreverAlone": "Can't like your own message. Don't be that person.",
|
||||||
"sortLevel": "Sort by level",
|
|
||||||
"sortRandom": "Sort randomly",
|
"sortDateJoinedAsc": "Earliest Date Joined",
|
||||||
"sortPets": "Sort by number of pets",
|
"sortDateJoinedDesc": "Latest Date Joined",
|
||||||
"sortName": "Sort by avatar name",
|
"sortLoginAsc": "Earliest Login",
|
||||||
"sortBackgrounds": "Sort by background",
|
"sortLoginDesc": "Latest Login",
|
||||||
"sortHabitrpgJoined": "Sort by Habitica date joined",
|
"sortLevelAsc": "Lowest Level",
|
||||||
"sortHabitrpgLastLoggedIn": "Sort by last time user logged in",
|
"sortLevelDesc": "Highest Level",
|
||||||
"ascendingSort": "Sort Ascending",
|
"sortNameAsc": "Name (A - Z)",
|
||||||
"descendingSort": "Sort Descending",
|
"sortNameDesc": "Name (Z - A)",
|
||||||
|
"sortTierAsc": "Lowest Tier",
|
||||||
|
"sortTierDesc": "Highest Tier",
|
||||||
|
|
||||||
"confirmGuild": "Create Guild for 4 Gems?",
|
"confirmGuild": "Create Guild for 4 Gems?",
|
||||||
"leaveGroupCha": "Leave Guild challenges and...",
|
"leaveGroupCha": "Leave Guild challenges and...",
|
||||||
"confirm": "Confirm",
|
"confirm": "Confirm",
|
||||||
|
|||||||
Reference in New Issue
Block a user