diff --git a/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js b/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js
index d8e6e9c70b..1e2f7d6983 100644
--- a/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js
+++ b/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js
@@ -61,15 +61,6 @@ describe('POST /groups/:groupId/quests/leave', () => {
});
});
- it('returns an error when quest is not active', async () => {
- await expect(partyMembers[0].post(`/groups/${questingGroup._id}/quests/leave`))
- .to.eventually.be.rejected.and.eql({
- code: 404,
- error: 'NotFound',
- message: t('noActiveQuestToLeave'),
- });
- });
-
it('returns an error when quest leader attempts to leave', async () => {
await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`);
@@ -97,18 +88,14 @@ describe('POST /groups/:groupId/quests/leave', () => {
});
});
- it('leaves a quest', async () => {
- await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
- await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`);
- await partyMembers[1].post(`/groups/${questingGroup._id}/quests/accept`);
-
- const leaveResult = await partyMembers[0].post(`/groups/${questingGroup._id}/quests/leave`);
+ async function letPartyMemberLeaveAndCheckChanges (partyMember) {
+ const leaveResult = await partyMember.post(`/groups/${questingGroup._id}/quests/leave`);
await Promise.all([
- partyMembers[0].sync(),
+ partyMember.sync(),
questingGroup.sync(),
]);
- expect(partyMembers[0].party.quest).to.eql({
+ expect(partyMember.party.quest).to.eql({
key: null,
progress: {
up: 0,
@@ -120,6 +107,29 @@ describe('POST /groups/:groupId/quests/leave', () => {
RSVPNeeded: false,
});
expect(questingGroup.quest).to.deep.equal(leaveResult);
- expect(questingGroup.quest.members[partyMembers[0]._id]).to.be.false;
+ expect(questingGroup.quest.members[partyMember._id]).to.be.false;
+ }
+
+ it('leaves an active quest', async () => {
+ await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
+ await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`);
+ await partyMembers[1].post(`/groups/${questingGroup._id}/quests/accept`);
+
+ await questingGroup.sync();
+
+ expect(questingGroup.quest.active).to.eql(true);
+
+ await letPartyMemberLeaveAndCheckChanges(partyMembers[0]);
+ });
+
+ it('leaves an inactive quest ', async () => {
+ await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
+ await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`);
+
+ await questingGroup.sync();
+
+ expect(questingGroup.quest.active).to.eql(false);
+
+ await letPartyMemberLeaveAndCheckChanges(partyMembers[0]);
});
});
diff --git a/website/client/config/storybook/config.js b/website/client/config/storybook/config.js
index f7eca53d5d..a5761b4580 100644
--- a/website/client/config/storybook/config.js
+++ b/website/client/config/storybook/config.js
@@ -31,19 +31,45 @@ import '../../src/assets/css/sprites/spritesmith-main-23.css';
import '../../src/assets/css/sprites/spritesmith-main-24.css';
import '../../src/assets/css/sprites/spritesmith-main-25.css';
import '../../src/assets/css/sprites/spritesmith-main-26.css';
+import '../../src/assets/css/sprites/spritesmith-main-27.css';
+import '../../src/assets/css/sprites/spritesmith-main-28.css';
+import '../../src/assets/css/sprites/spritesmith-main-29.css';
import Vue from 'vue';
import BootstrapVue from 'bootstrap-vue';
import StoreModule from '@/libs/store';
+import getStore from '@/store';
+
+import i18n from '../../../common/script/i18n';
// couldn't inject the languages easily,
// so just a "$t()" string to show that this will be translated
-Vue.prototype.$t = function translateString (...args) {
+i18n.t = function translateString (...args) {
return `$t(${JSON.stringify(args)})`;
};
+Vue.prototype.$t = i18n.t;
Vue.use(BootstrapVue);
Vue.use(StoreModule);
+const store = getStore();
+store.state.user.data = {
+ stats: {},
+ tags: [],
+ items: {
+ quests: {
+ moon1: 3,
+ },
+ },
+ party: {
+ quest: {
+
+ },
+ },
+};
+
+Vue.prototype.$store = store;
+
+
const req = require.context('../../src', true, /.stories.js$/);
function loadStories () {
diff --git a/website/client/config/storybook/margin.css b/website/client/config/storybook/margin.css
index eaad293c27..53a5938870 100644
--- a/website/client/config/storybook/margin.css
+++ b/website/client/config/storybook/margin.css
@@ -3,11 +3,12 @@
display: inline-block;
}
-.content {
- color: white;
- background: grey;
-}
-
.inline-block {
display: inline-block;
}
+
+.component-showcase {
+ position: absolute;
+ margin: 20px;
+ width: calc(100% - 40px);
+}
diff --git a/website/client/config/storybook/mock.data.js b/website/client/config/storybook/mock.data.js
index 543793e84d..0d9a57a8b2 100644
--- a/website/client/config/storybook/mock.data.js
+++ b/website/client/config/storybook/mock.data.js
@@ -1,3 +1,5 @@
+import { v4 as generateUUID } from 'uuid';
+
export const userStyles = {
contributor: {
admin: true,
@@ -72,4 +74,11 @@ export const userStyles = {
maxHealth: 50,
maxMP: 158,
},
+ profile: {
+ name: 'user',
+ },
+ _id: generateUUID(),
+ flags: {
+ classSelected: true,
+ },
};
diff --git a/website/client/src/assets/scss/dropdown.scss b/website/client/src/assets/scss/dropdown.scss
index 6eb060003a..f2e027bca2 100644
--- a/website/client/src/assets/scss/dropdown.scss
+++ b/website/client/src/assets/scss/dropdown.scss
@@ -39,6 +39,7 @@
// shared dropdown-item styles
.dropdown-item {
// header items & not selectList-items
+
padding-left: 24px;
padding-top: 8px;
padding-bottom: 8px;
@@ -53,14 +54,13 @@
background-color: inherit;
}
-
&:active, &:hover, &:focus, &.active {
background-color: inherit !important;
- color: $purple-300 !important;
+ color: var(--hover-color, $purple-300) !important;
}
&:hover {
- background-color: rgba($purple-600, 0.25) !important;
+ background-color: var(--hover-background, rgba($purple-600, 0.25)) !important;
}
&.dropdown-inactive {
@@ -71,6 +71,21 @@
color: inherit !important;
}
}
+
+ .with-icon {
+ display: flex;
+ align-items: center;
+
+ .svg-icon {
+ margin: 0 0.5rem 0 0;
+ }
+ }
+
+ &:not(:hover) {
+ .with-icon .svg-icon {
+ color: $gray-200;
+ }
+ }
}
.dropdown + .dropdown {
diff --git a/website/client/src/assets/scss/icon.scss b/website/client/src/assets/scss/icon.scss
index 1b409ca4df..92930f1124 100644
--- a/website/client/src/assets/scss/icon.scss
+++ b/website/client/src/assets/scss/icon.scss
@@ -16,6 +16,12 @@
fill: currentColor;
}
}
+
+ &.color-stroke {
+ svg path {
+ stroke: currentColor;
+ }
+ }
}
.icon-16 {
@@ -33,6 +39,11 @@
height: 24px;
}
+.icon-48 {
+ width: 48px;
+ height: 48px;
+}
+
.icon-10 {
width: 10px;
height: 10px;
diff --git a/website/client/src/assets/scss/item.scss b/website/client/src/assets/scss/item.scss
index ffe1ae5807..ab52d935d1 100644
--- a/website/client/src/assets/scss/item.scss
+++ b/website/client/src/assets/scss/item.scss
@@ -107,5 +107,5 @@
}
.questPopover {
- width: 200px;
+ min-width: 200px;
}
diff --git a/website/client/src/assets/scss/modal.scss b/website/client/src/assets/scss/modal.scss
index b9d1d51e27..1c88d6a775 100644
--- a/website/client/src/assets/scss/modal.scss
+++ b/website/client/src/assets/scss/modal.scss
@@ -41,88 +41,6 @@
}
}
-#start-quest-modal, #buy-quest-modal {
- @media only screen and (max-width: 1200px) {
- .modal-dialog {
- max-width: 33%;
-
- .left-panel {
- left: initial;
- width: 100%;
- right: 100%;
-
- .col-4 {
- width: 100px;
- }
- }
-
- .side-panel, .right-sidebar {
- left: calc(100% - 10px);
- max-width: 100%;
- right: initial;
-
- .questRewards {
- width: 90%;
-
- .reward-item {
- width: 100%;
- }
- }
- }
- }
- }
-
- @media only screen and (max-width: 1000px) {
- .modal-dialog {
- max-width: 80%;
- width: 80% !important;
-
- .modal-body {
- flex-direction: column;
- display: flex;
-
- div:nth-child(1) { order: 3; }
- div:nth-child(2) { order: 1; }
- div:nth-child(3) { order: 4; }
- div:nth-child(4) { order: 5; }
- div:nth-child(5) { order: 2; }
-
- .left-panel {
- border-radius: 8px;
- position: static;
- right: initial;
- margin: 20px 0;
- height: auto;
- width: 100%;
- z-index: 0;
- order: 3;
-
- .col-4 {
- max-width: 100px;
- }
- }
-
- .side-panel, .right-sidebar {
- margin: 20px 0 0 0;
- position: static;
- box-shadow: none;
- height: auto;
- width: 100%;
- z-index: 0;
- order: 2;
- left: 0;
-
- .questRewards {
- padding: 0 2em 2em 2em;
- width: 100%;
- z-index: 0;
- }
- }
- }
- }
- }
-}
-
#subscription-cancel-modal, #subscription-canceled-modal {
.modal-content {
background: transparent;
diff --git a/website/client/src/assets/svg/health_no_padding.svg b/website/client/src/assets/svg/health_no_padding.svg
new file mode 100644
index 0000000000..6507c06438
--- /dev/null
+++ b/website/client/src/assets/svg/health_no_padding.svg
@@ -0,0 +1,21 @@
+
diff --git a/website/client/src/assets/svg/leave.svg b/website/client/src/assets/svg/leave.svg
new file mode 100644
index 0000000000..bf502a7c4d
--- /dev/null
+++ b/website/client/src/assets/svg/leave.svg
@@ -0,0 +1,3 @@
+
diff --git a/website/client/src/assets/svg/level.svg b/website/client/src/assets/svg/level.svg
new file mode 100644
index 0000000000..325437ce95
--- /dev/null
+++ b/website/client/src/assets/svg/level.svg
@@ -0,0 +1 @@
+
diff --git a/website/client/src/assets/svg/navigation_back.svg b/website/client/src/assets/svg/navigation_back.svg
new file mode 100644
index 0000000000..1d29645b04
--- /dev/null
+++ b/website/client/src/assets/svg/navigation_back.svg
@@ -0,0 +1,14 @@
+
diff --git a/website/client/src/assets/svg/rage.svg b/website/client/src/assets/svg/rage.svg
index d215fe223c..216b66e458 100644
--- a/website/client/src/assets/svg/rage.svg
+++ b/website/client/src/assets/svg/rage.svg
@@ -1,18 +1,26 @@
diff --git a/website/client/src/assets/svg/sparklesIcon.svg b/website/client/src/assets/svg/sparklesIcon.svg
new file mode 100644
index 0000000000..eae0e27fb2
--- /dev/null
+++ b/website/client/src/assets/svg/sparklesIcon.svg
@@ -0,0 +1,3 @@
+
diff --git a/website/client/src/assets/svg/users.svg b/website/client/src/assets/svg/users.svg
new file mode 100644
index 0000000000..ca1d736b16
--- /dev/null
+++ b/website/client/src/assets/svg/users.svg
@@ -0,0 +1,20 @@
+
diff --git a/website/client/src/components/achievements/questCompleted.vue b/website/client/src/components/achievements/questCompleted.vue
index 2a709a58c7..90c68775d0 100644
--- a/website/client/src/components/achievements/questCompleted.vue
+++ b/website/client/src/components/achievements/questCompleted.vue
@@ -18,11 +18,11 @@
v-if="questData.completion && typeof questData.completion === 'function'"
v-html="questData.completion()"
>
-
+
{{ $t('paymentYouReceived') }}
-
+
@@ -343,7 +343,7 @@ import FilterSidebar from '@/components/ui/filterSidebar';
import cardsModal from './cards-modal';
import HatchedPetDialog from '../stable/hatchedPetDialog';
-import startQuestModal from '../../groups/startQuestModal';
+import questDetailModal from '../../groups/questDetailModal';
import QuestInfo from '../../shops/quests/questInfo.vue';
import { mapState } from '@/libs/store';
@@ -384,7 +384,7 @@ export default {
ItemRows,
HatchedPetDialog,
CountBadge,
- startQuestModal,
+ questDetailModal,
cardsModal,
QuestInfo,
FilterSidebar,
@@ -632,9 +632,9 @@ export default {
this.$root.$emit('selectMembersModal::showItem', item);
}
} else if (groupKey === 'quests') {
- this.$root.$emit('bv::show::modal', 'start-quest-modal');
-
- this.$root.$emit('selectQuest', item);
+ this.$root.$emit('bv::show::modal', 'quest-detail-modal', {
+ key: item.key,
+ });
}
},
diff --git a/website/client/src/components/memberDetails.stories.js b/website/client/src/components/memberDetails.stories.js
new file mode 100644
index 0000000000..44fbf624af
--- /dev/null
+++ b/website/client/src/components/memberDetails.stories.js
@@ -0,0 +1,34 @@
+/* eslint-disable import/no-extraneous-dependencies */
+import { storiesOf } from '@storybook/vue';
+
+import MemberDetails from './memberDetails.vue';
+import MemberDetailsNew from './memberDetailsNew.vue';
+import { userStyles } from '../../config/storybook/mock.data';
+
+storiesOf('Member Details', module)
+ .add('party header (old)', () => ({
+ components: { MemberDetails },
+ template: `
+
+
+
+ `,
+ data () {
+ return {
+ user: userStyles,
+ };
+ },
+ }))
+ .add('quest participants (new)', () => ({
+ components: { MemberDetailsNew },
+ template: `
+
+
+
+ `,
+ data () {
+ return {
+ user: userStyles,
+ };
+ },
+ }));
diff --git a/website/client/src/components/memberDetailsNew.vue b/website/client/src/components/memberDetailsNew.vue
new file mode 100644
index 0000000000..0d6548c8b1
--- /dev/null
+++ b/website/client/src/components/memberDetailsNew.vue
@@ -0,0 +1,330 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ @{{ member.auth.local.username }}
+ •
+ {{ characterLevel }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/website/client/src/components/members/classBadge.vue b/website/client/src/components/members/classBadge.vue
index b6ce43d7d7..2a01e05189 100644
--- a/website/client/src/components/members/classBadge.vue
+++ b/website/client/src/components/members/classBadge.vue
@@ -1,5 +1,6 @@
-
+
@@ -46,6 +47,10 @@ export default {
type: String,
required: true,
},
+ badgeSize: {
+ type: Number,
+ default: 32,
+ },
},
data () {
return {
diff --git a/website/client/src/components/members/inlineClassBadge.vue b/website/client/src/components/members/inlineClassBadge.vue
new file mode 100644
index 0000000000..f70ae2e25b
--- /dev/null
+++ b/website/client/src/components/members/inlineClassBadge.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
diff --git a/website/client/src/components/payments/selectUserModal.vue b/website/client/src/components/payments/selectUserModal.vue
index 5873f39fbe..b9020e7494 100644
--- a/website/client/src/components/payments/selectUserModal.vue
+++ b/website/client/src/components/payments/selectUserModal.vue
@@ -269,12 +269,12 @@ export default {
result = null;
}
}
- if (!result || !result.data || !result.data.data) {
+ if (!result) {
this.userNotFound = true;
return;
}
this.userNotFound = false;
- this.foundUser = result.data.data;
+ this.foundUser = result;
}, 500),
selectUser () {
this.$root.$emit('habitica::send-gems', this.foundUser);
diff --git a/website/client/src/components/sidebarButton.vue b/website/client/src/components/sectionButton.vue
similarity index 56%
rename from website/client/src/components/sidebarButton.vue
rename to website/client/src/components/sectionButton.vue
index 52ac5a22c7..ad0d009911 100644
--- a/website/client/src/components/sidebarButton.vue
+++ b/website/client/src/components/sectionButton.vue
@@ -1,40 +1,49 @@
@@ -56,5 +65,14 @@ export default {
},
};
},
+ methods: {
+ emitClick ($event) {
+ if ($event.stopPropagation) {
+ $event.stopPropagation();
+ }
+
+ this.$emit('click');
+ },
+ },
};
diff --git a/website/client/src/components/shops/itemWithLabel.vue b/website/client/src/components/shops/itemWithLabel.vue
new file mode 100644
index 0000000000..00519d949a
--- /dev/null
+++ b/website/client/src/components/shops/itemWithLabel.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
diff --git a/website/client/src/components/shops/market/equipmentSection.vue b/website/client/src/components/shops/market/equipmentSection.vue
index cbe37523fe..144e70edfa 100644
--- a/website/client/src/components/shops/market/equipmentSection.vue
+++ b/website/client/src/components/shops/market/equipmentSection.vue
@@ -89,6 +89,7 @@ import svgRogue from '@/assets/svg/rogue.svg';
import svgHealer from '@/assets/svg/healer.svg';
import pinUtils from '../../../mixins/pinUtils';
+import { getClassName } from '../../../../../common/script/libs/getClassName';
const sortGearTypes = [
'sortByType', 'sortByPrice', 'sortByCon',
@@ -159,10 +160,7 @@ export default {
},
methods: {
getClassName (classType) {
- if (classType === 'wizard') {
- return this.$t('mage');
- }
- return this.$t(classType);
+ return this.$t(getClassName(classType));
},
gearSelected (item) {
this.$root.$emit('buyModal::showItem', item);
diff --git a/website/client/src/components/shops/quests/buyQuestModal.vue b/website/client/src/components/shops/quests/buyQuestModal.vue
index e257f0ceed..4c9a05fe76 100644
--- a/website/client/src/components/shops/quests/buyQuestModal.vue
+++ b/website/client/src/components/shops/quests/buyQuestModal.vue
@@ -13,14 +13,12 @@
:pinned="isPinned"
/>
-
-
+
+
+
+ {{$t('questDetailsTitle') }}
+
+
-
* {
+ margin: 0;
+ }
}
.notEnough {
@@ -235,6 +242,18 @@
}
}
}
+
+ @media only screen and (max-width: 1000px) {
+ .modal-dialog {
+ max-width: 80%;
+ width: 80% !important;
+
+ .modal-body {
+ flex-direction: column;
+ display: flex;
+ }
+ }
+ }
}
@@ -257,14 +276,16 @@ import numberInvalid from '@/mixins/numberInvalid';
import PinBadge from '@/components/ui/pinBadge';
import CountdownBanner from '../countdownBanner';
-import questDialogDrops from './questDialogDrops';
import questDialogContent from './questDialogContent';
+import QuestRewards from './questRewards';
+import CloseIcon from '../../shared/closeIcon';
export default {
components: {
+ CloseIcon,
+ QuestRewards,
BalanceInfo,
PinBadge,
- questDialogDrops,
questDialogContent,
CountdownBanner,
},
diff --git a/website/client/src/components/shops/quests/index.vue b/website/client/src/components/shops/quests/index.vue
index f7122645a1..62bb324dcc 100644
--- a/website/client/src/components/shops/quests/index.vue
+++ b/website/client/src/components/shops/quests/index.vue
@@ -219,39 +219,7 @@
@click="selectItem(item)"
>
-
-
-
{{ `${$t('lockedItem')}` }}
-
{{ item.text }}
-
{{ `${$t('questUnlockLostMasterclasser')}` }}
-
{{ `${$t('loginIncentiveQuest', {
- count: item.unlockCondition.incentiveThreshold})}` }}
-
{{ `${$t('unlockByQuesting', {title: item.previous})}` }}
-
{{ `${$t('mustLvlQuest', {level: item.lvl})}` }}
-
-
+
diff --git a/website/client/src/components/shops/quests/quest-dialog.stories.js b/website/client/src/components/shops/quests/quest-dialog.stories.js
new file mode 100644
index 0000000000..7e21fb1732
--- /dev/null
+++ b/website/client/src/components/shops/quests/quest-dialog.stories.js
@@ -0,0 +1,78 @@
+/* eslint-disable import/no-extraneous-dependencies */
+import { storiesOf } from '@storybook/vue';
+import { withKnobs } from '@storybook/addon-knobs';
+
+import { quests } from '@/../../common/script/content/quests';
+import questRewards from './questRewards';
+import itemWithLabel from '../itemWithLabel';
+import questPopover from './questPopover';
+
+const stories = storiesOf('Quests/Sub Components', module);
+
+stories.addDecorator(withKnobs);
+
+stories
+ .add('questRewads', () => ({
+ components: { questRewards },
+ data () {
+ return {
+ quest: quests.goldenknight2,
+ questWithDrop: quests.moon1,
+ };
+ },
+ template: `
+
+
+
+
+ `,
+ }))
+ .add('itemWithLabel', () => ({
+ components: { itemWithLabel },
+ data () {
+ return {
+ };
+ },
+ template: `
+
+
+
+
+
+
+ Image
+
+
+ Label
+
+
+
+
+
+
+
+
+ Image
+
+
+ Label
+
+
+
+ `,
+ }))
+ .add('questPopover', () => ({
+ components: { questPopover },
+ data () {
+ return {
+ quest: quests.goldenknight2,
+ quest2: quests.moon1,
+ };
+ },
+ template: `
+
+
+
+
+ `,
+ }));
diff --git a/website/client/src/components/shops/quests/quest-helper.mixin.js b/website/client/src/components/shops/quests/quest-helper.mixin.js
new file mode 100644
index 0000000000..aea9e59612
--- /dev/null
+++ b/website/client/src/components/shops/quests/quest-helper.mixin.js
@@ -0,0 +1,56 @@
+import groupBy from 'lodash/groupBy';
+import { mapState } from '../../../libs/store';
+
+export const QuestHelperMixin = {
+ computed: {
+ ...mapState({
+ content: 'content',
+ }),
+ },
+ methods: {
+ getDropIcon (drop) {
+ switch (drop.type) {
+ case 'hatchingPotions':
+ return `Pet_HatchingPotion_${drop.key}`;
+ case 'food':
+ return `Pet_Food_${drop.key}`;
+ case 'eggs':
+ return `Pet_Egg_${drop.key}`;
+ case 'quests':
+ return `inventory_quest_scroll_${drop.key}`;
+ default:
+ return `shop_${drop.key}`;
+ }
+ },
+ getDropName (drop) {
+ return typeof drop.text === 'function' ? drop.text() : drop.text;
+ },
+ getDropsList (drops, ownerOnly) {
+ if (!drops) return [];
+
+ const dropList = drops.filter(drop => {
+ if (ownerOnly) {
+ return drop.onlyOwner;
+ }
+ return !drop.onlyOwner;
+ }).map(item => {
+ if (item.type === 'gear') {
+ const contentItem = this.content.gear.flat[item.key];
+
+ return contentItem;
+ }
+
+ return {
+ ...item,
+ text: item.text(),
+ };
+ });
+
+ return Object.entries(groupBy(dropList, e => `${e.type}_${e.key}`))
+ .map(([, entries]) => ({
+ ...entries[0],
+ amount: entries.length,
+ }));
+ },
+ },
+};
diff --git a/website/client/src/components/shops/quests/questDialogContent.vue b/website/client/src/components/shops/quests/questDialogContent.vue
index 27212f452a..56bde4e41c 100644
--- a/website/client/src/components/shops/quests/questDialogContent.vue
+++ b/website/client/src/components/shops/quests/questDialogContent.vue
@@ -4,9 +4,18 @@
class="quest-image"
:class="'quest_' + item.key"
>
-
+
{{ itemText }}
-
+
+
+
+ {{ $t('questOwner') }}:
+
+
+
@import '~@/assets/scss/colors.scss';
+ h3 {
+ color: $gray-10;
+ margin-bottom: 0.25rem;
+ }
+
.quest-image {
margin: 0 auto;
margin-bottom: 1em;
@@ -30,29 +44,67 @@
}
.text {
- margin-bottom: 8px;
- overflow-y: scroll;
+ margin-bottom: 1rem;
+ overflow-y: auto;
text-overflow: ellipsis;
}
+ .leader-label {
+ font-size: 14px;
+ font-weight: bold;
+ line-height: 1.71;
+ color: $gray-50;
+ text-align: center;
+ margin-bottom: 0.5rem;
+
+ ::v-deep .user-label {
+ font-size: 14px;
+ }
+ }
+
.questInfo {
- width: 70%;
+ width: 160px;
margin: 0 auto;
- margin-bottom: 10px;
+
+ display: flex;
+ justify-content: center;
}
diff --git a/website/client/src/components/shops/quests/questInfo.vue b/website/client/src/components/shops/quests/questInfo.vue
index 7e788a2522..916d54e679 100644
--- a/website/client/src/components/shops/quests/questInfo.vue
+++ b/website/client/src/components/shops/quests/questInfo.vue
@@ -1,38 +1,41 @@
-
+
-
{{ $t('collect') + ':' }}
-
-
- {{ collect.count }} {{ getCollectText(collect) }}
-
-
-
-
-
{{ $t('bossHP') + ':' }}
- {{ quest.boss.hp }}
-
-
-
{{ $t('difficulty') + ':' }}
-
-
-
+
+
{{ $t('collect') + ':' }}
+
+
+ {{ collect.count }} {{ getCollectText(collect) }}
+
+
+
+
+
{{ $t('bossHP') + ':' }}
+ {{ quest.boss.hp }}
+
+
+
{{ $t('difficulty') + ':' }}
+
+
+
+
* {
- text-align: left;
+ vertical-align: top;
+ height: 16px;
+ max-height: 16px;
}
dt {
- font-size: 1.3em;
- line-height: 1.2;
+ font-weight: bold;
+ font-stretch: normal;
+ font-style: normal;
+ line-height: 1.33;
+ letter-spacing: normal;
+ text-align: left;
color: $gray-50;
}
.svg-icon {
- margin-right: 4px;
+ margin-left: 4px;
}
.small-version {
@@ -93,10 +110,11 @@ dt {
diff --git a/website/client/src/components/shops/quests/questPopover.vue b/website/client/src/components/shops/quests/questPopover.vue
new file mode 100644
index 0000000000..40b4b59e35
--- /dev/null
+++ b/website/client/src/components/shops/quests/questPopover.vue
@@ -0,0 +1,70 @@
+
+
+
+ {{ $t('lockedItem') }}
+
+
+ {{ item.text }}
+
+
+ {{ $t('questUnlockLostMasterclasser') }}
+
+
+ {{ $t('loginIncentiveQuest', {
+ count: item.unlockCondition.incentiveThreshold}) }}
+
+
+ {{ $t('unlockByQuesting', {title: item.previous}) }}
+
+
+ {{ $t('mustLvlQuest', {level: item.lvl}) }}
+
+
+
+
+
+
diff --git a/website/client/src/components/shops/quests/questRewards.vue b/website/client/src/components/shops/quests/questRewards.vue
new file mode 100644
index 0000000000..f8044690e9
--- /dev/null
+++ b/website/client/src/components/shops/quests/questRewards.vue
@@ -0,0 +1,213 @@
+
+
+
+
+
+
+
+
+
+
+ {{ $t('ownerOnly') }}
+
+
+
+
+
+
+ {{ $t('amountExp', { amount: quest.drop.exp }) }}
+
+
+
+
+
+
+ {{ $t('amountGold', { amount: quest.drop.gp }) }}
+
+
+
+
+
+
+
+
+
+
+ {{ $t('newItem') }}
+
+
+
+
+
+
+
+
+
diff --git a/website/client/src/components/shops/seasonal/index.vue b/website/client/src/components/shops/seasonal/index.vue
index 07b9abceb6..99396e19fa 100644
--- a/website/client/src/components/shops/seasonal/index.vue
+++ b/website/client/src/components/shops/seasonal/index.vue
@@ -371,6 +371,7 @@ import shops from '@/../../common/script/libs/shops';
import SelectTranslatedArray from '@/components/tasks/modal-controls/selectTranslatedArray';
import FilterSidebar from '@/components/ui/filterSidebar';
import FilterGroup from '@/components/ui/filterGroup';
+import { getClassName } from '../../../../../common/script/libs/getClassName';
export default {
components: {
@@ -523,10 +524,7 @@ export default {
},
methods: {
getClassName (classType) {
- if (classType === 'wizard') {
- return this.$t('mage');
- }
- return this.$t(classType);
+ return this.$t(getClassName(classType));
},
seasonalItems (category, sortBy, searchBy, viewOptions, hidePinned) {
let result = _map(category.items, e => ({
diff --git a/website/client/src/components/sidebarSection.vue b/website/client/src/components/sidebarSection.vue
index 6a16d127e1..43f5149af5 100644
--- a/website/client/src/components/sidebarSection.vue
+++ b/website/client/src/components/sidebarSection.vue
@@ -1,5 +1,5 @@
-