diff --git a/website/client/app.vue b/website/client/app.vue index 8590f4ee7e..07c1ecb1fe 100644 --- a/website/client/app.vue +++ b/website/client/app.vue @@ -147,11 +147,7 @@ export default { // Check for conditions to reset the user auth const invalidUserMessage = [this.$t('invalidCredentials'), 'Missing authentication headers.']; if (invalidUserMessage.indexOf(error.response.data.message) !== -1) { - localStorage.removeItem('habit-mobile-settings'); - localStorage.removeItem('hello'); - this.$store.state.isUserLoggedIn = false; - window.location.href = '/static/home'; - return Promise.reject(error); + this.$store.dispatch('auth:logout'); } // Don't show errors from getting user details. These users have delete their account, diff --git a/website/client/components/achievements/questInvitation.vue b/website/client/components/achievements/questInvitation.vue index f1e5cd0d1e..6ad360c71f 100644 --- a/website/client/components/achievements/questInvitation.vue +++ b/website/client/components/achievements/questInvitation.vue @@ -49,7 +49,6 @@ import bModal from 'bootstrap-vue/lib/components/modal'; import quests from 'common/script/content/quests'; import { mapState } from 'client/libs/store'; -import revive from '../../../common/script/ops/revive'; import percent from '../../../common/script/libs/percent'; import {maxHealth} from '../../../common/script/index'; @@ -73,11 +72,7 @@ export default { }, methods: { close () { - this.$root.$emit('hide::modal', 'death'); - }, - revive () { - // @TODO: Post - revive(this.user); + this.$root.$emit('hide::modal', 'quest-invitation'); }, }, }; diff --git a/website/client/components/appFooter.vue b/website/client/components/appFooter.vue index cbd89a900c..44f073a370 100644 --- a/website/client/components/appFooter.vue +++ b/website/client/components/appFooter.vue @@ -82,7 +82,7 @@ .row .col-4 | © 2017 Habitica. All rights reserved. - // .debug.float-left(v-if="!IS_PRODUCTION && isUserLoaded") + .debug.float-left(v-if="!IS_PRODUCTION && isUserLoaded") button.btn.btn-primary(@click="debugMenuShown = !debugMenuShown") Toggle Debug Menu .debug-group(v-if="debugMenuShown") a.btn.btn-default(@click="setHealthLow()") Health = 1 diff --git a/website/client/components/challenges/challengeDetail.vue b/website/client/components/challenges/challengeDetail.vue index 53d8a7867a..6633be274d 100644 --- a/website/client/components/challenges/challengeDetail.vue +++ b/website/client/components/challenges/challengeDetail.vue @@ -10,7 +10,7 @@ h1(v-markdown='challenge.name') div strong(v-once) {{$t('createdBy')}}: - span {{challenge.leader.profile.name}} + span(v-if='challenge.leader && challenge.leader.profile') {{challenge.leader.profile.name}} // @TODO: make challenge.author a variable inside the createdBy string (helps with RTL languages) // @TODO: Implement in V2 strong.margin-left(v-once) .svg-icon.calendar-icon(v-html="icons.calendarIcon") diff --git a/website/client/components/chat/chatMessages.vue b/website/client/components/chat/chatMessages.vue index 9396e2e809..40532a5e0c 100644 --- a/website/client/components/chat/chatMessages.vue +++ b/website/client/components/chat/chatMessages.vue @@ -36,10 +36,11 @@ .svg-icon(v-html="icons.like") span(v-if='!msg.likes[user._id]') {{ $t('like') }} span(v-if='msg.likes[user._id]') {{ $t('liked') }} - span.action(v-if='!inbox', @click='copyAsTodo(msg)') - .svg-icon(v-html="icons.copy") - | {{$t('copyAsTodo')}} - // @TODO make copyAsTodo work in the inbox + // @TODO make copyAsTodo work in Tavern, guilds, party (inbox can be done later) + span.action(v-if='!inbox', @click='copyAsTodo(msg)') + .svg-icon(v-html="icons.copy") + | {{$t('copyAsTodo')}} + // @TODO make copyAsTodo work in the inbox span.action(v-if='!inbox && user.flags.communityGuidelinesAccepted', @click='report(msg)') .svg-icon(v-html="icons.report") | {{$t('report')}} @@ -72,10 +73,11 @@ .svg-icon(v-html="icons.like") span(v-if='!msg.likes[user._id]') {{ $t('like') }} span(v-if='msg.likes[user._id]') {{ $t('liked') }} - span.action(v-if='!inbox', @click='copyAsTodo(msg)') - .svg-icon(v-html="icons.copy") - | {{$t('copyAsTodo')}} - // @TODO make copyAsTodo work in the inbox + // @TODO make copyAsTodo work in Tavern, guilds, party (inbox can be done later) + span.action(v-if='!inbox', @click='copyAsTodo(msg)') + .svg-icon(v-html="icons.copy") + | {{$t('copyAsTodo')}} + // @TODO make copyAsTodo work in the inbox span.action(v-if='user.flags.communityGuidelinesAccepted', @click='report(msg)') span.action(v-if='!inbox && user.flags.communityGuidelinesAccepted', @click='report(msg)') .svg-icon(v-html="icons.report") diff --git a/website/client/components/creatorIntro.vue b/website/client/components/creatorIntro.vue index 0670891fce..1210008e3c 100644 --- a/website/client/components/creatorIntro.vue +++ b/website/client/components/creatorIntro.vue @@ -1350,7 +1350,15 @@ export default { cost = fullSet ? 1.25 : 0.5; // (Hair, skin, etc) 5G per set, 2G per individual } - let loginIncentives = ['background.blue', 'background.green', 'background.red', 'background.purple', 'background.yellow', 'background.violet']; + let loginIncentives = [ + 'background.blue', + 'background.green', + 'background.red', + 'background.purple', + 'background.yellow', + 'background.violet', + ]; + if (loginIncentives.indexOf(path) === -1) { if (fullSet) { if (confirm(this.$t('purchaseFor', {cost: cost * 4})) !== true) return; diff --git a/website/client/components/groups/group.vue b/website/client/components/groups/group.vue index 8423983972..515e1eecdc 100644 --- a/website/client/components/groups/group.vue +++ b/website/client/components/groups/group.vue @@ -4,6 +4,7 @@ invite-modal(:group='this.group') start-quest-modal(:group='this.group') quest-details-modal(:group='this.group') + group-gems-modal .col-12.col-sm-8.standard-page .row .col-6.title-details @@ -18,9 +19,9 @@ .svg-icon.shield(v-html="icons.silverGuildBadgeIcon", v-if='group.memberCount > 100 && group.memberCount < 999') .svg-icon.shield(v-html="icons.bronzeGuildBadgeIcon", v-if='group.memberCount < 100') span.number {{ group.memberCount | abbrNum }} - div(v-once) {{ $t('members') }} + div(v-once) {{ $t('memberList') }} .col-4(v-if='!isParty') - .item-with-icon + .item-with-icon(@click='showGroupGems()') .svg-icon.gem(v-html="icons.gem") span.number {{group.balance * 4}} div(v-once) {{ $t('guildBank') }} @@ -47,7 +48,6 @@ .row .col-12.hr chat-message(:chat.sync='group.chat', :group-id='group._id', group-name='group.name') - .col-12.col-sm-4.sidebar .row(:class='{"guild-background": !isParty}') .col-6 @@ -453,6 +453,7 @@ import inviteModal from './inviteModal'; import chatMessage from '../chat/chatMessages'; import autocomplete from '../chat/autoComplete'; import groupChallenges from '../challenges/groupChallenges'; +import groupGemsModal from 'client/components/groups/groupGemsModal'; import markdownDirective from 'client/directives/markdown'; import bCollapse from 'bootstrap-vue/lib/components/collapse'; @@ -490,6 +491,7 @@ export default { groupChallenges, autocomplete, questDetailsModal, + groupGemsModal, }, directives: { bToggle, @@ -857,6 +859,9 @@ export default { let quest = await this.$store.dispatch('quests:sendAction', {groupId: this.group._id, action: 'quests/reject'}); this.group.quest = quest; }, + showGroupGems () { + this.$root.$emit('show::modal', 'group-gems-modal'); + }, }, }; diff --git a/website/client/components/groups/groupFormModal.vue b/website/client/components/groups/groupFormModal.vue index 3b81c0bb2b..bb68fd0e4a 100644 --- a/website/client/components/groups/groupFormModal.vue +++ b/website/client/components/groups/groupFormModal.vue @@ -9,7 +9,7 @@ label strong(v-once) {{$t('guildOrPartyLeader')}} * select.form-control(v-model="workingGroup.newLeader") - option(v-for='member in members', :value="member._id") {{ member.profile.name }} + option(v-for='potentialLeader in potentialLeaders', :value="potentialLeader._id") {{ potentialLeader.name }} .form-group(v-if='!this.workingGroup.id') label @@ -316,6 +316,17 @@ export default { isParty () { return this.workingGroup.type === 'party'; }, + potentialLeaders () { + let leaders = [{ _id: this.user._id, name: this.user.profile.name }]; + // @TODO consider pushing all recent posters to the top of the list if they are guild members - more likely to be the ones the leader wants to see (and then ignore them in the while below) + let i = 0; + while (this.members[i]) { + let memb = this.members[i]; + i++; + if (memb._id !== this.user._id) leaders.push({_id: memb._id, name: memb.profile.name}); + } + return leaders; + }, }, watch: { editingGroup () { diff --git a/website/client/components/groups/groupGemsModal.vue b/website/client/components/groups/groupGemsModal.vue new file mode 100644 index 0000000000..70a2f9cba0 --- /dev/null +++ b/website/client/components/groups/groupGemsModal.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/website/client/components/inventory/stable/index.vue b/website/client/components/inventory/stable/index.vue index 875b65a13f..afaa1ffd92 100644 --- a/website/client/components/inventory/stable/index.vue +++ b/website/client/components/inventory/stable/index.vue @@ -113,7 +113,7 @@ div(v-else) h4.popover-content-title {{ item.name }} template(slot="itemBadge", scope="context") - starBadge(:selected="item.key === currentPet", :show="item.isOwned()", @click="selectPet(item)") + starBadge(:selected="item.key === currentPet", :show="item.isOwned()", @click="selectPet(item)") .btn.btn-flat.btn-show-more(@click="setShowMore(petGroup.key)", v-if='petGroup.key !== "specialPets"') | {{ showMore === petGroup.key ? $t('showLess') : $t('showMore') }} diff --git a/website/client/components/inventory/stable/mountItem.vue b/website/client/components/inventory/stable/mountItem.vue index ac22282acd..6ede37aa13 100644 --- a/website/client/components/inventory/stable/mountItem.vue +++ b/website/client/components/inventory/stable/mountItem.vue @@ -1,6 +1,6 @@