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
-
-