Compare commits

..

60 Commits

Author SHA1 Message Date
SabreCat 167e6b2bf1 5.15.1 2024-01-04 14:33:04 -06:00
SabreCat 9b54e4d80a fix(backgrounds): correct index of bbash 2024-01-04 14:32:47 -06:00
SabreCat 987a27ffa1 5.15.0 2023-12-29 16:07:57 -06:00
SabreCat 7fb1c9db8c Squashed commit of the following:
commit 5b2f90356b
Author: SabreCat <sabrecat@gmail.com>
Date:   Fri Dec 15 16:19:02 2023 -0600

    fix(migration): full URL

commit a2962c0d10
Author: SabreCat <sabrecat@gmail.com>
Date:   Fri Dec 15 15:57:21 2023 -0600

    feat(migration): add birthday notif

commit 9da8e39dd0
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Fri Dec 15 12:32:25 2023 -0500

    feat(script): awards 2024 Habitica birthday robes

commit 7de6b80ee6
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Thu Dec 14 13:11:07 2023 -0500

    feat(content): add Habitica birthday item

commit 1bb95f5867
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Thu Dec 14 11:43:12 2023 -0500

    fix(dates): fix availability dates to canonical

commit 8e7f49f253
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Thu Dec 14 11:37:44 2023 -0500

    feat(content): make 2024 default backgroumd, fix errors

commit acc30f044e
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Wed Dec 13 16:53:33 2023 -0500

    feat(content): the rest of the January content

commit 6a5e45c6d0
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Wed Dec 13 16:49:33 2023 -0500

    feat(content): January content
2023-12-29 16:07:43 -06:00
SabreCat f66b05f707 fix(potions): use normal release date notes 2023-12-29 15:57:46 -06:00
SabreCat f8ba191eea fix(gala): correct seasonal shop quests/spell 2023-12-19 10:07:32 -06:00
SabreCat a03d265cd3 5.14.2 2023-12-18 15:51:02 -06:00
SabreCat 0dbd597d0b Squashed commit of the following:
commit d03bdee783deff98ee24cc211f1498525bf36c70
Merge: b31ba93233 70f5aa1f55
Author: SabreCat <sabe@habitica.com>
Date:   Mon Dec 18 15:47:29 2023 -0600

    Merge branch 'release' into sabrecat/group-task-fixes

commit b31ba93233
Author: SabreCat <sabe@habitica.com>
Date:   Tue Oct 10 12:02:41 2023 -0500

    fix(groups): missing dot path step
    Also sync assignments on unassign as well as assign

commit 8012f0294d
Author: SabreCat <sabe@habitica.com>
Date:   Tue Oct 10 11:47:59 2023 -0500

    fix(groups): use assigned keys as source of truth

commit 616b1e1486
Author: SabreCat <sabe@habitica.com>
Date:   Tue Oct 10 11:33:28 2023 -0500

    fix(groups): clean up groups to copy tasks
    Fixes #14916
2023-12-18 15:50:58 -06:00
SabreCat b97f85fa60 5.14.1 2023-12-18 07:25:01 -06:00
SabreCat 0a06fe6d2e fix(css): white g1g1 text in buy-gems 2023-12-18 07:24:42 -06:00
SabreCat 70f5aa1f55 5.14.0 2023-12-17 19:44:18 -06:00
SabreCat 5a384d8d16 chore(subproj): update habitica-images 2023-12-17 19:37:32 -06:00
SabreCat 4fea87af8a Squashed commit of the following:
commit 0e20f421645beaf231dd607b1c1d8db62e5804e4
Author: SabreCat <sabrecat@gmail.com>
Date:   Thu Dec 14 15:40:22 2023 -0600

    fix(g1g1): don't break modal off promo season

commit ca5436d05044d256303e9c5dcdf358b64467ae66
Author: SabreCat <sabe@habitica.com>
Date:   Tue Nov 28 20:42:55 2023 -0600

    fix(lint): move import

commit 08f58318da1a06c2d94227afd3224a5571990bac
Author: SabreCat <sabe@habitica.com>
Date:   Tue Nov 28 20:26:14 2023 -0600

    fix(vue): parenthesis

commit 8701ee330365ad0615b2179b801f8e15c3109bdd
Author: SabreCat <sabe@habitica.com>
Date:   Tue Nov 28 20:09:30 2023 -0600

    fix(g1g1): dynamically display end dates
2023-12-17 19:36:45 -06:00
SabreCat 8a45f753ca Merge branch '2023-winner-funderlamb' into release
by @CuriousMagpie
2023-12-17 19:36:15 -06:00
negue 19253cd9b5 Remove Storybook files and packages (#15040) 2023-12-13 20:18:13 +01:00
Natalie eac5e58ac7 (fix): add quest modal text horizontal padding (#15053) 2023-12-11 16:55:24 -06:00
SabreCat 3eee1a572e Merge branch 'release' into develop 2023-12-07 16:16:25 -06:00
SabreCat f572aa442e fix(lint): merge #14942 2023-12-07 16:15:53 -06:00
SabreCat 101be5d6a6 5.13.2 2023-12-06 13:36:08 -06:00
SabreCat 1c9c9908c5 fix(dev): use working version of MongoDB on run-rs
https://github.com/vkarpov15/run-rs/issues/47
2023-12-06 13:22:11 -06:00
Phillip Thelen 916cb03a3a automatic lint fixes (#14942)
* automatic lint fixes

* rerun lint

---------

Co-authored-by: negue <eugen.bolz@gmail.com>
2023-12-04 20:37:05 +01:00
SabreCat bb095ae296 5.13.1 2023-12-01 16:44:47 -06:00
SabreCat 97c63e2be7 fix(faq): correct duped index 2023-12-01 16:44:40 -06:00
SabreCat b7c6ded375 5.13.0 2023-11-28 15:08:17 -06:00
Natalie 8db8a8267b feat(content): December 2023 Content (#15023)
* feat(content): add December subscriber items, backgrounds, and enchanted armoire

* feat(content): correct item slot for armoire, change release dates for testing

* fix(backgrounds): correct start date

* fix(armoire): Add canonical start date

* fix(test): only count released items

---------

Co-authored-by: Sabe Jones <sabrecat@gmail.com>
Co-authored-by: SabreCat <sabe@habitica.com>
2023-11-28 15:01:27 -06:00
SabreCat 4b9a5472bd 5.12.2 2023-11-22 15:35:41 -06:00
SabreCat a374add2eb Squashed commit of the following:
commit f1cf5ea5831c24059f3a18f7d0888d30eb0efbc1
Author: SabreCat <sabe@habitica.com>
Date:   Fri Nov 3 16:53:13 2023 -0500

    fix(market): show selected class correctly
2023-11-22 15:35:12 -06:00
SabreCat 592c178544 Squashed commit of the following:
commit 0928372c649ebc8d298b72692e0accca4e912637
Author: SabreCat <sabe@habitica.com>
Date:   Tue Nov 21 15:02:53 2023 -0600

    fix(news): center images
2023-11-22 15:34:46 -06:00
Natalie ed907c1ae5 fix(dates): upgrade dynamic end dating for quest bundle endings (#15015)
* fix(quest text): Updated end date for Oddballs to November 30.

* fix(dates): remove hard-coded bundle end-dates

* fix(dates): add dynamic dating to end of quest bundles

* fix(dates): commas are important

* fix(dates): November only has 30 days

* fix(dates): upgrade dynamic end dating for quest bundle endings
2023-11-22 15:28:23 -06:00
Natalie 021825ebb9 fix(shop): add November magic hatching potions to featured items in shop (#15014) 2023-11-22 15:14:42 -06:00
SabreCat 45aae7ff62 fix(test): challenge unlink issues 2023-11-16 13:45:18 -06:00
SabreCat 47bd890dd7 5.12.1 2023-11-14 15:49:32 -06:00
Natalie add435d4f7 fix(dates) remove hard-coded end dates on bundles (#15011)
* fix(quest text): Updated end date for Oddballs to November 30.

* fix(dates): remove hard-coded bundle end-dates
2023-11-14 15:48:59 -06:00
SabreCat d262a16269 Merge branch 'release' into develop 2023-11-13 14:37:49 -06:00
Weblate aeef31d0d4 Merge branch 'develop' of github.com:HabitRPG/habitica into develop 2023-11-10 15:33:28 +01:00
SabreCat 5717e58613 Merge branch 'develop' into release 2023-11-07 08:59:53 -06:00
SabreCat 535477b804 5.12.0 2023-11-07 08:57:35 -06:00
Natalie a80ef78be0 2023 November Content Prebuild (#14954)
* feat(content): October sub items

* feat(content): October bgs and armoire

* feat(content): add Dune Buddy achievement

* feat(releases): timed Backgrounds and Armoire

* feat(content): timed release achievement

* feat(content): November subscriber items

* feat(content): November pet quest bundle

* feat(content): November magic hatching potions

* feat(content): November backgrounds and armoire

* feat(content): new achievement code -- needs work

* update package.lock on local/origin repos

* fix(content): added October headgear info and November set name

* fix(typo): spelling is important

* feat(content): added logic to allow for pets & mounts to be in one achievement and fixed issues with image

* fix(armoire): correct month

* fix(armoire): deprecate armoireEmpty flag

---------

Co-authored-by: SabreCat <sabe@habitica.com>
Co-authored-by: Sabe Jones <sabrecat@gmail.com>
2023-11-07 08:55:50 -06:00
Nazar Paruna f119304d9e Translated using Weblate (Ukrainian)
Currently translated at 82.4% (113 of 137 strings)

Translation: Habitica/Faq
Translate-URL: https://translate.habitica.com/projects/habitica/faq/uk/
2023-11-04 18:15:42 +01:00
Zachary Flower cb168338ee Calculate background visibility, even if the task list is empty (#14870) 2023-11-03 15:58:58 -05:00
Phillip Thelen 1892d6288a Clean up translations (#14985) 2023-11-03 15:54:48 -05:00
Weblate 1aa81d1440 Added translation using Weblate (Chinese (Simplified) (zh_HK))
Added translation using Weblate (tl_PH (generated) (tl_PH))

Added translation using Weblate (no (generated) (no))

Added translation using Weblate (hi_IN (generated) (hi_IN))

Added translation using Weblate (fa_IR (generated) (fa_IR))

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (226 of 226 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (424 of 424 strings)

Translated using Weblate (Ukrainian)

Currently translated at 53.9% (1598 of 2961 strings)

Translated using Weblate (Ukrainian)

Currently translated at 79.5% (109 of 137 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (764 of 764 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Ukrainian)

Currently translated at 65.6% (90 of 137 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (13 of 13 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Ukrainian)

Currently translated at 53.3% (1579 of 2961 strings)

Translated using Weblate (Russian)

Currently translated at 98.3% (2911 of 2961 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (239 of 239 strings)

Translated using Weblate (Ukrainian)

Currently translated at 60.5% (83 of 137 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (764 of 764 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (158 of 158 strings)

Translated using Weblate (Ukrainian)

Currently translated at 57.6% (79 of 137 strings)

Added translation using Weblate (Chinese (Simplified) (zh_HK))

Added translation using Weblate (tl_PH (generated) (tl_PH))

Added translation using Weblate (no (generated) (no))

Added translation using Weblate (hi_IN (generated) (hi_IN))

Added translation using Weblate (fa_IR (generated) (fa_IR))

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (226 of 226 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (424 of 424 strings)

Translated using Weblate (Ukrainian)

Currently translated at 53.3% (1579 of 2961 strings)

Translated using Weblate (Ukrainian)

Currently translated at 56.9% (78 of 137 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (189 of 189 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (256 of 256 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (226 of 226 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (13 of 13 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (424 of 424 strings)

Translated using Weblate (Ukrainian)

Currently translated at 53.0% (1570 of 2961 strings)

Translated using Weblate (Dutch)

Currently translated at 84.1% (2492 of 2961 strings)

Translated using Weblate (Ukrainian)

Currently translated at 39.4% (54 of 137 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (764 of 764 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (189 of 189 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (158 of 158 strings)

Translated using Weblate (Ukrainian)

Currently translated at 89.0% (228 of 256 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (113 of 113 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (279 of 279 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (108 of 108 strings)

Translated using Weblate (Ukrainian)

Currently translated at 89.0% (228 of 256 strings)

Translated using Weblate (Dutch)

Currently translated at 96.2% (152 of 158 strings)

Translated using Weblate (Galician)

Currently translated at 100.0% (424 of 424 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (424 of 424 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (151 of 151 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (764 of 764 strings)

Translated using Weblate (Spanish)

Currently translated at 96.2% (152 of 158 strings)

Translated using Weblate (French)

Currently translated at 100.0% (256 of 256 strings)

Translated using Weblate (French)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (French)

Currently translated at 100.0% (113 of 113 strings)

Translated using Weblate (French)

Currently translated at 100.0% (279 of 279 strings)

Translated using Weblate (French)

Currently translated at 100.0% (239 of 239 strings)

Translated using Weblate (French)

Currently translated at 100.0% (764 of 764 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 56.0% (51 of 91 strings)

Translated using Weblate (French)

Currently translated at 78.5% (201 of 256 strings)

Translated using Weblate (French)

Currently translated at 99.2% (139 of 140 strings)

Translated using Weblate (French)

Currently translated at 100.0% (151 of 151 strings)

Translated using Weblate (French)

Currently translated at 100.0% (151 of 151 strings)

Translated using Weblate (French)

Currently translated at 100.0% (151 of 151 strings)

Translated using Weblate (Korean)

Currently translated at 72.1% (114 of 158 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 42.8% (39 of 91 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 98.4% (186 of 189 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 91.7% (145 of 158 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 64.8% (166 of 256 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.4% (2878 of 2953 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (376 of 376 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (225 of 225 strings)

Translated using Weblate (Ukrainian)

Currently translated at 98.8% (419 of 424 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.3% (150 of 151 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.4% (760 of 764 strings)

Translated using Weblate (Ukrainian)

Currently translated at 86.7% (222 of 256 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (225 of 225 strings)

Translated using Weblate (Ukrainian)

Currently translated at 95.5% (108 of 113 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (61 of 61 strings)

Translated using Weblate (Ukrainian)

Currently translated at 98.8% (419 of 424 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (239 of 239 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (182 of 182 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (151 of 151 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (189 of 189 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (819 of 819 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (158 of 158 strings)

Translated using Weblate (Galician)

Currently translated at 100.0% (158 of 158 strings)

Translated using Weblate (Galician)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Galician)

Currently translated at 100.0% (113 of 113 strings)

Translated using Weblate (Galician)

Currently translated at 100.0% (182 of 182 strings)

Translated using Weblate (Galician)

Currently translated at 100.0% (279 of 279 strings)

Translated using Weblate (Galician)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (Galician)

Currently translated at 100.0% (61 of 61 strings)

Translated using Weblate (French)

Currently translated at 100.0% (61 of 61 strings)

Translated using Weblate (French)

Currently translated at 100.0% (182 of 182 strings)

Translated using Weblate (French)

Currently translated at 100.0% (189 of 189 strings)

Translated using Weblate (French)

Currently translated at 100.0% (158 of 158 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (113 of 113 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (Russian)

Currently translated at 98.8% (419 of 424 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.4% (2878 of 2953 strings)

Translated using Weblate (Portuguese)

Currently translated at 60.1% (1775 of 2953 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 93.7% (224 of 239 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (182 of 182 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.4% (186 of 189 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (188 of 188 strings)

Translated using Weblate (Russian)

Currently translated at 99.3% (814 of 819 strings)

Translated using Weblate (French)

Currently translated at 100.0% (819 of 819 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (213 of 213 strings)

Translated using Weblate (Galician)

Currently translated at 100.0% (189 of 189 strings)

Translated using Weblate (Portuguese)

Currently translated at 72.6% (308 of 424 strings)

Translated using Weblate (Portuguese)

Currently translated at 72.6% (308 of 424 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (376 of 376 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (188 of 188 strings)

Translated using Weblate (Portuguese)

Currently translated at 95.6% (777 of 812 strings)

Translated using Weblate (Portuguese)

Currently translated at 99.3% (154 of 155 strings)

Translated using Weblate (Galician)

Currently translated at 100.0% (239 of 239 strings)

Translated using Weblate (Spanish)

Currently translated at 96.8% (217 of 224 strings)

Translated using Weblate (Galician)

Currently translated at 100.0% (225 of 225 strings)

Translated using Weblate (French)

Currently translated at 100.0% (151 of 151 strings)

Translated using Weblate (French)

Currently translated at 88.0% (133 of 151 strings)

Translated using Weblate (French)

Currently translated at 85.4% (129 of 151 strings)

Translated using Weblate (French)

Currently translated at 100.0% (224 of 224 strings)

Translated using Weblate (French)

Currently translated at 100.0% (424 of 424 strings)

Translated using Weblate (French)

Currently translated at 100.0% (424 of 424 strings)

Translated using Weblate (French)

Currently translated at 100.0% (2911 of 2911 strings)

Translated using Weblate (French)

Currently translated at 99.6% (2901 of 2911 strings)

Translated using Weblate (French)

Currently translated at 99.6% (2900 of 2911 strings)

Translated using Weblate (French)

Currently translated at 83.4% (126 of 151 strings)

Translated using Weblate (French)

Currently translated at 72.1% (109 of 151 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (424 of 424 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (424 of 424 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 73.6% (67 of 91 strings)

Translated using Weblate (Galician)

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Galician)

Currently translated at 100.0% (422 of 422 strings)

Translated using Weblate (Sinhala)

Currently translated at 24.5% (38 of 155 strings)

Translated using Weblate (French)

Currently translated at 57.2% (87 of 152 strings)

Translated using Weblate (French)

Currently translated at 100.0% (91 of 91 strings)

Co-authored-by: AGM <yoartgm@gmail.com>
Co-authored-by: Aasim Kais <aasimabdullahmohamedkais@gmail.com>
Co-authored-by: Adrián Chaves Fernández <adrian@chaves.io>
Co-authored-by: Ana Paula Fagundes Gomes <paulinha0939@gmail.com>
Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: Icaro <icaro.mascarenhas@outlook.com>
Co-authored-by: Inferno <mishaad051@gmail.com>
Co-authored-by: Jan met de Pet <stijn.koppers@gmail.com>
Co-authored-by: Lapin <sirocuro01@gmail.com>
Co-authored-by: Lucas Rafaldini <lucas.rafaldini@gmail.com>
Co-authored-by: Natalie Luhrs <eilatan@gmail.com>
Co-authored-by: Nazar Paruna <nazarparuna@gmail.com>
Co-authored-by: Oliver Perkins <ollyboros@users.noreply.translate.habitica.com>
Co-authored-by: Raithe <RaitheOfDureya@gmail.com>
Co-authored-by: Sam Abian <samthony35@gmail.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: Steffen Dobbelaar <steffendobbelaar@gmail.com>
Co-authored-by: Val <3qes0hnzh@mozmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: 谢书凝 <xieshun5450@outlook.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/es/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/gl/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/si/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/character/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/character/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/character/gl/
Translate-URL: https://translate.habitica.com/projects/habitica/character/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/character/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/character/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/front/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/front/gl/
Translate-URL: https://translate.habitica.com/projects/habitica/front/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/front/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/es/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/gl/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/gl/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/inventory/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/gl/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/gl/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/gl/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/overview/gl/
Translate-URL: https://translate.habitica.com/projects/habitica/overview/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/gl/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/gl/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/gl/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/uk/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Challenge
Translation: Habitica/Character
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
Translation: Habitica/Contrib
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Inventory
Translation: Habitica/Limited
Translation: Habitica/Messages
Translation: Habitica/Npc
Translation: Habitica/Overview
Translation: Habitica/Pets
Translation: Habitica/Questscontent
Translation: Habitica/Rebirth
Translation: Habitica/Settings
Translation: Habitica/Subscriber
Translation: Habitica/Tasks
2023-11-03 18:22:53 +01:00
SabreCat efe4483a04 Merge branch 'release' into develop 2023-10-31 15:18:01 -05:00
SabreCat 9cee9ebfe3 5.11.1 2023-10-31 11:42:19 -05:00
SabreCat 33b6de85cc feat(faq): unify platform FAQs
by @CuriousMagpie with edits by @SabreCat
2023-10-31 11:41:24 -05:00
SabreCat 1026a721ac Merge branch 'release' into develop 2023-10-25 16:06:52 -05:00
Natalie affeca6045 fix(strings): remove/change "guild" to "group" (#14872)
* fix(string): questVice1Notes html changed to a mobile-device friendly format

* fix(strings): updated limited.json with "dateEnd" & "monthYYYY" months & put in chronological order

* fix(string): remove extra word from headSpecialSummer2022WarriorNotes

* fix(string): corrected armorSpecialSummer2022MageNotes

* fix: remove duplicated string and adjust upgrade button style

* fix(style): set border radii to 8px on upgrading-group id

* fix(payments): remove duplicate entry from another modal

* chore(fix): restore string inadvertently removed during a refactor

* chore(fix): comma dangle

* chore(typo): who knew, that Y was actually important...

* chore(typo): fix text in questBewilderNotes

* chore(string): clarify polar pets requirements

* couple small changes to the footer as pointed out by users

* chore(fix): correct name of Fabulous Party Hat

* fix(typo): correct February backgrounds release date to 2023, not 2022

* fix(trusted_domains): removed https:// from the beginning of localhost

* fix(config): correct habitica url format too

* fix(strings): remove/change "guild" to "group"

* fix(string): just Bank

---------

Co-authored-by: SabreCat <sabe@habitica.com>
Co-authored-by: Sabe Jones <sabrecat@gmail.com>
2023-10-25 16:05:31 -05:00
dependabot[bot] 05ac144e4f build(deps): bump jsonwebtoken from 9.0.1 to 9.0.2 (#14855)
Bumps [jsonwebtoken](https://github.com/auth0/node-jsonwebtoken) from 9.0.1 to 9.0.2.
- [Changelog](https://github.com/auth0/node-jsonwebtoken/blob/master/CHANGELOG.md)
- [Commits](https://github.com/auth0/node-jsonwebtoken/compare/v9.0.1...v9.0.2)

---
updated-dependencies:
- dependency-name: jsonwebtoken
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-25 14:26:44 -04:00
dependabot[bot] fdb5d75372 build(deps): bump jquery from 3.7.0 to 3.7.1 in /website/client (#14859)
Bumps [jquery](https://github.com/jquery/jquery) from 3.7.0 to 3.7.1.
- [Release notes](https://github.com/jquery/jquery/releases)
- [Commits](https://github.com/jquery/jquery/compare/3.7.0...3.7.1)

---
updated-dependencies:
- dependency-name: jquery
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-25 14:26:24 -04:00
dependabot[bot] 02770dd1a9 build(deps): bump @babel/register from 7.22.5 to 7.22.15 (#14865)
Bumps [@babel/register](https://github.com/babel/babel/tree/HEAD/packages/babel-register) from 7.22.5 to 7.22.15.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.22.15/packages/babel-register)

---
updated-dependencies:
- dependency-name: "@babel/register"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-25 14:26:06 -04:00
dependabot[bot] 6aed03380a build(deps): bump uuid from 9.0.0 to 9.0.1 in /website/client (#14888)
Bumps [uuid](https://github.com/uuidjs/uuid) from 9.0.0 to 9.0.1.
- [Changelog](https://github.com/uuidjs/uuid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/uuidjs/uuid/compare/v9.0.0...v9.0.1)

---
updated-dependencies:
- dependency-name: uuid
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-25 14:24:14 -04:00
dependabot[bot] be822b6bbe build(deps): bump get-func-name from 2.0.0 to 2.0.2 in /website/client (#14902)
Bumps [get-func-name](https://github.com/chaijs/get-func-name) from 2.0.0 to 2.0.2.
- [Release notes](https://github.com/chaijs/get-func-name/releases)
- [Commits](https://github.com/chaijs/get-func-name/commits/v2.0.2)

---
updated-dependencies:
- dependency-name: get-func-name
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-25 14:23:35 -04:00
dependabot[bot] 9aa15d9e64 build(deps): bump winston-loggly-bulk from 3.2.1 to 3.3.0 (#14926)
Bumps [winston-loggly-bulk](https://github.com/loggly/winston-loggly-bulk) from 3.2.1 to 3.3.0.
- [Release notes](https://github.com/loggly/winston-loggly-bulk/releases)
- [Commits](https://github.com/loggly/winston-loggly-bulk/compare/v3.2.1...3.3.0)

---
updated-dependencies:
- dependency-name: winston-loggly-bulk
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-25 14:21:02 -04:00
dependabot[bot] 4e33a0f7f8 build(deps): bump fsevents from 1.2.9 to 1.2.13 in /website/client (#14937)
Bumps [fsevents](https://github.com/fsevents/fsevents) from 1.2.9 to 1.2.13.
- [Release notes](https://github.com/fsevents/fsevents/releases)
- [Commits](https://github.com/fsevents/fsevents/compare/v1.2.9...v1.2.13)

---
updated-dependencies:
- dependency-name: fsevents
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-25 14:20:34 -04:00
dependabot[bot] 7ff9f67aab build(deps): bump @babel/traverse from 7.22.5 to 7.23.2 (#14953)
Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.22.5 to 7.23.2.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse)

---
updated-dependencies:
- dependency-name: "@babel/traverse"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-25 14:17:03 -04:00
dependabot[bot] 43fcce7242 build(deps): bump core-js from 3.32.2 to 3.33.1 in /website/client (#14955)
Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.32.2 to 3.33.1.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/commits/v3.33.1/packages/core-js)

---
updated-dependencies:
- dependency-name: core-js
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-25 14:16:37 -04:00
dependabot[bot] 099274969e build(deps): bump nconf from 0.12.0 to 0.12.1 in /website/client (#14963)
Bumps [nconf](https://github.com/flatiron/nconf) from 0.12.0 to 0.12.1.
- [Release notes](https://github.com/flatiron/nconf/releases)
- [Changelog](https://github.com/indexzero/nconf/blob/v0.12.1/CHANGELOG.md)
- [Commits](https://github.com/flatiron/nconf/compare/v0.12.0...v0.12.1)

---
updated-dependencies:
- dependency-name: nconf
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-25 14:13:32 -04:00
dependabot[bot] 5bb97218bd build(deps): bump nconf from 0.12.0 to 0.12.1 (#14966)
Bumps [nconf](https://github.com/flatiron/nconf) from 0.12.0 to 0.12.1.
- [Release notes](https://github.com/flatiron/nconf/releases)
- [Changelog](https://github.com/indexzero/nconf/blob/v0.12.1/CHANGELOG.md)
- [Commits](https://github.com/flatiron/nconf/compare/v0.12.0...v0.12.1)

---
updated-dependencies:
- dependency-name: nconf
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-25 14:12:48 -04:00
SabreCat 57fe1d6b22 Merge branch 'release' into develop 2023-10-17 17:53:22 -05:00
Natalie 7aecadfe68 fix(content): change test strings to Pets and Mounts from Stable(s) (#14912) 2023-10-17 17:27:43 -05:00
1744 changed files with 3143 additions and 277907 deletions
-36
View File
@@ -104,42 +104,6 @@ updates:
- 7.7.0
- 7.8.0
- 7.9.0
- dependency-name: "@storybook/addon-knobs"
versions:
- 6.1.17
- 6.1.18
- 6.1.20
- 6.1.21
- 6.2.2
- 6.2.3
- 6.2.7
- dependency-name: "@storybook/addon-links"
versions:
- 6.1.17
- 6.1.18
- 6.1.20
- 6.1.21
- 6.2.2
- 6.2.3
- 6.2.7
- dependency-name: "@storybook/vue"
versions:
- 6.1.17
- 6.1.18
- 6.1.20
- 6.1.21
- 6.2.2
- 6.2.3
- 6.2.7
- dependency-name: "@storybook/addon-actions"
versions:
- 6.1.17
- 6.1.18
- 6.1.20
- 6.1.21
- 6.2.2
- 6.2.3
- 6.2.7
- dependency-name: core-js
versions:
- 3.10.0
+1 -1
View File
@@ -51,7 +51,7 @@ gulp.task('build:prepare-mongo', async () => {
console.log('MongoDB data folder is missing, setting up.'); // eslint-disable-line no-console
// use run-rs without --keep, kill it as soon as the replica set starts
const runRsProcess = spawn('run-rs', ['-v', '4.2.8', '-l', 'ubuntu1804', '--dbpath', 'mongodb-data', '--number', '1', '--quiet']);
const runRsProcess = spawn('run-rs', ['-v', '4.1.1', '-l', 'ubuntu1804', '--dbpath', 'mongodb-data', '--number', '1', '--quiet']);
for await (const chunk of runRsProcess.stdout) {
const stringChunk = chunk.toString();
@@ -0,0 +1,124 @@
/* eslint-disable no-console */
const MIGRATION_NAME = '20231114_pet_group_achievements';
import { model as User } from '../../../website/server/models/user';
const progressCount = 1000;
let count = 0;
async function updateUser (user) {
count++;
let set = {
migration: MIGRATION_NAME,
};
if (user && user.items && user.items.pets) {
const pets = user.items.pets;
if (pets['Cactus-Zombie'] > 0
&& pets['Cactus-Skeleton'] > 0
&& pets['Cactus-Base'] > 0
&& pets['Cactus-Desert'] > 0
&& pets['Cactus-Red'] > 0
&& pets['Cactus-Shade'] > 0
&& pets['Cactus-White']> 0
&& pets['Cactus-Golden'] > 0
&& pets['Cactus-CottonCandyBlue'] > 0
&& pets['Cactus-CottonCandyPink'] > 0
&& pets['Hedgehog-Zombie'] > 0
&& pets['Hedgehog-Skeleton'] > 0
&& pets['Hedgehog-Base'] > 0
&& pets['Hedgehog-Desert'] > 0
&& pets['Hedgehog-Red'] > 0
&& pets['Hedgehog-Shade'] > 0
&& pets['Hedgehog-White'] > 0
&& pets['Hedgehog-Golder'] > 0
&& pets['Hedgehog-CottonCandyBlue'] > 0
&& pets['Hedgehog-CottonCandyPink'] > 0
&& pets['Rock-Zombie'] > 0
&& pets['Rock-Skeleton'] > 0
&& pets['Rock-Base'] > 0
&& pets['Rock-Desert'] > 0
&& pets['Rock-Red'] > 0
&& pets['Rock-Shade'] > 0
&& pets['Rock-White'] > 0
&& pets['Rock-Golden'] > 0
&& pets['Rock-CottonCandyBlue'] > 0
&& pets['Rock-CottonCandyPink'] > 0 ) {
set['achievements.roughRider'] = true;
}
}
if (user && user.items && user.items.mounts) {
const mounts = user.items.mounts;
if (mounts['Cactus-Zombie']
&& mounts['Cactus-Skeleton']
&& mounts['Cactus-Base']
&& mounts['Cactus-Desert']
&& mounts['Cactus-Red']
&& mounts['Cactus-Shade']
&& mounts['Cactus-White']
&& mounts['Cactus-Golden']
&& mounts['Cactus-CottonCandyPink']
&& mounts['Cactus-CottonCandyBlue']
&& mounts['Hedgehog-Zombie']
&& mounts['Hedgehog-Skeleton']
&& mounts['Hedgehog-Base']
&& mounts['Hedgehog-Desert']
&& mounts['Hedgehog-Red']
&& mounts['Hedgehog-Shade']
&& mounts['Hedgehog-White']
&& mounts['Hedgehog-Golden']
&& mounts['Hedgehog-CottonCandyPink']
&& mounts['Hedgehog-CottonCandyBlue']
&& mounts['Rock-Zombie']
&& mounts['Rock-Skeleton']
&& mounts['Rock-Base']
&& mounts['Rock-Desert']
&& mounts['Rock-Red']
&& mounts['Rock-Shade']
&& mounts['Rock-White']
&& mounts['Rock-Golden']
&& mounts['Rock-CottonCandyPink']
&& mounts['Rock-CottonCandyBlue'] ) {
set['achievements.roughRider'] = true;
}
}
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
return await User.update({ _id: user._id }, { $set: set }).exec();
}
module.exports = async function processUsers () {
let query = {
migration: { $ne: MIGRATION_NAME },
'auth.timestamps.loggedin': { $gt: new Date('2023-02-01') },
};
const fields = {
_id: 1,
items: 1,
};
while (true) { // eslint-disable-line no-constant-condition
const users = await User // eslint-disable-line no-await-in-loop
.find(query)
.limit(250)
.sort({_id: 1})
.select(fields)
.lean()
.exec();
if (users.length === 0) {
console.warn('All appropriate users found and modified.');
console.warn(`\n${count} users processed\n`);
break;
} else {
query._id = {
$gt: users[users.length - 1]._id,
};
}
await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop
}
};
+87
View File
@@ -0,0 +1,87 @@
/* eslint-disable no-console */
const MIGRATION_NAME = '20231228_nye';
import { model as User } from '../../../website/server/models/user';
import { v4 as uuid } from 'uuid';
const progressCount = 1000;
let count = 0;
async function updateUser (user) {
count++;
const set = { migration: MIGRATION_NAME };
let push = {};
if (typeof user.items.gear.owned.head_special_nye2022 !== 'undefined') {
set['items.gear.owned.head_special_nye2023'] = true;
} else if (typeof user.items.gear.owned.head_special_nye2021 !== 'undefined') {
set['items.gear.owned.head_special_nye2022'] = true;
} else if (typeof user.items.gear.owned.head_special_nye2020 !== 'undefined') {
set['items.gear.owned.head_special_nye2021'] = true;
} else if (typeof user.items.gear.owned.head_special_nye2019 !== 'undefined') {
set['items.gear.owned.head_special_nye2020'] = true;
} else if (typeof user.items.gear.owned.head_special_nye2018 !== 'undefined') {
set['items.gear.owned.head_special_nye2019'] = true;
} else if (typeof user.items.gear.owned.head_special_nye2017 !== 'undefined') {
set['items.gear.owned.head_special_nye2018'] = true;
} else if (typeof user.items.gear.owned.head_special_nye2016 !== 'undefined') {
set['items.gear.owned.head_special_nye2017'] = true;
} else if (typeof user.items.gear.owned.head_special_nye2015 !== 'undefined') {
set['items.gear.owned.head_special_nye2016'] = true;
} else if (typeof user.items.gear.owned.head_special_nye2014 !== 'undefined') {
set['items.gear.owned.head_special_nye2015'] = true;
} else if (typeof user.items.gear.owned.head_special_nye !== 'undefined') {
set['items.gear.owned.head_special_nye2014'] = true;
} else {
set['items.gear.owned.head_special_nye'] = true;
}
push.notifications = {
type: 'ITEM_RECEIVED',
data: {
icon: 'notif_head_special_nye',
title: 'Happy New Year!',
text: 'Check your Equipment for this year\'s party hat!',
destination: 'inventory/equipment',
},
seen: false,
};
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
return await User.updateOne({_id: user._id}, {$set: set, $push: push}).exec();
}
export default async function processUsers () {
let query = {
'auth.timestamps.loggedin': { $gt: new Date('2023-12-01') },
migration: { $ne: MIGRATION_NAME },
};
const fields = {
_id: 1,
items: 1,
};
while (true) { // eslint-disable-line no-constant-condition
const users = await User // eslint-disable-line no-await-in-loop
.find(query)
.limit(250)
.sort({_id: 1})
.select(fields)
.lean()
.exec();
if (users.length === 0) {
console.warn('All appropriate users found and modified.');
console.warn(`\n${count} users processed\n`);
break;
} else {
query._id = {
$gt: users[users.length - 1],
};
}
await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop
}
};
@@ -0,0 +1,102 @@
/* eslint-disable no-console */
import { v4 as uuid } from 'uuid';
import { model as User } from '../../../website/server/models/user';
const MIGRATION_NAME = '20240131_habit_birthday';
const progressCount = 1000;
let count = 0;
async function updateUser (user) {
count += 1;
const inc = {
'items.food.Cake_Skeleton': 1,
'items.food.Cake_Base': 1,
'items.food.Cake_CottonCandyBlue': 1,
'items.food.Cake_CottonCandyPink': 1,
'items.food.Cake_Shade': 1,
'items.food.Cake_White': 1,
'items.food.Cake_Golden': 1,
'items.food.Cake_Zombie': 1,
'items.food.Cake_Desert': 1,
'items.food.Cake_Red': 1,
'achievements.habitBirthdays': 1,
};
const set = {};
const push = {
notifications: {
type: 'ITEM_RECEIVED',
data: {
icon: 'notif_namingDay_cake',
title: 'Happy Habit Birthday!',
text: 'Habitica turns 11 today! Enjoy free party robes and cake!',
destination: 'inventory/equipment',
},
seen: false,
},
};
set.migration = MIGRATION_NAME;
if (typeof user.items.gear.owned.armor_special_birthday2023 !== 'undefined') {
set['items.gear.owned.armor_special_birthday2024'] = true;
} else if (typeof user.items.gear.owned.armor_special_birthday2022 !== 'undefined') {
set['items.gear.owned.armor_special_birthday2023'] = true;
} else if (typeof user.items.gear.owned.armor_special_birthday2021 !== 'undefined') {
set['items.gear.owned.armor_special_birthday2022'] = true;
} else if (typeof user.items.gear.owned.armor_special_birthday2020 !== 'undefined') {
set['items.gear.owned.armor_special_birthday2021'] = true;
} else if (typeof user.items.gear.owned.armor_special_birthday2019 !== 'undefined') {
set['items.gear.owned.armor_special_birthday2020'] = true;
} else if (typeof user.items.gear.owned.armor_special_birthday2018 !== 'undefined') {
set['items.gear.owned.armor_special_birthday2019'] = true;
} else if (typeof user.items.gear.owned.armor_special_birthday2017 !== 'undefined') {
set['items.gear.owned.armor_special_birthday2018'] = true;
} else if (typeof user.items.gear.owned.armor_special_birthday2016 !== 'undefined') {
set['items.gear.owned.armor_special_birthday2017'] = true;
} else if (typeof user.items.gear.owned.armor_special_birthday2015 !== 'undefined') {
set['items.gear.owned.armor_special_birthday2016'] = true;
} else if (typeof user.items.gear.owned.armor_special_birthday !== 'undefined') {
set['items.gear.owned.armor_special_birthday2015'] = true;
} else {
set['items.gear.owned.armor_special_birthday'] = true;
}
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
return await User.updateOne({_id: user._id}, {$inc: inc, $set: set, $push: push}).exec();
}
export default async function processUsers () {
let query = {
migration: {$ne: MIGRATION_NAME},
'auth.timestamps.loggedin': {$gt: new Date('2023-12-23')},
};
const fields = {
_id: 1,
items: 1,
};
while (true) { // eslint-disable-line no-constant-condition
const users = await User // eslint-disable-line no-await-in-loop
.find(query)
.limit(250)
.sort({_id: 1})
.select(fields)
.lean()
.exec();
if (users.length === 0) {
console.warn('All appropriate users found and modified.');
console.warn(`\n${count} users processed\n`);
break;
} else {
query._id = {
$gt: users[users.length - 1],
};
}
await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop
}
};
+137 -103
View File
@@ -1,6 +1,6 @@
{
"name": "habitica",
"version": "5.11.0",
"version": "5.15.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -1609,9 +1609,9 @@
}
},
"@babel/register": {
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/register/-/register-7.22.5.tgz",
"integrity": "sha512-vV6pm/4CijSQ8Y47RH5SopXzursN35RQINfGJkmOlcpAtGuf94miFvIPhCKGQN7WGIcsgG1BHEX2KVdTYwTwUQ==",
"version": "7.22.15",
"resolved": "https://registry.npmjs.org/@babel/register/-/register-7.22.15.tgz",
"integrity": "sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg==",
"requires": {
"clone-deep": "^4.0.1",
"find-cache-dir": "^2.0.0",
@@ -3323,7 +3323,7 @@
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
"array-includes": {
"version": "3.1.1",
@@ -4789,7 +4789,7 @@
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
"integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
"integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
"dev": true
},
"coa": {
@@ -5053,7 +5053,7 @@
"contentstream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/contentstream/-/contentstream-1.0.0.tgz",
"integrity": "sha512-jqWbfFZFG9tZbdej7+TzXI4kanABh3BLtTWY6NxqTK5zo6iTIeo5aq4iRVfYsLQ0y8ccQqmJR/J4NeMmEdnR2w==",
"integrity": "sha1-C9z6RtowRkqGzo+n7OVlQQ3G+aU=",
"requires": {
"readable-stream": "~1.0.33-1"
},
@@ -5061,7 +5061,7 @@
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
},
"readable-stream": {
"version": "1.0.34",
@@ -5132,7 +5132,7 @@
"cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
"cookiejar": {
"version": "2.1.4",
@@ -5368,7 +5368,7 @@
"cwise-compiler": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/cwise-compiler/-/cwise-compiler-1.1.3.tgz",
"integrity": "sha512-WXlK/m+Di8DMMcCjcWr4i+XzcQra9eCdXIJrgh4TUgh0pIS/yJduLxS9JgefsHJ/YVLdgPtXm9r62W92MvanEQ==",
"integrity": "sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU=",
"requires": {
"uniq": "^1.0.0"
}
@@ -5393,7 +5393,7 @@
"data-uri-to-buffer": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-0.0.3.tgz",
"integrity": "sha512-Cp+jOa8QJef5nXS5hU7M1DWzXPEIoVR3kbV0dQuVGwROZg8bGf1DcCnkmajBTnvghTtSNMUdRrPjgaT6ZQucbw=="
"integrity": "sha1-GK6XmmoMqZSwYlhTkW0mYruuCxo="
},
"debug": {
"version": "4.1.1",
@@ -5989,7 +5989,7 @@
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
},
"end-of-stream": {
"version": "1.4.4",
@@ -6011,7 +6011,7 @@
"ent": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
"integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA=="
"integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0="
},
"entities": {
"version": "2.0.3",
@@ -6161,7 +6161,7 @@
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
},
"escape-string-regexp": {
"version": "1.0.5",
@@ -6536,7 +6536,7 @@
"etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
},
"event-stream": {
"version": "3.3.4",
@@ -7253,7 +7253,7 @@
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"on-finished": {
"version": "2.4.1",
@@ -7318,7 +7318,7 @@
"first-chunk-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz",
"integrity": "sha512-ArRi5axuv66gEsyl3UuK80CzW7t56hem73YGNYxNWTGNKFJUadSb9Gu9SHijYEUi8ulQMf1bJomYNwSCPHhtTQ=="
"integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04="
},
"flagged-respawn": {
"version": "1.0.1",
@@ -7473,7 +7473,7 @@
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
},
"from": {
"version": "0.1.7",
@@ -7769,7 +7769,7 @@
"gif-encoder": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/gif-encoder/-/gif-encoder-0.4.3.tgz",
"integrity": "sha512-HMfSa+EIng62NbDhM63QGYoc49/m8DcZ9hhBtw+CXX9mKboSpeFVxjZ2WEWaMFZ14MUjfACK7jsrxrJffIVrCg==",
"integrity": "sha1-iitP6MqJWkjjoLbLs0CgpqNXGJk=",
"requires": {
"readable-stream": "~1.1.9"
},
@@ -7777,7 +7777,7 @@
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
},
"readable-stream": {
"version": "1.1.14",
@@ -7855,7 +7855,7 @@
"github-from-package": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
"integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
"integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=",
"dev": true
},
"glob": {
@@ -8635,7 +8635,7 @@
"handlebars-layouts": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/handlebars-layouts/-/handlebars-layouts-3.1.4.tgz",
"integrity": "sha512-2llBmvnj8ueOfxNHdRzJOcgalzZjYVd9+WAl93kPYmlX4WGx7FTHTzNxhK+i9YKY2OSjzfehgpLiIwP/OJr6tw=="
"integrity": "sha1-JrO+uTG0uHffv35v6vQFjuYiiwI="
},
"har-schema": {
"version": "2.0.0",
@@ -9224,7 +9224,7 @@
"iota-array": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz",
"integrity": "sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA=="
"integrity": "sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc="
},
"ipaddr.js": {
"version": "1.9.1",
@@ -9564,7 +9564,7 @@
"async": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
"integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==",
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
"dev": true
},
"nopt": {
@@ -9874,14 +9874,20 @@
}
},
"jsonwebtoken": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz",
"integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==",
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
"integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
"requires": {
"jws": "^3.2.2",
"lodash": "^4.17.21",
"lodash.includes": "^4.3.0",
"lodash.isboolean": "^3.0.3",
"lodash.isinteger": "^4.0.4",
"lodash.isnumber": "^3.0.3",
"lodash.isplainobject": "^4.0.6",
"lodash.isstring": "^4.0.1",
"lodash.once": "^4.0.0",
"ms": "^2.1.1",
"semver": "^7.3.8"
"semver": "^7.5.4"
},
"dependencies": {
"jwa": {
@@ -10041,7 +10047,7 @@
"layout": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/layout/-/layout-2.2.0.tgz",
"integrity": "sha512-+kdgg25XW11BA4cl9vF+SH01HaBipld2Nf/PlU2kSYncAbdUbDoahzrlh6yhR93N/wR2TGgcFoxebzR1LKmZUg==",
"integrity": "sha1-MeRL/BjdEBmz/7II5AKku/4uavQ=",
"requires": {
"bin-pack": "~1.0.1"
}
@@ -10194,6 +10200,41 @@
"integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
"dev": true
},
"lodash.includes": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
"integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
},
"lodash.isboolean": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
"integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
},
"lodash.isinteger": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
"integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
},
"lodash.isnumber": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
"integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
},
"lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
},
"lodash.isstring": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
"integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
},
"lodash.once": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
"integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
},
"log-driver": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz",
@@ -10306,7 +10347,7 @@
"lru-cache": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz",
"integrity": "sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==",
"integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=",
"requires": {
"pseudomap": "^1.0.1",
"yallist": "^2.0.0"
@@ -10315,7 +10356,7 @@
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
"integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
}
}
},
@@ -10565,7 +10606,7 @@
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
},
"merge-stream": {
"version": "2.0.0",
@@ -10891,7 +10932,7 @@
"module-details-from-path": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz",
"integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A=="
"integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is="
},
"moment": {
"version": "2.29.4",
@@ -11242,7 +11283,7 @@
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}
}
},
@@ -11296,9 +11337,9 @@
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
},
"nconf": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.0.tgz",
"integrity": "sha512-T3fZPw3c7Dfrz8JBQEbEcZJ2s8f7cUMpKuyBtsGQe0b71pcXx6gNh4oti2xh5dxB+gO9ufNfISBlGvvWtfyMcA==",
"version": "0.12.1",
"resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.1.tgz",
"integrity": "sha512-p2cfF+B3XXacQdswUYWZ0w6Vld0832A/tuqjLBu3H1sfUcby4N2oVbGhyuCkZv+t3iY3aiFEj7gZGqax9Q2c1w==",
"requires": {
"async": "^3.0.0",
"ini": "^2.0.0",
@@ -11408,7 +11449,7 @@
"ndarray-ops": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/ndarray-ops/-/ndarray-ops-1.2.2.tgz",
"integrity": "sha512-BppWAFRjMYF7N/r6Ie51q6D4fs0iiGmeXIACKY66fLpnwIui3Wc3CXiD/30mgLbDjPpSLrsqcp3Z62+IcHZsDw==",
"integrity": "sha1-WeiNLDKn7ryxvGkPrhQVeVV6YU4=",
"requires": {
"cwise-compiler": "^1.0.0"
}
@@ -11416,7 +11457,7 @@
"ndarray-pack": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ndarray-pack/-/ndarray-pack-1.2.1.tgz",
"integrity": "sha512-51cECUJMT0rUZNQa09EoKsnFeDL4x2dHRT0VR5U2H5ZgEcm95ZDWcMA5JShroXjHOejmAD/fg8+H+OvUnVXz2g==",
"integrity": "sha1-jK6+qqJNXs9w/4YCBjeXfajuWFo=",
"requires": {
"cwise-compiler": "^1.1.2",
"ndarray": "^1.0.13"
@@ -11498,7 +11539,7 @@
"node-bitmap": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/node-bitmap/-/node-bitmap-0.0.1.tgz",
"integrity": "sha512-Jx5lPaaLdIaOsj2mVLWMWulXF6GQVdyLvNSxmiYCvZ8Ma2hfKX0POoR2kgKOqz+oFsRreq0yYZjQ2wjE9VNzCA=="
"integrity": "sha1-GA6scAPgxwdhjvMTaPYvhLKmkJE="
},
"node-fetch": {
"version": "2.6.7",
@@ -11534,13 +11575,30 @@
}
},
"node-loggly-bulk": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/node-loggly-bulk/-/node-loggly-bulk-3.0.0.tgz",
"integrity": "sha512-b/LmWZUYNt/4oQsMcGx3fy4H4IxjFavh3tO0xkINfD6UKcz28rtrkUEGrwXeHvPh9O8d3Ub6kqZocP3WHoKkzg==",
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/node-loggly-bulk/-/node-loggly-bulk-4.0.1.tgz",
"integrity": "sha512-pVctkicMfJZC2TLFE0AJ7dFzc8vbboxQOS+WIIDGea1GblugHTodBbuxxhSTzLgT3U+NiezvPgWYUbApVvE1xQ==",
"requires": {
"axios": "1.3.4",
"json-stringify-safe": "5.0.x",
"moment": "^2.18.1",
"request": ">=2.76.0 <3.0.0"
"moment": "2.29.4"
},
"dependencies": {
"axios": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz",
"integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==",
"requires": {
"follow-redirects": "^1.15.0",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"follow-redirects": {
"version": "1.15.3",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz",
"integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q=="
}
}
},
"node-releases": {
@@ -11586,7 +11644,7 @@
"noop-logger": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz",
"integrity": "sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ==",
"integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=",
"dev": true
},
"nopt": {
@@ -11687,7 +11745,7 @@
"obj-extend": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/obj-extend/-/obj-extend-0.1.0.tgz",
"integrity": "sha512-or9c7Ue2wWCun41DuLP3+LKEUjSZcDSxfCM4HZQSX9tcjLL/yuzTW7MmtVNs+MmN16uDRpDrFmFK/WVSm4vklg=="
"integrity": "sha1-u0SKR3X7les0p4H5CLusLfI9u1s="
},
"object-assign": {
"version": "4.1.1",
@@ -12031,7 +12089,7 @@
"parse-data-uri": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/parse-data-uri/-/parse-data-uri-0.2.0.tgz",
"integrity": "sha512-uOtts8NqDcaCt1rIsO3VFDRsAfgE4c6osG4d9z3l4dCBlxYFzni6Di/oNU270SDrjkfZuUvLZx1rxMyqh46Y9w==",
"integrity": "sha1-vwTYUd1ch7CrI45dAazklLYEtMk=",
"requires": {
"data-uri-to-buffer": "0.0.3"
}
@@ -12165,7 +12223,7 @@
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
},
"path-type": {
"version": "2.0.0",
@@ -12191,7 +12249,7 @@
"pause": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
"integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg=="
"integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10="
},
"pause-stream": {
"version": "0.0.11",
@@ -12250,9 +12308,9 @@
}
},
"pirates": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
"integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ=="
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
"integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg=="
},
"pixelsmith": {
"version": "2.6.0",
@@ -12339,7 +12397,7 @@
"pngjs-nozlib": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/pngjs-nozlib/-/pngjs-nozlib-1.0.0.tgz",
"integrity": "sha512-N1PggqLp9xDqwAoKvGohmZ3m4/N9xpY0nDZivFqQLcpLHmliHnCp9BuNCsOeqHWMuEEgFjpEaq9dZq6RZyy0fA=="
"integrity": "sha1-nmTWAs/pzOTZ1Zl9BodCmnPwt9c="
},
"posix-character-classes": {
"version": "0.1.1",
@@ -12440,8 +12498,7 @@
"proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"dev": true
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"ps-tree": {
"version": "1.2.0",
@@ -13053,7 +13110,7 @@
"resolve-from": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
"integrity": "sha512-qpFcKaXsq8+oRoLilkwyc7zHGF5i9Q2/25NIgLQQ/+VVv9rU4qvr6nXVAw1DsnXJyQkZsR4Ytfbtg5ehfcUssQ==",
"integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=",
"dev": true
}
}
@@ -13383,7 +13440,7 @@
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}
}
},
@@ -13650,7 +13707,7 @@
"sliced": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
"integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA=="
"integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
},
"snapdragon": {
"version": "0.8.2",
@@ -13925,7 +13982,7 @@
"concat-stream": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz",
"integrity": "sha512-H6xsIBfQ94aESBG8jGHXQ7i5AEpy5ZeVaLDOisDICiTCKpqEfr34/KmTrspKQNoLKNu9gTkovlpQcUi630AKiQ==",
"integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=",
"requires": {
"inherits": "~2.0.1",
"readable-stream": "~2.0.0",
@@ -13935,7 +13992,7 @@
"process-nextick-args": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
"integrity": "sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw=="
"integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
},
"readable-stream": {
"version": "2.0.6",
@@ -14271,7 +14328,7 @@
"stubs": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz",
"integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw=="
"integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls="
},
"style-loader": {
"version": "3.3.1",
@@ -14796,7 +14853,7 @@
"to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
"integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="
},
"to-object-path": {
"version": "0.3.0",
@@ -15262,7 +15319,7 @@
"punycode": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
"integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw=="
"integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
}
}
},
@@ -15462,12 +15519,12 @@
"clone": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
"integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="
"integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
},
"clone-stats": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
"integrity": "sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA=="
"integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE="
},
"replace-ext": {
"version": "0.0.1",
@@ -15862,47 +15919,24 @@
}
},
"winston-loggly-bulk": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/winston-loggly-bulk/-/winston-loggly-bulk-3.2.1.tgz",
"integrity": "sha512-Ws4csTUuU3O8sepxzIj6VwacTlgyUWroVoNkIU0qcsEweW8lbheNUodKFi20lSiKzXKL9uF2J1hoVFyurD/M3w==",
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/winston-loggly-bulk/-/winston-loggly-bulk-3.3.0.tgz",
"integrity": "sha512-JGRo1G7/k2VbD9e79/RNaRaKY9oW2HqAKay3SZpm3drKUy6XEP5dkgWdrc16T+a0sM4q/Qq13uatDFvlQIwjfA==",
"requires": {
"lodash.clonedeep": "^4.5.0",
"node-loggly-bulk": "^3.0.0",
"winston": "^3.3.3",
"winston-transport": "^4.4.0"
"lodash.clonedeep": "4.5.0",
"node-loggly-bulk": "4.0.1",
"winston": "3.10.0",
"winston-transport": "4.5.0"
}
},
"winston-transport": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz",
"integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==",
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz",
"integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==",
"requires": {
"readable-stream": "^2.3.7",
"triple-beam": "^1.2.0"
},
"dependencies": {
"readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"requires": {
"safe-buffer": "~5.1.0"
}
}
"logform": "^2.3.2",
"readable-stream": "^3.6.0",
"triple-beam": "^1.3.0"
}
},
"word-wrap": {
+6 -6
View File
@@ -1,12 +1,12 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "5.11.0",
"version": "5.15.1",
"main": "./website/server/index.js",
"dependencies": {
"@babel/core": "^7.22.10",
"@babel/preset-env": "^7.22.10",
"@babel/register": "^7.22.5",
"@babel/register": "^7.22.15",
"@google-cloud/trace-agent": "^7.1.2",
"@parse/node-apn": "^5.2.3",
"@slack/webhook": "^6.1.0",
@@ -43,7 +43,7 @@
"image-size": "^1.0.2",
"in-app-purchase": "^1.11.3",
"js2xmlparser": "^5.0.0",
"jsonwebtoken": "^9.0.1",
"jsonwebtoken": "^9.0.2",
"jwks-rsa": "^2.1.5",
"lodash": "^4.17.21",
"merge-stream": "^2.0.0",
@@ -52,7 +52,7 @@
"moment-recur": "^1.0.7",
"mongoose": "^5.13.20",
"morgan": "^1.10.0",
"nconf": "^0.12.0",
"nconf": "^0.12.1",
"node-gcm": "^1.0.5",
"on-headers": "^1.0.2",
"passport": "^0.5.3",
@@ -76,7 +76,7 @@
"validator": "^13.11.0",
"vinyl-buffer": "^1.0.1",
"winston": "^3.10.0",
"winston-loggly-bulk": "^3.2.1",
"winston-loggly-bulk": "^3.3.0",
"xml2js": "^0.6.2"
},
"private": true,
@@ -106,7 +106,7 @@
"client:unit": "cd website/client && npm run test:unit",
"start": "gulp nodemon",
"debug": "gulp nodemon --inspect",
"mongo:dev": "run-rs -v 4.2.8 -l ubuntu1804 --keep --dbpath mongodb-data --number 1 --quiet",
"mongo:dev": "run-rs -v 4.1.1 -l ubuntu1804 --keep --dbpath mongodb-data --number 1 --quiet",
"postinstall": "git config --global url.\"https://\".insteadOf git:// && gulp build && cd website/client && npm install",
"apidoc": "gulp apidoc"
},
@@ -90,7 +90,9 @@ describe('POST /tasks/unlink-one/:taskId', () => {
});
});
it('unlinks a task from a challenge and saves it on keep=keep', async () => {
// These tests are causing trouble. Race condition?
xit('unlinks a task from a challenge and saves it on keep=keep', async () => {
await user.post(`/tasks/challenge/${challenge._id}`, tasksToTest.daily);
let [daily] = await user.get('/tasks/user');
await user.del(`/challenges/${challenge._id}`);
@@ -99,7 +101,7 @@ describe('POST /tasks/unlink-one/:taskId', () => {
expect(daily.challenge).to.eql({});
});
it('unlinks a task from a challenge and deletes it on keep=remove', async () => {
xit('unlinks a task from a challenge and deletes it on keep=remove', async () => {
await user.post(`/tasks/challenge/${challenge._id}`, tasksToTest.daily);
const [daily] = await user.get('/tasks/user');
await user.del(`/challenges/${challenge._id}`);
+4 -18
View File
@@ -12,7 +12,7 @@ describe('GET /faq', () => {
expect(res).to.have.property('stillNeedHelp');
expect(res.stillNeedHelp.ios).to.equal(translate('iosFaqStillNeedHelp'));
expect(res).to.have.property('questions');
expect(res.questions[0].question).to.equal(translate('faqQuestion0'));
expect(res.questions[0].question).to.equal(translate('faqQuestion25'));
});
it('returns faq not in English', async () => {
@@ -29,20 +29,6 @@ describe('GET /faq', () => {
});
describe('platform parameter', () => {
it('returns faq with answers for ios platform only', async () => {
const res = await requester().get('/faq?platform=ios');
expect(res).to.have.property('stillNeedHelp');
expect(res.stillNeedHelp).to.eql({ ios: translate('iosFaqStillNeedHelp') });
expect(res).to.have.property('questions');
expect(res.questions[0]).to.eql({
exclusions: [],
heading: 'overview',
question: translate('faqQuestion0'),
ios: translate('iosFaqAnswer0'),
});
});
it('returns an error when invalid platform parameter is specified', async () => {
const request = requester().get('/faq?platform=wrong');
await expect(request)
@@ -60,9 +46,9 @@ describe('GET /faq', () => {
expect(res).to.have.property('questions');
expect(res.questions[0]).to.eql({
exclusions: [],
heading: 'overview',
question: translate('faqQuestion0'),
android: translate('androidFaqAnswer0'),
heading: 'task-types',
question: translate('faqQuestion25'),
web: translate('webFaqAnswer25'),
});
});
});
+3 -3
View File
@@ -17,9 +17,9 @@ function getFullArmoire () {
_.each(content.gearTypes, type => {
_.each(content.gear.tree[type].armoire, gearObject => {
const armoireKey = gearObject.key;
fullArmoire[armoireKey] = true;
if (gearObject.released) {
fullArmoire[gearObject.key] = true;
}
});
});
-10
View File
@@ -15,12 +15,6 @@ describe('FAQ Locales', () => {
});
});
it('has a valid ios answers', () => {
each(questions, question => {
expectValidTranslationString(question.ios);
});
});
it('has a valid web answers', () => {
each(questions, question => {
expectValidTranslationString(question.web);
@@ -29,10 +23,6 @@ describe('FAQ Locales', () => {
});
describe('Still Need Help Message', () => {
it('has a valid ios message', () => {
expectValidTranslationString(stillNeedHelp.ios);
});
it('has a valid web message', () => {
expectValidTranslationString(stillNeedHelp.web);
});
-28
View File
@@ -28,34 +28,6 @@ npm run lint
### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).
## Storybook
Storybook is mainly used while working on UI-Components to see changes faster instead of using the website.
### Start Storybook
```
npm run storybook:serve
```
This will start the storybook process, every `*.stories.js`-File is searched and added to the storybook overview.
### Storybook Worklow
Usually when you working on `component-name.vue` you also create a `component-name.stories.js` file.
Example of the stories structure - [Storybook Docs][StorybookDocsExample] - [CountBadge][CountBadgeExample]
[StorybookDocsExample]: https://storybook.js.org/docs/guides/guide-vue/#step-4-write-your-stories
[CountBadgeExample]: src/components/ui/countBadge.stories.js
Each function or example of this component will be put after `storiesOf('Your Component', module)`,
in a separate `.add('function of component', ...`
### Storybook Build
After each client build, storybook build is also triggered and will be available in `dist/storybook`
### Vue Structure
Currently pages and components are mixed in `/src/components` this is not a good way to find the files easy.
@@ -1,8 +0,0 @@
# Storybook Updates
Addon-Knobs has been deprecated inorder to update to the new `addons-controls` we need to:
1. Change to the new export syntax for each story `export const StoryTemplate`
2. And use `StoryTemplate.args` and `StoryTemplate.argTypes` to have the same `knobs` as before
Maybe this can be made story by story and not all at once
@@ -1,5 +0,0 @@
/* eslint-disable import/no-extraneous-dependencies */
import '@storybook/addon-actions/register';
import '@storybook/addon-knobs/register';
import '@storybook/addon-links/register';
import '@storybook/addon-notes/register';
-65
View File
@@ -1,65 +0,0 @@
/* eslint-disable import/no-extraneous-dependencies */
import { configure } from '@storybook/vue';
import './margin.css';
import '../../src/assets/scss/index.scss';
import '../../src/assets/scss/sprites.scss';
import Vue from 'vue';
import BootstrapVue from 'bootstrap-vue';
import StoreModule from '@/libs/store';
import getStore from '@/store';
import '../../src/filters/registerGlobals';
import i18n from '../../../common/script/i18n';
// couldn't inject the languages easily,
// so just a "$t()" string to show that this will be translated
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: {
},
},
preferences: {
},
auth: {
local: {
// email: 'example@example.com',
},
facebook: {
emails: [
{
value: 'test@test.de',
},
],
},
},
};
Vue.prototype.$store = store;
const req = require.context('../../src', true, /.stories.js$/);
function loadStories () {
req.keys().forEach(filename => req(filename));
}
configure(loadStories, module);
@@ -1,14 +0,0 @@
.background {
background: teal;
display: inline-block;
}
.inline-block {
display: inline-block;
}
.component-showcase {
position: absolute;
margin: 20px;
width: calc(100% - 40px);
}
@@ -1,107 +0,0 @@
import { v4 as generateUUID } from 'uuid';
import getters from '@/store/getters';
export const userStyles = {
contributor: {
admin: true,
level: 9,
text: '',
},
items: {
gear: {
equipped: {
armor: 'armor_special_2',
head: 'head_special_2',
shield: 'shield_special_goldenknight',
headAccessory: 'headAccessory_base_0',
eyewear: 'eyewear_base_0',
weapon: 'weapon_special_1',
back: 'back_base_0',
},
costume: {
armor: 'armor_special_fallRogue',
head: 'head_special_fallRogue',
shield: 'shield_armoire_shieldOfDiamonds',
body: 'body_mystery_201706',
eyewear: 'eyewear_special_blackHalfMoon',
back: 'back_base_0',
headAccessory: 'headAccessory_special_wolfEars',
weapon: 'weapon_armoire_lamplighter',
},
},
},
preferences: {
hair: {
color: 'black', base: 0, bangs: 3, beard: 0, mustache: 0, flower: 0,
},
tasks: { groupByChallenge: false, confirmScoreNotes: false },
size: 'broad',
skin: 'wolf',
shirt: 'zombie',
chair: 'none',
sleep: true,
disableClasses: false,
background: 'midnight_castle',
costume: true,
},
stats: {
buffs: {
str: 0,
int: 0,
per: 0,
con: 0,
stealth: 0,
streaks: false,
snowball: false,
spookySparkles: false,
shinySeed: false,
seafoam: false,
},
training: {
int: 0, per: 0, str: 0, con: 0,
},
hp: 50,
mp: 158,
exp: 227,
gp: 464.31937261345155,
lvl: 17,
class: 'rogue',
points: 17,
str: 0,
con: 0,
int: 0,
per: 0,
toNextLevel: 380,
maxHealth: 50,
maxMP: 158,
},
profile: {
name: 'user',
},
_id: generateUUID(),
flags: {
classSelected: true,
},
};
export function mockStore ({
userData,
...state
}) {
return {
getters,
dispatch: () => {
},
watch: () => {
},
state: {
user: {
data: {
...userData,
},
},
...state,
},
};
}
+117 -14644
View File
File diff suppressed because it is too large Load Diff
+5 -14
View File
@@ -8,17 +8,9 @@
"test:unit": "vue-cli-service test:unit --require ./tests/unit/helpers.js",
"lint": "vue-cli-service lint .",
"lint-no-fix": "vue-cli-service lint --no-fix .",
"postinstall": "node ./scripts/npm-postinstall.js",
"storybook:build": "vue-cli-service storybook:build -c config/storybook -o dist/storybook",
"storybook:serve": "vue-cli-service storybook:serve -p 6006 -c config/storybook"
"postinstall": "node ./scripts/npm-postinstall.js"
},
"dependencies": {
"@storybook/addon-actions": "6.5.8",
"@storybook/addon-knobs": "6.2.9",
"@storybook/addon-links": "6.5.8",
"@storybook/addon-notes": "5.3.21",
"@storybook/addons": "6.5.9",
"@storybook/vue": "6.5.14",
"@vue/cli-plugin-babel": "^5.0.8",
"@vue/cli-plugin-eslint": "^4.5.19",
"@vue/cli-plugin-router": "^5.0.8",
@@ -32,7 +24,7 @@
"bootstrap": "^4.6.0",
"bootstrap-vue": "^2.23.1",
"chai": "^4.3.7",
"core-js": "^3.32.2",
"core-js": "^3.33.1",
"dompurify": "^3.0.3",
"eslint": "^6.8.0",
"eslint-config-habitrpg": "^6.2.0",
@@ -42,10 +34,10 @@
"hellojs": "^1.20.0",
"inspectpack": "^4.7.1",
"intro.js": "^7.2.0",
"jquery": "^3.7.0",
"jquery": "^3.7.1",
"lodash": "^4.17.21",
"moment": "^2.29.4",
"nconf": "^0.12.0",
"nconf": "^0.12.1",
"sass": "^1.63.4",
"sass-loader": "^8.0.2",
"smartbanner.js": "^1.19.3",
@@ -54,10 +46,9 @@
"svg-url-loader": "^7.1.1",
"svgo": "^1.3.2",
"svgo-loader": "^2.2.1",
"uuid": "^9.0.0",
"uuid": "^9.0.1",
"validator": "^13.9.0",
"vue": "^2.7.10",
"vue-cli-plugin-storybook": "2.1.0",
"vue-fragment": "^1.6.0",
"vue-mugen-scroll": "^0.2.6",
"vue-router": "^3.6.5",
@@ -6,8 +6,4 @@ if (process.env.NODE_ENV === 'production') {
execSync('npm run build', {
stdio: 'inherit',
});
/* execSync('npm run storybook:build', {
stdio: 'inherit',
}); */
}
@@ -1179,6 +1179,11 @@
width: 141px;
height: 147px;
}
.background_frozen_blue_pond {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_frozen_blue_pond.png');
width: 141px;
height: 147px;
}
.background_frozen_lake {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_frozen_lake.png');
width: 141px;
@@ -1364,6 +1369,11 @@
width: 141px;
height: 147px;
}
.background_holiday_tree_forest {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_holiday_tree_forest.png');
width: 141px;
height: 147px;
}
.background_holiday_wreath {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_holiday_wreath.png');
width: 141px;
@@ -1379,6 +1389,11 @@
width: 141px;
height: 147px;
}
.background_ice_bubble_lake {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_ice_bubble_lake.png');
width: 141px;
height: 147px;
}
.background_ice_cave {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_ice_cave.png');
width: 141px;
@@ -1389,6 +1404,11 @@
width: 141px;
height: 147px;
}
.background_ice_sculpture_festival {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_ice_sculpture_festival.png');
width: 141px;
height: 147px;
}
.background_iceberg {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_iceberg.png');
width: 141px;
@@ -2249,11 +2269,21 @@
width: 141px;
height: 147px;
}
.background_winter_full_moon {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_winter_full_moon.png');
width: 141px;
height: 147px;
}
.background_winter_lake_with_swans {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_winter_lake_with_swans.png');
width: 141px;
height: 147px;
}
.background_winter_mountain_range {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_winter_mountain_range.png');
width: 141px;
height: 147px;
}
.background_winter_night {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_winter_night.png');
width: 141px;
@@ -2970,6 +3000,11 @@
width: 68px;
height: 68px;
}
.icon_background_frozen_blue_pond {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_frozen_blue_pond.png');
width: 68px;
height: 68px;
}
.icon_background_frozen_lake {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_frozen_lake.png');
width: 68px;
@@ -3155,6 +3190,11 @@
width: 68px;
height: 68px;
}
.icon_background_holiday_tree_forest {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_holiday_tree_forest.png');
width: 68px;
height: 68px;
}
.icon_background_holiday_wreath {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_holiday_wreath.png');
width: 68px;
@@ -3170,6 +3210,11 @@
width: 68px;
height: 68px;
}
.icon_background_ice_bubble_lake {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_ice_bubble_lake.png');
width: 68px;
height: 68px;
}
.icon_background_ice_cave {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_ice_cave.png');
width: 68px;
@@ -3180,6 +3225,11 @@
width: 68px;
height: 68px;
}
.icon_background_ice_sculpture_festival {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_ice_sculpture_festival.png');
width: 68px;
height: 68px;
}
.icon_background_iceberg {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_iceberg.png');
width: 68px;
@@ -4045,11 +4095,21 @@
width: 68px;
height: 68px;
}
.icon_background_winter_full_moon {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_winter_full_moon.png');
width: 68px;
height: 68px;
}
.icon_background_winter_lake_with_swans {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_winter_lake_with_swans.png');
width: 68px;
height: 68px;
}
.icon_background_winter_mountain_range {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_winter_mountain_range.png');
width: 68px;
height: 68px;
}
.icon_background_winter_night {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_winter_night.png');
width: 68px;
@@ -18825,6 +18885,11 @@
width: 114px;
height: 90px;
}
.broad_armor_armoire_greenFluffTrimmedCoat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_greenFluffTrimmedCoat.png');
width: 114px;
height: 90px;
}
.broad_armor_armoire_guardiansGown {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_guardiansGown.png');
width: 114px;
@@ -18985,6 +19050,16 @@
width: 90px;
height: 90px;
}
.broad_armor_armoire_schoolUniformPants {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_schoolUniformPants.png');
width: 114px;
height: 90px;
}
.broad_armor_armoire_schoolUniformSkirt {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_schoolUniformSkirt.png');
width: 114px;
height: 90px;
}
.broad_armor_armoire_scribesRobe {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_scribesRobe.png');
width: 114px;
@@ -19340,6 +19415,11 @@
width: 90px;
height: 90px;
}
.head_armoire_greenTrapperHat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_greenTrapperHat.png');
width: 114px;
height: 90px;
}
.head_armoire_guardiansBonnet {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_guardiansBonnet.png');
width: 114px;
@@ -19935,6 +20015,11 @@
width: 114px;
height: 90px;
}
.shield_armoire_trustyPencil {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_trustyPencil.png');
width: 114px;
height: 90px;
}
.shield_armoire_trustyUmbrella {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_trustyUmbrella.png');
width: 114px;
@@ -20155,6 +20240,11 @@
width: 68px;
height: 68px;
}
.shop_armor_armoire_greenFluffTrimmedCoat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_greenFluffTrimmedCoat.png');
width: 68px;
height: 68px;
}
.shop_armor_armoire_guardiansGown {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_guardiansGown.png');
width: 68px;
@@ -20315,6 +20405,16 @@
width: 68px;
height: 68px;
}
.shop_armor_armoire_schoolUniformPants {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_schoolUniformPants.png');
width: 68px;
height: 68px;
}
.shop_armor_armoire_schoolUniformSkirt {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_schoolUniformSkirt.png');
width: 68px;
height: 68px;
}
.shop_armor_armoire_scribesRobe {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_scribesRobe.png');
width: 68px;
@@ -20730,6 +20830,11 @@
width: 68px;
height: 68px;
}
.shop_head_armoire_greenTrapperHat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_armoire_greenTrapperHat.png');
width: 68px;
height: 68px;
}
.shop_head_armoire_guardiansBonnet {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_armoire_guardiansBonnet.png');
width: 68px;
@@ -21325,6 +21430,11 @@
width: 68px;
height: 68px;
}
.shop_shield_armoire_trustyPencil {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_armoire_trustyPencil.png');
width: 68px;
height: 68px;
}
.shop_shield_armoire_trustyUmbrella {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_armoire_trustyUmbrella.png');
width: 68px;
@@ -21770,6 +21880,11 @@
width: 68px;
height: 68px;
}
.shop_weapon_armoire_scholarlyTextbooks {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_scholarlyTextbooks.png');
width: 68px;
height: 68px;
}
.shop_weapon_armoire_shadowMastersMace {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_shadowMastersMace.png');
width: 68px;
@@ -22030,6 +22145,11 @@
width: 114px;
height: 90px;
}
.slim_armor_armoire_greenFluffTrimmedCoat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_greenFluffTrimmedCoat.png');
width: 114px;
height: 90px;
}
.slim_armor_armoire_guardiansGown {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_guardiansGown.png');
width: 114px;
@@ -22190,6 +22310,16 @@
width: 90px;
height: 90px;
}
.slim_armor_armoire_schoolUniformPants {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_schoolUniformPants.png');
width: 114px;
height: 90px;
}
.slim_armor_armoire_schoolUniformSkirt {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_schoolUniformSkirt.png');
width: 114px;
height: 90px;
}
.slim_armor_armoire_scribesRobe {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_scribesRobe.png');
width: 114px;
@@ -22730,6 +22860,11 @@
width: 114px;
height: 90px;
}
.weapon_armoire_scholarlyTextbooks {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_scholarlyTextbooks.png');
width: 114px;
height: 90px;
}
.weapon_armoire_shadowMastersMace {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_shadowMastersMace.png');
width: 114px;
@@ -23600,6 +23735,11 @@
width: 114px;
height: 90px;
}
.broad_armor_special_birthday2024 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_birthday2024.png');
width: 114px;
height: 90px;
}
.eyewear_special_anniversary {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/eyewear_special_anniversary.png');
width: 90px;
@@ -23655,6 +23795,11 @@
width: 68px;
height: 68px;
}
.shop_armor_special_birthday2024 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_birthday2024.png');
width: 68px;
height: 68px;
}
.shop_back_special_anniversary {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_back_special_anniversary.png');
width: 68px;
@@ -23720,6 +23865,11 @@
width: 114px;
height: 90px;
}
.slim_armor_special_birthday2024 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_birthday2024.png');
width: 114px;
height: 90px;
}
.broad_armor_special_fall2015Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_fall2015Healer.png');
width: 93px;
@@ -28815,6 +28965,66 @@
width: 114px;
height: 90px;
}
.eyewear_mystery_202312 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/eyewear_mystery_202312.png');
width: 114px;
height: 90px;
}
.head_mystery_202312 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202312.png');
width: 114px;
height: 90px;
}
.shop_eyewear_mystery_202312 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_eyewear_mystery_202312.png');
width: 68px;
height: 68px;
}
.shop_head_mystery_202312 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_mystery_202312.png');
width: 68px;
height: 68px;
}
.shop_set_mystery_202312 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_set_mystery_202312.png');
width: 68px;
height: 68px;
}
.back_mystery_202401 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_mystery_202401.png');
width: 117px;
height: 120px;
}
.broad_armor_mystery_202401 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_202401.png');
width: 117px;
height: 120px;
}
.shop_armor_mystery_202401 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_mystery_202401.png');
width: 68px;
height: 68px;
}
.shop_back_mystery_202401 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_back_mystery_202401.png');
width: 68px;
height: 68px;
}
.shop_set_mystery_202401 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_set_mystery_202401.png');
width: 68px;
height: 68px;
}
.shop_weapon_armoire_scholarlyTextbooks {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_scholarlyTextbooks.png');
width: 68px;
height: 68px;
}
.slim_armor_mystery_202401 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_mystery_202401.png');
width: 117px;
height: 120px;
}
.broad_armor_mystery_301404 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_301404.png');
width: 90px;
@@ -32920,6 +33130,26 @@
width: 114px;
height: 117px;
}
.broad_armor_special_winter2024Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2024Healer.png');
width: 114px;
height: 90px;
}
.broad_armor_special_winter2024Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2024Mage.png');
width: 114px;
height: 90px;
}
.broad_armor_special_winter2024Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2024Rogue.png');
width: 114px;
height: 90px;
}
.broad_armor_special_winter2024Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2024Warrior.png');
width: 114px;
height: 90px;
}
.broad_armor_special_yeti {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_yeti.png');
width: 90px;
@@ -32980,6 +33210,11 @@
width: 114px;
height: 90px;
}
.head_special_nye2023 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_nye2023.png');
width: 114px;
height: 90px;
}
.head_special_ski {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_ski.png');
width: 90px;
@@ -33170,6 +33405,26 @@
width: 114px;
height: 117px;
}
.head_special_winter2024Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2024Healer.png');
width: 114px;
height: 90px;
}
.head_special_winter2024Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2024Mage.png');
width: 114px;
height: 90px;
}
.head_special_winter2024Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2024Rogue.png');
width: 114px;
height: 90px;
}
.head_special_winter2024Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2024Warrior.png');
width: 114px;
height: 90px;
}
.head_special_yeti {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_yeti.png');
width: 90px;
@@ -33320,6 +33575,21 @@
width: 114px;
height: 117px;
}
.shield_special_winter2024Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_winter2024Healer.png');
width: 114px;
height: 90px;
}
.shield_special_winter2024Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_winter2024Rogue.png');
width: 114px;
height: 90px;
}
.shield_special_winter2024Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_winter2024Warrior.png');
width: 114px;
height: 90px;
}
.shield_special_yeti {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_yeti.png');
width: 90px;
@@ -33520,6 +33790,26 @@
width: 68px;
height: 68px;
}
.shop_armor_special_winter2024Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_winter2024Healer.png');
width: 68px;
height: 68px;
}
.shop_armor_special_winter2024Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_winter2024Mage.png');
width: 68px;
height: 68px;
}
.shop_armor_special_winter2024Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_winter2024Rogue.png');
width: 68px;
height: 68px;
}
.shop_armor_special_winter2024Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_winter2024Warrior.png');
width: 68px;
height: 68px;
}
.shop_armor_special_yeti {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_yeti.png');
width: 68px;
@@ -33580,6 +33870,11 @@
width: 68px;
height: 68px;
}
.shop_head_special_nye2023 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_nye2023.png');
width: 68px;
height: 68px;
}
.shop_head_special_ski {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_ski.png');
width: 68px;
@@ -33770,6 +34065,26 @@
width: 68px;
height: 68px;
}
.shop_head_special_winter2024Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_winter2024Healer.png');
width: 68px;
height: 68px;
}
.shop_head_special_winter2024Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_winter2024Mage.png');
width: 68px;
height: 68px;
}
.shop_head_special_winter2024Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_winter2024Rogue.png');
width: 68px;
height: 68px;
}
.shop_head_special_winter2024Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_winter2024Warrior.png');
width: 68px;
height: 68px;
}
.shop_head_special_yeti {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_yeti.png');
width: 68px;
@@ -33920,6 +34235,21 @@
width: 68px;
height: 68px;
}
.shop_shield_special_winter2024Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_special_winter2024Healer.png');
width: 68px;
height: 68px;
}
.shop_shield_special_winter2024Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_special_winter2024Rogue.png');
width: 68px;
height: 68px;
}
.shop_shield_special_winter2024Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_special_winter2024Warrior.png');
width: 68px;
height: 68px;
}
.shop_shield_special_yeti {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_special_yeti.png');
width: 68px;
@@ -34120,6 +34450,26 @@
width: 68px;
height: 68px;
}
.shop_weapon_special_winter2024Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_winter2024Healer.png');
width: 68px;
height: 68px;
}
.shop_weapon_special_winter2024Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_winter2024Mage.png');
width: 68px;
height: 68px;
}
.shop_weapon_special_winter2024Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_winter2024Rogue.png');
width: 68px;
height: 68px;
}
.shop_weapon_special_winter2024Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_winter2024Warrior.png');
width: 68px;
height: 68px;
}
.shop_weapon_special_yeti {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_yeti.png');
width: 68px;
@@ -34320,6 +34670,26 @@
width: 114px;
height: 117px;
}
.slim_armor_special_winter2024Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2024Healer.png');
width: 114px;
height: 90px;
}
.slim_armor_special_winter2024Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2024Mage.png');
width: 114px;
height: 90px;
}
.slim_armor_special_winter2024Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2024Rogue.png');
width: 114px;
height: 90px;
}
.slim_armor_special_winter2024Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2024Warrior.png');
width: 114px;
height: 90px;
}
.slim_armor_special_yeti {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_yeti.png');
width: 90px;
@@ -34520,6 +34890,26 @@
width: 114px;
height: 117px;
}
.weapon_special_winter2024Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2024Healer.png');
width: 114px;
height: 90px;
}
.weapon_special_winter2024Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2024Mage.png');
width: 114px;
height: 90px;
}
.weapon_special_winter2024Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2024Rogue.png');
width: 114px;
height: 90px;
}
.weapon_special_winter2024Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2024Warrior.png');
width: 114px;
height: 90px;
}
.weapon_special_yeti {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_yeti.png');
width: 90px;
@@ -119,6 +119,10 @@ export default {
SubscriptionAndPerks,
},
mixins: [userStateMixin],
beforeRouteUpdate (to, from, next) {
this.userIdentifier = to.params.userIdentifier;
next();
},
data () {
return {
userIdentifier: '',
@@ -184,9 +188,5 @@ export default {
this.resetCounter += 1; // tell child components to reinstantiate from scratch
},
},
beforeRouteUpdate (to, from, next) {
this.userIdentifier = to.params.userIdentifier;
next();
},
};
</script>
@@ -57,13 +57,13 @@
<div class="form-inline">
Perk month count:
<input
v-model="hero.purchased.plan.perkMonthCount"
class="form-control"
type="number"
min="0"
max="2"
step="1"
>
v-model="hero.purchased.plan.perkMonthCount"
class="form-control"
type="number"
min="0"
max="2"
step="1"
>
</div>
<div>
Next Mystic Hourglass:
+1 -1
View File
@@ -136,10 +136,10 @@ import foolPet from '../mixins/foolPet';
import ClassBadge from '@/components/members/classBadge';
export default {
mixins: [foolPet],
components: {
ClassBadge,
},
mixins: [foolPet],
props: {
member: {
type: Object,
@@ -1,43 +0,0 @@
/* eslint-disable import/no-extraneous-dependencies */
import { storiesOf } from '@storybook/vue';
import { withKnobs } from '@storybook/addon-knobs';
import bugReportModal from '@/components/bugReportModal';
import bugReportSuccessModal from '@/components/bugReportSuccessModal';
const stories = storiesOf('Bug Report Modal', module);
stories.addDecorator(withKnobs);
stories
.add('bugReportModal', () => ({
components: { bugReportModal },
data () {
return {
};
},
template: `
<div>
<bug-report-modal></bug-report-modal>
</div>
`,
mounted () {
this.$root.$emit('bv::show::modal', 'bug-report-modal');
},
}))
.add('bugReportSuccessModal', () => ({
components: { bugReportSuccessModal },
data () {
return {
};
},
template: `
<div>
<bug-report-success-modal></bug-report-success-modal>
</div>
`,
mounted () {
this.$root.$emit('bv::show::modal', 'bug-report-success-modal');
},
}));
@@ -65,7 +65,7 @@
rows="5"
:required="true"
:placeholder="question ? $t('questionPlaceholder') : $t('reportDescriptionPlaceholder')"
:class="{'input-invalid': messageInvalid && this.message.length === 0}"
:class="{'input-invalid': messageInvalid && message.length === 0}"
>
</textarea>
@@ -413,6 +413,11 @@ export default {
groupLink,
},
mixins: [challengeMemberSearchMixin, externalLinks, userStateMixin],
async beforeRouteUpdate (to, from, next) {
this.searchId = to.params.challengeId;
await this.loadChallenge();
next();
},
props: ['challengeId'],
data () {
return {
@@ -487,11 +492,6 @@ export default {
updated () {
this.handleExternalLinks();
},
async beforeRouteUpdate (to, from, next) {
this.searchId = to.params.challengeId;
await this.loadChallenge();
next();
},
methods: {
cleanUpTask (task) {
const cleansedTask = omit(task, TASK_KEYS_TO_REMOVE);
@@ -32,7 +32,7 @@
<div class="row">
<div
v-if="!loading &&
this.filteredChallenges.length === 0"
filteredChallenges.length === 0"
class="no-challenges text-center col-md-6 offset-3"
>
<h2 v-once>
@@ -42,7 +42,7 @@
</div>
<div class="row">
<div
v-for="challenge in this.filteredChallenges"
v-for="challenge in filteredChallenges"
:key="challenge._id"
class="col-12 col-md-6"
>
@@ -51,7 +51,7 @@
</div>
<div class="row">
<div
v-if="!loading && challenges.length > 0 && this.filteredChallenges.length === 0"
v-if="!loading && challenges.length > 0 && filteredChallenges.length === 0"
class="no-challenges text-center col-md-6 offset-3"
>
<h2 v-once>
@@ -61,7 +61,7 @@
</div>
<div class="row">
<div
v-for="challenge in this.filteredChallenges"
v-for="challenge in filteredChallenges"
:key="challenge._id"
class="col-12 col-md-6"
>
@@ -121,7 +121,7 @@
v-if="editing"
class="menu-container col-2"
:class="{active: activeTopPage === 'backgrounds'}"
@click="changeTopPage('backgrounds', '2023')"
@click="changeTopPage('backgrounds', '2024')"
>
<div class="menu-item">
<div
@@ -182,8 +182,8 @@
</div>
<div
v-for="bg in backgroundShopSets[0].items"
:key="bg.key"
:id="bg.key"
:key="bg.key"
class="col-2"
@click="unlock('background.' + bg.key)"
>
@@ -215,8 +215,8 @@
>
<div
v-for="bg in backgroundShopSets[2].items"
:key="bg.key"
:id="bg.key"
:key="bg.key"
class="col-4 text-center customize-option background-button"
@click="unlock('background.' + bg.key)"
>
@@ -245,8 +245,8 @@
>
<div
v-for="bg in backgroundShopSets[1].items"
:key="bg.key"
:id="bg.key"
:key="bg.key"
class="col-4 text-center customize-option background-button"
@click="!user.purchased.background[bg.key]
? backgroundSelected(bg) : unlock('background.' + bg.key)"
@@ -316,8 +316,8 @@
</div>
<div
v-for="bg in set.items"
:key="bg.key"
:id="bg.key"
:key="bg.key"
class="col-4 text-center customize-option background-button"
@click="!user.purchased.background[bg.key]
? backgroundSelected(bg) : unlock('background.' + bg.key)"
@@ -377,8 +377,8 @@
>
<div
v-for="(bg) in ownedBackgrounds"
:key="bg.key"
:id="bg.key"
:key="bg.key"
class="col-4 text-center customize-option background-button"
@click="unlock('background.' + bg.key)"
>
@@ -1237,7 +1237,7 @@ export default {
},
],
bgSubMenuItems: ['2023', '2022', '2021', '2020', '2019', '2018', '2017', '2016', '2015', '2014'].map(y => ({
bgSubMenuItems: ['2024', '2023', '2022', '2021', '2020', '2019', '2018', '2017', '2016', '2015', '2014'].map(y => ({
id: y,
label: y,
})),
@@ -1267,6 +1267,7 @@ export default {
2021: [],
2022: [],
2023: [],
2024: [],
};
// Hack to force update for now until we restructure the data
@@ -1,46 +0,0 @@
/* eslint-disable import/no-extraneous-dependencies */
import { storiesOf } from '@storybook/vue';
import FaceAvatar from './faceAvatar.vue';
import Avatar from './avatar.vue';
import { userStyles } from '../../config/storybook/mock.data';
import content from '../../../common/script/content/index';
import getters from '@/store/getters';
storiesOf('Face Avatar', module)
.add('simple', () => ({
components: { FaceAvatar },
template: `
<div style="position: absolute; margin: 20px">
<face-avatar :member="user"></face-avatar>
</div>
`,
data () {
return {
user: userStyles,
};
},
}))
.add('compare', () => ({
components: { FaceAvatar, Avatar },
template: `
<div style="position: absolute; margin: 20px">
<face-avatar :member="user"></face-avatar>
<avatar :member="user"></avatar>
</div>
`,
data () {
return {
user: userStyles,
};
},
state: {
content,
},
store: {
getters,
state: {
content,
},
},
}));
@@ -13,8 +13,8 @@
class="w-100 d-flex pt-2 justify-content-center"
>
<h2
class="mx-auto mt-4"
v-once
class="mx-auto mt-4"
>
{{ $t('newGroupsWelcome') }}
</h2>
@@ -43,8 +43,8 @@
>
</div>
<h3
class="my-auto"
v-once
class="my-auto"
>
{{ $t('newGroupsWhatsNew') }}
</h3>
@@ -66,7 +66,8 @@
<li>{{ $t('newGroupsBullet07') }}</li>
<li>{{ $t('newGroupsBullet08') }}</li>
<li>{{ $t('newGroupsBullet09') }}</li>
<li>{{ $t('newGroupsBullet10') }}
<li>
{{ $t('newGroupsBullet10') }}
<ul class="p-0">
<li v-html="$t('newGroupsBullet10a')"></li>
<li v-html="$t('newGroupsBullet10b')"></li>
@@ -83,13 +84,13 @@
>
{{ $t('newGroupsEnjoy') }}
</div>
<button
class="btn btn-primary mt-4 mb-1 mx-auto"
@click="close()"
@keypress.enter="close()"
>
{{ $t('getStarted') }}
</button>
<button
class="btn btn-primary mt-4 mb-1 mx-auto"
@click="close()"
@keypress.enter="close()"
>
{{ $t('getStarted') }}
</button>
</div>
</b-modal>
</template>
@@ -47,19 +47,21 @@
</div>
<div class="create-task-area ml-2">
<button
id="create-task-btn"
v-if="canCreateTasks"
id="create-task-btn"
class="btn btn-primary create-btn d-flex align-items-center"
:class="{open: openCreateBtn}"
tabindex="0"
@click.stop.prevent="openCreateBtn = !openCreateBtn"
@keypress.enter="openCreateBtn = !openCreateBtn"
tabindex="0"
>
<div
class="svg-icon icon-10 color"
v-html="icons.positive"
></div>
<div class="ml-75 mr-1"> {{ $t('addTask') }} </div>
<div class="ml-75 mr-1">
{{ $t('addTask') }}
</div>
</button>
<div
v-if="openCreateBtn"
@@ -68,8 +70,8 @@
<div
v-for="type in columns"
:key="type"
@click="createTask(type)"
class="dropdown-item d-flex px-2 py-1"
@click="createTask(type)"
>
<div class="d-flex align-items-center justify-content-center task-icon">
<div
@@ -1,401 +0,0 @@
/* eslint-disable import/no-extraneous-dependencies */
import { storiesOf } from '@storybook/vue';
import {
collectionQuestLeaderParticipating,
collectionQuestNotParticipating,
createStory,
groupBossQuestParticipating,
groupBossQuestRage,
groupCollectionQuest,
groupCollectionQuestPending,
} from './group.stories.utils';
storiesOf('Group Components|Party/Quest States', module)
.add('Not a Member', () => createStory({
template: `
<div class="component-showcase">
<right-sidebar :group="group" :is-party="true"
:is-leader="false" :is-member="false"
class="col-12"/>
</div>
`,
data () {
return {
group: {
leader: {
},
quest: {
},
purchased: {
},
},
};
},
user: {
data: {
_id: 'some-user',
party: {
},
preferences: {
},
},
},
challengeOptions: {},
}))
.add('Member/No Quest', () => createStory({
template: `
<div class="component-showcase">
<right-sidebar :group="group" :is-party="true"
:is-leader="false" :is-member="true"
class="col-12"/>
</div>
`,
data () {
return {
group: {
leader: {
},
quest: {
},
purchased: {
},
},
};
},
user: {
data: {
_id: 'some-user',
party: {
},
preferences: {
},
},
},
challengeOptions: {},
}))
.add('Leader/No Quest', () => createStory({
template: `
<div class="component-showcase">
<right-sidebar :group="group" :is-party="true"
:is-leader="true" :is-member="true"
class="col-12"/>
</div>
`,
data () {
return {
group: {
description: 'Some text',
leader: {
},
quest: {
},
purchased: {
},
privacy: 'private',
},
};
},
user: {
data: {
_id: 'some-user',
party: {
},
preferences: {
},
},
},
challengeOptions: {},
}))
.add('Quest Owner/Quest Not Started', () => createStory({
template: `
<div class="component-showcase">
<right-sidebar :group="group" :is-party="true" :is-member="true" class="col-12"/>
</div>
`,
data () {
return {
group: groupCollectionQuest(false),
};
},
user: {
data: {
_id: '05ca98f4-4706-47b5-8d02-142e6e78ba2e',
party: {
},
preferences: {
},
},
},
challengeOptions: {},
}))
.add('Member/Quest accepted/Quest Not Started', () => createStory({
template: `
<div class="component-showcase">
<right-sidebar :group="group" :is-party="true" :is-member="true" class="col-12"/>
</div>
`,
data () {
return {
group: groupCollectionQuest(false),
};
},
user: {
data: {
_id: 'just-a-member',
party: {
},
preferences: {
},
},
},
challengeOptions: {},
}))
.add('Member/Quest accepted/Started', () => createStory({
template: `
<div class="component-showcase">
<right-sidebar :group="group" :is-party="true" :is-member="true" class="col-12"/>
</div>
`,
data () {
return {
group: groupCollectionQuest(true),
};
},
user: {
data: {
_id: 'just-a-member',
party: {
},
preferences: {
},
},
},
challengeOptions: {},
}))
.add('Member/Quest Invite Pending', () => createStory({
template: `
<div class="component-showcase">
<right-sidebar :group="group" :is-party="true"
:is-member="true"
class="col-12"/>
</div>
`,
data () {
return {
group: groupCollectionQuestPending,
};
},
user: {
data: {
_id: 'some-user',
party: {
quest: {
RSVPNeeded: true,
},
},
preferences: {
},
},
},
challengeOptions: {},
}))
.add('Collection Quest/Quest Owner Participating', () => createStory({
template: `
<div class="component-showcase">
<right-sidebar :group="group" :is-party="true" :is-member="true" :is-leader="true" class="col-12"/>
</div>
`,
data () {
return {
group: collectionQuestLeaderParticipating,
};
},
user: {
data: {
_id: '05ca98f4-4706-47b5-8d02-142e6e78ba2e',
party: {
quest: {
progress: {
up: 0,
down: 0,
collectedItems: 2,
collect: {},
},
},
},
preferences: {
},
},
},
challengeOptions: {},
}))
.add('Collection Quest/Not Participating', () => createStory({
template: `
<div class="component-showcase">
<right-sidebar :group="group" :is-party="true" :is-member="true" class="col-12"/>
</div>
`,
data () {
return {
group: collectionQuestNotParticipating,
};
},
user: {
data: {
_id: 'not-the-leader',
party: {
quest: {
progress: {
up: 0,
down: 0,
collectedItems: 2,
collect: {},
},
},
},
preferences: {
},
},
},
challengeOptions: {},
}))
.add('Boss Quest/Participating', () => createStory({
template: `
<div class="component-showcase">
<right-sidebar :group="group" :is-party="true" :is-member="true" class="col-12"/>
</div>
`,
data () {
return {
group: groupBossQuestParticipating,
};
},
user: {
data: {
_id: 'acc2950e-9919-49bc-be7f-0ec4103e9f2b',
party: {
quest: {
progress: {
up: 20,
down: 0,
collectedItems: 2,
collect: {},
},
},
},
preferences: {
},
},
},
challengeOptions: {},
}))
.add('Boss Quest/Participating - No Pending', () => createStory({
template: `
<div class="component-showcase">
<right-sidebar :group="group" :is-party="true" :is-member="true" class="col-12"/>
</div>
`,
data () {
return {
group: groupBossQuestParticipating,
};
},
user: {
data: {
_id: 'acc2950e-9919-49bc-be7f-0ec4103e9f2b',
party: {
quest: {
progress: {
up: 0,
down: 0,
collectedItems: 2,
collect: {},
},
},
},
preferences: {
},
},
},
challengeOptions: {},
}))
.add('Boss Quest/Rage Enabled', () => createStory({
template: `
<div class="component-showcase">
<right-sidebar :group="group" :is-party="true" :is-member="true" class="col-12"/>
</div>
`,
data () {
return {
group: groupBossQuestRage,
};
},
user: {
data: {
_id: 'acc2950e-9919-49bc-be7f-0ec4103e9f2b',
party: {
quest: {
progress: {
up: 20,
down: 0,
collectedItems: 2,
collect: {},
},
},
},
preferences: {
},
},
},
challengeOptions: {},
}))
.add('Not a party', () => createStory({
template: `
<div class="component-showcase">
<right-sidebar :group="group" :is-party="false" :is-member="true" class="col-12"/>
</div>
`,
data () {
return {
group: {
quest: {},
leader: {
},
},
};
},
user: {
data: {
_id: 'some-user',
party: {
},
preferences: {
},
},
},
challengeOptions: {},
}));
@@ -4,12 +4,18 @@
<group-plan-creation-modal />
<div>
<div class="header">
<h1 v-once class="text-center">
<h1
v-once
class="text-center"
>
{{ $t('groupPlanTitle') }}
</h1>
<div class="row">
<div class="col-8 offset-2 text-center">
<h2 v-once class="sub-text">
<h2
v-once
class="sub-text"
>
{{ $t('groupBenefitsDescription') }}
</h2>
</div>
@@ -24,8 +30,12 @@
src="~@/assets/images/group-plans/group-14@3x.png"
>
<hr>
<h2 v-once> {{ $t('teamBasedTasks') }} </h2>
<p v-once> {{ $t('teamBasedTasksListDesc') }} </p>
<h2 v-once>
{{ $t('teamBasedTasks') }}
</h2>
<p v-once>
{{ $t('teamBasedTasksListDesc') }}
</p>
</div>
</div>
<div class="col-4">
@@ -35,8 +45,12 @@
src="~@/assets/images/group-plans/group-12@3x.png"
>
<hr>
<h2 v-once> {{ $t('groupManagementControls') }} </h2>
<p v-once> {{ $t('groupManagementControlsDesc') }} </p>
<h2 v-once>
{{ $t('groupManagementControls') }}
</h2>
<p v-once>
{{ $t('groupManagementControlsDesc') }}
</p>
</div>
</div>
<div class="col-4">
@@ -46,8 +60,12 @@
src="~@/assets/images/group-plans/group-13@3x.png"
>
<hr>
<h2 v-once> {{ $t('inGameBenefits') }} </h2>
<p v-once> {{ $t('inGameBenefitsDesc') }} </p>
<h2 v-once>
{{ $t('inGameBenefits') }}
</h2>
<p v-once>
{{ $t('inGameBenefitsDesc') }}
</p>
</div>
</div>
</div>
@@ -6,13 +6,23 @@
class="fit-content mx-auto mt-4"
>
<div class="d-flex align-items-center">
<h1 v-once class="my-auto mr-auto"> {{ $t('findPartyMembers') }}</h1>
<h1
v-once
class="my-auto mr-auto"
>
{{ $t('findPartyMembers') }}
</h1>
<div
class="btn btn-secondary btn-sync ml-auto my-auto pl-2 pr-3 d-flex"
@click="refreshList()"
>
<div class="svg-icon icon-16 color my-auto mr-2" v-html="icons.sync"></div>
<div class="ml-auto"> {{ $t('refreshList') }} </div>
<div
class="svg-icon icon-16 color my-auto mr-2"
v-html="icons.sync"
></div>
<div class="ml-auto">
{{ $t('refreshList') }}
</div>
</div>
</div>
<div class="d-flex flex-wrap seeker-list">
@@ -24,9 +34,9 @@
<div class="d-flex">
<avatar
:member="seeker"
:hideClassBadge="true"
@click.native="showMemberModal(seeker._id)"
:hide-class-badge="true"
class="mr-3 mb-2"
@click.native="showMemberModal(seeker._id)"
/>
<div class="card-data">
<user-link
@@ -54,26 +64,32 @@
</strong>
</div>
<div>
<strong v-once class="mr-2"> {{ $t('checkinsLabel') }} </strong>
<strong
v-once
class="mr-2"
> {{ $t('checkinsLabel') }} </strong>
{{ seeker.loginIncentives }}
</div>
<div>
<strong v-once class="mr-2"> {{ $t('languageLabel') }} </strong>
<strong
v-once
class="mr-2"
> {{ $t('languageLabel') }} </strong>
{{ displayLanguage(seeker.preferences.language) }}
</div>
</div>
</div>
<strong
v-if="!seeker.invited"
@click="inviteUser(seeker._id, index)"
class="btn btn-primary w-100"
@click="inviteUser(seeker._id, index)"
>
{{ $t('inviteToParty') }}
</strong>
<div
v-else
@click="rescindInvite(seeker._id, index)"
class="btn btn-success w-100"
@click="rescindInvite(seeker._id, index)"
v-html="$t('invitedToYourParty')"
>
</div>
@@ -95,7 +111,6 @@
class="svg-icon icon-32 color m-auto"
v-html="icons.users"
>
</div>
</div>
<strong class="mb-1"> {{ $t('findMorePartyMembers') }} </strong>
@@ -49,7 +49,7 @@
key-prop="value"
@select="changeSortOption($event)"
>
<template v-slot:item="{ item }">
<template #item="{ item }">
<span
v-if="item"
class="label"
@@ -64,7 +64,7 @@
key-prop="value"
@select="changeSortDirection($event)"
>
<template v-slot:item="{ item }">
<template #item="{ item }">
<span
v-if="item"
class="label"
@@ -1,89 +0,0 @@
/* 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 content from '@/../../common/script/content';
import questDetailModal from './questDetailModal';
import questCompleted from '../achievements/questCompleted';
const stories = storiesOf('Quests/Dialog', module);
stories.addDecorator(withKnobs);
stories
.add('selectQuestDialog', () => ({
components: { questDetailModal },
data () {
return {
quest: quests.goldenknight2,
questWithDrop: quests.moon1,
};
},
template: `
<div>
<quest-detail-modal :group="{}"></quest-detail-modal>
</div>
`,
mounted () {
this.$root.$emit('bv::show::modal', 'quest-detail-modal');
},
}))
.add('questDetailModal', () => ({
components: { questDetailModal },
data () {
return {
quest: quests.goldenknight2,
questWithDrop: quests.moon1,
};
},
template: `
<div>
<quest-detail-modal :group="{}"></quest-detail-modal>
</div>
`,
mounted () {
this.$root.$emit('bv::show::modal', 'quest-detail-modal', {
key: 'moon1',
from: 'sidebar',
});
},
}))
.add('quest-completed', () => ({
components: { questCompleted },
data () {
return {
quest: quests.goldenknight2,
questWithDrop: quests.moon1,
};
},
template: `
<div>
<quest-completed></quest-completed>
</div>
`,
mounted () {
this.$root.$emit('bv::show::modal', 'quest-completed');
},
store: {
state: {
content,
user: {
data: {
stats: {},
tags: [],
items: {
quests: {
moon1: 3,
},
},
party: {
quest: {
completed: 'vice3',
},
},
},
},
},
},
}));
@@ -23,7 +23,7 @@
class="ml-2"
:no-caret="true"
>
<template v-slot:button-content>
<template #button-content>
<span
v-once
class="svg-icon inline menuIcon"
@@ -1,10 +1,10 @@
<template>
<base-banner
v-if="showChatWarning"
banner-id="chat-warning"
banner-class="chat-banner"
class="chat-banner"
height="3rem"
v-if="showChatWarning"
:class="{faq: faqPage}"
>
<div
@@ -47,7 +47,7 @@ export default {
if (this.notification.data.destination.indexOf('backgrounds') !== -1) {
this.$store.state.avatarEditorOptions.editingUser = true;
this.$store.state.avatarEditorOptions.startingPage = 'backgrounds';
this.$store.state.avatarEditorOptions.subpage = '2023';
this.$store.state.avatarEditorOptions.subpage = '2024';
this.$root.$emit('bv::show::modal', 'avatar-modal');
} else {
this.$router.push(this.notification.data.destination || '/inventory/items');
@@ -40,7 +40,7 @@
>{{ $t('editAvatar') }}</a>
<a
class="topbar-dropdown-item dropdown-item dropdown-separated"
@click="showAvatar('backgrounds', '2023')"
@click="showAvatar('backgrounds', '2024')"
>{{ $t('backgrounds') }}</a>
<a
class="topbar-dropdown-item dropdown-item"
@@ -68,7 +68,7 @@
:inline-dropdown="false"
@select="groupBy = $event"
>
<template v-slot:item="{ item }">
<template #item="{ item }">
<span class="label">{{ groupByLabel(item) }}</span>
</template>
</select-list>
@@ -4,7 +4,7 @@
right="right"
toggle-class="with-icon"
>
<template v-slot:button-content>
<template #button-content>
<span
class="svg-icon inline color"
v-html="icons.unequipIcon"
@@ -1,34 +0,0 @@
/* 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: `
<div style="position: absolute; margin: 20px">
<member-details :member="user"></member-details>
</div>
`,
data () {
return {
user: userStyles,
};
},
}))
.add('quest participants (new)', () => ({
components: { MemberDetailsNew },
template: `
<div style="position: absolute; margin: 20px">
<member-details-new :member="user"></member-details-new>
</div>
`,
data () {
return {
user: userStyles,
};
},
}));
@@ -33,7 +33,7 @@
:name="member.profile.name"
:backer="member.backer"
:contributor="member.contributor"
:showBuffed="isBuffed"
:show-buffed="isBuffed"
:context="'profile'"
/>
</span>
@@ -6,7 +6,9 @@
size="md"
>
<div slot="modal-header">
<h2 class="mt-2 mb-0"> {{ $t('reportPlayer') }} </h2>
<h2 class="mt-2 mb-0">
{{ $t('reportPlayer') }}
</h2>
<close-x
@close="close()"
/>
@@ -14,7 +16,9 @@
<div>
<blockquote>
<strong> {{ displayName }} </strong>
<p class="mb-0"> {{ username }} </p>
<p class="mb-0">
{{ username }}
</p>
</blockquote>
<div>
<strong>{{ $t('whyReportingPlayer') }}</strong>
@@ -26,7 +30,8 @@
</div>
<p
class="mb-2"
v-html="$t('playerReportModalBody', abuseFlagModalBody)">
v-html="$t('playerReportModalBody', abuseFlagModalBody)"
>
</p>
</div>
<div class="footer text-center d-flex flex-column">
@@ -152,12 +152,12 @@ export default {
components: {
userLink,
},
mixins: [externalLinks],
filters: {
timeAgo (value) {
return moment(value).fromNow();
},
},
mixins: [externalLinks],
props: {
msg: {},
},
@@ -13,6 +13,7 @@
v-for="(post, index) in posts"
:key="post._id"
class="static-view bailey"
id="bailey"
:class="{'bailey-last': index == (posts.length - 1)}"
>
<small
@@ -33,6 +34,17 @@
<style lang='scss'>
@import '~@/assets/scss/static.scss';
#bailey {
.markdown-img-link {
display: flex;
align-items: center;
img {
margin-left: auto;
margin-right: auto;
}
}
}
</style>
<style lang='scss' scoped>
@@ -339,7 +339,6 @@ export default {
userMp: 'user.data.stats.mp',
userNotifications: 'user.data.notifications',
userAchievements: 'user.data.achievements', // @TODO: does this watch deeply?
armoireEmpty: 'user.data.flags.armoireEmpty',
questCompleted: 'user.data.party.quest.completed',
}),
userClassSelect () {
@@ -410,10 +409,6 @@ export default {
if (this.user.needsCron) return;
this.handleUserNotifications(after);
},
armoireEmpty (after, before) {
if (after === before || after === false) return;
this.$root.$emit('bv::show::modal', 'armoire-empty');
},
questCompleted () {
if (!this.questCompleted) return;
this.$root.$emit('bv::show::modal', 'quest-completed');
@@ -1,49 +0,0 @@
/* eslint-disable import/no-extraneous-dependencies */
import { storiesOf } from '@storybook/vue';
import PaymentsButtonsList from './list.vue';
import getStore from '@/store';
import { setup as setupPayments } from '@/libs/payments';
setupPayments();
storiesOf('Subscriptions/Payments Buttons', module)
.add('simple', () => ({
components: { PaymentsButtonsList },
template: `
<div style="position: absolute; margin: 20px">
<payments-buttons-list
:amazon-data="{type: 'single'}"
:stripe-fn="() => {}"
:paypal-fn="() => {}"
></payments-buttons-list>
</div>
`,
store: getStore(),
}))
.add('disabled', () => ({
components: { PaymentsButtonsList },
template: `
<div style="position: absolute; margin: 20px">
<payments-buttons-list
:disabled="true"
:amazon-data="{type: 'single'}"
:stripe-fn="() => {}"
:paypal-fn="() => {}"
></payments-buttons-list>
</div>
`,
store: getStore(),
}))
.add('only stripe and amazon (example)', () => ({
components: { PaymentsButtonsList },
template: `
<div style="position: absolute; margin: 20px">
<payments-buttons-list
:amazon-data="{type: 'single'}"
:stripe-fn="() => {}"
></payments-buttons-list>
</div>
`,
store: getStore(),
}));
@@ -165,11 +165,15 @@
v-if="eventName === 'fall_extra_gems' || eventName === 'spooky_extra_gems'"
class="d-flex flex-column justify-content-center"
>
<h4 class="mt-3 mx-auto"> {{ $t('howItWorks') }}</h4>
<h4 class="mt-3 mx-auto">
{{ $t('howItWorks') }}
</h4>
<small class="text-center">
{{ $t('gemSaleHow', { eventStartMonth, eventStartOrdinal, eventEndOrdinal }) }}
</small>
<h4 class="mt-3 mx-auto"> {{ $t('limitations') }}</h4>
<h4 class="mt-3 mx-auto">
{{ $t('limitations') }}
</h4>
<small class="text-center">
{{ $t('gemSaleLimitations', {
eventStartMonth,
@@ -189,7 +193,6 @@
#buy-gems {
small {
color: $gray-100;
font-size: 12px;
margin-left: 20px;
margin-right: 20px;
@@ -124,7 +124,14 @@
v-once
class="mx-5 mt-1"
>
{{ $t('g1g1Limitations') }}
{{ $t('g1g1Limitations', {
promoStartMonth,
promoStartOrdinal,
promoStartTime,
promoEndMonth,
promoEndOrdinal,
promoEndTime,
}) }}
</p>
</div>
</b-modal>
@@ -289,6 +296,7 @@ h2 {
import debounce from 'lodash/debounce';
import find from 'lodash/find';
import isUUID from 'validator/lib/isUUID';
import moment from 'moment';
import { mapState } from '@/libs/store';
import closeIcon from '@/assets/svg/close.svg';
import bigGiftIcon from '@/assets/svg/big-gift.svg';
@@ -318,12 +326,35 @@ export default {
if (this.userSearchTerm.length < 1) return true;
return typeof this.foundUser._id === 'undefined';
},
userInputInvalidIssues () {
return this.userSearchTerm.length > 0 && this.userNotFound
? [this.$t('userWithUsernameOrUserIdNotFound')]
: [''];
},
promoStartMonth () {
if (!this.currentEvent) return null;
return moment(this.currentEvent.start).format('MMMM');
},
promoStartOrdinal () {
if (!this.currentEvent) return null;
return moment(this.currentEvent.start).format('Do');
},
promoStartTime () {
if (!this.currentEvent) return null;
return moment(this.currentEvent.start).format('hh:mm A');
},
promoEndMonth () {
if (!this.currentEvent) return null;
return moment(this.currentEvent.end).format('MMMM');
},
promoEndOrdinal () {
if (!this.currentEvent) return null;
return moment(this.currentEvent.end).format('Do');
},
promoEndTime () {
if (!this.currentEvent) return null;
return moment(this.currentEvent.end).format('hh:mm A');
},
},
watch: {
userSearchTerm: {
@@ -31,7 +31,7 @@
>
<avatar
:member="userReceivingGift"
:hideClassBadge="true"
:hide-class-badge="true"
class="d-flex flex-column mx-auto align-items-center"
/>
<div class="avatar-spacer"></div>
@@ -74,8 +74,8 @@
<subscription-options
v-show="selectedPage === 'subscription'"
class="subscribe-option"
:userReceivingGift="userReceivingGift"
:receiverName="receiverName"
:user-receiving-gift="userReceivingGift"
:receiver-name="receiverName"
/>
<!-- gem block -->
@@ -1,37 +0,0 @@
/* eslint-disable import/no-extraneous-dependencies */
import { storiesOf } from '@storybook/vue';
import Subscription from './subscription.vue';
import { mockStore } from '../../../config/storybook/mock.data';
storiesOf('Subscriptions/Detail Page', module)
.add('subscribed', () => ({
components: { Subscription },
template: `
<div style="position: absolute; margin: 20px">
<subscription ></subscription>
</div>
`,
data () {
return {
};
},
store: mockStore({
userData: {
purchased: {
plan: {
customerId: 'customer-id',
planId: 'plan-id',
subscriptionId: 'sub-id',
gemsBought: 22,
dateUpdated: new Date(2021, 0, 15),
consecutive: {
count: 2,
gemCapExtra: 4,
offset: 2,
},
},
},
},
}),
}));
@@ -279,7 +279,10 @@
</div>
</div>
<div class="mt-4 nextHourglassDescription" v-once>
<div
v-once
class="mt-4 nextHourglassDescription"
>
*{{ $t('nextHourglassDescription') }}
</div>
</div>
@@ -177,6 +177,7 @@
.inner-content {
margin: 33px auto auto;
padding: 0px 24px;
}
.item-notes {
@@ -447,7 +447,6 @@ function removeStopwordsFromText (text, language) {
de: stopword.deu,
en: stopword.eng,
en_GB: stopword.eng,
'en@pirate': stopword.eng.concat(["th'"]),
es: stopword.spa,
es_419: stopword.spa,
fr: stopword.fra,
@@ -463,7 +462,6 @@ function removeStopwordsFromText (text, language) {
ro: stopword.ron,
ru: stopword.rus,
sk: stopword.slv,
// sr: stopword.,
sv: stopword.swe,
tr: stopword.tur,
uk: stopword.ukr,
@@ -1,82 +0,0 @@
/* 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.stressbeast,
questWithGear: quests.moon1,
evilsanta: quests.evilsanta,
};
},
template: `
<div>
<quest-rewards :quest="quest"></quest-rewards>
<quest-rewards :quest="questWithDrop"></quest-rewards>
<quest-rewards :quest="questWithGear"></quest-rewards>
<quest-rewards :quest="evilsanta"></quest-rewards>
</div>
`,
}))
.add('itemWithLabel', () => ({
components: { itemWithLabel },
data () {
return {
};
},
template: `
<div>
<item-with-label :item="{}">
<div slot="itemContent">
</div>
<div slot="itemImage">
Image
</div>
<div slot="label">
Label
</div>
</item-with-label>
<item-with-label :item="{}" label-class="purple">
<div slot="itemContent">
</div>
<div slot="itemImage">
Image
</div>
<div slot="label">
Label
</div>
</item-with-label>
</div>
`,
}))
.add('questPopover', () => ({
components: { questPopover },
data () {
return {
quest: quests.goldenknight2,
quest2: quests.moon1,
};
},
template: `
<div>
<quest-popover :item="quest"></quest-popover>
<quest-popover :item="quest2"></quest-popover>
</div>
`,
}));
@@ -1,215 +0,0 @@
/* eslint-disable import/no-extraneous-dependencies */
import { storiesOf } from '@storybook/vue';
import { boolean, withKnobs } from '@storybook/addon-knobs';
import Notification from './notification';
import Notifications from './notifications';
import notificationsMixin from '../../mixins/notifications';
const stories = storiesOf('Notifications', module);
stories.addDecorator(withKnobs);
stories
.add('notifications overview', () => ({
components: {
Notification,
},
template: `
<div style="position: absolute; margin: 20px">
<div style="display: flex; flex-wrap: wrap; align-items: flex-start">
<Notification v-for="notification of notifications"
:notification="notification"
:style="{outline: showBounds ? '1px solid green': ''}"
style="margin-right: 1rem">
</Notification> <br/>
</div>
</div>
`,
data () {
const notifications = [];
notifications.push({
type: 'hp',
sign: '+',
text: '+2',
});
notifications.push({
type: 'hp',
sign: '-',
text: '-2',
});
notifications.push({
type: 'mp',
sign: '+',
text: '+2',
});
notifications.push({
type: 'mp',
sign: '-',
text: '-2',
});
notifications.push({
type: 'xp',
sign: '+',
text: '+12',
});
notifications.push({
type: 'xp',
sign: '-',
text: '-12',
});
notifications.push({
type: 'gp',
sign: '+',
text: '+12',
});
notifications.push({
type: 'gp',
sign: '-',
text: '-12',
});
notifications.push({
type: 'streak',
text: '12',
});
notifications.push({
type: 'damage',
sign: '+',
text: '12',
});
notifications.push({
type: 'drop',
icon: 'shop_weapon_wizard_2',
text: 'Dropped something with a longer text to try',
});
notifications.push({
type: 'drop',
icon: 'Pet_Egg_FlyingPig',
text: 'Dropped flying pig egg',
});
notifications.push({
type: 'drop',
icon: 'Pet_Food_Strawberry',
text: 'Youve found a Strawberry!',
});
notifications.push({
type: 'info',
text: 'Info',
});
notifications.push({
type: 'success',
text: 'Success!',
});
notifications.push({
type: 'crit',
text: 'Crit!',
});
notifications.push({
type: 'lvl',
text: 'Lvl Up',
});
notifications.push({
type: 'error',
text: 'This is an error message. If it is too long, we can wrap to show the rest of the message',
});
return {
notifications,
};
},
props: {
showBounds: {
default: boolean('show bounds', false),
},
},
}))
.add('trigger notifications', () => ({
components: {
Notifications,
},
template: `
<div style="position: absolute; margin: 20px">
<button @click="addNotification()">Add Notifications</button>
<button @click="crit(1337)">Crit</button>
<button @click="drop('Drop', {type:'weapon', key: 'wizard_2'})">Drop</button>
<button @click="quest('quest', 'val')">Quest</button>
<button @click="damage(-13)">Damage</button>
<button @click="exp(42)">Exp</button>
<button @click="error('some error')">Error</button>
<br/>
<button @click="gp(23, 0)">Gold</button>
<button @click="hp(23)">HP</button>
<button @click="mp(23)">MP</button>
<button @click="lvl()">LVL</button>
<button @click="streak('Streak')">Streak</button>
<br/>
<button @click="markdown('You cast a skill')">Markdown</button>
<Notifications :prevent-queue="preventQueue"
:debug-mode="debugMode"
:style="{outline: showBounds ? '1px solid green': ''}">
</Notifications>
</div>
`,
props: {
showBounds: {
default: boolean('show bounds', false),
},
preventQueue: {
default: boolean('prevent removing', false),
},
debugMode: {
default: boolean('debug mode', true),
},
},
data () {
return {};
},
mixins: [notificationsMixin],
methods: {
addNotification () {
this.text('notification!!');
this.text('notification2!!');
this.text('notification3!!');
this.error('This should stay visible');
this.text('notification4!!');
this.exp(125);
this.damage(-2);
this.error('This should stay visible too');
this.text('notification5!!');
this.exp(125);
this.damage(-2);
},
},
}));
@@ -270,6 +270,11 @@ export default {
return `${this.notification.type} ${this.negative}`;
},
},
mounted () {
if (this.notification.type === 'drop' && this.notification.emptied) {
this.$root.$emit('bv::show::modal', 'armoire-empty');
}
},
methods: {
handleOnClick () {
if (typeof this.notification.onClick === 'function') {
@@ -153,7 +153,6 @@
<div class="body-text">
<p v-html="$t('sunsetFaqPara20')"></p>
</div>
</div>
<!-- sidebar -->
+491 -65
View File
@@ -1,85 +1,304 @@
<template>
<div
class="container-fluid"
role="tablist"
>
<div class="row">
<div class="col-12 col-md-6 offset-md-3">
<h1
v-once
id="faq-heading"
>
{{ $t('frequentlyAskedQuestions') }}
</h1>
<div
v-for="(entry, index) in faq.questions"
:key="index"
class="faq-question"
>
<h2
<div class="top-container mx-auto">
<div class="main-text mr-4 col-8">
<!-- title -->
<div
class="title-details"
role="tablist"
>
<div class="body-text">
<h1
v-once
v-if="index === 0"
id="faq-heading"
>
{{ $t('general') }}
</h2>
<h2
v-once
v-if="entry.heading === 'party-with-friends'"
id="parties"
{{ $t('frequentlyAskedQuestions') }}
</h1>
<!-- subheadings -->
<div
v-for="(entry, index) in faq.questions"
:key="index"
class="body-text"
>
{{ $t('parties') }}
</h2>
<h3
v-once
v-b-toggle="entry.heading"
role="tab"
variant="info"
@click="handleClick($event)"
>
{{ entry.question }}
</h3>
<b-collapse
:id="entry.heading"
:visible="isVisible(entry.heading)"
accordion="faq"
role="tabpanel"
>
<div
<h2
v-if="index === 0"
v-once
v-markdown="entry.web"
class="card-body"
></div>
</b-collapse>
>
{{ $t('commonQuestions') }}
</h2>
<h2
v-if="entry.heading === 'play-with-others'"
v-once
id="parties"
>
{{ $t('parties') }}
</h2>
<h2
v-if="entry.heading === 'what-is-group-plan'"
v-once
id="group-plans"
>
{{ $t('groupPlan') }}
</h2>
<!-- entry header -->
<h3
v-once
v-b-toggle="entry.heading"
role="tab"
variant="info"
class="headings"
@click="handleClick($event)"
>
{{ entry.question }}
</h3>
<b-collapse
:id="entry.heading"
:visible="isVisible(entry.heading)"
accordion="faq"
role="tabpanel"
>
<!-- questions -->
<div
v-once
v-markdown="entry.web"
class="card-body p-0 pb-3"
></div>
</b-collapse>
</div>
</div>
</div>
</div>
<!-- sidebar -->
<div class="sidebar py-4 d-flex flex-column">
<!-- staff -->
<div class="ml-4">
<h2>
{{ $t('staff') }}
</h2>
<div class="d-flex flex-wrap">
<div
v-for="user in staff"
:key="user.uuid"
class="staff col-6 p-0"
>
<div class="d-flex">
<router-link
class="title"
:to="{'name': 'userProfile', 'params': {'userId': user.uuid}}"
>
{{ user.name }}
</router-link>
<div
v-if="user.type === 'Staff'"
class="svg-icon staff-icon ml-1"
v-html="icons.tierStaff"
></div>
</div>
</div>
</div>
</div>
<!-- player tiers -->
<div class="ml-4">
<h2 class="mt-4 mb-1">
{{ $t('playerTiers') }}
</h2>
<ul class="tier-list">
<li
v-once
class="tier1 d-flex justify-content-center"
>
{{ $t('tier1') }}
<div
class="svg-icon ml-1"
v-html="icons.tier1"
></div>
</li>
<li
v-once
class="tier2 d-flex justify-content-center"
>
{{ $t('tier2') }}
<div
class="svg-icon ml-1"
v-html="icons.tier2"
></div>
</li>
<li
v-once
class="tier3 d-flex justify-content-center"
>
{{ $t('tier3') }}
<div
class="svg-icon ml-1"
v-html="icons.tier3"
></div>
</li>
<li
v-once
class="tier4 d-flex justify-content-center"
>
{{ $t('tier4') }}
<div
class="svg-icon ml-1"
v-html="icons.tier4"
></div>
</li>
<li
v-once
class="tier5 d-flex justify-content-center"
>
{{ $t('tier5') }}
<div
class="svg-icon ml-1"
v-html="icons.tier5"
></div>
</li>
<li
v-once
class="tier6 d-flex justify-content-center"
>
{{ $t('tier6') }}
<div
class="svg-icon ml-1"
v-html="icons.tier6"
></div>
</li>
<li
v-once
class="tier7 d-flex justify-content-center"
>
{{ $t('tier7') }}
<div
class="svg-icon ml-1"
v-html="icons.tier7"
></div>
</li>
<li
v-once
class="moderator d-flex justify-content-center"
>
{{ $t('tierModerator') }}
<div
class="svg-icon ml-1"
v-html="icons.tierMod"
></div>
</li>
<li
v-once
class="staff d-flex justify-content-center"
>
{{ $t('tierStaff') }}
<div
class="svg-icon ml-1"
v-html="icons.tierStaff"
></div>
</li>
<li
v-once
class="npc d-flex justify-content-center"
>
{{ $t('tierNPC') }}
</li>
</ul>
</div>
<!-- Daniel in sweet, sweet retirement with Jorts -->
<div>
<div class="gradient">
</div>
<div
class="grassy-meadow-backdrop"
:style="{'background-image': imageURLs.background}"
>
<div
class="daniel_front"
:style="{'background-image': imageURLs.npc}"
></div>
<div
class="pixel-border"
:style="{'background-image': imageURLs.pixel_border}"
></div>
</div>
</div>
<!-- email admin -->
<div class="d-flex flex-column justify-content-center">
<div class="question mx-auto">
{{ $t('anotherQuestion') }}
</div>
<div
class="contact mx-auto"
>
<p v-html="$t('contactAdmin')"></p> <!-- there's html in here -->
</div>
<hr>
<p
v-once
v-markdown="stillNeedHelp"
></p>
</div>
</div>
</div>
</template>
<style lang='scss' scoped>
@import '~@/assets/scss/colors.scss';
h1 {
line-height: 1.33;
margin-top: 0px;
}
h2 {
color: #34313a;
border-bottom: 1px solid #e1e0e3;
color: $gray-10;
margin-top: 24px;
}
li {
padding-bottom: 16px;
&::marker {
size: 0.5em;
}
}
p {
margin-bottom: 21px;
}
ul {
padding-left: 20px;
}
.top-container {
display: flex;
margin-top: 80px;
width: 66.67%;
@media (max-width: 1024px) {
flex-wrap: wrap;
}
}
.main-text {
.body-text {
color: $gray-10;
font-size: 14px;
line-height: 1.71;
}
.headings {
color: $purple-200;
font-size: 16px;
font-weight: 400;
line-height: 1.75;
}
}
.faq-question {
a {
color: $purple-200;
text-decoration: none;
color: #4F2A93;
}
h3 {
cursor: pointer;
font-size: 16px;
font-weight: normal;
line-height: 1.75;
cursor: pointer;
&:hover {
text-decoration: underline;
@@ -87,27 +306,200 @@
}
.card-body {
padding: 0;
font-size: 14px;
line-height: 1.71;
margin-bottom: 1em;
margin-bottom: 16px;
padding: 0;
}
}
.container-fluid {
position: relative;
top: 2rem;
}
.sidebar {
height: fit-content;
background-color: $gray-700;
border-radius: 16px;
width: 330px;
margin-bottom: 24px;
@media only screen and (max-width: 768px) {
.container-fluid {
margin: auto;
h2 {
color: $gray-10;
font-family: Roboto;
font-size: 14px;
font-weight: bold;
line-height: 1.71;
margin-top: 0px;
}
.staff {
.staff-icon {
margin-top: 5px;
width: 10px;
}
.title {
color: $purple-300;
display: inline-block;
font-weight: bold;
height: 24px;
margin-bottom: 4px;
}
}
.tier-list {
font-size: 1em !important;
list-style-type: none;
padding: 0;
width: 282px;
li {
border-radius: 4px;
border: solid 1px $gray-500;
font-weight: bold;
height: 40px;
line-height: 1.71;
margin-bottom: 8px;
margin-right: 4px;
padding: 8px 0;
text-align: center;
}
.tier1 {
color: #c42870;
.svg-icon {
margin-top: 5px;
width: 11px;
}
}
.tier2 {
color: #b01515;
.svg-icon {
margin-top: 5px;
width: 11px;
}
}
.tier3 {
color: #d70e14;
.svg-icon {
margin-top: 4px;
width: 13px;
}
}
.tier4 {
color: #c24d00;
.svg-icon {
margin-top: 4px;
width: 13px;
}
}
.tier5 {
color: #9e650f;
.svg-icon {
margin-top: 7px;
width: 8px;
}
}
.tier6 {
color: #2b8363;
.svg-icon {
margin-top: 7px;
width: 8px;
}
}
.tier7 {
color: #167e87;
.svg-icon {
margin-top: 4px;
width: 12px;
}
}
.moderator {
color: #277eab;
.svg-icon {
margin-top: 3px;
width: 13px;
}
}
.staff {
color: #6133b4;
.svg-icon {
margin-top: 7px;
width: 10px;
}
}
.npc {
color: $black;
}
}
.gradient {
background-image: linear-gradient(to bottom, $gray-700 0%, rgba(249, 249, 249, 0) 100%);
height: 100px;
position: absolute;
margin: -1px 0 116px;
width: 330px;
}
.grassy-meadow-backdrop {
background-repeat: repeat-x;
height: 246px;
width: 330px;
}
.daniel_front {
background-repeat: no-repeat;
height: 246px;
margin: 0 auto;
width: 330px;
}
.pixel-border {
background-repeat: no-repeat;
height: 30px;
margin-top: -30px;
position: absolute;
width: 330px;
}
.question {
color: $gray-10;
font-size: 1em;
font-weight: bold;
line-height: 1.71;
margin-top: 24px;
}
.contact p {
font-size: 1em;
margin-bottom: 0px;
}
}
</style>
<script>
import find from 'lodash/find';
import markdownDirective from '@/directives/markdown';
import { mapState } from '@/libs/store';
import tier1 from '@/assets/svg/tier-1.svg';
import tier2 from '@/assets/svg/tier-2.svg';
import tier3 from '@/assets/svg/tier-3.svg';
import tier4 from '@/assets/svg/tier-4.svg';
import tier5 from '@/assets/svg/tier-5.svg';
import tier6 from '@/assets/svg/tier-6.svg';
import tier7 from '@/assets/svg/tier-7.svg';
import tierMod from '@/assets/svg/tier-mod.svg';
import tierNPC from '@/assets/svg/tier-npc.svg';
import tierStaff from '@/assets/svg/tier-staff.svg';
import staffList from '../../libs/staffList';
export default {
directives: {
@@ -118,8 +510,41 @@ export default {
faq: {},
headings: [],
stillNeedHelp: '',
icons: Object.freeze({
tier1,
tier2,
tier3,
tier4,
tier5,
tier6,
tier7,
tierMod,
tierNPC,
tierStaff,
}),
staff: staffList,
};
},
computed: {
...mapState({
currentEventList: 'worldState.data.currentEventList',
}),
imageURLs () {
const currentEvent = find(this.currentEventList, event => Boolean(event.season));
if (!currentEvent) {
return {
background: 'url(/static/npc/normal/tavern_background.png)',
npc: 'url(/static/npc/normal/tavern_npc.png)',
pixel_border: 'url(/static/npc/normal/pixel_border.png)',
};
}
return {
background: `url(/static/npc/${currentEvent.season}/tavern_background.png)`,
npc: `url(/static/npc/${currentEvent.season}/tavern_npc.png)`,
pixel_border: 'url(/static/npc/normal/pixel_border.png)',
};
},
},
async mounted () {
this.$store.dispatch('common:setTitle', {
section: this.$t('help'),
@@ -130,6 +555,7 @@ export default {
this.headings.push(entry.heading);
}
this.stillNeedHelp = this.faq.stillNeedHelp.web;
document.body.style.background = '#ffffff';
},
methods: {
isVisible (heading) {
@@ -6,7 +6,7 @@
:to="!isUserLoggedIn ? '/static/home' : '/'"
>
<div
v-if="this.$route.name === 'plans'"
v-if="$route.name === 'plans'"
class="logo svg-icon"
v-html="icons.purpleLogo"
></div>
@@ -2,11 +2,11 @@
<div>
<chat-banner />
<static-header
v-if="showContentWrap"
:class="{
'home-header': ['home', 'front'].indexOf($route.name) !== -1,
'white-header': this.$route.name === 'plans'
}"
v-if="showContentWrap"
:class="{
'home-header': ['home', 'front'].indexOf($route.name) !== -1,
'white-header': $route.name === 'plans'
}"
/>
<div class="static-wrapper">
<router-view />
@@ -31,7 +31,7 @@
<strong> @{{ completion.userName }} </strong>
</div>
<div
v-if='completion.completedDate'
v-if="completion.completedDate"
:class="{'green-10': completion.completed}"
>
{{ completion.completedDateString }}
@@ -54,16 +54,16 @@
v-html="message"
></div>
<div
class="d-flex ml-auto mr-1 my-auto"
v-if="task.group.assignedUsers && ['daily','todo'].indexOf(task.type) !== -1"
class="d-flex ml-auto mr-1 my-auto"
>
<span
v-if="assignedUsersCount > 1"
class="d-flex mr-1 my-auto"
>
<span
class="small-check"
v-if="!showStatus && completionsCount"
class="small-check"
>
<div
class="svg-icon color"
@@ -73,9 +73,9 @@
</div>
</span>
<span
v-if="!showStatus && completionsCount"
class="ml-1 mr-2 my-auto"
:class="{'green-10': completionsCount === assignedUsersCount}"
v-if="!showStatus && completionsCount"
>
{{ completionsCount }}/{{ assignedUsersCount }}
</span>
@@ -98,10 +98,10 @@
class="mr-1 d-inline-flex"
>
<span
v-html="icons.lastComplete"
v-b-tooltip.hover.bottom="$t('lastCompleted')"
class="svg-icon color last-completed mr-1 my-auto"
:class="{'gray-200': completionsCount !== assignedUsersCount}"
v-html="icons.lastComplete"
>
</span>
<span
@@ -697,13 +697,13 @@ export default {
},
setColumnBackgroundVisibility () {
this.$nextTick(() => {
if (!this.$refs.columnBackground || !this.$refs.tasksList) return;
if (!this.$refs.columnBackground) return;
const tasksWrapperEl = this.$refs.tasksWrapper;
const tasksWrapperHeight = tasksWrapperEl.offsetHeight;
const quickAddHeight = this.$refs.quickAdd ? this.$refs.quickAdd.offsetHeight : 0;
const tasksListHeight = this.$refs.tasksList.$el.offsetHeight;
const tasksListHeight = this.$refs.tasksList ? this.$refs.tasksList.$el.offsetHeight : 0;
let combinedTasksHeights = tasksListHeight + quickAddHeight;
@@ -1,46 +0,0 @@
import { storiesOf } from '@storybook/vue';
import { withKnobs } from '@storybook/addon-knobs';
import CheckList from './checklist.vue';
const stories = storiesOf('CheckList', module);
stories.addDecorator(withKnobs);
stories
.add('simple', () => ({
components: { CheckList },
template: `
<div style="position: absolute; margin: 20px; background: white">
<check-list :items.sync="checklist">
</check-list>
<br/>
<br/>
Data: <br/>
{{ checklist }}
</div>
`,
data () {
return {
checklist: [
{
id: 'c0890cd2-3c69-4889-bf2c-b63ac0ee6628',
text: 'first',
completed: false,
},
{
id: '5b913020-b340-4099-9a53-afcd27dc5637',
text: 'second',
completed: true,
},
{
id: '77b52a8e-4a0e-4717-9650-55fb5462b42f',
text: 'third',
completed: false,
},
],
};
},
}));
@@ -10,8 +10,8 @@
<div
class="svg-icon icon-16 my-auto ml-auto pointer"
:class="{'chevron-flip': showChecklist}"
v-html="icons.chevron"
@click="showChecklist = !showChecklist"
v-html="icons.chevron"
>
</div>
</div>
@@ -1,124 +0,0 @@
/* eslint-disable import/no-extraneous-dependencies */
import { storiesOf } from '@storybook/vue';
import { withKnobs, number } from '@storybook/addon-knobs';
import MultiList from './multiList';
import SelectMulti from './selectMulti';
const stories = storiesOf('Multiple Select List', module);
stories.addDecorator(withKnobs);
const exampleTagList = [
1, 2, 3,
];
const allTags = [
{
id: 1,
name: 'Small Tag',
},
{
id: 2,
name: 'This is a long tag',
},
{
id: 3,
name: 'This is a long tag',
},
{
id: 12,
name: 'This is a different tag',
},
{
id: 9001,
name: 'OVER 9000',
},
{
id: 4,
name: 'Four',
},
{
id: 5,
name: 'Five :tada:',
challenge: true,
},
{
id: 6,
name: 'Six',
},
{
id: 7,
name: 'Seven **Markdown**',
},
];
stories
.add('tag-list', () => ({
components: { MultiList },
template: `
<div style="position: absolute; margin: 20px">
<MultiList :max-items="maxTags" :items="tagList"></MultiList>
</div>
`,
props: {
tagList: {
default: allTags,
},
maxTags: {
default: number('Max-Tags', 3),
},
},
}))
.add('select-tag', () => ({
components: { SelectMulti },
template: `
<div style="position: absolute; margin: 20px">
<SelectMulti :selectedItems="tagList"
:add-new="true"
:all-items="allTags"
style="width: 400px"
@changed="tagList = $event"
@addNew="added = $event">
</SelectMulti>
<br/>
<br/>
Added event: {{ added }}
</div>
`,
data () {
return {
tagList: exampleTagList,
added: '',
};
},
props: {
allTags: {
default: allTags,
},
},
}))
.add('longer select-tag', () => ({
components: { SelectMulti },
template: `
<div style="position: absolute; margin: 20px">
<SelectMulti :selectedItems="tagList"
:all-items="allTags"
style="width: 400px"
@changed="tagList = $event"></SelectMulti>
</div>
`,
data () {
return {
tagList: [],
};
},
props: {
allTags: {
default: allTags,
},
},
}));
@@ -27,7 +27,7 @@
@remove-item="removeItem($event)"
/>
</b-dropdown-header>
<template v-slot:button-content>
<template #button-content>
<multi-list
class="d-flex flex-wrap"
:items="selectedItemsAsObjects"
@@ -19,14 +19,14 @@
/>
</div>
</b-dropdown-header>
<template v-slot:button-content>
<template #button-content>
<div
class="mr-1 d-inline-flex align-items-center"
@click.stop="selectItem({id: selectedItem})"
v-markdown="
allItemsMap[selectedItem] ? `@${allItemsMap[selectedItem].name}`
: emptyMessage
"
class="mr-1 d-inline-flex align-items-center"
@click.stop="selectItem({id: selectedItem})"
>
</div>
</template>
@@ -12,7 +12,7 @@
:placeholder="placeholder"
@select="selectItem($event)"
>
<template v-slot:item="{ item }">
<template #item="{ item }">
<span class="label">{{ $t(item) }}</span>
</template>
</select-list>
@@ -69,7 +69,7 @@
<div
class="spell-border"
:class="{ disabled: spellDisabled(key) || user.stats.lvl < skill.lvl,
'insufficient-mana': user.stats.mp < skill.mana }"
'insufficient-mana': user.stats.mp < skill.mana }"
>
<div
class="spell"
+4 -1
View File
@@ -1,5 +1,8 @@
<template>
<div class="task-wrapper" draggable>
<div
class="task-wrapper"
draggable
>
<div
class="task transition"
:class="[{
@@ -43,7 +43,7 @@
</div>
<div class="summary-block">
<h3> {{ $t('description') }} </h3>
<p v-html="summarySentence" ></p>
<p v-html="summarySentence"></p>
</div>
<div
v-if="task.checklist && task.checklist.length > 0"
@@ -51,13 +51,13 @@
>
<checklist
:items.sync="task.checklist"
:disableDrag="true"
:disableEdit="true"
:disable-drag="true"
:disable-edit="true"
/>
</div>
<div
class="summary-block"
v-if="assignedUsernames.length > 0"
class="summary-block"
>
<h3> {{ $t('assignedTo') }} </h3>
<div
+5 -3
View File
@@ -173,15 +173,17 @@
id="create-task-btn"
class="btn btn-primary create-btn d-flex align-items-center"
:class="{open: openCreateBtn}"
tabindex="0"
@click.stop.prevent="openCreateBtn = !openCreateBtn"
@keypress.enter="openCreateBtn = !openCreateBtn"
tabindex="0"
>
<div
class="svg-icon icon-10 color"
v-html="icons.positive"
></div>
<div class="ml-75 mr-1"> {{ $t('addTask') }} </div>
<div class="ml-75 mr-1">
{{ $t('addTask') }}
</div>
</div>
<div
v-if="openCreateBtn"
@@ -190,8 +192,8 @@
<div
v-for="type in columns"
:key="type"
@click="createTask(type)"
class="dropdown-item d-flex px-2 py-1"
@click="createTask(type)"
>
<div class="d-flex align-items-center justify-content-center task-icon">
<div
@@ -1,129 +0,0 @@
/* eslint-disable import/no-extraneous-dependencies */
import { storiesOf } from '@storybook/vue';
import { withKnobs } from '@storybook/addon-knobs';
import positiveIcon from '@/assets/svg/positive.svg';
const stories = storiesOf('Buttons', module);
stories.addDecorator(withKnobs);
stories
.add('all', () => ({
components: { },
data () {
return {
icon: positiveIcon,
};
},
template: `
<div style="position: absolute; margin: 20px; display: flex; flex-direction: row;">
<div class="mr-3">
<h3>Button</h3>
<button class="btn btn-primary">Button Primary</button>
<br/><br/>
<button class="btn btn-primary" disabled>Button Primary Disabled</button>
<br/><br/>
<button class="btn btn-secondary">Button Secondary</button>
<br/><br/>
<button class="btn btn-secondary" disabled>Button Secondary Disabled</button>
</div>
<div class="">
<h3>Button with Icon</h3>
<button class="btn btn-primary with-icon">
<span class="svg-icon color inline icon-12 mr-2"
v-html="icon"
>
</span>
<span class="button-label">
Button Primary
</span>
</button>
<br/>
<button class="btn btn-primary with-icon" disabled>
<span class="svg-icon color inline icon-12 mr-2"
v-html="icon"
>
</span>
<span class="button-label">
Button Primary Disabled
</span>
</button>
<br/>
<button class="btn btn-secondary with-icon">
<span class="svg-icon color inline icon-12 mr-2"
v-html="icon"
>
</span>
<span class="button-label">
Button Secondary
</span>
</button>
<br/>
<button class="btn btn-secondary with-icon" disabled>
<span class="svg-icon color inline icon-12 mr-2"
v-html="icon"
>
</span>
<span class="button-label">
Button Secondary Disabled
</span>
</button>
</div>
</div>
`,
}))
.add('dropdowns', () => ({
components: { },
data () {
return {
items: ['one', 'two', 'three'],
};
},
template: `
<div style="position: absolute; margin: 20px; display: flex; flex-direction: row;">
<div class="mr-3">
<h3>Dropdowns</h3>
<b-dropdown
text="Dropdown Primary"
right="right"
>
<b-dropdown-item
v-for="item in items"
:key="item"
>
{{ item }}
</b-dropdown-item>
</b-dropdown>
<br/><br/>
<b-dropdown
text="Dropdown Primary Disabled"
right="right"
disabled
>
</b-dropdown>
</div>
<div class="">
<h3>Button</h3>
<button class="btn btn-secondary">
<span class="button-label">
Button Primary
</span>
</button>
<br/>
<br/>
<button class="btn btn-secondary" disabled>
<span class="button-label">
Button Primary Disabled
</span>
</button>
</div>
</div>
`,
}));
@@ -1,70 +0,0 @@
/* eslint-disable import/no-extraneous-dependencies */
import { storiesOf } from '@storybook/vue';
import { withKnobs } from '@storybook/addon-knobs';
import Checkbox from './checkbox';
import ToggleCheckbox from './toggleCheckbox';
const stories = storiesOf('Checkbox', module);
stories.addDecorator(withKnobs);
stories
.add('checkbox', () => ({
components: {
Checkbox,
},
template: `
<div style="position: absolute; margin: 20px">
<Checkbox text="My Checkbox" id="someId"></Checkbox> <br/>
<Checkbox text="My Checked Checkbox" id="someOtherId" :checked.sync="checked"></Checkbox>
</div>
`,
data () {
return {
checked: true,
};
},
}))
.add('Toggle Checkbox Group', () => ({
components: {
ToggleCheckbox,
},
template: `
<div style="position: absolute; margin: 20px">
{{ checked }}
<div class="toggle-group" style="width: 300px">
<ToggleCheckbox text="Su"></ToggleCheckbox>
<ToggleCheckbox text="Mo"
:checked.sync="checked"></ToggleCheckbox>
<ToggleCheckbox text="Tu"></ToggleCheckbox>
<ToggleCheckbox text="We"
:checked.sync="checked"></ToggleCheckbox>
<ToggleCheckbox text="Th"></ToggleCheckbox>
<ToggleCheckbox text="Fr"
:checked.sync="checked"></ToggleCheckbox>
<ToggleCheckbox text="Sa"
:checked.sync="checked"
:disabled="true"></ToggleCheckbox>
</div>
<br/>
<br/>
Disabled:
<div class="toggle-group" style="width: 300px">
<ToggleCheckbox text="Su" :disabled="true"></ToggleCheckbox>
<ToggleCheckbox text="Mo" :disabled="true"></ToggleCheckbox>
<ToggleCheckbox text="Tu" :disabled="true"></ToggleCheckbox>
<ToggleCheckbox text="We" :disabled="true"></ToggleCheckbox>
<ToggleCheckbox text="Th" :disabled="true"></ToggleCheckbox>
<ToggleCheckbox text="Fr" :disabled="true"></ToggleCheckbox>
<ToggleCheckbox text="Sa" :disabled="true"></ToggleCheckbox>
</div>
</div>
`,
data () {
return {
checked: true,
};
},
}));
@@ -1,32 +0,0 @@
/* eslint-disable import/no-extraneous-dependencies */
import { storiesOf } from '@storybook/vue';
import { withKnobs, number } from '@storybook/addon-knobs';
import CountBadge from './countBadge.vue';
const stories = storiesOf('Count Badge', module);
stories.addDecorator(withKnobs);
stories
.add('simple', () => ({
components: { CountBadge },
template: `
<div style="position: absolute; margin: 20px">
<count-badge :count="2" :show="true"></count-badge>
</div>
`,
}))
.add('bind count', () => ({
components: { CountBadge },
template: `
<div style="position: absolute; margin: 20px">
<count-badge :count="count" :show="true"></count-badge>
</div>
`,
props: {
count: {
default: number('Count', 3),
},
},
}));
@@ -1,19 +0,0 @@
/* eslint-disable import/no-extraneous-dependencies */
import { storiesOf } from '@storybook/vue';
import { withKnobs } from '@storybook/addon-knobs';
import datepicker from './datepicker.vue';
const stories = storiesOf('Date Picker', module);
stories.addDecorator(withKnobs);
stories
.add('simple', () => ({
components: { datepicker },
template: `
<div style="position: absolute; margin: 20px">
<datepicker></datepicker>
</div>
`,
}));
@@ -6,12 +6,11 @@
:value="selectedItem"
class="array-select inline"
:right="true"
key-prop="id"
:hide-icon="false"
:inline-dropdown="false"
@select="selectItem($event)"
>
<template v-slot:item="{ item }">
<template #item="{ item }">
<span :class="{'dropdown-icon-item': withIcon}">
<slot
name="item"
@@ -1,71 +0,0 @@
/* eslint-disable import/no-extraneous-dependencies */
import { storiesOf } from '@storybook/vue';
import { number, text, withKnobs } from '@storybook/addon-knobs';
import positiveIcon from '@/assets/svg/positive.svg';
const stories = storiesOf('Input-Group', module);
stories.addDecorator(withKnobs);
stories
.add('states', () => ({
components: { },
template: `
<div style="position: absolute; margin: 20px">
<div class="input-group">
<div class="input-group-prepend positive-addon input-group-icon">
<div
class="svg-icon"
v-html="icon"
>
</div>
</div>
<input
v-model="number"
class="form-control"
type="number"
min="0"
required="required"
ref="input"
>
</div>
<br />
<button class="btn btn-dark" @click="$refs.input.focus()">Focus ^</button>
<br />
<br />
<div class="input-group">
<input
v-model="number"
class="form-control"
type="number"
min="0"
required="required"
>
<div class="input-group-append positive-addon input-group-icon">
<div
class="svg-icon"
v-html="icon"
>
</div>
</div>
</div>
</div>
`,
data () {
return {
icon: positiveIcon,
};
},
props: {
text: {
default: text('Input Text', 'example text'),
},
number: {
default: number('Input Number', 0),
},
},
}));
@@ -1,45 +0,0 @@
/* eslint-disable import/no-extraneous-dependencies */
import { storiesOf } from '@storybook/vue';
const stories = storiesOf('Margins', module);
const margins = [
'mr-1 ml-1 my-1',
'mx-2 ml-3 my-2',
'mx-2 ml-1 my-1',
'ml-1 mr-4',
'ml-2 mr-2 my-1',
'ml-75 my-3 mr-2',
];
stories
.add('overview', () => ({
components: { },
template: `
<div style="position: absolute; margin: 20px">
<span class="background inline-block">
<span class="content mx-1 my-1 inline-block">
<span class="text mx-1 my-1 inline-block">
The margin between gray and teal is the margin content.
</span>
</span>
</span>
<br />
<br />
<span v-for="m in margins"
class="background mx-1 my-1 inline-block">
<span class="content inline-block" :class="m">
<span class="mx-1 my-1 inline-block">{{m}}</span>
</span>
</span>
</div>
`,
data () {
return {
margins,
};
},
}));
@@ -1,24 +0,0 @@
/* eslint-disable import/no-extraneous-dependencies */
import { storiesOf } from '@storybook/vue';
import { withKnobs, boolean } from '@storybook/addon-knobs';
import PinBadge from './pinBadge.vue';
const stories = storiesOf('Pin Badge', module);
stories.addDecorator(withKnobs);
stories
.add('states', () => ({
components: { PinBadge },
template: `
<div style="position: absolute; margin: 20px">
<pin-badge :pinned="pinned"></pin-badge>
</div>
`,
props: {
pinned: {
default: boolean('Pinned', false),
},
},
}));
@@ -20,23 +20,38 @@
</div>
<div class="row">
<div class="col-12" v-if="selectedTab === 'gems'">
<div
v-if="selectedTab === 'gems'"
class="col-12"
>
<span v-if="gemTransactions.length === 0">
{{ $t('noGemTransactions') }}
</span>
<table class="table">
<tr>
<th v-once class="timestamp-column">
{{ $t('timestamp')}}
<th
v-once
class="timestamp-column"
>
{{ $t('timestamp') }}
</th>
<th v-once class="amount-column">
{{ $t('amount')}}
<th
v-once
class="amount-column"
>
{{ $t('amount') }}
</th>
<th v-once class="action-column">
{{ $t('action')}}
<th
v-once
class="action-column"
>
{{ $t('action') }}
</th>
<th v-once class="note-column">
{{ $t('note')}}
<th
v-once
class="note-column"
>
{{ $t('note') }}
</th>
</tr>
<tr
@@ -49,7 +64,10 @@
>{{ entry.createdAt | timeAgo }}</span>
</td>
<td>
<div class="amount-with-icon" :id="entry.id">
<div
:id="entry.id"
class="amount-with-icon"
>
<span
class="svg-icon inline icon-16 my-1"
aria-hidden="true"
@@ -95,39 +113,58 @@
</span>
<span v-else-if="transactionTypes.challenges.includes(entry.transactionType)">
<router-link
class="challenge-link"
:to="{ name: 'challenge', params: { challengeId: entry.reference } }">
class="challenge-link"
:to="{ name: 'challenge', params: { challengeId: entry.reference } }"
>
<span
v-markdown="entry.referenceText"
></span>
</router-link>
</span>
<span v-else v-html="entryReferenceText(entry)"></span>
<span
v-else
v-html="entryReferenceText(entry)"
></span>
<span v-if="entry.reference">
({{entry.reference}})
({{ entry.reference }})
</span>
</td>
</tr>
</table>
</div>
<div class="col-12" v-if="selectedTab === 'hourglass'">
<div
v-if="selectedTab === 'hourglass'"
class="col-12"
>
<span v-if="hourglassTransactions.length === 0">
{{ $t('noHourglassTransactions') }}
</span>
<table class="table">
<tr>
<th v-once class="timestamp-column">
{{ $t('timestamp')}}
<th
v-once
class="timestamp-column"
>
{{ $t('timestamp') }}
</th>
<th v-once class="amount-column">
{{ $t('amount')}}
<th
v-once
class="amount-column"
>
{{ $t('amount') }}
</th>
<th v-once class="action-column">
{{ $t('action')}}
<th
v-once
class="action-column"
>
{{ $t('action') }}
</th>
<th v-once class="note-column">
{{ $t('note')}}
<th
v-once
class="note-column"
>
{{ $t('note') }}
</th>
</tr>
<tr
@@ -140,7 +177,10 @@
>{{ entry.createdAt | timeAgo }}</span>
</td>
<td>
<div class="amount-with-icon" :id="entry.id">
<div
:id="entry.id"
class="amount-with-icon"
>
<span
class="svg-icon inline icon-16 my-1"
aria-hidden="true"
@@ -1,110 +0,0 @@
/* eslint-disable import/no-extraneous-dependencies */
import { storiesOf } from '@storybook/vue';
import { withKnobs } from '@storybook/addon-knobs';
import SelectList from './selectList.vue';
import SelectDifficulty from '../tasks/modal-controls/selectDifficulty';
import SelectTranslatedArray from '../tasks/modal-controls/selectTranslatedArray';
const stories = storiesOf('Select List', module);
stories.addDecorator(withKnobs);
stories
.add('states', () => ({
components: { SelectList },
template: `
<div class="m-xl">
Hover / Click on:
<select-list class="mb-4"
:items="items"
:key-prop="'key'"
:value="selected"
@select="selected = $event">
<template v-slot:item="{ item }">
<div v-if="item">
Template: {{ item?.key }} - {{ item?.value.text }}
</div>
<div v-else>
Nothing selected
</div>
</template>
</select-list>
Disabled:
<select-list :disabled="true"
:value="selected"
:items="items"
:key-prop="'key'"
class="mb-4">
<template v-slot:item="{ item }">
Template: {{ item?.key }} - {{ item?.value.text }}
</template>
</select-list>
<br/>
Selected: {{ selected }} <br/>
</div>
`,
data () {
return {
selected: null,
items: [
{
key: 1,
value: {
text: 'First',
},
},
{
key: 2,
value: {
text: 'Second',
},
},
],
};
},
}))
.add('difficulty', () => ({
components: { SelectDifficulty },
template: `
<div class="m-xl">
<select-difficulty
:value="selected"
@select="selected = $event"
>
</select-difficulty>
Selected: {{ selected }}
</div>
`,
data () {
return {
selected: 2,
};
},
}))
.add('translated array', () => ({
components: { SelectTranslatedArray },
template: `
<div class="m-xl">
<select-translated-array
:items="['daily', 'weekly', 'monthly']"
:value="selected"
@select="selected = $event"
>
</select-translated-array>
Selected: {{ selected }}
</div>
`,
data () {
return {
selected: 'weekly',
};
},
}));
@@ -1,32 +0,0 @@
/* eslint-disable import/no-extraneous-dependencies */
import { storiesOf } from '@storybook/vue';
import { text, withKnobs } from '@storybook/addon-knobs';
const stories = storiesOf('Textarea', module);
stories.addDecorator(withKnobs);
stories
.add('states', () => ({
components: { },
template: `
<div style="position: absolute; margin: 20px">
<textarea autofocus ref="area">Normal {{text}}</textarea>
<br />
<button class="btn btn-dark" @click="$refs.area.focus()">Focus ^</button>
<br />
<textarea placeholder="placeholder"></textarea>
<br />
<textarea disabled>Disabled {{text}}</textarea><br />
<textarea readonly>Readonly {{text}}</textarea> <br />
</div>
`,
props: {
text: {
default: text('Area Message', 'example text'),
},
},
}));
@@ -1,39 +0,0 @@
/* eslint-disable import/no-extraneous-dependencies */
import { storiesOf } from '@storybook/vue';
import { text, withKnobs } from '@storybook/addon-knobs';
import toggleSwitch from './toggleSwitch';
const stories = storiesOf('Toggle Switch', module);
stories.addDecorator(withKnobs);
stories
.add('label only', () => ({
components: { toggleSwitch },
template: `
<div style="position: absolute; margin: 20px">
<toggle-switch :label="label"></toggle-switch>
</div>
`,
props: {
label: {
default: text('Label', 'example text'),
},
},
}))
.add('with description', () => ({
components: { toggleSwitch },
template: `
<div style="position: absolute; margin: 20px">
<toggle-switch :label="label" :hover-text="description"></toggle-switch>
</div>
`,
props: {
label: {
default: text('Label', 'example text'),
},
description: {
default: text('Description', 'description text'),
},
},
}));
@@ -139,7 +139,7 @@
class="mx-auto"
:no-caret="true"
>
<template v-slot:button-content>
<template #button-content>
<span
v-once
class="svg-icon dots-icon with-icon"
@@ -147,10 +147,10 @@
class="row"
>
<div
class="col-4"
:id="statInfo.title"
class="col-4"
>
<strong> {{ $t(statInfo.title)}} </strong>
<strong> {{ $t(statInfo.title) }} </strong>
<strong>: {{ statsComputed[stat] }}</strong>
<b-popover
:target="statInfo.title"
+18 -18
View File
@@ -47,7 +47,7 @@
<div class="disable-background">
<toggle-switch
:label="optTextSet.switchDescription"
:checked="this.user.inbox.optOut"
:checked="user.inbox.optOut"
:hover-text="optTextSet.popoverText"
@change="toggleOpt()"
/>
@@ -588,6 +588,23 @@ export default {
},
},
mixins: [styleHelper],
beforeRouteEnter (to, from, next) {
next(vm => {
const data = vm.$store.state.privateMessageOptions;
if ((!data || (data && !data.userIdToMessage)) && vm.$route.query && vm.$route.query.uuid) {
vm.$store.dispatch('user:userLookup', { uuid: vm.$route.query.uuid }).then(res => {
if (res && res.data && res.data.data) {
vm.$store.dispatch('user:newPrivateMessageTo', {
member: res.data.data,
});
}
});
} else {
vm.hasPrivateMessageOptionsOnPageLoad = true;
}
});
},
data () {
return {
icons: Object.freeze({
@@ -612,23 +629,6 @@ export default {
MAX_MESSAGE_LENGTH: MAX_MESSAGE_LENGTH.toString(),
};
},
beforeRouteEnter (to, from, next) {
next(vm => {
const data = vm.$store.state.privateMessageOptions;
if ((!data || (data && !data.userIdToMessage)) && vm.$route.query && vm.$route.query.uuid) {
vm.$store.dispatch('user:userLookup', { uuid: vm.$route.query.uuid }).then(res => {
if (res && res.data && res.data.data) {
vm.$store.dispatch('user:newPrivateMessageTo', {
member: res.data.data,
});
}
});
} else {
vm.hasPrivateMessageOptionsOnPageLoad = true;
}
});
},
computed: {
...mapState({ user: 'user.data' }),
canLoadMore () {
@@ -87,6 +87,9 @@ async function buyArmoire (store, params) {
icon: getDropClass({ type: item.type, key: item.dropKey }),
};
if (resData.armoire.emptied) {
notificationOptions.emptied = resData.armoire.emptied;
}
store.dispatch('snackbars:add', {
title: '',
timeout: true,
@@ -1 +0,0 @@
{}
@@ -1 +0,0 @@
{}
@@ -1 +0,0 @@
{}
@@ -1 +0,0 @@
{}
@@ -1 +0,0 @@
{}
-1
View File
@@ -1 +0,0 @@
{}

Some files were not shown because too many files have changed in this diff Show More