Merge branch 'develop' into armoire

Conflicts:
	common/dist/sprites/habitrpg-shared.css
	common/dist/sprites/spritesmith0.css
	common/dist/sprites/spritesmith0.png
	common/dist/sprites/spritesmith1.css
	common/dist/sprites/spritesmith1.png
	common/dist/sprites/spritesmith2.css
	common/dist/sprites/spritesmith2.png
	common/dist/sprites/spritesmith3.css
	common/dist/sprites/spritesmith3.png
	common/dist/sprites/spritesmith4.css
	common/dist/sprites/spritesmith4.png
	common/dist/sprites/spritesmith5.css
	common/dist/sprites/spritesmith5.png
	common/dist/sprites/spritesmith6.css
	common/dist/sprites/spritesmith6.png
This commit is contained in:
Sabe Jones
2015-06-04 15:49:06 -05:00
32 changed files with 3577 additions and 3395 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 KiB

After

Width:  |  Height:  |  Size: 304 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 77 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

After

Width:  |  Height:  |  Size: 153 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

After

Width:  |  Height:  |  Size: 153 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 678 KiB

After

Width:  |  Height:  |  Size: 679 KiB

View File

@@ -1,6 +1,6 @@
.Mount_Body_Deer-CottonCandyPink { .Mount_Body_Deer-CottonCandyPink {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: -998px -848px; background-position: -998px -742px;
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
@@ -132,13 +132,13 @@
} }
.Mount_Body_Egg-Golden { .Mount_Body_Egg-Golden {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: -1272px -1940px; background-position: -954px -1940px;
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_Egg-Red { .Mount_Body_Egg-Red {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: -318px -544px; background-position: -1272px -1940px;
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
@@ -456,85 +456,85 @@
} }
.Mount_Body_LionCub-Skeleton { .Mount_Body_LionCub-Skeleton {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: -998px -530px; background-position: 0px -986px;
width: 105px; width: 111px;
height: 105px; height: 105px;
} }
.Mount_Body_LionCub-White { .Mount_Body_LionCub-White {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: -998px -636px; background-position: -998px -530px;
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_LionCub-Zombie { .Mount_Body_LionCub-Zombie {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: -998px -742px; background-position: -998px -636px;
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_Mammoth-Base { .Mount_Body_Mammoth-Base {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: -106px -544px; background-position: 0px -544px;
width: 105px; width: 105px;
height: 123px; height: 123px;
} }
.Mount_Body_MantisShrimp-Base { .Mount_Body_MantisShrimp-Base {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: 0px -986px; background-position: -112px -986px;
width: 108px; width: 108px;
height: 105px; height: 105px;
} }
.Mount_Body_Octopus-Base { .Mount_Body_Octopus-Base {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: -109px -986px; background-position: -998px -848px;
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_Octopus-CottonCandyBlue { .Mount_Body_Octopus-CottonCandyBlue {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: -215px -986px; background-position: -221px -986px;
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_Octopus-CottonCandyPink { .Mount_Body_Octopus-CottonCandyPink {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: -321px -986px; background-position: -327px -986px;
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_Octopus-Desert { .Mount_Body_Octopus-Desert {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: -427px -986px; background-position: -433px -986px;
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_Octopus-Golden { .Mount_Body_Octopus-Golden {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: -533px -986px; background-position: -539px -986px;
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_Octopus-Red { .Mount_Body_Octopus-Red {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: -639px -986px; background-position: -645px -986px;
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_Octopus-Shade { .Mount_Body_Octopus-Shade {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: -745px -986px; background-position: -751px -986px;
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_Octopus-Skeleton { .Mount_Body_Octopus-Skeleton {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: -851px -986px; background-position: -857px -986px;
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
.Mount_Body_Octopus-White { .Mount_Body_Octopus-White {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: -957px -986px; background-position: -963px -986px;
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
@@ -1158,7 +1158,7 @@
} }
.Mount_Body_Spider-CottonCandyPink { .Mount_Body_Spider-CottonCandyPink {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: -212px -544px; background-position: -318px -544px;
width: 105px; width: 105px;
height: 105px; height: 105px;
} }
@@ -1260,7 +1260,7 @@
} }
.Mount_Body_TRex-Zombie { .Mount_Body_TRex-Zombie {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: -136px 0px; background-position: 0px 0px;
width: 135px; width: 135px;
height: 135px; height: 135px;
} }
@@ -1332,7 +1332,7 @@
} }
.Mount_Body_Wolf-Base { .Mount_Body_Wolf-Base {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: 0px 0px; background-position: -136px 0px;
width: 135px; width: 135px;
height: 135px; height: 135px;
} }
@@ -2046,9 +2046,9 @@
} }
.Mount_Head_LionCub-Skeleton { .Mount_Head_LionCub-Skeleton {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: -954px -1940px; background-position: -212px -544px;
width: 105px; width: 105px;
height: 105px; height: 110px;
} }
.Mount_Head_LionCub-White { .Mount_Head_LionCub-White {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
@@ -2064,7 +2064,7 @@
} }
.Mount_Head_Mammoth-Base { .Mount_Head_Mammoth-Base {
background-image: url(spritesmith5.png); background-image: url(spritesmith5.png);
background-position: 0px -544px; background-position: -106px -544px;
width: 105px; width: 105px;
height: 123px; height: 123px;
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 357 KiB

After

Width:  |  Height:  |  Size: 357 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 999 B

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 825 B

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -95,5 +95,13 @@
"backgroundMountainLakeText": "Mountain Lake", "backgroundMountainLakeText": "Mountain Lake",
"backgroundMountainLakeNotes": "Dip your toes in a Mountain Lake.", "backgroundMountainLakeNotes": "Dip your toes in a Mountain Lake.",
"backgroundPagodasText": "Pagodas", "backgroundPagodasText": "Pagodas",
"backgroundPagodasNotes": "Climb to the top of Pagodas." "backgroundPagodasNotes": "Climb to the top of Pagodas.",
"backgrounds062015": "SET 13: Released June 2015",
"backgroundDriftingRaftText": "Drifting Raft",
"backgroundDriftingRaftNotes": "Paddle a Drifting Raft.",
"backgroundShimmeryBubblesText": "Shimmery Bubbles",
"backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.",
"backgroundIslandWaterfallsText": "Island Waterfalls",
"backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls."
} }

View File

@@ -116,5 +116,8 @@
"sendGiftFromBalance": "From Balance", "sendGiftFromBalance": "From Balance",
"sendGiftPurchase": "Purchase", "sendGiftPurchase": "Purchase",
"sendGiftMessagePlaceholder": "Personal message (optional)", "sendGiftMessagePlaceholder": "Personal message (optional)",
"sendGiftSubscription": "<%= months %> Month(s): $<%= price %>" "sendGiftSubscription": "<%= months %> Month(s): $<%= price %>",
"inviteFriends": "Invite Friends",
"startAParty": "Start a Party",
"addToParty": "Add someone to your party"
} }

View File

@@ -118,5 +118,7 @@
"resubscribe": "Resubscribe", "resubscribe": "Resubscribe",
"promoCode": "Promo Code", "promoCode": "Promo Code",
"promoCodeApplied": "Promo Code Applied! Check your inventory", "promoCodeApplied": "Promo Code Applied! Check your inventory",
"promoPlaceholder": "Enter Promotion Code" "promoPlaceholder": "Enter Promotion Code",
"couponText": "We sometimes have events and give out coupon codes for special gear. (eg, those who stop by our Wondercon booth)",
"displayInviteToPartyWhenPartyIs1": "Display Invite To Party button when party has 1 member."
} }

View File

@@ -1855,6 +1855,16 @@ api.backgrounds =
pagodas: pagodas:
text: t('backgroundPagodasText') text: t('backgroundPagodasText')
notes: t('backgroundPagodasNotes') notes: t('backgroundPagodasNotes')
backgrounds062015:
drifting_raft:
text: t('backgroundDriftingRaftText')
notes: t('backgroundDriftingRaftNotes')
shimmery_bubbles:
text: t('backgroundShimmeryBubblesText')
notes: t('backgroundShimmeryBubblesNotes')
island_waterfalls:
text: t('backgroundIslandWaterfallsText')
notes: t('backgroundIslandWaterfallsNotes')
api.subscriptionBlocks = api.subscriptionBlocks =
basic_earned: months:1, price:5 basic_earned: months:1, price:5

View File

@@ -1,4 +1,7 @@
'use strict' 'use strict'
#@TODO: Have to mock most things to get to the parts that
#call pushNotify. Consider refactoring group controller
#so things are easier to test
app = require("../../website/src/server") app = require("../../website/src/server")
rewire = require('rewire') rewire = require('rewire')
@@ -78,7 +81,6 @@ describe "Push-Notifications", ->
recipient = null recipient = null
groups = rewire("../../website/src/controllers/groups") groups = rewire("../../website/src/controllers/groups")
groups.__set__('questStart', -> true)
groups.__set__('pushNotify', pushSpy) groups.__set__('pushNotify', pushSpy)
before (done) -> before (done) ->
@@ -150,6 +152,7 @@ describe "Push-Notifications", ->
group = { _id: 'party-id', name: 'party-name', type: 'party', members: [user._id, recipient._id], invites: [], quest: {}} group = { _id: 'party-id', name: 'party-name', type: 'party', members: [user._id, recipient._id], invites: [], quest: {}}
user.items.quests.hedgehog = 5 user.items.quests.hedgehog = 5
group.save = (cb) -> cb(null, group) group.save = (cb) -> cb(null, group)
group.markModified = -> true
req = { req = {
body: { uuids: [recipient._id] } body: { uuids: [recipient._id] }
query: { key: 'hedgehog' } query: { key: 'hedgehog' }
@@ -171,6 +174,51 @@ describe "Push-Notifications", ->
done() done()
, 100 , 100
it "sends a push notification to participating members when quest starts", (done) ->
group = { _id: 'party-id', name: 'party-name', type: 'party', members: [user._id, recipient._id], invites: []}
group.quest = {
key: 'hedgehog'
progress: { hp: 100 }
members: {}
}
group.quest.members[recipient._id] = true
group.save = (cb) -> cb(null, group)
group.markModified = -> true
req = {
body: { uuids: [recipient._id] }
query: { }
# force: true
}
res = {
locals: { group: group, user: user }
json: -> return true
}
userMock = {
findOne: (arg, arg2, cb) ->
cb(null, recipient)
update: (arg, arg2, cb) ->
cb(null, user)
}
groups.__set__('User', userMock)
groups.__set__('populateQuery',
(arg, arg2, arg3) ->
return {
exec: -> group.members
}
)
groups.questAccept req, res
setTimeout -> # Allow questAccept to finish
expect(pushSpy.sendNotify).to.have.been.calledTwice
expect(pushSpy.sendNotify).to.have.been.calledWith(
recipient,
'HabitRPG',
'Your Quest has Begun: The Hedgebeast'
)
done()
, 100
describe "Gifts", -> describe "Gifts", ->
recipient = null recipient = null

View File

@@ -0,0 +1,56 @@
'use strict';
describe('Header Controller', function() {
var scope, ctrl, user, $location, $rootScope;
beforeEach(function() {
module(function($provide) {
$provide.value('User', {});
});
inject(function(_$rootScope_, _$controller_, _$location_){
user = specHelper.newUser();
user._id = "unique-user-id"
scope = _$rootScope_.$new();
$rootScope = _$rootScope_;
$location = _$location_;
// Load RootCtrl to ensure shared behaviors are loaded
_$controller_('RootCtrl', {$scope: scope, User: {user: user}});
ctrl = _$controller_('HeaderCtrl', {$scope: scope, User: {user: user}});
});
});
context('inviteOrStartParty', function(){
beforeEach(function(){
sinon.stub($location, 'path');
sinon.stub($rootScope, 'openModal');
});
afterEach(function(){
$location.path.restore();
$rootScope.openModal.restore();
});
it('redirects to party page if user does not have a party', function(){
var group = {};
scope.inviteOrStartParty(group);
expect($location.path).to.be.calledWith("/options/groups/party");
expect($rootScope.openModal).to.not.be.called;
});
it('Opens invite-friends modal if user has a party', function(){
var group = {
type: 'party'
};
scope.inviteOrStartParty(group);
expect($rootScope.openModal).to.be.calledOnce;
expect($location.path).to.not.be.called;
});
});
});

View File

@@ -98,7 +98,7 @@
@media (min-width: 70em) @media (min-width: 70em)
.site-header .site-header
width: 70% width: 70%
// this is a wrapper for avatars in the header // this is a wrapper for avatars in the header
// inside this is the actual `herobox` module // inside this is the actual `herobox` module
@@ -125,7 +125,7 @@
hrpg-label-color-mixin(darken($color-herobox, 16.18%)) hrpg-label-color-mixin(darken($color-herobox, 16.18%))
width: 2.618em width: 2.618em
text-align:center text-align:center
margin-right: 0.618em margin-right: 0.618em
.meter .meter
position: relative position: relative
overflow: hidden overflow: hidden
@@ -161,7 +161,7 @@
white-space: nowrap white-space: nowrap
&.value &.value
right: 0.382em right: 0.382em
// boss.jade only // boss.jade only
[class^="quest_"] + & [class^="quest_"] + &
min-width: 220px min-width: 220px
@@ -172,4 +172,8 @@
header .hero-stats header .hero-stats
background-color: darken($color-herobox, 4%) background-color: darken($color-herobox, 4%)
border-right: 1px solid darken($color-herobox, 12%) border-right: 1px solid darken($color-herobox, 12%)
button.party-invite
right: 10px;
position: absolute;
top: 55px;

View File

@@ -1,7 +1,7 @@
"use strict"; "use strict";
habitrpg.controller("HeaderCtrl", ['$scope', 'Groups', 'User', habitrpg.controller("HeaderCtrl", ['$scope', 'Groups', 'User', '$location', '$rootScope',
function($scope, Groups, User) { function($scope, Groups, User, $location, $rootScope) {
$scope.Math = window.Math; $scope.Math = window.Math;
$scope.user = User.user; $scope.user = User.user;
@@ -16,6 +16,19 @@ habitrpg.controller("HeaderCtrl", ['$scope', 'Groups', 'User',
$scope.$watch('user.party.orderAscending', triggerResort); $scope.$watch('user.party.orderAscending', triggerResort);
}); });
$scope.inviteOrStartParty = function(group) {
if (group.type === "party") {
$rootScope.openModal('invite-friends', {
controller:'InviteToGroupCtrl',
resolve: {
injectedGroup: function(){ return group; }
}
});
} else {
$location.path("/options/groups/party");
}
}
function resortParty() { function resortParty() {
var result = _.sortBy( var result = _.sortBy(
_.filter($scope.party.members, function(member){ _.filter($scope.party.members, function(member){

View File

@@ -831,13 +831,18 @@ questStart = function(req, res, next) {
updates['$set']['party.quest.progress.collect'] = collected; updates['$set']['party.quest.progress.collect'] = collected;
updates['$set']['party.quest.completed'] = null; updates['$set']['party.quest.completed'] = null;
questMembers[m] = true; questMembers[m] = true;
User.findOne({_id: m}, {pushDevices: 1}, function(err, user){
pushNotify.sendNotify(user, "HabitRPG", shared.i18n.t('questStarted') + ": "+ quest.text() );
});
} else { } else {
updates['$set']['party.quest'] = Group.cleanQuestProgress(); updates['$set']['party.quest'] = Group.cleanQuestProgress();
} }
parallel.push(function(cb2){ parallel.push(function(cb2){
User.update({_id:m},updates,cb2); User.update({_id:m},updates,cb2);
}); });
}) });
group.quest.active = true; group.quest.active = true;
if (quest.boss) { if (quest.boss) {
@@ -913,10 +918,6 @@ api.questAccept = function(req, res, next) {
group.quest.leader = user._id; group.quest.leader = user._id;
} else { } else {
group.quest.members[m] = undefined; group.quest.members[m] = undefined;
User.findById(m, function(err,groupMember){
pushNotify.sendNotify(groupMember, shared.i18n.t('questInvitationTitle'), shared.i18n.t('questInvitationInfo', { quest: quest.text() }));
});
} }
}); });
@@ -924,7 +925,7 @@ api.questAccept = function(req, res, next) {
_id: { _id: {
$in: _.without(group.members, user._id) $in: _.without(group.members, user._id)
} }
}, {auth: 1, preferences: 1, profile: 1}, function(err, members){ }, {auth: 1, preferences: 1, profile: 1, pushDevices: 1}, function(err, members){
if(err) return next(err); if(err) return next(err);
var inviterVars = utils.getUserInfo(user, ['name', 'email']); var inviterVars = utils.getUserInfo(user, ['name', 'email']);
@@ -940,6 +941,10 @@ api.questAccept = function(req, res, next) {
{name: 'PARTY_URL', content: '/#/options/groups/party'} {name: 'PARTY_URL', content: '/#/options/groups/party'}
]); ]);
_.each(members, function(groupMember){
pushNotify.sendNotify(groupMember, shared.i18n.t('questInvitationTitle'), shared.i18n.t('questInvitationInfo', { quest: quest.text() }));
});
questStart(req,res,next); questStart(req,res,next);
}); });

View File

@@ -325,6 +325,7 @@ var UserSchema = new Schema({
advancedCollapsed: {type: Boolean, 'default': false}, advancedCollapsed: {type: Boolean, 'default': false},
toolbarCollapsed: {type:Boolean, 'default':false}, toolbarCollapsed: {type:Boolean, 'default':false},
background: String, background: String,
displayInviteToPartyWhenPartyIs1: { type:Boolean, 'default':true},
webhooks: {type: Schema.Types.Mixed, 'default': {}}, webhooks: {type: Schema.Types.Mixed, 'default': {}},
// For this fields make sure to use strict comparison when searching for falsey values (=== false) // For this fields make sure to use strict comparison when searching for falsey values (=== false)
// As users who didn't login after these were introduced may have them undefined/null // As users who didn't login after these were introduced may have them undefined/null

View File

@@ -66,6 +66,10 @@ script(type='text/ng-template', id='partials/options.settings.settings.html')
label label
input(type='checkbox', ng-model='user.preferences.dailyDueDefaultView', ng-change='set({"preferences.dailyDueDefaultView": user.preferences.dailyDueDefaultView?true: false})') input(type='checkbox', ng-model='user.preferences.dailyDueDefaultView', ng-change='set({"preferences.dailyDueDefaultView": user.preferences.dailyDueDefaultView?true: false})')
span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('dailyDueDefaultViewPop'))=env.t('dailyDueDefaultView') span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('dailyDueDefaultViewPop'))=env.t('dailyDueDefaultView')
.checkbox(ng-if='party.memberCount === 1')
label
input(type='checkbox', ng-model='user.preferences.displayInviteToPartyWhenPartyIs1', ng-change='set({"preferences.displayInviteToPartyWhenPartyIs1": user.preferences.displayInviteToPartyWhenPartyIs1 ? true : false})')
span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('displayInviteToPartyWhenPartyIs1'))=env.t('displayInviteToPartyWhenPartyIs1')
// button.btn.btn-default(ng-click='showTour()', popover-placement='right', popover-trigger='mouseenter', popover=env.t('restartTour'))= env.t('showTour') // button.btn.btn-default(ng-click='showTour()', popover-placement='right', popover-trigger='mouseenter', popover=env.t('restartTour'))= env.t('showTour')
button.btn.btn-default(ng-click='showBailey()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('showBaileyPop'))= env.t('showBailey') button.btn.btn-default(ng-click='showBailey()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('showBaileyPop'))= env.t('showBailey')
button.btn.btn-default(ng-click='openRestoreModal()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('fixValPop'))= env.t('fixVal') button.btn.btn-default(ng-click='openRestoreModal()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('fixValPop'))= env.t('fixVal')

View File

@@ -60,7 +60,7 @@ a.pull-right.gem-wallet(ng-if='group.type!="party"', popover-trigger='mouseenter
.panel-heading .panel-heading
h3.panel-title h3.panel-title
=env.t('members') =env.t('members')
button.pull-right.btn.btn-primary(ng-click="openInviteModal(group)")=env.t('inviteFriends') button.pull-right.btn.btn-primary(ng-click="openInviteModal(group)")=env.t("inviteFriends")
.panel-body.modal-fixed-height .panel-body.modal-fixed-height
div.form-group(ng-if='::group.type=="party"') div.form-group(ng-if='::group.type=="party"')
p=env.t('partyList') p=env.t('partyList')

View File

@@ -32,5 +32,8 @@
// party // party
span(ng-controller='PartyCtrl') span(ng-controller='PartyCtrl')
button.party-invite.pull-right.btn.btn-primary(ng-click="inviteOrStartParty(group)",
ng-if="(!party.members || party.memberCount === 1) && user.preferences.displayInviteToPartyWhenPartyIs1",
popover="{{!party.members ? env.t('startAParty') : env.t('addToParty')}}", popover-placement="left", popover-trigger="mouseenter")=env.t("inviteFriends")
.herobox-wrap(ng-repeat='profile in partyMinusSelf') .herobox-wrap(ng-repeat='profile in partyMinusSelf')
+herobox() +herobox()

View File

@@ -1,10 +1,11 @@
h5 6/1/2015 - JUNE MYSTERY ITEM AND NEW MOUNT POSITIONING! h5 6/1/2015 - JUNE BACKGROUNDS AND NEW MOUNT POSITIONING!
hr hr
tr tr
td td
.inventory_present_06.pull-right .background_island_waterfalls.pull-right
h5 June Mystery Item! h5 June Backgrounds Revealed
p Ooh, how mysterious! All Habiticans who are <a href='/#/options/settings/subscription' target='_blank'>subscribed</a> during the month of June will receive the June Mystery Item Set, as well as the ability to buy Gems with Gold! The June Item Set will be revealed on the 25th, so keep your eyes peeled. Thanks for supporting the site <3 p There are three new avatar backgrounds in the <a href='/#/options/profile/backgrounds' target='_blank'>Background Shop</a>! Now your avatar can paddle a Drifting Raft, float through a sea of Shimmery Bubbles, or picnic near Island Waterfalls!
p.small.muted by (in order): Teto is Great, beffymaroo, and UncommonCriminal
tr tr
td td
h5 New Mount Positioning! h5 New Mount Positioning!
@@ -16,6 +17,12 @@ a(href='/static/old-news', target='_blank') Read older news
mixin oldNews mixin oldNews
h5 6/1/2015 - JUNE MYSTERY ITEM AND NEW MOUNT POSITIONING!
tr
td
.inventory_present_06.pull-right
h5 June Mystery Item!
p Ooh, how mysterious! All Habiticans who are <a href='/#/options/settings/subscription' target='_blank'>subscribed</a> during the month of June will receive the June Mystery Item Set, as well as the ability to buy Gems with Gold! The June Item Set will be revealed on the 25th, so keep your eyes peeled. Thanks for supporting the site <3
h5 5/31/2015 - PUSH NOTIFICATIONS FOR ANDROID, AND LAST CHANCE FOR GREEN KNIGHT SUBSCRIBER ITEMS! h5 5/31/2015 - PUSH NOTIFICATIONS FOR ANDROID, AND LAST CHANCE FOR GREEN KNIGHT SUBSCRIBER ITEMS!
tr tr
td td