Merge branch 'develop' of https://github.com/HabitRPG/habitrpg into develop

This commit is contained in:
Matteo Pagliazzi 2014-02-08 15:31:43 +01:00
commit c8639c178d
74 changed files with 2165 additions and 2292 deletions

View file

@ -1,8 +1,3 @@
{
"directory": "public/bower_components",
"storage": {
"packages": ".bower-cache",
"registry": ".bower-registry"
},
"tmp": ".bower-tmp"
"directory": "public/bower_components"
}

View file

@ -14,20 +14,21 @@
"tests"
],
"dependencies": {
"jquery": "~2.0.3",
"jquery": "~2.1.0",
"jquery.cookie": "~1.4.0",
"jquery-ui": "~1.10.3",
"angular": "~1.2.1",
"angular-sanitize": "~1.2.1",
"angular-resource": "~1.2.1",
"angular-ui": "~0.4.0",
"angular-bootstrap": "~0.5.0",
"angular": "~1.2.11",
"angular-sanitize": "~1.2.11",
"angular-resource": "~1.2.11",
"angular-ui-utils": "~0.1.0",
"angular-ui-select2": "https://github.com/angular-ui/ui-select2.git#4469fd7a32eba2e28d5e3dd319b49e1ad090b167",
"angular-bootstrap": "~0.10.0",
"angular-ui-router": "ca3b4777a603df8f86cfd653c8f6c38b2ae05d89",
"angular-loading-bar": "~0.0.5",
"angular-loading-bar": "~0.3.0",
"angular-bindonce": "~0.2.1",
"bootstrap": "v2.3.2",
"bootstrap-datepicker": "~1.2.0",
"bootstrap-growl": "~1.1.0",
"bootstrap": "~3.1.0",
"bootstrap-growl": "git://github.com/ifightcrime/bootstrap-growl.git#master",
"bootstrap-tour": "~0.8.1",
"habitrpg-shared": "git://github.com/HabitRPG/habitrpg-shared.git#develop",
"BrowserQuest": "https://github.com/mozilla/BrowserQuest.git",
"github-buttons": "git://github.com/mdo/github-buttons.git",
@ -37,13 +38,13 @@
"js-emoji": "git://github.com/snicker/js-emoji#master",
"gemoji": "git://github.com/github/gemoji",
"sticky": "*",
"bootstrap-tour": "~0.8.0",
"angular-ui-utils": "~0.1.0",
"swagger-ui": "https://github.com/wordnik/swagger-ui.git#105c516f5f055b140e935e9cfe0c36f841921dff",
"ngInfiniteScroll": "~1.0.0",
"angular-ui-select2": "https://github.com/angular-ui/ui-select2.git#4469fd7a32eba2e28d5e3dd319b49e1ad090b167"
"ngInfiniteScroll": "~1.0.0"
},
"devDependencies": {
"angular-mocks": "~1.2.1"
"angular-mocks": "~1.2.11"
},
"resolutions": {
"angular": "~1.2.11"
}
}

View file

@ -16,6 +16,16 @@
.wide-popover
max-width: 400px
#notification-area
position: fixed
top: 0
right: 0px
z-index: 1061
.alert
padding-top: 8px
padding-bottom: 8px
// variables
gpColor = #FBEFC0
@ -86,6 +96,8 @@ borderDarken = 20%
background-size: 18px
width: 14px
height: 14px
display: inline-block
vertical-align: middle
.icon-silver
background: url("/bower_components/habitrpg-shared/img/coin_single_silver.png") no-repeat
@ -93,6 +105,8 @@ borderDarken = 20%
background-size: 18px
width: 14px
height: 14px
display: inline-block
vertical-align: middle
.icon-death
background: url("/bower_components/habitrpg-shared/img/sprites/dead.png") no-repeat
@ -100,7 +114,8 @@ borderDarken = 20%
background-size: 14px
width: 14px
height: 14px
display: inline-block
vertical-align: middle
.undo-button
z-index: 3000

View file

@ -9,6 +9,19 @@ Seeing as the sprites might change drastically in the
future re: pets and whatnot, this is just temporary.
---------------------------------------------------- */
.profile-modal-header
width:560px
margin: 0px auto
.avatar-level
position absolute
bottom 0px
right 0px
padding 2px 3px 2px 3px
border-top-right-radius: 0px
border-bottom-right-radius: 0px
border-bottom-left-radius: 0px
// basic herobox styles
.herobox
height: 10.5em // higher to acct for the name area
@ -40,7 +53,7 @@ future re: pets and whatnot, this is just temporary.
// always visible on the user's own avatar
.herobox:after
opacity: 0
.herobox.isUser:after
.herobox.isUser:not(.hasMount):after
opacity: 1
// make it a bit special
background darken($better, 15%)
@ -52,21 +65,17 @@ future re: pets and whatnot, this is just temporary.
.active
border 1px solid black
// vertically center avatar sprite
// depending on if they have a pet
.herobox.hasPet
padding-top: 2em
.herobox:not(.hasPet)
padding-top: 1.75em
// if it is the user's avatar, check if
// they have a pet and pad accordingly
.herobox.hasPet.isUser
padding-top: 3.25em
// if not user's avatar, remove lines for party unity
.herobox:not(.isUser)
outline: 0
outline: 0
// vertically center avatar sprite depending on if they have a pet
.herobox.hasPet
padding-top: 1.75em
.herobox:not(.hasPet)
padding-top: 2em
.herobox.hasMount
padding-top:0em
// expose hero info on hover, taking
// into account the extra pet space
@ -74,13 +83,6 @@ future re: pets and whatnot, this is just temporary.
background: desaturate(lighten($better, 30%), 10%)
&:after
opacity: 1
/* .herobox.hasPet
&:hover, &:focus
padding-top: 3.25em
.herobox:not(.hasPet)
&:hover, &:focus
padding-top: 2.5em */
// positioning the sprites, etc
.herobox
@ -93,4 +95,4 @@ future re: pets and whatnot, this is just temporary.
position: absolute
.herobox.isLeader
background: $better
background: $better

View file

@ -10,12 +10,4 @@ ul.challenge-accordion-header-specs
margin-bottom: 10px
#challenges-filters h3
margin-top: 0px;
// for things like challenges, member profiles, etc
@media (min-width: 767px)
.wide-modal
/* new custom width */
width: 1020px;
/* must be half of the width, minus scrollbar on the left (30px) */
margin-left: -480px;
margin-top: 0px;

View file

@ -1,36 +1,19 @@
/* Filters */
.filters
padding-left: 19px
padding-right: 19px
.filters .nav
margin-bottom: 0
.filter-description
margin-top: 7px
margin-right: 7px
/* Filters applied to tasks */
.task.filtered-out
display: none
.tag-label:hover
background-color: #3a87ad
cursor: pointer
.tag-editing
padding 2px 0 0 2px
.tag-editing .tag-editing-pill
height:auto
margin-top: 5px
margin-bottom: 5px
.tag-list
overflow-y: auto
white-space: nowrap
.nav-pills
height: 43px
li
display: inline-block
float: none
.filter-description
margin-top: 7px
margin-right: 7px
padding-left: 7px
.input-group
float: left
width: 1px // Trick for proper alignment
margin-left: 3px
margin-right: 3px
margin-top: 5px
.form-control
width: auto

View file

@ -1,83 +1,9 @@
/* Sticky footer styles
-------------------------------------------------- */
html,
body {
height: 100%;
/* The html and body elements cannot have any padding or margin. */
}
/* Wrapper for page content to push down footer */
#wrap {
min-height: 100%;
height: auto !important;
height: 100%;
/* Negative indent footer by it's height */
margin: 0 auto -60px;
}
/* Set the fixed height of the footer here */
#push,
#footer {
height: 60px;
}
#footer {
background-color: #f5f5f5;
}
/* Lastly, apply responsive CSS fixes as necessary */
@media (max-width: 767px) {
#footer {
margin-left: -20px;
margin-right: -20px;
padding-left: 20px;
padding-right: 20px;
}
}
/* Custom page CSS
-------------------------------------------------- */
/* Not required for template or sticky footer method. */
#wrap > .container {
padding-top: 60px;
}
.container .credit {
margin: 20px 0;
}
code {
font-size: 80%;
}
/* HabitRPG Custom CSS
-------------------------------------------------- */
.footer {
/*padding: 70px 0;*/
border-top: 1px solid #e5e5e5;
background-color: #f5f5f5;
}
.footer li {
text-align: left;
}
.footer h4 {
text-align: left;
}
.footer td {
align: left !important;
}
.frontpage-play-button
//box-shadow: 0 0 40px #494141;
display:inline
font-size: 20px
width:100px
height:50px
.footer
padding-top: 20px
margin-top: 40px
padding-bottom: 20px
border-top: 1px solid #e5e5e5
background-color: #f5f5f5

View file

@ -8,21 +8,22 @@
color #fff
background-color #51a351
.tavern-pane
position relative
height 250px
.chat-form
position: relative
z-index: 10
margin-bottom: 10px
textarea
margin-bottom: 5px
.chat-message .chat-plus-one
opacity: 0
background-color: #eee
padding: 3px 3px 0px 3px
.chat-message:hover .chat-plus-one
opacity: 1
color: #999
.tavern-chat, .party-chat
li
padding-top:15px
padding-bottom:15px

View file

@ -3,9 +3,6 @@
// Vendor Includes - include first so we can override
// Import only styles that do not have urls to images! Include them directly in the page!
@import "../bower_components/bootstrap-datepicker/css/datepicker.css"
@import "../bower_components/angular-ui/build/angular-ui.min.css"
@import "../bower_components/bootstrap/docs/assets/css/bootstrap-responsive.css"
@import "../bower_components/bootstrap-tour/build/css/bootstrap-tour.min.css"
@import "../bower_components/angular-loading-bar/build/loading-bar.css"
@import "../bower_components/js-emoji/emoji.css"
@ -19,7 +16,6 @@
@import "./inventory.styl"
@import "./alerts.styl"
@import "./helpers.styl"
@import "./responsive.styl"
@import "./header.styl"
@import "./filters.styl"
@import "./scrollbars.styl"
@ -29,10 +25,7 @@
@import "./classes.styl"
@import "./quests.styl"
@import "./shared.styl"
// fix exploding to very wide for some reason
.datepicker
width: 210px
@import "./footer.styl"
html,body,p,h1,ul,li,table,tr,th,td
margin: 0
@ -42,54 +35,27 @@ html,body,p,h1,ul,li,table,tr,th,td
-webkit-box-sizing: border-box
-moz-box-sizing: border-box
box-sizing: border-box
* { font-family: "Lato", sans-serif }
font-family: "Lato", sans-serif
hr
border-top: 0
border-bottom: 1px solid #ddd
border-color: rgba(0,0,0,0.1)
/* Footer
-------------------------------------------------- */
/* Bootstrap website boilerplate */
.footer {
padding: 70px 0;
border-top: 1px solid #e5e5e5;
background-color: #f5f5f5;
}
.footer p {
margin-bottom: 0;
color: #777;
}
.footer-links {
margin: 10px 0;
}
.footer-links li {
display: inline;
margin-right: 10px;
}
/* Bootstrap overrides */
div.tooltip-inner {
max-width: 300px;
}
/* Customizations to make footer sticky */
/*html, body {height: 100%;}*/
#wrap
min-height: 100%
z-index:-1
#main
padding-bottom: 250px; /* don't know why this works, sticky footers are weird */
@media (max-width: 600px) {
#wrap {
html, body
height: 100%
#wrap
z-index:-1
padding: 0 15px // Required by Bootstrap 3 when using .container-fluid
min-height: 100%
height: auto !important
@media (max-width: 600px)
#wrap
margin-top: 0
}
}
/* Gems
-------------------------------------------------- */
@ -108,17 +74,17 @@ div.tooltip-inner {
position: relative;
.gem-cost::before
content: "";
display: block;
width: 0;
height: 0;
border: 6px solid #D4D4D4;
border-color: transparent #D4D4D4 transparent transparent;
position: absolute;
right: 100%;
margin-right: 0;
top: 50%;
margin-top: -6px;
content: ""
display: block
width: 0
height: 0
border: 6px solid #D4D4D4
border-color: transparent #D4D4D4 transparent transparent
position: absolute
right: 100%
margin-right: 0
top: 50%
margin-top: -6px
.gem-cost::after
content: "";
@ -135,48 +101,37 @@ div.tooltip-inner {
/* Misc
-------------------------------------------------- */
//move
.modal
whitespace: normal
.new-stuff-modal // a .modal-body
overflow-y: auto
max-height: 400px // Taken from Bootstrap 2.3.2 css, may need to change
.notification-character
float:left
h5
font-weight: 700
// notification-character used only by death modal's figure, move
.death-modal // a .modal-body
margin: 10px
figure
float: left
padding: 15px
.notification-message
display: inline-block;
padding-right: 1em
line-height: 3
.notification-action
vertical-align: baseline
#reset-modal
z-index:1500
#notification-area
position: fixed;
top: 0;
right: 0px;
z-index: 1061;
.modal-body
margin: 10px
// TODO this is supposed to go in avatar.styl, but stylus is breaking if I even touch that file
.profile-modal-header
width:560px
margin: 0px auto
.avatar-level
position absolute
bottom 0px
right 0px
padding 1px 3px 1px 3px
a
cursor: pointer
#modalMember p
word-wrap: break-word
a span.glyphicon
color: #333 // Takes base color from bootstrap
a.label
color: #fff
.muted
color: #999
.btn
margin-right: 5px
@ -189,15 +144,6 @@ a
margin-left: 10px;
padding-left: 10px;
.inline-modal
position: relative
top: auto;
left: auto
right: auto
margin: 0 auto 20px
z-index: 1
max-width: 100%
.buy-gems
.nav-tabs
margin-top: 0.5em

View file

@ -1,61 +0,0 @@
// widths
.full
width: 100%;
.half
width: 50%;
.third
width: 33.3333%;
.two-thirds
width: 66.6666%;
.quarter
width: 25%;
.three-quarters
width: 75%;
.fifth
width: 20%;
.two-fifths
width: 40%;
.three-fifths
width: 60%;
.four-fifths
width: 80%;
.sixth
width: 16.6667%;
.eighth
width: 12.5%;
.tenth
width: 10%;
.twelfth
width: 8.3333%;
.grid
padding: 0 1.5em 1.5em 0
letter-spacing: -4px
.module
display: inline-block
letter-spacing: normal
vertical-align: top
width: 25%
padding: 0 0 1.5em 1.5em
-moz-box-sizing: border-box
box-sizing: border-box
// at 960px when 4 columns really starts to break
@media (max-width: 60em)
.module
width: 50%
.task-column
max-height: 18em
overflow-y: scroll
// at 600px when 2col starts breaking
@media (max-width: 37.5em)
.grid
padding-right: 0
.module
width: 100%
padding-left: 0
.task-column
max-height: none
overflow: visible

View file

@ -13,4 +13,14 @@
.dashed-underline
border-bottom:1px dashed #000
text-decoration:none
cursor pointer
cursor pointer
// Required by angular-ui-bootstrap
.nav, .pagination, .carousel, .panel-title a
cursor: pointer
.nav-tabs
margin-bottom: 15px
img
max-width: 100%

View file

@ -1,21 +0,0 @@
.jumbotron {
background-color: #1b1b1b;
background-image: -moz-linear-gradient(top, #222222, #111111);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
background-image: -webkit-linear-gradient(top, #222222, #111111);
background-image: -o-linear-gradient(top, #222222, #111111);
background-image: linear-gradient(to bottom, #222222, #111111);
background-repeat: repeat-x;
border-color: #252525;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
background:none;
color:black;
}
body {
padding-top:0px;
}
a {
cursor: pointer;
}

View file

@ -4,9 +4,25 @@
// Import only styles that do not have urls to images! Include them directly in the page!
@import "../bower_components/angular-loading-bar/build/loading-bar.css"
@import "./static-pages.css"
@import "./shared.styl"
@import "./footer"
.muted i, i.muted
opacity:0.5
opacity:0.5
#header-play-button
margin-right: 15px
#tagline
margin:10px 0 20px 0
font-size:40px
.marketing
text-align: center
#frontpage-play-button
//box-shadow: 0 0 40px #494141;
display:inline
font-size: 20px
width:100px
height:50px

View file

@ -23,6 +23,8 @@ for $stage in $stages
.completed
background-color: $completed
color: #999
.glyphicon
color: #333
.task-checker label
background-color: darken($completed, 30%)
.task-action-btn
@ -31,11 +33,20 @@ for $stage in $stages
.reward
background-color: white
// 2. Columns & Tasks
// ===================
.tasks-lists
.row
margin-left: -5px
margin-right: -5px
.col-md-3
padding-left: 10px // Override Bootstrap 15px padding
padding-right: 10px // Override Bootstrap 15px padding
margin-bottom: 15px
// main columns
// ------------
.task-column
@ -48,6 +59,11 @@ for $stage in $stages
margin: 0 0 0.5em
padding: 0
// 50% width columns with scrollbars for tablets
@media (min-width: 768px) and (max-width: 970px)
.task-column
max-height: 18.6em
overflow-y: scroll
// add new task form
// -----------------
@ -112,6 +128,9 @@ for $stage in $stages
&:last-child
margin-bottom: 0
label
font-weight: 400
// task content
.task-text
display: block
@ -124,19 +143,14 @@ for $stage in $stages
height:1.5em
background-size:1.5em
// task due date (for to-dos)
.task-date
font-size: 70%
.habit-wide .task-text
padding-left: 7em
// when a task is being dragged
.task.ui-sortable-helper {
.task.ui-sortable-helper
box-shadow: 0 0 3px rgba(0,0,0,0.15), 0 0 5px rgba(0,0,0,0.1)
transform: scale(1.05)
outline: 1px solid rgba(0,0,0,0.2)
}
// primary task commands
// ----------------------
@ -273,10 +287,9 @@ for $stage in $stages
margin: 0.75em 0.5em 0 0.25em
height: 1em
opacity: 0.25
a > i
margin-left: 0.125em
.task-notes
margin-left: 0.125em
a
text-decoration: none
.task:hover .task-meta-controls
opacity: 1
@ -296,7 +309,6 @@ form
[class$="-options"]
padding: 1em 1em 0
color: #333
z-index: 0
position: relative
//background-color:

View file

@ -5,8 +5,8 @@
*/
angular.module('authCtrl', [])
.controller("AuthCtrl", ['$scope', '$rootScope', 'User', '$http', '$location', '$window','API_URL',
function($scope, $rootScope, User, $http, $location, $window, API_URL) {
.controller("AuthCtrl", ['$scope', '$rootScope', 'User', '$http', '$location', '$window','API_URL', '$modal',
function($scope, $rootScope, User, $http, $location, $window, API_URL, $modal) {
var runAuth;
var showedFacebookMessage;
@ -27,10 +27,19 @@ angular.module('authCtrl', [])
runAuth = function(id, token) {
User.authenticate(id, token, function(err) {
$window.location.href = '/';
//$rootScope.modals.login = false;
});
};
function errorAlert(data, status, headers, config) {
if (status === 0) {
$window.alert(window.env.t('noReachServer'));
} else if (!!data && !!data.err) {
$window.alert(data.err);
} else {
$window.alert(window.env.t('errorUpCase') + status);
}
};
$scope.register = function() {
/*TODO highlight invalid inputs
we have this as a workaround for https://github.com/HabitRPG/habitrpg-mobile/issues/64
@ -40,27 +49,9 @@ angular.module('authCtrl', [])
}
$http.post(API_URL + "/api/v2/register", $scope.registerVals).success(function(data, status, headers, config) {
runAuth(data.id, data.apiToken);
}).error(function(data, status, headers, config) {
if (status === 0) {
$window.alert(window.env.t('noReachServer'));
} else if (!!data && !!data.err) {
$window.alert(data.err);
} else {
$window.alert(window.env.t('errorUpCase') + status);
}
});
}).error(errorAlert);
};
function errorAlert(data, status, headers, config) {
if (status === 0) {
$window.alert(window.env.t('noReachServer'));
} else if (!!data && !!data.err) {
$window.alert(data.err);
} else {
$window.alert(window.env.t('errorUpCase') + status);
}
}
$scope.auth = function() {
var data = {
username: $scope.loginUsername || $('#login-tab input[name="username"]').val(),
@ -80,7 +71,10 @@ angular.module('authCtrl', [])
if (User.authenticated()) {
window.location.href = '/#/tasks';
} else {
$('#login-modal').modal('show');
$modal.open({
templateUrl: 'modals/login.html'
// Using controller: 'AuthCtrl' it causes problems
});
}
}

View file

@ -29,7 +29,7 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
// We need the member information up top here, but then we pass it down to the modal controller
// down below. Better way of handling this?
Members.selectMember(uid);
$rootScope.modals.member = true;
$rootScope.openModal('member', 'MemberModalCtrl');
}
}
@ -99,8 +99,8 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
$scope.$watch('group.chat',$scope.chatChanged);
$scope.caretChanged = function(newCaretPos) {
var relativeelement = $('.-options');
var textarea = $('.chat-textarea');
var relativeelement = $('.chat-form div:first');
var textarea = $('.chat-form textarea');
var userlist = $('.list-at-user');
var offset = {
x: textarea.offset().left - relativeelement.offset().left,
@ -219,7 +219,7 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
}
$scope.newGroup = newGroup()
$scope.create = function(group){
if (User.user.balance < 1) return $rootScope.modals.buyGems = true;
if (User.user.balance < 1) return $rootScope.openModal('buyGems');
if (confirm(window.env.t('confirmGuild'))) {
group.$save(function(saved){

View file

@ -87,9 +87,11 @@ habitrpg.controller("InventoryCtrl", ['$rootScope', '$scope', '$window', 'User',
$scope.purchase = function(type, item){
var gems = User.user.balance * 4;
if(gems < item.value) return $rootScope.modals.buyGems = true;
if(gems < item.value) return $rootScope.openModal('buyGems');
var string = (type == 'hatchingPotions') ? 'hatching potion' : (type == 'eggs') ? 'egg' : (type == 'quests') ? 'quest' : (item.key == 'Saddle') ? 'saddle' : (type == 'special') ? item.key : type; // this is ugly but temporary, once the purchase modal is done this will be removed
var message = window.env.t('buyThis', {text: string, price: item.value, gems: gems})
if($window.confirm(message))
User.user.ops.purchase({params:{type:type,key:item.key}});
}
@ -127,12 +129,10 @@ habitrpg.controller("InventoryCtrl", ['$rootScope', '$scope', '$window', 'User',
if (item.lvl && item.lvl > user.stats.lvl)
return alert(window.env.t('mustLevel', {level: item.lvl}));
$rootScope.selectedQuest = item;
$rootScope.modals.showQuest = true;
$rootScope.openModal('showQuest', 'InventoryCtrl');
}
$scope.closeQuest = function(){
$rootScope.selectedQuest = undefined;
$rootScope.modals.showQuest = false;
$rootScope.modals.buyQuest = false;
}
$scope.questInit = function(){
$rootScope.party.$questAccept({key:$scope.selectedQuest.key}, function(){
@ -148,7 +148,7 @@ habitrpg.controller("InventoryCtrl", ['$rootScope', '$scope', '$window', 'User',
if (!completedPrevious)
return $scope.purchase("quests", item);
$rootScope.selectedQuest = item;
$rootScope.modals.buyQuest = true;
$rootScope.openModal('showQuest', 'buyQuest');
}
}
]);

View file

@ -1,9 +1,13 @@
'use strict';
habitrpg.controller('NotificationCtrl',
['$scope', '$rootScope', 'Shared', 'User', 'Guide', 'Notification', function ($scope, $rootScope, Shared, User, Guide, Notification) {
['$scope', '$rootScope', 'Shared', 'User', 'Guide', 'Notification',
function ($scope, $rootScope, Shared, User, Guide, Notification) {
$rootScope.$watch('user.stats.hp', function(after, before) {
if (after <= 0){
$rootScope.openModal('death', undefined, undefined, false, 'static');
}
if (after == before) return;
if (User.user.stats.lvl == 0) return;
Notification.hp(after - before, 'hp');
@ -61,24 +65,29 @@ habitrpg.controller('NotificationCtrl',
$rootScope.$watch('user.achievements.streak', function(after, before){
if(before == undefined || after == before || after < before) return;
$rootScope.modals.achievements.streak = true;
$rootScope.openModal('achievements/streak');
});
$rootScope.$watch('user.achievements.ultimateGear', function(after, before){
if (after === before || after !== true) return;
$rootScope.modals.achievements.ultimateGear = true;
$rootScope.openModal('achievements/ultimateGear');
});
$rootScope.$watch('user.items.pets', function(after, before){
if(_.size(after) === _.size(before) ||
Shared.countPets(null, after) < 90) return;
User.user.achievements.beastMaster = true;
$rootScope.modals.achievements.beastMaster = true;
$rootScope.openModal('achievements/beastMaster');
}, true);
$rootScope.$watch('user.achievements.rebirths', function(after, before){
if(after === before) return;
$rootScope.modals.achievements.rebirth = true;
$rootScope.openModal('achievements/rebirth');
});
$rootScope.$watch('user.flags.contributor', function(after, before){
if (after === before || after !== true) return;
$rootScope.openModal('achievements/contributor');
});
/*_.each(['weapon', 'head', 'chest', 'shield'], function(watched){
@ -93,6 +102,13 @@ habitrpg.controller('NotificationCtrl',
})
});*/
// Classes modal
$rootScope.$watch('!user.flags.classSelected && user.stats.lvl >= 10', function(after, before){
if(after){
$rootScope.openModal('chooseClass', 'UserCtrl', undefined, false, 'static');
}
});
$rootScope.$watch('user.stats.lvl', function(after, before) {
if (after == before) return;
if (after > before) {
@ -100,6 +116,24 @@ habitrpg.controller('NotificationCtrl',
}
});
// Math updates modal
$rootScope.$watch('!user.flags.mathUpdates', function(after, before){
if (after == before || after != true) return;
$rootScope.openModal('mathUpdates');
});
// Completed quest modal
$rootScope.$watch('user.party.quest.completed', function(after, before){
if (after == before || after != true) return;
$rootScope.openModal('questCompleted', 'InventoryCtrl');
});
// Quest invitation modal
$rootScope.$watch('party.quest.key && !party.quest.active && party.quest.members[user._id] == undefined', function(after, before){
if (after == before || after != true) return;
$rootScope.openModal('questInvitation');
});
$rootScope.$on('responseError', function(ev, error){
Notification.error(error);
});

View file

@ -3,8 +3,8 @@
/* Make user and settings available for everyone through root scope.
*/
habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$http', '$state', '$stateParams', 'Notification', 'Groups', 'Shared', 'Content',
function($scope, $rootScope, $location, User, $http, $state, $stateParams, Notification, Groups, Shared, Content) {
habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$http', '$state', '$stateParams', 'Notification', 'Groups', 'Shared', 'Content', '$modal',
function($scope, $rootScope, $location, User, $http, $state, $stateParams, Notification, Groups, Shared, Content, $modal) {
var user = User.user;
var initSticky = _.once(function(){
@ -13,8 +13,6 @@ habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$
})
$rootScope.$on('userUpdated',initSticky);
$rootScope.modals = {};
$rootScope.modals.achievements = {};
$rootScope.User = User;
$rootScope.user = user;
$rootScope.moment = window.moment;
@ -66,8 +64,19 @@ habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$
$rootScope.set = User.set;
$rootScope.authenticated = User.authenticated;
// Open a modal from a template expression (like ng-click,...)
// Otherwise use the proper $modal.open
$rootScope.openModal = function(template, controller, scope, keyboard, backdrop){
return $modal.open({
templateUrl: 'modals/' + template + '.html',
controller: controller, // optional
scope: scope, // optional
keyboard: (keyboard === undefined ? true : keyboard), // optional
backdrop: (backdrop === undefined ? true : backdrop) // optional
});
}
$rootScope.dismissAlert = function() {
$rootScope.modals.newStuff = false;
$rootScope.set({'flags.newStuff':false});
}

View file

@ -55,13 +55,11 @@ habitrpg.controller('SettingsCtrl',
$scope.reroll = function(){
User.user.ops.reroll({});
$rootScope.modals.reroll = false;
$rootScope.$state.go('tasks');
}
$scope.rebirth = function(){
User.user.ops.rebirth({});
$rootScope.modals.rebirth = false;
$rootScope.$state.go('tasks');
}
@ -80,12 +78,11 @@ habitrpg.controller('SettingsCtrl',
}
$scope.restoreValues = {};
$rootScope.$watch('modals.restore', function(value){
if(value === true){
$scope.restoreValues.stats = angular.copy(User.user.stats);
$scope.restoreValues.achievements = {streak: User.user.achievements.streak || 0};
}
})
$rootScope.openRestoreModal = function(){
$scope.restoreValues.stats = angular.copy(User.user.stats);
$scope.restoreValues.achievements = {streak: User.user.achievements.streak || 0};
$rootScope.openModal('restore', undefined, $scope);
};
$scope.restore = function(){
var stats = $scope.restoreValues.stats,
@ -98,12 +95,10 @@ habitrpg.controller('SettingsCtrl',
"stats.mp": stats.mp,
"achievements.streak": achievements.streak
});
$rootScope.modals.restore = false;
}
$scope.reset = function(){
User.user.ops.reset({});
$rootScope.modals.reset = false;
$rootScope.$state.go('tasks');
}

View file

@ -53,10 +53,10 @@ habitrpg.controller("UserCtrl", ['$rootScope', '$scope', '$location', 'User', '$
if (fullSet) {
if (confirm(window.env.t('purchaseFor5')) !== true) return;
if (User.user.balance < cost) return $rootScope.modals.buyGems = true;
if (User.user.balance < cost) return $rootScope.openModal('buyGems');
} else if (!User.user.fns.dotGet('purchased.' + path)) {
if (confirm(window.env.t('purchaseFor2')) !== true) return;
if (User.user.balance < cost) return $rootScope.modals.buyGems = true;
if (User.user.balance < cost) return $rootScope.openModal('buyGems');
}
User.user.ops.unlock({query:{path:path}})
}

View file

@ -130,20 +130,12 @@ angular.module('guideServices', []).
if (!eggs) {
eggs['Wolf'] = 1; // This is also set on the server
}
$rootScope.modals.dropsEnabled = true;
});
$rootScope.$watch('user.items.pets', function(after, before) {
if (User.user.achievements && User.user.achievements.beastMaster) return;
if (before >= 90) {
User.set({'achievements.beastMaster': true});
$('#beastmaster-achievement-modal').modal('show'); // FIXME
}
$rootScope.openModal('dropsEnabled');
});
$rootScope.$watch('user.flags.rebirthEnabled', function(after, before) {
if (alreadyShown(before, after)) return;
$rootScope.modals.rebirthEnabled = true;
$rootScope.openModal('rebirthEnabled');
});

View file

@ -6,7 +6,7 @@ angular.module("notificationServices", [])
function growl(html, type) {
$.bootstrapGrowl(html, {
ele: '#notification-area',
type: type, //(null, 'text', 'error', 'success', 'gp', 'xp', 'hp', 'lvl', 'death', 'mp', 'crit')
type: type || 'warning', //('info', 'text', 'warning', 'success', 'gp', 'xp', 'hp', 'lvl', 'death', 'mp', 'crit')
top_offset: 20,
align: 'right', //('left', 'right', or 'center')
width: 250, //(integer, or 'auto')
@ -25,11 +25,11 @@ angular.module("notificationServices", [])
gold = Math.floor(absolute);
silver = Math.floor((absolute - gold) * 100);
if (gold && silver > 0) {
return "" + gold + " <i class='icon-gold'></i> " + silver + " <i class='icon-silver'></i>";
return "" + gold + " <span class='icon-gold'></span> " + silver + " <span class='icon-silver'></span>";
} else if (gold > 0) {
return "" + gold + " <i class='icon-gold'></i>";
return "" + gold + " <span class='icon-gold'></span>";
} else if (silver > 0) {
return "" + silver + " <i class='icon-silver'></i>";
return "" + silver + " <span class='icon-silver'></span>";
}
};
@ -45,11 +45,11 @@ angular.module("notificationServices", [])
coins: coins,
hp: function(val) {
// don't show notifications if user dead
growl("<i class='icon-heart'></i> " + sign(val) + " " + round(val) + " " + window.env.t('hp'), 'hp');
growl("<span class='glyphicon glyphicon-heart'></span>&nbsp; " + sign(val) + " " + round(val) + " " + window.env.t('hp'), 'hp');
},
exp: function(val) {
if (val < -50) return; // don't show when they level up (resetting their exp)
growl("<i class='icon-star'></i> " + sign(val) + " " + round(val) + " " + window.env.t('xp'), 'xp');
growl("<span class='glyphicon glyphicon-star'></span>&nbsp; " + sign(val) + " " + round(val) + " " + window.env.t('xp'), 'xp');
},
gp: function(val, bonus) {
growl(sign(val) + " " + coins(val - bonus), 'gp');
@ -58,22 +58,22 @@ angular.module("notificationServices", [])
growl(val);
},
lvl: function(){
growl('<i class="icon-chevron-up"></i> ' + window.env.t('levelUp'), 'lvl');
growl('<span class="glyphicon glyphicon-chevron-up"></span>&nbsp;' + window.env.t('levelUp'), 'lvl');
},
death: function(){
growl("<i class='icon-death'></i> " + window.env.t('respawn'), "death");
growl("<span class='glyphicon glyphicon-death'></span>&nbsp;" + window.env.t('respawn'), "death");
},
error: function(error){
growl("<i class='icon-exclamation-sign'></i> " + error, "error");
growl("<span class='glyphicon glyphicon-exclamation-sign'></span>&nbsp; " + error, "danger");
},
mp: function(val) {
growl("<i class='icon-fire'></i> " + sign(val) + " " + round(val) + " " + window.env.t('mp'), 'mp');
growl("<span class='glyphicon glyphicon-fire'></span>&nbsp; " + sign(val) + " " + round(val) + " " + window.env.t('mp'), 'mp');
},
crit: function(val) {
growl("<i class='icon-certificate'></i>" + window.env.t('critBonus') + Math.round(val) + "%", 'crit');
growl("<span class='glyphicon glyphicon-certificate'></span>&nbsp;" + window.env.t('critBonus') + Math.round(val) + "%", 'crit');
},
drop: function(val) {
growl("<i class='icon-gift'></i> " + val, 'drop');
growl("<span class='glyphicon glyphicon-gift'></span>&nbsp; " + val, 'drop');
}
};
}

View file

@ -10,7 +10,6 @@
"bower_components/marked/lib/marked.js",
"bower_components/angular-ui-router/release/angular-ui-router.js",
"bower_components/angular-resource/angular-resource.min.js",
"bower_components/angular-ui/build/angular-ui.js",
"bower_components/angular-ui-utils/ui-utils.min.js",
"bower_components/angular-loading-bar/build/loading-bar.js",
"bower_components/Angular-At-Directive/src/at.js",
@ -22,9 +21,9 @@
"bower_components/select2/select2.js",
"bower_components/angular-ui-select2/src/select2.js",
"bower_components/bootstrap/docs/assets/js/bootstrap.js",
"bower_components/angular-bootstrap/ui-bootstrap.js",
"bower_components/angular-bootstrap/ui-bootstrap-tpls.js",
"bower_components/bootstrap/dist/js/bootstrap.js",
"bower_components/jquery-ui/ui/minified/jquery.ui.core.min.js",
"bower_components/jquery-ui/ui/minified/jquery.ui.widget.min.js",
@ -65,7 +64,7 @@
"js/controllers/hallCtrl.js"
],
"css": [
"bower_components/bootstrap/docs/assets/css/bootstrap.css",
"bower_components/bootstrap/dist/css/bootstrap.css",
"app.css",
"bower_components/habitrpg-shared/dist/habitrpg-shared.css"
]
@ -76,11 +75,9 @@
"bower_components/habitrpg-shared/dist/habitrpg-shared.js",
"bower_components/angular/angular.js",
"bower_components/bootstrap/docs/assets/js/bootstrap.js",
"bower_components/angular-ui/build/angular-ui.js",
"bower_components/angular-bootstrap/ui-bootstrap.js",
"bower_components/angular-bootstrap/ui-bootstrap-tpls.js",
"bower_components/bootstrap/dist/js/bootstrap.js",
"bower_components/angular-loading-bar/build/loading-bar.js",
"js/env.js",
@ -91,9 +88,7 @@
"js/controllers/footerCtrl.js"
],
"css": [
"bower_components/bootstrap/docs/assets/css/bootstrap.css",
"bower_components/bootstrap/docs/assets/css/bootstrap-responsive.css",
"bower_components/bootstrap/docs/assets/css/docs.css",
"bower_components/bootstrap/dist/css/bootstrap.css",
"static.css"
]

View file

@ -108,14 +108,14 @@ api.loginLocal = function(req, res, next) {
if (!(username && password)) return res.json(401, {err:'Missing :username or :password in request body, please provide both'});
User.findOne({'auth.local.username': username}, function(err, user){
if (err) return next(err);
if (!user) return res.json(401, {err:"Username '" + username + "' not found. Usernames are case-sensitive, click 'Forgot Password' if you can't remember the capitalization."});
if (!user) return res.json(401, {err:"Username or password incorrect. Click 'Forgot Password' for help with either. (Note: usernames are case-sensitive)"});
// We needed the whole user object first so we can get his salt to encrypt password comparison
User.findOne({
'auth.local.username': username,
'auth.local.hashed_password': utils.encryptPassword(password, user.auth.local.salt)
}, function(err, user){
if (err) return next(err);
if (!user) return res.json(401,{err:'Incorrect password'});
if (!user) return res.json(401,{err:"Username or password incorrect. Click 'Forgot Password' for help with either. (Note: usernames are case-sensitive)"});
res.json({id: user._id,token: user.apiToken});
});
});

View file

@ -5,6 +5,8 @@ var path = require('path');
var User = require('./models/user').model
var limiter = require('connect-ratelimit');
var logging = require('./logging');
var domainMiddleware = require('domain-middleware');
var cluster = require('cluster');
module.exports.apiThrottle = function(app) {
if (nconf.get('NODE_ENV') !== 'production') return;
@ -24,6 +26,18 @@ module.exports.apiThrottle = function(app) {
});
}
module.exports.domainMiddleware = function(server,mongoose) {
return domainMiddleware({
server: {
close:function(){
server.close();
mongoose.connection.close();
}
},
killTimeout: 10000
});
}
module.exports.errorHandler = function(err, req, res, next) {
//res.locals.domain.emit('error', err);
// when we hit an error, send it to admin as an email. If no ADMIN_EMAIL is present, just send it to yourself (SMTP_USER)

View file

@ -22,27 +22,39 @@ router.get('/static/front', middleware.locals, function(req, res) {
});
router.get('/static/privacy', middleware.locals, function(req, res) {
res.render('static/privacy', {env: res.locals.habitrpg});
var env = res.locals.habitrpg;
env.isFrontPage = true;
res.render('static/privacy', {env: env});
});
router.get('/static/terms', middleware.locals, function(req, res) {
res.render('static/terms', {env: res.locals.habitrpg});
var env = res.locals.habitrpg;
env.isFrontPage = true;
res.render('static/terms', {env: env});
});
router.get('/static/api', middleware.locals, function(req, res) {
res.render('static/api', {env: res.locals.habitrpg});
var env = res.locals.habitrpg;
env.isFrontPage = true;
res.render('static/api', {env: env});
});
router.get('/static/about', middleware.locals, function(req, res) {
res.render('static/about', {env: res.locals.habitrpg});
var env = res.locals.habitrpg;
env.isFrontPage = true;
res.render('static/about', {env: env});
});
router.get('/static/contact', middleware.locals, function(req, res) {
res.render('static/contact', {env: res.locals.habitrpg});
var env = res.locals.habitrpg;
env.isFrontPage = true;
res.render('static/contact', {env: env});
});
router.get('/static/plans', middleware.locals, function(req, res) {
res.render('static/plans', {env: res.locals.habitrpg});
var env = res.locals.habitrpg;
env.isFrontPage = true;
res.render('static/plans', {env: env});
});
// --------- Redirects --------

View file

@ -1,4 +1,5 @@
// Only do the minimal amount of work before forking just in case of a dyno restart
var cluster = require("cluster");
var _ = require('lodash');
var nconf = require('nconf');
var utils = require('./utils');
@ -7,6 +8,18 @@ var logging = require('./logging');
var isProd = nconf.get('NODE_ENV') === 'production';
var isDev = nconf.get('NODE_ENV') === 'development';
if (cluster.isMaster && (isDev || isProd)) {
// Fork workers.
_.times(_.min([require('os').cpus().length,2]), function(){
cluster.fork();
});
cluster.on('disconnect', function(worker, code, signal) {
var w = cluster.fork(); // replace the dead worker
logging.info('[%s] [master:%s] worker:%s disconnect! new worker:%s fork', new Date(), process.pid, worker.process.pid, w.process.pid);
});
} else {
require('coffee-script'); // remove this once we've fully converted over
var express = require("express");
var http = require("http");
@ -79,6 +92,7 @@ var isDev = nconf.get('NODE_ENV') === 'development';
app.set("port", nconf.get('PORT'));
middleware.apiThrottle(app);
app.use(middleware.domainMiddleware(server,mongoose));
if (!isProd) app.use(express.logger("dev"));
app.use(express.compress());
app.set("views", __dirname + "/../views");
@ -120,4 +134,5 @@ var isDev = nconf.get('NODE_ENV') === 'development';
return logging.info("Express server listening on port " + app.get("port"));
});
module.exports = server;
module.exports = server;
}

View file

@ -3,9 +3,12 @@ doctype 5
html(ng-app="habitrpg", ng-controller="RootCtrl", ng-class='{"applying-action":applyingAction}', ui-keyup="{27:'castCancel()'}")
head
title=env.t('titleIndex')
// ?v=1 needed to force refresh
link(rel='shortcut icon', href='#{env.getBuildUrl("favicon.ico")}?v=2')
link(rel='shortcut icon', href='#{env.getBuildUrl("favicon.ico")}?v=3')
meta(charset='utf-8')
meta(name='viewport', content='width=device-width, initial-scale=1.0')
meta(name='apple-mobile-web-app-capable', content='yes')
script(type='text/javascript').
window.env = !{JSON.stringify(env)};
@ -19,27 +22,24 @@ html(ng-app="habitrpg", ng-controller="RootCtrl", ng-class='{"applying-action":a
//webfonts
link(href='//fonts.googleapis.com/css?family=Lato:300,400,700,400italic,700italic', rel='stylesheet', type='text/css')
meta(name='viewport', content='width=device-width')
meta(name='apple-mobile-web-app-capable', content='yes')
body(ng-cloak)
div(ng-controller='GroupsCtrl')
include ./shared/modals/index
include ./shared/header/header
include ./shared/tasks/lists
include ./main/index
include ./options/index
body(ng-cloak, ng-controller='GroupsCtrl')
include ./shared/modals/index
include ./shared/header/header
#notification-area(ng-controller='NotificationCtrl')
#wrap
include ./shared/tasks/lists
include ./main/index
include ./options/index
//if they hide the header, we still need user-menu visible
div(ng-if='user.preferences.hideHeader')
include ./shared/header/menu
.exp-chart(ng-show='charts.exp')
#notification-area(ng-controller='NotificationCtrl')
#wrap.container-fluid
//if they hide the header, we still need user-menu visible
div(ng-if='user.preferences.hideHeader')
include ./shared/header/menu
.row
.col-md-12.exp-chart(ng-show='charts.exp')
#main(ui-view)
include ./shared/footer
include ./shared/footer

View file

@ -1,26 +1,29 @@
.filters.tag-list(ng-controller='FiltersCtrl')
.pull-left.filter-description
=env.t('tags')
|:
ul.nav.nav-pills
li
a(rel='tooltip', title=env.t('editTags'), ng-click='saveOrEdit()')
i(ng-class='{"icon-ok": _editing, "icon-pencil": !_editing}')
li(bindonce='user.tags', ng-class='{active: user.filters[tag.id]}', ng-repeat='tag in user.tags', style='position: relative;')
.input-append.option-group.tag-editing(ng-show='_editing')
input.input.input-small.option-content.tag-editing-pill(type='text', ng-model='tag.name')
span.add-on.tag-editing-pill
a.pull-right(ng-click='user.ops.deleteTag({params:{id:tag.id}})')
i.icon-trash
a(ng-hide='_editing', ng-click='toggleFilter(tag)')
i.icon-bullhorn(bo-if="tag.challenge")
markdown(ng-model='tag.name',style='display: inline-block')
li
form.form-inline(ng-show='_editing', ng-submit='createTag(_newTag)')
.input-append.tag-editing
input.span2.tag-editing-pill(type='text', ng-model='_newTag', placeholder=env.t('newTag'))
button.add-on.tag-editing-pill(type='submit')=env.t('add')
// <li class="{#unless activeFilters(users[_userId].filters)}hidden{/}">
li
a(rel='tooltip', title=env.t('clearFilters'), ng-click='user.filters = {}')
i.icon-remove-sign
.container-fluid
.row
.filters.col-md-12(ng-controller='FiltersCtrl')
.pull-left.filter-description
=env.t('tags')
|:
ul.nav.nav-pills
li
a(rel='tooltip', title=env.t('editTags'), ng-click='saveOrEdit()')
span.glyphicon(ng-class='{"glyphicon-ok": _editing, "glyphicon-pencil": !_editing}')
li(bindonce='user.tags', ng-class='{active: user.filters[tag.id]}', ng-repeat='tag in user.tags')
.input-group(ng-show='_editing')
input.form-control.input-sm(type='text', ng-model='tag.name')
span.input-group-addon
a(ng-click='user.ops.deleteTag({params:{id:tag.id}})')
span.glyphicon.glyphicon-trash
a(ng-hide='_editing', ng-click='toggleFilter(tag)')
span.glyphicon.glyphicon-bullhorn(bo-if="tag.challenge")
markdown(ng-model='tag.name',style='display: inline-block')
li
form.form-inline(ng-show='_editing', ng-submit='createTag(_newTag)')
.input-group
input.form-control.input-sm(type='text', ng-model='_newTag', placeholder=env.t('newTag'))
span.input-group-addon(type='submit')
=env.t('add')
// <li class="{#unless activeFilters(users[_userId].filters)}hidden{/}">
li
a(rel='tooltip', title=env.t('clearFilters'), ng-click='user.filters = {}')
span.glyphicon.glyphicon-remove-sign

View file

@ -4,29 +4,34 @@ include ./inventory/index
include ./settings
script(id='partials/options.html', type="text/ng-template")
.grid
.module.full-width
span.option-box.pull-right.wallet
include ../shared/gems
.container-fluid
.row
.col-md-12
span.option-box.pull-right.wallet
include ../shared/gems
ul.nav.nav-tabs
li(ng-class="{ active: $state.includes('options.profile') }")
a(ui-sref='options.profile')
i.icon-user
=env.t('profile')
li(ng-class="{ active: $state.includes('options.social') }")
a(ui-sref='options.social')
i.icon-heart
=env.t('social')
li(ng-class="{ active: $state.includes('options.inventory') }", ng-if='user.flags.dropsEnabled')
a(ui-sref='options.inventory')
i.icon-gift
=env.t('inventory')
li(ng-class="{ active: $state.includes('options.settings') }")
a(ui-sref='options.settings')
i.icon-wrench
=env.t('settings')
ul.nav.nav-tabs
li(ng-class="{ active: $state.includes('options.profile') }")
a(ui-sref='options.profile')
span.glyphicon.glyphicon-user
| &nbsp;
=env.t('profile')
li(ng-class="{ active: $state.includes('options.social') }")
a(ui-sref='options.social')
span.glyphicon.glyphicon-heart
| &nbsp;
=env.t('social')
li(ng-class="{ active: $state.includes('options.inventory') }", ng-if='user.flags.dropsEnabled')
a(ui-sref='options.inventory')
span.glyphicon.glyphicon-gift
| &nbsp;
=env.t('inventory')
li(ng-class="{ active: $state.includes('options.settings') }")
a(ui-sref='options.settings')
span.glyphicon.glyphicon-wrench
| &nbsp;
=env.t('settings')
.tab-content
.tab-pane.active
div(ui-view)
.tab-content
.tab-pane.active
div(ui-view)

View file

@ -1,151 +1,153 @@
script(type='text/ng-template', id='partials/options.inventory.equipment.html')
.row-fluid
.span6.border-right
h3.equipment-title=env.t('battleGear')
&nbsp;
i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('battleGearText'))
li.customize-menu.inventory-gear
menu.pets-menu(label='{{label}}', ng-repeat='(klass,label) in {base:"Base", warrior:"Warrior", wizard:"Mage", rogue:"Rogue", healer:"Healer", special:"Special"}', ng-show='gear[klass]')
div(ng-repeat='item in gear[klass]')
button.customize-option(popover='{{item.notes}}', popover-title='{{item.text}}', popover-trigger='mouseenter', popover-placement='right', ng-click='user.ops.equip({params:{key:item.key}})', class='shop_{{item.key}}', ng-class='{selectableInventory: user.items.gear.equipped[item.type] == item.key}')
.span6
h3.equipment-title=env.t('costume')
&nbsp;
i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('costumeText'))
label.checkbox.inline(style="margin-left: 20px;")
input(type="checkbox", ng-model="user.preferences.costume", ng-click='set({"preferences.costume":!user.preferences.costume})')
=env.t('useCostume')
li.customize-menu(ng-if='user.preferences.costume')
menu.pets-menu(label='{{label}}', ng-repeat='(klass,label) in {base:"Base", warrior:"Warrior", wizard:"Mage", rogue:"Rogue", healer:"Healer", special:"Special"}', ng-show='gear[klass]')
div(ng-repeat='item in gear[klass]')
button.customize-option(popover='{{item.notes}}', popover-title='{{item.text}}', popover-trigger='mouseenter', popover-placement='right', ng-click='user.ops.equip({params:{type:"costume", key:item.key}})', class='shop_{{item.key}}', ng-class='{selectableInventory: user.items.gear.costume[item.type] == item.key}')
.container-fluid
.row
.col-md-6.border-right
h3.equipment-title=env.t('battleGear')
&nbsp;
.glyphicon.glyphicon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('battleGearText'))
li.customize-menu.inventory-gear
menu.pets-menu(label='{{label}}', ng-repeat='(klass,label) in {base:"Base", warrior:"Warrior", wizard:"Mage", rogue:"Rogue", healer:"Healer", special:"Special"}', ng-show='gear[klass]')
div(ng-repeat='item in gear[klass]')
button.customize-option(popover='{{item.notes}}', popover-title='{{item.text}}', popover-trigger='mouseenter', popover-placement='right', ng-click='user.ops.equip({params:{key:item.key}})', class='shop_{{item.key}}', ng-class='{selectableInventory: user.items.gear.equipped[item.type] == item.key}')
.col-md-6
h3.equipment-title=env.t('costume')
&nbsp;
i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('costumeText'))
label.checkbox.inline(style="margin-left: 20px;")
input(type="checkbox", ng-model="user.preferences.costume", ng-click='set({"preferences.costume":!user.preferences.costume})')
=env.t('useCostume')
li.customize-menu(ng-if='user.preferences.costume')
menu.pets-menu(label='{{label}}', ng-repeat='(klass,label) in {base:"Base", warrior:"Warrior", wizard:"Mage", rogue:"Rogue", healer:"Healer", special:"Special"}', ng-show='gear[klass]')
div(ng-repeat='item in gear[klass]')
button.customize-option(popover='{{item.notes}}', popover-title='{{item.text}}', popover-trigger='mouseenter', popover-placement='right', ng-click='user.ops.equip({params:{type:"costume", key:item.key}})', class='shop_{{item.key}}', ng-class='{selectableInventory: user.items.gear.costume[item.type] == item.key}')
script(type='text/ng-template', id='partials/options.inventory.drops.html')
.row-fluid
.span6.border-right
h2=env.t('inventory')
p.well=env.t('inventoryText')
menu.inventory-list(type='list')
li.customize-menu
menu.pets-menu(label=(env.t('eggs') + ' ({{eggCount}})'))
p.muted(ng-show='eggCount < 1')=env.t('noEggs')
div(ng-repeat='(egg,points) in ownedItems(user.items.eggs)')
//TODO move positioning this styling to css
button.customize-option(popover='{{Content.eggs[egg].notes}}', popover-title='{{Content.eggs[egg].text}} Egg', popover-trigger='mouseenter', popover-placement='right', ng-click='chooseEgg(egg)', class='Pet_Egg_{{egg}}', ng-class='{selectableInventory: selectedPotion && !(user.items.pets[egg+"-"+selectedPotion.key]>0)}')
.badge.badge-info.stack-count {{points}}
//-p {{Content.eggs[egg].text}}
li.customize-menu
menu.hatchingPotion-menu(label=(env.t('hatchingPotions') + ' ({{potCount}})'))
p.muted(ng-show='potCount < 1')=env.t('noHatchingPotions')
div(ng-repeat='(pot,points) in ownedItems(user.items.hatchingPotions)')
button.customize-option(popover='{{Content.hatchingPotions[pot].notes}}', popover-title='{{Content.hatchingPotions[pot].text}} Potion', popover-trigger='mouseenter', popover-placement='right', ng-click='choosePotion(pot)', class='Pet_HatchingPotion_{{pot}}', ng-class='{selectableInventory: selectedEgg && !(user.items.pets[selectedEgg.key+"-"+pot]>0)}')
.badge.badge-info.stack-count {{points}}
li.customize-menu
menu.pets-menu(label=(env.t('scrolls') + ' ({{questCount}})'))
p.muted(ng-show='questCount < 1')=env.t('noScrolls')
p.muted!=env.t('scrollsText1') + ' <a href="/#/options/groups/party">' + env.t('scrollsText2') + '</a>'
div(ng-repeat='(quest_key,points) in ownedItems(user.items.quests)', ng-init='quest = Content.quests[quest_key]')
button.customize-option(popover="{{quest.previous && !user.achievements.quests[quest.previous] ? env.t('scrollsPre') : quest.notes | htmlDecode}}", popover-title='{{quest.text}}', popover-trigger='mouseenter', popover-placement='right', ng-click='showQuest(quest_key)', class='inventory_quest_scroll', ng-class='{locked: quest.previous && !user.achievements.quests[quest.previous]}')
.badge.badge-info.stack-count {{points}}
li.customize-menu
menu.pets-menu(label=env.t('food') + ' ({{foodCount}})')
p(ng-show='foodCount < 1')=env.t('noFood')
div(ng-repeat='(food,points) in ownedItems(user.items.food)')
button.customize-option(popover='{{Content.food[food].notes}}', popover-title='{{Content.food[food].text}}', popover-trigger='mouseenter', popover-placement='right', ng-click='chooseFood(food)', class='Pet_Food_{{food}}')
.badge.badge-info.stack-count {{points}}
li.customize-menu(ng-if='user.items.special.snowball')
menu.pets-menu(label=env.t('special'))
div
button.customize-option(popover='{{Content.special.snowball.notes}}', popover-title='{{Content.special.snowball.text}}', popover-trigger='mouseenter', popover-placement='right', ng-click='castStart(Content.special.snowball)', class='inventory_special_snowball')
.badge.badge-info.stack-count {{user.items.special.snowball}}
li.customize-menu(ng-if='user.purchased.plan.customerId')
menu.pets-menu(label=env.t('subscriberItem'))
div
button.customize-option(popover=env.t('subscriberItemText'), popover-trigger='mouseenter', popover-placement='right', class='inventory_present')
.span6
h2=env.t('market')
.row-fluid
table.npc_alex_container
tr
td
.npc_alex.pull-left
td
.popover.static-popover.fade.right.in
.arrow
h3.popover-title
a(target='_blank', href='http://www.kickstarter.com/profile/523661924')=env.t('alexander')
.popover-content
p=env.t('welcomeMarket')
p
button.btn.btn-primary(ng-show='selectedEgg', ng-click='sellInventory()')=env.t('sellForGold', {item: "{{selectedEgg.text}}", gold: "{{selectedEgg.value}}"})
button.btn.btn-primary(ng-show='selectedPotion', ng-click='sellInventory()')=env.t('sellForGold', {item: "{{selectedPotion.text}}", gold: "{{selectedPotion.value}}"})
button.btn.btn-primary(ng-show='selectedFood', ng-click='sellInventory()')=env.t('sellForGold', {item: "{{selectedFood.text}}", gold: "{{selectedFood.value}}"})
.container-fluid
.row
.col-md-6.border-right
h2=env.t('inventory')
p.well=env.t('inventoryText')
menu.inventory-list(type='list')
li.customize-menu
menu.pets-menu(label=env.t('eggs'))
div(ng-repeat='egg in Content.eggs', ng-if='egg.canBuy')
button.customize-option(popover='{{egg.notes}}', popover-title='{{egg.text}} Egg', popover-trigger='mouseenter', popover-placement='left', ng-click='purchase("eggs", egg)', class='Pet_Egg_{{egg.key}}')
p
| {{egg.value}}
span.Pet_Currency_Gem1x.inline-gems
li.customize-menu
menu.pets-menu(label=env.t('hatchingPotions'))
div(ng-repeat='pot in Content.hatchingPotions')
button.customize-option(popover='{{pot.notes}}', popover-title='{{pot.text}} Potion', popover-trigger='mouseenter', popover-placement='left', ng-click='purchase("hatchingPotions", pot)', class='Pet_HatchingPotion_{{pot.key}}')
p
| {{pot.value}}
span.Pet_Currency_Gem1x.inline-gems
menu.pets-menu(label=(env.t('eggs') + ' ({{eggCount}})'))
p.muted(ng-show='eggCount < 1')=env.t('noEggs')
div(ng-repeat='(egg,points) in ownedItems(user.items.eggs)')
//TODO move positioning this styling to css
button.customize-option(popover='{{Content.eggs[egg].notes}}', popover-title='{{Content.eggs[egg].text}} Egg', popover-trigger='mouseenter', popover-placement='right', ng-click='chooseEgg(egg)', class='Pet_Egg_{{egg}}', ng-class='{selectableInventory: selectedPotion && !(user.items.pets[egg+"-"+selectedPotion.key]>0)}')
.badge.badge-info.stack-count {{points}}
//-p {{Content.eggs[egg].text}}
li.customize-menu
menu.pets-menu(label=env.t('food'))
div(ng-repeat='food in Content.food', ng-if='food.key !== "Saddle" && food.canBuy')
button.customize-option(popover='{{food.notes}}', popover-title='{{food.text}}', popover-trigger='mouseenter', popover-placement='left', ng-click='purchase("food", food)', class='Pet_Food_{{food.key}}')
p
| {{food.value}}
span.Pet_Currency_Gem1x.inline-gems
menu.hatchingPotion-menu(label=(env.t('hatchingPotions') + ' ({{potCount}})'))
p.muted(ng-show='potCount < 1')=env.t('noHatchingPotions')
div(ng-repeat='(pot,points) in ownedItems(user.items.hatchingPotions)')
button.customize-option(popover='{{Content.hatchingPotions[pot].notes}}', popover-title='{{Content.hatchingPotions[pot].text}} Potion', popover-trigger='mouseenter', popover-placement='right', ng-click='choosePotion(pot)', class='Pet_HatchingPotion_{{pot}}', ng-class='{selectableInventory: selectedEgg && !(user.items.pets[selectedEgg.key+"-"+pot]>0)}')
.badge.badge-info.stack-count {{points}}
li.customize-menu
menu.pets-menu(label=env.t('quests'))
menu.pets-menu(label=(env.t('scrolls') + ' ({{questCount}})'))
p.muted(ng-show='questCount < 1')=env.t('noScrolls')
p.muted!=env.t('scrollsText1') + ' <a href="/#/options/groups/party">' + env.t('scrollsText2') + '</a>'
div(ng-repeat='quest in Content.quests', ng-if='quest.canBuy')
button.customize-option(popover="{{quest.previous && !user.achievements.quests[quest.previous] ? env.t('scrollsPre') : quest.notes | htmlDecode}}", popover-title='{{quest.text}}', popover-trigger='mouseenter', popover-placement='left', ng-click='buyQuest(quest.key)', class='inventory_quest_scroll', ng-class='{locked: quest.previous && !user.achievements.quests[quest.previous]}')
p
| {{quest.value}}
span.Pet_Currency_Gem1x.inline-gems
div(ng-repeat='(quest_key,points) in ownedItems(user.items.quests)', ng-init='quest = Content.quests[quest_key]')
button.customize-option(popover="{{quest.previous && !user.achievements.quests[quest.previous] ? env.t('scrollsPre') : quest.notes | htmlDecode}}", popover-title='{{quest.text}}', popover-trigger='mouseenter', popover-placement='right', ng-click='showQuest(quest_key)', class='inventory_quest_scroll', ng-class='{locked: quest.previous && !user.achievements.quests[quest.previous]}')
.badge.badge-info.stack-count {{points}}
li.customize-menu
menu.pets-menu(label=env.t('food') + ' ({{foodCount}})')
p(ng-show='foodCount < 1')=env.t('noFood')
div(ng-repeat='(food,points) in ownedItems(user.items.food)')
button.customize-option(popover='{{Content.food[food].notes}}', popover-title='{{Content.food[food].text}}', popover-trigger='mouseenter', popover-placement='right', ng-click='chooseFood(food)', class='Pet_Food_{{food}}')
.badge.badge-info.stack-count {{points}}
li.customize-menu(ng-if='user.items.special.snowball')
menu.pets-menu(label=env.t('special'))
div
button.customize-option(popover='{{Content.food.Saddle.notes}}', popover-title='{{Content.food.Saddle.text}}', popover-trigger='mouseenter', popover-placement='left', ng-click='purchase("food", Content.food.Saddle)', class='Pet_Food_{{Content.food.Saddle.key}}')
p
| {{Content.food.Saddle.value}}
span.Pet_Currency_Gem1x.inline-gems
button.customize-option(popover='{{Content.special.snowball.notes}}', popover-title='{{Content.special.snowball.text}}', popover-trigger='mouseenter', popover-placement='right', ng-click='castStart(Content.special.snowball)', class='inventory_special_snowball')
.badge.badge-info.stack-count {{user.items.special.snowball}}
li.customize-menu(ng-if='user.purchased.plan.customerId')
menu.pets-menu(label=env.t('subscriberItem'))
div
button.customize-option(popover=env.t('fortifyPop'), popover-title=env.t('fortifyName'), popover-trigger='mouseenter', popover-placement='left', ng-click='modals.reroll = true', class='inventory_special_fortify')
p
| 4
span.Pet_Currency_Gem1x.inline-gems
//-div
button.customize-option(popover='{{Content.spells.special.snowball.notes}}', popover-title='{{Content.spells.special.snowball.text}}', popover-trigger='mouseenter', popover-placement='left', ng-click='purchase("special", Content.spells.special.snowball)', class='inventory_special_snowball')
p
| {{Content.spells.special.snowball.value}}
span.Pet_Currency_Gem1x.inline-gems
div(ng-show='user.flags.rebirthEnabled')
button.customize-option(popover=env.t('rebirthPop'), popover-title=env.t('rebirthName'), popover-trigger='mouseenter', popover-placement='left', ng-click='modals.rebirth = true', class='rebirth_orb')
p
| 8
span.Pet_Currency_Gem1x.inline-gems
div(ng-if='user.purchased.plan.planId')
button.customize-option(ng-click='user.ops.purchase({params:{type:"gems",key:"gem"}})')
span.Pet_Currency_Gem.inline-gems
p
| 20
span.shop_gold
button.customize-option(popover=env.t('subscriberItemText'), popover-trigger='mouseenter', popover-placement='right', class='inventory_present')
.col-md-6
h2=env.t('market')
.row-fluid
table.npc_alex_container
tr
td
.npc_alex.pull-left
td
.popover.static-popover.fade.right.in
.arrow
h3.popover-title
a(target='_blank', href='http://www.kickstarter.com/profile/523661924')=env.t('alexander')
.popover-content
p=env.t('welcomeMarket')
p
button.btn.btn-primary(ng-show='selectedEgg', ng-click='sellInventory()')=env.t('sellForGold', {item: "{{selectedEgg.text}}", gold: "{{selectedEgg.value}}"})
button.btn.btn-primary(ng-show='selectedPotion', ng-click='sellInventory()')=env.t('sellForGold', {item: "{{selectedPotion.text}}", gold: "{{selectedPotion.value}}"})
button.btn.btn-primary(ng-show='selectedFood', ng-click='sellInventory()')=env.t('sellForGold', {item: "{{selectedFood.text}}", gold: "{{selectedFood.value}}"})
menu.inventory-list(type='list')
li.customize-menu
menu.pets-menu(label=env.t('eggs'))
div(ng-repeat='egg in Content.eggs', ng-if='egg.canBuy')
button.customize-option(popover='{{egg.notes}}', popover-title='{{egg.text}} Egg', popover-trigger='mouseenter', popover-placement='left', ng-click='purchase("eggs", egg)', class='Pet_Egg_{{egg.key}}')
p
| {{egg.value}}
span.Pet_Currency_Gem1x.inline-gems
li.customize-menu
menu.pets-menu(label=env.t('hatchingPotions'))
div(ng-repeat='pot in Content.hatchingPotions')
button.customize-option(popover='{{pot.notes}}', popover-title='{{pot.text}} Potion', popover-trigger='mouseenter', popover-placement='left', ng-click='purchase("hatchingPotions", pot)', class='Pet_HatchingPotion_{{pot.key}}')
p
| {{pot.value}}
span.Pet_Currency_Gem1x.inline-gems
li.customize-menu
menu.pets-menu(label=env.t('food'))
div(ng-repeat='food in Content.food', ng-if='food.key !== "Saddle" && food.canBuy')
button.customize-option(popover='{{food.notes}}', popover-title='{{food.text}}', popover-trigger='mouseenter', popover-placement='left', ng-click='purchase("food", food)', class='Pet_Food_{{food.key}}')
p
| {{food.value}}
span.Pet_Currency_Gem1x.inline-gems
li.customize-menu
menu.pets-menu(label=env.t('quests'))
p.muted!=env.t('scrollsText1') + ' <a href="/#/options/groups/party">' + env.t('scrollsText2') + '</a>'
div(ng-repeat='quest in Content.quests', ng-if='quest.canBuy')
button.customize-option(popover="{{quest.previous && !user.achievements.quests[quest.previous] ? env.t('scrollsPre') : quest.notes | htmlDecode}}", popover-title='{{quest.text}}', popover-trigger='mouseenter', popover-placement='left', ng-click='buyQuest(quest.key)', class='inventory_quest_scroll', ng-class='{locked: quest.previous && !user.achievements.quests[quest.previous]}')
p
| {{quest.value}}
span.Pet_Currency_Gem1x.inline-gems
li.customize-menu
menu.pets-menu(label=env.t('special'))
div
button.customize-option(popover='{{Content.food.Saddle.notes}}', popover-title='{{Content.food.Saddle.text}}', popover-trigger='mouseenter', popover-placement='left', ng-click='purchase("food", Content.food.Saddle)', class='Pet_Food_{{Content.food.Saddle.key}}')
p
| {{Content.food.Saddle.value}}
span.Pet_Currency_Gem1x.inline-gems
div
button.customize-option(popover=env.t('fortifyPop'), popover-title=env.t('fortifyName'), popover-trigger='mouseenter', popover-placement='left', ng-click='openModal("reroll")', class='inventory_special_fortify')
p
| 4
span.Pet_Currency_Gem1x.inline-gems
//-div
button.customize-option(popover='{{Content.spells.special.snowball.notes}}', popover-title='{{Content.spells.special.snowball.text}}', popover-trigger='mouseenter', popover-placement='left', ng-click='purchase("special", Content.spells.special.snowball)', class='inventory_special_snowball')
p
| {{Content.spells.special.snowball.value}}
span.Pet_Currency_Gem1x.inline-gems
div(ng-show='user.flags.rebirthEnabled')
button.customize-option(popover=env.t('rebirthPop'), popover-title=env.t('rebirthName'), popover-trigger='mouseenter', popover-placement='left', ng-click='openModal("rebirth")', class='rebirth_orb')
p
| 8
span.Pet_Currency_Gem1x.inline-gems
div(ng-if='user.purchased.plan.planId')
button.customize-option(ng-click='user.ops.purchase({params:{type:"gems",key:"gem"}})')
span.Pet_Currency_Gem.inline-gems
p
| 20
span.shop_gold

View file

@ -1,85 +1,87 @@
script(type='text/ng-template', id='partials/options.inventory.mounts.html')
.stable
table(style='width:100%')
tr
td(style='width:144px')
.npc_matt
td
.popover.static-popover.fade.right.in(style='max-width: 550px; margin-left: 10px;')
.arrow
h3.popover-title
a(target='_blank', href='http://www.kickstarter.com/profile/mattboch')=env.t('mattBoch')
.popover-content
p=env.t('mattShall', {name: "{{user.profile.name}}"})
h4= '{{mountCount}} / {{totalPets}} ' + env.t('mountsTamed')
menu.pets(type='list')
li.customize-menu(ng-repeat='egg in Content.eggs')
menu
div(ng-repeat='potion in Content.hatchingPotions', popover-trigger='mouseenter', popover='{{potion.text}} {{egg.mountText}}', popover-placement='bottom', ng-init='mount = egg.key+"-"+potion.key')
button(class="pet-button Mount_Head_{{mount}}", ng-show='user.items.mounts[mount]', ng-class='{active: user.items.currentMount == mount}', ng-click='chooseMount(egg.key, potion.key)')
//div(class='Mount_Head_{{mount}}')
button(class="pet-button pet-not-owned", ng-hide='user.items.mounts[mount]')
.PixelPaw
.container-fluid
.stable.row
table
tr
td(style='width:144px')
.npc_matt
td
.popover.static-popover.fade.right.in(style='max-width: 550px; margin-left: 10px;')
.arrow
h3.popover-title
a(target='_blank', href='http://www.kickstarter.com/profile/mattboch')=env.t('mattBoch')
.popover-content
p=env.t('mattShall', {name: "{{user.profile.name}}"})
h4= '{{mountCount}} / {{totalPets}} ' + env.t('mountsTamed')
menu.pets(type='list')
li.customize-menu(ng-repeat='egg in Content.eggs')
menu
div(ng-repeat='potion in Content.hatchingPotions', popover-trigger='mouseenter', popover='{{potion.text}} {{egg.mountText}}', popover-placement='bottom', ng-init='mount = egg.key+"-"+potion.key')
button(class="pet-button Mount_Head_{{mount}}", ng-show='user.items.mounts[mount]', ng-class='{active: user.items.currentMount == mount}', ng-click='chooseMount(egg.key, potion.key)')
//div(class='Mount_Head_{{mount}}')
button(class="pet-button pet-not-owned", ng-hide='user.items.mounts[mount]')
.PixelPaw
h4=env.t('rareMounts')
menu
div
button(ng-if='user.items.mounts["BearCub-Polar"]', class="pet-button Mount_Head_BearCub-Polar", ng-class='{active: user.items.currentMount == "BearCub-Polar"}', ng-click='chooseMount("BearCub", "Polar")', popover=env.t('polarBear'), popover-trigger='mouseenter', popover-placement='bottom')
//.Mount_Head_BearCub-Polar
button(ng-if='user.items.mounts["LionCub-Ethereal"]', class="pet-button Mount_Head_LionCub-Ethereal", ng-class='{active: user.items.currentMount == "LionCub-Ethereal"}', ng-click='chooseMount("LionCub", "Ethereal")', popover=env.t('etherealLion'), popover-trigger='mouseenter', popover-placement='bottom')
//.Mount_Head_LionCub-Ethereal
h4=env.t('rareMounts')
menu
div
button(ng-if='user.items.mounts["BearCub-Polar"]', class="pet-button Mount_Head_BearCub-Polar", ng-class='{active: user.items.currentMount == "BearCub-Polar"}', ng-click='chooseMount("BearCub", "Polar")', popover=env.t('polarBear'), popover-trigger='mouseenter', popover-placement='bottom')
//.Mount_Head_BearCub-Polar
button(ng-if='user.items.mounts["LionCub-Ethereal"]', class="pet-button Mount_Head_LionCub-Ethereal", ng-class='{active: user.items.currentMount == "LionCub-Ethereal"}', ng-click='chooseMount("LionCub", "Ethereal")', popover=env.t('etherealLion'), popover-trigger='mouseenter', popover-placement='bottom')
//.Mount_Head_LionCub-Ethereal
script(type='text/ng-template', id='partials/options.inventory.pets.html')
.stable
table(style='width:100%')
tr
td(style='width:144px')
.npc_matt
td
.popover.static-popover.fade.right.in(style='max-width: 550px; margin-left: 10px;')
.arrow
h3.popover-title
a(target='_blank', href='http://www.kickstarter.com/profile/mattboch')=env.t('mattBoch')
.popover-content
p
=env.t('mattBochText1') + ' '
| <a target='_blank' href='https://f.cloud.github.com/assets/2374703/164631/3ed5fa6c-78cd-11e2-8743-f65ac477b55e.png'>
=env.t('mattBochText2')
| </a>
= ' ' + env.t('mattBochText3')
h4= '{{petCount}} / {{totalPets}} ' + env.t('petsFound')
.container-fluid
.stable.row
table
tr
td(style='width:144px')
.npc_matt
td
.popover.static-popover.fade.right.in(style='max-width: 550px; margin-left: 10px;')
.arrow
h3.popover-title
a(target='_blank', href='http://www.kickstarter.com/profile/mattboch')=env.t('mattBoch')
.popover-content
p
=env.t('mattBochText1') + ' '
| <a target='_blank' href='https://f.cloud.github.com/assets/2374703/164631/3ed5fa6c-78cd-11e2-8743-f65ac477b55e.png'>
=env.t('mattBochText2')
| </a>
= ' ' + env.t('mattBochText3')
h4= '{{petCount}} / {{totalPets}} ' + env.t('petsFound')
menu.pets(type='list')
li.customize-menu(ng-repeat='egg in Content.eggs')
menu
div(ng-repeat='potion in Content.hatchingPotions', popover-trigger='mouseenter', popover='{{potion.text}} {{egg.text}}', popover-placement='bottom', ng-init='pet = egg.key+"-"+potion.key')
button(class="pet-button Pet-{{pet}}", ng-if='user.items.pets[pet]>0', ng-class='{active: user.items.currentPet == pet, selectableInventory: selectedFood}', ng-click='choosePet(egg.key, potion.key)')
.progress(ng-show='!user.items.mounts[pet]', ng-class='{"progress-success": user.items.pets[pet]<50}')
.bar(style="width: {{user.items.pets[pet]/.5}}%;")
button(class="pet-button pet-not-owned", ng-if='!user.items.pets[pet]')
.PixelPaw
button(class="pet-button Pet-{{pet}}" ng-if='user.items.pets[pet]<0',style='opacity:0.1;filter:alpha(opacity=10)')
//if this could be changed to the opacity talked about? can't figure it out
menu.pets(type='list')
li.customize-menu(ng-repeat='egg in Content.eggs')
menu
div(ng-repeat='potion in Content.hatchingPotions', popover-trigger='mouseenter', popover='{{potion.text}} {{egg.text}}', popover-placement='bottom', ng-init='pet = egg.key+"-"+potion.key')
button(class="pet-button Pet-{{pet}}", ng-if='user.items.pets[pet]>0', ng-class='{active: user.items.currentPet == pet, selectableInventory: selectedFood}', ng-click='choosePet(egg.key, potion.key)')
.progress(ng-show='!user.items.mounts[pet]')
.progress-bar.progress-bar-success(style="width:{{user.items.pets[pet]/.5}}%")
button(class="pet-button pet-not-owned", ng-if='!user.items.pets[pet]')
.PixelPaw
button(class="pet-button Pet-{{pet}}" ng-if='user.items.pets[pet]<0',style='opacity:0.1;filter:alpha(opacity=10)')
//if this could be changed to the opacity talked about? can't figure it out
h4=env.t('rarePets')
menu
div
button(ng-if='user.items.pets["Wolf-Veteran"]', class="pet-button Pet-Wolf-Veteran", ng-class='{active: user.items.currentPet == "Wolf-Veteran"}', ng-click='choosePet("Wolf", "Veteran")', popover=env.t('veteranWolf'), popover-trigger='mouseenter', popover-placement='bottom')
button(ng-if='user.items.pets["Wolf-Cerberus"]', class="pet-button Pet-Wolf-Cerberus", ng-class='{active: user.items.currentPet == "Wolf-Cerberus"}', ng-click='choosePet("Wolf", "Cerberus")', popover=env.t('cerberusPup'), popover-trigger='mouseenter', popover-placement='bottom')
button(ng-if='user.items.pets["Turkey-Base"]', class="pet-button Pet-Turkey-Base", ng-class='{active: user.items.currentPet == "Turkey-Base"}', ng-click='choosePet("Turkey", "Base")', popover=env.t('turkey'), popover-trigger='mouseenter', popover-placement='bottom')
button(ng-if='user.items.pets["BearCub-Polar"]', class="pet-button Pet-BearCub-Polar", ng-class='{active: user.items.currentPet == "BearCub-Polar"}', ng-click='choosePet("BearCub", "Polar")', popover=env.t('polarBearPup'), popover-trigger='mouseenter', popover-placement='bottom')
button(ng-if='user.items.pets["Dragon-Hydra"]', class="pet-button Pet-Dragon-Hydra", ng-class='{active: user.items.currentPet == "Dragon-Hydra"}', ng-click='choosePet("Dragon", "Hydra")', popover=env.t('hydra'), popover-trigger='mouseenter', popover-placement='bottom')
a(target='_blank', href='http://habitrpg.wikia.com/wiki/Contributing_to_HabitRPG')
button(ng-if='!user.items.pets["Dragon-Hydra"]', class="pet-button pet-not-owned", popover-trigger='mouseenter', popover-placement='right', popover=env.t('rarePetPop1'), popover-title=env.t('rarePetPop2'))
.PixelPaw-Gold
h4=env.t('rarePets')
menu
div
button(ng-if='user.items.pets["Wolf-Veteran"]', class="pet-button Pet-Wolf-Veteran", ng-class='{active: user.items.currentPet == "Wolf-Veteran"}', ng-click='choosePet("Wolf", "Veteran")', popover=env.t('veteranWolf'), popover-trigger='mouseenter', popover-placement='bottom')
button(ng-if='user.items.pets["Wolf-Cerberus"]', class="pet-button Pet-Wolf-Cerberus", ng-class='{active: user.items.currentPet == "Wolf-Cerberus"}', ng-click='choosePet("Wolf", "Cerberus")', popover=env.t('cerberusPup'), popover-trigger='mouseenter', popover-placement='bottom')
button(ng-if='user.items.pets["Turkey-Base"]', class="pet-button Pet-Turkey-Base", ng-class='{active: user.items.currentPet == "Turkey-Base"}', ng-click='choosePet("Turkey", "Base")', popover=env.t('turkey'), popover-trigger='mouseenter', popover-placement='bottom')
button(ng-if='user.items.pets["BearCub-Polar"]', class="pet-button Pet-BearCub-Polar", ng-class='{active: user.items.currentPet == "BearCub-Polar"}', ng-click='choosePet("BearCub", "Polar")', popover=env.t('polarBearPup'), popover-trigger='mouseenter', popover-placement='bottom')
button(ng-if='user.items.pets["Dragon-Hydra"]', class="pet-button Pet-Dragon-Hydra", ng-class='{active: user.items.currentPet == "Dragon-Hydra"}', ng-click='choosePet("Dragon", "Hydra")', popover=env.t('hydra'), popover-trigger='mouseenter', popover-placement='bottom')
a(target='_blank', href='http://habitrpg.wikia.com/wiki/Contributing_to_HabitRPG')
button(ng-if='!user.items.pets["Dragon-Hydra"]', class="pet-button pet-not-owned", popover-trigger='mouseenter', popover-placement='right', popover=env.t('rarePetPop1'), popover-title=env.t('rarePetPop2'))
.PixelPaw-Gold
.well.food-tray
p(ng-show='foodCount < 1')=env.t('noFood')
menu.inventory-list(type='list', ng-if='foodCount > 0')
li.customize-menu
menu.pets-menu(label=env.t('food'))
div(ng-repeat='(food,points) in ownedItems(user.items.food)')
button.customize-option(popover-append-to-body='true', popover='{{Content.food[food].notes}}', popover-title='{{Content.food[food].text}}', popover-trigger='mouseenter', popover-placement='left', ng-click='chooseFood(food)', class='Pet_Food_{{food}}')
.badge.badge-info.stack-count {{points}}
// Remove this once we have images in
p {{Content.food[food].text}}
.well.food-tray
p(ng-show='foodCount < 1')=env.t('noFood')
menu.inventory-list(type='list', ng-if='foodCount > 0')
li.customize-menu
menu.pets-menu(label=env.t('food'))
div(ng-repeat='(food,points) in ownedItems(user.items.food)')
button.customize-option(popover-append-to-body='true', popover='{{Content.food[food].notes}}', popover-title='{{Content.food[food].text}}', popover-trigger='mouseenter', popover-placement='left', ng-click='chooseFood(food)', class='Pet_Food_{{food}}')
.badge.badge-info.stack-count {{points}}
// Remove this once we have images in
p {{Content.food[food].text}}

View file

@ -1,6 +1,6 @@
script(id='partials/options.profile.avatar.html', type='text/ng-template')
.row-fluid
.span4
.row
.col-md-4
h3=env.t('bodyBody')
small
| 2 <span class="Pet_Currency_Gem1x inline-gems"/> /
@ -24,7 +24,7 @@ script(id='partials/options.profile.avatar.html', type='text/ng-template')
button.btn.btn-small.btn-primary(ng-hide="user.purchased.shirt.convict && user.purchased.shirt.cross && user.purchased.shirt.fire && user.purchased.shirt.horizon && user.purchased.shirt.ocean && user.purchased.shirt.purple && user.purchased.shirt.rainbow && user.purchased.shirt.redblue && user.purchased.shirt.thunder && user.purchased.shirt.tropical && user.purchased.shirt.zombie", ng-click='unlock("shirt.convict,shirt.cross,shirt.fire,shirt.horizon,shirt.ocean,shirt.purple,shirt.rainbow,shirt.redblue,shirt.thunder,shirt.tropical,shirt.zombie")')!= env.t('unlockSet5') + ' <span class="Pet_Currency_Gem1x inline-gems"/>'
.span4
.col-md-4
h3=env.t('bodyHead')
small
| 2 <span class="Pet_Currency_Gem1x inline-gems"/> /
@ -83,7 +83,7 @@ script(id='partials/options.profile.avatar.html', type='text/ng-template')
button.btn.btn-small.btn-primary(ng-hide='user.purchased.hair.mustache.1 && user.purchased.hair.mustache.2 && user.purchased.hair.beard.1 && user.purchased.hair.beard.2 && user.purchased.hair.beard.3', ng-click='unlock("hair.mustache.1,hair.mustache.2,hair.beard.1,hair.beard.2,hair.beard.3")')!= env.t('unlockSet5') + ' <span class="Pet_Currency_Gem1x inline-gems"/>'
.span4
.col-md-4
h3=env.t('bodySkin')
small
| 2 <span class="Pet_Currency_Gem1x inline-gems"/> /
@ -111,109 +111,113 @@ script(id='partials/options.profile.avatar.html', type='text/ng-template')
button.customize-option(type='button', class='skin_#{color}', ng-if='user.purchased.skin.#{color}', ng-click='unlock("skin.#{color}")')
script(id='partials/options.profile.stats.html', type='text/ng-template')
.row-fluid
.border-right(ng-class='user.flags.classSelected && !user.preferences.disableClasses ? "span4" : "span6"')
include ../shared/profiles/stats
.span4.border-right.allocate-stats(ng-if='user.flags.classSelected && !user.preferences.disableClasses')
h3=env.t('characterBuild')
h4
=env.t('class') + ': '
span {{ {warrior:'Warrior',wizard:'Mage',healer:'Healer',rogue:'Rogue'}[user.stats.class] }}&nbsp;
a.btn.btn-danger.btn-mini(ng-click='changeClass(null)')=env.t('changeClass')
small 3 <span class="Pet_Currency_Gem1x inline-gems"/>
table.table.table-striped
tr
td
strong
{{user.stats.points}}&nbsp;
=env.t('unallocated')
&nbsp;
i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('levelPopover'))
td
tr
td(colspan=2)
fieldset.auto-allocate
label.checkbox
input(type='checkbox', ng-model='user.preferences.automaticAllocation', ng-change='set({"preferences.automaticAllocation": user.preferences.automaticAllocation?true: false})', ng-click='set({"preferences.allocationMode":"taskbased"})')
=env.t('autoAllocation')
&nbsp;
i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('autoAllocationPop'))
form(ng-show='user.preferences.automaticAllocation',style='margin-left:1em')
label.radio
input(type='radio', name='allocationMode', value='flat', ng-model='user.preferences.allocationMode', ng-change='set({"preferences.allocationMode": "flat"})')
=env.t('evenAllocation')
.container-fluid
.row
.border-right(ng-class='user.flags.classSelected && !user.preferences.disableClasses ? "col-md-4" : "col-md-6"')
include ../shared/profiles/stats
.col-md-4.border-right.allocate-stats(ng-if='user.flags.classSelected && !user.preferences.disableClasses')
h3=env.t('characterBuild')
h4
=env.t('class') + ': '
span {{ {warrior:'Warrior',wizard:'Mage',healer:'Healer',rogue:'Rogue'}[user.stats.class] }}&nbsp;
a.btn.btn-danger.btn-mini(ng-click='changeClass(null)')=env.t('changeClass')
small 3 <span class="Pet_Currency_Gem1x inline-gems"/>
table.table.table-striped
tr
td
strong
{{user.stats.points}}&nbsp;
=env.t('unallocated')
&nbsp;
span.glyphicon.glyphicon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('levelPopover'))
td
tr
td(colspan=2)
fieldset.auto-allocate
label.checkbox
input(type='checkbox', ng-model='user.preferences.automaticAllocation', ng-change='set({"preferences.automaticAllocation": user.preferences.automaticAllocation?true: false})', ng-click='set({"preferences.allocationMode":"taskbased"})')
=env.t('autoAllocation')
&nbsp;
i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('evenAllocationPop'))
label.radio
input(type='radio', name='allocationMode', value='classbased', ng-model='user.preferences.allocationMode', ng-change='set({"preferences.allocationMode": "classbased"})')
=env.t('classAllocation')
&nbsp;
i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('classAllocationPop'))
label.radio
input(type='radio', name='allocationMode', value='taskbased', ng-model='user.preferences.allocationMode', ng-change='set({"preferences.allocationMode": "taskbased"})')
=env.t('taskAllocation')
&nbsp;
i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('taskAllocationPop'))
div(ng-show='user.preferences.automaticAllocation && !(user.preferences.allocationMode === "taskbased") && (user.stats.points > 0)')
a.btn.btn-primary.btn-mini(ng-click='user.ops.allocateNow({})', popover-trigger='mouseenter', popover-placement='right', popover=env.t('distributePointsPop'))
i.icon-download.icon-white
&nbsp;
=env.t('distributePoints')
tr
td= env.t('allocateCon') + ' {{user.stats.con}}'
td
a.btn.btn-primary(ng-show='user.stats.points', ng-click='allocate("con")', popover-trigger='mouseenter', popover-placement='right', popover=env.t('allocateConPop')) +
tr
td= env.t('allocateInt') + ' {{user.stats.int}}'
td
a.btn.btn-primary(ng-show='user.stats.points', ng-click='allocate("int")', popover-trigger='mouseenter', popover-placement='right', popover=env.t('allocateIntPop')) +
tr
td= env.t('allocatePer') + ' {{user.stats.per}}'
td
a.btn.btn-primary(ng-show='user.stats.points', ng-click='allocate("per")', popover-trigger='mouseenter', popover-placement='right', popover=env.t('allocatePerPop')) +
tr
td= env.t('allocateStr') + ' {{user.stats.str}}'
td
a.btn.btn-primary(ng-show='user.stats.points', ng-click='allocate("str")', popover-trigger='mouseenter', popover-placement='right', popover=env.t('allocateStrPop')) +
div(ng-class='user.flags.classSelected && !user.preferences.disableClasses ? "span4" : "span6"')
include ../shared/profiles/achievements
span.glyphicon.glyphicon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('autoAllocationPop'))
form(ng-show='user.preferences.automaticAllocation',style='margin-left:1em')
label.radio
input(type='radio', name='allocationMode', value='flat', ng-model='user.preferences.allocationMode', ng-change='set({"preferences.allocationMode": "flat"})')
=env.t('evenAllocation')
&nbsp;
span.glyphicon.glyphicon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('evenAllocationPop'))
label.radio
input(type='radio', name='allocationMode', value='classbased', ng-model='user.preferences.allocationMode', ng-change='set({"preferences.allocationMode": "classbased"})')
=env.t('classAllocation')
&nbsp;
span.glyphicon.glyphicon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('classAllocationPop'))
label.radio
input(type='radio', name='allocationMode', value='taskbased', ng-model='user.preferences.allocationMode', ng-change='set({"preferences.allocationMode": "taskbased"})')
=env.t('taskAllocation')
&nbsp;
span.glyphicon.glyphicon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('taskAllocationPop'))
div(ng-show='user.preferences.automaticAllocation && !(user.preferences.allocationMode === "taskbased") && (user.stats.points > 0)')
a.btn.btn-primary.btn-mini(ng-click='user.ops.allocateNow({})', popover-trigger='mouseenter', popover-placement='right', popover=env.t('distributePointsPop'))
span.glyphicon.glyphicon-download
&nbsp;
=env.t('distributePoints')
tr
td= env.t('allocateCon') + ' {{user.stats.con}}'
td
a.btn.btn-primary(ng-show='user.stats.points', ng-click='allocate("con")', popover-trigger='mouseenter', popover-placement='right', popover=env.t('allocateConPop')) +
tr
td= env.t('allocateInt') + ' {{user.stats.int}}'
td
a.btn.btn-primary(ng-show='user.stats.points', ng-click='allocate("int")', popover-trigger='mouseenter', popover-placement='right', popover=env.t('allocateIntPop')) +
tr
td= env.t('allocatePer') + ' {{user.stats.per}}'
td
a.btn.btn-primary(ng-show='user.stats.points', ng-click='allocate("per")', popover-trigger='mouseenter', popover-placement='right', popover=env.t('allocatePerPop')) +
tr
td= env.t('allocateStr') + ' {{user.stats.str}}'
td
a.btn.btn-primary(ng-show='user.stats.points', ng-click='allocate("str")', popover-trigger='mouseenter', popover-placement='right', popover=env.t('allocateStrPop')) +
div(ng-class='user.flags.classSelected && !user.preferences.disableClasses ? "col-md-4" : "col-md-6"')
include ../shared/profiles/achievements
script(id='partials/options.profile.profile.html', type='text/ng-template')
button.btn.btn-default(ng-click='_editing.profile = true', ng-show='!_editing.profile')= env.t('edit')
button.btn.btn-primary(ng-click='save()', ng-show='_editing.profile')= env.t('save')
div(ng-show='!_editing.profile')
h4=env.t('displayName')
span(ng-show='profile.profile.name') {{profile.profile.name}}
span.muted(ng-hide='profile.profile.name') -&nbsp;
=env.t('none')
| &nbsp;-
.container-fluid
.row
.col-md-12(ng-show='!_editing.profile')
button.btn.btn-default(ng-click='_editing.profile = true', ng-show='!_editing.profile')= env.t('edit')
h4=env.t('displayName')
span(ng-show='profile.profile.name') {{profile.profile.name}}
span.muted(ng-hide='profile.profile.name') -&nbsp;
=env.t('none')
| &nbsp;-
h4=env.t('displayPhoto')
img(ng-show='profile.profile.imageUrl', ng-src='{{profile.profile.imageUrl}}')
span.muted(ng-hide='profile.profile.imageUrl') -&nbsp;
=env.t('none')
| &nbsp;-
h4=env.t('displayPhoto')
img(ng-show='profile.profile.imageUrl', ng-src='{{profile.profile.imageUrl}}')
span.muted(ng-hide='profile.profile.imageUrl') -&nbsp;
=env.t('none')
| &nbsp;-
h4=env.t('displayBlurb')
markdown(ng-show='profile.profile.blurb', ng-model='profile.profile.blurb')
span.muted(ng-hide='profile.profile.blurb') -&nbsp;
=env.t('none')
| &nbsp;-
//{{profile.profile.blurb | linky:'_blank'}}
h4=env.t('displayBlurb')
markdown(ng-show='profile.profile.blurb', ng-model='profile.profile.blurb')
span.muted(ng-hide='profile.profile.blurb') -&nbsp;
=env.t('none')
| &nbsp;-
//{{profile.profile.blurb | linky:'_blank'}}
div.whatever-options(ng-show='_editing.profile')
// TODO use photo-upload instead: https://groups.google.com/forum/?fromgroups=#!topic/derbyjs/xMmADvxBOak
.control-group.option-large
label.control-label=env.t('displayName')
input.option-content(type='text', placeholder=env.t('fullName'), ng-model='editingProfile.name')
.control-group.option-large
label.control-label=env.t('photoUrl')
input.option-content(type='url', ng-model='editingProfile.imageUrl', placeholder=env.t('imageUrl'))
.control-group.option-large
label.control-label=env.t('displayBlurb')
textarea.option-content(style='height:15em;', placeholder=env.t('displayBlurb'), ng-model='editingProfile.blurb')
include ../shared/formatting-help
form.col-md-4(ng-show='_editing.profile', ng-submit='save()')
input.btn.btn-primary(type='submit', value=env.t('save'))
// TODO use photo-upload instead: https://groups.google.com/forum/?fromgroups=#!topic/derbyjs/xMmADvxBOak
.form-group
label=env.t('displayName')
input.form-control(type='text', placeholder=env.t('fullName'), ng-model='editingProfile.name')
.form-group
label=env.t('photoUrl')
input.form-control(type='url', ng-model='editingProfile.imageUrl', placeholder=env.t('imageUrl'))
.form-group
label=env.t('displayBlurb')
textarea.form-control(rows=5, placeholder=env.t('displayBlurb'), ng-model='editingProfile.blurb')
include ../shared/formatting-help
script(id='partials/options.profile.html', type="text/ng-template")
ul.nav.nav-tabs

View file

@ -17,102 +17,106 @@ script(id='partials/options.settings.html', type="text/ng-template")
div(ui-view)
script(type='text/ng-template', id='partials/options.settings.settings.html')
.row-fluid
.personal-options.span6
h2=env.t('settings')
h4=env.t('customDayStart')
.option-group.option-short
input.option-content.option-time(type='number', min='0', max='24', ng-model='user.preferences.dayStart', ng-change='saveDayStart()')
span.input-suffix= ':00 (' + env.t('24HrClock') + ')'
div
small
div=env.t('clockInfo')
.alert.alert-danger
=env.t('subWarning1')
a(href='https://github.com/HabitRPG/habitrpg/issues/1057' target='_blank')=env.t('subWarning2')
=env.t('subWarning3')
hr
h4=env.t('language')
select(ng-model='language.code', ng-options='lang.code as lang.name for lang in avalaibleLanguages', ng-change='changeLanguage()')
hr
h4=env.t('misc')
label.checkbox
input(type='checkbox', ng-click='set({"preferences.hideHeader":user.preferences.hideHeader?false:true})', ng-checked='user.preferences.hideHeader!==true')
=env.t('showHeader')
&nbsp;
i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('showHeaderPop'))
label.checkbox
input(type='checkbox', ng-click='toggleStickyHeader()', ng-checked='user.preferences.stickyHeader!==false')
=env.t('stickyHeader')
&nbsp;
i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('stickyHeaderPop'))
label.checkbox
input(type='checkbox', ng-model='user.preferences.newTaskEdit', ng-change='set({"preferences.newTaskEdit": user.preferences.newTaskEdit?true: false})')
=env.t('newTaskEdit')
&nbsp;
i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('newTaskEditPop'))
label.checkbox
input(type='checkbox', ng-model='user.preferences.tagsCollapsed', ng-change='set({"preferences.tagsCollapsed": user.preferences.tagsCollapsed?true: false})')
=env.t('startCollapsed')
&nbsp;
i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('startCollapsedPop'))
label.checkbox
input(type='checkbox', ng-model='user.preferences.advancedCollapsed', ng-change='set({"preferences.advancedCollapsed": user.preferences.advancedCollapsed?true: false})')
=env.t('startAdvCollapsed')
&nbsp;
i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('startAdvCollapsedPop'))
button.btn(ng-click='showTour()', popover-placement='right', popover-trigger='mouseenter', popover=env.t('restartTour'))= env.t('showTour')
br
button.btn(ng-click='showBailey()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('showBaileyPop'))= env.t('showBailey')
br
button.btn(ng-click='modals.restore = true', popover-trigger='mouseenter', popover-placement='right', popover=env.t('fixValPop'))= env.t('fixVal')
div(ng-if='user.preferences.disableClasses==true')
button.btn(ng-click='user.ops.changeClass({})', popover-trigger='mouseenter', popover-placement='right', popover=env.t('enableClassPop'))= env.t('enableClass')
div(ng-if='!user.preferences.disableClasses && user.flags.classSelected')
button.btn(ng-click='showClassesTour()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('classTourPop'))= env.t('showClass')
//- Why is ng-if='user.auth.local' validating for users *without* user.auth.local (facebook users)? adding .username here for extra
div(ng-if='user.auth.local.username')
.containter-fluid
.row
.personal-options.col-md-6
h2=env.t('settings')
h4=env.t('customDayStart')
.form-group
input.form-control(type='number', min='0', max='24', ng-model='user.preferences.dayStart', ng-change='saveDayStart()')
span.input-suffix= ':00 (' + env.t('24HrClock') + ')'
div
small
div=env.t('clockInfo')
.alert.alert-danger.alert-sm
=env.t('subWarning1')
a(href='https://github.com/HabitRPG/habitrpg/issues/1057' target='_blank')=env.t('subWarning2')
=env.t('subWarning3')
hr
h4=env.t('changePass')
form(ng-submit='changePassword(changePass)', ng-show='user.auth.local')
.control-group
input(type='password', placeholder=env.t('oldPass'), ng-model='changePass.oldPassword', required)
.control-group
input(type='password', placeholder=env.t('newPass'), ng-model='changePass.newPassword', required)
.control-group
input(type='password', placeholder=env.t('confirmPass'), ng-model='changePass.confirmNewPassword', required)
input.btn(type='submit', value=env.t('submit'))
h4=env.t('language')
select(ng-model='language.code', ng-options='lang.code as lang.name for lang in avalaibleLanguages', ng-change='changeLanguage()')
hr
h4=env.t('misc')
.checkbox
label
input(type='checkbox', ng-click='set({"preferences.hideHeader":user.preferences.hideHeader?false:true})', ng-checked='user.preferences.hideHeader!==true')
=env.t('showHeader')
&nbsp;
span.glyphicon.glyphicon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('showHeaderPop'))
.checkbox
label
input(type='checkbox', ng-click='toggleStickyHeader()', ng-checked='user.preferences.stickyHeader!==false')
=env.t('stickyHeader')
&nbsp;
span.glyphicon.glyphicon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('stickyHeaderPop'))
.checkbox
label
input(type='checkbox', ng-model='user.preferences.newTaskEdit', ng-change='set({"preferences.newTaskEdit": user.preferences.newTaskEdit?true: false})')
=env.t('newTaskEdit')
&nbsp;
span.glyphicon.glyphicon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('newTaskEditPop'))
.checkbox
label
input(type='checkbox', ng-model='user.preferences.tagsCollapsed', ng-change='set({"preferences.tagsCollapsed": user.preferences.tagsCollapsed?true: false})')
=env.t('startCollapsed')
&nbsp;
span.glyphicon.glyphicon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('startCollapsedPop'))
.checkbox
label
input(type='checkbox', ng-model='user.preferences.advancedCollapsed', ng-change='set({"preferences.advancedCollapsed": user.preferences.advancedCollapsed?true: false})')
=env.t('startAdvCollapsed')
&nbsp;
span.glyphicon.glyphicon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('startAdvCollapsedPop'))
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='openRestoreModal()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('fixValPop'))= env.t('fixVal')
button.btn.btn-default(ng-if='user.preferences.disableClasses==true', ng-click='user.ops.changeClass({})', popover-trigger='mouseenter', popover-placement='right', popover=env.t('enableClassPop'))= env.t('enableClass')
button.btn.btn-default(ng-if='!user.preferences.disableClasses && user.flags.classSelected', ng-click='showClassesTour()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('classTourPop'))= env.t('showClass')
hr
h4=env.t('dangerZone')
a.btn.btn-danger(ng-click='modals.reset = true', popover-trigger='mouseenter', popover-placement='right', popover=env.t('resetAccPop'))= env.t('resetAccount')
a.btn.btn-danger(ng-click='modals.delete = true', popover-trigger='mouseenter', popover=env.t('deleteAccPop'))= env.t('deleteAccount')
//- Why is ng-if='user.auth.local' validating for users *without* user.auth.local (facebook users)? adding .username here for extra
div(ng-if='user.auth.local.username')
hr
h4=env.t('changePass')
form(ng-submit='changePassword(changePass)', ng-show='user.auth.local')
.form-group
input.form-control(type='password', placeholder=env.t('oldPass'), ng-model='changePass.oldPassword', required)
.form-group
input.form-control(type='password', placeholder=env.t('newPass'), ng-model='changePass.newPassword', required)
.form-group
input.form-control(type='password', placeholder=env.t('confirmPass'), ng-model='changePass.confirmNewPassword', required)
input.btn.btn-default(type='submit', value=env.t('submit'))
hr
h4=env.t('dangerZone')
a.btn.btn-danger(ng-click='openModal("reset", "SettingsCtrl")', popover-trigger='mouseenter', popover-placement='right', popover=env.t('resetAccPop'))= env.t('resetAccount')
a.btn.btn-danger(ng-click='openModal("delete", "SettingsCtrl")', popover-trigger='mouseenter', popover=env.t('deleteAccPop'))= env.t('deleteAccount')
script(type='text/ng-template', id='partials/options.settings.api.html')
.row.fluid
.span6
h2=env.t('API')
small=env.t('APIText')
h6=env.t('userId')
pre.prettyprint {{user.id}}
h6=env.t('APIToken')
pre.prettyprint {{user.apiToken}}
h6=env.t('qrCode')
img(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.apiToken}}%22%7D&choe=UTF-8&chld=L', alt='qrcode')
.containter-fluid
.row
.col-md-6
h2=env.t('API')
small=env.t('APIText')
h6=env.t('userId')
pre.prettyprint {{user.id}}
h6=env.t('APIToken')
pre.prettyprint {{user.apiToken}}
h6=env.t('qrCode')
img(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.apiToken}}%22%7D&choe=UTF-8&chld=L', alt='qrcode')
script(id='partials/options.settings.export.html', type="text/ng-template")
.row.fluid
.span6
h2=env.t('dataExport')
small=env.t('saveData')
h4=env.t('habitHistory')
=env.t('exportHistory')
a(href="/export/history.csv")= ' ' + env.t('csv')
h4=env.t('userData')
=env.t('exportUserData')
a(href="/export/userdata.xml")= ' ' + env.t('xml') + ' '
a(href="/export/userdata.json")= env.t('json')
.containter-fluid
.row
.col-md-6
h2=env.t('dataExport')
small=env.t('saveData')
h4=env.t('habitHistory')
=env.t('exportHistory')
a(href="/export/history.csv")= ' ' + env.t('csv')
h4=env.t('userData')
=env.t('exportUserData')
a(href="/export/userdata.xml")= ' ' + env.t('xml') + ' '
a(href="/export/userdata.json")= env.t('json')
script(id='partials/options.settings.subscription.perks.html',type='text/ng-template')
table.table.table-striped
@ -154,6 +158,6 @@ script(id='partials/options.settings.subscription.html',type='text/ng-template')
div(ng-if='user.purchased.plan.customerId')
.well
div(style='font-size:22px')
i.icon-ok=env.t('subscribed')
span.glyphicon.glyphicon-ok=env.t('subscribed')
div(ng-include="'partials/options.settings.subscription.perks.html'")
.btn.btn-small.btn-danger(ng-click='cancelSubscription()')=env.t('cancelSub')
.btn.btn-small.btn-danger(ng-click='cancelSubscription()')=env.t('cancelSub')

View file

@ -1,10 +1,10 @@
// ------ Challenges -------
.modal(style='position: relative;top: auto;left: auto;right: auto;margin: 0 auto 20px;z-index: 1;max-width: 100%;')
.modal-header
h3=env.t('challenges')
.panel.panel-default
.panel-heading
h3.panel-title=env.t('challenges')
a.pull-right(target='_blank', href='https://trello.com/card/challenges-individual-party-guild-public/50e5d3684fe3a7266b0036d6/58')
i.icon-question-sign
.modal-body(bindonce='group.challenges')
span.glyphicon.glyphicon-question-sign
.panel-body(bindonce='group.challenges')
div(ng-if='group.challenges.length > 0')
table.table.table-striped
tr(ng-repeat='challenge in group.challenges')
@ -13,6 +13,6 @@
div(ng-if='group.challenges.length == 0')
p=env.t('noChallenges')
a(class='label' ui-sref='options.social.challenges')
i.icon-bullhorn
span.glyphicon.glyphicon-bullhorn
=env.t('challenges')
=env.t('toCreate')

View file

@ -9,37 +9,39 @@ script(type='text/ng-template', id='partials/options.social.challenges.detail.cl
a(ng-click='cancelClosing(closingChal)')=env.t('cancel')
script(type='text/ng-template', id='partials/options.social.challenges.detail.member.html')
.modal.wide-modal
.modal-header
button.close(type='button', ng-click='$state.go("^")', aria-hidden='true') ×
h3 {{obj.profile.name}}
.modal-body
habitrpg-tasks(main=false)
.modal-footer
a.btn(ng-click='$state.go("^")')=env.t('close')
.modal.bs-modal-lg(style='display: block')
.modal-dialog.modal-lg
.modal-content
.modal-header
button.close(type='button', ng-click='$state.go("^")', aria-hidden='true') ×
h3 {{obj.profile.name}}
.modal-body
habitrpg-tasks(main=false)
.modal-footer
a.btn(ng-click='$state.go("^")')=env.t('close')
script(type='text/ng-template', id='partials/options.social.challenges.detail.html')
// Edit button
div(bindonce='challenge', ng-if='challenge.leader==user._id')
ul.unstyled
li(ng-hide='challenge._locked==false')
button.btn.btn-small.btn-default(ng-click='challenge._locked = false')=env.t('edit')
button.btn.btn-small.btn-warning(ng-click='close(challenge, $event)', tooltip=env.t('deleteOrSelect'))=env.t('endChallenge')
li(ng-show='challenge._locked==false')
div(ng-hide='challenge._locked==false')
button.btn.btn-small.btn-default(ng-click='challenge._locked = false')=env.t('edit')
button.btn.btn-small.btn-warning(ng-click='close(challenge, $event)', tooltip=env.t('deleteOrSelect'))=env.t('endChallenge')
form(ng-show='challenge._locked==false')
.form-group(ng-show='challenge._locked==false')
button.btn.btn-small.btn-primary(ng-click='save(challenge)')=env.t('save')
button.btn.btn-small.btn-default(ng-click='challenge._locked=true')=env.t('cancel')
div(ng-show='challenge._locked==false')
.-options
input.option-content(type='text', ng-model='challenge.name')
.option-medium
input.option-content(type='text', minlength="3", maxlength="16", ng-model='challenge.shortName', placeholder=env.t('challengeTag'), required)
textarea.option-content(cols='3', placeholder=env.t('challengeDescr'), ng-model='challenge.description')
.form-group
input.form-control(type='text', ng-model='challenge.name')
.form-group
input.form-control(type='text', minlength="3", maxlength="16", ng-model='challenge.shortName', placeholder=env.t('challengeTag'), required)
.form-group
textarea.form-control(cols='3', placeholder=env.t('challengeDescr'), ng-model='challenge.description')
hr
.well(bindonce='challenge', ng-if='challenge.description')
markdown(ng-model='challenge.description')
i.icon-question-sign(popover=env.t('challengeDiscription'), popover-trigger='mouseenter', popover-placement='right')
span.glyphicon.glyphicon-question-sign(popover=env.t('challengeDiscription'), popover-trigger='mouseenter', popover-placement='right')
habitrpg-tasks(obj='challenge', main=false)
// Member List
@ -62,94 +64,103 @@ script(type='text/ng-template', id='partials/options.social.challenges.detail.ht
div(ui-view)
script(type='text/ng-template', id='partials/options.social.challenges.html')
.row-fluid
.span2.well#challenges-filters
h3=env.t('filter') + ':'
h4=env.t('groups')
ul.unstyled
a.btn.btn-mini.pull-left(ng-click='selectAll()')=env.t('all')
a.btn.btn-mini(ng-click='selectNone()')=env.t('none')
br
label.checkbox(ng-repeat='group in groupsFilter')
input(type='checkbox', ng-model='search.group[group._id]')
| {{group.name}}
h4=env.t('membership')
label.radio
input(type='radio', name='search-participation-radio', ng-click='search._isMember = true')
=env.t('participating')
label.radio
input(type='radio', name='search-participation-radio', ng-click='search._isMember = false')
=env.t('notParticipating')
label.radio
input(type='radio', name='search-participation-radio', ng-click='search._isMember = undefined', checked='checked')
=env.t('either')
.span10
// Creation form
button.btn.btn-success#create-challenge-btn(ng-click='create()', ng-hide='newChallenge')=env.t('createChallenge')
.create-challenge-from.well(ng-if='newChallenge')
form(ng-submit='save(newChallenge)')
div
input.btn.btn-success(type='submit', value=env.t('save'))
input.btn.btn-danger(type='button', ng-click='discard()', value=env.t('discard'))
select(ng-model='newChallenge.group', ng-required='required', name='Group', ng-options='g._id as g.name for g in groups')
.challenge-options
input.option-content(type='text', ng-model='newChallenge.name', placeholder=env.t('challengeTitle'), required='required')
.container-fluid
.row
.col-md-2.well#challenges-filters
h3=env.t('filter') + ':'
h4=env.t('groups')
ul.list-unstyled
a.btn.btn-mini.pull-left(ng-click='selectAll()')=env.t('all')
a.btn.btn-mini(ng-click='selectNone()')=env.t('none')
br
.checkbox(ng-repeat='group in groupsFilter')
label
input(type='checkbox', ng-model='search.group[group._id]')
| {{group.name}}
h4=env.t('membership')
.radio
label
input(type='radio', name='search-participation-radio', ng-click='search._isMember = true')
=env.t('participating')
.radio
label
input(type='radio', name='search-participation-radio', ng-click='search._isMember = false')
=env.t('notParticipating')
.radio
label
input(type='radio', name='search-participation-radio', ng-click='search._isMember = undefined', checked='checked')
=env.t('either')
.col-md-10
// Creation form
button.btn.btn-success#create-challenge-btn(ng-click='create()', ng-hide='newChallenge')=env.t('createChallenge')
.create-challenge-from.well(ng-if='newChallenge')
form(ng-submit='save(newChallenge)')
div
input.btn.btn-success(type='submit', value=env.t('save'))
input.btn.btn-danger(type='button', ng-click='discard()', value=env.t('discard'))
select(ng-model='newChallenge.group', ng-required='required', name='Group', ng-options='g._id as g.name for g in groups')
.challenge-options
.form-group
input.form-control(type='text', ng-model='newChallenge.name', placeholder=env.t('challengeTitle'), required='required')
.option-medium
input.option-content(type='text', minlength="3", maxlength="16", ng-model='newChallenge.shortName', placeholder=env.t('challengeTag'), required)
a(target='_blank', href='http://habitrpg.wikia.com/wiki/Tags')
i.icon-question-sign(popover=env.t('challengeTagPop'), popover-trigger='mouseenter', popover-placement='right')
.form-group
input.form-control(type='text', minlength="3", maxlength="16", ng-model='newChallenge.shortName', placeholder=env.t('challengeTag'), required)
a(target='_blank', href='http://habitrpg.wikia.com/wiki/Tags')
span.glyphicon.glyphicon-question-sign(popover=env.t('challengeTagPop'), popover-trigger='mouseenter', popover-placement='right')
textarea.option-content(cols='3', placeholder=env.t('challengeDescr'), ng-model='newChallenge.description')
.form-group
textarea.form-control(cols='3', placeholder=env.t('challengeDescr'), ng-model='newChallenge.description')
//- what's going on here?
br
br
//- what's going on here?
br
br
.option-medium
input.option-content(type='number', min="{{newChallenge.group=='habitrpg' ? 1 : 0}}", max="{{maxPrize}}", ng-model='newChallenge.prize', placeholder=env.t('prize'))
span.input-suffix.Pet_Currency_Gem1x.inline-gems
i.icon-question-sign(popover=env.t('prizePop'), popover-trigger='mouseenter', popover-placement='right')
span(ng-show='newChallenge.group=="habitrpg"')
!=env.t('publicChallenges')
.form-group
input.form-control(type='number', min="{{newChallenge.group=='habitrpg' ? 1 : 0}}", max="{{maxPrize}}", ng-model='newChallenge.prize', placeholder=env.t('prize'))
span.input-suffix.Pet_Currency_Gem1x.inline-gems
span.glyphicon.glyphicon-question-sign(popover=env.t('prizePop'), popover-trigger='mouseenter', popover-placement='right')
span(ng-show='newChallenge.group=="habitrpg"')
!=env.t('publicChallenges')
.option-medium(ng-if='user.contributor.admin')
label.checkbox
input(type='checkbox', ng-model='newChallenge.official')
=env.t('officialChallenge')
.form-group(ng-if='user.contributor.admin')
.checkbox
label
input(type='checkbox', ng-model='newChallenge.official')
=env.t('officialChallenge')
habitrpg-tasks(main=false, obj='newChallenge')
habitrpg-tasks(main=false, obj='newChallenge')
// Challenges list
.accordion-group(ng-repeat='challenge in challenges|filter:filterChallenges')
.accordion-heading
ul.pull-right.challenge-accordion-header-specs
li(ng-if='challenge.official')
span.label.label-success=env.t('officialChallenge')
li {{challenge.group.name}}
li
=env.t('by')
strong {{challenge.leader.profile.name}}
li
| {{challenge.memberCount}}
= ' ' + env.t('participants')
li(ng-show='challenge.prize')
// prize
table(ng-show='challenge.prize')
tr
td {{challenge.prize}}
td
.Pet_Currency_Gem1x(style='margin-left:0px')
td=env.t('prize')
li
// leave / join
a.btn.btn-small.btn-danger(ng-show='challenge._isMember', ng-click='clickLeave(challenge, $event)')
i.icon-ban-circle
=env.t('leave')
a.btn.btn-small.btn-success(ng-hide='challenge._isMember', ng-click='join(challenge)')
i.icon-ok
=env.t('join')
a.accordion-toggle(ng-click='toggle(challenge._id)') {{challenge.name}}
.accordion-body(ng-class='{collapse: !$stateParams.cid == challenge._id}')
.accordion-inner(ng-if='$stateParams.cid == challenge._id')
div(ui-view)
// Challenges list
.panel-group
.panel.panel-default(ng-repeat='challenge in challenges|filter:filterChallenges')
.panel-heading
ul.pull-right.challenge-accordion-header-specs
li(ng-if='challenge.official')
span.label.label-success=env.t('officialChallenge')
li {{challenge.group.name}}
li
=env.t('by')
strong {{challenge.leader.profile.name}}
li
| {{challenge.memberCount}}
= ' ' + env.t('participants')
li(ng-show='challenge.prize')
// prize
table(ng-show='challenge.prize')
tr
td {{challenge.prize}}
td
.Pet_Currency_Gem1x(style='margin-left:0px')
td=env.t('prize')
li
// leave / join
a.btn.btn-small.btn-danger(ng-show='challenge._isMember', ng-click='clickLeave(challenge, $event)')
span.glyphicon.glyphicon-ban-circle
=env.t('leave')
a.btn.btn-small.btn-success(ng-hide='challenge._isMember', ng-click='join(challenge)')
span.glyphicon.glyphicon-ok
=env.t('join')
a.accordion-toggle(ng-click='toggle(challenge._id)') {{challenge.name}}
.panel-body(ng-class='{collapse: !$stateParams.cid == challenge._id}')
.accordion-inner(ng-if='$stateParams.cid == challenge._id')
div(ui-view)

View file

@ -1,16 +1,14 @@
form.chat-form(ng-submit='postChat(group,message.content)')
.-options
//FIXME ng-model makes this painfully slow! using jquery for now, which is really non-angular-like
.control-group.option-large(ng-controller='AutocompleteCtrl')
textarea.chat-textarea.option-content(style='height:6em;', ui-keypress='{13:"postChat(group,message.content)"}', ng-model='message.content', updateinterval='250', flag='@', at-user, auto-complete)
span.user-list(ng-show='!isAtListHidden')
ul.list-at-user
li(bindonce='response', ng-repeat='user in response | filter:query.text | limitTo: 5', ng-click='autoComplete(user)')
span.username.label(class='label-contributor-{{user.contributor.level}}', ng-class='{"label-npc": user.backer.npc}') {{user.user}}
table.pull-right
tr
td
input.btn.chat-btn(type='submit', value=env.t('sendChat'), ng-class='{disabled: _sending == true}')
td
button.btn(type="button", ng-click='sync(group)', tooltip=env.t('toolTipMsg'))
i(class='pull-right icon-refresh')
div(ng-controller='AutocompleteCtrl')
textarea.form-control(rows=4, ui-keypress='{13:"postChat(group,message.content)"}', ng-model='message.content', updateinterval='250', flag='@', at-user, auto-complete)
span.user-list(ng-show='!isAtListHidden')
ul.list-at-user
li(bindonce='response', ng-repeat='user in response | filter:query.text | limitTo: 5', ng-click='autoComplete(user)')
span.username.label(class='label-contributor-{{user.contributor.level}}', ng-class='{"label-npc": user.backer.npc}') {{user.user}}
.row
.col-md-9
include ../../shared/formatting-help
.col-md-3
input.btn.btn-default.chat-btn(type='submit', value=env.t('sendChat'), ng-class='{disabled: _sending == true}')
button.btn.btn-default(type="button", ng-click='sync(group)', tooltip=env.t('toolTipMsg'))
span.glyphicon.glyphicon-refresh.pull-right

View file

@ -1,14 +1,14 @@
li.chat-message(bindonce='group.chat', ng-repeat='message in group.chat', bo-class='{highlight: isUserMentioned(user,message), "own-message": user._id == message.uuid}')
div(class='scrollable-message')
a.label.chat-message(class='hidden-label')
a.label.label-default.chat-message(class='hidden-label')
span {{message.user}}&nbsp;
markdown(ng-model='message.text', style='padding:0px 3px')
| -
span.muted.time(from-now='message.timestamp',style='padding:0px 3px')
span(style='padding:0px 3px')
a.label(ng-show='countExists(message.likes)',ng-class='{"label-success":message.likes[user._id]}',ng-click='likeChatMessage(group,message)') +{{countExists(message.likes)}}
a.chat-plus-one.muted(ng-show='!countExists(message.likes)',ng-click='likeChatMessage(group,message)',style='background-color:#eee;padding:3px 3px 0px 3px') +1
a.chat-plus-one.muted(ng-show='!countExists(message.likes)',ng-click='likeChatMessage(group,message)') +1
a(bo-show='user.contributor.admin || message.uuid == user.id', ng-click='deleteChatMessage(group, message)',style='padding: 0px 3px')
i.icon-trash(tooltip=env.t('delete'))
a.label.chat-message(bo-show='message.user', class='float-label', bo-class='{"label-npc": message.backer.npc, "label-contributor-{{message.contributor.level}}":message.contributor.level}', ng-click='clickMember(message.uuid, true)')
span.glyphicon.glyphicon-trash(tooltip=env.t('delete'))
a.label.label-default.chat-message(bo-show='message.user', class='float-label', bo-class='{"label-npc": message.backer.npc, "label-contributor-{{message.contributor.level}}":message.contributor.level}', ng-click='clickMember(message.uuid, true)')
span(tooltip='{{contribText(message.contributor, message.backer)}}') {{message.user}}&nbsp;

View file

@ -1,27 +1,27 @@
form.form-horizontal(ng-submit='create(newGroup)')
.control-group.whatever-options
.control-group
label.control-label(for='new-group-name')
| {{text}}&nbsp;
=env.t('name')
.controls
input#new-group-name.input-medium.option-content(required, type='text', placeholder='{{text}} Name', ng-model='newGroup.name')
.control-group
label.control-label(for='new-group-description')=env.t('description')
.controls
textarea#new-group-description.option-content(cols='3', placeholder=env.t('description'), ng-model='newGroup.description')
.control-group(ng-show='type=="guild"')
.controls
label.radio
input(type='radio', name='new-group-privacy', value='public', ng-model='newGroup.privacy')
=env.t('public')
label.radio
input(type='radio', name='new-group-privacy', value='private', ng-model='newGroup.privacy')
=env.t('inviteOnly')
input.btn(type='submit', ng-disabled='!newGroup.privacy && !newGroup.name', value=env.t('create'))
.container-fluid
.row
form.col-md-12.form-horizontal(ng-submit='create(newGroup)')
.form-group
label.control-label(for='new-group-name')
| {{text}}&nbsp;
=env.t('name')
input.form-control#new-group-name.input-medium.option-content(required, type='text', placeholder='{{text}} Name', ng-model='newGroup.name')
.form-group
label(for='new-group-description')=env.t('description')
textarea.form-control#new-group-description.option-content(cols='3', placeholder=env.t('description'), ng-model='newGroup.description')
.form-group(ng-show='type=="guild"')
.radio
label
input(type='radio', name='new-group-privacy', value='public', ng-model='newGroup.privacy')
=env.t('public')
.radio
label
input(type='radio', name='new-group-privacy', value='private', ng-model='newGroup.privacy')
=env.t('inviteOnly')
br
input.btn.btn-default(type='submit', ng-disabled='!newGroup.privacy && !newGroup.name', value=env.t('create'))
span.gem-cost= '4 ' + env.t('gems')
p
small=env.t('gemCost')
.control-group(ng-show='type=="party"')
.controls
input.btn(type='submit', value=env.t('create'))
.form-group(ng-show='type=="party"')
input.btn.btn-default.form-control(type='submit', value=env.t('create'))

View file

@ -4,174 +4,177 @@ a.pull-right.gem-wallet(popover-trigger='mouseenter', popover-title=env.t('guild
.Pet_Currency_Gem2x.Gems
| {{group.balance * 4 | number:0 }}
=env.t('guildGems')
.row-fluid
.span4
.container-fluid
.row
.col-md-4
// ------ Bosses -------
.modal.inline-modal(bindonce='group', ng-if='group.type==="party" && group.quest.key')
.modal-header
h3(ng-if='group.quest.active==false')=env.t('questInvitation') + '{{Content.quests[group.quest.key].text}}'
h3(ng-if='group.quest.active==true') {{Content.quests[group.quest.key].text}}
.modal-body
div(ng-if='group.quest.active==false')
table.table.table-striped
tr(ng-repeat='member in group.members')
td {{member.profile.name}}
td {{group.quest.members[member._id] === true ? env.t('accepted') : group.quest.members[member._id] === false ? env.t('rejected') : env.t('pending')}}
hr
.npc_ian.pull-left
p=env.t('questStart')
button.btn.btn-small.btn-warning(ng-if='!group.quest.leader || group.quest.leader==user._id', ng-click='party.$questAccept({"force":true})')=env.t('begin')
//-TODO Cancel button
//-TODO Both force-start & cancel should only be available to quest-initiator
div(ng-if='group.quest.active==true')
div(ng-if='Content.quests[group.quest.key].boss')
div(class="quest_{{group.quest.key}}")
//-
.progress(style="height:10px")
.bar(style='width: {{Shared.percent(group.quest.hp, Content.quests[group.quest.key].hp)}}%;')
span.meter-text
i.icon-heart
| {{group.quest.hp | number:0}} / {{Content.quests[group.quest.key].hp}}
.hero-stats
.meter.health(title=env.t('bossHP'))
.bar(style='width: {{Shared.percent(group.quest.progress.hp, Content.quests[group.quest.key].boss.hp)}}%;')
span.meter-text
i.icon-heart
| {{group.quest.progress.hp | number:0}} / {{Content.quests[group.quest.key].boss.hp}}
div(ng-if='Content.quests[group.quest.key].collect')
h4=env.t('collected') + ':'
// ------ Bosses -------
.panle.panel-default(bindonce='group', ng-if='group.type==="party" && group.quest.key')
.panel-heading
h3.panel-title(ng-if='group.quest.active==false')=env.t('questInvitation') + '{{Content.quests[group.quest.key].text}}'
h3.panel-title(ng-if='group.quest.active==true') {{Content.quests[group.quest.key].text}}
.panel-body
div(ng-if='group.quest.active==false')
table.table.table-striped
tr(ng-repeat='(k,v) in group.quest.progress.collect', class='quest_collected_{{v >= Content.quests[group.quest.key].collect[k].count}}')
td
div.pull-left(class='quest_{{group.quest.key}}_{{k}}')
| {{Content.quests[group.quest.key].collect[k].text}}
td
{{v}} / {{Content.quests[group.quest.key].collect[k].count}}
tr(ng-repeat='member in group.members')
td {{member.profile.name}}
td {{group.quest.members[member._id] === true ? env.t('accepted') : group.quest.members[member._id] === false ? env.t('rejected') : env.t('pending')}}
hr
.npc_ian.pull-left
p=env.t('questStart')
button.btn.btn-small.btn-warning(ng-if='!group.quest.leader || group.quest.leader==user._id', ng-click='party.$questAccept({"force":true})')=env.t('begin')
//-TODO Cancel button
//-TODO Both force-start & cancel should only be available to quest-initiator
div(ng-bind-html='Content.quests[group.quest.key].notes')
div(ng-if='group.quest.active==true')
div(ng-if='Content.quests[group.quest.key].boss')
div(class="quest_{{group.quest.key}}")
//-
.progress(style="height:10px")
.bar(style='width: {{Shared.percent(group.quest.hp, Content.quests[group.quest.key].hp)}}%;')
span.meter-text
span.glyphicon.glyphicon-heart
| {{group.quest.hp | number:0}} / {{Content.quests[group.quest.key].hp}}
.hero-stats
.meter.health(title=env.t('bossHP'))
.bar(style='width: {{Shared.percent(group.quest.progress.hp, Content.quests[group.quest.key].boss.hp)}}%;')
span.meter-text
span.glyphicon.glyphicon-heart
| {{group.quest.progress.hp | number:0}} / {{Content.quests[group.quest.key].boss.hp}}
div(ng-if='Content.quests[group.quest.key].collect')
h4=env.t('collected') + ':'
table.table.table-striped
tr(ng-repeat='(k,v) in group.quest.progress.collect', class='quest_collected_{{v >= Content.quests[group.quest.key].collect[k].count}}')
td
div.pull-left(class='quest_{{group.quest.key}}_{{k}}')
| {{Content.quests[group.quest.key].collect[k].text}}
td
{{v}} / {{Content.quests[group.quest.key].collect[k].count}}
div(ng-bind-html='Content.quests[group.quest.key].notes')
hr
h5=env.t('participants')
table.table.table-striped
tr(ng-repeat='(k,v) in group.members', ng-show='group.quest.members[v._id]')
td {{v.profile.name}}
quest-rewards(key='{{group.quest.key}}')
div(ng-if='Content.quests[group.quest.key].boss')
.npc_ian.pull-left
p!=env.t('bossDmg1')
br
p=env.t('bossDmg2')
div(ng-if='Content.quests[group.quest.key].collect')
.npc_ian.pull-left
p=env.t('bossColl1')
br
p=env.t('bossColl2')
button.btn.btn-mini.btn-danger(ng-if='!group.quest.leader || group.quest.leader==user._id', ng-click='questAbort()')=env.t('abort')
// ------ Information -------
.panel.panel-default
.panel-heading(bindonce='group')
h3.panel-title
| {{group.name}}
span(ng-if='group.leader == user.id')
button.btn.btn-primary.pull-right(ng-click='save(group)', ng-show='group._editing')=env.t('save')
button.btn.btn-default.pull-right(ng-click='group._editing = true', ng-hide='group._editing')=env.t('editGroup')
.panel-body
form(ng-show='group._editing')
.form-group
label=env.t('groupName')
input.form-control(type='text', ng-model='group.name', placeholder=env.t('groupName'))
.form-group
label=env.t('description')
textarea.form-control(rows=6, ng-model='group.description')
include ../../shared/formatting-help
.form-group
label=env.t('logoUrl')
input.form-control(type='url', placeholder=env.t('logoUrl'), ng-model='group.logo')
h4=env.t('assignLeader')
select#group-leader-selection(ng-model='group._newLeader', ng-options='member.profile.name for member in group.members')
div(ng-show='!group._editing')
img.pull-right(ng-show='group.logo', style='max-width:150px', ng-src='{{group.logo}}')
markdown(ng-model='group.description')
hr
h5=env.t('participants')
small.muted Group ID: {{group._id}}
include ./challenge-box
// ------ Members -------
.panel.panel-default
.panel-heading
h3.panel-title=env.t('members')
.panel-body
span
=env.t('partyList')
select#partyOrder(
style='width:140px',
ng-model='user.party.order',
ng-controller='ChatCtrl',
ng-options='k as v for (k , v) in partyOrderChoices',
ng-change='set({"party.order": user.party.order})'
)
table.table.table-striped(bindonce='group')
tr(ng-repeat='member in group.members')
td
// allow leaders to ban members
div(ng-show='group.leader == user.id && user.id!=member._id')
a(ng-click='removeMember(group, member, true)')
span.glyphicon.glyphicon-ban-circle(tooltip=env.t('banTip'))
a
span(ng-class='{"badge badge-info": group.leader==member._id}', ng-click='clickMember(member._id, true)')
| {{member.profile.name}}
tr(ng-if='group.memberCount > group.members.length')
td
|<span class='badge'>{{group.memberCount - group.members.length}}
= ' ' + env.t('moreMembers')
|</span>
h4(ng-show='group.invites.length > 0')=env.t('invited')
table.table.table-striped
tr(ng-repeat='(k,v) in group.members', ng-show='group.quest.members[v._id]')
td {{v.profile.name}}
quest-rewards(key='{{group.quest.key}}')
div(ng-if='Content.quests[group.quest.key].boss')
.npc_ian.pull-left
p!=env.t('bossDmg1')
br
p=env.t('bossDmg2')
div(ng-if='Content.quests[group.quest.key].collect')
.npc_ian.pull-left
p=env.t('bossColl1')
br
p=env.t('bossColl2')
tr(ng-repeat='invite in group.invites')
td
// allow leaders to ban members
div(ng-show='group.leader == user.id')
a(ng-click='removeMember(group, invite, false)')
span.glyphicon.glyphicon-ban-circle(tooltip=env.t('banTip'))
a
span(ng-click='clickMember(invite._id, true)')
| {{invite.profile.name}}
.panel-footer
form.form-inline(ng-submit='invite(group)')
//.alert.alert-danger(ng-show='_groupError') {{_groupError}}
.form-group
input.form-control(type='text', placeholder=env.t('userId'), ng-model='group.invitee')
&nbsp;
input.btn.btn-default(type='submit', value=env.t('invite'))
button.btn.btn-mini.btn-danger(ng-if='!group.quest.leader || group.quest.leader==user._id', ng-click='questAbort()')=env.t('abort')
a.btn.btn-danger(data-id='{{group.id}}', ng-click='clickLeave(group, $event)')=env.t('leave')
// ------ Information -------
.modal.inline-modal
.modal-header(bindonce='group')
span(ng-if='group.leader == user.id')
button.btn.btn-primary.pull-right(ng-click='save(group)', ng-show='group._editing')=env.t('save')
button.btn.btn-default.pull-right(ng-click='group._editing = true', ng-hide='group._editing')=env.t('editGroup')
h3 {{group.name}}
.modal-body
div.whatever-options(ng-show='group._editing')
.control-group.option-large
label.control-labe=env.t('groupName')
input.option-content(type='text', ng-model='group.name', placeholder=env.t('groupName'))
.control-group.option-large
label.control-label=env.t('description')
textarea.option-content(style='height:15em;', placeholder=env.t('groupDescr'), ng-model='group.description')
.control-group.option-large
label.control-label=env.t('logoUrl')
input.option-content(type='url', placeholder=env.t('logoUrl'), ng-model='group.logo')
.col-md-8
div()
textarea.form-control(ng-show='group._editing', rows=6, placeholder=env.t('leaderMsg'), ng-model='group.leaderMessage')
table(ng-show='group.leaderMessage')
tr
td
.popover.static-popover.fade.right.in.wide-popover
.arrow
h3.popover-title {{Members.members[group.leader].profile.name}}
.popover-content
markdown(ng-model='group.leaderMessage')
div(ng-controller='ChatCtrl')
h3=env.t('chat')
include ./chat-box
h4=env.t('assignLeader')
select#group-leader-selection(ng-model='group._newLeader', ng-options='member.profile.name for member in group.members')
div(ng-show='!group._editing')
img.pull-right(ng-show='group.logo', style='max-width:150px', ng-src='{{group.logo}}')
markdown(ng-model='group.description')
hr
small.muted Group ID: {{group._id}}
include ./challenge-box
// ------ Members -------
.modal.inline-modal
.modal-header
h3=env.t('members')
.modal-body
span
=env.t('partyList')
select#partyOrder(
style='width:140px',
ng-model='user.party.order',
ng-controller='ChatCtrl',
ng-options='k as v for (k , v) in partyOrderChoices',
ng-change='set({"party.order": user.party.order})'
)
table.table.table-striped(bindonce='group')
tr(ng-repeat='member in group.members')
td
// allow leaders to ban members
div(ng-show='group.leader == user.id && user.id!=member._id')
a(ng-click='removeMember(group, member, true)')
i.icon-ban-circle(tooltip=env.t('banTip'))
a
span(ng-class='{"badge badge-info": group.leader==member._id}', ng-click='clickMember(member._id, true)')
| {{member.profile.name}}
tr(ng-if='group.memberCount > group.members.length')
td
|<span class='badge'>{{group.memberCount - group.members.length}}
= ' ' + env.t('moreMembers')
|</span>
h4(ng-show='group.invites.length > 0')=env.t('invited')
table.table.table-striped
tr(ng-repeat='invite in group.invites')
td
// allow leaders to ban members
div(ng-show='group.leader == user.id')
a(ng-click='removeMember(group, invite, false)')
i.icon-ban-circle(tooltip=env.t('banTip'))
a
span(ng-click='clickMember(invite._id, true)')
| {{invite.profile.name}}
.modal-footer.whatever-options
form.form-inline(ng-submit='invite(group)')
//.alert.alert-danger(ng-show='_groupError') {{_groupError}}
.control-group.option-large
input.option-content(type='text', placeholder=env.t('userId'), ng-model='group.invitee')
input.btn(type='submit', value=env.t('invite'))
a.btn.btn-danger(data-id='{{group.id}}', ng-click='clickLeave(group, $event)')=env.t('leave')
.span8
div.blah-options(ng-show='group._editing')
.option-large
textarea.option-content(style='height:15em;', placeholder=env.t('leaderMsg'), ng-model='group.leaderMessage')
table(ng-show='group.leaderMessage')
tr
td
.popover.static-popover.fade.right.in.wide-popover
.arrow
h3.popover-title {{Members.members[group.leader].profile.name}}
.popover-content
markdown(ng-model='group.leaderMessage')
div(ng-controller='ChatCtrl')
h3=env.t('chat')
include ./chat-box
include ../../shared/formatting-help
ul.unstyled.tavern-chat
include ./chat-message
ul.list-unstyled.tavern-chat
include ./chat-message

View file

@ -12,83 +12,83 @@ script(type='text/ng-template', id='partials/options.social.hall.html')
div(ui-view)
script(type='text/ng-template', id='partials/options.social.hall.heroes.html')
div.well(ng-if='user.contributor.admin')
.well(ng-if='user.contributor.admin')
h2=env.t('rewardUser')
form.form-horizontal(ng-submit='loadHero(_heroID)')
.-options
.option-group.option-large
input.option-content(type='text', ng-model='_heroID', placeholder=env.t('UUID'))
button.btn(type='submit')=env.t('loadUser')
.form-group
input.form-control(type='text', ng-model='_heroID', placeholder=env.t('UUID'))
input.btn.btn-default(type='submit')=env.t('loadUser')
form.form-horizontal(ng-show='hero', ng-submit='saveHero(hero)')
h3 {{hero.profile.name}}
.-options
.control-group.option-large
input.option-content(type='text', ng-model='hero.contributor.text', placeholder=env.t('contribTitle'))
.control-group.option-medium
input.option-content(type='number', step="any", ng-model='hero.contributor.level')
span.input-suffix=env.t('contribLevel')
br
small=env.t('contribHallText')
a(target='_blank', href='https://trello.com/c/wkFzONhE/277-contributor-gear')=env.t('moreDetails')
.control-group.option-large
textarea.option-content(style='height:15em;', placeholder=env.t('contributions'), ng-model='hero.contributor.contributions')
//-include ../../shared/formatting-help
.control-group.option-medium
label.checkbox
.form-group
input.form-control(type='text', ng-model='hero.contributor.text', placeholder=env.t('contribTitle'))
.form-group
input.form-control(type='number', step="any", ng-model='hero.contributor.level')
span.input-suffix=env.t('contribLevel')
br
small=env.t('contribHallText')
a(target='_blank', href='https://trello.com/c/wkFzONhE/277-contributor-gear')=env.t('moreDetails')
.form-group
textarea.form-control(style='height:15em;', placeholder=env.t('contributions'), ng-model='hero.contributor.contributions')
//-include ../../shared/formatting-help
.form-group
.checkbox
label
input(type='checkbox', ng-model='hero.contributor.admin')
=env.t('admin')
hr
.control-group.option-medium
input.option-content(type='number', step="any", ng-model='hero.balance')
.form-group
input.form-control(type='number', step="any", ng-model='hero.balance')
span.input-suffix=env.t('balance')
p
small!= '`user.balance`' + env.t('notGems')
.control-group.option-medium
label.checkbox
input(type='checkbox', ng-model='hero.purchased.ads')
=env.t('hideAds')
.form-group
.checkbox
label
input(type='checkbox', ng-model='hero.purchased.ads')
=env.t('hideAds')
// h4 Backer Status
// Add backer stuff like tier, disable adds, etcs
button.btn-primary(type='submit')=env.t('save')
input.btn.btn-primary(type='submit')=env.t('save')
table.table.table-striped
tr
thead
tr
th=env.t('name')
th(ng-if='user.contributor.admin')=env.t('UUID')
th=env.t('contribLevel')
th=env.t('title')
th=env.t('contributions')
tr(ng-repeat='hero in heroes')
td
span(ng-if='hero.contributor.admin',popover=env.t('gamemaster'),popover-trigger='mouseenter',popover-placement='right')
a.label(class='label-contributor-{{hero.contributor.level}}', ng-class='{"label-npc": hero.backer.npc}', ng-click='clickMember(hero._id, true)')
| {{hero.profile.name}}&nbsp;
i.icon-star.icon-white
span(ng-if='!hero.contributor.admin')
a.label(class='label-contributor-{{hero.contributor.level}}', ng-class='{"label-npc": hero.backer.npc}', ng-click='clickMember(hero._id, true)') {{hero.profile.name}}
td(ng-if='user.contributor.admin') {{hero._id}}
td {{hero.contributor.level}}
td {{hero.contributor.text}}
td
markdown(ng-model='hero.contributor.contributions', target='_blank')
thead
tr
th=env.t('name')
th(ng-if='user.contributor.admin')=env.t('UUID')
th=env.t('contribLevel')
th=env.t('title')
th=env.t('contributions')
tbody
tr(ng-repeat='hero in heroes')
td
span(ng-if='hero.contributor.admin',popover=env.t('gamemaster'),popover-trigger='mouseenter',popover-placement='right')
a.label(class='label-contributor-{{hero.contributor.level}}', ng-class='{"label-npc": hero.backer.npc}', ng-click='clickMember(hero._id, true)')
| {{hero.profile.name}}&nbsp;
span.glyphicon.glyphicon-star
span(ng-if='!hero.contributor.admin')
a.label(class='label-contributor-{{hero.contributor.level}}', ng-class='{"label-npc": hero.backer.npc}', ng-click='clickMember(hero._id, true)') {{hero.profile.name}}
td(ng-if='user.contributor.admin') {{hero._id}}
td {{hero.contributor.level}}
td {{hero.contributor.text}}
td
markdown(ng-model='hero.contributor.contributions', target='_blank')
script(type='text/ng-template', id='partials/options.social.hall.patrons.html')
table.table.table-striped(infinite-scroll="loadMore()")
tr
thead
tr
th=env.t('name')
th(ng-if='user.contributor.admin')=env.t('UUID')
th=env.t('backerTier')
tr(ng-repeat='patron in patrons')
td
a.label(class='label-contributor-{{patron.contributor.level}}', ng-class='{"label-npc": patron.backer.npc}', ng-click='clickMember(patron._id, true)') {{patron.profile.name}}
td(ng-if='user.contributor.admin') {{patron._id}}
td {{patron.backer.tier}}
thead
tr
th=env.t('name')
th(ng-if='user.contributor.admin')=env.t('UUID')
th=env.t('backerTier')
tbody
tr(ng-repeat='patron in patrons')
td
a.label(class='label-contributor-{{patron.contributor.level}}', ng-class='{"label-npc": patron.backer.npc}', ng-click='clickMember(patron._id, true)') {{patron.profile.name}}
td(ng-if='user.contributor.admin') {{patron._id}}
td {{patron.backer.tier}}

View file

@ -7,7 +7,6 @@ include ./hall.jade
script(type='text/ng-template', id='partials/options.social.tavern.html')
include ./tavern
script(type='text/ng-template', id='partials/options.social.party.html')
div(ng-show='group._id')
include ./group
@ -30,8 +29,8 @@ script(type='text/ng-template', id='partials/options.social.guilds.public.html')
a.btn.btn-success(data-type='guild', ng-click='join(invitation)')=env.t('accept')
a.btn.btn-danger(ng-click='reject(invitation)')=env.t('reject')
// Public Groups
.options-group.option-large.whatever-options
input.option-content(type='text',ng-model='guildSearch', placeholder=env.t('search'))
.col-md-3
input.form-control(type='text',ng-model='guildSearch', placeholder=env.t('search'))
table.table.table-striped
tr(ng-repeat='group in groups.public | filter:guildSearch')
td
@ -40,10 +39,10 @@ script(type='text/ng-template', id='partials/options.social.guilds.public.html')
li
// join / leave
a.btn.btn-small.btn-danger(ng-show='group._isMember', ng-click='clickLeave(group, $event)')
i.icon-ban-circle
span.glyphicon.glyphicon-ban-circle
=env.t('leave')
a.btn.btn-small.btn-success(ng-hide='group._isMember', ng-click='join(group)')
i.icon-ok
span.glyphicon.glyphicon-ok
=env.t('join')
h4 {{group.name}}
p {{group.description}}
@ -74,7 +73,7 @@ script(type='text/ng-template', id='partials/options.social.html')
ul.nav.nav-tabs
li(ng-class="{ active: $state.includes('options.social.tavern') }")
a(ui-sref='options.social.tavern')
i.icon-eye-close
span.glyphicon.glyphicon-eye-close
=env.t('tavern')
li(ng-class="{ active: $state.includes('options.social.party') }")
a(ui-sref='options.social.party')
@ -84,11 +83,11 @@ script(type='text/ng-template', id='partials/options.social.html')
=env.t('guilds')
li(ng-class="{ active: $state.includes('options.social.challenges') }")
a(ui-sref='options.social.challenges')
i.icon-bullhorn
span.glyphicon.glyphicon-bullhorn
=env.t('challenges')
li(ng-class="{ active: $state.includes('options.social.hall') }")
a(ui-sref='options.social.hall')
i.icon-flag
span.glyphicon.glyphicon-flag
=env.t('hall')
.tab-content

View file

@ -1,127 +1,125 @@
.row-fluid
.span4
.tavern-pane
table
tr
td
.npc_daniel
td
.popover.static-popover.fade.right.in
.arrow
h3.popover-title
a(target='_blank', href='http://www.kickstarter.com/profile/2014640723')=env.t('daniel')
.popover-content
=env.t('danielText')
div
button.btn.btn-large.btn-success(ng-class='{active: user.preferences.sleep}', ng-click='User.user.ops.sleep({})')
span(ng-show='user.preferences.sleep')=env.t('innCheckOut')
span(ng-hide='user.preferences.sleep')=env.t('innCheckIn')
.alert.alert-info(ng-show='user.preferences.sleep')
=env.t('innText')
.container-fluid
.row
.col-md-4
.tavern-pane
table
tr
td
.npc_daniel
td
.popover.static-popover.fade.right.in
.arrow
h3.popover-title
a(target='_blank', href='http://www.kickstarter.com/profile/2014640723')=env.t('daniel')
.popover-content
=env.t('danielText')
div
button.btn.btn-large.btn-success(ng-class='{active: user.preferences.sleep}', ng-click='User.user.ops.sleep({})')
span(ng-show='user.preferences.sleep')=env.t('innCheckOut')
span(ng-hide='user.preferences.sleep')=env.t('innCheckIn')
.alert.alert-info(ng-show='user.preferences.sleep')
=env.t('innText')
// Resources
.modal(style='position: relative;top: auto;left: auto;right: auto;margin: 0 auto 20px;z-index: 1;max-width: 100%;')
.modal-header
h3=env.t('resources')
.modal-body
table.table.table-striped
tr
td
a(target='_blank', href='http://habitrpg.wikia.com/wiki/Board:The_Archery_-_LFG')=env.t('lfgPosts')
tr
td
a(target='_blank', href='https://vimeo.com/57654086')=env.t('tutorial')
tr
td
a(target='_blank', href='http://habitrpg.wikia.com/wiki/FAQ')=env.t('FAQ')
tr
td
a(target='_blank', href='http://habitrpg.wikia.com/wiki/Glossary')=env.t('glossary')
tr
td
a(target='_blank', href='https://github.com/HabitRPG/habitrpg/issues')=env.t('reportAP')
tr
td
a(target='_blank', href='https://trello.com/c/8gzGlle8')=env.t('requestAF')
tr
td
a(target='_blank', href='http://habitrpg.wikia.com/wiki/Special:Forum')=env.t('community')
// Resources
.panel.panel-default
.panel-heading
h3.panel-title=env.t('resources')
.panel-body
table.table.table-striped
tr
td
a(target='_blank', href='http://habitrpg.wikia.com/wiki/Board:The_Archery_-_LFG')=env.t('lfgPosts')
tr
td
a(target='_blank', href='https://vimeo.com/57654086')=env.t('tutorial')
tr
td
a(target='_blank', href='http://habitrpg.wikia.com/wiki/FAQ')=env.t('FAQ')
tr
td
a(target='_blank', href='http://habitrpg.wikia.com/wiki/Glossary')=env.t('glossary')
tr
td
a(target='_blank', href='https://github.com/HabitRPG/habitrpg/issues/2760')=env.t('reportAP')
tr
td
a(target='_blank', href='https://trello.com/c/8gzGlle8')=env.t('requestAF')
tr
td
a(target='_blank', href='http://habitrpg.wikia.com/wiki/Special:Forum')=env.t('community')
// Player Tiers
.modal(style='position: relative;top: auto;left: auto;right: auto;margin: 0 auto 20px;z-index: 1;max-width: 100%;', popover=env.t('tierPop'), popover-trigger="mouseenter", popover-placement="right")
.modal-header
h3=env.t('playerTiers')
.modal-body
small
|<a href='/#/options/groups/hall'>
=env.t('visitHeroes')
|</a> <br />
|<a href='http://habitrpg.wikia.com/wiki/Contributor_Rewards' target='_blank'>
=env.t('conLearn')
|</a> <br />
|<a href='http://habitrpg.wikia.com/wiki/Contributing_to_HabitRPG' target='_blank'>
=env.t('conLearnHow')
|</a>
table.table.table-striped
tr
td
a.label.label-contributor-1(ng-click='toggleUserTier($event)')=env.t('friend') + ' (1-2)'
div(style='display:none;')
p
span.achievement.achievement-firefox
!=env.t('friendFirst')
hr
p
span.shop-sprite.item-img(class='shop_armor_special_1')
!=env.t('friendSecond')
tr
td
a.label.label-contributor-3(ng-click='toggleUserTier($event)')=env.t('elite') + ' (3-4)'
div(style='display:none;')
p
span.shop-sprite.item-img(class='shop_head_special_1')
!=env.t('eliteThird')
hr
p
span.shop-sprite.item-img(class='shop_weapon_special_1')
!=env.t('eliteFourth')
tr
td
a.label.label-contributor-5(ng-click='toggleUserTier($event)')=env.t('champion') + ' (5-6)'
div(style='display:none;')
p
span.shop-sprite.item-img(class='shop_shield_special_1')
!=env.t('championFifth')
hr
p
div(class='Pet-Dragon-Hydra pull-left')
!=env.t('championSixth')
tr
td
a.label.label-contributor-7(ng-click='toggleUserTier($event)')=env.t('legendary') + ' (7)'
div(style='display:none;')
p
!=env.t('legSeventh')
tr
td
a.label.label-contributor-8(ng-click='toggleUserTier($event)')=env.t('heroic')
div(style='display:none;')
p=env.t('heroicText')
tr
td
a.label.label-npc(ng-click='toggleUserTier($event)')=env.t('npc')
div(style='display:none;')
p=env.t('npcText')
// Player Tiers
.panel.panel-default(popover=env.t('tierPop'), popover-trigger="mouseenter", popover-placement="right")
.panel-heading
h3.panel-title=env.t('playerTiers')
.panel-body
small
|<a href='/#/options/groups/hall'>
=env.t('visitHeroes')
|</a> <br />
|<a href='http://habitrpg.wikia.com/wiki/Contributor_Rewards' target='_blank'>
=env.t('conLearn')
|</a> <br />
|<a href='http://habitrpg.wikia.com/wiki/Contributing_to_HabitRPG' target='_blank'>
=env.t('conLearnHow')
|</a>
table.table.table-striped
tr
td
a.label.label-contributor-1(ng-click='toggleUserTier($event)')=env.t('friend') + ' (1-2)'
div(style='display:none;')
p
span.achievement.achievement-firefox
!=env.t('friendFirst')
hr
p
span.shop-sprite.item-img(class='shop_armor_special_1')
!=env.t('friendSecond')
tr
td
a.label.label-contributor-3(ng-click='toggleUserTier($event)')=env.t('elite') + ' (3-4)'
div(style='display:none;')
p
span.shop-sprite.item-img(class='shop_head_special_1')
!=env.t('eliteThird')
hr
p
span.shop-sprite.item-img(class='shop_weapon_special_1')
!=env.t('eliteFourth')
tr
td
a.label.label-contributor-5(ng-click='toggleUserTier($event)')=env.t('champion') + ' (5-6)'
div(style='display:none;')
p
span.shop-sprite.item-img(class='shop_shield_special_1')
!=env.t('championFifth')
hr
p
div(class='Pet-Dragon-Hydra pull-left')
!=env.t('championSixth')
tr
td
a.label.label-contributor-7(ng-click='toggleUserTier($event)')=env.t('legendary') + ' (7)'
div(style='display:none;')
p
!=env.t('legSeventh')
tr
td
a.label.label-contributor-8(ng-click='toggleUserTier($event)')=env.t('heroic')
div(style='display:none;')
p=env.t('heroicText')
tr
td
a.label.label-npc(ng-click='toggleUserTier($event)')=env.t('npc')
div(style='display:none;')
p=env.t('npcText')
include ./challenge-box
include ./challenge-box
.span8(ng-controller='ChatCtrl')
h3=env.t('tavernTalk')
include ./chat-box
small(style='position: relative; top: -20px; left: 25px;')
include ../../shared/formatting-help
small(style='position: relative; top: 18px; left: 0px')
alert.alert-info
!=env.t('tavernAlert1') + ' <a href="https://github.com/HabitRPG/habitrpg/issues/2760" target="_blank">' + env.t('tavernAlert2') + '</a>.'
ul.unstyled.tavern-chat
include ./chat-message
.col-md-8.tavern(ng-controller='ChatCtrl')
h3=env.t('tavernTalk')
include ./chat-box
.alert.alert-info
!=env.t('tavernAlert1') + ' <a href="https://github.com/HabitRPG/habitrpg/issues/2760" target="_blank">' + env.t('tavernAlert2') + '</a>.'
ul.list-unstyled.tavern-chat
include ./chat-message

View file

@ -1,20 +1,20 @@
footer.footer(ng-controller='FooterCtrl')
.container
.row
.span3
.col-sm-3
h4=env.t('footerMobile')
ul.unstyled
ul.list-unstyled
li
a(href='https://itunes.apple.com/us/app/habitrpg/id689569235?mt=8', target='_blank')=env.t('mobileIOS')
li
a(href='https://play.google.com/store/apps/details?id=com.ocdevel.habitrpg', target='_blank')=env.t('mobileAndroid')
.span3
.col-sm-3
h4=env.t('footerCompany')
ul.unstyled
ul.list-unstyled
if (!env.isStaticPage)
li
.btn.btn-small.btn-success(ng-click='modals.buyGems = true')
i.icon-heart.icon-white
.btn.btn-small.btn-success(ng-click='openModal("buyGems")')
span.glyphicon.glyphicon-heart
=env.t('companyDonate')
li
a(href='/static/about')=env.t('companyAbout')
@ -28,9 +28,9 @@ footer.footer(ng-controller='FooterCtrl')
a(href='/static/privacy')=env.t('companyPrivacy')
li
a(href='/static/terms')=env.t('companyTerms')
.span3
.col-sm-3
h4=env.t('footerCommunity')
ul.unstyled
ul.list-unstyled
li
a(target='_blank', href='https://github.com/HabitRPG/habitrpg/issues')=env.t('communityBug')
li
@ -47,7 +47,7 @@ footer.footer(ng-controller='FooterCtrl')
a(target='_blank', href='https://www.facebook.com/Habitrpg')=env.t('communityFacebook')
li
a(target='_blank', href='http://www.reddit.com/r/habitrpg/')=env.t('communityReddit')
.span3
.col-sm-3
if (env.NODE_ENV=='production')
h4=env.t('footerSocial')
.addthis_toolbox.addthis_default_style(addthis:url='https://habitrpg.com', addthis:title=env.t('socialTitle'))
@ -64,16 +64,16 @@ footer.footer(ng-controller='FooterCtrl')
tr
td
a.addthis_button_google_plusone(g:plusone:size='medium')
else
else if(!env.isFrontPage)
h4 Debug
ul.unstyled
ul.list-unstyled
li
a.btn(ng-click='addMissedDay()') +1 Missed Day
a.btn.btn-default(ng-click='addMissedDay()') +1 Missed Day
li
a.btn(ng-click='addTenGems()') +10 Gems
a.btn.btn-default(ng-click='addTenGems()') +10 Gems
li
a.btn(ng-click='addLevelsAndGold()') +Exp +GP
a.btn.btn-default(ng-click='addLevelsAndGold()') +Exp +GP
li
a.btn(ng-click='addOneLevel()') +1 Level
a.btn.btn-default(ng-click='addOneLevel()') +1 Level
div(ng-init='deferredScripts()')

View file

@ -1,4 +1,4 @@
a.pull-right.gem-wallet(ng-click='modals.buyGems = true', popover-trigger='mouseenter', popover-title=env.t('gems'), popover=env.t('gemsWhatFor'), popover-placement='bottom')
a.pull-right.gem-wallet(ng-click='openModal("buyGems")', popover-trigger='mouseenter', popover-title=env.t('gems'), popover=env.t('gemsWhatFor'), popover-placement='bottom')
span.task-action-btn.tile.flush.bright.add-gems-btn
span.task-action-btn.tile.flush.neutral
.Pet_Currency_Gem2x.Gems

View file

@ -3,7 +3,7 @@
Removing it will remove the user's name, but will allow more room for mounts & helms. IMO this is the lesser of two evils, revisit
//-figure.herobox(ng-click='clickMember(profile._id)', data-name='{{profile.profile.name}}', ng-class='{isUser: profile.id==user.id, hasPet: profile.items.currentPet}', data-level='{{profile.stats.lvl}}', data-uid='{{profile.id}}', rel='popover', data-placement='bottom', data-trigger='hover', data-html='true', data-content="<div ng-hide='profile.id == user.id'> <div class='progress progress-danger' style='height:5px;'> <div class='bar' style='height: 5px; width: {{percent(profile.stats.hp, 50)}}%;'></div> </div> <div class='progress progress-warning' style='height:5px;'> <div class='bar' style='height: 5px; width: {{percent(profile.stats.exp, tnl(profile.stats.lvl))}}%;'></div> </div> <div>Level: {{profile.stats.lvl}}</div> <div>GP: {{profile.stats.gp | number:0}}</div> <div>{{count(profile.items.pets)}} / 90 Pets Found</div> </div>")
figure.herobox(ng-click='spell ? castEnd(profile, "user", $event) : clickMember(profile._id)', data-name='{{profile.profile.name}}', ng-class='{isUser: (user._id==profile._id && !user.items.currentMount), hasPet: profile.items.currentMount, "cast-target": applyingAction, isLeader: party.leader==profile._id}')
figure.herobox(ng-click='spell ? castEnd(profile, "user", $event) : clickMember(profile._id)', data-name='{{profile.profile.name}}', ng-class='{isUser: user._id==profile._id, hasPet:profile.items.currentPet, hasMount:profile.items.currentMount, "cast-target": applyingAction, isLeader: party.leader==profile._id}')
.character-sprites
// Mount Body
span(ng-if='profile.items.currentMount', class='Mount_Body_{{profile.items.currentMount}}')
@ -43,8 +43,8 @@ figure.herobox(ng-click='spell ? castEnd(profile, "user", $event) : clickMember(
span(ng-class='{zzz:profile.preferences.sleep}')
// FIXME handle @minimal, this might have to be a directive
span.current-pet(class='Pet-{{profile.items.currentPet}}', ng-show='profile.items.currentPet && !minimal')
.avatar-level(ng-class='userLevelStyle(profile,"label")')
i.icon-circle-arrow-up.icon-white(ng-show='profile.stats.buffs.str || profile.stats.buffs.per || profile.stats.buffs.con || profile.stats.buffs.int || profile.stats.buffs.stealth', tooltip=env.t('buffed'), style='margin-right:5px;')
.avatar-level(ng-class='userLevelStyle(profile,"label label-default")')
span.glyphicon.glyphicon-circle-arrow-up(ng-show='profile.stats.buffs.str || profile.stats.buffs.per || profile.stats.buffs.con || profile.stats.buffs.int || profile.stats.buffs.stealth', tooltip=env.t('buffed'), style='margin-right:5px;')
=env.t('lvl')
| {{profile.stats.lvl}}
i.icon-plus-sign.icon-white(ng-show='profile.achievements.rebirths', tooltip=env.t('reborn', {reLevel: "{{profile.achievements.rebirthLevel}}"}), style='margin-left:5px')
span.glyphicon.glyphicon-plus-sign(ng-show='profile.achievements.rebirths', tooltip=env.t('reborn', {reLevel: "{{profile.achievements.rebirthLevel}}"}), style='margin-left:5px')

View file

@ -13,21 +13,25 @@
.meter.health(title=env.t('health'))
.bar(style='width: {{Shared.percent(user.stats.hp, 50)}}%;')
span.meter-text
i.icon-heart
span.glyphicon.glyphicon-heart
| &nbsp;
| {{Math.ceil(user.stats.hp)}} / 50
.meter.experience(title=env.t('experience'))
.bar(style='width: {{Shared.percent(user.stats.exp,Shared.tnl(user.stats.lvl))}}%;')
span.meter-text
i.icon-star
span.glyphicon.glyphicon-star
| &nbsp;
| {{Math.floor(user.stats.exp)}} / {{Shared.tnl(user.stats.lvl) | number:0}}
// FIXME doesn't look great here, but the "Experience" CSS title rollover covers it where it was before
span(ng-show='user.history.exp')
a(ng-click='toggleChart("exp")', tooltip=env.t('progress'))
i.icon-signal
| &nbsp;
span.glyphicon.glyphicon-signal
.meter.mana(title='Mana', ng-if='user.flags.classSelected && !user.preferences.disableClasses')
.bar(style='width: {{user.stats.mp / user._statsComputed.maxMP * 100}}%;')
span.meter-text
i.icon-fire
span.glyphicon.glyphicon-fire
| &nbsp;
| {{Math.floor(user.stats.mp)}} / {{user._statsComputed.maxMP}}
// party
@ -35,5 +39,5 @@
.herobox-wrap(ng-repeat='profile in partyMinusSelf')
include avatar
.npc_bailey.npc_bailey_head(ng-show='user.flags.newStuff', tooltip=env.t('psst'), tooltip-placement='top', ng-click='modals.newStuff=true')
.npc_bailey.npc_bailey_head(ng-show='user.flags.newStuff', tooltip=env.t('psst'), tooltip-placement='top', ng-click='openModal("newStuff")')

View file

@ -1,5 +1,4 @@
.user-menu(ng-controller='AuthCtrl')
button.task-action-btn.tile.solid(ng-hide='authenticated()', style='cursor: pointer;', ng-click="modals.login = true")=env.t('loginAndReg')
ul.nav.site-nav(ng-show='authenticated()')
li.flyout
h1.task-action-btn.tile.solid.user-reporter {{user.profile.name}}
@ -7,30 +6,36 @@
li
a.task-action-btn.tile.solid
span(ng-show='$state.includes("options")', ui-sref='tasks')
i.icon-ok
span.glyphicon.glyphicon-ok
| &nbsp;
=env.t('tasks')
span(ng-show='$state.includes("tasks")', ui-sref='options')
i.icon.icon-wrench
span.glyphicon.glyphicon-wrench
| &nbsp;
=env.t('options')
li
a.task-action-btn.tile.solid(href="http://habitrpg.wikia.com/wiki/FAQ", target='_blank')
i.icon.icon-book
span.glyphicon.glyphicon-book
| &nbsp;
=env.t('FAQ')
li
a.task-action-btn.tile.solid(href="https://vimeo.com/57654086", target='_blank')
i.icon.icon-film
span.glyphicon.glyphicon-film
//| &nbsp; Tutorials is too long to stay in the menu if we add a space
=env.t('tutorials')
li
a.task-action-btn.tile.solid(ng-click='User.sync()')
i.icon.icon-refresh
span.glyphicon.glyphicon-refresh
| &nbsp;
=env.t('sync')
li
a.task-action-btn.tile.solid(ng-click='logout()')
i.icon-share-alt
span.glyphicon.glyphicon-share-alt
| &nbsp;
=env.t('logout')
// party invitation notification
a(ng-show='user.party.invitation', style='cursor: pointer;', x-bind='click:gotoPartyChat')
i.icon-user
span.glyphicon.glyphicon-user
// party chat notification
a(ng-show='newChatMessages(_party.chat,user.party.lastMessageSeen)', style='cursor: pointer;', x-bind='click:gotoPartyChat')
i.icon-comment(tooltip=env.t('partyNotification'))
span.glyphicon.glyphicon-comment(tooltip=env.t('partyNotification'))

View file

@ -1,52 +1,53 @@
// Streak
div(modal='modals.achievements.streak')
script(id='modals/achievements/streak.html', type='text/ng-template')
.modal-header
h3=env.t('modalAchievement')
h4=env.t('modalAchievement')
.modal-body
.achievement.achievement-thermometer
=env.t('streakerAchievement')
.modal-footer
button.btn.btn-default.cancel(ng-click='modals.achievements.streak = false')=env.t('ok')
button.btn.btn-default.cancel(ng-click='$close()')=env.t('ok')
// Max Gear
div(modal='modals.achievements.ultimateGear')
script(id='modals/achievements/ultimateGear.html', type='text/ng-template')
.modal-header
h3=env.t('modalAchievement')
h4=env.t('modalAchievement')
.modal-body
.achievement.achievement-armor
=env.t('gearAchievement')
.modal-footer
button.btn.btn-default.cancel(ng-click='modals.achievements.ultimateGear = false')=env.t('ok')
button.btn.btn-default.cancel(ng-click='$close()')=env.t('ok')
// Beast Master
div(modal='modals.achievements.beastMaster')
script(id='modals/achievements/beastMaster.html', type='text/ng-template')
.modal-header
h3=env.t('modalAchievement')
h4=env.t('modalAchievement')
.modal-body
p
.achievement.achievement-rat
=env.t('beastAchievement')
.modal-footer
button.btn.btn-default.cancel(ng-click='modals.achievements.beastMaster = false')=env.t('ok')
button.btn.btn-default.cancel(ng-click='$close()')=env.t('ok')
// Contributor
div(modal='user.flags.contributor')
// activated by user.flags.contributor
script(id='modals/achievements/contributor.html', type='text/ng-template')
.modal-header
h3=env.t('modalContribAchievement')
h4=env.t('modalContribAchievement')
.modal-body
.npc_justin.float-left
p
!=env.t('contribModal', {name: "{{user.profile.name}}", level: "{{user.contributor.level}}"})
a(href='http://habitrpg.wikia.com/wiki/Contributor_Rewards' target='_blank')=env.t('contribLink')
.modal-footer
button.btn.btn-default.cancel(ng-click='set({"flags.contributor":false})')=env.t('ok')
button.btn.btn-default.cancel(ng-click='set({"flags.contributor":false}); $close()')=env.t('ok')
//Rebirth
div(modal='modals.achievements.rebirth')
script(id='modals/achievements/rebirth.html', type='text/ng-template')
.modal-header
h3=env.t('modalAchievement')
h4=env.t('modalAchievement')
.modal-body
.achievement.achievement-sun
=env.t('rebirthAchievement', {number: "{{user.achievements.rebirths}}", level: "{{user.achievements.rebirthLevel}}"})
.modal-footer
button.btn.btn-default.cancel(ng-click='modals.achievements.rebirth = false')=env.t('ok')
button.btn.btn-default.cancel(ng-click='$close()')=env.t('ok')

View file

@ -1,4 +1,5 @@
div(modal='modals.buyGems')
//Why is shown? Because of script here at line 24!!!!!!!!!
script(id='modals/buyGems.html', type='text/ng-template')
.modal-body
.buy-gems
include ../gems
@ -18,14 +19,14 @@ div(modal='modals.buyGems')
=env.t('USD')
tr
td
.btn.btn-primary(ng-click='showStripe()',style='margin-left:10px;')=env.t('payWithCard')
.btn.btn-primary(ng-click='showStripe()')=env.t('payWithCard')
div(style='float:left;')
//-script(src='/bower_components/JavaScriptButtons/dist/paypal-button.min.js?merchant=#{env.PAYPAL_MERCHANT}', data-button='buynow', data-name=env.t('paypalText'), data-quantity='1', data-amount='5', data-currency='USD', data-tax='0', data-callback='#{env.BASE_URL}/api/v2/user/buy-gems/paypal-ipn', data-env="#{env.NODE_ENV == 'production' ? '' : 'sandbox'}", data-custom='?uid={{user._id}}&apiToken={{user.apiToken}}', data-return='#{env.BASE_URL}', data-rm='1', data-no_shipping='1')
script(src='/bower_components/JavaScriptButtons/dist/paypal-button.min.js?merchant=#{env.PAYPAL_MERCHANT}', data-button='buynow', data-name=env.t('paypalText'), data-quantity='1', data-amount='5', data-currency='USD', data-tax='0', data-callback='#{env.BASE_URL}/api/v2/user/buy-gems/paypal-ipn', data-custom='?uid={{user._id}}&apiToken={{user.apiToken}}', data-return='#{env.BASE_URL}', data-rm='1', data-no_shipping='1')
//script(src='/bower_components/JavaScriptButtons/dist/paypal-button.min.js?merchant=#{env.PAYPAL_MERCHANT}', data-button='buynow', data-name=env.t('paypalText'), data-quantity='1', data-amount='5', data-currency='USD', data-tax='0', data-callback='#{env.BASE_URL}/api/v2/user/buy-gems/paypal-ipn', data-custom='?uid={{user._id}}&apiToken={{user.apiToken}}', data-return='#{env.BASE_URL}', data-rm='1', data-no_shipping='1')
p
small.muted(style='line-height:10px;')=env.t('payNote')
small.muted=env.t('payNote')
div(ng-include="'partials/options.settings.subscription.html'")
.modal-footer
button.btn.btn-default.cancel(ng-click='modals.buyGems = false')=env.t('cancel')
button.btn.btn-default.cancel(ng-click='$close()')=env.t('cancel')

View file

@ -1,75 +1,76 @@
.modal(ng-if='!user.flags.classSelected && user.stats.lvl >= 10', data-backdrop=true, ng-controller='UserCtrl')
script(type='text/ng-template', id='modals/chooseClass.html')
.modal-header
h3=env.t('chooseClass1')
h4=env.t('chooseClass1')
a(href='http://habitrpg.wikia.com/wiki/Class_System' target='_blank')=env.t('chooseClass2')
.modal-body.select-class
.row-fluid
.span3(ng-click='selectedClass = "warrior"')
h5
a(href='http://habitrpg.wikia.com/wiki/Warrior' target='_blank')=env.t('warrior')
figure.herobox(ng-class='{"selected-class": selectedClass=="warrior"}')
.character-sprites
span(class='skin_{{user.preferences.skin}}')
span(class='{{user.preferences.size}}_armor_warrior_5')
span(class='head_0')
span(class='hair_base_{{user.preferences.hair.base}}_{{user.preferences.hair.color}}')
span(class='hair_bangs_{{user.preferences.hair.bangs}}_{{user.preferences.hair.color}}')
span(class='hair_beard_{{user.preferences.hair.beard}}_{{user.preferences.hair.color}}')
span(class='hair_mustache_{{user.preferences.hair.mustache}}_{{user.preferences.hair.color}}')
span(class='head_warrior_5')
span(class='shield_warrior_5')
span(class='weapon_warrior_6')
.span3(ng-click='selectedClass = "wizard"')
h5
a(href='http://habitrpg.wikia.com/wiki/Mage' target='_blank')=env.t('mage')
figure.herobox(ng-class='{"selected-class": selectedClass=="wizard"}')
.character-sprites
span(class='skin_{{user.preferences.skin}}')
span(class='{{user.preferences.size}}_armor_wizard_5')
span(class='head_0')
span(class='hair_base_{{user.preferences.hair.base}}_{{user.preferences.hair.color}}')
span(class='hair_bangs_{{user.preferences.hair.bangs}}_{{user.preferences.hair.color}}')
span(class='hair_beard_{{user.preferences.hair.beard}}_{{user.preferences.hair.color}}')
span(class='hair_mustache_{{user.preferences.hair.mustache}}_{{user.preferences.hair.color}}')
span(class='head_wizard_5')
span(class='shield_wizard_5')
span(class='weapon_wizard_6')
.span3(ng-click='selectedClass = "rogue"')
h5
a(href='http://habitrpg.wikia.com/wiki/Rogue' target='_blank')=env.t('rogue')
figure.herobox(ng-class='{"selected-class": selectedClass=="rogue"}')
.character-sprites
span(class='skin_{{user.preferences.skin}}')
span(class='{{user.preferences.size}}_armor_rogue_5')
span(class='head_0')
span(class='hair_base_{{user.preferences.hair.base}}_{{user.preferences.hair.color}}')
span(class='hair_bangs_{{user.preferences.hair.bangs}}_{{user.preferences.hair.color}}')
span(class='hair_beard_{{user.preferences.hair.beard}}_{{user.preferences.hair.color}}')
span(class='hair_mustache_{{user.preferences.hair.mustache}}_{{user.preferences.hair.color}}')
span(class='head_rogue_5')
span(class='shield_rogue_6')
span(class='weapon_rogue_6')
.span3(ng-click='selectedClass = "healer"')
h5
a(href='http://habitrpg.wikia.com/wiki/Healer' target='_blank')=env.t('healer')
figure.herobox(ng-class='{"selected-class": selectedClass=="healer"}')
.character-sprites
span(class='skin_{{user.preferences.skin}}')
span(class='{{user.preferences.size}}_armor_healer_5')
span(class='head_0')
span(class='hair_base_{{user.preferences.hair.base}}_{{user.preferences.hair.color}}')
span(class='hair_bangs_{{user.preferences.hair.bangs}}_{{user.preferences.hair.color}}')
span(class='hair_beard_{{user.preferences.hair.beard}}_{{user.preferences.hair.color}}')
span(class='hair_mustache_{{user.preferences.hair.mustache}}_{{user.preferences.hair.color}}')
span(class='head_healer_5')
span(class='shield_healer_5')
span(class='weapon_healer_6')
br
.well(ng-show='selectedClass=="warrior"')=env.t('warriorText')
.well(ng-show='selectedClass=="wizard"')=env.t('mageText')
.well(ng-show='selectedClass=="rogue"')=env.t('rogueText')
.well(ng-show='selectedClass=="healer"')=env.t('healerText')
.container-fluid
.row
.col-md-3(ng-click='selectedClass = "warrior"')
h5
a(href='http://habitrpg.wikia.com/wiki/Warrior' target='_blank')=env.t('warrior')
figure.herobox(ng-class='{"selected-class": selectedClass=="warrior"}')
.character-sprites
span(class='skin_{{user.preferences.skin}}')
span(class='{{user.preferences.size}}_armor_warrior_5')
span(class='head_0')
span(class='hair_base_{{user.preferences.hair.base}}_{{user.preferences.hair.color}}')
span(class='hair_bangs_{{user.preferences.hair.bangs}}_{{user.preferences.hair.color}}')
span(class='hair_beard_{{user.preferences.hair.beard}}_{{user.preferences.hair.color}}')
span(class='hair_mustache_{{user.preferences.hair.mustache}}_{{user.preferences.hair.color}}')
span(class='head_warrior_5')
span(class='shield_warrior_5')
span(class='weapon_warrior_6')
.col-md-3(ng-click='selectedClass = "wizard"')
h5
a(href='http://habitrpg.wikia.com/wiki/Mage' target='_blank')=env.t('mage')
figure.herobox(ng-class='{"selected-class": selectedClass=="wizard"}')
.character-sprites
span(class='skin_{{user.preferences.skin}}')
span(class='{{user.preferences.size}}_armor_wizard_5')
span(class='head_0')
span(class='hair_base_{{user.preferences.hair.base}}_{{user.preferences.hair.color}}')
span(class='hair_bangs_{{user.preferences.hair.bangs}}_{{user.preferences.hair.color}}')
span(class='hair_beard_{{user.preferences.hair.beard}}_{{user.preferences.hair.color}}')
span(class='hair_mustache_{{user.preferences.hair.mustache}}_{{user.preferences.hair.color}}')
span(class='head_wizard_5')
span(class='shield_wizard_5')
span(class='weapon_wizard_6')
.col-md-3(ng-click='selectedClass = "rogue"')
h5
a(href='http://habitrpg.wikia.com/wiki/Rogue' target='_blank')=env.t('rogue')
figure.herobox(ng-class='{"selected-class": selectedClass=="rogue"}')
.character-sprites
span(class='skin_{{user.preferences.skin}}')
span(class='{{user.preferences.size}}_armor_rogue_5')
span(class='head_0')
span(class='hair_base_{{user.preferences.hair.base}}_{{user.preferences.hair.color}}')
span(class='hair_bangs_{{user.preferences.hair.bangs}}_{{user.preferences.hair.color}}')
span(class='hair_beard_{{user.preferences.hair.beard}}_{{user.preferences.hair.color}}')
span(class='hair_mustache_{{user.preferences.hair.mustache}}_{{user.preferences.hair.color}}')
span(class='head_rogue_5')
span(class='shield_rogue_6')
span(class='weapon_rogue_6')
.col-md-3(ng-click='selectedClass = "healer"')
h5
a(href='http://habitrpg.wikia.com/wiki/Healer' target='_blank')=env.t('healer')
figure.herobox(ng-class='{"selected-class": selectedClass=="healer"}')
.character-sprites
span(class='skin_{{user.preferences.skin}}')
span(class='{{user.preferences.size}}_armor_healer_5')
span(class='head_0')
span(class='hair_base_{{user.preferences.hair.base}}_{{user.preferences.hair.color}}')
span(class='hair_bangs_{{user.preferences.hair.bangs}}_{{user.preferences.hair.color}}')
span(class='hair_beard_{{user.preferences.hair.beard}}_{{user.preferences.hair.color}}')
span(class='hair_mustache_{{user.preferences.hair.mustache}}_{{user.preferences.hair.color}}')
span(class='head_healer_5')
span(class='shield_healer_5')
span(class='weapon_healer_6')
br
.well(ng-show='selectedClass=="warrior"')=env.t('warriorText')
.well(ng-show='selectedClass=="wizard"')=env.t('mageText')
.well(ng-show='selectedClass=="rogue"')=env.t('rogueText')
.well(ng-show='selectedClass=="healer"')=env.t('healerText')
.modal-footer
button.btn.btn-small.btn-danger.cancel(ng-click='user.ops.disableClasses({})', popover-placement='top', popover-trigger='mouseenter', popover=env.t('optOutText'))=env.t('optOut')
button.btn.btn-primary.cancel(ng-click='selectedClass && changeClass(selectedClass)')=env.t('select')
button.btn.btn-small.btn-danger.cancel(ng-click='user.ops.disableClasses({}); $close()', popover-placement='top', popover-trigger='mouseenter', popover=env.t('optOutText'))=env.t('optOut')
button.btn.btn-primary.cancel(ng-disabled='!selectedClass' ng-click='changeClass(selectedClass); $close()')=env.t('select')

View file

@ -1,14 +1,16 @@
div(modal='user.stats.hp <= 0', options='{backdrop:true, keyboard:false, backdropClick:false}')
.modal-body
.row-fluid
.span4
figure.notification-character
.GrimReaper
.span8
h2=env.t('youDied')
.row-fluid
.span4
p
a.btn.btn-danger.btn-large.notification-action(ng-click='user.ops.revive({})')=env.t('continue')
.span8
p=env.t('dieText')
//div(modal='user.stats.hp <= 0', options='{backdrop:true, keyboard:false, backdropClick:false}')
script(type='text/ng-template', id='modals/death.html')
.modal-body.death-modal
.container-fluid
.row
.col-md-3
figure.notification-character
.GrimReaper
.col-md-9
h2=env.t('youDied')
.row
.col-md-3
p
a.btn.btn-danger.btn-large(ng-click='user.ops.revive({}); $close()')=env.t('continue')
.col-md-9
p=env.t('dieText')

View file

@ -1,23 +1,13 @@
div(modal='modals.dropsEnabled')
script(type='text/ng-template', id='modals/dropsEnabled.html')
.modal-header
h3=env.t('dropsEnabled')
h4=env.t('dropsEnabled')
.modal-body
p
span.item-drop-icon(class='Pet_Egg_Wolf', style='margin-left: 0px')
span.item-drop-icon(class='Pet_Egg_Wolf')
span!=env.t('firstDrop', {eggText: "{{Content.eggs.Wolf.text}}", eggNotes: "{{Content.eggs.Wolf.notes}}"})
br
p
span.item-drop-icon(class='Pet_Currency_Gem')
span!=env.t('useGems')
.modal-footer
button.btn.btn-default.cancel(ng-click='modals.dropsEnabled = false')=env.t('close')
div(modal='modals.drop')
.modal-header
h3=env.t('itemDrop')
.modal-body
p
span.item-drop-icon(class='Pet_{{user._tmp.drop.type}}_{{user._tmp.drop.key}}')
| {{user._tmp.drop.dialog}}
.modal-footer
button.btn.btn-default.cancel(ng-click='modals.drop = false')=env.t('close')
button.btn.btn-default.cancel(ng-click='$close()')=env.t('close')

View file

@ -1,5 +1,4 @@
include ./achievements
include ./login
include ./reroll
include ./death
include ./new-stuff

View file

@ -1,42 +0,0 @@
// This file was moved to /views/static/front.jade, as we're requiring login / registration from front page now
keep this file around until we're sure of that decision
//-div(modal='modals.login')
.modal-header
h3 Login / Register
.modal-body
//a(href='/auth/facebook')
img(src='/img/facebook-login-register.jpeg', alt='Login / Register With Facebook')
//h3 Or
tabset
tab(heading='Login')
form(ng-controller='AuthCtrl', ng-submit='auth()')
.control-group
input(type='text', ng-model='loginUsername', placeholder='{{useUUID ? \'UUID\' : \'Username\'}}')
.control-group
input(type='{{useUUID ? "text" : "password"}}', ng-model='loginPassword', placeholder='{{useUUID ? \'API Token\' : \'Password\'}}')
.control-group
label.checkbox
input(type='checkbox', ng-click='useUUID = !useUUID')
| Use UUID / API Token (For Facebook Users)
.control-group
input.btn.btn-primary(type='submit', value='Login')
tab(heading='Register')
form(ng-controller='AuthCtrl', ng-submit='register()', name='registrationForm')
.control-group
input(type='text', ng-model='registerVals.username', placeholder='Username', required)
.control-group
input(type='email', ng-model='registerVals.email', placeholder='Email', required)
.control-group
input(type='password', ng-model='registerVals.password', placeholder='Password', required)
.control-group
input(type='password', ng-model='registerVals.confirmPassword', placeholder='Password Confirm', required)
.control-group
input.btn.btn-primary(type='submit', value='Register')
.modal-footer
button.btn.btn-warning.cancel(ng-click='modals.login = false') Cancel

View file

@ -1,15 +1,15 @@
div(ng-controller='MemberModalCtrl')
#memberModal(modal='modals.member')
.modal-header(bindonce='profile')
h3
span {{profile.profile.name}}
span(ng-if='profile.contributor.level') - {{contribText(profile.contributor, profile.backer)}}
.modal-body(bindonce='profile')
.row-fluid
.span6
script(type='text/ng-template', id='modals/member.html')
.modal-header(bindonce='profile')
h4
span {{profile.profile.name}}
span(ng-if='profile.contributor.level') - {{contribText(profile.contributor, profile.backer)}}
.modal-body(bindonce='profile')
.container-fluid
.row
.col-md-6
img(ng-show='profile.profile.imageUrl', ng-src='{{profile.profile.imageUrl}}')
markdown(ng-show='profile.profile.blurb', ng-model='profile.profile.blurb')
ul.muted.unstyled(ng-if='profile.auth.timestamps', style='margin-top:10px;')
ul.muted.list-unstyled(ng-if='profile.auth.timestamps', style='margin-top:10px;')
li {{profile._id}}
li(ng-show='profile.auth.timestamps.created')=env.t('memberSince')
| {{timestamp(profile.auth.timestamps.created)}} -
@ -18,9 +18,9 @@ div(ng-controller='MemberModalCtrl')
h3=env.t('stats')
.label.label-info {{ {warrior:'Warrior',wizard:'Mage',healer:'Healer',rogue:'Rogue'}[profile.stats.class] }}
include ../profiles/stats
.span6
.col-md-6
include ../header/avatar
h3 Achievements
include ../profiles/achievements
.modal-footer
button.btn.btn-default(ng-click='modals.member = false')=env.t('ok')
.modal-footer
button.btn.btn-default(ng-click='$close()')=env.t('ok')

View file

@ -1,6 +1,7 @@
//-div(modal='!user.flags.mathUpdates')
script(type='text/ng-template', id='modals/mathUpdates.html')
.modal-header
h3 Math Updates
h4 Math Updates
.modal-body
.npc_tyler.pull-left(style='margin-right:10px')
p Hey all, Tyler here. Sorry for the rocky numbers (Exp, GP, etc) with the Class System roll-out! We're tweaking the math today, and things should be mostly finalized by tomorrow. <a target='_blank' href='https://trello.com/c/L1H6LiZ3/110-character-stats-attributes-the-class-system'>Follow our progress here</a>, and please do chime in!
@ -9,12 +10,12 @@
br
p iOS users, iTunes is on vacation until 12/28. Until we can push the updated app, you'll need to sync periodically to get the corrected numbers (app has old math, server saves the correct numbers). Android goes out ASAP. More info on <a target='_blank' href='https://trello.com/c/L1H6LiZ3/110-character-stats-attributes-the-class-system'>Trello</a>.
.modal-footer
button.btn.btn-default.cancel(ng-click='User.set({"flags.mathUpdates":true})') Dismiss
button.btn.btn-default.cancel(ng-click='User.set({"flags.mathUpdates":true}); $close()') Dismiss
div(modal='modals.newStuff')
script(type='text/ng-template', id='modals/newStuff.html')
.modal-header
h3 New Stuff!
.modal-body
h4 New Stuff!
.modal-body.new-stuff-modal
table
tr
td
@ -31,7 +32,7 @@ div(modal='modals.newStuff')
h5 February Mystery Item
p
.pull-right.inventory_present
| We're excited to announce a new feature a s a big thank-you to the awesome people who subscribe to HabitRPG! Every month, all subscribers will now receive a limited-edition mystery item! The mystery item will be a stats-free costume piece (like the Absurd Party Robes) that will <strong>only</strong> be available to the people who are subscribers each month. The February 2014 item will be revealed on the 23rd to everyone, but all people who are subscribers during the month of February will receive it. Get excited - and thank you so much for helping to support HabitRPG! We love you.
| We're excited to announce a new feature a s a big thank-you to the awesome people who <a href='https://habitrpg.com/#/options/settings/subscription' target='_blank'>subscribe</a> to HabitRPG! Every month, all subscribers will now receive a limited-edition mystery item! The mystery item will be a stats-free costume piece (like the Absurd Party Robes) that will <strong>only</strong> be available to the people who are subscribers each month. The February 2014 item will be revealed on the 23rd to everyone, but all people who are subscribers during the month of February will receive it. <a href='https://habitrpg.com/#/options/settings/subscription' target='_blank'>Subscribe now</a>, get excited, and thank you so much for helping to support HabitRPG! We love you.
tr
td
h5 Critical Hammer Of Bug-Crushing
@ -45,8 +46,16 @@ div(modal='modals.newStuff')
p
.pull-right.customize-option.hair_bangs_1_rainbow
| Want to spruce up your avatar? Rainbow hair colors are now available! Dye your luscious locks purple, green, or even rainbow-striped, and passersby will look at you with envy.
tr
td
h5 Stability Update
p We've stabilized the site a lot (we're still working out kinks, but we're way better now). Follow the <a href='https://github.com/HabitRPG/habitrpg/issues/milestones' target='_blank'>progress here</a>, but here are some workarounds for now:
ul
li Click slower. <a href='https://github.com/HabitRPG/habitrpg/issues/2301#issuecomment-34398206' target='_blank'>VersionError</a> is caused by clicking things off too fast (we're working on a fix).
li If you see an error, refresh before proceeding.
p
small.muted By Lemoness, mariahm, crystalphoenix, aiseant, and zoebeagle
small.muted By Lemoness, mariahm, crystalphoenix, aiseant, zoebeagle, cole, lefnire
hr
@ -492,5 +501,5 @@ div(modal='modals.newStuff')
a(href='https://trello.com/card/custom-day-start/50e5d3684fe3a7266b0036d6/15') Add custom day start
.modal-footer
button.btn.btn-default.cancel(ng-click='modals.newStuff = false') Cool
button.btn.btn-warning.cancel(ng-click='dismissAlert()') Dismiss This Alert
button.btn.btn-default.cancel(ng-click='$close()') Cool
button.btn.btn-warning.cancel(ng-click='dismissAlert(); $close()') Dismiss This Alert

View file

@ -11,19 +11,19 @@ script(id='partials/options.social.party.quest-rewards.html', type='text/ng-temp
td {{quest.drop.gp}}
=env.t('gold')
div(modal='user.party.quest.completed', ng-controller='InventoryCtrl')
script(type='text/ng-template', id='modals/questCompleted.html')
.modal-header
h3 "{{Content.quests[user.party.quest.completed].text}}"
h4 "{{Content.quests[user.party.quest.completed].text}}"
=env.t('completed')
.modal-body
p {{Content.quests[user.party.quest.completed].completion}}
quest-rewards(key='{{user.party.quest.completed}}', header=env.t('youReceived'))
.modal-footer
button.btn.btn-default.btn-primary(ng-click='set({"party.quest.completed":""})')=env.t('accept')
button.btn.btn-default.btn-primary(ng-click='set({"party.quest.completed":""}); $close()')=env.t('accept')
div(modal='modals.showQuest', ng-controller='InventoryCtrl')
script(type='text/ng-template', id='modals/showQuest.html')
.modal-header
h3 {{selectedQuest.text}}
h4 {{selectedQuest.text}}
.modal-body
.pull-right(class='quest_{{selectedQuest.key}}')
div(ng-bind-html='selectedQuest.notes')
@ -33,28 +33,28 @@ div(modal='modals.showQuest', ng-controller='InventoryCtrl')
.npc_ian.pull-left
p=env.t('questSend')
.modal-footer
button.btn.btn-default.btn-small.btn-cancel(ng-click='closeQuest()')=env.t('cancel')
button.btn.btn-default.btn-primary(ng-click='questInit()')=env.t('inviteParty')
button.btn.btn-default.btn-small.btn-cancel(ng-click='closeQuest(); $close()')=env.t('cancel')
button.btn.btn-default.btn-primary(ng-click='questInit(); $close()')=env.t('inviteParty')
div(modal='modals.buyQuest', ng-controller='InventoryCtrl')
script(type='text/ng-template', id='modals/buyQuest.html')
.modal-header
h3 {{selectedQuest.text}}
h4 {{selectedQuest.text}}
.modal-body
.pull-right(class='quest_{{selectedQuest.key}}')
div(ng-bind-html='selectedQuest.notes')
quest-rewards(key='{{selectedQuest.key}}')
.modal-footer
button.btn.btn-large.cancel(ng-click='closeQuest()')=env.t('neverMind')
button.btn.btn-default.btn-large.btn-primary(ng-click='purchase("quests", quest);closeQuest()')=env.t('buyQuest')
button.btn.btn-large.cancel(ng-click='closeQuest(); $close()')=env.t('neverMind')
button.btn.btn-default.btn-large.btn-primary(ng-click='purchase("quests", quest); closeQuest(); $close()')=env.t('buyQuest')
div(modal='party.quest.key && !party.quest.active && !questHold && party.quest.members[user._id] == undefined')
script(type='text/ng-template', id='modals/questInvitation.html')
.modal-header
h3=env.t('questInvitation')
h4=env.t('questInvitation')
| {{Content.quests[party.quest.key].text}}
.modal-body
div(ng-bind-html='Content.quests[party.quest.key].notes')
quest-rewards(key='{{party.quest.key}}')
.modal-footer
button.btn.btn-default.btn-small.btn-cancel(ng-click='questHold = true')=env.t('askLater')
button.btn.btn-default.btn-small.btn-cancel(ng-click='party.$questReject()')=env.t('reject')
button.btn.btn-default.btn-primary(ng-click='party.$questAccept()')=env.t('accept')
button.btn.btn-default.btn-small.btn-cancel(ng-click='questHold = true; $close()')=env.t('askLater')
button.btn.btn-default.btn-small.btn-cancel(ng-click='party.$questReject(); $close()')=env.t('reject')
button.btn.btn-default.btn-primary(ng-click='party.$questAccept(); $close()')=env.t('accept')

View file

@ -1,46 +1,46 @@
// Created by Sabe on 12/22/13.
div(modal='modals.rebirthEnabled')
.modal-header
h3=env.t('rebirthNew')
.modal-body
.rebirth_orb.pull-left(style='margin-right: 5px')
p
span=env.t('rebirthUnlock')
.modal-footer
button.btn.btn-default.cancel(ng-click='modals.rebirthEnabled = false')=env.t('close')
script(type='text/ng-template', id='modals/rebirthEnabled.html')
.modal-header
h4=env.t('rebirthNew')
.modal-body
.rebirth_orb.pull-left(style='margin-right: 5px')
p
span=env.t('rebirthUnlock')
.modal-footer
button.btn.btn-default.cancel(ng-click='$close()')=env.t('close')
div(modal='modals.rebirth')
.modal-header
h3=env.t('rebirthBegin')
.modal-body
include ../gems
.rebirth_orb.pull-left(style='margin-right: 5px')
p=env.t('rebirthStartOver')
br
.unordered
li=env.t('rebirthAdvList1')
li=env.t('rebirthAdvList2')
li=env.t('rebirthAdvList3')
li=env.t('rebirthAdvList4')
br
p=env.t('rebirthInherit')
.unordered
li=env.t('rebirthInList1')
li=env.t('rebirthInList2')
li=env.t('rebirthInList3')
li=env.t('rebirthInList4')
li=env.t('rebirthInList5')
br
.achievement-sun.pull-left(style='margin-right: 5px')
p=env.t('rebirthEarnAchievement')
.modal-footer
button.btn.btn-large.cancel(ng-click='modals.rebirth = false')=env.t('neverMind')
span(ng-if='user.balance < 2')
a.btn.btn-success.btn-large(ng-click="modals.buyGems = true")=env.t('buyMoreGems')
span.gem-cost=env.t('notEnoughGems')
span(ng-if='user.balance >= 2', ng-controller='SettingsCtrl')
a.btn.btn-danger.btn-large(ng-click='rebirth()')=env.t('beReborn')
span.gem-cost
| 8&nbsp;
=env.t('gems')
script(type='text/ng-template', id='modals/rebirth.html')
.modal-header
h4=env.t('rebirthBegin')
.modal-body
include ../gems
.rebirth_orb.pull-left(style='margin-right: 5px')
p=env.t('rebirthStartOver')
br
ul.list-unstyled
li=env.t('rebirthAdvList1')
li=env.t('rebirthAdvList2')
li=env.t('rebirthAdvList3')
li=env.t('rebirthAdvList4')
br
p=env.t('rebirthInherit')
ul.list-unstyled
li=env.t('rebirthInList1')
li=env.t('rebirthInList2')
li=env.t('rebirthInList3')
li=env.t('rebirthInList4')
li=env.t('rebirthInList5')
br
.achievement-sun.pull-left(style='margin-right: 5px')
p=env.t('rebirthEarnAchievement')
.modal-footer
button.btn.btn-default.btn-large.cancel(ng-click='$close()')=env.t('neverMind')
span(ng-if='user.balance < 2')
a.btn.btn-success.btn-large(ng-click='openModal("buyGems")')=env.t('buyMoreGems')
span.gem-cost=env.t('notEnoughGems')
span(ng-if='user.balance >= 2', ng-controller='SettingsCtrl')
a.btn.btn-danger.btn-large(ng-click='$close(); rebirth()')=env.t('beReborn')
span.gem-cost
| 8&nbsp;
=env.t('gems')

View file

@ -1,18 +1,18 @@
// Re-Roll modal
div(modal='modals.reroll')
script(type='text/ng-template', id='modals/reroll.html')
.modal-header
h3=env.t('fortify')
h4=env.t('fortify')
.modal-body
include ../gems
p=env.t('fortifyText')
.modal-footer
button.btn.btn-large.cancel(ng-click='modals.reroll = false')=env.t('neverMind')
button.btn.btn-default.btn-large.cancel(ng-click='$close()')=env.t('neverMind')
span(ng-if='user.balance < 1')
a.btn.btn-success.btn-large(ng-click="modals.buyGems = true")=env.t('buyMoreGems')
a.btn.btn-success.btn-large(ng-click='openModal("buyGems")')=env.t('buyMoreGems')
span.gem-cost=env.t('notEnoughGems')
span(ng-if='user.balance >= 1', ng-controller='SettingsCtrl')
a.btn.btn-danger.btn-large(ng-click='reroll()')=env.t('fortify')
a.btn.btn-danger.btn-large(ng-click='$close(); reroll()')=env.t('fortify')
span.gem-cost
| 4&nbsp;
= env.t('gems')

View file

@ -1,59 +1,65 @@
div(ng-controller='SettingsCtrl')
div(modal='modals.reset')
.modal-header
h3=env.t('resetAccount')
.modal-body
p=env.t('resetText1')
p=env.t('resetText2')
.modal-footer
button.btn.btn-default.cancel(ng-click='modals.reset = false')=env.t('neverMind')
button.btn.btn-danger(data-dismiss='modal', ng-click='reset()')=env.t('resetDo')
script(type='text/ng-template', id='modals/reset.html')
.modal-header
h4=env.t('resetAccount')
.modal-body
p=env.t('resetText1')
p=env.t('resetText2')
.modal-footer
button.btn.btn-default.cancel(ng-click='$close();')=env.t('neverMind')
button.btn.btn-danger(ng-click='$close(); reset()')=env.t('resetDo')
div(modal='modals.restore')
.modal-header
h3=env.t('fixValues')
.modal-body
p=env.t('fixValuesText1')
p=env.t('fixValuesText2')
div.restore-options
form#restore-form.form-horizontal
h3=env.t('stats')
.option-group.option-medium
input.option-content(type='number', step="any", data-for='stats.hp', ng-model='restoreValues.stats.hp')
span.input-suffix=env.t('health')
.option-group.option-medium
input.option-content(type='number', step="any", data-for='stats.exp', ng-model='restoreValues.stats.exp')
span.input-suffix=env.t('experience')
.option-group.option-medium
input.option-content(type='number', step="any", data-for='stats.gp', ng-model='restoreValues.stats.gp')
//input.option-content(type='number', step="any", data-for='stats.gp', ng-model='restoreValues.stats.gp',disabled)
span.input-suffix=env.t('gold')
//-p.alert
small=env.t('disabledWinterEvent')
.option-group.option-medium
input.option-content(type='number', step="any", data-for='stats.mp', ng-model='restoreValues.stats.mp')
span.input-suffix=env.t('mana')
.option-group.option-medium
input.option-content(type='number', data-for='stats.lvl', ng-model='restoreValues.stats.lvl')
span.input-suffix=env.t('level')
h3=env.t('achievements')
.option-group.option-medium
input.option-content(type='number', data-for='achievements.streak', ng-model='restoreValues.achievements.streak')
span.input-suffix=env.t('fix21Streaks')
//- This is causing too many problems for users
h3=env.t('other')
a.btn.btn-small.btn-warning(ng-controller='FooterCtrl', ng-click='addMissedDay()')=env.t('triggerDay')
.modal-footer
button.btn.btn-default.cancel(ng-click='modals.restore = false')=env.t('discardChanges')
button.btn.btn-primary(ng-click='restore()')=env.t('saveAndClose')
script(type='text/ng-template', id='modals/restore.html')
.modal-header
h4=env.t('fixValues')
.modal-body
p=env.t('fixValuesText1')
p=env.t('fixValuesText2')
form.form-horizontal
h3=env.t('stats')
.form-group
.col-md-6
input.form-control(type='number', step="any", data-for='stats.hp', ng-model='$parent.restoreValues.stats.hp')
label.control-label=env.t('health')
.form-group
.col-md-6
input.form-control(type='number', step="any", data-for='stats.exp', ng-model='$parent.restoreValues.stats.exp')
label.control-label=env.t('experience')
.form-group
.col-md-6
input.form-control(type='number', step="any", data-for='stats.gp', ng-model='$parent.restoreValues.stats.gp')
//input.form-control(type='number', step="any", data-for='stats.gp', ng-model='restoreValues.stats.gp',disabled)
label.control-label=env.t('gold')
//-p.alert
small=env.t('disabledWinterEvent')
.form-group
.col-md-6
input.form-control(type='number', step="any", data-for='stats.mp', ng-model='$parent.restoreValues.stats.mp')
label.control-label=env.t('mana')
.form-group
.col-md-6
input.form-control(type='number', data-for='stats.lvl', ng-model='$parent.restoreValues.stats.lvl')
label.control-label=env.t('level')
h3=env.t('achievements')
.form-group
.col-md-6
input.form-control(type='number', data-for='achievements.streak', ng-model='$parent.restoreValues.achievements.streak')
label.control-label=env.t('fix21Streaks')
//- This is causing too many problems for users
h3=env.t('other')
a.btn.btn-small.btn-warning(ng-controller='FooterCtrl', ng-click='addMissedDay()')=env.t('triggerDay')
.modal-footer
button.btn.btn-default.cancel(ng-click='$close()')=env.t('discardChanges')
button.btn.btn-primary(ng-click='restore(); $close();')=env.t('saveAndClose')
div(modal='modals.delete')
.modal-header
h3=env.t('deleteAccount')
.modal-body
p!=env.t('deleteText')
p
input(type='text', ng-model='_deleteAccount')
.modal-footer
button.btn.btn-default(ng-click='modals.delete = false')=env.t('neverMind')
button.btn.btn-danger.btn-small(ng-disabled='_deleteAccount != "DELETE"', ng-click='delete()')=env.t('deleteDo')
script(type='text/ng-template', id='modals/delete.html')
.modal-header
h4=env.t('deleteAccount')
.modal-body
p!=env.t('deleteText')
br
.row
.col-md-6
input.form-control(type='text', ng-model='_deleteAccount')
.modal-footer
button.btn.btn-default(ng-click='$close()')=env.t('neverMind')
button.btn.btn-danger.btn-small(ng-disabled='_deleteAccount != "DELETE"', ng-click='$close(); delete()')=env.t('deleteDo')

View file

@ -1,133 +1,132 @@
.achievements-container
// <div class='achievement achievement-sword'></div>
// <div class='achievement achievement-tree'></div>
// <div class='achievement achievement-comment'></div>
// <div class='achievement achievement-cave'></div>
// <div class='achievement achievement-boot'></div>
// <div class='achievement achievement-coffin'></div>
// <div class='achievement achievement-alien'></div>
// <div class='achievement achievement-ninja'></div>
// <div class='achievement achievement-cactus'></div>
// <div class='achievement achievement-bow'></div>
// <div class='achievement achievement-shield'></div>
// <div class='achievement achievement-karaoke'></div>
// <div class='achievement achievement-sword'></div>
// <div class='achievement achievement-tree'></div>
// <div class='achievement achievement-comment'></div>
// <div class='achievement achievement-cave'></div>
// <div class='achievement achievement-boot'></div>
// <div class='achievement achievement-coffin'></div>
// <div class='achievement achievement-alien'></div>
// <div class='achievement achievement-ninja'></div>
// <div class='achievement achievement-cactus'></div>
// <div class='achievement achievement-bow'></div>
// <div class='achievement achievement-shield'></div>
// <div class='achievement achievement-karaoke'></div>
div(ng-if='profile.backer.npc')
.achievement.achievement-helm
div(ng-if='profile.backer.npc')
.achievement.achievement-helm
h5
span.label.label-npc
| {{profile.backer.npc}}
=env.t('npc')
small=env.t('npcText')
hr
div(ng-if='profile.contributor.level || user._id == profile._id')
.achievement.achievement-firefox(ng-if='profile.contributor.level')
div(ng-class='{muted: !profile.contributor.level}')
h5
span.label.label-npc
| {{profile.backer.npc}}
=env.t('npc')
small=env.t('npcText')
hr
div(ng-if='profile.contributor.level || user._id == profile._id')
.achievement.achievement-firefox(ng-if='profile.contributor.level')
div(ng-class='{muted: !profile.contributor.level}')
h5
span.label(ng-if='profile.contributor.level', class='label-contributor-{{profile.contributor.level}}') {{contribText(profile.contributor, profile.backer)}}
span.label(ng-if='!profile.contributor.level')=env.t('contribName')
small
=env.t('contribText')
a(href='http://habitrpg.wikia.com/wiki/Contributing_to_HabitRPG', target='_blank')=env.t('readMore')
| .
hr
div(ng-if='profile.backer.tier')
.achievement.achievement-heart
h5=env.t('kickstartName', {tier: "{{profile.backer.tier}}"})
small=env.t('kickstartText')
hr
div(ng-if='profile.achievements.streak || user._id == profile._id')
.achievement.achievement-thermometer(ng-show='profile.achievements.streak')
div(ng-class='{muted: !profile.achievements.streak}')
h5 {{profile.achievements.streak || 0 }}
=env.t('streakName')
small=env.t('streakText', {streaks: "{{profile.achievements.streak || 0 }}"})
hr
div(ng-if='profile.achievements.perfect || user._id == profile._id')
.achievement.achievement-perfect(ng-show='profile.achievements.perfect')
div(ng-class='{muted: !profile.achievements.perfect}')
h5 {{profile.achievements.perfect || 0 }}
=env.t('perfectName')
small=env.t('perfectText', {perfects: "{{profile.achievements.perfect || 0 }}"})
hr
div(ng-if='profile.achievements.ultimateGear || user._id == profile._id')
.achievement.achievement-armor(ng-show='profile.achievements.ultimateGear')
div(ng-class='{muted: !profile.achievements.ultimateGear}')
h5=env.t('ultimGearName')
small=env.t('ultimGearText')
hr
div(ng-if='profile.achievements.beastMaster || user._id == profile._id')
.achievement.achievement-rat(ng-show='profile.achievements.beastMaster')
div(ng-class='{muted: !profile.achievements.beastMaster}')
h5=env.t('beastMastName')
small=env.t('beastMastText')
hr
div(ng-if='profile.achievements.rebirths')
.achievement.achievement-sun
h5(ng-if='profile.achievements.rebirths == 1')=env.t('rebirthBegan')
h5(ng-if='profile.achievements.rebirths > 1')
=env.t('rebirthText', {rebirths: "{{profile.achievements.rebirths}}"})
span.label(ng-if='profile.contributor.level', class='label-contributor-{{profile.contributor.level}}') {{contribText(profile.contributor, profile.backer)}}
span.label(ng-if='!profile.contributor.level')=env.t('contribName')
small
=env.t('rebirthOrb')
| {{profile.achievements.rebirthLevel}}.
hr
=env.t('contribText')
a(href='http://habitrpg.wikia.com/wiki/Contributing_to_HabitRPG', target='_blank')=env.t('readMore')
| .
hr
div(ng-if='profile.achievements.helpedHabit')
.achievement.achievement-tree
h5=env.t('helped')
small
=env.t('helpedText1')
a(href='http://community.habitrpg.com/node/290', target='_blank')=env.t('helpedText2')
hr
div(ng-if='profile.backer.tier')
.achievement.achievement-heart
h5=env.t('kickstartName', {tier: "{{profile.backer.tier}}"})
small=env.t('kickstartText')
hr
div(ng-if='profile.achievements.originalUser || profile.achievements.veteran')
.achievement.achievement-cake
div(ng-if='profile.achievements.veteran')
h5=env.t('veteran')
small=env.t('veteranText')
div(ng-if='profile.achievements.originalUser')
h5=env.t('originalUser')
small!=env.t('originalUserText')
hr
div(ng-if='profile.achievements.streak || user._id == profile._id')
.achievement.achievement-thermometer(ng-show='profile.achievements.streak')
div(ng-class='{muted: !profile.achievements.streak}')
h5 {{profile.achievements.streak || 0 }}
=env.t('streakName')
small=env.t('streakText', {streaks: "{{profile.achievements.streak || 0 }}"})
hr
div(ng-if='profile.achievements.challenges || user._id == profile._id')
// This is a very strange icon to use. revisit
.achievement.achievement-karaoke(ng-show='profile.achievements.challenges')
div(ng-class='{muted: !profile.achievements.challenges}')
h5=env.t('challengeWinner')
table.table.table-striped
tr(ng-repeat='chal in profile.achievements.challenges')
td {{chal}}
hr
div(ng-if='profile.achievements.perfect || user._id == profile._id')
.achievement.achievement-perfect(ng-show='profile.achievements.perfect')
div(ng-class='{muted: !profile.achievements.perfect}')
h5 {{profile.achievements.perfect || 0 }}
=env.t('perfectName')
small=env.t('perfectText', {perfects: "{{profile.achievements.perfect || 0 }}"})
hr
div(ng-if='profile.achievements.quests || user._id == profile._id')
.achievement.achievement-alien(ng-show='profile.achievements.quests')
div(ng-class='{muted: !profile.achievements.quests}')
h5=env.t('completedQuests')
table.table.table-striped
tr(ng-repeat='(k,v) in profile.achievements.quests')
td {{Content.quests[k].text}}
td x{{v}}
hr
div(ng-if='profile.achievements.ultimateGear || user._id == profile._id')
.achievement.achievement-armor(ng-show='profile.achievements.ultimateGear')
div(ng-class='{muted: !profile.achievements.ultimateGear}')
h5=env.t('ultimGearName')
small=env.t('ultimGearText')
hr
div(ng-if='profile.achievements.snowball')
.achievement.achievement-snowball
h5=env.t('annoyingFriends')
small
=env.t('annoyingFriendsText', {snowballs: "{{profile.achievements.snowball}}"})
hr
div(ng-if='profile.achievements.beastMaster || user._id == profile._id')
.achievement.achievement-rat(ng-show='profile.achievements.beastMaster')
div(ng-class='{muted: !profile.achievements.beastMaster}')
h5=env.t('beastMastName')
small=env.t('beastMastText')
hr
div(ng-if='profile.achievements.habitBirthday')
.achievement.achievement-habitBirthday
h5=env.t('habitBirthday')
small
=env.t('habitBirthdayText')
hr
div(ng-if='profile.achievements.rebirths')
.achievement.achievement-sun
h5(ng-if='profile.achievements.rebirths == 1')=env.t('rebirthBegan')
h5(ng-if='profile.achievements.rebirths > 1')
=env.t('rebirthText', {rebirths: "{{profile.achievements.rebirths}}"})
small
=env.t('rebirthOrb')
| {{profile.achievements.rebirthLevel}}.
hr
div(ng-if='profile.achievements.helpedHabit')
.achievement.achievement-tree
h5=env.t('helped')
small
=env.t('helpedText1')
a(href='http://community.habitrpg.com/node/290', target='_blank')=env.t('helpedText2')
hr
div(ng-if='profile.achievements.originalUser || profile.achievements.veteran')
.achievement.achievement-cake
div(ng-if='profile.achievements.veteran')
h5=env.t('veteran')
small=env.t('veteranText')
div(ng-if='profile.achievements.originalUser')
h5=env.t('originalUser')
small!=env.t('originalUserText')
hr
div(ng-if='profile.achievements.challenges || user._id == profile._id')
// This is a very strange icon to use. revisit
.achievement.achievement-karaoke(ng-show='profile.achievements.challenges')
div(ng-class='{muted: !profile.achievements.challenges}')
h5=env.t('challengeWinner')
table.table.table-striped
tr(ng-repeat='chal in profile.achievements.challenges')
td {{chal}}
hr
div(ng-if='profile.achievements.quests || user._id == profile._id')
.achievement.achievement-alien(ng-show='profile.achievements.quests')
div(ng-class='{muted: !profile.achievements.quests}')
h5=env.t('completedQuests')
table.table.table-striped
tr(ng-repeat='(k,v) in profile.achievements.quests')
td {{Content.quests[k].text}}
td x{{v}}
hr
div(ng-if='profile.achievements.snowball')
.achievement.achievement-snowball
h5=env.t('annoyingFriends')
small
=env.t('annoyingFriendsText', {snowballs: "{{profile.achievements.snowball}}"})
hr
div(ng-if='profile.achievements.habitBirthday')
.achievement.achievement-habitBirthday
h5=env.t('habitBirthday')
small
=env.t('habitBirthdayText')
hr

View file

@ -29,35 +29,35 @@ h4=env.t('attributes')
table.table.table-striped
tr(ng-repeat='(k,v) in {str:"Strength (STR)",int:"Intelligence (INT)",con:"Constitution (CON)",per:"Perception (PER)"}')
td
i.icon-question-sign(ng-show='k=="str"', popover-title=env.t('strength'), popover-placement='right', popover=env.t('strengthText'), popover-trigger='mouseenter', style='margin-right:3px')
i.icon-question-sign(ng-show='k=="con"', popover-title=env.t('constitution'), popover-placement='right', popover=env.t('conText') popover-trigger='mouseenter', style='margin-right:3px')
i.icon-question-sign(ng-show='k=="per"', popover-title=env.t('perception'), popover-placement='right', popover=env.t('perText'), popover-trigger='mouseenter', style='margin-right:3px')
i.icon-question-sign(ng-show='k=="int"', popover-title=env.t('intelligence'), popover-placement='right', popover=env.t('intText'), popover-trigger='mouseenter', style='margin-right:3px')
span.glyphicon.glyphicon-question-sign(ng-show='k=="str"', popover-title=env.t('strength'), popover-placement='right', popover=env.t('strengthText'), popover-trigger='mouseenter', style='margin-right:3px')
span.glyphicon.glyphicon-question-sign(ng-show='k=="con"', popover-title=env.t('constitution'), popover-placement='right', popover=env.t('conText') popover-trigger='mouseenter', style='margin-right:3px')
span.glyphicon.glyphicon-question-sign(ng-show='k=="per"', popover-title=env.t('perception'), popover-placement='right', popover=env.t('perText'), popover-trigger='mouseenter', style='margin-right:3px')
span.glyphicon.glyphicon-question-sign(ng-show='k=="int"', popover-title=env.t('intelligence'), popover-placement='right', popover=env.t('intText'), popover-trigger='mouseenter', style='margin-right:3px')
strong {{v}}: {{profile._statsComputed[k]}}
td
ul(style='list-style-type:none')
li(ng-show='profile.stats.lvl > 1')
i.icon-question-sign(popover-title=env.t('levelBonus'), popover-trigger='mouseenter', popover-placement='top', popover=env.t('levelBonusText'))
span.glyphicon.glyphicon-question-sign(popover-title=env.t('levelBonus'), popover-trigger='mouseenter', popover-placement='top', popover=env.t('levelBonusText'))
|
=env.t('level')
|: {{(profile.stats.lvl - 1) / 2}}&nbsp;
li(ng-show='Content.gear.flat[profile.items.gear.equipped.weapon][k] + Content.gear.flat[profile.items.gear.equipped.armor][k] + Content.gear.flat[profile.items.gear.equipped.head][k] + Content.gear.flat[profile.items.gear.equipped.shield][k] > 0')
i.icon-question-sign(popover-title=env.t('equipment'), popover-trigger='mouseenter', popover-placement='top', popover=env.t('equipmentBonusText'))
span.glyphicon.glyphicon-question-sign(popover-title=env.t('equipment'), popover-trigger='mouseenter', popover-placement='top', popover=env.t('equipmentBonusText'))
|
=env.t('equipment')
|: {{Content.gear.flat[profile.items.gear.equipped.weapon][k] + Content.gear.flat[profile.items.gear.equipped.armor][k] + Content.gear.flat[profile.items.gear.equipped.head][k] + Content.gear.flat[profile.items.gear.equipped.shield][k] || 0}}&nbsp;
li(ng-show='profile._statsComputed[k] - profile.stats.buffs[k] - ((profile.stats.lvl - 1) / 2) - Content.gear.flat[profile.items.gear.equipped.weapon][k] - Content.gear.flat[profile.items.gear.equipped.armor][k] - Content.gear.flat[profile.items.gear.equipped.head][k] - Content.gear.flat[profile.items.gear.equipped.shield][k] - profile.stats[k] > 0')
i.icon-question-sign(popover-title=env.t('classBonus'), popover-trigger='mouseenter', popover-placement='top', popover=env.t('classBonusText'))
span.glyphicon.glyphicon-question-sign(popover-title=env.t('classBonus'), popover-trigger='mouseenter', popover-placement='top', popover=env.t('classBonusText'))
|
=env.t('classEquipBonus')
|: {{profile._statsComputed[k] - profile.stats.buffs[k] - ((profile.stats.lvl - 1) / 2) - Content.gear.flat[profile.items.gear.equipped.weapon][k] - Content.gear.flat[profile.items.gear.equipped.armor][k] - Content.gear.flat[profile.items.gear.equipped.head][k] - Content.gear.flat[profile.items.gear.equipped.shield][k] - profile.stats[k]}}&nbsp;
li(ng-show='profile.stats[k] > 0')
i.icon-question-sign(popover-title=env.t('allocatedPoints'), popover-trigger='mouseenter', popover-placement='top', popover=env.t('allocatedPointsText'))
span.glyphicon.glyphicon-question-sign(popover-title=env.t('allocatedPoints'), popover-trigger='mouseenter', popover-placement='top', popover=env.t('allocatedPointsText'))
|
=env.t('allocated')
|: {{profile.stats[k] || 0}}&nbsp;
li(ng-show='profile.stats.buffs[k] > 0')
i.icon-question-sign(popover-title=env.t('buffs'), popover-trigger='mouseenter', popover-placement='top', popover=env.t('buffsText'))
span.glyphicon.glyphicon-question-sign(popover-title=env.t('buffs'), popover-trigger='mouseenter', popover-placement='top', popover=env.t('buffsText'))
|
=env.t('buffs')
|: {{profile.stats.buffs[k] || 0}}&nbsp;

View file

@ -2,122 +2,123 @@
// parts of the app. The alternative would be to create new scopes for different containing sections, but that
// started to get unwieldy
script(id='templates/habitrpg-tasks.html', type="text/ng-template")
.grid
.module(bindonce='lists', ng-repeat='list in lists', bo-class='{"rewards-module": list.type==="reward"}')
.task-column(class='{{list.type}}s')
.tasks-lists.container-fluid
.row
.col-md-3.col-sm-6(bindonce='lists', ng-repeat='list in lists', bo-class='{"rewards-module": list.type==="reward"}')
.task-column(class='{{list.type}}s')
// Todos export/graph options
span.option-box.pull-right(bo-if='main && list.type=="todo"')
a.option-action(ng-show='obj.history.todos', ng-click='toggleChart("todos")', tooltip=env.t('progress'))
i.icon-signal
//a.option-action(ng-href='/v1/users/{{user.id}}/calendar.ics?apiToken={{user.apiToken}}', tooltip='iCal')
a.option-action(ng-click='notPorted()', tooltip='iCal', ng-show='false')
i.icon-calendar
// <a href="https://www.google.com/calendar/render?cid={{encodeiCalLink(_user.id, _user.apiToken)}}" rel=tooltip title="Google Calendar"><i class=icon-calendar></i></a>
// Todos export/graph options
span.option-box.pull-right(bo-if='main && list.type=="todo"')
a.option-action(ng-show='obj.history.todos', ng-click='toggleChart("todos")', tooltip=env.t('progress'))
span.glyphicon.glyphicon-signal
//a.option-action(ng-href='/v1/users/{{user.id}}/calendar.ics?apiToken={{user.apiToken}}', tooltip='iCal')
a.option-action(ng-click='notPorted()', tooltip='iCal', ng-show='false')
span.glyphicon.glyphicon-calendar
// <a href="https://www.google.com/calendar/render?cid={{encodeiCalLink(_user.id, _user.apiToken)}}" rel=tooltip title="Google Calendar"><i class=icon-calendar></i></a>
// Gold & Gems
span.option-box.pull-right.wallet(bo-if='main && list.type=="reward"')
.money
| {{Shared.gold(user.stats.gp)}}
span.shop_gold(tooltip=env.t('gold'))
.money
| {{Shared.silver(user.stats.gp)}}
span.shop_silver(tooltip=env.t('silver'))
// Gold & Gems
span.option-box.pull-right.wallet(bo-if='main && list.type=="reward"')
.money
| {{Shared.gold(user.stats.gp)}}
span.shop_gold(tooltip=env.t('gold'))
.money
| {{Shared.silver(user.stats.gp)}}
span.shop_silver(tooltip=env.t('silver'))
// Header
h2.task-column_title {{list.header}}
// Header
h2.task-column_title {{list.header}}
// Todo Chart
.todos-chart(bo-if='list.type == "todo"', ng-show='charts.todos')
// Todo Chart
.todos-chart(bo-if='list.type == "todo"', ng-show='charts.todos')
// Add New
form.addtask-form.form-inline.new-task-form(name='new{{list.type}}form', ng-hide='obj._locked || (list.showCompleted && list.type=="todo")', ng-submit='addTask(obj[list.type+"s"],list)')
span.addtask-field
input(type='text', ng-model='list.newTask', placeholder='{{list.placeHolder}}', required)
input.addtask-btn(type='submit', value='', ng-disabled='new{{list.type}}form.$invalid')
hr
// Add New
form.addtask-form.form-inline.new-task-form(name='new{{list.type}}form', ng-hide='obj._locked || (list.showCompleted && list.type=="todo")', ng-submit='addTask(obj[list.type+"s"],list)')
span.addtask-field
input(type='text', ng-model='list.newTask', placeholder='{{list.placeHolder}}', required)
input.addtask-btn(type='submit', value='', ng-disabled='new{{list.type}}form.$invalid')
hr
// Actual List
ul(class='{{list.type}}s main-list', ng-show='obj[list.type + "s"].length > 0', habitrpg-sortable)
include ./task
// Actual List
ul(class='{{list.type}}s main-list', ng-show='obj[list.type + "s"].length > 0', habitrpg-sortable)
include ./task
// Static Rewards
ul.items.rewards(ng-if='main && list.type=="reward" && user.flags.itemsEnabled')
li.task.reward-item(ng-repeat='item in itemStore',popover-trigger='mouseenter', popover-placement='top', popover='{{item.notes}}')
// right-hand side control buttons
.task-meta-controls
span.task-notes
i.icon-comment
//left-hand size commands
.task-controls
a.money.btn-buy.item-btn(ng-click='buy(item)')
span.reward-cost {{item.value}}
span.shop_gold
// main content
span(bo-class='{"shop_{{item.key}} shop-sprite item-img": true}')
p.task-text {{item.text}}
// Static Rewards
ul.items.rewards(ng-if='main && list.type=="reward" && user.flags.itemsEnabled')
li.task.reward-item(ng-repeat='item in itemStore',popover-trigger='mouseenter', popover-placement='top', popover='{{item.notes}}')
// right-hand side control buttons
.task-meta-controls
span.task-notes
span.glyphicon.glyphicon-comment
//left-hand size commands
.task-controls
a.money.btn-buy.item-btn(ng-click='buy(item)')
span.reward-cost {{item.value}}
span.shop_gold
// main content
span(bo-class='{"shop_{{item.key}} shop-sprite item-img": true}')
p.task-text {{item.text}}
// Winter Event
ul.items.rewards(ng-if='main && list.type=="reward" && (user.items.special.snowball>0 || user.stats.buffs.snowball)')
li.task.reward-item(ng-if='user.items.special.snowball>0',popover-trigger='mouseenter', popover-placement='top', popover='{{Content.spells.special.snowball.notes}}')
.task-meta-controls
span.task-notes
i.icon-comment
//left-hand size commands
.task-controls
a.money.btn-buy.item-btn(ng-click='castStart(Content.spells.special.snowball)')
span.reward-cost {{user.items.special.snowball}}
span.shop_snowball(style='display:inline-block;vertical-align:top;')
// main content
p.task-text {{Content.spells.special.snowball.text}}
li.task.reward-item(ng-if='user.stats.buffs.snowball',popover-trigger='mouseenter', popover-placement='top', popover='{{Content.spells.special.salt.notes}}')
.task-meta-controls
span.task-notes
i.icon-comment
//left-hand size commands
.task-controls
a.money.btn-buy.item-btn(ng-click='castStart(Content.spells.special.salt)')
span.reward-cost {{Content.spells.special.salt.value}}
span.shop_gold
// main content
span.shop_salt.shop-sprite.item-img
p.task-text {{Content.spells.special.salt.text}}
// Winter Event
ul.items.rewards(ng-if='main && list.type=="reward" && (user.items.special.snowball>0 || user.stats.buffs.snowball)')
li.task.reward-item(ng-if='user.items.special.snowball>0',popover-trigger='mouseenter', popover-placement='top', popover='{{Content.spells.special.snowball.notes}}')
.task-meta-controls
span.task-notes
span.glyphicon.glyphicon-comment
//left-hand size commands
.task-controls
a.money.btn-buy.item-btn(ng-click='castStart(Content.spells.special.snowball)')
span.reward-cost {{user.items.special.snowball}}
span.shop_snowball(style='display:inline-block;vertical-align:top;')
// main content
p.task-text {{Content.spells.special.snowball.text}}
li.task.reward-item(ng-if='user.stats.buffs.snowball',popover-trigger='mouseenter', popover-placement='top', popover='{{Content.spells.special.salt.notes}}')
.task-meta-controls
span.task-notes
span.glyphicon.glyphicon-comment
//left-hand size commands
.task-controls
a.money.btn-buy.item-btn(ng-click='castStart(Content.spells.special.salt)')
span.reward-cost {{Content.spells.special.salt.value}}
span.shop_gold
// main content
span.shop_salt.shop-sprite.item-img
p.task-text {{Content.spells.special.salt.text}}
// Spells
ul.items(ng-if='main && list.type=="reward" && user.stats.class && !user.preferences.disableClasses')
li.task.reward-item(ng-repeat='(k,spell) in Content.spells[user.stats.class]', ng-if='user.stats.lvl >= spell.lvl',popover-trigger='mouseenter', popover-placement='top', popover='{{spell.notes}}')
.task-meta-controls
span.task-notes
i.icon-comment
//left-hand size commands
.task-controls
a.money.btn-buy.item-btn(ng-click='castStart(spell)')
span.reward-cost
strong {{spell.mana}}
=env.t('mp')
// main content
span(ng-class='{"shop_{{spell.key}} shop-sprite item-img": true}')
p.task-text {{spell.text}}
// Spells
ul.items(ng-if='main && list.type=="reward" && user.stats.class && !user.preferences.disableClasses')
li.task.reward-item(ng-repeat='(k,spell) in Content.spells[user.stats.class]', ng-if='user.stats.lvl >= spell.lvl',popover-trigger='mouseenter', popover-placement='top', popover='{{spell.notes}}')
.task-meta-controls
span.task-notes
span.glyphicon.glyphicon-comment
//left-hand size commands
.task-controls
a.money.btn-buy.item-btn(ng-click='castStart(spell)')
span.reward-cost
strong {{spell.mana}}
=env.t('mp')
// main content
span(ng-class='{"shop_{{spell.key}} shop-sprite item-img": true}')
p.task-text {{spell.text}}
br
br
// Ads
div(bo-if='main && !user.purchased.ads && !user.purchased.plan.customerId && list.type!="reward"')
span.pull-right
a(ui-sref='options.settings.subscription', popover=env.t('removeAds'), popover-trigger='mouseenter')
i.icon-remove
// Habit3
ins.adsbygoogle(ng-init='initAds()', style='display: inline-block; width: 234px; height: 60px;', data-ad-client='ca-pub-3242350243827794', data-ad-slot='9529624576')
// Ads
div(bo-if='main && !user.purchased.ads && !user.purchased.plan.customerId && list.type!="reward"')
span.pull-right
a(ui-sref='options.settings.subscription', popover=env.t('removeAds'), popover-trigger='mouseenter')
span.glyphicon.glyphicon-remove
// Habit3
ins.adsbygoogle(ng-init='initAds()', style='display: inline-block; width: 234px; height: 60px;', data-ad-client='ca-pub-3242350243827794', data-ad-slot='9529624576')
// Todo Tabs
div(bo-if='main && list.type=="todo"', bo-class='{"tabbable tabs-below": list.type=="todo"}')
div(ng-show='list.showCompleted')
.alert
=env.t('lotOfToDos')
button.task-action-btn.tile.spacious.bright(ng-click='user.ops.clearCompleted({})')=env.t('clearCompleted')
// remaining/completed tabs
ul.nav.nav-tabs
li(ng-class='{active: !list.showCompleted}')
a(ng-click='list.showCompleted = false')=env.t('remaining')
li(ng-class='{active: list.showCompleted}')
a(ng-click='list.showCompleted= true')=env.t('complete')
// Todo Tabs
div(bo-if='main && list.type=="todo"', bo-class='{"tabbable tabs-below": list.type=="todo"}')
div(ng-show='list.showCompleted')
.alert
=env.t('lotOfToDos')
button.task-action-btn.tile.spacious.bright(ng-click='user.ops.clearCompleted({})')=env.t('clearCompleted')
// remaining/completed tabs
ul.nav.nav-tabs
li(ng-class='{active: !list.showCompleted}')
a(ng-click='list.showCompleted = false')=env.t('remaining')
li(ng-class='{active: list.showCompleted}')
a(ng-click='list.showCompleted= true')=env.t('complete')

View file

@ -3,45 +3,55 @@ li(bindonce='list', bo-id='"task-"+task.id', ng-repeat='task in obj[list.type+"s
.task-meta-controls
// Due Date
span.task-date(ng-if='task.type=="todo" && task.date', style='margin:1px')
span(ng-class='{"label label-important":moment(task.date).isBefore(_today, "days")}') {{moment(task.date).format('MM/DD')}}
span(ng-if='task.type=="todo" && task.date')
span(ng-class='{"label label-danger":moment(task.date).isBefore(_today, "days")}') {{moment(task.date).format('MM/DD')}}
// Streak
| &nbsp;
span(ng-show='task.streak') {{task.streak}}
span(tooltip=env.t('streakCounter'))
i.icon-forward
span.glyphicon.glyphicon-forward
| &nbsp;
// Icons only available if you own the tasks (aka, hidden from challenge stats)
span(ng-if='!obj._locked')
a.badge(ng-if='task.checklist[0]', ng-class='{"badge-success":checklistCompletion(task.checklist) == task.checklist.length}', ng-click='collapseChecklist(task)', style='margin:1px')
{{checklistCompletion(task.checklist)}}/{{task.checklist.length}}
// tags
i.icon-tags(tooltip='{{Shared.appliedTags(user.tags, task.tags)}}', ng-hide='Shared.noTags(task.tags)')
| &nbsp;
span.glyphicon.glyphicon-tags(tooltip='{{Shared.appliedTags(user.tags, task.tags)}}', ng-hide='Shared.noTags(task.tags)')
// edit
a(ng-hide='task._editing', ng-click='editTask(task)', tooltip=env.t('edit'))
i.icon-pencil(ng-hide='task._editing')
| &nbsp;
span.glyphicon.glyphicon-pencil(ng-hide='task._editing')
| &nbsp;
// cancel
a(ng-hide='!task._editing', ng-click='editTask(task)', tooltip=env.t('cancel'))
i.icon-remove(ng-hide='!task._editing')
span.glyphicon.glyphicon-remove(ng-hide='!task._editing')
| &nbsp;
// save
a(ng-hide='!task._editing', ng-click='editTask(task);saveTask(task)', tooltip=env.t('save'))
i.icon-ok(ng-hide='!task._editing')
span.glyphicon.glyphicon-ok(ng-hide='!task._editing')
| &nbsp;
//challenges
span(ng-if='task.challenge.id')
span(ng-if='task.challenge.broken')
i.icon-bullhorn(style='background-color:red;', ng-click='task._editing = true', tooltip=env.t('brokenChaLink') tooltip-placement='right')
span.glyphicon.glyphicon-bullhorn(style='background-color:red;', ng-click='task._editing = true', tooltip=env.t('brokenChaLink') tooltip-placement='right')
| &nbsp;
span(ng-if='!task.challenge.broken')
i.icon-bullhorn(tooltip=env.t('challenge'))
span.glyphicon.glyphicon-bullhorn(tooltip=env.t('challenge'))
| &nbsp;
// delete
a(ng-if='!task.challenge.id', ng-click='removeTask(obj[list.type+"s"], $index)', tooltip=env.t('delete'))
i.icon-trash
span.glyphicon.glyphicon-trash
| &nbsp;
// chart
a(ng-show='task.history', ng-click='toggleChart(obj._id+task.id, task)', tooltip=env.t('progress'))
i.icon-signal
span.glyphicon.glyphicon-signal
| &nbsp;
// notes
span.task-notes(ng-show='task.notes && !task._editing')
i.icon-comment
span.glyphicon.glyphicon-comment
| &nbsp;
// left-hand side checkbox
.task-controls.task-primary
@ -108,19 +118,20 @@ li(bindonce='list', bo-id='"task-"+task.id', ng-repeat='task in obj[list.type+"s
// Checklists
div(ng-if='!$state.includes("options.social.challenges")')
a.btn.btn-small(ng-if='!task.checklist[0] && (task.type=="daily" || task.type=="todo")',ng-click='addChecklist(task)')
i.icon-tasks
button.btn.btn-deafult.btn-small(ng-if='!task.checklist[0] && (task.type=="daily" || task.type=="todo")',ng-click='addChecklist(task)')
span.glyphicon.glyphicon-tasks
| &nbsp; &nbsp;
=env.t('addChecklist')
form.checklist-form(ng-if='task.checklist')
fieldset.option-group.task-checklist(ng-if='!$state.includes("options.social.challenges")')
legend.option-title
=env.t('checklist')
| &nbsp;
i.icon.icon-question-sign(popover=env.t('checklistText'),popover-trigger='mouseenter',popover-placement='bottom')
ul.unstyled
| &nbsp; &nbsp;
span.glyphicon.glyphicon-question-sign(popover=env.t('checklistText'),popover-trigger='mouseenter',popover-placement='bottom')
ul.list-unstyled
li(ng-repeat='item in task.checklist')
a.pull-right.checklist-icons(ng-click='removeChecklistItem(task,$event,$index,true)')
i.icon-trash(tooltip=env.t('delete'))
span.glyphicon.glyphicon-trash(tooltip=env.t('delete'))
input(type='checkbox',ng-model='item.completed',ng-change='saveTask(task,true)')
input.inline-edit(type='text',ng-model='item.text',ui-keydown="{'8 46':'removeChecklistItem(task,$event,$index)'}",ui-keyup="{'13':'addChecklistItem(task,$event,$index)','38 40':'navigateChecklist(task,$index,$event)'}")//-,ng-blur='saveTask(task,true)')
@ -182,7 +193,8 @@ li(bindonce='list', bo-id='"task-"+task.id', ng-repeat='task in obj[list.type+"s
fieldset.option-group.advanced-option(ng-class="{visuallyhidden: task._advanced}")
legend.option-title
a.priority-multiplier-help(href='https://trello.com/card/priority-multiplier/50e5d3684fe3a7266b0036d6/17', target='_blank', popover-title=env.t('difficultyHelpTitle'), popover-trigger='mouseenter', popover=env.t('difficultyHelpContent'))
i.icon-question-sign
span.glyphicon.glyphicon-question-sign
| &nbsp;
=env.t('difficulty')
.task-controls.tile-group.priority-multiplier
button.task-action-btn.tile(type='button', ng-class='{active: task.priority==1 || !task.priority}', ng-click='task.challenge.id || (task.priority=1)')=env.t('easy')
@ -201,7 +213,7 @@ li(bindonce='list', bo-id='"task-"+task.id', ng-repeat='task in obj[list.type+"s
button.task-action-btn.tile(type='button', ng-class='{active: task.attribute=="con"}', ng-click='task.attribute="con"')=env.t('social')
button.task-action-btn.tile(type='button', ng-class='{active: task.attribute=="per"}', ng-click='task.attribute="per"', popover=env.t('otherExamples'), popover-trigger='mouseenter', popover-placement='top')=env.t('other')
|&nbsp;
i.icon-question-sign
span.glyphicon.glyphicon-question-sign
button.task-action-btn.tile.spacious(type='submit')=env.t('saveAndClose')

View file

@ -8,15 +8,16 @@ block title
title=env.t('companyAbout')
block content
.container
p(style='height:600;')
iframe(src='//player.vimeo.com/video/76557040', width='100%', height='539', frameborder='0', webkitallowfullscreen='', mozallowfullscreen='', allowfullscreen='')
p(style='height:600;')
iframe(src='//player.vimeo.com/video/57654086', width='100%', height='539', frameborder='0', webkitallowfullscreen='', mozallowfullscreen='', allowfullscreen='')
p(style='height:600;')
iframe(src='//player.vimeo.com/video/79172253', width='100%', height='539', frameborder='0', webkitallowfullscreen='', mozallowfullscreen='', allowfullscreen='')
p(style='height:600;')
iframe(src='//player.vimeo.com/video/79172327', width='100%', height='539', frameborder='0', webkitallowfullscreen='', mozallowfullscreen='', allowfullscreen='')
p(style='height:600;')
iframe(src='//player.vimeo.com/video/79172363', width='100%', height='539', frameborder='0', webkitallowfullscreen='', mozallowfullscreen='', allowfullscreen='')
.row
.col-md-12
p(style='height:600;')
iframe(src='//player.vimeo.com/video/76557040', width='100%', height='539', frameborder='0', webkitallowfullscreen='', mozallowfullscreen='', allowfullscreen='')
p(style='height:600;')
iframe(src='//player.vimeo.com/video/57654086', width='100%', height='539', frameborder='0', webkitallowfullscreen='', mozallowfullscreen='', allowfullscreen='')
p(style='height:600;')
iframe(src='//player.vimeo.com/video/79172253', width='100%', height='539', frameborder='0', webkitallowfullscreen='', mozallowfullscreen='', allowfullscreen='')
p(style='height:600;')
iframe(src='//player.vimeo.com/video/79172327', width='100%', height='539', frameborder='0', webkitallowfullscreen='', mozallowfullscreen='', allowfullscreen='')
p(style='height:600;')
iframe(src='//player.vimeo.com/video/79172363', width='100%', height='539', frameborder='0', webkitallowfullscreen='', mozallowfullscreen='', allowfullscreen='')

View file

@ -8,38 +8,36 @@ block title
title=env.t('titleFront')
block content
#wrap
//-include ./header
.marketing
//we need to use something that's not jumbotron for this, but still keep it centered
//could someone write something else to make it pretty?
img(src='/bower_components/habitrpg-shared/img/logo/habitrpg_pixel.png', alt='HabitRPG logo')
//this image needs to be replaced by something more enticing, that shows off the features of hRPG
//while acting similarly to a logo
h1(style='margin:10px 0 20px 0;font-size:40px')=env.t('tagline')
p
button.btn.btn-primary.btn-large.frontpage-play-button(ng-click='playButtonClick()')=env.t('playButton')
hr
img(src='/marketing/devices.png')
//we'd want the tagline centered, for sure, and a bit more pop, but without using jumbotron
//it could also be part of the image, as long as the alt text included it
//in fact, I think I really want it on the image, rather than as text, but language issues
br
p=env.t('landingp1')
h2=env.t('landingp2header')
//images in these parts could be useful, too
//if there's a language workaround, image headers? people like pictures!
p=env.t('landingp2')
h2=env.t('landingp3header')
//I'm not sold on "Consquences as the title here. Anyone got a better idea?
p=env.t('landingp3')
h2=env.t('landingp4header')
p=env.t('landingp4')
//- TODO
h2=env.t('landingend')
p
=env.t('landingend2')
a(href="FEATURESPAGEHERE")=env.t('landingfeatureslink')
=env.t('landingend3')
a(href="ENTERPRISEPAGEHERE")=env.t('landingadminlink')
=env.t('landingend4')
.marketing
//we need to use something that's not jumbotron for this, but still keep it centered
//could someone write something else to make it pretty?
img(src='/bower_components/habitrpg-shared/img/logo/habitrpg_pixel.png', alt='HabitRPG logo')
//this image needs to be replaced by something more enticing, that shows off the features of hRPG
//while acting similarly to a logo
h1#tagline=env.t('tagline')
p.lead
button.btn.btn-primary.btn-large#frontpage-play-button(ng-click='playButtonClick()')=env.t('playButton')
hr
img(src='/marketing/devices.png')
//we'd want the tagline centered, for sure, and a bit more pop, but without using jumbotron
//it could also be part of the image, as long as the alt text included it
//in fact, I think I really want it on the image, rather than as text, but language issues
br
p.lead=env.t('landingp1')
h2=env.t('landingp2header')
//images in these parts could be useful, too
//if there's a language workaround, image headers? people like pictures!
p.lead=env.t('landingp2')
h2=env.t('landingp3header')
//I'm not sold on "Consquences as the title here. Anyone got a better idea?
p.lead=env.t('landingp3')
h2=env.t('landingp4header')
p.lead=env.t('landingp4')
//- TODO
h2=env.t('landingend')
p.lead
=env.t('landingend2')
a(href="FEATURESPAGEHERE")=env.t('landingfeatureslink')
=env.t('landingend3')
a(href="ENTERPRISEPAGEHERE")=env.t('landingadminlink')
=env.t('landingend4')

View file

@ -1,30 +0,0 @@
//
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<a class="brand {{#if equal(@active,'front')}}active{{/}}" href="/static/front">HabitRPG</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li class="{{#if equal(@active,'about')}}active{{/}}">
<a href="/static/about">About</a>
</li>
<li class="">
<a target="_blank" href="http://habitrpg.tumblr.com/">Blog</a>
</li>
<li class="">
<a target="_blank" href="http://community.habitrpg.com/">Community</a>
</li>
<li class="{{#if equal(@active,'team')}}team{{/}}">
<a href="/static/team">Team</a>
</li>
<li class="{{#if equal(@active,'extensions')}}active{{/}}">
<a href="/static/extensions">Extensions</a>
</li>
<li class="{{#if equal(@active,'faq')}}active{{/}}">
<a href="/static/faq">FAQ</a>
</li>
</ul>
</div>
</div>
</div>
</div>

View file

@ -10,32 +10,41 @@ html(ng-app='habitrpgStatic')
script(type='text/javascript').
window.env = !{JSON.stringify(env)};
link(rel='shortcut icon', href='#{env.getBuildUrl("favicon.ico")}?v=2')
link(rel='shortcut icon', href='#{env.getBuildUrl("favicon.ico")}?v=3')
meta(charset='utf-8')
meta(name='viewport', content='width=device-width, initial-scale=1.0')
style.
[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
display: none;
}
!= env.getManifestFiles("static")
body
div(ng-controller='AuthCtrl',style='margin-top:60px;')
include ./login-modal
.navbar.navbar-inverse.navbar.navbar-inverse.navbar-fixed-top
.navbar-inner
.container
a.pull-right.btn.btn-primary(ng-click='playButtonClick()')=env.t('playButton')
nav.navbar.navbar-inverse.navbar-fixed-top
.navbar-header
button.navbar-toggle(type='button', ng-click='isNavbarCollapsed = !isNavbarCollapsed', ng-init='isNavbarCollapsed = true')
span.sr-only Toggle navigation
span.icon-bar
span.icon-bar
span.icon-bar
a.navbar-brand(href='/static/front') HabitRPG
.collapse.navbar-collapse(collapse="isNavbarCollapsed")
ul.nav.navbar-nav
li(class='#{menuItem=="about" ? "active" : ""}')
a(href='/static/about')=env.t('learnMore')
li
a(href='http://blog.habitrpg.com/')=env.t('companyBlog')
li(class='#{menuItem=="plans" ? "active" : ""}')
a(href='/static/plans')=env.t('groupPlans')
//li(class='#{menuItem=="contact" ? "active" : ""}')
a(href='/static/contact')=env.t('contact')
ul.nav
li(class='#{menuItem=="home" ? "active" : ""}')
a(href='/static/front')=env.t('home')
li(class='#{menuItem=="about" ? "active" : ""}')
a(href='/static/about')=env.t('learnMore')
li
a(href='http://blog.habitrpg.com/')=env.t('companyBlog')
li(class='#{menuItem=="plans" ? "active" : ""}')
a(href='/static/plans')=env.t('groupPlans')
//li(class='#{menuItem=="contact" ? "active" : ""}')
a(href='/static/contact')=env.t('contact')
button#header-play-button.btn.btn-primary.navbar-btn.navbar-right(ng-click='playButtonClick()')=env.t('playButton')
.container
block content

View file

@ -1,69 +1,69 @@
.modal.fade#login-modal(style='display:none')
.modal-dialog
.modal-content
.modal-header
button.close(type='button', data-dismiss='modal', aria-hidden='true') ×
h4.modal-title=env.t('loginAndReg')
.modal-body
a(href='/auth/facebook')
img(src='/bower_components/habitrpg-shared/img/facebook-login-register.jpeg', alt=env.t('loginFacebookAlt'))
//can we add in google auth? I like google auth
h3 Or
ul.nav.nav-tabs
li.active
a(data-toggle='tab',data-target='#login-tab')=env.t('login')
li
a(data-toggle='tab',data-target='#register-tab')=env.t('register')
script(id='modals/login.html', type='text/ng-template')
.modal-header
button.close(type='button', ng-click='$close()') ×
h4.modal-title=env.t('loginAndReg')
.modal-body(ng-controller='AuthCtrl')
a(href='/auth/facebook')
img(src='/bower_components/habitrpg-shared/img/facebook-login-register.jpeg', alt=env.t('loginFacebookAlt'))
//can we add in google auth? I like google auth
h3 Or
ul.nav.nav-tabs
li.active
a(data-toggle='tab',data-target='#login-tab')=env.t('login')
li
a(data-toggle='tab',data-target='#register-tab')=env.t('register')
.tab-content
.tab-pane.active#login-tab
form(ng-submit='auth()', method='POST')
.control-group
input(type='text', ng-model='loginUsername', placeholder=env.t('username'), name='username')
.control-group
input(type='password', ng-model='loginPassword', placeholder=env.t('password'), name='password')
//-.control-group
label.checkbox
input(type='checkbox', ng-click='useUUID = !useUUID')
=env.t('useUUID')
.control-group
input.btn.btn-primary(type='submit', value=env.t('login'))
.tab-content
.tab-pane.active#login-tab
form(ng-submit='auth()', method='POST')
.form-group
input.form-control(type='text', ng-model='loginUsername', placeholder=env.t('username'), name='username')
.form-group
input.form-control(type='password', ng-model='loginPassword', placeholder=env.t('password'), name='password')
//-.control-group
label.checkbox
input(type='checkbox', ng-click='useUUID = !useUUID')
=env.t('useUUID')
.form-group
input.btn.btn-primary(type='submit', value=env.t('login'))
small=env.t('passMan')
small=env.t('passMan')
br
br
// good god accordions have html ceremony
#forgot-password-accordion.accordion
.accordion-group
.accordion-heading
a.accordion-toggle(data-toggle='collapse', data-parent='#forgot-password-accordion', href='#forgot-password-group')=env.t('forgotPass')
#forgot-password-group.accordion-body.collapse
.accordion-inner
form#derby-auth-password-reset(ng-submit='passwordReset(passwordResetEmail)')
h3=env.t('emailNewPass')
//.alert.alert-success {.success.passwordReset}
//.control-group.{#if..errors.passwordReset}error{/}
.control-group
input(type='text', name='email', placeholder=env.t('email') , ng-model='passwordResetEmail')
//span.help-inline {.errors.passwordReset}
input.btn(type='submit', value=env.t('submit'))
// good god accordions have html ceremony
.panel-group#forgot-password
.panel.panel-default
.panel-heading
h3.panel-title
a(data-toggle="collapse" data-parent="#forgot-password" href="#forgot-password-panel")=env.t('forgotPass')
.panel-body.collapse#forgot-password-panel
form(ng-submit='passwordReset(passwordResetEmail)')
//.alert.alert-success {.success.passwordReset}
//.control-group.{#if..errors.passwordReset}error{/}
h3=env.t('emailNewPass')
.form-group
input.form-control(type='text', name='email', placeholder=env.t('email') , ng-model='passwordResetEmail')
//span.help-inline {.errors.passwordReset}
.form-group
input.btn(type='submit', value=env.t('submit'))
.tab-pane#register-tab
form(ng-submit='register()', name='registrationForm')
.control-group
input(type='text', ng-model='registerVals.username', placeholder=env.t('username'), required)
.control-group
input(type='email', ng-model='registerVals.email', placeholder=env.t('email'), required)
.control-group
input(type='password', ng-model='registerVals.password', placeholder=env.t('password'), required)
.control-group
input(type='password', ng-model='registerVals.confirmPassword', placeholder=env.t('passConfirm'), required)
.control-group
small=env.t('accept1Terms')
a(href='/static/terms' target='_blank')=env.t('terms')
=env.t('accept2Terms')
a(href='/static/privacy' target='_blank')=env.t('privacy')
| .
input.btn.btn-primary(type='submit', value=env.t('register'))
.tab-pane#register-tab
form(ng-submit='register()', name='registrationForm')
.form-group
input.form-control(type='text', ng-model='registerVals.username', placeholder=env.t('username'), required)
.form-group
input.form-control(type='email', ng-model='registerVals.email', placeholder=env.t('email'), required)
.form-group
input.form-control(type='password', ng-model='registerVals.password', placeholder=env.t('password'), required)
.form-group
input.form-control(type='password', ng-model='registerVals.confirmPassword', placeholder=env.t('passConfirm'), required)
.form-group
small=env.t('accept1Terms')
a(href='/static/terms' target='_blank')=env.t('terms')
=env.t('accept2Terms')
a(href='/static/privacy' target='_blank')=env.t('privacy')
| .
.form-group
input.btn.btn-primary(type='submit', value=env.t('register'))

View file

@ -8,90 +8,94 @@ block title
title=env.t('groupPlans')
block content
h2=env.t('groupPlans')
.row
.col-md-12
h2=env.t('groupPlans')
p
=env.t('indivPlan1')
a(href='http://habitrpg.wikia.com/wiki/Guilds' target='_blank')=env.t('guilds')
= ' ' + env.t('and') + ' '
a(href='http://habitrpg.wikia.com/wiki/Challenges' target='_blank')=env.t('challenges')
=env.t('indivPlan2')
p
=env.t('groupText1')
a(href='http://habitrpg.wikia.com/wiki/Habitica' target='_blank')=env.t('habitica')
|.&nbsp;
=env.t('groupText2')
p
=env.t('indivPlan1')
a(href='http://habitrpg.wikia.com/wiki/Guilds' target='_blank')=env.t('guilds')
= ' ' + env.t('and') + ' '
a(href='http://habitrpg.wikia.com/wiki/Challenges' target='_blank')=env.t('challenges')
=env.t('indivPlan2')
p
=env.t('groupText1')
a(href='http://habitrpg.wikia.com/wiki/Habitica' target='_blank')=env.t('habitica')
|.&nbsp;
=env.t('groupText2')
.subscription-features
table.table.table-striped
tr
th.feature-name
th.feature-name.muted=env.t('planFamily')
th.feature-name.muted=env.t('planGroup')
th.feature-name=env.t('organization')
tr
th
span.dashed-underline(popover=env.t('organizationSubText'),popover-trigger='mouseenter',popover-placement='right')=env.t('organizationSub')
td.muted
i.icon-ok
td.muted
i.icon-ok
td
i.icon-ok
tr
th
span.dashed-underline(popover=env.t('dedicatedHostText'),popover-trigger='mouseenter',popover-placement='right')=env.t('dedicatedHost')
td
td
td
i.icon-ok
tr
th
span.dashed-underline(popover=env.t('customDomainText'),popover-trigger='mouseenter',popover-placement='right')=env.t('customDomain')
td
td
td
i.icon-ok
tr
th
span.dashed-underline(popover=env.t('maxPlayersText'),popover-trigger='mouseenter',popover-placement='right')=env.t('maxPlayers')
td.muted 10
td.muted 75
td=env.t('unlimited')
tr
th
span.dashed-underline(popover=env.t('priSupportText'),popover-trigger='mouseenter',popover-placement='right')=env.t('priSupport')
td
td
td
i.icon-ok
tr
th
span.dashed-underline(popover=env.t('timeSupportText'),popover-trigger='mouseenter',popover-placement='right')=env.t('timeSupport')
td.muted -
td.muted 5
td 10
tr
th
h5=env.t('gameFeatures') + ':'
ul
li=env.t('gameNoAds')
li
span.dashed-underline(popover=env.t('gold2GemText'),popover-trigger='mouseenter',popover-placement='right')=env.t('gold2Gem')
li
span.dashed-underline(popover=env.t('infiniteGemText'),popover-trigger='mouseenter',popover-placement='right')=env.t('infiniteGem')
td.muted
i.icon-ok
td.muted
i.icon-ok
td
i.icon-ok
tr
th
//| Price
td
a.btn.muted(href='https://docs.google.com/forms/d/17torT7OlxgtbHAPdBDRQNG2lTdIQyrGXk4O2YXvUMig/viewform',popover=env.t('notYetPlan'),popover-placement='right',popover-trigger='mouseenter')=env.t('contactUs')
td
a.btn.muted(href='https://docs.google.com/forms/d/17torT7OlxgtbHAPdBDRQNG2lTdIQyrGXk4O2YXvUMig/viewform',popover=env.t('notYetPlan'),popover-placement='right',popover-trigger='mouseenter')=env.t('contactUs')
td
a.btn.btn-primary(href='https://docs.google.com/forms/d/12Jqj_8f3oQS0B3ZUHewHbK61uLjBdzBeB0zyEqB9lxM/viewform')=env.t('contactUs')
.subscription-features
table.table.table-striped
thead
tr
th.feature-name
th.feature-name.muted=env.t('planFamily')
th.feature-name.muted=env.t('planGroup')
th.feature-name=env.t('organization')
tbody
tr
th
span.dashed-underline(popover=env.t('organizationSubText'),popover-trigger='mouseenter',popover-placement='right')=env.t('organizationSub')
td.muted
span.glyphicon.glyphicon-ok
td.muted
span.glyphicon.glyphicon-ok
td
span.glyphicon.glyphicon-ok
tr
th
span.dashed-underline(popover=env.t('dedicatedHostText'),popover-trigger='mouseenter',popover-placement='right')=env.t('dedicatedHost')
td
td
td
span.glyphicon.glyphicon-ok
tr
th
span.dashed-underline(popover=env.t('customDomainText'),popover-trigger='mouseenter',popover-placement='right')=env.t('customDomain')
td
td
td
span.glyphicon.glyphicon-ok
tr
th
span.dashed-underline(popover=env.t('maxPlayersText'),popover-trigger='mouseenter',popover-placement='right')=env.t('maxPlayers')
td.muted 10
td.muted 75
td=env.t('unlimited')
tr
th
span.dashed-underline(popover=env.t('priSupportText'),popover-trigger='mouseenter',popover-placement='right')=env.t('priSupport')
td
td
td
span.glyphicon.glyphicon-ok
tr
th
span.dashed-underline(popover=env.t('timeSupportText'),popover-trigger='mouseenter',popover-placement='right')=env.t('timeSupport')
td.muted -
td.muted 5
td 10
tr
th
h5=env.t('gameFeatures') + ':'
ul
li=env.t('gameNoAds')
li
span.dashed-underline(popover=env.t('gold2GemText'),popover-trigger='mouseenter',popover-placement='right')=env.t('gold2Gem')
li
span.dashed-underline(popover=env.t('infiniteGemText'),popover-trigger='mouseenter',popover-placement='right')=env.t('infiniteGem')
td.muted
span.glyphicon.glyphicon-ok
td.muted
span.glyphicon.glyphicon-ok
td
span.glyphicon.glyphicon-ok
tr
th
//| Price
td
a.btn.muted(href='https://docs.google.com/forms/d/17torT7OlxgtbHAPdBDRQNG2lTdIQyrGXk4O2YXvUMig/viewform',popover=env.t('notYetPlan'),popover-placement='right',popover-trigger='mouseenter')=env.t('contactUs')
td
a.btn.muted(href='https://docs.google.com/forms/d/17torT7OlxgtbHAPdBDRQNG2lTdIQyrGXk4O2YXvUMig/viewform',popover=env.t('notYetPlan'),popover-placement='right',popover-trigger='mouseenter')=env.t('contactUs')
td
a.btn.btn-primary(href='https://docs.google.com/forms/d/12Jqj_8f3oQS0B3ZUHewHbK61uLjBdzBeB0zyEqB9lxM/viewform')=env.t('contactUs')

View file

@ -7,9 +7,8 @@ block title
title HabitRPG &VerticalLine; Privacy
block content
#wrap
//app:header:header
.container
.row
.col-md-12
.page-header
h1 Privacy Policy
p.pagemeta
@ -306,5 +305,4 @@ block content
br
| Telephone&colon; 1-805-975-5236
p
#home_static_footer
| &copy; 2012 OCDevel

View file

@ -7,9 +7,8 @@ block title
title HabitRPG &VerticalLine; Terms
block content
#wrap
//app:header:header
.container
.row
.col-md-12
.page-header
h1 Terms of Use
p