diff --git a/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js b/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js index 58b6583626..182de5aa30 100644 --- a/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js +++ b/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js @@ -142,4 +142,22 @@ describe('GET /challenges/:challengeId/members', () => { let resIds = res.concat(res2).map(member => member._id); expect(resIds).to.eql(expectedIds.sort()); }); + + it('supports using req.query.search to get search members', async () => { + let group = await generateGroup(user, {type: 'party', name: generateUUID()}); + let challenge = await generateChallenge(user, group); + + let usersToGenerate = []; + for (let i = 0; i < 3; i++) { + usersToGenerate.push(generateUser({challenges: [challenge._id]})); + } + let generatedUsers = await Promise.all(usersToGenerate); + let profileNames = generatedUsers.map(generatedUser => generatedUser.profile.name); + + let firstProfileName = profileNames[0]; + let nameToSearch = firstProfileName.substring(0, 4); + + let response = await user.get(`/challenges/${challenge._id}/members?search=${nameToSearch}`); + expect(response[0].profile.name).to.eql(firstProfileName); + }); }); diff --git a/website/client/app.vue b/website/client/app.vue index 618d65da46..cc02614ec7 100644 --- a/website/client/app.vue +++ b/website/client/app.vue @@ -56,7 +56,8 @@ diff --git a/website/client/components/shops/market/index.vue b/website/client/components/shops/market/index.vue index 674d842f53..a81fe5eb2f 100644 --- a/website/client/components/shops/market/index.vue +++ b/website/client/components/shops/market/index.vue @@ -148,6 +148,7 @@ @click="itemSelected(item)" ) span(slot="popoverContent") + strong(v-if='item.key === "gem" && gemsLeft === 0') {{ $t('maxBuyGems') }} h4.popover-content-title {{ item.text }} template(slot="itemBadge", scope="ctx") @@ -156,6 +157,8 @@ :show="userItems[item.purchaseType][item.key] != 0", :count="userItems[item.purchaseType][item.key] || 0" ) + .gems-left(v-if='item.key === "gem"') + | {{ gemsLeft }} span.badge.badge-pill.badge-item.badge-svg( :class="{'item-selected-badge': ctx.item.pinned, 'hide': !ctx.item.pinned}", @@ -163,6 +166,7 @@ ) span.svg-icon.inline.icon-12.color(v-html="icons.pin") + div.fill-height drawer( @@ -339,6 +343,19 @@ } } + + .gems-left { + position: absolute; + right: -.5em; + top: -.5em; + color: $white; + background: $purple-200; + padding: .15em .55em; + width: 24px; + height: 24px; + border-radius: 50%; + box-shadow: 0 1px 1px 0 rgba($black, 0.12); + } @@ -374,6 +391,7 @@ import getItemInfo from 'common/script/libs/getItemInfo'; import isPinned from 'common/script/libs/isPinned'; import shops from 'common/script/libs/shops'; + import planGemLimits from 'common/script/libs/planGemLimits'; import _filter from 'lodash/filter'; import _sortBy from 'lodash/sortBy'; @@ -553,6 +571,10 @@ export default { }, ]; }, + gemsLeft () { + if (!this.user.purchased.plan) return 0; + return planGemLimits.convCap + this.user.purchased.plan.consecutive.gemCapExtra - this.user.purchased.plan.gemsBought; + }, }, methods: { getClassName (classType) { diff --git a/website/client/components/shops/market/sellModal.vue b/website/client/components/shops/market/sellModal.vue index a26ca32584..b34728f99d 100644 --- a/website/client/components/shops/market/sellModal.vue +++ b/website/client/components/shops/market/sellModal.vue @@ -34,8 +34,6 @@ div.clearfix(slot="modal-footer") span.balance.float-left {{ $t('yourBalance') }} balanceInfo.float-right - -