Compare commits
34 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| cf03261bbf | |||
| 3ec95ad821 | |||
| 57d11d5b20 | |||
| 289032047c | |||
| 6f5515214a | |||
| fd2c4e3265 | |||
| dd91bada8f | |||
| d724933640 | |||
| e4b74bc347 | |||
| c609db09c1 | |||
| 55feebdf9e | |||
| d8a99647e7 | |||
| 353b4aed05 | |||
| 411f82202b | |||
| 5a5a6e4c5d | |||
| 914eee015e | |||
| a301f817e9 | |||
| 519af8f1b6 | |||
| a71abea032 | |||
| 3c623b08c4 | |||
| ddfa3f8a91 | |||
| e2d1de0cf0 | |||
| 9281de1801 | |||
| 4960171565 | |||
| d063a57faa | |||
| 0960eaf571 | |||
| fd0ec41c53 | |||
| 1420e1c8d7 | |||
| c7c854664f | |||
| 68e5679340 | |||
| 32a9dda2c6 | |||
| 8b19c0ad69 | |||
| 33e8b64df6 | |||
| 427251ed1d |
@@ -32,7 +32,7 @@
|
||||
"LOGGLY_SUBDOMAIN": "example-subdomain",
|
||||
"LOGGLY_TOKEN": "example-token",
|
||||
"MAINTENANCE_MODE": "false",
|
||||
"NODE_DB_URI": "mongodb://localhost/habitrpg",
|
||||
"NODE_DB_URI": "mongodb://localhost:27017/habitrpg",
|
||||
"MONGODB_POOL_SIZE": "10",
|
||||
"NODE_ENV": "development",
|
||||
"PATH": "bin:node_modules/.bin:/usr/local/bin:/usr/bin:/bin",
|
||||
@@ -70,7 +70,7 @@
|
||||
"SLACK_URL": "https://hooks.slack.com/services/some-url",
|
||||
"STRIPE_API_KEY": "aaaabbbbccccddddeeeeffff00001111",
|
||||
"STRIPE_PUB_KEY": "22223333444455556666777788889999",
|
||||
"TEST_DB_URI": "mongodb://localhost/habitrpg_test",
|
||||
"TEST_DB_URI": "mongodb://localhost:27017/habitrpg_test",
|
||||
"TRANSIFEX_SLACK_CHANNEL": "transifex",
|
||||
"WEB_CONCURRENCY": 1,
|
||||
"SKIP_SSL_CHECK_KEY": "key",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"version": "4.137.0",
|
||||
"version": "4.138.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@@ -1427,9 +1427,9 @@
|
||||
}
|
||||
},
|
||||
"acorn": {
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz",
|
||||
"integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ=="
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz",
|
||||
"integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg=="
|
||||
},
|
||||
"acorn-jsx": {
|
||||
"version": "5.1.0",
|
||||
@@ -2121,9 +2121,9 @@
|
||||
"integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
|
||||
},
|
||||
"aws-sdk": {
|
||||
"version": "2.635.0",
|
||||
"resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.635.0.tgz",
|
||||
"integrity": "sha512-NlKqMB4HqMqSutY6YmPzQVa+mMhqo0655hYYl8G2zkUvrYy+YxDitvwDEUkSsNKVFkEvmHtZggFCgVYIUu/sXg==",
|
||||
"version": "2.639.0",
|
||||
"resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.639.0.tgz",
|
||||
"integrity": "sha512-cbH69oV0ObZ4tapbjDqu0j3I779uscQNhRaewjIJY5O5At4RULtd7us24n72FtT4HIwM9cwORzVxA9rK6DHKOA==",
|
||||
"requires": {
|
||||
"buffer": "4.9.1",
|
||||
"events": "1.1.1",
|
||||
@@ -11457,9 +11457,9 @@
|
||||
}
|
||||
},
|
||||
"regenerator-runtime": {
|
||||
"version": "0.13.3",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
|
||||
"integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw=="
|
||||
"version": "0.13.5",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
|
||||
"integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
|
||||
},
|
||||
"regenerator-transform": {
|
||||
"version": "0.14.2",
|
||||
@@ -13940,9 +13940,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"acorn": {
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz",
|
||||
"integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA=="
|
||||
"version": "6.4.1",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
|
||||
"integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA=="
|
||||
},
|
||||
"eslint-scope": {
|
||||
"version": "4.0.3",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
|
||||
"version": "4.137.0",
|
||||
"version": "4.138.0",
|
||||
"main": "./website/server/index.js",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.8.7",
|
||||
@@ -14,7 +14,7 @@
|
||||
"amplitude": "^3.5.0",
|
||||
"apidoc": "^0.17.5",
|
||||
"apn": "^2.2.0",
|
||||
"aws-sdk": "^2.635.0",
|
||||
"aws-sdk": "^2.639.0",
|
||||
"bcrypt": "^3.0.8",
|
||||
"body-parser": "^1.18.3",
|
||||
"compression": "^1.7.4",
|
||||
@@ -58,7 +58,7 @@
|
||||
"paypal-ipn": "3.0.0",
|
||||
"paypal-rest-sdk": "^1.8.1",
|
||||
"ps-tree": "^1.0.0",
|
||||
"regenerator-runtime": "^0.13.3",
|
||||
"regenerator-runtime": "^0.13.5",
|
||||
"remove-markdown": "^0.3.0",
|
||||
"rimraf": "^3.0.2",
|
||||
"short-uuid": "^3.0.0",
|
||||
|
||||
@@ -11,7 +11,9 @@ import apiError from '../../../../../website/server/libs/apiError';
|
||||
|
||||
describe('GET /groups', () => {
|
||||
let user;
|
||||
let userInGuild;
|
||||
const NUMBER_OF_PUBLIC_GUILDS = 3; // 2 + the tavern
|
||||
const NUMBER_OF_PUBLIC_GUILDS_USER_IS_LEADER = 2;
|
||||
const NUMBER_OF_PUBLIC_GUILDS_USER_IS_MEMBER = 1;
|
||||
const NUMBER_OF_USERS_PRIVATE_GUILDS = 1;
|
||||
const NUMBER_OF_GROUPS_USER_CAN_VIEW = 5;
|
||||
@@ -33,14 +35,20 @@ describe('GET /groups', () => {
|
||||
name: 'public guild - is member',
|
||||
type: 'guild',
|
||||
privacy: 'public',
|
||||
summary: 'ohayou kombonwa',
|
||||
description: 'oyasumi',
|
||||
});
|
||||
await leader.post(`/groups/${publicGuildUserIsMemberOf._id}/invite`, { uuids: [user._id] });
|
||||
await user.post(`/groups/${publicGuildUserIsMemberOf._id}/join`);
|
||||
|
||||
userInGuild = await generateUser({ guilds: [publicGuildUserIsMemberOf._id] });
|
||||
|
||||
publicGuildNotMember = await generateGroup(leader, {
|
||||
name: 'public guild - is not member',
|
||||
type: 'guild',
|
||||
privacy: 'public',
|
||||
summary: 'Natsume Soseki',
|
||||
description: 'Kinnosuke no Hondana',
|
||||
categories,
|
||||
});
|
||||
|
||||
@@ -150,6 +158,35 @@ describe('GET /groups', () => {
|
||||
|
||||
expect(guilds.length).to.equal(0);
|
||||
});
|
||||
|
||||
it('filters public guilds by leader role', async () => {
|
||||
const guilds = await user.get('/groups?type=publicGuilds&leader=true');
|
||||
expect(guilds.length).to.equal(NUMBER_OF_PUBLIC_GUILDS_USER_IS_LEADER);
|
||||
});
|
||||
|
||||
it('filters public guilds by member role', async () => {
|
||||
const guilds = await userInGuild.get('/groups?type=publicGuilds&member=true');
|
||||
expect(guilds.length).to.equal(1);
|
||||
expect(guilds[0].name).to.have.string('is member');
|
||||
});
|
||||
|
||||
it('filters public guilds by single-word search term', async () => {
|
||||
const guilds = await user.get('/groups?type=publicGuilds&search=kom');
|
||||
expect(guilds.length).to.equal(1);
|
||||
expect(guilds[0].summary).to.have.string('ohayou kombonwa');
|
||||
});
|
||||
|
||||
it('filters public guilds by single-word search term left and right-padded by spaces', async () => {
|
||||
const guilds = await user.get('/groups?type=publicGuilds&search=++++ohayou+kombonwa+++++');
|
||||
expect(guilds.length).to.equal(1);
|
||||
expect(guilds[0].summary).to.have.string('ohayou kombonwa');
|
||||
});
|
||||
|
||||
it('filters public guilds by two-words search term separated by multiple spaces', async () => {
|
||||
const guilds = await user.get('/groups?type=publicGuilds&search=kinnosuke+++++hon');
|
||||
expect(guilds.length).to.equal(1);
|
||||
expect(guilds[0].description).to.have.string('Kinnosuke');
|
||||
});
|
||||
});
|
||||
|
||||
describe('public guilds pagination', () => {
|
||||
|
||||
@@ -18,18 +18,18 @@
|
||||
"@vue/cli-plugin-router": "^4.2.3",
|
||||
"@vue/cli-plugin-unit-mocha": "^4.2.3",
|
||||
"@vue/cli-service": "^4.2.3",
|
||||
"@storybook/addon-actions": "^5.3.14",
|
||||
"@storybook/addon-knobs": "^5.3.14",
|
||||
"@storybook/addon-links": "^5.3.14",
|
||||
"@storybook/addon-notes": "^5.3.14",
|
||||
"@storybook/vue": "^5.3.14",
|
||||
"@storybook/addon-actions": "^5.3.17",
|
||||
"@storybook/addon-knobs": "^5.3.17",
|
||||
"@storybook/addon-links": "^5.3.17",
|
||||
"@storybook/addon-notes": "^5.3.17",
|
||||
"@storybook/vue": "^5.3.17",
|
||||
"@vue/test-utils": "1.0.0-beta.29",
|
||||
"amplitude-js": "^5.9.0",
|
||||
"amplitude-js": "^5.10.0",
|
||||
"axios": "^0.19.2",
|
||||
"axios-progress-bar": "^1.2.0",
|
||||
"babel-eslint": "^10.1.0",
|
||||
"bootstrap": "^4.4.1",
|
||||
"bootstrap-vue": "^2.6.1",
|
||||
"bootstrap-vue": "^2.7.0",
|
||||
"chai": "^4.1.2",
|
||||
"core-js": "^3.6.4",
|
||||
"eslint": "^6.8.0",
|
||||
@@ -44,7 +44,7 @@
|
||||
"lodash": "^4.17.15",
|
||||
"moment": "^2.24.0",
|
||||
"nconf": "^0.10.0",
|
||||
"sass": "^1.26.2",
|
||||
"sass": "^1.26.3",
|
||||
"sass-loader": "^8.0.2",
|
||||
"smartbanner.js": "^1.15.0",
|
||||
"svg-inline-loader": "^0.8.2",
|
||||
@@ -58,7 +58,7 @@
|
||||
"vue-mugen-scroll": "^0.2.6",
|
||||
"vue-router": "^3.1.6",
|
||||
"vue-template-compiler": "^2.6.11",
|
||||
"vue2-perfect-scrollbar": "^1.3.0",
|
||||
"vue2-perfect-scrollbar": "^1.4.0",
|
||||
"vuedraggable": "^2.23.1",
|
||||
"vuejs-datepicker": "git://github.com/habitrpg/vuejs-datepicker.git#5d237615463a84a23dd6f3f77c6ab577d68593ec",
|
||||
"webpack": "^4.42.0"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
}
|
||||
.promo_armoire_backgrounds_202003 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: 0px -445px;
|
||||
background-position: -433px -445px;
|
||||
width: 423px;
|
||||
height: 147px;
|
||||
}
|
||||
@@ -18,25 +18,49 @@
|
||||
}
|
||||
.promo_hugabug_bundle {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -424px -445px;
|
||||
background-position: -424px -608px;
|
||||
width: 420px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_mystery_202003 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -624px -211px;
|
||||
background-position: -328px -168px;
|
||||
width: 282px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_pi_day {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: 0px -593px;
|
||||
background-position: -283px -756px;
|
||||
width: 273px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_seasonal_shop_spring {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -857px -445px;
|
||||
width: 162px;
|
||||
height: 138px;
|
||||
}
|
||||
.promo_spring_2019 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: 0px -445px;
|
||||
width: 432px;
|
||||
height: 162px;
|
||||
}
|
||||
.promo_spring_2020 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -624px 0px;
|
||||
width: 429px;
|
||||
height: 183px;
|
||||
}
|
||||
.promo_spring_potions_2020 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: 0px -608px;
|
||||
width: 423px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_take_this {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -624px -359px;
|
||||
background-position: -845px -608px;
|
||||
width: 96px;
|
||||
height: 69px;
|
||||
}
|
||||
@@ -48,13 +72,13 @@
|
||||
}
|
||||
.scene_gaining_achievement {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -624px 0px;
|
||||
background-position: -624px -184px;
|
||||
width: 339px;
|
||||
height: 210px;
|
||||
}
|
||||
.scene_shanaqui {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -328px -168px;
|
||||
background-position: 0px -756px;
|
||||
width: 282px;
|
||||
height: 147px;
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 179 KiB After Width: | Height: | Size: 236 KiB |
|
Before Width: | Height: | Size: 113 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 117 KiB After Width: | Height: | Size: 119 KiB |
|
Before Width: | Height: | Size: 286 KiB After Width: | Height: | Size: 191 KiB |
|
Before Width: | Height: | Size: 353 KiB After Width: | Height: | Size: 426 KiB |
|
Before Width: | Height: | Size: 189 KiB After Width: | Height: | Size: 220 KiB |
|
Before Width: | Height: | Size: 156 KiB After Width: | Height: | Size: 165 KiB |
|
Before Width: | Height: | Size: 140 KiB After Width: | Height: | Size: 145 KiB |
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 148 KiB |
|
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 162 KiB |
|
Before Width: | Height: | Size: 149 KiB After Width: | Height: | Size: 148 KiB |
|
Before Width: | Height: | Size: 143 KiB After Width: | Height: | Size: 146 KiB |
|
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 159 KiB |
|
Before Width: | Height: | Size: 146 KiB After Width: | Height: | Size: 145 KiB |
|
Before Width: | Height: | Size: 183 KiB After Width: | Height: | Size: 184 KiB |
|
Before Width: | Height: | Size: 165 KiB After Width: | Height: | Size: 168 KiB |
|
Before Width: | Height: | Size: 163 KiB After Width: | Height: | Size: 165 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 139 KiB |
@@ -2,11 +2,11 @@
|
||||
// possible values are: normal, fall, habitoween, thanksgiving, winter, nye, birthday, valentines, spring, summer
|
||||
// more to be added on future seasons
|
||||
|
||||
$npc_market_flavor: 'normal';
|
||||
$npc_quests_flavor: 'normal';
|
||||
$npc_seasonal_flavor: 'normal';
|
||||
$npc_timetravelers_flavor: 'normal';
|
||||
$npc_tavern_flavor: 'normal';
|
||||
$npc_market_flavor: 'spring';
|
||||
$npc_quests_flavor: 'spring';
|
||||
$npc_seasonal_flavor: 'spring';
|
||||
$npc_timetravelers_flavor: 'spring';
|
||||
$npc_tavern_flavor: 'spring';
|
||||
|
||||
$restingToolbarHeight: 40px;
|
||||
$menuToolbarHeight: 56px;
|
||||
|
||||
@@ -225,30 +225,30 @@ export default {
|
||||
classGear (heroClass) {
|
||||
if (heroClass === 'rogue') {
|
||||
return {
|
||||
armor: 'armor_rogue_5',
|
||||
head: 'head_rogue_5',
|
||||
shield: 'shield_rogue_6',
|
||||
weapon: 'weapon_rogue_6',
|
||||
armor: 'armor_special_spring2020Rogue',
|
||||
head: 'head_special_spring2020Rogue',
|
||||
shield: 'shield_special_spring2020Rogue',
|
||||
weapon: 'weapon_special_spring2020Rogue',
|
||||
};
|
||||
} if (heroClass === 'wizard') {
|
||||
return {
|
||||
armor: 'armor_wizard_5',
|
||||
head: 'head_wizard_5',
|
||||
weapon: 'weapon_wizard_6',
|
||||
armor: 'armor_special_spring2020Mage',
|
||||
head: 'head_special_spring2020Mage',
|
||||
weapon: 'weapon_special_spring2020Mage',
|
||||
};
|
||||
} if (heroClass === 'healer') {
|
||||
return {
|
||||
armor: 'armor_healer_5',
|
||||
head: 'head_healer_5',
|
||||
shield: 'shield_healer_5',
|
||||
weapon: 'weapon_healer_6',
|
||||
armor: 'armor_special_spring2020Healer',
|
||||
head: 'head_special_spring2020Healer',
|
||||
shield: 'shield_special_spring2020Healer',
|
||||
weapon: 'weapon_special_spring2020Healer',
|
||||
};
|
||||
}
|
||||
return {
|
||||
armor: 'armor_warrior_5',
|
||||
head: 'head_warrior_5',
|
||||
shield: 'shield_warrior_5',
|
||||
weapon: 'weapon_warrior_6',
|
||||
armor: 'armor_special_spring2020Warrior',
|
||||
head: 'head_special_spring2020Warrior',
|
||||
shield: 'shield_special_spring2020Warrior',
|
||||
weapon: 'weapon_special_spring2020Warrior',
|
||||
};
|
||||
},
|
||||
selectionBox (selectedClass, heroClass) {
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
</div>
|
||||
<div
|
||||
v-if="hasParty"
|
||||
ref="partyMembersDiv"
|
||||
v-resize="1500"
|
||||
class="party-members d-flex"
|
||||
@resized="setPartyMembersWidth($event)"
|
||||
@@ -153,6 +154,15 @@ export default {
|
||||
inviteModalGroupType: undefined,
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
hideHeader () {
|
||||
this.$nextTick(() => {
|
||||
if (this.$refs.partyMembersDiv) {
|
||||
this.setPartyMembersWidth({ width: this.$refs.partyMembersDiv.clientWidth });
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
...mapGetters({
|
||||
user: 'user:data',
|
||||
|
||||
@@ -1,4 +1,22 @@
|
||||
import intersection from 'lodash/intersection';
|
||||
import _ from 'lodash';
|
||||
|
||||
const containsAnyCi = (target, patterns) => patterns.some(el => target.match(new RegExp(el, 'i')));
|
||||
const isPassedSearch = ({ name, summary, description }, search) => {
|
||||
if (!search) return false;
|
||||
|
||||
const searchWords = _.escapeRegExp(search.trim()).split(/\s+/);
|
||||
|
||||
if (containsAnyCi(name, searchWords)) return true;
|
||||
|
||||
if (!summary) return false;
|
||||
if (containsAnyCi(summary, searchWords)) return true;
|
||||
|
||||
if (!description) return false;
|
||||
if (containsAnyCi(description, searchWords)) return true;
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
export default {
|
||||
filters: {
|
||||
@@ -56,9 +74,7 @@ export default {
|
||||
|
||||
if (group._id === this.$store.state.constants.TAVERN_ID || group._id === 'habitrpg') return false;
|
||||
|
||||
if (search) {
|
||||
passedSearch = group.name.toLowerCase().indexOf(search.toLowerCase()) >= 0;
|
||||
}
|
||||
if (search) passedSearch = isPassedSearch(group, search);
|
||||
|
||||
if (filters.categories && filters.categories.length > 0) {
|
||||
const intersectingCats = intersection(filters.categories, group.categorySlugs);
|
||||
@@ -75,11 +91,11 @@ export default {
|
||||
}
|
||||
|
||||
if (filters.guildSize && filters.guildSize.indexOf('gold_tier') !== -1) {
|
||||
correctSize = group.memberCount > 1000;
|
||||
correctSize = group.memberCount >= 1000;
|
||||
}
|
||||
|
||||
if (filters.guildSize && filters.guildSize.indexOf('silver_tier') !== -1) {
|
||||
correctSize = group.memberCount > 100 && group.memberCount < 1000;
|
||||
correctSize = group.memberCount >= 100 && group.memberCount < 1000;
|
||||
}
|
||||
|
||||
if (filters.guildSize && filters.guildSize.indexOf('bronze_tier') !== -1) {
|
||||
|
||||
@@ -0,0 +1,107 @@
|
||||
import { shallowMount, createLocalVue } from '@vue/test-utils';
|
||||
import Store from '@/libs/store';
|
||||
import myGuilds from '@/components/groups/myGuilds';
|
||||
import PublicGuildItem from '@/components/groups/publicGuildItem';
|
||||
|
||||
const localVue = createLocalVue();
|
||||
localVue.use(Store);
|
||||
|
||||
describe('myGuilds component', () => {
|
||||
let computed;
|
||||
const guilds = [{
|
||||
_id: '1',
|
||||
type: 'guild',
|
||||
name: 'Crimson Vow',
|
||||
summary: 'testing',
|
||||
description: 'testing',
|
||||
}, {
|
||||
_id: '2',
|
||||
type: 'guild',
|
||||
name: 'Log Horizon',
|
||||
summary: 'testing',
|
||||
description: 'testing',
|
||||
}, {
|
||||
_id: '3',
|
||||
type: 'guild',
|
||||
name: 'CAD Cads',
|
||||
summary: '3D',
|
||||
description: '3D',
|
||||
}, {
|
||||
_id: '4',
|
||||
type: 'guild',
|
||||
name: 'Santa Claus',
|
||||
summary: '3d',
|
||||
description: 'hohoho',
|
||||
}];
|
||||
const store = new Store({
|
||||
state: {
|
||||
user: {
|
||||
data: {
|
||||
_id: '999',
|
||||
guilds: ['1', '2', '3', '4'],
|
||||
},
|
||||
},
|
||||
editingGroup: {},
|
||||
constants: {
|
||||
TAVERN_ID: '9999',
|
||||
},
|
||||
},
|
||||
getters: {},
|
||||
actions: {
|
||||
'guilds:getMyGuilds': () => guilds,
|
||||
},
|
||||
});
|
||||
|
||||
function makeWrapper (opts = {}) {
|
||||
return shallowMount(myGuilds, {
|
||||
data () {
|
||||
return {
|
||||
filter: {},
|
||||
search: '',
|
||||
};
|
||||
},
|
||||
store,
|
||||
localVue,
|
||||
...opts,
|
||||
});
|
||||
}
|
||||
|
||||
before(() => {
|
||||
computed = {
|
||||
guilds: () => guilds,
|
||||
};
|
||||
});
|
||||
|
||||
it('renders all guilds with no filter and no search', () => {
|
||||
const wrapper = makeWrapper({ computed });
|
||||
expect(wrapper.findAll(PublicGuildItem).length).to.equal(4);
|
||||
});
|
||||
|
||||
it('renders guilds with name matching against a single-word search term', () => {
|
||||
const search = 'vow';
|
||||
const wrapper = makeWrapper({ computed });
|
||||
wrapper.setData({ search });
|
||||
expect(wrapper.findAll(PublicGuildItem).length).to.equal(1);
|
||||
});
|
||||
|
||||
it('renders guilds with summary matching against a single-word search term', () => {
|
||||
const search = '3d';
|
||||
const wrapper = makeWrapper({ computed });
|
||||
wrapper.setData({ search });
|
||||
expect(wrapper.findAll(PublicGuildItem).length).to.equal(2);
|
||||
});
|
||||
|
||||
it('renders guilds with description matching against a single-word search term', () => {
|
||||
const search = 'hoho';
|
||||
const wrapper = makeWrapper({ computed });
|
||||
wrapper.setData({ search });
|
||||
expect(wrapper.findAll(PublicGuildItem).length).to.equal(1);
|
||||
});
|
||||
|
||||
it('renders guilds with summary matching against two search terms with space in between', () => {
|
||||
const search = '3d ohayou';
|
||||
const wrapper = makeWrapper({ computed });
|
||||
wrapper.setData({ search });
|
||||
expect(wrapper.findAll(PublicGuildItem).length).to.equal(2);
|
||||
});
|
||||
});
|
||||
@@ -61,4 +61,172 @@ describe('Groups Utilities Mixin', () => {
|
||||
})).to.equal(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('filterGuild', () => {
|
||||
let testGroup;
|
||||
let testGroup2;
|
||||
|
||||
before(() => {
|
||||
testGroup = {
|
||||
type: 'guild',
|
||||
_id: user.guilds[0],
|
||||
name: 'Crimson Vow',
|
||||
summary: 'testing',
|
||||
description: 'dummy 1',
|
||||
leader: user.guilds[0], // test user is not guild leader
|
||||
categories: [{
|
||||
_id: '123',
|
||||
slug: 'hobbies_occupations',
|
||||
name: 'hobbies_occupations',
|
||||
}],
|
||||
categorySlugs: ['hobbies_occupations'],
|
||||
memberCount: 1000,
|
||||
};
|
||||
testGroup2 = {
|
||||
type: 'guild',
|
||||
_id: '790',
|
||||
name: 'CAD Cads',
|
||||
summary: '3D',
|
||||
description: 'My dummy',
|
||||
leader: user._id, // test user is guild leader
|
||||
categories: [{
|
||||
_id: '123',
|
||||
slug: 'hobbies_occupations',
|
||||
name: 'hobbies_occupations',
|
||||
}],
|
||||
categorySlugs: ['hobbies_occupations'],
|
||||
memberCount: 100,
|
||||
};
|
||||
});
|
||||
|
||||
it('returns true with no filter and no search', () => {
|
||||
const filter = {};
|
||||
const search = '';
|
||||
expect(instance.filterGuild(testGroup, filter, search, user)).to.equal(true);
|
||||
});
|
||||
|
||||
it('returns false with no filter and one search word not matching against any of the guild name, summary, and description', () => {
|
||||
const filter = {};
|
||||
const search = '3d';
|
||||
expect(instance.filterGuild(testGroup, filter, search, user)).to.equal(false);
|
||||
});
|
||||
|
||||
it('returns true with no filter and one search word matched successfully against guild name', () => {
|
||||
const filter = {};
|
||||
const search = 'vow';
|
||||
expect(instance.filterGuild(testGroup, filter, search, user)).to.equal(true);
|
||||
});
|
||||
|
||||
it('returns true with no filter and one search word matched successfully against guild summary', () => {
|
||||
const filter = {};
|
||||
const search = 'test';
|
||||
expect(instance.filterGuild(testGroup, filter, search, user)).to.equal(true);
|
||||
});
|
||||
|
||||
it('returns true with no filter and one search word matched successfully against guild description', () => {
|
||||
const filter = {};
|
||||
const search = 'dum';
|
||||
expect(instance.filterGuild(testGroup, filter, search, user)).to.equal(true);
|
||||
});
|
||||
|
||||
it('returns true with no filter and two search words with two spaces in between matched successfully against guild name', () => {
|
||||
const filter = {};
|
||||
const search = 'cad test';
|
||||
expect(instance.filterGuild(testGroup2, filter, search, user)).to.equal(true);
|
||||
});
|
||||
|
||||
it('returns true with no filter and two search words with two spaces in between matched successfully against guild summary', () => {
|
||||
const filter = {};
|
||||
const search = 'cad 3d';
|
||||
expect(instance.filterGuild(testGroup2, filter, search, user)).to.equal(true);
|
||||
});
|
||||
|
||||
it('returns true with no filter and two search words with two spaces in between matched successfully against guild description', () => {
|
||||
const filter = {};
|
||||
const search = 'my dummy';
|
||||
expect(instance.filterGuild(testGroup2, filter, search, user)).to.equal(true);
|
||||
});
|
||||
|
||||
it('returns false with no search word and one filter category that does not match against any guild categories', () => {
|
||||
const filter = {
|
||||
categories: ['academics'],
|
||||
};
|
||||
const search = '';
|
||||
expect(instance.filterGuild(testGroup, filter, search, user)).to.equal(false);
|
||||
});
|
||||
|
||||
it('returns true with no search word and one filter category that matches successfully against any guild categories', () => {
|
||||
const filter = {
|
||||
categories: ['hobbies_occupations'],
|
||||
};
|
||||
const search = '';
|
||||
expect(instance.filterGuild(testGroup, filter, search, user)).to.equal(true);
|
||||
});
|
||||
|
||||
it('returns false with no search word and one filter role that does not match against guild role', () => {
|
||||
const filter = {
|
||||
roles: ['guild_leader'],
|
||||
};
|
||||
const search = '';
|
||||
expect(instance.filterGuild(testGroup, filter, search, user)).to.equal(false);
|
||||
});
|
||||
|
||||
it('returns true with no search word and one filter role that matches successfully against guild role', () => {
|
||||
const filter = {
|
||||
roles: ['member'],
|
||||
};
|
||||
const search = '';
|
||||
expect(instance.filterGuild(testGroup, filter, search, user)).to.equal(true);
|
||||
});
|
||||
|
||||
it('returns true with no search word and filter size silver tier that matches against a guild size of 1000, the max guild size belonging to silver tier', () => {
|
||||
const filter = {
|
||||
guildSize: 'gold_tier',
|
||||
};
|
||||
const search = '';
|
||||
expect(instance.filterGuild(testGroup, filter, search, user)).to.equal(true);
|
||||
});
|
||||
|
||||
it('returns true with no search word and filter size bronze tier that matches against a guild size of 100, the max guild size belonging to bronze tier', () => {
|
||||
const filter = {
|
||||
guildSize: 'silver_tier',
|
||||
};
|
||||
const search = '';
|
||||
expect(instance.filterGuild(testGroup2, filter, search, user)).to.equal(true);
|
||||
});
|
||||
|
||||
it('returns false with no search word and filter category that matches successfully against one guild category and filter role that does not match against guild role', () => {
|
||||
const filter = {
|
||||
categories: ['hobbies_occupations'],
|
||||
roles: ['guild_leader'],
|
||||
};
|
||||
const search = '';
|
||||
expect(instance.filterGuild(testGroup, filter, search, user)).to.equal(false);
|
||||
});
|
||||
|
||||
it('returns true with no search word and filter category that matches successfully against one guild category and filter role that matches successfully against guild role', () => {
|
||||
const filter = {
|
||||
categories: ['hobbies_occupations'],
|
||||
roles: ['guild_leader'],
|
||||
};
|
||||
const search = '';
|
||||
expect(instance.filterGuild(testGroup2, filter, search, user)).to.equal(true);
|
||||
});
|
||||
|
||||
it('returns false with one search word that does not match against guild name and one filter category that matches successfully against guild categories', () => {
|
||||
const filter = {
|
||||
categories: ['hobbies_occupations'],
|
||||
};
|
||||
const search = 'konnichiwa';
|
||||
expect(instance.filterGuild(testGroup, filter, search, user)).to.equal(false);
|
||||
});
|
||||
|
||||
it('returns true with one search word that matches against guild name and one filter role that matches successfully against guild role', () => {
|
||||
const filter = {
|
||||
categories: ['hobbies_occupations'],
|
||||
};
|
||||
const search = 'vow';
|
||||
expect(instance.filterGuild(testGroup, filter, search, user)).to.equal(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -298,6 +298,7 @@
|
||||
"hatchingPotionAmber": "Amber",
|
||||
"hatchingPotionAurora": "Aurora",
|
||||
"hatchingPotionRuby": "Ruby",
|
||||
"hatchingPotionBirchBark": "Birch Bark",
|
||||
|
||||
"hatchingPotionNotes": "Pour this on an egg, and it will hatch as a <%= potText(locale) %> pet.",
|
||||
"premiumPotionAddlNotes": "Not usable on quest pet eggs. Available for purchase until <%= date(locale) %>.",
|
||||
|
||||
@@ -350,6 +350,15 @@
|
||||
"weaponSpecialWinter2020HealerText": "Clove Scepter",
|
||||
"weaponSpecialWinter2020HealerNotes": "Wave it about, and its aroma will summon your friends and helpers to begin cooking and baking! Increases Intelligence by <%= int %>. Limited Edition 2019-2020 Winter Gear.",
|
||||
|
||||
"weaponSpecialSpring2020RogueText": "Lazurite Blade",
|
||||
"weaponSpecialSpring2020RogueNotes": "You'll strike so fast it'll look even MORE blue! Increases Strength by <%= str %>. Limited Edition 2020 Spring Gear.",
|
||||
"weaponSpecialSpring2020WarriorText": "Sharpened Wing",
|
||||
"weaponSpecialSpring2020WarriorNotes": "Fight or flight, this wing will serve you well! Increases Strength by <%= str %>. Limited Edition 2020 Spring Gear.",
|
||||
"weaponSpecialSpring2020MageText": "Raindrops",
|
||||
"weaponSpecialSpring2020MageNotes": "They keep falling on your head! But you'll never stop them by complaining. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2020 Spring Gear.",
|
||||
"weaponSpecialSpring2020HealerText": "Sword-Lily Staff",
|
||||
"weaponSpecialSpring2020HealerNotes": "An iris is beautiful, but the leaves are like swords... don't be deceived by the flowers, this staff is tough as steel! Increases Intelligence by <%= int %>. Limited Edition 2020 Spring Gear.",
|
||||
|
||||
"weaponMystery201411Text": "Pitchfork of Feasting",
|
||||
"weaponMystery201411Notes": "Stab your enemies or dig in to your favorite foods - this versatile pitchfork does it all! Confers no benefit. November 2014 Subscriber Item.",
|
||||
"weaponMystery201502Text": "Shimmery Winged Staff of Love and Also Truth",
|
||||
@@ -809,6 +818,15 @@
|
||||
"armorSpecialWinter2020HealerText": "Orange Peel Gown",
|
||||
"armorSpecialWinter2020HealerNotes": "An opulent gown for those with festive zest! Increases Constitution by <%= con %>. Limited Edition 2019-2020 Winter Gear.",
|
||||
|
||||
"armorSpecialSpring2020RogueText": "Ultramarine Armor",
|
||||
"armorSpecialSpring2020RogueNotes": "The color of twilight, of a multitude of precious stones, of the deepest sea! Increases Perception by <%= per %>. Limited Edition 2020 Spring Gear.",
|
||||
"armorSpecialSpring2020WarriorText": "Exoskeleton Armor",
|
||||
"armorSpecialSpring2020WarriorNotes": "This rigid carapace can keep you safe from even the most crushing attacks. Increases Constitution by <%= con %>. Limited Edition 2020 Spring Gear.",
|
||||
"armorSpecialSpring2020MageText": "Whirlpuddle Gown",
|
||||
"armorSpecialSpring2020MageNotes": "If you can't resist stomping through the leavings of rainstorms, this armor is for you! Turn a childish impulse into a display of mystic artistry. Increases Intelligence by <%= int %>. Limited Edition 2020 Spring Gear.",
|
||||
"armorSpecialSpring2020HealerText": "Protective Petals",
|
||||
"armorSpecialSpring2020HealerNotes": "Wrap yourself in soft iris leaves and petals to fool enemies into underestimating your healing power. Increases Constitution by <%= con %>. Limited Edition 2020 Spring Gear.",
|
||||
|
||||
"armorMystery201402Text": "Messenger Robes",
|
||||
"armorMystery201402Notes": "Shimmering and strong, these robes have many pockets to carry letters. Confers no benefit. February 2014 Subscriber Item.",
|
||||
"armorMystery201403Text": "Forest Walker Armor",
|
||||
@@ -1361,6 +1379,15 @@
|
||||
"headSpecialWinter2020HealerText": "Star Anise Emblem",
|
||||
"headSpecialWinter2020HealerNotes": "Please remove it from your head before attempting to brew chai or coffee with it. Increases Intelligence by <%= int %>. Limited Edition 2019-2020 Winter Gear.",
|
||||
|
||||
"headSpecialSpring2020RogueText": "Lapis Kabuto",
|
||||
"headSpecialSpring2020RogueNotes": "So vibrant and valuable, you'll be tempted to steal it off your own head. Increases Perception by <%= per %>. Limited Edition 2020 Spring Gear.",
|
||||
"headSpecialSpring2020WarriorText": "Beetle Helm",
|
||||
"headSpecialSpring2020WarriorNotes": "Your enemies' blows will glance off this beetle-inspired helm! Increases Strength by <%= str %>. Limited Edition 2020 Spring Gear.",
|
||||
"headSpecialSpring2020MageText": "Drip Top Cap",
|
||||
"headSpecialSpring2020MageNotes": "Is the sky clear? Humidity low? Don't worry, we've got you. Moisten your magic without dampening your spirits! Increases Perception by <%= per %>. Limited Edition 2020 Spring Gear.",
|
||||
"headSpecialSpring2020HealerText": "Iris Fascinator",
|
||||
"headSpecialSpring2020HealerNotes": "Beguile your foes with this headpiece made of flowers! Increases Intelligence by <%= int %>. Limited Edition 2020 Spring Gear.",
|
||||
|
||||
"headSpecialGaymerxText": "Rainbow Warrior Helm",
|
||||
"headSpecialGaymerxNotes": "In celebration of the GaymerX Conference, this special helmet is decorated with a radiant, colorful rainbow pattern! GaymerX is a game convention celebrating LGTBQ and gaming and is open to everyone.",
|
||||
|
||||
@@ -1814,6 +1841,11 @@
|
||||
"shieldSpecialWinter2020HealerText": "Giant Cinnamon Stick",
|
||||
"shieldSpecialWinter2020HealerNotes": "Do you feel you are too good for this world, too pure? Only this beauty of a spice will do. Increases Constitution by <%= con %>. Limited Edition 2019-2020 Winter Gear.",
|
||||
|
||||
"shieldSpecialSpring2020WarriorText": "Iridescent Shield",
|
||||
"shieldSpecialSpring2020WarriorNotes": "Don't let the delicate colors fool you. This shield has got you covered! Increases Constitution by <%= con %>. Limited Edition 2020 Spring Gear.",
|
||||
"shieldSpecialSpring2020HealerText": "Perfumed Shield",
|
||||
"shieldSpecialSpring2020HealerNotes": "Ward off those musty old To-Dos with this sweet-smelling shield. Increases Constitution by <%= con %>. Limited Edition 2020 Spring Gear.",
|
||||
|
||||
"shieldMystery201601Text": "Resolution Slayer",
|
||||
"shieldMystery201601Notes": "This blade can be used to parry away all distractions. Confers no benefit. January 2016 Subscriber Item.",
|
||||
"shieldMystery201701Text": "Time-Freezer Shield",
|
||||
|
||||
@@ -85,45 +85,45 @@
|
||||
"scarecrowWarriorSet": "Scarecrow Warrior (Warrior)",
|
||||
"stitchWitchSet": "Stitch Witch (Mage)",
|
||||
"potionerSet": "Potioner (Healer)",
|
||||
"battleRogueSet": "Bat-tle Rogue (Rogue)",
|
||||
"battleRogueSet": "Bat-tle (Rogue)",
|
||||
"springingBunnySet": "Springing Bunny (Healer)",
|
||||
"grandMalkinSet": "Grand Malkin (Mage)",
|
||||
"cleverDogSet": "Clever Dog (Rogue)",
|
||||
"braveMouseSet": "Brave Mouse (Warrior)",
|
||||
"summer2016SharkWarriorSet": "Shark Warrior (Warrior)",
|
||||
"summer2016DolphinMageSet": "Dolphin Mage (Mage)",
|
||||
"summer2016SeahorseHealerSet": "Seahorse Healer (Healer)",
|
||||
"summer2016EelSet": "Eel Rogue (Rogue)",
|
||||
"summer2016SharkWarriorSet": "Shark (Warrior)",
|
||||
"summer2016DolphinMageSet": "Dolphin (Mage)",
|
||||
"summer2016SeahorseHealerSet": "Seahorse (Healer)",
|
||||
"summer2016EelSet": "Eel (Rogue)",
|
||||
"fall2016SwampThingSet": "Swamp Thing (Warrior)",
|
||||
"fall2016WickedSorcererSet": "Wicked Sorcerer (Mage)",
|
||||
"fall2016GorgonHealerSet": "Gorgon Healer (Healer)",
|
||||
"fall2016BlackWidowSet": "Black Widow Rogue (Rogue)",
|
||||
"fall2016GorgonHealerSet": "Gorgon (Healer)",
|
||||
"fall2016BlackWidowSet": "Black Widow (Rogue)",
|
||||
"winter2017IceHockeySet": "Ice Hockey (Warrior)",
|
||||
"winter2017WinterWolfSet": "Winter Wolf (Mage)",
|
||||
"winter2017SugarPlumSet": "Sugar Plum Healer (Healer)",
|
||||
"winter2017FrostyRogueSet": "Frosty Rogue (Rogue)",
|
||||
"spring2017FelineWarriorSet": "Feline Warrior (Warrior)",
|
||||
"winter2017SugarPlumSet": "Sugar Plum (Healer)",
|
||||
"winter2017FrostyRogueSet": "Frosty (Rogue)",
|
||||
"spring2017FelineWarriorSet": "Feline (Warrior)",
|
||||
"spring2017CanineConjurorSet": "Canine Conjuror (Mage)",
|
||||
"spring2017FloralMouseSet": "Floral Mouse (Healer)",
|
||||
"spring2017SneakyBunnySet": "Sneaky Bunny (Rogue)",
|
||||
"summer2017SandcastleWarriorSet": "Sandcastle Warrior (Warrior)",
|
||||
"summer2017WhirlpoolMageSet": "Whirlpool Mage (Mage)",
|
||||
"summer2017SandcastleWarriorSet": "Sandcastle (Warrior)",
|
||||
"summer2017WhirlpoolMageSet": "Whirlpool (Mage)",
|
||||
"summer2017SeashellSeahealerSet": "Seashell Seahealer (Healer)",
|
||||
"summer2017SeaDragonSet": "Sea Dragon (Rogue)",
|
||||
"fall2017HabitoweenSet": "Habitoween Warrior (Warrior)",
|
||||
"fall2017MasqueradeSet": "Masquerade Mage (Mage)",
|
||||
"fall2017HauntedHouseSet": "Haunted House Healer (Healer)",
|
||||
"fall2017TrickOrTreatSet": "Trick or Treat Rogue (Rogue)",
|
||||
"winter2018ConfettiSet": "Confetti Mage (Mage)",
|
||||
"winter2018GiftWrappedSet": "Gift-Wrapped Warrior (Warrior)",
|
||||
"winter2018MistletoeSet": "Mistletoe Healer (Healer)",
|
||||
"winter2018ReindeerSet": "Reindeer Rogue (Rogue)",
|
||||
"spring2018SunriseWarriorSet": "Sunrise Warrior (Warrior)",
|
||||
"spring2018TulipMageSet": "Tulip Mage (Mage)",
|
||||
"spring2018GarnetHealerSet": "Garnet Healer (Healer)",
|
||||
"spring2018DucklingRogueSet": "Duckling Rogue (Rogue)",
|
||||
"summer2018BettaFishWarriorSet": "Betta Fish Warrior (Warrior)",
|
||||
"summer2018LionfishMageSet": "Lionfish Mage (Mage)",
|
||||
"fall2017HabitoweenSet": "Habitoween (Warrior)",
|
||||
"fall2017MasqueradeSet": "Masquerade (Mage)",
|
||||
"fall2017HauntedHouseSet": "Haunted House (Healer)",
|
||||
"fall2017TrickOrTreatSet": "Trick or Treat (Rogue)",
|
||||
"winter2018ConfettiSet": "Confetti (Mage)",
|
||||
"winter2018GiftWrappedSet": "Gift-Wrapped (Warrior)",
|
||||
"winter2018MistletoeSet": "Mistletoe (Healer)",
|
||||
"winter2018ReindeerSet": "Reindeer (Rogue)",
|
||||
"spring2018SunriseWarriorSet": "Sunrise (Warrior)",
|
||||
"spring2018TulipMageSet": "Tulip (Mage)",
|
||||
"spring2018GarnetHealerSet": "Garnet (Healer)",
|
||||
"spring2018DucklingRogueSet": "Duckling (Rogue)",
|
||||
"summer2018BettaFishWarriorSet": "Betta Fish (Warrior)",
|
||||
"summer2018LionfishMageSet": "Lionfish (Mage)",
|
||||
"summer2018MerfolkMonarchSet": "Merfolk Monarch (Healer)",
|
||||
"summer2018FisherRogueSet": "Fisher-Rogue (Rogue)",
|
||||
"fall2018MinotaurWarriorSet": "Minotaur (Warrior)",
|
||||
@@ -151,6 +151,10 @@
|
||||
"winter2020CarolOfTheMageSet": "Carol of the Mage (Mage)",
|
||||
"winter2020WinterSpiceSet": "Winter Spice (Healer)",
|
||||
"winter2020LanternSet": "Lantern (Rogue)",
|
||||
"spring2020BeetleWarriorSet": "Rhinoceros Beetle (Warrior)",
|
||||
"spring2020PuddleMageSet": "Puddle (Mage)",
|
||||
"spring2020IrisHealerSet": "Iris (Healer)",
|
||||
"spring2020LapisLazuliRogueSet": "Lapis Lazuli (Rogue)",
|
||||
"eventAvailability": "Available for purchase until <%= date(locale) %>.",
|
||||
"eventAvailabilityReturning": "Available for purchase until <%= availableDate(locale) %>. This potion was last available in <%= previousDate(locale) %>.",
|
||||
"dateEndMarch": "April 30",
|
||||
@@ -159,6 +163,7 @@
|
||||
"dateEndJune": "June 14",
|
||||
"augustYYYY": "August <%= year %>",
|
||||
"decemberYYYY": "December <%= year %>",
|
||||
"marchYYYY": "March <%= year %>",
|
||||
"dateEndJuly": "July 31",
|
||||
"dateEndAugust": "August 31",
|
||||
"dateEndSeptember": "September 21",
|
||||
|
||||
@@ -271,7 +271,7 @@
|
||||
"questGroupDilatoryDistress": "Dilatory Distress",
|
||||
"questDilatoryDistress1Text": "Dilatory Distress, Part 1: Message in a Bottle",
|
||||
"questDilatoryDistress1Notes": "A message in a bottle arrived from the newly rebuilt city of Dilatory! It reads: \"Dear Habiticans, we need your help once again. Our princess has disappeared and the city is under siege by some unknown watery demons! The mantis shrimps are holding the attackers at bay. Please aid us!\" To make the long journey to the sunken city, one must be able to breathe water. Fortunately, the alchemists @Benga and @hazel can make it all possible! You only have to find the proper ingredients.",
|
||||
"questDilatoryDistress1Completion": "You don the the finned armor and swim to Dilatory as quickly as you can. The merfolk and their mantis shrimp allies have managed to keep the monsters outside the city for the moment, but they are losing. No sooner are you within the castle walls than the horrifying siege descends!",
|
||||
"questDilatoryDistress1Completion": "You don the finned armor and swim to Dilatory as quickly as you can. The merfolk and their mantis shrimp allies have managed to keep the monsters outside the city for the moment, but they are losing. No sooner are you within the castle walls than the horrifying siege descends!",
|
||||
"questDilatoryDistress1CollectFireCoral": "Fire Coral",
|
||||
"questDilatoryDistress1CollectBlueFins": "Blue Fins",
|
||||
"questDilatoryDistress1DropArmor": "Finned Oceanic Armor (Armor)",
|
||||
@@ -661,7 +661,7 @@
|
||||
|
||||
"questBadgerText": "Stop Badgering Me!",
|
||||
"questBadgerNotes": "Ah, winter in the Taskwoods. The softly falling snow, the branches sparkling with frost, the Flourishing Fairies… still not snoozing?<br><br>“Why are they still awake?” cries @LilithofAlfheim. “If they don't hibernate soon, they'll never have the energy for planting season.”<br><br>As you and @Willow the Witty hurry to investigate, a furry head pops up from the ground. Before you can yell, “It’s the Badgering Bother!” it’s back in its burrow—but not before snatching up the Fairies' “Hibernate” To-Dos and dropping a giant list of pesky tasks in their place!<br><br>“No wonder the fairies aren't resting, if they're constantly being badgered like that!” @plumilla says. Can you chase off this beast and save the Taskwood’s harvest this year?",
|
||||
"questBadgerCompletion": "You finally drive away the the Badgering Bother and hurry into its burrow. At the end of a tunnel, you find its hoard of the faeries’ “Hibernate” To-Dos. The den is otherwise abandoned, except for three eggs that look ready to hatch.",
|
||||
"questBadgerCompletion": "You finally drive away the Badgering Bother and hurry into its burrow. At the end of a tunnel, you find its hoard of the faeries’ “Hibernate” To-Dos. The den is otherwise abandoned, except for three eggs that look ready to hatch.",
|
||||
"questBadgerBoss": "The Badgering Bother",
|
||||
"questBadgerDropBadgerEgg": "Badger (Egg)",
|
||||
"questBadgerUnlockText": "Unlocks Badger Eggs for purchase in the Market",
|
||||
|
||||
@@ -39,6 +39,7 @@ export const EVENTS = {
|
||||
summer2019: { start: '2019-06-18', end: '2019-08-02' },
|
||||
fall2019: { start: '2019-09-24', end: '2019-11-02' },
|
||||
winter2020: { start: '2019-12-19', end: '2020-02-02' },
|
||||
spring2020: { start: '2019-03-17', end: '2020-05-02' },
|
||||
};
|
||||
|
||||
export const SEASONAL_SETS = {
|
||||
@@ -121,6 +122,13 @@ export const SEASONAL_SETS = {
|
||||
'spring2019OrchidWarriorSet',
|
||||
'spring2019CloudRogueSet',
|
||||
'spring2019RobinHealerSet',
|
||||
|
||||
// spring 2020
|
||||
|
||||
'spring2020BeetleWarriorSet',
|
||||
'spring2020IrisHealerSet',
|
||||
'spring2020LapisLazuliRogueSet',
|
||||
'spring2020PuddleMageSet',
|
||||
],
|
||||
summer: [
|
||||
// summer 2014
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import moment from 'moment';
|
||||
import {
|
||||
EVENTS,
|
||||
} from '../../../constants';
|
||||
@@ -8,7 +9,7 @@ import * as takeThisGear from './special-takeThis';
|
||||
import * as wonderconGear from './special-wondercon';
|
||||
import t from '../../../translation';
|
||||
|
||||
const CURRENT_SEASON = 'winter';
|
||||
const CURRENT_SEASON = moment().isBetween('2020-03-17', '2020-05-02') ? 'spring' : '_NONE_';
|
||||
|
||||
const armor = {
|
||||
0: backerGear.armorSpecial0,
|
||||
@@ -1002,6 +1003,7 @@ const armor = {
|
||||
notes: t('armorSpecialSpring2019RogueNotes', { per: 15 }),
|
||||
value: 90,
|
||||
per: 15,
|
||||
canBuy: () => CURRENT_SEASON === 'spring',
|
||||
},
|
||||
spring2019Warrior: {
|
||||
event: EVENTS.spring2019,
|
||||
@@ -1011,6 +1013,7 @@ const armor = {
|
||||
notes: t('armorSpecialSpring2019WarriorNotes', { con: 9 }),
|
||||
value: 90,
|
||||
con: 9,
|
||||
canBuy: () => CURRENT_SEASON === 'spring',
|
||||
},
|
||||
spring2019Mage: {
|
||||
event: EVENTS.spring2019,
|
||||
@@ -1020,6 +1023,7 @@ const armor = {
|
||||
notes: t('armorSpecialSpring2019MageNotes', { int: 9 }),
|
||||
value: 90,
|
||||
int: 9,
|
||||
canBuy: () => CURRENT_SEASON === 'spring',
|
||||
},
|
||||
spring2019Healer: {
|
||||
event: EVENTS.spring2019,
|
||||
@@ -1029,6 +1033,7 @@ const armor = {
|
||||
notes: t('armorSpecialSpring2019HealerNotes', { con: 15 }),
|
||||
value: 90,
|
||||
con: 15,
|
||||
canBuy: () => CURRENT_SEASON === 'spring',
|
||||
},
|
||||
summer2019Rogue: {
|
||||
event: EVENTS.summer2019,
|
||||
@@ -1151,6 +1156,42 @@ const armor = {
|
||||
value: 0,
|
||||
canOwn: ownsItem('armor_special_birthday2020'),
|
||||
},
|
||||
spring2020Rogue: {
|
||||
event: EVENTS.spring2020,
|
||||
specialClass: 'rogue',
|
||||
set: 'spring2020LapisLazuliRogueSet',
|
||||
text: t('armorSpecialSpring2020RogueText'),
|
||||
notes: t('armorSpecialSpring2020RogueNotes', { per: 15 }),
|
||||
value: 90,
|
||||
per: 15,
|
||||
},
|
||||
spring2020Warrior: {
|
||||
event: EVENTS.spring2020,
|
||||
specialClass: 'warrior',
|
||||
set: 'spring2020BeetleWarriorSet',
|
||||
text: t('armorSpecialSpring2020WarriorText'),
|
||||
notes: t('armorSpecialSpring2020WarriorNotes', { con: 9 }),
|
||||
value: 90,
|
||||
con: 9,
|
||||
},
|
||||
spring2020Mage: {
|
||||
event: EVENTS.spring2020,
|
||||
specialClass: 'wizard',
|
||||
set: 'spring2020PuddleMageSet',
|
||||
text: t('armorSpecialSpring2020MageText'),
|
||||
notes: t('armorSpecialSpring2020MageNotes', { int: 9 }),
|
||||
value: 90,
|
||||
int: 9,
|
||||
},
|
||||
spring2020Healer: {
|
||||
event: EVENTS.spring2020,
|
||||
specialClass: 'healer',
|
||||
set: 'spring2020IrisHealerSet',
|
||||
text: t('armorSpecialSpring2020HealerText'),
|
||||
notes: t('armorSpecialSpring2020HealerNotes', { con: 15 }),
|
||||
value: 90,
|
||||
con: 15,
|
||||
},
|
||||
};
|
||||
|
||||
const back = {
|
||||
@@ -2477,6 +2518,7 @@ const head = {
|
||||
notes: t('headSpecialSpring2019RogueNotes', { per: 9 }),
|
||||
value: 60,
|
||||
per: 9,
|
||||
canBuy: () => CURRENT_SEASON === 'spring',
|
||||
},
|
||||
spring2019Warrior: {
|
||||
event: EVENTS.spring2019,
|
||||
@@ -2486,6 +2528,7 @@ const head = {
|
||||
notes: t('headSpecialSpring2019WarriorNotes', { str: 9 }),
|
||||
value: 60,
|
||||
str: 9,
|
||||
canBuy: () => CURRENT_SEASON === 'spring',
|
||||
},
|
||||
spring2019Mage: {
|
||||
event: EVENTS.spring2019,
|
||||
@@ -2495,6 +2538,7 @@ const head = {
|
||||
notes: t('headSpecialSpring2019MageNotes', { per: 7 }),
|
||||
value: 60,
|
||||
per: 7,
|
||||
canBuy: () => CURRENT_SEASON === 'spring',
|
||||
},
|
||||
spring2019Healer: {
|
||||
event: EVENTS.spring2019,
|
||||
@@ -2504,6 +2548,7 @@ const head = {
|
||||
notes: t('headSpecialSpring2019HealerNotes', { int: 7 }),
|
||||
value: 60,
|
||||
int: 7,
|
||||
canBuy: () => CURRENT_SEASON === 'spring',
|
||||
},
|
||||
summer2019Rogue: {
|
||||
event: EVENTS.summer2019,
|
||||
@@ -2626,6 +2671,42 @@ const head = {
|
||||
value: 0,
|
||||
canOwn: ownsItem('head_special_nye2019'),
|
||||
},
|
||||
spring2020Rogue: {
|
||||
event: EVENTS.spring2020,
|
||||
specialClass: 'rogue',
|
||||
set: 'spring2020LapisLazuliRogueSet',
|
||||
text: t('headSpecialSpring2020RogueText'),
|
||||
notes: t('headSpecialSpring2020RogueNotes', { per: 9 }),
|
||||
value: 60,
|
||||
per: 9,
|
||||
},
|
||||
spring2020Warrior: {
|
||||
event: EVENTS.spring2020,
|
||||
specialClass: 'warrior',
|
||||
set: 'spring2020BeetleWarriorSet',
|
||||
text: t('headSpecialSpring2020WarriorText'),
|
||||
notes: t('headSpecialSpring2020WarriorNotes', { str: 9 }),
|
||||
value: 60,
|
||||
str: 9,
|
||||
},
|
||||
spring2020Mage: {
|
||||
event: EVENTS.spring2020,
|
||||
specialClass: 'wizard',
|
||||
set: 'spring2020PuddleMageSet',
|
||||
text: t('headSpecialSpring2020MageText'),
|
||||
notes: t('headSpecialSpring2020MageNotes', { per: 7 }),
|
||||
value: 60,
|
||||
per: 7,
|
||||
},
|
||||
spring2020Healer: {
|
||||
event: EVENTS.spring2020,
|
||||
specialClass: 'healer',
|
||||
set: 'spring2020IrisHealerSet',
|
||||
text: t('headSpecialSpring2020HealerText'),
|
||||
notes: t('headSpecialSpring2020HealerNotes', { int: 7 }),
|
||||
value: 60,
|
||||
int: 7,
|
||||
},
|
||||
};
|
||||
|
||||
const headAccessory = {
|
||||
@@ -3593,6 +3674,7 @@ const shield = {
|
||||
notes: t('weaponSpecialSpring2019RogueNotes', { str: 8 }),
|
||||
value: 80,
|
||||
str: 8,
|
||||
canBuy: () => CURRENT_SEASON === 'spring',
|
||||
},
|
||||
spring2019Warrior: {
|
||||
event: EVENTS.spring2019,
|
||||
@@ -3602,6 +3684,7 @@ const shield = {
|
||||
notes: t('shieldSpecialSpring2019WarriorNotes', { con: 7 }),
|
||||
value: 70,
|
||||
con: 7,
|
||||
canBuy: () => CURRENT_SEASON === 'spring',
|
||||
},
|
||||
spring2019Healer: {
|
||||
event: EVENTS.spring2019,
|
||||
@@ -3611,6 +3694,7 @@ const shield = {
|
||||
notes: t('shieldSpecialSpring2019HealerNotes', { con: 9 }),
|
||||
value: 70,
|
||||
con: 9,
|
||||
canBuy: () => CURRENT_SEASON === 'spring',
|
||||
},
|
||||
summer2019Rogue: {
|
||||
event: EVENTS.summer2019,
|
||||
@@ -3709,6 +3793,33 @@ const shield = {
|
||||
value: 70,
|
||||
con: 9,
|
||||
},
|
||||
spring2020Rogue: {
|
||||
event: EVENTS.spring2020,
|
||||
specialClass: 'rogue',
|
||||
set: 'spring2020LapisLazuliRogueSet',
|
||||
text: t('weaponSpecialSpring2020RogueText'),
|
||||
notes: t('weaponSpecialSpring2020RogueNotes', { str: 8 }),
|
||||
value: 80,
|
||||
str: 8,
|
||||
},
|
||||
spring2020Warrior: {
|
||||
event: EVENTS.spring2020,
|
||||
specialClass: 'warrior',
|
||||
set: 'spring2020BeetleWarriorSet',
|
||||
text: t('shieldSpecialSpring2020WarriorText'),
|
||||
notes: t('shieldSpecialSpring2020WarriorNotes', { con: 7 }),
|
||||
value: 70,
|
||||
con: 7,
|
||||
},
|
||||
spring2020Healer: {
|
||||
event: EVENTS.spring2020,
|
||||
specialClass: 'healer',
|
||||
set: 'spring2020IrisHealerSet',
|
||||
text: t('shieldSpecialSpring2020HealerText'),
|
||||
notes: t('shieldSpecialSpring2020HealerNotes', { con: 9 }),
|
||||
value: 70,
|
||||
con: 9,
|
||||
},
|
||||
};
|
||||
|
||||
const weapon = {
|
||||
@@ -4702,6 +4813,7 @@ const weapon = {
|
||||
notes: t('weaponSpecialSpring2019RogueNotes', { str: 8 }),
|
||||
value: 80,
|
||||
str: 8,
|
||||
canBuy: () => CURRENT_SEASON === 'spring',
|
||||
},
|
||||
spring2019Warrior: {
|
||||
event: EVENTS.spring2019,
|
||||
@@ -4711,6 +4823,7 @@ const weapon = {
|
||||
notes: t('weaponSpecialSpring2019WarriorNotes', { str: 15 }),
|
||||
value: 90,
|
||||
str: 15,
|
||||
canBuy: () => CURRENT_SEASON === 'spring',
|
||||
},
|
||||
spring2019Mage: {
|
||||
event: EVENTS.spring2019,
|
||||
@@ -4722,6 +4835,7 @@ const weapon = {
|
||||
value: 160,
|
||||
int: 15,
|
||||
per: 7,
|
||||
canBuy: () => CURRENT_SEASON === 'spring',
|
||||
},
|
||||
spring2019Healer: {
|
||||
event: EVENTS.spring2019,
|
||||
@@ -4731,6 +4845,7 @@ const weapon = {
|
||||
notes: t('weaponSpecialSpring2019HealerNotes', { int: 9 }),
|
||||
value: 90,
|
||||
int: 9,
|
||||
canBuy: () => CURRENT_SEASON === 'spring',
|
||||
},
|
||||
summer2019Rogue: {
|
||||
event: EVENTS.summer2019,
|
||||
@@ -4851,6 +4966,44 @@ const weapon = {
|
||||
value: 90,
|
||||
int: 9,
|
||||
},
|
||||
spring2020Rogue: {
|
||||
event: EVENTS.spring2020,
|
||||
specialClass: 'rogue',
|
||||
set: 'spring2020LapisLazuliRogueSet',
|
||||
text: t('weaponSpecialSpring2020RogueText'),
|
||||
notes: t('weaponSpecialSpring2020RogueNotes', { str: 8 }),
|
||||
value: 80,
|
||||
str: 8,
|
||||
},
|
||||
spring2020Warrior: {
|
||||
event: EVENTS.spring2020,
|
||||
specialClass: 'warrior',
|
||||
set: 'spring2020BeetleWarriorSet',
|
||||
text: t('weaponSpecialSpring2020WarriorText'),
|
||||
notes: t('weaponSpecialSpring2020WarriorNotes', { str: 15 }),
|
||||
value: 90,
|
||||
str: 15,
|
||||
},
|
||||
spring2020Mage: {
|
||||
event: EVENTS.spring2020,
|
||||
specialClass: 'wizard',
|
||||
set: 'spring2020PuddleMageSet',
|
||||
twoHanded: true,
|
||||
text: t('weaponSpecialSpring2020MageText'),
|
||||
notes: t('weaponSpecialSpring2020MageNotes', { int: 15, per: 7 }),
|
||||
value: 160,
|
||||
int: 15,
|
||||
per: 7,
|
||||
},
|
||||
spring2020Healer: {
|
||||
event: EVENTS.spring2020,
|
||||
specialClass: 'healer',
|
||||
set: 'spring2020IrisHealerSet',
|
||||
text: t('weaponSpecialSpring2020HealerText'),
|
||||
notes: t('weaponSpecialSpring2020HealerNotes', { int: 9 }),
|
||||
value: 90,
|
||||
int: 9,
|
||||
},
|
||||
};
|
||||
|
||||
export {
|
||||
|
||||
@@ -70,6 +70,13 @@ const premium = {
|
||||
value: 2,
|
||||
text: t('hatchingPotionShimmer'),
|
||||
limited: true,
|
||||
_addlNotes: t('eventAvailabilityReturning', {
|
||||
availableDate: t('dateEndMarch'),
|
||||
previousDate: t('marchYYYY', { year: 2018 }),
|
||||
}),
|
||||
canBuy () {
|
||||
return moment().isBefore('2020-05-02');
|
||||
},
|
||||
},
|
||||
Fairy: {
|
||||
value: 2,
|
||||
@@ -198,6 +205,13 @@ const premium = {
|
||||
value: 2,
|
||||
text: t('hatchingPotionCelestial'),
|
||||
limited: true,
|
||||
_addlNotes: t('eventAvailabilityReturning', {
|
||||
availableDate: t('dateEndMarch'),
|
||||
previousDate: t('marchYYYY', { year: 2019 }),
|
||||
}),
|
||||
canBuy () {
|
||||
return moment().isBefore('2020-05-02');
|
||||
},
|
||||
},
|
||||
Sunshine: {
|
||||
value: 2,
|
||||
@@ -253,6 +267,17 @@ const premium = {
|
||||
canBuy: hasQuestAchievementFunction('ruby'),
|
||||
_addlNotes: t('premiumPotionUnlimitedNotes'),
|
||||
},
|
||||
BirchBark: {
|
||||
value: 2,
|
||||
text: t('hatchingPotionBirchBark'),
|
||||
limited: true,
|
||||
canBuy () {
|
||||
return moment().isBefore('2020-05-02');
|
||||
},
|
||||
_addlNotes: t('premiumPotionAddlNotes', {
|
||||
date: t('dateEndMarch'),
|
||||
}),
|
||||
},
|
||||
};
|
||||
|
||||
const wacky = {
|
||||
|
||||
@@ -5,6 +5,26 @@ import moment from 'moment';
|
||||
// path: 'premiumHatchingPotions.Rainbow',
|
||||
const featuredItems = {
|
||||
market () {
|
||||
if (moment().isBefore('2020-05-02')) {
|
||||
return [
|
||||
{
|
||||
type: 'armoire',
|
||||
path: 'armoire',
|
||||
},
|
||||
{
|
||||
type: 'premiumHatchingPotion',
|
||||
path: 'premiumHatchingPotions.BirchBark',
|
||||
},
|
||||
{
|
||||
type: 'premiumHatchingPotion',
|
||||
path: 'premiumHatchingPotions.Shimmer',
|
||||
},
|
||||
{
|
||||
type: 'premiumHatchingPotion',
|
||||
path: 'premiumHatchingPotions.Celestial',
|
||||
},
|
||||
];
|
||||
}
|
||||
return [
|
||||
{
|
||||
type: 'armoire',
|
||||
@@ -56,7 +76,7 @@ const featuredItems = {
|
||||
},
|
||||
];
|
||||
},
|
||||
seasonal: 'winter2019Warrior',
|
||||
seasonal: 'spring2019Rogue',
|
||||
timeTravelers: [
|
||||
// TODO
|
||||
],
|
||||
|
||||
@@ -1,16 +1,21 @@
|
||||
// import { SEASONAL_SETS } from '../content/constants';
|
||||
import { SEASONAL_SETS } from '../content/constants';
|
||||
|
||||
export default {
|
||||
opened: false,
|
||||
opened: true,
|
||||
|
||||
currentSeason: 'Closed',
|
||||
currentSeason: 'Spring',
|
||||
|
||||
dateRange: { start: '2019-09-24', end: '2019-10-31' },
|
||||
dateRange: { start: '2020-03-19', end: '2020-04-30' },
|
||||
|
||||
availableSets: [
|
||||
...SEASONAL_SETS.spring,
|
||||
],
|
||||
|
||||
pinnedSets: {
|
||||
healer: 'spring2020IrisHealerSet',
|
||||
rogue: 'spring2020LapisLazuliRogueSet',
|
||||
warrior: 'spring2020BeetleWarriorSet',
|
||||
wizard: 'spring2020PuddleMageSet',
|
||||
},
|
||||
|
||||
availableSpells: [
|
||||
@@ -19,5 +24,5 @@ export default {
|
||||
availableQuests: [
|
||||
],
|
||||
|
||||
featuredSet: 'fall2018AlterEgoSet',
|
||||
featuredSet: 'spring2020PuddleMageSet',
|
||||
};
|
||||
|
||||
|
After Width: | Height: | Size: 861 B |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 988 B |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 656 B |
|
After Width: | Height: | Size: 393 B |
|
After Width: | Height: | Size: 716 B |
|
After Width: | Height: | Size: 589 B |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 850 B |
|
After Width: | Height: | Size: 684 B |
|
After Width: | Height: | Size: 689 B |
|
After Width: | Height: | Size: 804 B |
|
After Width: | Height: | Size: 899 B |
|
After Width: | Height: | Size: 704 B |
|
After Width: | Height: | Size: 446 B |
|
After Width: | Height: | Size: 349 B |
|
After Width: | Height: | Size: 456 B |
|
After Width: | Height: | Size: 547 B |
|
After Width: | Height: | Size: 622 B |
|
After Width: | Height: | Size: 373 B |
|
After Width: | Height: | Size: 494 B |
|
After Width: | Height: | Size: 803 B |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 976 B |
|
After Width: | Height: | Size: 877 B |
|
After Width: | Height: | Size: 991 B |
|
After Width: | Height: | Size: 415 B |
|
After Width: | Height: | Size: 788 B |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 6.5 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 2.0 KiB |