Merge branch 'develop' into paglias/realtime-chat-v1

This commit is contained in:
Matteo Pagliazzi
2016-09-08 19:12:05 +02:00
53 changed files with 272 additions and 172 deletions

View File

@@ -1,6 +1,6 @@
.2014_Fall_HealerPROMO2 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1044px -1378px;
background-position: -1331px -1275px;
width: 90px;
height: 90px;
}
@@ -12,13 +12,13 @@
}
.2014_Fall_RoguePROMO3 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -562px -1378px;
background-position: -758px -1275px;
width: 105px;
height: 90px;
}
.2014_Fall_Warrior_PROMO {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1633px -673px;
background-position: -726px -1378px;
width: 90px;
height: 90px;
}
@@ -30,13 +30,13 @@
}
.promo_backgrounds_armoire_201602 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1134px -199px;
background-position: -1276px -199px;
width: 141px;
height: 294px;
}
.promo_backgrounds_armoire_201603 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1276px -199px;
background-position: -1134px -199px;
width: 141px;
height: 294px;
}
@@ -78,7 +78,7 @@
}
.promo_backtoschool {
background-image: url(spritesmith-largeSprites-0.png);
background-position: 0px -1378px;
background-position: -302px -1378px;
width: 150px;
height: 150px;
}
@@ -90,7 +90,7 @@
}
.promo_chairs_glasses {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -593px -831px;
background-position: -1633px 0px;
width: 51px;
height: 210px;
}
@@ -108,7 +108,7 @@
}
.promo_dilatoryDistress {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1633px -491px;
background-position: -999px -1378px;
width: 90px;
height: 90px;
}
@@ -126,7 +126,7 @@
}
.promo_enchanted_armoire_201507 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -250px -1275px;
background-position: -839px -967px;
width: 217px;
height: 90px;
}
@@ -138,7 +138,7 @@
}
.promo_enchanted_armoire_201509 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1633px -946px;
background-position: -1181px -1378px;
width: 90px;
height: 90px;
}
@@ -150,7 +150,7 @@
}
.promo_enchanted_armoire_201601 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1633px -1128px;
background-position: 0px -1529px;
width: 90px;
height: 90px;
}
@@ -174,7 +174,7 @@
}
.promo_haunted_hair {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -593px -587px;
background-position: -593px -734px;
width: 100px;
height: 137px;
}
@@ -186,19 +186,19 @@
}
.promo_mystery_201405 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1633px -1401px;
background-position: -91px -1529px;
width: 90px;
height: 90px;
}
.promo_mystery_201406 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1633px -212px;
background-position: -635px -1378px;
width: 90px;
height: 96px;
}
.promo_mystery_201407 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -645px -901px;
background-position: -1633px -412px;
width: 42px;
height: 62px;
}
@@ -210,7 +210,7 @@
}
.promo_mystery_201409 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1135px -1378px;
background-position: -273px -1529px;
width: 90px;
height: 90px;
}
@@ -222,31 +222,31 @@
}
.promo_mystery_201411 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1226px -1378px;
background-position: -182px -1529px;
width: 90px;
height: 90px;
}
.promo_mystery_201412 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -688px -831px;
background-position: -1633px -345px;
width: 42px;
height: 66px;
}
.promo_mystery_201501 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1057px -967px;
background-position: -1633px -211px;
width: 48px;
height: 63px;
}
.promo_mystery_201502 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1317px -1378px;
background-position: -1363px -1378px;
width: 90px;
height: 90px;
}
.promo_mystery_201503 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1633px -1219px;
background-position: -1272px -1378px;
width: 90px;
height: 90px;
}
@@ -258,43 +258,43 @@
}
.promo_mystery_201505 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1633px -1037px;
background-position: -1240px -1275px;
width: 90px;
height: 90px;
}
.promo_mystery_201506 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -645px -831px;
background-position: -1633px -275px;
width: 42px;
height: 69px;
}
.promo_mystery_201507 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1633px -106px;
background-position: -544px -1378px;
width: 90px;
height: 105px;
}
.promo_mystery_201508 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -950px -1378px;
background-position: -1146px -1275px;
width: 93px;
height: 90px;
}
.promo_mystery_201509 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1633px -764px;
background-position: -908px -1378px;
width: 90px;
height: 90px;
}
.promo_mystery_201510 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -856px -1378px;
background-position: -1052px -1275px;
width: 93px;
height: 90px;
}
.promo_mystery_201511 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1633px -582px;
background-position: -817px -1378px;
width: 90px;
height: 90px;
}
@@ -312,55 +312,55 @@
}
.promo_mystery_201602 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1633px -400px;
background-position: -1513px -1275px;
width: 90px;
height: 90px;
}
.promo_mystery_201603 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1633px -309px;
background-position: -1422px -1275px;
width: 90px;
height: 90px;
}
.promo_mystery_201604 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -762px -1378px;
background-position: -864px -1275px;
width: 93px;
height: 90px;
}
.promo_mystery_201605 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1633px -855px;
background-position: -1090px -1378px;
width: 90px;
height: 90px;
}
.promo_mystery_201606 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1633px 0px;
background-position: -453px -1378px;
width: 90px;
height: 105px;
}
.promo_mystery_201607 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1633px -1310px;
background-position: -1454px -1378px;
width: 90px;
height: 90px;
}
.promo_mystery_201608 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -668px -1378px;
background-position: -958px -1275px;
width: 93px;
height: 90px;
}
.promo_mystery_3014 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -839px -967px;
background-position: -250px -1275px;
width: 217px;
height: 90px;
}
.promo_orca {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -593px -725px;
background-position: -593px -872px;
width: 105px;
height: 105px;
}
@@ -372,37 +372,37 @@
}
.promo_pastel_skin {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -331px -1191px;
background-position: 0px -1191px;
width: 330px;
height: 83px;
}
.customize-option.promo_pastel_skin {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -356px -1206px;
background-position: -25px -1206px;
width: 60px;
height: 60px;
}
.promo_peppermint_flame {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -452px -882px;
background-position: -306px -220px;
width: 140px;
height: 147px;
}
.promo_pet_skins {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -306px -220px;
background-position: -452px -882px;
width: 140px;
height: 147px;
}
.customize-option.promo_pet_skins {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -331px -235px;
background-position: -477px -897px;
width: 60px;
height: 60px;
}
.promo_shimmer_hair {
background-image: url(spritesmith-largeSprites-0.png);
background-position: 0px -1191px;
background-position: -331px -1191px;
width: 330px;
height: 83px;
}
@@ -438,13 +438,19 @@
}
.promo_staff_spotlight_Lemoness {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1004px -392px;
background-position: -593px -439px;
width: 102px;
height: 146px;
}
.promo_staff_spotlight_Viirus {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1004px -392px;
width: 119px;
height: 147px;
}
.promo_staff_spotlight_paglias {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -593px -439px;
background-position: -593px -586px;
width: 99px;
height: 147px;
}
@@ -474,7 +480,7 @@
}
.promo_takethis_armor {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -649px -1275px;
background-position: -593px -978px;
width: 114px;
height: 87px;
}
@@ -522,7 +528,7 @@
}
.npc_viirus {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -453px -1378px;
background-position: -649px -1275px;
width: 108px;
height: 90px;
}
@@ -540,7 +546,7 @@
}
.scene_phone_peek {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -302px -1378px;
background-position: 0px -1378px;
width: 150px;
height: 150px;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 469 KiB

After

Width:  |  Height:  |  Size: 475 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

@@ -148,7 +148,7 @@
"weaponSpecialSummer2015MageNotes": "Hidden power glimmers in the jewels of this staff. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2015 Summer Gear.",
"weaponSpecialSummer2015HealerText": "Wand of the Waves",
"weaponSpecialSummer2015HealerNotes": "Cures seasickness and sea sickness! Increases Intelligence by <%= int %>. Limited Edition 2015 Summer Gear.",
"weaponSpecialFall2015RogueText": "Bat-tle Ax",
"weaponSpecialFall2015RogueNotes": "Fearsome To-Dos cower before the flapping of this ax. Increases Strength by <%= str %>. Limited Edition 2015 Autumn Gear.",
"weaponSpecialFall2015WarriorText": "Wooden Plank",
@@ -184,7 +184,7 @@
"weaponSpecialSummer2016MageNotes": "All the power of the seas filters through this staff. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2016 Summer Gear.",
"weaponSpecialSummer2016HealerText": "Healing Trident",
"weaponSpecialSummer2016HealerNotes": "One spike harms, the other heals. Increases Intelligence by <%= int %>. Limited Edition 2016 Summer Gear.",
"weaponMystery201411Text": "Pitchfork of Feasting",
"weaponMystery201411Notes": "Stab your enemies or dig in to your favorite foods - this versatile pitchfork does it all! Confers no benefit. November 2014 Subscriber Item.",
"weaponMystery201502Text": "Shimmery Winged Staff of Love and Also Truth",
@@ -365,7 +365,7 @@
"armorSpecialSummer2015MageNotes": "Hidden power resides in the puffs of these sleeves. Increases Intelligence by <%= int %>. Limited Edition 2015 Summer Gear.",
"armorSpecialSummer2015HealerText": "Sailor's Armor",
"armorSpecialSummer2015HealerNotes": "This armor lets everyone know that you are an honest merchant sailor who would never dream of behaving like a scalawag. Increases Constitution by <%= con %>. Limited Edition 2015 Summer Gear.",
"armorSpecialFall2015RogueText": "Bat-tle Armor",
"armorSpecialFall2015RogueNotes": "Fly into bat-tle! Increases Perception by <%= per %>. Limited Edition 2015 Autumn Gear.",
"armorSpecialFall2015WarriorText": "Scarecrow Armor",
@@ -374,7 +374,7 @@
"armorSpecialFall2015MageNotes": "Every stitch in this armor shimmers with enchantment. Increases Intelligence by <%= int %>. Limited Edition 2015 Autumn Gear.",
"armorSpecialFall2015HealerText": "Potioner Robes",
"armorSpecialFall2015HealerNotes": "What? Of course that was a potion of constitution. No, you are definitely not turning into a frog! Don't be ribbiticulous. Increases Constitution by <%= con %>. Limited Edition 2015 Autumn Gear.",
"armorSpecialWinter2016RogueText": "Cocoa Armor",
"armorSpecialWinter2016RogueNotes": "This leather armor keeps you nice and toasty. Is it actually made from cocoa? You'll never tell. Increases Perception by <%= per %>. Limited Edition 2015-2016 Winter Gear.",
"armorSpecialWinter2016WarriorText": "Snowman Suit",
@@ -401,7 +401,7 @@
"armorSpecialSummer2016MageNotes": "This slippery garment transforms its wearer into a real Dolphin Mage! Increases Intelligence by <%= int %>. Limited Edition 2016 Summer Gear.",
"armorSpecialSummer2016HealerText": "Seahorse Tail",
"armorSpecialSummer2016HealerNotes": "This spiky garment transforms its wearer into a real Seahorse Healer! Increases Constitution by <%= con %>. Limited Edition 2016 Summer Gear.",
"armorMystery201402Text": "Messenger Robes",
"armorMystery201402Notes": "Shimmering and strong, these robes have many pockets to carry letters. Confers no benefit. February 2014 Subscriber Item.",
"armorMystery201403Text": "Forest Walker Armor",
@@ -845,14 +845,14 @@
"shieldSpecialSummer2015WarriorNotes": "Crafted of deep-ocean metal by the artisans of Dilatory, this shield shines like the sand and the sea. Increases Constitution by <%= con %>. Limited Edition 2015 Summer Gear.",
"shieldSpecialSummer2015HealerText": "Strapping Shield",
"shieldSpecialSummer2015HealerNotes": "Use this shield to bash away bilge rats. Increases Constitution by <%= con %>. Limited Edition 2015 Summer Gear.",
"shieldSpecialFall2015RogueText": "Bat-tle Ax",
"shieldSpecialFall2015RogueNotes": "Fearsome To-Dos cower before the flapping of this ax. Increases Strength by <%= str %>. Limited Edition 2015 Autumn Gear.",
"shieldSpecialFall2015WarriorText": "Birdseed Bag",
"shieldSpecialFall2015WarriorNotes": "It's true that you're supposed to be SCARING the crows, but there's nothing wrong with making friends! Increases Constitution by <%= con %>. Limited Edition 2015 Autumn Gear.",
"shieldSpecialFall2015HealerText": "Stirring Stick",
"shieldSpecialFall2015HealerNotes": "This stick can stir anything without melting, dissolving, or bursting into flame! It can also be used to fiercely poke enemy tasks. Increases Constitution by <%= con %>. Limited Edition 2015 Autumn Gear.",
"shieldSpecialWinter2016RogueText": "Cocoa Mug",
"shieldSpecialWinter2016RogueNotes": "Warming drink, or boiling projectile? You decide... Increases Strength by <%= str %>. Limited Edition 2015-2016 Winter Gear.",
"shieldSpecialWinter2016WarriorText": "Sled Shield",
@@ -873,7 +873,7 @@
"shieldSpecialSummer2016WarriorNotes": "Bite those tough tasks with this toothy shield! Increases Constitution by <%= con %>. Limited Edition 2016 Summer Gear.",
"shieldSpecialSummer2016HealerText": "Sea Star Shield",
"shieldSpecialSummer2016HealerNotes": "Sometimes mistakenly called a Starfish Shield. Increases Constitution by <%= con %>. Limited Edition 2016 Summer Gear.",
"shieldMystery201601Text": "Resolution Slayer",
"shieldMystery201601Notes": "This blade can be used to parry away all distractions. Confers no benefit. January 2016 Subscriber Item.",
"shieldMystery301405Text": "Clock Shield",

View File

@@ -48,6 +48,8 @@
"leaveQuest": "Leave Quest",
"sureLeave": "Are you sure you want to leave the active quest? All your quest progress will be lost.",
"questOwner": "Quest Owner",
"questTaskDamage": "+<%= damage %> pending damage to boss",
"questTaskCollection": "<%= items %> items collected today",
"questOwnerNotInPendingQuest": "The quest owner has left the quest and can no longer begin it. It is recommended that you cancel it now. The quest owner will retain possession of the quest scroll.",
"questOwnerNotInRunningQuest": "The quest owner has left the quest. You can abort the quest if you need to. You can also allow it to keep running and all remaining participants will receive the quest rewards when the quest finishes.",
"questOwnerNotInPendingQuestParty": "The quest owner has left the party and can no longer begin the quest. It is recommended that you cancel it now. The quest scroll will be returned to the quest owner.",

View File

@@ -68,6 +68,7 @@
"APIv3": "API v3",
"APIText": "Copy these for use in third party applications. However, think of your API Token like a password, and do not share it publicly. You may occasionally be asked for your User ID, but never post your API Token where others can see it, including on Github.",
"APIToken": "API Token (this is a password - see warning above!)",
"APITokenWarning": "If you need a new API Token (e.g., if you accidentally shared it), email <a href='mailto:admin@habitica.com'>admin@habitica.com</a> with your User ID and current Token. Once it is reset you will need to re-authorize everything by logging out of the website and mobile app and by providing the new Token to any other Habitica tools that you use.",
"thirdPartyApps": "Third Party Apps",
"dataToolDesc": "A webpage that shows you certain information from your Habitica account, such as statistics about your tasks, equipment, and skills.",
"beeminder": "Beeminder",

2
npm-shrinkwrap.json generated
View File

@@ -1,6 +1,6 @@
{
"name": "habitica",
"version": "3.38.0",
"version": "3.39.1",
"dependencies": {
"abbrev": {
"version": "1.0.9",

View File

@@ -1,7 +1,7 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "3.38.0",
"version": "3.39.1",
"main": "./website/server/index.js",
"dependencies": {
"@slack/client": "slackhq/node-slack-sdk#2ee794cd31326c54f38c518eef2b9d223327d939",

View File

@@ -90,7 +90,10 @@ gulp.task('test:sanity', (cb) => {
let runner = exec(
testBin(SANITY_TEST_COMMAND),
(err, stdout, stderr) => {
cb(err);
if (err) {
process.exit(1);
}
cb();
}
);
pipe(runner);
@@ -100,7 +103,10 @@ gulp.task('test:common', ['test:prepare:build'], (cb) => {
let runner = exec(
testBin(COMMON_TEST_COMMAND),
(err, stdout, stderr) => {
cb(err);
if (err) {
process.exit(1);
}
cb();
}
);
pipe(runner);
@@ -135,7 +141,10 @@ gulp.task('test:content', ['test:prepare:build'], (cb) => {
testBin(CONTENT_TEST_COMMAND),
CONTENT_OPTIONS,
(err, stdout, stderr) => {
cb(err);
if (err) {
process.exit(1);
}
cb();
}
);
pipe(runner);
@@ -170,7 +179,7 @@ gulp.task('test:server_side', ['test:prepare:build'], (cb) => {
let runner = exec(
testBin(SERVER_SIDE_TEST_COMMAND),
(err, stdout, stderr) => {
cb(err);
cb(err);
}
);
pipe(runner);
@@ -196,7 +205,10 @@ gulp.task('test:karma', ['test:prepare:build'], (cb) => {
let runner = exec(
testBin(KARMA_TEST_COMMAND),
(err, stdout) => {
cb(err);
if (err) {
process.exit(1);
}
cb();
}
);
pipe(runner);
@@ -206,7 +218,7 @@ gulp.task('test:karma:watch', ['test:prepare:build'], (cb) => {
let runner = exec(
testBin(`${KARMA_TEST_COMMAND}:watch`),
(err, stdout) => {
cb(err);
cb(err);
}
);
pipe(runner);
@@ -243,7 +255,10 @@ gulp.task('test:e2e', ['test:prepare', 'test:prepare:server'], (cb) => {
'npm run test:e2e',
(err, stdout, stderr) => {
support.forEach(kill);
cb(err);
if (err) {
process.exit(1);
}
cb();
}
);
pipe(runner);
@@ -282,7 +297,12 @@ gulp.task('test:e2e:safe', ['test:prepare', 'test:prepare:server'], (cb) => {
gulp.task('test:api-v3:unit', (done) => {
let runner = exec(
testBin('mocha test/api/v3/unit --recursive'),
(err, stdout, stderr) => done(err)
(err, stdout, stderr) => {
if (err) {
process.exit(1);
}
done();
}
)
pipe(runner);
@@ -296,7 +316,12 @@ gulp.task('test:api-v3:integration', (done) => {
let runner = exec(
testBin('mocha test/api/v3/integration --recursive'),
{maxBuffer: 500*1024},
(err, stdout, stderr) => done(err)
(err, stdout, stderr) => {
if (err) {
process.exit(1);
}
done();
}
)
pipe(runner);
@@ -334,4 +359,4 @@ gulp.task('test:api-v3', (done) => {
'test:api-v3:integration',
done
);
});
});

View File

@@ -6,7 +6,9 @@ describe('GET /tags', () => {
let user;
before(async () => {
user = await generateUser();
user = await generateUser({
tags: [],
});
});
it('returns all user\'s tags', async () => {
@@ -15,8 +17,8 @@ describe('GET /tags', () => {
let tags = await user.get('/tags');
expect(tags.length).to.equal(2 + 3); // + 3 because 1 is a default task
expect(tags[tags.length - 2].name).to.equal(tag1.name);
expect(tags[tags.length - 1].name).to.equal(tag2.name);
expect(tags.length).to.equal(2);
expect(tags[0].name).to.equal(tag1.name);
expect(tags[1].name).to.equal(tag2.name);
});
});

View File

@@ -7,7 +7,9 @@ describe('POST /reorder-tags', () => {
let user;
before(async () => {
user = await generateUser();
user = await generateUser({
tags: [],
});
});
it('returns error when no parameters are provided', async () => {
@@ -35,10 +37,10 @@ describe('POST /reorder-tags', () => {
await user.post('/tags', {name: tag2Name});
await user.sync();
await user.post('/reorder-tags', {tagId: user.tags[4].id, to: 3});
await user.post('/reorder-tags', {tagId: user.tags[0].id, to: 1});
await user.sync();
expect(user.tags[3].name).to.equal(tag2Name);
expect(user.tags[4].name).to.equal(tag1Name);
expect(user.tags[0].name).to.equal(tag2Name);
expect(user.tags[1].name).to.equal(tag1Name);
});
});

View File

@@ -36,7 +36,7 @@ future re: pets and whatnot, this is just temporary.
margin: 0 // need this b/c of bootstrap, remove or reset later
position: relative
cursor: pointer
// Username and Level
.avatar-level, .avatar-name
position: absolute
@@ -56,17 +56,17 @@ future re: pets and whatnot, this is just temporary.
left: 4px
opacity: 0 // Hide username by default
transition: opacity 0.2s ease-out
// Show username if not using mount or background
&.isUser.noBackgroundImage:not(.hasMount)
.avatar-name
opacity: 1
// Show username on hover and focus
&:hover, &:focus
.avatar-name
opacity: 1
// Sprite positioning Base styles
.character-sprites
width: 6.428571429em // 90px
@@ -75,13 +75,13 @@ future re: pets and whatnot, this is just temporary.
span
position: absolute
padding-top: 2em
// Sprite positioning Position avatar sprite differently if they have a pet or a mount
&.hasPet
padding-top: 1.75em
padding-top: 1.75em
&.hasMount
padding-top:0em
// Backgrounds  Set a background color when no background image is set
&.noBackgroundImage
background: darken($color-herobox, 8%)

View File

@@ -14,7 +14,7 @@ ul.challenge-accordion-header-specs
margin-right: 5px;
#back-to-challenges, #create-challenge-btn
margin-bottom: 10px
margin-bottom: 10px
#challenges-filters h3
margin-top: 0px;
margin-top: 0px;

View File

@@ -14,4 +14,4 @@ html.applying-action, html.applying-action *
.cast-target:hover
border: 5px solid green !important
.selected-class
background-color: green
background-color: green

View File

@@ -2,7 +2,7 @@
.avatar-window
float: right;
margin: 0 1em 0 0
margin: 0 1em 0 0
menu
padding: 0;
@@ -13,7 +13,7 @@ menu
width: 100%;
list-style: none;
padding-bottom: 10px
menu:before
content: attr(label);
display: block;
@@ -33,7 +33,7 @@ menu
border: 0px solid grey
background-color: hsl(0, 0%, 93%)
margin-bottom: 10px
-webkit-transition: background-color 0.5s ease-out
-moz-transition: background-color 0.5s ease-out
transition: background-color 0.5s ease-out
@@ -43,10 +43,10 @@ menu
-webkit-transition: none
-moz-transition: none
transition: none
.customize-option:not(:last-of-type)
margin-right: 10px
@media (max-width: 480px) {
.avatar-window {

View File

@@ -6,7 +6,7 @@
ul
float: left
list-style: none
margin-right: 1em
margin-right: 1em
.filters-controls
@extend $hrpg-button-bar-with-heading
hrpg-button-bar-mixin($color-options-menu)
@@ -32,7 +32,7 @@
margin-top: -.5em
markdown
display: inline-block
.hrpg-input-group
.hrpg-input-group
display: inline-block
margin-right: 0.618em
@extend $hrpg-button-with-input

View File

@@ -6,4 +6,4 @@
margin-top: 40px
padding-bottom: 20px
border-top: 1px solid #e5e5e5
background-color: #f5f5f5
background-color: #f5f5f5

View File

@@ -38,10 +38,10 @@
.long-title .tooltip
white-space: normal
span.time
white-space: nowrap
.chat-plus-one
opacity: 0
background-color: #eee
@@ -62,18 +62,18 @@
&.highlight
background: #EEE
label
margin-right:5px
.float-label
float:left
position:absolute
top:17px;
.hidden-label
visibility:hidden
.scrollable-message
max-height: 6.472em
overflow-y:auto
@@ -82,7 +82,7 @@
// 20px normally
margin-top:5px
margin-bottom:5px
.expander
float: right
position: absolute
@@ -98,11 +98,11 @@
.own-message
border-left: 4px solid #333
padding-left: 2px
markdown
p:first-child
display:inline
img
max-height:50px
vertical-align:top
@@ -168,12 +168,12 @@ hrpg-contributor-label-mixin($hrpg-contributor-color)
.buttonList li
margin: 5px
.option-group .option-time
padding: 0px 5px
// Autocomplete [TODO] make this nicer
.list-at-user
.list-at-user
width: 100%
max-width: 120px
position: absolute
@@ -182,24 +182,24 @@ hrpg-contributor-label-mixin($hrpg-contributor-color)
z-index: 10
.list-at-user li
.list-at-user li
line-height:14px
border-bottom: 1px solid #a4a4a4
list-style-type: none
.list-at-user li:hover
.list-at-user li:hover
cursor: pointer
background: #b9dff4
.list-at-user li span
.list-at-user li span
margin: 2px
font-size: 11.844px
margin-left: 5px
display: inline-block
.list-cur
.list-cur
background: #b9dff4

View File

@@ -49,7 +49,7 @@ hr
/* Customizations to make footer sticky */
html, body
html, body
height: 100%
#wrap
@@ -59,7 +59,7 @@ html, body
height: auto !important
@media (max-width: 600px)
#wrap
#wrap
margin-top: 0
padding: 0 4px;
overflow-x: hidden;
@@ -67,7 +67,7 @@ html, body
/* Gems
-------------------------------------------------- */
/* Adaptation of GH's social-count for Gems */
.gem-cost
border: 1px solid #D4D4D4;
font-size: 11px;
@@ -79,7 +79,7 @@ html, body
color: #333;
background-color: #FAFAFA;
position: relative;
.gem-cost::before
content: ""
display: block
@@ -151,9 +151,9 @@ a.label
.muted
color: #999
.btn
.btn
margin-right: 5px
.panel-heading .btn // Fixing improper vertical alignment of buttons in panel headers
.panel-heading .btn // Fixing improper vertical alignment of buttons in panel headers
margin-top: -8px
.vertical-align

View File

@@ -39,7 +39,7 @@
.stable .static-popover
max-width: 550px
menu.pets div
menu.pets div
display: inline-block
vertical-align: top

View File

@@ -61,10 +61,10 @@
animation-delay: -0.20s
@keyframes sk-bouncedelay
0%, 80%, 100% {
0%, 80%, 100% {
transform: scale(0)
opacity: 0
} 40% {
} 40% {
transform: scale(1.0)
opacity: 1
}

View File

@@ -79,4 +79,4 @@
}
.task-column::-webkit-scrollbar-corner {
background: transparent
}
}

View File

@@ -25,7 +25,7 @@ body
.marketing
text-align: center
.static-old-news
h2
font-weight: 700
@@ -38,7 +38,7 @@ body
margin-top: 20px
.pull-right
margin-left: 5px
#frontpage-play-button
//box-shadow: 0 0 40px #494141;
display: inline

View File

@@ -27,12 +27,12 @@ angular.module('habitrpg')
function verifyNewNotifications (response) {
// Ignore CRON notifications for manual syncs
var isUserLoaded = $rootScope.appLoaded === true;
var isUserLoaded = $rootScope.appLoaded === true;
if (response && response.data && response.data.notifications && response.data.notifications.length > 0) {
$rootScope.userNotifications = response.data.notifications.filter(function (notification) {
if (isUserLoaded && notification.type === 'CRON') {
// If the user is already loaded, do not show the notification, syncing will show it
// If the user is already loaded, do not show the notification, syncing will show it
// (the user will be synced automatically)
$rootScope.User.readNotification(notification.id);
return false;

View File

@@ -30,7 +30,7 @@ angular.module('habitrpg')
} else if (status === 400 && data.errors && _.isArray(data.errors)) { // bad requests
data.errors.forEach(function (err) {
$window.alert(err.message);
});
});
} else if (!!data && !!data.error) {
$window.alert(data.message);
} else {

View File

@@ -58,7 +58,7 @@ habitrpg.controller("HeaderCtrl", ['$scope', 'Groups', 'User',
}
)
if (User.user.party.orderAscending == "descending") {
result = result.reverse()
result = result.reverse()
}
return result;

View File

@@ -1,8 +1,8 @@
'use strict';
angular.module('habitrpg')
.controller('MenuCtrl', ['$scope', '$rootScope', '$http', 'Chat',
function($scope, $rootScope, $http, Chat) {
.controller('MenuCtrl', ['$scope', '$rootScope', '$http', 'Chat', 'Content',
function($scope, $rootScope, $http, Chat, Content) {
$scope.logout = function() {
localStorage.clear();
@@ -26,6 +26,41 @@ angular.module('habitrpg')
}
}
$scope.hasQuestProgress = function() {
var user = $scope.user;
if (user.party.quest) {
var userQuest = Content.quests[user.party.quest.key];
if (!userQuest) {
return false;
}
if (userQuest.boss && user.party.quest.progress.up > 0) {
return true;
}
if (userQuest.collect && user.party.quest.progress.collectedItems > 0) {
return true;
}
}
return false;
};
$scope.getQuestInfo = function() {
var user = $scope.user;
var questInfo = {};
if (user.party.quest) {
var userQuest = Content.quests[user.party.quest.key];
questInfo.title = userQuest.text();
if (userQuest.boss) {
questInfo.body = window.env.t('questTaskDamage', { damage: user.party.quest.progress.up.toFixed(1) });
} else if (userQuest.collect) {
questInfo.body = window.env.t('questTaskCollection', { items: user.party.quest.progress.collectedItems });
}
}
return questInfo;
};
$scope.clearMessages = Chat.markChatSeen;
$scope.clearCards = Chat.clearCards;

View File

@@ -18,7 +18,7 @@ habitrpg.controller('SortableInventoryController', ['$scope',
$scope.setGrouping = function (grouping) {
$scope.groupingChoice = grouping;
};
$scope.orderChoice = 'set';
$scope.setOrder($scope.orderChoice);
}]);

View File

@@ -2,7 +2,7 @@
window.env = window.env || {}; //FIX tests
// If Moment.js is loaded,
// If Moment.js is loaded,
if(window.moment && window.env.language && window.env.language.momentLang && window.env.language.momentLangCode){
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
@@ -13,4 +13,4 @@ if(window.moment && window.env.language && window.env.language.momentLang && win
}
window.habitrpgShared.i18n.strings = window.env.translations;
window.env.t = window.habitrpgShared.i18n.t;
window.env.t = window.habitrpgShared.i18n.t;

View File

@@ -70,7 +70,7 @@ angular.module('habitrpg')
// When the user correctly enters the party channel
partyChannel.bind('pusher:subscription_succeeded', function(pusherMembers) {
// Wait for the party to be loaded
Groups.party(reconnecting ? true : false).then(function (party) {
Groups.party(reconnecting).then(function (party) {
// If we just reconnected after some inactivity, sync the party
if (reconnecting === true) {
_.assign($rootScope.party, party);
@@ -182,6 +182,7 @@ angular.module('habitrpg')
partyId = user && $rootScope.user.party && $rootScope.user.party._id;
if (!partyId) return;
// See if another tab is already connected to Pusher
if (!localStorage.getItem(tabIdKey)) {
connectToPusher(partyId);
}

View File

@@ -1,4 +1,4 @@
// NOTE: this file is only used because the mobile apps expect IAP routes
// to be found at /api/v3/iap instead of /iap.
module.exports = require('../top-level/payments/iap');
module.exports = require('../top-level/payments/iap');

View File

@@ -14,4 +14,4 @@ api.redirectProfileQRCode = {
},
};
module.exports = api;
module.exports = api;

View File

@@ -19,4 +19,4 @@ module.exports = {
getPurchaseData: iap.getPurchaseData,
GOOGLE: iap.GOOGLE,
APPLE: iap.APPLE,
};
};

View File

@@ -15,4 +15,4 @@ export function makeSalt (len = 10) {
.randomBytes(Math.ceil(len / 2))
.toString('hex')
.substring(0, len);
}
}

View File

@@ -39,4 +39,4 @@ let api = {
},
};
module.exports = api;
module.exports = api;

View File

@@ -25,4 +25,4 @@ if (MAINTENANCE_MODE !== 'true') {
});
autoinc.init(db);
}
}

View File

@@ -51,4 +51,4 @@ schema.methods.addComputedStatsToJSONObj = function addComputedStatsToUserJSONOb
obj.stats.toNextLevel = common.tnl(this.stats.lvl);
obj.stats.maxHealth = common.maxHealth;
obj.stats.maxMP = common.statsComputed(this).maxMP;
};
};

View File

@@ -8,13 +8,13 @@ html(ng-app="habitrpg")
meta(name='viewport', content='width=device-width, initial-scale=1.0')
meta(name='apple-mobile-web-app-capable', content='yes')
// .slice(0).push('user') is to clone the array,
// .slice(0).push('user') is to clone the array,
// to be surethat `user` is never available to other requests' env
// TODO does it need only `user` in clientVars, not the others?
-
clientVars = env.clientVars.slice(0);
clientVars.push('user');
script(type='text/javascript').
window.env = !{JSON.stringify(env._.pick(env, clientVars))};

View File

@@ -230,6 +230,7 @@ script(type='text/ng-template', id='partials/options.settings.api.html')
pre.prettyprint {{user.id}}
h6=env.t('APIToken')
pre.prettyprint {{User.settings.auth.apiToken}}
small!=env.t("APITokenWarning")
h6=env.t('qrCode')
img.img-rendering-auto(src='https://chart.googleapis.com/chart?cht=qr&chs=200x200&chl=%7B%22address%22%3A%22https%3A%2F%2Fhabitrpg.com%22%2C%22user%22%3A%22{{user.id}}%22%2C%22key%22%3A%22{{User.settings.auth.apiToken}}%22%7D&choe=UTF-8&chld=L', alt='qrcode')
br

View File

@@ -10,7 +10,7 @@ else
.meter.health
.bar(ng-style='{width: Shared.percent(group.quest.progress.hp, Content.quests[group.quest.key].boss.hp) + "%"}')
span.meter-text.value
| {{Math.ceil(group.quest.progress.hp) | roundLargeNumbers}}
| {{Math.ceil(group.quest.progress.hp) | roundLargeNumbers}}
| &nbsp;/ {{::Content.quests[group.quest.key].boss.hp | roundLargeNumbers}}
div(ng-if='Content.quests[group.quest.key].boss.rage')
.meter-label(tooltip=env.t('rage'))
@@ -20,5 +20,5 @@ else
popover-trigger='mouseenter', popover-placement='bottom')
.bar(ng-style='{width: Shared.percent(group.quest.progress.rage, Content.quests[group.quest.key].boss.rage.value) + "%"}')
span.meter-text.value
| {{Math.ceil(group.quest.progress.rage) | roundLargeNumbers}}
| {{Math.ceil(group.quest.progress.rage) | roundLargeNumbers}}
| &nbsp;/ {{::Content.quests[group.quest.key].boss.rage.value | roundLargeNumbers}}

View File

@@ -1,7 +1,7 @@
div(class="quest_{{::group.quest.key}}")
h4=env.t('collected') + ':'
table.table.table-striped
tr(ng-repeat='(item,number) in group.quest.progress.collect',
tr(ng-repeat='(item,number) in group.quest.progress.collect',
class='quest_collected_{{number >= Content.quests[group.quest.key].collect[item].count}}')
td
.pull-left(class='quest_{{::group.quest.key}}_{{::item}}')

View File

@@ -1,4 +1,4 @@
small.btn-link(ng-init='showHelp = false', ng-click='showHelp = !showHelp')
small.btn-link(ng-init='showHelp = false', ng-click='showHelp = !showHelp')
| {{showHelp ? env.t('hideFormattingHelp') : env.t('showFormattingHelp')}}
.slight-vertical-padding(ng-if='showHelp')

View File

@@ -174,6 +174,9 @@ nav.toolbar(ng-controller='MenuCtrl')
li.toolbar-subscribe-button
button.highlight(ui-sref='options.settings.subscription',popover-trigger='mouseenter',popover-placement='bottom',popover-title=env.t('subscriptions'),popover=env.t('subDescription'),popover-append-to-body='true')=env.t('subscribe')
ul.toolbar-options
li.toolbar-quest-detail(ng-if='hasQuestProgress()')
a(ng-click='$state.go("options.social.party");', popover-placement='bottom',popover-trigger='mouseenter',popover-title='{{getQuestInfo().title}}', popover='{{getQuestInfo().body}}',popover-append-to-body='true')
span.glyphicon.glyphicon-screenshot
li.toolbar-notifs
a(data-expand-menu, menu='notifs')
span.glyphicon(ng-class='iconClasses()')

View File

@@ -12,4 +12,4 @@ script(id='modals/amazonPayments.html', type='text/ng-template')
.modal-footer
.btn.btn-default(ng-click='Payments.amazonPayments.reset()')=env.t('cancel')
.btn.btn-primary(ng-disabled="!Payments.amazonPayments.canCheckout()", ng-click="Payments.amazonPayments.checkout()")=env.t('checkout')
.btn.btn-primary(ng-disabled="!Payments.amazonPayments.canCheckout()", ng-click="Payments.amazonPayments.checkout()")=env.t('checkout')

View File

@@ -45,7 +45,7 @@ script(id='modals/buyGems.html', type='text/ng-template')
.arrow
.popover-content
p=env.t('buyGemsAllow1')
| &nbsp;{{Shared.planGemLimits.convCap + User.user.purchased.plan.consecutive.gemCapExtra - User.user.purchased.plan.gemsBought}}&nbsp;
| &nbsp;{{Shared.planGemLimits.convCap + User.user.purchased.plan.consecutive.gemCapExtra - User.user.purchased.plan.gemsBought}}&nbsp;
=env.t('buyGemsAllow2')
p!=env.t('seeSubscriptionDetails')
div(ng-if='user.purchased.plan.customerId')

View File

@@ -5,10 +5,10 @@ script(id='partials/options.social.party.quest-rewards.html', type='text/ng-temp
tr(ng-repeat='drop in quest.drop.items')
td {{::drop.text()}}
tr(ng-if='::quest.drop.exp > 0')
td {{::quest.drop.exp}}
td {{::quest.drop.exp}}
=env.t('experience')
tr(ng-if='::quest.drop.gp > 0')
td {{::quest.drop.gp}}
td {{::quest.drop.gp}}
=env.t('gold')
tr(ng-if='::quest.drop.unlock()')
td {{::quest.drop.unlock()}}

View File

@@ -1,6 +1,6 @@
// Created by Sabe on 12/22/13.
script(type='text/ng-template', id='modals/rebirthEnabled.html')
script(type='text/ng-template', id='modals/rebirthEnabled.html')
.modal-header
h4=env.t('rebirthNew')
.modal-body
@@ -39,7 +39,7 @@ script(type='text/ng-template', id='modals/rebirth.html')
p
span.vertical-align.inline-block.achievement-sun
|&nbsp;
=env.t('rebirthEarnAchievement')
=env.t('rebirthEarnAchievement')
.modal-footer
button.btn.btn-default(ng-click='$close()')=env.t('neverMind')
span(ng-if='user.balance < 2 && user.stats.lvl < 100')

View File

@@ -1,5 +1,5 @@
// Re-Roll modal
script(type='text/ng-template', id='modals/reroll.html')
script(type='text/ng-template', id='modals/reroll.html')
.modal-header
h4=env.t('fortify')
.modal-body

View File

@@ -1,4 +1,4 @@
script(type='text/ng-template', id='modals/reset.html')
script(type='text/ng-template', id='modals/reset.html')
.modal-header
h4=env.t('resetAccount')
.modal-body
@@ -57,7 +57,7 @@ script(type='text/ng-template', id='modals/restore.html')
button.btn.btn-default(ng-click='$close()')=env.t('discardChanges')
button.btn.btn-primary(ng-click='restore(); $close();')=env.t('saveAndClose')
script(type='text/ng-template', id='modals/delete.html')
script(type='text/ng-template', id='modals/delete.html')
.modal-header
h4=env.t('deleteAccount')
.modal-body

View File

@@ -1,29 +1,51 @@
h2 9/1/2016 - NEW BACKGROUNDS, ARMOIRE ITEMS, AND TAKE THIS CHALLENGE
.promo_backgrounds_armoire_201609.pull-right
h2 9/7/2016 - STAFF SPOTLIGHT: VIIRUS, BRAZILIAN PORTUGUESE LANGUAGE SUPPORT; COSTUME CHALLENGE COMING SOON
hr
tr
td
h3 September Backgrounds and Armoire Items!
p Weve added three new backgrounds: Orchard, Farmhouse, and Cornfields! Get them now from the <a href='/#/options/profile/backgrounds'>Background Shop</a> and show off your avatars in the Tavern!
br
p Plus, theres new Gold-purchasable equipment in the Enchanted Armoire, including the Vermillion Archer Set. Better work hard on your real-life tasks to earn all the pieces! Enjoy :)
p.small.muted by Totoro, James Danger, and Balduranne
.promo_staff_spotlight_Viirus.pull-right
h3 Staff Spotlight: Phillip AKA Viirus
p There's a new <a href='https://habitica.wordpress.com/category/staff-spotlight/' target='_blank'>Staff Spotlight</a> on the blog, featuring an interview with Phillip (aka viirus)! Check it out to learn how he went from a volunteer contributor to our main mobile developer.
p.small.muted by viirus and Lemoness
tr
td
.promo_takeThis.pull-right
h3 New Take This Challenge!
p The next Take This Challenge has launched, "<a href='/#/options/groups/challenges/4bbf63b5-10bc-49f9-8e95-5bd2ac99cd1c'>I Am The Night!</a>", with a focus on forming better sleep habits. Be sure to check it out to earn additional pieces of the Take This armor set!
h3 Brazilian Portuguese Language Support
p Habitica has been translated into Brazilian Portuguese! If you'd like to use the site in Brazilian Portuguese and it doesn't change automatically for you, change your language to "Português Brasileiro" on the <a href='/#/options/settings/settings'>Settings page</a>. Many thanks to our dedicated volunteer translators for their work!
p.small.muted by the Brazilian Portuguese translation team
tr
td
h3 Get Ready for the Community Costume Challenge!
p We've got an exciting event coming up this October - the annual Community Costume Challenge is returning! In the spirit of the season, Habiticans who dress up in real-life versions of their avatar's armor (or in any Habitica costume) will receive a special badge. (No, just wearing a colored shirt doesn't count. Where's the fun in that?)
br
p <a href='http://www.takethis.org/' target='_blank'>Take This</a> is a nonprofit that seeks to inform the gamer community about mental health issues, to provide education about mental disorders and mental illness prevention, and to reduce the stigma of mental illness.
p The Community Costume Challenge will start on October 1st, but we're announcing it early so that people have time to get their costumes together.
br
p Congratulations to the winners of the last Take This Challenge, "<a href='/#/options/groups/challenges/22db61a5-1022-4f1a-87f6-ad7552bf740e'>Cast of Characters!</a>": grand prize winner Dragonezss, and runners-up elizacorps, jwmeyer86, chady025, Max Yong, and Nightstalker_oL. Plus, all participants in that Challenge have received a piece of the <a href='http://habitica.wikia.com/wiki/Event_Item_Sequences#Take_This_Armor_Set' target='_blank'>Take This item set</a>. It is located in your Rewards column. Enjoy!
p.small.muted by Lemoness, SabreCat, Doctor B, Gordon Shippey, and the Take This team
p Instructions on how to participate in the CCC will be posted when the Challenge is live. We can't wait to see your costumes!
p.small.muted by Lemoness
if menuItem !== 'oldNews'
hr
a(href='/static/old-news', target='_blank') Read older news
mixin oldNews
h2 9/1/2016 - NEW BACKGROUNDS, ARMOIRE ITEMS, AND TAKE THIS CHALLENGE
.promo_backgrounds_armoire_201609.pull-right
tr
td
h3 September Backgrounds and Armoire Items!
p Weve added three new backgrounds: Orchard, Farmhouse, and Cornfields! Get them now from the <a href='/#/options/profile/backgrounds'>Background Shop</a> and show off your avatars in the Tavern!
br
p Plus, theres new Gold-purchasable equipment in the Enchanted Armoire, including the Vermillion Archer Set. Better work hard on your real-life tasks to earn all the pieces! Enjoy :)
p.small.muted by Totoro, James Danger, and Balduranne
tr
td
.promo_takeThis.pull-right
h3 New Take This Challenge!
p The next Take This Challenge has launched, "<a href='/#/options/groups/challenges/4bbf63b5-10bc-49f9-8e95-5bd2ac99cd1c'>I Am The Night!</a>", with a focus on forming better sleep habits. Be sure to check it out to earn additional pieces of the Take This armor set!
br
p <a href='http://www.takethis.org/' target='_blank'>Take This</a> is a nonprofit that seeks to inform the gamer community about mental health issues, to provide education about mental disorders and mental illness prevention, and to reduce the stigma of mental illness.
br
p Congratulations to the winners of the last Take This Challenge, "<a href='/#/options/groups/challenges/22db61a5-1022-4f1a-87f6-ad7552bf740e'>Cast of Characters!</a>": grand prize winner Dragonezss, and runners-up elizacorps, jwmeyer86, chady025, Max Yong, and Nightstalker_oL. Plus, all participants in that Challenge have received a piece of the <a href='http://habitica.wikia.com/wiki/Event_Item_Sequences#Take_This_Armor_Set' target='_blank'>Take This item set</a>. It is located in your Rewards column. Enjoy!
p.small.muted by Lemoness, SabreCat, Doctor B, Gordon Shippey, and the Take This team
h2 8/30/2016 - LAST CHANCE FOR THUNDERSTORM ITEMS; BACK TO SCHOOL GUILD SPOTLIGHT
tr
td
@@ -420,7 +442,7 @@ mixin oldNews
tr
td
h3 Partnership with FocusMe
p Because the Habitica staff members are big fans of distraction-blocker <a href='http://focusme.com' target='_blank'>FocusMe</a> (and their staff members are big fans of Habitica), weve decided to offer <a href='http://focusme.com/habitica-special/' target='_blank'>a joint promotion</a> until Sunday June 19th, where anyone who purchases FocusMe will also be offered a 20% discount on a six-month Habitica subscription! <a href='https://habitica.wordpress.com/2016/06/09/habitica-and-focusme-partnership/' target='_blank'>Learn more here.</a>
p Because the Habitica staff members are big fans of distraction-blocker <a href='http://focusme.com' target='_blank'>FocusMe</a> (and their staff members are big fans of Habitica), weve decided to offer <a href='http://focusme.com/habitica-special/' target='_blank'>a joint promotion</a> until Sunday June 19th, where anyone who purchases FocusMe will also be offered a 20% discount on a six-month Habitica subscription! <a href='https://habitica.wordpress.com/2016/06/09/habitica-and-focusme-partnership/' target='_blank'>Learn more here.</a>
tr
td
h3 Important Info for Developers
@@ -496,7 +518,7 @@ mixin oldNews
tr
td
h3 Important Mobile App Updates
p Weve released an <a href='https://geo.itunes.apple.com/us/app/habitica/id994882113?mt=8' target='_blank'>iOS update</a> and an <a href='https://play.google.com/store/apps/details?id=com.habitrpg.android.habitica' target='_blank'>Android update</a> that contain the new code. Its very important to download these updates immediately, or you may encounter significant bugs!
p Weve released an <a href='https://geo.itunes.apple.com/us/app/habitica/id994882113?mt=8' target='_blank'>iOS update</a> and an <a href='https://play.google.com/store/apps/details?id=com.habitrpg.android.habitica' target='_blank'>Android update</a> that contain the new code. Its very important to download these updates immediately, or you may encounter significant bugs!
tr
td
.Pet-Wolf-Veteran.pull-right
@@ -514,7 +536,7 @@ mixin oldNews
br
p.strong We expect that on Saturday, May 21st, Habitica will be unavailable between <a href='http://www.worldtimebuddy.com/?pl=1&lid=5368361,100&h=5368361' target='_blank'>1 PM and 10 PM Pacific Time (8 pm - 5 am UTC)</a>.
ul
li Don't worry, <strong>you will NOT lose any streaks or take any damage during this weekend, not even from Bosses!</strong> This maintenance will not harm your accounts.
li Don't worry, <strong>you will NOT lose any streaks or take any damage during this weekend, not even from Bosses!</strong> This maintenance will not harm your accounts.
li If you will need to see your task list on Saturday, <strong>we recommend taking a screenshot of your tasks before the maintenance begins</strong> so that you can use them as a reference during downtime.
li At the end of the maintenance, to thank people for their patience, <strong>everyone will receive a rare Veteran pet!</strong>
li This maintenance should not result in any major visible differences to the site; it's all behind-the-scenes work. However, <strong>at the end of it, we will release new updates to the mobile apps, which will be required in order for the apps to work properly with the new changes!</strong> Be sure to download those updates on Saturday as soon as they are released.

View File

@@ -17,7 +17,7 @@
//input(type='checkbox',ng-model='item.completed',ng-change='saveTask(task,true)')
//-,ng-blur='saveTask(task,true)')
span.checklist-icon.glyphicon.glyphicon-resize-vertical
input(type='text', ng-model='item.text',
input(type='text', ng-model='item.text',
ui-keyup="{'13':'addChecklistItem(task,$event,$index)','38 40':'navigateChecklist(task,$index,$event)'}")
a(ng-click='removeChecklistItem(task,$event,$index,true)')
span.glyphicon.glyphicon-trash(tooltip=env.t('delete'))

View File

@@ -53,7 +53,7 @@
| &nbsp;
// notes
// Make this icon available regardless of task ownership
// Make this icon available regardless of task ownership
a.task-notes(ng-show='task.notes && !task._editing', ng-click='task.popoverOpen = !task.popoverOpen', popover-trigger='click', data-popover-html="{{task.notes | markdown}}", popover-placement="top", popover-append-to-body='{{::modal ? "false":"true"}}')
span.glyphicon.glyphicon-comment
| &nbsp;

View File

@@ -33,7 +33,7 @@
ng-change='changeCheck(task)'
ui-keypress='{13:"task.completed = !task.completed; changeCheck(task)"}' )
input.visuallyhidden.focusable(id='box-{{::obj._id}}_{{::task._id}}', type='checkbox',
ng-disabled='$state.includes("options.social.challenges")')
ng-if='!$state.includes("tasks")')
label(for='box-{{::obj._id}}_{{::task._id}}')
// main content