From f0ebd597b322c20590a4b859e9e4da827925baac Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Wed, 29 Jan 2014 16:44:12 +0100 Subject: [PATCH 01/42] refactor(dependencies): update dependencies for bootstrap 3 upgrade @lefnire --- bower.json | 19 +++++++++---------- public/css/index.styl | 2 -- public/manifest.json | 11 ++--------- 3 files changed, 11 insertions(+), 21 deletions(-) diff --git a/bower.json b/bower.json index 74fea1a96d..7290b31c4c 100644 --- a/bower.json +++ b/bower.json @@ -14,20 +14,22 @@ "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-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": "~3.0.3", + "bootstrap-datepicker": "1.3.0", "bootstrap-growl": "~1.1.0", + "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,11 +39,8 @@ "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" diff --git a/public/css/index.styl b/public/css/index.styl index fb2d74a615..748b6e2b24 100644 --- a/public/css/index.styl +++ b/public/css/index.styl @@ -4,8 +4,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" diff --git a/public/manifest.json b/public/manifest.json index 2d616d2a19..1fc977153f 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -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,7 +21,6 @@ "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", @@ -63,7 +61,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" ] @@ -74,9 +72,6 @@ "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", @@ -87,9 +82,7 @@ "js/controllers/authCtrl.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" ] From 4c9da6883fe1149fa118292f87d309d1ce152889 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Wed, 29 Jan 2014 18:26:58 +0100 Subject: [PATCH 02/42] refactor(bs3): static pages works everything exeception made for the login modal, it opens but since this directive has had a lot of changes in angular-ui-bootstrap it will require more work (like all modals), @lefnire --- public/css/footer.styl | 85 +-------------- public/css/index.styl | 1 - public/css/shared.styl | 5 +- public/css/static-pages.css | 21 ---- public/css/static.styl | 20 +++- public/js/controllers/authCtrl.js | 8 +- src/routes/pages.js | 24 +++-- views/shared/footer.jade | 26 ++--- views/static/about.jade | 23 ++-- views/static/front.jade | 68 ++++++------ views/static/header.jade | 30 ------ views/static/layout.jade | 39 +++---- views/static/login-modal.jade | 122 +++++++++++---------- views/static/plans.jade | 172 +++++++++++++++--------------- views/static/privacy.jade | 6 +- views/static/terms.jade | 5 +- 16 files changed, 280 insertions(+), 375 deletions(-) delete mode 100644 public/css/static-pages.css delete mode 100644 views/static/header.jade diff --git a/public/css/footer.styl b/public/css/footer.styl index 0f39a09f1b..31cddc1e2e 100644 --- a/public/css/footer.styl +++ b/public/css/footer.styl @@ -1,83 +1,8 @@ -/* 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 \ No newline at end of file +.footer + padding-top: 20px + margin-top: 40px + border-top: 1px solid #e5e5e5 + background-color: #f5f5f5 \ No newline at end of file diff --git a/public/css/index.styl b/public/css/index.styl index 748b6e2b24..f777bb5769 100644 --- a/public/css/index.styl +++ b/public/css/index.styl @@ -78,7 +78,6 @@ div.tooltip-inner { /* 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 */ diff --git a/public/css/shared.styl b/public/css/shared.styl index 1766422a59..00dba37fe4 100644 --- a/public/css/shared.styl +++ b/public/css/shared.styl @@ -13,4 +13,7 @@ .dashed-underline border-bottom:1px dashed #000 text-decoration:none - cursor pointer \ No newline at end of file + cursor pointer + +img + max-width: 100% \ No newline at end of file diff --git a/public/css/static-pages.css b/public/css/static-pages.css deleted file mode 100644 index f617e486e2..0000000000 --- a/public/css/static-pages.css +++ /dev/null @@ -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; -} \ No newline at end of file diff --git a/public/css/static.styl b/public/css/static.styl index fe576834e7..02605f3960 100644 --- a/public/css/static.styl +++ b/public/css/static.styl @@ -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 \ No newline at end of file + 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 \ No newline at end of file diff --git a/public/js/controllers/authCtrl.js b/public/js/controllers/authCtrl.js index 1c50d56be9..26f502bec1 100644 --- a/public/js/controllers/authCtrl.js +++ b/public/js/controllers/authCtrl.js @@ -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; @@ -80,7 +80,9 @@ angular.module('authCtrl', []) if (User.authenticated()) { window.location.href = '/#/tasks'; } else { - $('#login-modal').modal('show'); + $modal.open({ + templateUrl: 'modals/login.html' + }); } } diff --git a/src/routes/pages.js b/src/routes/pages.js index a5ef570e2c..1458a6f7ca 100644 --- a/src/routes/pages.js +++ b/src/routes/pages.js @@ -24,27 +24,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 -------- diff --git a/views/shared/footer.jade b/views/shared/footer.jade index d85a8ce8f7..57c1d37f96 100644 --- a/views/shared/footer.jade +++ b/views/shared/footer.jade @@ -1,20 +1,20 @@ footer.footer(ng-controller='FooterCtrl') .container .row - .span3 + .col-md-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-md-3 h4=env.t('footerCompany') - ul.unstyled + ul.list-unstyled.list-unstyled if (!env.isFrontPage) li .btn.btn-small.btn-success(ng-click='modals.buyGems = true') - i.icon-heart.icon-white + 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-md-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-md-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')) @@ -66,14 +66,14 @@ footer.footer(ng-controller='FooterCtrl') a.addthis_button_google_plusone(g:plusone:size='medium') else 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()') diff --git a/views/static/about.jade b/views/static/about.jade index 6340ef31af..1e635d1bc3 100644 --- a/views/static/about.jade +++ b/views/static/about.jade @@ -8,15 +8,16 @@ block title title About 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='') diff --git a/views/static/front.jade b/views/static/front.jade index f669785860..379ce36a8f 100644 --- a/views/static/front.jade +++ b/views/static/front.jade @@ -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') diff --git a/views/static/header.jade b/views/static/header.jade deleted file mode 100644 index 6a9223a5e0..0000000000 --- a/views/static/header.jade +++ /dev/null @@ -1,30 +0,0 @@ -// - diff --git a/views/static/layout.jade b/views/static/layout.jade index fad18bac00..dea3788eed 100644 --- a/views/static/layout.jade +++ b/views/static/layout.jade @@ -7,35 +7,36 @@ html block title title=env.t('titleIndex') - 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') != env.getManifestFiles("static") - script(type='text/javascript'). - $.getScript("//s7.addthis.com/js/250/addthis_widget.js#pubid=lefnire"); - body div(ng-app='habitrpgStatic',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') Learn More + li + a(href='http://blog.habitrpg.com/') Blog + li(class='#{menuItem=="plans" ? "active" : ""}') + a(href='/static/plans') Plans + //li(class='#{menuItem=="contact" ? "active" : ""}') + a(href='/static/contact') Contact - ul.nav - li(class='#{menuItem=="home" ? "active" : ""}') - a(href='/static/front') Home - li(class='#{menuItem=="about" ? "active" : ""}') - a(href='/static/about') Learn More - li - a(href='http://blog.habitrpg.com/') Blog - li(class='#{menuItem=="plans" ? "active" : ""}') - a(href='/static/plans') Group Plans - //li(class='#{menuItem=="contact" ? "active" : ""}') - a(href='/static/contact') Contact + button#header-play-button.btn.btn-primary.navbar-btn.navbar-right(ng-click='playButtonClick()')=env.t('playButton') .container block content diff --git a/views/static/login-modal.jade b/views/static/login-modal.jade index c9710af000..5430301582 100644 --- a/views/static/login-modal.jade +++ b/views/static/login-modal.jade @@ -1,69 +1,67 @@ -.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') × + 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') - .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') + .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')) - small=env.t('passMan') + small=env.t('passMan') - // 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 + #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')) - .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') + .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')) diff --git a/views/static/plans.jade b/views/static/plans.jade index 1699d5a2b3..3fc613e1f0 100644 --- a/views/static/plans.jade +++ b/views/static/plans.jade @@ -8,89 +8,93 @@ block title title Group Plans block content - h2 Group Plans + .row + .col-md-12 + h2 Group Plans - p For individuals, HabitRPG is free to play. Even for small interest groups, free (or cheap) guilds and challenges can be used to motivate participants in behavioral modification. Think writing groups, art challenges, and more. - p But some group leaders will want more control, privacy, security, and support. Examples of such groups are families, health and wellness groups, employee groups, and more. These plans provide private instances of HabitRPG for your group or organization, secure and independent of Habitica. See below for additional plan perks, and contact us for more information! + p For individuals, HabitRPG is free to play. Even for small interest groups, free (or cheap) guilds and challenges can be used to motivate participants in behavioral modification. Think writing groups, art challenges, and more. + p But some group leaders will want more control, privacy, security, and support. Examples of such groups are families, health and wellness groups, employee groups, and more. These plans provide private instances of HabitRPG for your group or organization, secure and independent of Habitica. See below for additional plan perks, and contact us for more information! - .subscription-features - table.table.table-striped - tr - th.feature-name - th.feature-name.muted Family (Coming Soon) - th.feature-name.muted Group (Coming Soon) - th.feature-name Organization - tr - th - span.dashed-underline(popover="Members of the organization participate outside of HabitRPG proper, providing focus for your participants.",popover-trigger='mouseenter',popover-placement='right') - | Private Organization - td.muted - i.icon-ok - td.muted - i.icon-ok - td - i.icon-ok - tr - th - span.dashed-underline(popover="Dedicated Hosting: you get your own database and server hosted by HabitRPG, or optionally we'll install it in your organization's network. If not checked, the plan uses \"Shared Hosting\": your organization uses the same database as HabitRPG proper while performing independently Habitica. Your members are shielded from Tavern & Guilds, but still on the same server/database.",popover-trigger='mouseenter',popover-placement='right') - | Dedicated Hosting - td - td - td - i.icon-ok - tr - th - span.dashed-underline(popover="We can optionally give you your own domain for the installation.",popover-trigger='mouseenter',popover-placement='right') - | Custom Domain - td - td - td - i.icon-ok - tr - th - span.dashed-underline(popover="The maximum number of players in your private organization.",popover-trigger='mouseenter',popover-placement='right') - | Max Participants - td.muted 10 - td.muted 75 - td Unlimited - tr - th - span.dashed-underline(popover="First to be provided for with support.",popover-trigger='mouseenter',popover-placement='right') - | Priority Support On Tickets & Hosting - td - td - td - i.icon-ok - tr - th - span.dashed-underline(popover="We will provide support for training, bugs, installation, and feature requests. Additional hours available at an hourly rate.",popover-trigger='mouseenter',popover-placement='right') - | Support Hours / Month - td.muted - - td.muted 5 - td 10 - tr - th - h5 Game features: - ul - li Ads disabled for members - li - span.dashed-underline(popover="Members will be able to purchase gems with gold, meaning none of your participants need to buy anything with real money.",popover-trigger='mouseenter',popover-placement='right') - | Gems purchasable with gold - li - span.dashed-underline(popover="We will provide the organization leaders with as many gems as they need, for things like challenge prizes, guild-creation, etc.",popover-trigger='mouseenter',popover-placement='right') - | Infinite leader gems - td.muted - i.icon-ok - td.muted - i.icon-ok - td - i.icon-ok - tr - th - //| Price - td - a.btn(href='https://docs.google.com/forms/d/17torT7OlxgtbHAPdBDRQNG2lTdIQyrGXk4O2YXvUMig/viewform',popover="Plan not yet available, but click to contact us and we'll keep you updated.",popover-placement='right',popover-trigger='mouseenter') Contact Us - td - a.btn.muted(href='https://docs.google.com/forms/d/17torT7OlxgtbHAPdBDRQNG2lTdIQyrGXk4O2YXvUMig/viewform',popover="Plan not yet available, but click to contact us and we'll keep you updated.",popover-placement='right',popover-trigger='mouseenter') Contact Us - td - a.btn.btn-primary(href='https://docs.google.com/forms/d/12Jqj_8f3oQS0B3ZUHewHbK61uLjBdzBeB0zyEqB9lxM/viewform') Contact Us \ No newline at end of file + .subscription-features + table.table.table-striped + thead + tr + th.feature-name + th.feature-name.muted Family (Coming Soon) + th.feature-name.muted Group (Coming Soon) + th.feature-name Organization + tbody + tr + th + span.dashed-underline(popover="Members of the organization participate outside of HabitRPG proper, providing focus for your participants.",popover-trigger='mouseenter',popover-placement='right') + | Private Organization + td.muted + span.glyphicon.glyphicon-ok + td.muted + span.glyphicon.glyphicon-ok + td + span.glyphicon.glyphicon-ok + tr + th + span.dashed-underline(popover="Dedicated Hosting: you get your own database and server hosted by HabitRPG, or optionally we'll install it in your organization's network. If not checked, the plan uses \"Shared Hosting\": your organization uses the same database as HabitRPG proper while performing independently Habitica. Your members are shielded from Tavern & Guilds, but still on the same server/database.",popover-trigger='mouseenter',popover-placement='right') + | Dedicated Hosting + td + td + td + span.glyphicon.glyphicon-ok + tr + th + span.dashed-underline(popover="We can optionally give you your own domain for the installation.",popover-trigger='mouseenter',popover-placement='right') + | Custom Domain + td + td + td + span.glyphicon.glyphicon-ok + tr + th + span.dashed-underline(popover="The maximum number of players in your private organization.",popover-trigger='mouseenter',popover-placement='right') + | Max Participants + td.muted 10 + td.muted 75 + td Unlimited + tr + th + span.dashed-underline(popover="First to be provided for with support.",popover-trigger='mouseenter',popover-placement='right') + | Priority Support On Tickets & Hosting + td + td + td + span.glyphicon.glyphicon-ok + tr + th + span.dashed-underline(popover="We will provide support for training, bugs, installation, and feature requests. Additional hours available at an hourly rate.",popover-trigger='mouseenter',popover-placement='right') + | Support Hours / Month + td.muted - + td.muted 5 + td 10 + tr + th + h5 Game features: + ul + li Ads disabled for members + li + span.dashed-underline(popover="Members will be able to purchase gems with gold, meaning none of your participants need to buy anything with real money.",popover-trigger='mouseenter',popover-placement='right') + | Gems purchasable with gold + li + span.dashed-underline(popover="We will provide the organization leaders with as many gems as they need, for things like challenge prizes, guild-creation, etc.",popover-trigger='mouseenter',popover-placement='right') + | Infinite leader gems + td.muted + span.glyphicon.glyphicon-ok + td.muted + span.glyphicon.glyphicon-ok + td + span.glyphicon.glyphicon-ok + tr + th + //| Price + td + a.btn(href='https://docs.google.com/forms/d/17torT7OlxgtbHAPdBDRQNG2lTdIQyrGXk4O2YXvUMig/viewform',popover="Plan not yet available, but click to contact us and we'll keep you updated.",popover-placement='right',popover-trigger='mouseenter') Contact Us + td + a.btn.muted(href='https://docs.google.com/forms/d/17torT7OlxgtbHAPdBDRQNG2lTdIQyrGXk4O2YXvUMig/viewform',popover="Plan not yet available, but click to contact us and we'll keep you updated.",popover-placement='right',popover-trigger='mouseenter') Contact Us + td + a.btn.btn-primary(href='https://docs.google.com/forms/d/12Jqj_8f3oQS0B3ZUHewHbK61uLjBdzBeB0zyEqB9lxM/viewform') Contact Us \ No newline at end of file diff --git a/views/static/privacy.jade b/views/static/privacy.jade index f51601be32..5a6519dec9 100644 --- a/views/static/privacy.jade +++ b/views/static/privacy.jade @@ -7,9 +7,8 @@ block title title HabitRPG | 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: 1-805-975-5236 p - #home_static_footer | © 2012 OCDevel \ No newline at end of file diff --git a/views/static/terms.jade b/views/static/terms.jade index 527b2589d5..4e3b0cb5e1 100644 --- a/views/static/terms.jade +++ b/views/static/terms.jade @@ -7,9 +7,8 @@ block title title HabitRPG | Terms block content - #wrap - //app:header:header - .container + .row + .col-md-12 .page-header h1 Terms of Use p From 3f3869ea28b6e6bc7c20e0cddb7f3afbf0897bdf Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Wed, 29 Jan 2014 18:37:51 +0100 Subject: [PATCH 03/42] refactor(bs3): working login modals, had to readd bootstrap origin javascript plugins --- public/js/controllers/authCtrl.js | 3 ++- public/manifest.json | 2 ++ views/static/login-modal.jade | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/public/js/controllers/authCtrl.js b/public/js/controllers/authCtrl.js index 26f502bec1..b72d8860a2 100644 --- a/public/js/controllers/authCtrl.js +++ b/public/js/controllers/authCtrl.js @@ -81,7 +81,8 @@ angular.module('authCtrl', []) window.location.href = '/#/tasks'; } else { $modal.open({ - templateUrl: 'modals/login.html' + templateUrl: 'modals/login.html', + scope: $scope }); } } diff --git a/public/manifest.json b/public/manifest.json index 1fc977153f..8784662bac 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -23,6 +23,7 @@ "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", @@ -74,6 +75,7 @@ "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/static.js", diff --git a/views/static/login-modal.jade b/views/static/login-modal.jade index 5430301582..e490f03071 100644 --- a/views/static/login-modal.jade +++ b/views/static/login-modal.jade @@ -1,6 +1,6 @@ script(id='modals/login.html', type="text/ng-template") .modal-header - button.close(type='button') × + button.close(type='button', ng-click='$close()') × h4.modal-title=env.t('loginAndReg') .modal-body a(href='/auth/facebook') From 7354efc1d5f6f62b6d851a383f56434c37cd0d03 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Wed, 29 Jan 2014 21:28:11 +0100 Subject: [PATCH 04/42] refactor(bs3): working register & prettier login modal --- public/css/shared.styl | 7 ++++ public/js/controllers/authCtrl.js | 34 ++++++---------- views/static/login-modal.jade | 66 ++++++++++++++++--------------- 3 files changed, 54 insertions(+), 53 deletions(-) diff --git a/public/css/shared.styl b/public/css/shared.styl index 00dba37fe4..1d4b71b780 100644 --- a/public/css/shared.styl +++ b/public/css/shared.styl @@ -15,5 +15,12 @@ text-decoration:none cursor pointer +// Required by angular-ui-bootstrap +.nav, .pagination, .carousel, .panel-title a + cursor: pointer + +.nav-tabs + margin-bottom: 15px + img max-width: 100% \ No newline at end of file diff --git a/public/js/controllers/authCtrl.js b/public/js/controllers/authCtrl.js index b72d8860a2..381ed62e32 100644 --- a/public/js/controllers/authCtrl.js +++ b/public/js/controllers/authCtrl.js @@ -31,6 +31,16 @@ angular.module('authCtrl', []) }); }; + function errorAlert(data, status, headers, config) { + if (status === 0) { + $window.alert("Server not currently reachable, try again later"); + } else if (!!data && !!data.err) { + $window.alert(data.err); + } else { + $window.alert("ERROR: " + 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 +50,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("Server not currently reachable, try again later"); - } else if (!!data && !!data.err) { - $window.alert(data.err); - } else { - $window.alert("ERROR: " + status); - } - }); + }).error(errorAlert); }; - function errorAlert(data, status, headers, config) { - if (status === 0) { - $window.alert("Server not currently reachable, try again later"); - } else if (!!data && !!data.err) { - $window.alert(data.err); - } else { - $window.alert("ERROR: " + status); - } - } - $scope.auth = function() { var data = { username: $scope.loginUsername || $('#login-tab input[name="username"]').val(), @@ -81,8 +73,8 @@ angular.module('authCtrl', []) window.location.href = '/#/tasks'; } else { $modal.open({ - templateUrl: 'modals/login.html', - scope: $scope + templateUrl: 'modals/login.html' + // Using controller: 'AuthCtrl' it causes problems }); } } diff --git a/views/static/login-modal.jade b/views/static/login-modal.jade index e490f03071..9949e316c0 100644 --- a/views/static/login-modal.jade +++ b/views/static/login-modal.jade @@ -2,9 +2,9 @@ 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 + .modal-body(ng-controller='AuthCtrl') a(href='/auth/facebook') - img(src='/bower_components/habitrpg-shared/img/facebook-login-register.jpeg', alt=env.t('loginFacebookAlt')) + 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 @@ -16,52 +16,54 @@ script(id='modals/login.html', type="text/ng-template") .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') + .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') - .control-group + .form-group input.btn.btn-primary(type='submit', value=env.t('login')) 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} + .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 + .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')) From c93bc469081502d27dda4afb03769da76d66037a Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Wed, 29 Jan 2014 22:18:13 +0100 Subject: [PATCH 05/42] refactor(bs3): use templates for modals --- views/shared/modals/achievements.jade | 11 +- views/shared/modals/buy-gems.jade | 5 +- views/shared/modals/classes.jade | 4 +- views/shared/modals/death.jade | 3 +- views/shared/modals/drops.jade | 6 +- views/shared/modals/index.jade | 1 - views/shared/modals/login.jade | 42 -------- views/shared/modals/members.jade | 52 +++++----- views/shared/modals/new-stuff.jade | 3 +- views/shared/modals/quests.jade | 12 ++- views/shared/modals/rebirth.jade | 6 +- views/shared/modals/reroll.jade | 3 +- views/shared/modals/settings.jade | 141 +++++++++++++------------- views/static/login-modal.jade | 2 +- 14 files changed, 134 insertions(+), 157 deletions(-) delete mode 100644 views/shared/modals/login.jade diff --git a/views/shared/modals/achievements.jade b/views/shared/modals/achievements.jade index 3526cb9dc4..b679a24c28 100644 --- a/views/shared/modals/achievements.jade +++ b/views/shared/modals/achievements.jade @@ -1,5 +1,5 @@ // Streak -div(modal='modals.achievements.streak') +script(id='modals/achievements/streak.html', type='text/ng-template') .modal-header h3=env.t('modalAchievement') .modal-body @@ -9,7 +9,7 @@ div(modal='modals.achievements.streak') button.btn.btn-default.cancel(ng-click='modals.achievements.streak = false')=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') .modal-body @@ -19,7 +19,7 @@ div(modal='modals.achievements.ultimateGear') button.btn.btn-default.cancel(ng-click='modals.achievements.ultimateGear = false')=env.t('ok') // Beast Master -div(modal='modals.achievements.beastMaster') +script(id='modals/achievements/ultimateGear.html', type='text/ng-template') .modal-header h3=env.t('modalAchievement') .modal-body @@ -30,7 +30,8 @@ div(modal='modals.achievements.beastMaster') button.btn.btn-default.cancel(ng-click='modals.achievements.beastMaster = false')=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') .modal-body @@ -45,7 +46,7 @@ div(modal='user.flags.contributor') button.btn.btn-default.cancel(ng-click='set({"flags.contributor":false})')=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') .modal-body diff --git a/views/shared/modals/buy-gems.jade b/views/shared/modals/buy-gems.jade index a7bd1375f8..2c9d42e268 100644 --- a/views/shared/modals/buy-gems.jade +++ b/views/shared/modals/buy-gems.jade @@ -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 @@ -20,7 +21,7 @@ div(modal='modals.buyGems') .btn.btn-primary(ng-click='showStripe()',style='margin-left:10px;')=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') diff --git a/views/shared/modals/classes.jade b/views/shared/modals/classes.jade index 220b13c213..4a96a558c3 100644 --- a/views/shared/modals/classes.jade +++ b/views/shared/modals/classes.jade @@ -1,4 +1,6 @@ -.modal(ng-if='!user.flags.classSelected && user.stats.lvl >= 10', data-backdrop=true, ng-controller='UserCtrl') +//activated by +// 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') a(href='http://habitrpg.wikia.com/wiki/Class_System' target='_blank')=env.t('chooseClass2') diff --git a/views/shared/modals/death.jade b/views/shared/modals/death.jade index 2c346e11a8..c76322e935 100644 --- a/views/shared/modals/death.jade +++ b/views/shared/modals/death.jade @@ -1,4 +1,5 @@ -div(modal='user.stats.hp <= 0', options='{backdrop:true, keyboard:false, backdropClick:false}') +//div(modal='user.stats.hp <= 0', options='{backdrop:true, keyboard:false, backdropClick:false}') +script(type='text/ng-template', id='modals/death.html') .modal-body .row-fluid .span4 diff --git a/views/shared/modals/drops.jade b/views/shared/modals/drops.jade index e423e2d68a..de42dd85ac 100644 --- a/views/shared/modals/drops.jade +++ b/views/shared/modals/drops.jade @@ -1,4 +1,5 @@ -div(modal='modals.dropsEnabled') +//div(modal='modals.dropsEnabled') +script(type='text/ng-template', id='modals/dropsEnabled.html') .modal-header h3=env.t('dropsEnabled') .modal-body @@ -12,7 +13,8 @@ div(modal='modals.dropsEnabled') .modal-footer button.btn.btn-default.cancel(ng-click='modals.dropsEnabled = false')=env.t('close') -div(modal='modals.drop') +//div(modal='modals.drop') +script(type='text/ng-template', id='modals/drop.html') .modal-header h3=env.t('itemDrop') .modal-body diff --git a/views/shared/modals/index.jade b/views/shared/modals/index.jade index db481615bb..a8c0626e99 100644 --- a/views/shared/modals/index.jade +++ b/views/shared/modals/index.jade @@ -1,5 +1,4 @@ include ./achievements -include ./login include ./reroll include ./death include ./new-stuff diff --git a/views/shared/modals/login.jade b/views/shared/modals/login.jade deleted file mode 100644 index 9245d18535..0000000000 --- a/views/shared/modals/login.jade +++ /dev/null @@ -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 - - diff --git a/views/shared/modals/members.jade b/views/shared/modals/members.jade index c0b3b9388d..4816c817f2 100644 --- a/views/shared/modals/members.jade +++ b/views/shared/modals/members.jade @@ -1,26 +1,28 @@ -div(ng-controller='MemberModalCtrl') +//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 - 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;') - li {{profile._id}} - li(ng-show='profile.auth.timestamps.created')=env.t('memberSince') - | {{timestamp(profile.auth.timestamps.created)}} - - li(ng-show='profile.auth.timestamps.loggedin')=env.t('lastLoggedIn') - | {{timestamp(profile.auth.timestamps.loggedin)}} - - h3=env.t('stats') - .label.label-info {{profile.stats.class}} - include ../profiles/stats - .span6 - include ../header/avatar - h3 Achievements - include ../profiles/achievements - .modal-footer - button.btn.btn-default(ng-click='modals.member = false')=env.t('ok') + +script(type='text/ng-template', id='modals/member.html') + .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 + 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;') + li {{profile._id}} + li(ng-show='profile.auth.timestamps.created')=env.t('memberSince') + | {{timestamp(profile.auth.timestamps.created)}} - + li(ng-show='profile.auth.timestamps.loggedin')=env.t('lastLoggedIn') + | {{timestamp(profile.auth.timestamps.loggedin)}} - + h3=env.t('stats') + .label.label-info {{profile.stats.class}} + include ../profiles/stats + .span6 + include ../header/avatar + h3 Achievements + include ../profiles/achievements + .modal-footer + button.btn.btn-default(ng-click='modals.member = false')=env.t('ok') diff --git a/views/shared/modals/new-stuff.jade b/views/shared/modals/new-stuff.jade index 096590cbce..c5623d18b0 100644 --- a/views/shared/modals/new-stuff.jade +++ b/views/shared/modals/new-stuff.jade @@ -11,7 +11,8 @@ .modal-footer button.btn.btn-default.cancel(ng-click='User.set({"flags.mathUpdates":true})') Dismiss -div(modal='modals.newStuff') +//div(modal='modals.newStuff') +script(type='text/ng-template', id='modals/newStuff.html') .modal-header h3 New Stuff! .modal-body diff --git a/views/shared/modals/quests.jade b/views/shared/modals/quests.jade index 2849d230f2..f09a176117 100644 --- a/views/shared/modals/quests.jade +++ b/views/shared/modals/quests.jade @@ -11,7 +11,8 @@ 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') +//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}}" =env.t('completed') @@ -21,7 +22,8 @@ div(modal='user.party.quest.completed', ng-controller='InventoryCtrl') .modal-footer button.btn.btn-default.btn-primary(ng-click='set({"party.quest.completed":""})')=env.t('accept') -div(modal='modals.showQuest', ng-controller='InventoryCtrl') +//div(modal='modals.showQuest', ng-controller='InventoryCtrl') +script(type='text/ng-template', id='modals/showQuest.html') .modal-header h3 {{selectedQuest.text}} .modal-body @@ -36,7 +38,8 @@ div(modal='modals.showQuest', ng-controller='InventoryCtrl') 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') -div(modal='modals.buyQuest', ng-controller='InventoryCtrl') +//div(modal='modals.buyQuest', ng-controller='InventoryCtrl') +script(type='text/ng-template', id='modals/buyQuest.html') .modal-header h3 {{selectedQuest.text}} .modal-body @@ -47,7 +50,8 @@ div(modal='modals.buyQuest', ng-controller='InventoryCtrl') 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') -div(modal='party.quest.key && !party.quest.active && !questHold && party.quest.members[user._id] == undefined') +//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') | {{Content.quests[party.quest.key].text}} diff --git a/views/shared/modals/rebirth.jade b/views/shared/modals/rebirth.jade index bbc79630cf..9e7dc610d2 100644 --- a/views/shared/modals/rebirth.jade +++ b/views/shared/modals/rebirth.jade @@ -1,6 +1,7 @@ // Created by Sabe on 12/22/13. -div(modal='modals.rebirthEnabled') +//div(modal='modals.rebirthEnabled') +script(type='text/ng-template', id='modals/rebirthEnabled.html') .modal-header h3=env.t('rebirthNew') .modal-body @@ -10,7 +11,8 @@ div(modal='modals.rebirthEnabled') .modal-footer button.btn.btn-default.cancel(ng-click='modals.rebirthEnabled = false')=env.t('close') -div(modal='modals.rebirth') +//div(modal='modals.rebirth') +script(type='text/ng-template', id='modals/rebirth.html') .modal-header h3=env.t('rebirthBegin') .modal-body diff --git a/views/shared/modals/reroll.jade b/views/shared/modals/reroll.jade index 24dba8d7ff..09bbcc5bee 100644 --- a/views/shared/modals/reroll.jade +++ b/views/shared/modals/reroll.jade @@ -1,5 +1,6 @@ // Re-Roll modal -div(modal='modals.reroll') +//div(modal='modals.reroll') +script(type='text/ng-template', id='modals/reroll.html') .modal-header h3=env.t('fortify') .modal-body diff --git a/views/shared/modals/settings.jade b/views/shared/modals/settings.jade index 956b47a96d..1de8fac436 100644 --- a/views/shared/modals/settings.jade +++ b/views/shared/modals/settings.jade @@ -1,76 +1,79 @@ -div(ng-controller='SettingsCtrl') +//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 + 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') - 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') +//div(modal='modals.restore') +script(type='text/ng-template', id='modals/restore.html') + .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(ng-if='!user.purchased.plan.customerId') + //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') + //- + //- Commenting out since it doesn't make sense to restore equipment with Armory anymore. They can just restore GP & buy + h3 Equipment .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') + input.option-content(type='number', data-for='items.weapon', ng-model='restoreValues.items.weapon') + span.input-suffix Weapon .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(ng-if='!user.purchased.plan.customerId') - //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') + input.option-content(type='number', data-for='items.armor', ng-model='restoreValues.items.armor') + span.input-suffix Armor .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') + input.option-content(type='number', data-for='items.head', ng-model='restoreValues.items.head') + span.input-suffix Helm .option-group.option-medium - input.option-content(type='number', data-for='stats.lvl', ng-model='restoreValues.stats.lvl') - span.input-suffix=env.t('level') - //- - //- Commenting out since it doesn't make sense to restore equipment with Armory anymore. They can just restore GP & buy - h3 Equipment - .option-group.option-medium - input.option-content(type='number', data-for='items.weapon', ng-model='restoreValues.items.weapon') - span.input-suffix Weapon - .option-group.option-medium - input.option-content(type='number', data-for='items.armor', ng-model='restoreValues.items.armor') - span.input-suffix Armor - .option-group.option-medium - input.option-content(type='number', data-for='items.head', ng-model='restoreValues.items.head') - span.input-suffix Helm - .option-group.option-medium - input.option-content(type='number', data-for='items.shield', ng-model='restoreValues.items.shield') - span.input-suffix Shield - 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') + input.option-content(type='number', data-for='items.shield', ng-model='restoreValues.items.shield') + span.input-suffix Shield + 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') - div(modal='modals.delete') - .modal-header - h3=env.t('deleteaccount') - .modal-body - p=env.t('deleteText1') - strong=env.t('deleteText2') - =env.t('deleteText3') - 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') +//div(modal='modals.delete') +script(type='text/ng-template', id='modals/delete.html') + .modal-header + h3=env.t('deleteaccount') + .modal-body + p=env.t('deleteText1') + strong=env.t('deleteText2') + =env.t('deleteText3') + 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') diff --git a/views/static/login-modal.jade b/views/static/login-modal.jade index 9949e316c0..b17d41d171 100644 --- a/views/static/login-modal.jade +++ b/views/static/login-modal.jade @@ -1,4 +1,4 @@ -script(id='modals/login.html', type="text/ng-template") +script(id='modals/login.html', type='text/ng-template') .modal-header button.close(type='button', ng-click='$close()') × h4.modal-title=env.t('loginAndReg') From 9481b32b0f508c84009504ffbbfe1b386abcfd23 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Thu, 30 Jan 2014 19:34:50 +0100 Subject: [PATCH 06/42] chore(bs3): upgrade to 3.1.0 --- bower.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bower.json b/bower.json index 7290b31c4c..feef1b4642 100644 --- a/bower.json +++ b/bower.json @@ -26,7 +26,7 @@ "angular-ui-router": "ca3b4777a603df8f86cfd653c8f6c38b2ae05d89", "angular-loading-bar": "~0.3.0", "angular-bindonce": "~0.2.1", - "bootstrap": "~3.0.3", + "bootstrap": "~3.1.0", "bootstrap-datepicker": "1.3.0", "bootstrap-growl": "~1.1.0", "bootstrap-tour": "~0.8.1", From 0764aa8c1764ed72a2ea0e9f1cbf16e59aa56614 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Fri, 31 Jan 2014 19:47:48 +0100 Subject: [PATCH 07/42] refactor(bs3): convert icons to new format --- bower.json | 4 ++++ views/main/filters.jade | 8 +++---- views/options/index.jade | 8 +++---- views/options/profile.jade | 12 +++++----- views/options/settings.jade | 12 +++++----- views/options/social/challenge-box.jade | 4 ++-- views/options/social/challenges.jade | 10 ++++----- views/options/social/chat-message.jade | 2 +- views/options/social/group.jade | 8 +++---- views/options/social/hall.jade | 2 +- views/options/social/index.jade | 10 ++++----- views/shared/header/avatar.jade | 4 ++-- views/shared/header/header.jade | 8 +++---- views/shared/header/menu.jade | 16 ++++++------- views/shared/profiles/stats.jade | 22 +++++++++--------- views/shared/tasks/lists.jade | 14 ++++++------ views/shared/tasks/task.jade | 30 ++++++++++++------------- 17 files changed, 89 insertions(+), 85 deletions(-) diff --git a/bower.json b/bower.json index feef1b4642..1dadcfef82 100644 --- a/bower.json +++ b/bower.json @@ -44,5 +44,9 @@ }, "devDependencies": { "angular-mocks": "~1.2.1" + }, + "resolutions": { + "jquery": ">=1.6.4", + "bootstrap": "~3.1.0" } } diff --git a/views/main/filters.jade b/views/main/filters.jade index 0a5de7e1db..c3a11240b1 100644 --- a/views/main/filters.jade +++ b/views/main/filters.jade @@ -5,15 +5,15 @@ ul.nav.nav-pills li a(rel='tooltip', title=env.t('editTags'), ng-click='saveOrEdit()') - i(ng-class='{"icon-ok": _editing, "icon-pencil": !_editing}') + 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', 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 + span.glyphicon.glyphicon-trash a(ng-hide='_editing', ng-click='toggleFilter(tag)') - i.icon-bullhorn(bo-if="tag.challenge") + 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)') @@ -23,4 +23,4 @@ //
  • li a(rel='tooltip', title=env.t('clearFilters'), ng-click='user.filters = {}') - i.icon-remove-sign + span.glyphicon.glyphicon-remove-sign diff --git a/views/options/index.jade b/views/options/index.jade index aea6dedb26..496acde639 100644 --- a/views/options/index.jade +++ b/views/options/index.jade @@ -12,19 +12,19 @@ script(id='partials/options.html', type="text/ng-template") ul.nav.nav-tabs li(ng-class="{ active: $state.includes('options.profile') }") a(ui-sref='options.profile') - i.icon-user + span.glyphicon.glyphicon-user =env.t('profile') li(ng-class="{ active: $state.includes('options.social') }") a(ui-sref='options.social') - i.icon-heart + span.glyphicon.glyphicon-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 + span.glyphicon.glyphicon-gift =env.t('inventory') li(ng-class="{ active: $state.includes('options.settings') }") a(ui-sref='options.settings') - i.icon-wrench + span.glyphicon.glyphicon-wrench =env.t('settings') .tab-content diff --git a/views/options/profile.jade b/views/options/profile.jade index 36eec2f599..ed68f3e95d 100644 --- a/views/options/profile.jade +++ b/views/options/profile.jade @@ -41,7 +41,7 @@ script(id='partials/options.profile.avatar.html', type='text/ng-template') .label.label-info.pull-right(popover=env.t('limited31Jan'), popover-title=env.t('limitededition'), popover-placement='right', popover-trigger='mouseenter') =env.t('limitededition') | - i.icon.icon-question-sign + span.glyphicon.glyphicon.icon-question-sign menu(label=env.t('wintercolors')) each color in ['candycane','frost','winternight','holly'] button(type='button', ng-class='{locked: !user.purchased.hair.color.#{color}}', class='customize-option hair_bangs_1_#{color}', style='width: 40px; height: 40px;', ng-click='unlock("hair.color.#{color}")') @@ -129,7 +129,7 @@ script(id='partials/options.profile.stats.html', type='text/ng-template') {{user.stats.points}}  =env.t('unallocated')   - i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('levelpopover')) + span.glyphicon.glyphicon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('levelpopover')) td tr td(colspan=2) @@ -138,23 +138,23 @@ script(id='partials/options.profile.stats.html', type='text/ng-template') 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('automaticallocation')   - i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('automaticallocationpopover')) + span.glyphicon.glyphicon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('automaticallocationpopover')) 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')   - i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('evenallocationpopover')) + span.glyphicon.glyphicon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('evenallocationpopover')) label.radio input(type='radio', name='allocationMode', value='classbased', ng-model='user.preferences.allocationMode', ng-change='set({"preferences.allocationMode": "classbased"})') =env.t('classallocation')   - i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('classallocationpopover')) + span.glyphicon.glyphicon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('classallocationpopover')) label.radio input(type='radio', name='allocationMode', value='taskbased', ng-model='user.preferences.allocationMode', ng-change='set({"preferences.allocationMode": "taskbased"})') =env.t('taskallocation')   - i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('taskallocationpopover')) + span.glyphicon.glyphicon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('taskallocationpopover')) tr td= env.t('allocatestr') + ' {{user.stats.str}}' td diff --git a/views/options/settings.jade b/views/options/settings.jade index 5a330cda07..f6f6c393ef 100644 --- a/views/options/settings.jade +++ b/views/options/settings.jade @@ -38,27 +38,27 @@ script(type='text/ng-template', id='partials/options.settings.settings.html') input(type='checkbox', ng-click='set({"preferences.hideHeader":user.preferences.hideHeader?false:true})', ng-checked='user.preferences.hideHeader!==true') =env.t('showHeader')   - i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('showHeaderpop')) + span.glyphicon.glyphicon-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')   - i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('stickyHeaderpop')) + span.glyphicon.glyphicon-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')   - i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('newtaskeditpop')) + span.glyphicon.glyphicon-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')   - i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('startcollapsedpop')) + span.glyphicon.glyphicon-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('startacollapsed')   - i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('startacollapsedpop')) + span.glyphicon.glyphicon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('startacollapsedpop')) button.btn(ng-click='showTour()', popover-placement='right', popover-trigger='mouseenter', popover=env.t('showtourpop1'))= env.t('showtour') br button.btn(ng-click='showBailey()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('showtourpop'))= env.t('showtour2') @@ -156,7 +156,7 @@ 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 + span.glyphicon.glyphicon-ok | Subscribed div(ng-include="'partials/options.settings.subscription.perks.html'") .btn.btn-small.btn-danger(ng-click='cancelSubscription()') Cancel Subscription \ No newline at end of file diff --git a/views/options/social/challenge-box.jade b/views/options/social/challenge-box.jade index 5b7254bbc7..683d5ba829 100644 --- a/views/options/social/challenge-box.jade +++ b/views/options/social/challenge-box.jade @@ -3,7 +3,7 @@ .modal-header h3=env.t('challenges') a.pull-right(target='_blank', href='https://trello.com/card/challenges-individual-party-guild-public/50e5d3684fe3a7266b0036d6/58') - i.icon-question-sign + span.glyphicon.glyphicon-question-sign .modal-body(bindonce='group.challenges') div(ng-if='group.challenges.length > 0') table.table.table-striped @@ -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') diff --git a/views/options/social/challenges.jade b/views/options/social/challenges.jade index fe2769b6a1..08cc85c531 100644 --- a/views/options/social/challenges.jade +++ b/views/options/social/challenges.jade @@ -39,7 +39,7 @@ script(type='text/ng-template', id='partials/options.social.challenges.detail.ht .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 @@ -98,7 +98,7 @@ script(type='text/ng-template', id='partials/options.social.challenges.html') .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') + 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') @@ -109,7 +109,7 @@ script(type='text/ng-template', id='partials/options.social.challenges.html') .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.glyphicon.glyphicon-question-sign(popover=env.t('prizePop'), popover-trigger='mouseenter', popover-placement='right') span(ng-show='newChallenge.group=="habitrpg"') !=env.t('min1Gem') + ' ' + env.t('publicChallenges') + ' ' + env.t('helpsPrevent') @@ -144,10 +144,10 @@ script(type='text/ng-template', id='partials/options.social.challenges.html') li // leave / join a.btn.btn-small.btn-danger(ng-show='challenge._isMember', ng-click='clickLeave(challenge, $event)') - i.icon-ban-circle + span.glyphicon.glyphicon-ban-circle =env.t('leave') a.btn.btn-small.btn-success(ng-hide='challenge._isMember', ng-click='join(challenge)') - i.icon-ok + span.glyphicon.glyphicon-ok =env.t('join') a.accordion-toggle(ng-click='toggle(challenge._id)') {{challenge.name}} .accordion-body(ng-class='{collapse: !$stateParams.cid == challenge._id}') diff --git a/views/options/social/chat-message.jade b/views/options/social/chat-message.jade index 6aab142028..bf8e731a66 100644 --- a/views/options/social/chat-message.jade +++ b/views/options/social/chat-message.jade @@ -9,6 +9,6 @@ li.chat-message(bindonce='group.chat', ng-repeat='message in group.chat', bo-cla 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(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')) + span.glyphicon.glyphicon-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(tooltip='{{contribText(message.contributor, message.backer)}}') {{message.user}}  diff --git a/views/options/social/group.jade b/views/options/social/group.jade index 95a9871e43..46ba51453e 100644 --- a/views/options/social/group.jade +++ b/views/options/social/group.jade @@ -33,13 +33,13 @@ a.pull-right.gem-wallet(popover-trigger='mouseenter', popover-title=env.t('guild .progress(style="height:10px") .bar(style='width: {{Shared.percent(group.quest.hp, Content.quests[group.quest.key].hp)}}%;') span.meter-text - i.icon-heart + 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 - i.icon-heart + 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') @@ -124,7 +124,7 @@ a.pull-right.gem-wallet(popover-trigger='mouseenter', popover-title=env.t('guild // 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')) + 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}} @@ -141,7 +141,7 @@ a.pull-right.gem-wallet(popover-trigger='mouseenter', popover-title=env.t('guild // 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')) + span.glyphicon.glyphicon-ban-circle(tooltip=env.t('banTip')) a span(ng-click='clickMember(invite._id, true)') | {{invite.profile.name}} diff --git a/views/options/social/hall.jade b/views/options/social/hall.jade index cfda892f3e..780c64dd65 100644 --- a/views/options/social/hall.jade +++ b/views/options/social/hall.jade @@ -70,7 +70,7 @@ script(type='text/ng-template', id='partials/options.social.hall.heroes.html') 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}}  - i.icon-star.icon-white + span.glyphicon.glyphicon-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}} diff --git a/views/options/social/index.jade b/views/options/social/index.jade index ab38723f3b..4fbb2a03b0 100644 --- a/views/options/social/index.jade +++ b/views/options/social/index.jade @@ -40,10 +40,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 +74,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 +84,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 diff --git a/views/shared/header/avatar.jade b/views/shared/header/avatar.jade index 5491806c35..6acd65c1a8 100644 --- a/views/shared/header/avatar.jade +++ b/views/shared/header/avatar.jade @@ -44,7 +44,7 @@ figure.herobox(ng-click='spell ? castEnd(profile, "user", $event) : clickMember( // 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;') + span.glyphicon.glyphicon-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;') =env.t('lvl') | {{profile.stats.lvl}} - i.icon-plus-sign.icon-white(ng-show='profile.achievements.rebirths', tooltip=env.t('reborn') + '{{profile.achievements.rebirthLevel}}', style='margin-left:5px') + span.glyphicon.glyphicon-plus-sign.icon-white(ng-show='profile.achievements.rebirths', tooltip=env.t('reborn') + '{{profile.achievements.rebirthLevel}}', style='margin-left:5px') diff --git a/views/shared/header/header.jade b/views/shared/header/header.jade index 63ea79962a..a43113558f 100644 --- a/views/shared/header/header.jade +++ b/views/shared/header/header.jade @@ -13,21 +13,21 @@ .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 | {{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 | {{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 + 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 | {{Math.floor(user.stats.mp)}} / {{user._statsComputed.maxMP}} // party diff --git a/views/shared/header/menu.jade b/views/shared/header/menu.jade index 6933ffbe98..4810f0c69b 100644 --- a/views/shared/header/menu.jade +++ b/views/shared/header/menu.jade @@ -7,30 +7,30 @@ li a.task-action-btn.tile.solid span(ng-show='$state.includes("options")', ui-sref='tasks') - i.icon-ok + span.glyphicon.glyphicon-ok =env.t('tasks') span(ng-show='$state.includes("tasks")', ui-sref='options') - i.icon.icon-wrench + span.glyphicon.glyphicon.icon-wrench =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.icon-book =env.t('FAQ') li a.task-action-btn.tile.solid(href="https://vimeo.com/57654086", target='_blank') - i.icon.icon-film + span.glyphicon.glyphicon.icon-film =env.t('tutorials') li a.task-action-btn.tile.solid(ng-click='User.sync()') - i.icon.icon-refresh + span.glyphicon.glyphicon.icon-refresh =env.t('sync') li a.task-action-btn.tile.solid(ng-click='logout()') - i.icon-share-alt + span.glyphicon.glyphicon-share-alt =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')) diff --git a/views/shared/profiles/stats.jade b/views/shared/profiles/stats.jade index ea9a921c01..30b092e03d 100644 --- a/views/shared/profiles/stats.jade +++ b/views/shared/profiles/stats.jade @@ -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}}  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}}  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]}}  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}}  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}}  @@ -65,13 +65,13 @@ table.table.table-striped td strong=env.t('stealth') |: {{profile.stats.buffs.stealth}}  - i.icon-question-sign(popover-title=env.t('stealth'), popover-trigger='mouseenter', popover-placement='right', popover=env.t('stealthNewDay')) + span.glyphicon.glyphicon-question-sign(popover-title=env.t('stealth'), popover-trigger='mouseenter', popover-placement='right', popover=env.t('stealthNewDay')) td tr(ng-if='profile.stats.buffs.streaks') td strong=env.t('streaksFrozen') | - i.icon-question-sign(popover-title=env.t('streaksFrozen'), popover-trigger='mouseenter', popover-placement='right', popover=env.t('streaksFrozenText')) + span.glyphicon.glyphicon-question-sign(popover-title=env.t('streaksFrozen'), popover-trigger='mouseenter', popover-placement='right', popover=env.t('streaksFrozenText')) td h4(ng-show='user.flags.dropsEnabled')=env.t('pets') diff --git a/views/shared/tasks/lists.jade b/views/shared/tasks/lists.jade index bd50b3042a..752cb4b9cf 100644 --- a/views/shared/tasks/lists.jade +++ b/views/shared/tasks/lists.jade @@ -9,10 +9,10 @@ script(id='templates/habitrpg-tasks.html', type="text/ng-template") // 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 + 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') - i.icon-calendar + span.glyphicon.glyphicon-calendar // // Gold & Gems @@ -47,7 +47,7 @@ script(id='templates/habitrpg-tasks.html', type="text/ng-template") // right-hand side control buttons .task-meta-controls span.task-notes - i.icon-comment + span.glyphicon.glyphicon-comment //left-hand size commands .task-controls a.money.btn-buy.item-btn(ng-click='buy(item)') @@ -62,7 +62,7 @@ script(id='templates/habitrpg-tasks.html', type="text/ng-template") 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 + span.glyphicon.glyphicon-comment //left-hand size commands .task-controls a.money.btn-buy.item-btn(ng-click='castStart(Content.spells.special.snowball)') @@ -73,7 +73,7 @@ script(id='templates/habitrpg-tasks.html', type="text/ng-template") 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 + span.glyphicon.glyphicon-comment //left-hand size commands .task-controls a.money.btn-buy.item-btn(ng-click='castStart(Content.spells.special.salt)') @@ -88,7 +88,7 @@ script(id='templates/habitrpg-tasks.html', type="text/ng-template") 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 + span.glyphicon.glyphicon-comment //left-hand size commands .task-controls a.money.btn-buy.item-btn(ng-click='castStart(spell)') @@ -105,7 +105,7 @@ script(id='templates/habitrpg-tasks.html', type="text/ng-template") 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 + 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') diff --git a/views/shared/tasks/task.jade b/views/shared/tasks/task.jade index 1546e08faa..5ef7d8b3a5 100644 --- a/views/shared/tasks/task.jade +++ b/views/shared/tasks/task.jade @@ -8,39 +8,39 @@ li(bindonce='list', bo-id='"task-"+task.id', ng-repeat='task in obj[list.type+"s // Streak span(ng-show='task.streak') {{task.streak}} span(tooltip=env.t('streakCounter')) - i.icon-forward + span.glyphicon.glyphicon-forward // 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}} - i.icon-tags(tooltip='{{appliedTags(user.tags, task.tags)}}', ng-hide='Shared.noTags(task.tags)') + span.glyphicon.glyphicon-tags(tooltip='{{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') + span.glyphicon.glyphicon-pencil(ng-hide='task._editing') // 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') // 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') //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') span(ng-if='!task.challenge.broken') - i.icon-bullhorn(tooltip=env.t('challenge')) + span.glyphicon.glyphicon-bullhorn(tooltip=env.t('challenge')) // 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 // 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 // notes span.task-notes(ng-show='task.notes && !task._editing') - i.icon-comment + span.glyphicon.glyphicon-comment // left-hand side checkbox .task-controls.task-primary @@ -110,18 +110,18 @@ 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 + span.glyphicon.glyphicon-tasks =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') |   - i.icon.icon-question-sign(popover=env.t('checklistText'),popover-trigger='mouseenter',popover-placement='bottom') + span.glyphicon.glyphicon.icon-question-sign(popover=env.t('checklistText'),popover-trigger='mouseenter',popover-placement='bottom') ul.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)') @@ -183,7 +183,7 @@ 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 =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') @@ -202,7 +202,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') |  - i.icon-question-sign + span.glyphicon.glyphicon-question-sign button.task-action-btn.tile.spacious(type='submit')=env.t('saveAndClose') From f4c30390f577d2afc2e1131810d82df8223c858e Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Fri, 31 Jan 2014 21:18:44 +0100 Subject: [PATCH 08/42] refactor(bs3): start porting app, general layout and filters --- public/css/filters.styl | 49 +++++++++++++--------------------------- public/css/index.styl | 9 ++++---- views/index.jade | 19 ++++++++-------- views/main/filters.jade | 19 ++++++++-------- views/static/layout.jade | 5 ++++ 5 files changed, 46 insertions(+), 55 deletions(-) diff --git a/public/css/filters.styl b/public/css/filters.styl index 1c68eb6470..b543b80feb 100644 --- a/public/css/filters.styl +++ b/public/css/filters.styl @@ -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 \ No newline at end of file + .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 \ No newline at end of file diff --git a/public/css/index.styl b/public/css/index.styl index f777bb5769..37a687c6af 100644 --- a/public/css/index.styl +++ b/public/css/index.styl @@ -40,8 +40,7 @@ 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 @@ -79,8 +78,7 @@ div.tooltip-inner { /*html, body {height: 100%;}*/ #wrap z-index:-1 -#main - padding-bottom: 250px; /* don't know why this works, sticky footers are weird */ + padding: 0 15px // Required by Bootstrap 3 when using .container-fluid @media (max-width: 600px) { #wrap { @@ -172,6 +170,9 @@ div.tooltip-inner { a cursor: pointer +a span.glyphicon + color: #333 // Takes base color from bootstrap + #modalMember p word-wrap: break-word diff --git a/views/index.jade b/views/index.jade index 48fcae33aa..8cc51654a7 100644 --- a/views/index.jade +++ b/views/index.jade @@ -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,8 +22,7 @@ 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') @@ -32,14 +34,13 @@ html(ng-app="habitrpg", ng-controller="RootCtrl", ng-class='{"applying-action":a include ./options/index #notification-area(ng-controller='NotificationCtrl') - #wrap - + #wrap.container-fluid //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') - - #main(ui-view) + .row + .col-md-12.exp-chart(ng-show='charts.exp') + #main(ui-view) include ./shared/footer \ No newline at end of file diff --git a/views/main/filters.jade b/views/main/filters.jade index c3a11240b1..1d8c262c86 100644 --- a/views/main/filters.jade +++ b/views/main/filters.jade @@ -1,4 +1,4 @@ -.filters.tag-list(ng-controller='FiltersCtrl') +.filters.col-md-12(ng-controller='FiltersCtrl') .pull-left.filter-description =env.t('tags') |: @@ -6,20 +6,21 @@ 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', 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}})') + 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-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') + .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 a(rel='tooltip', title=env.t('clearFilters'), ng-click='user.filters = {}') diff --git a/views/static/layout.jade b/views/static/layout.jade index 5c5e04c2d3..f6b943283b 100644 --- a/views/static/layout.jade +++ b/views/static/layout.jade @@ -12,6 +12,11 @@ html 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 From 49e1bf1ba4c18824064c62e7864dc48c83a30899 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Fri, 31 Jan 2014 22:05:09 +0100 Subject: [PATCH 09/42] refactor(bs3): fix --- views/shared/modals/settings.jade | 51 +++---------------------------- 1 file changed, 5 insertions(+), 46 deletions(-) diff --git a/views/shared/modals/settings.jade b/views/shared/modals/settings.jade index b2b268ec7b..4aca070e2f 100644 --- a/views/shared/modals/settings.jade +++ b/views/shared/modals/settings.jade @@ -1,4 +1,4 @@ -//div(ng-controller='SettingsCtrl') +//div(ng-controller='SettingsCtrl') Above all div(modal='modals.reset') script(type='text/ng-template', id='modals/reset.html') .modal-header @@ -26,11 +26,11 @@ script(type='text/ng-template', id='modals/restore.html') .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(ng-if='!user.purchased.plan.customerId') - //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) + .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 + //-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') @@ -38,33 +38,6 @@ script(type='text/ng-template', id='modals/restore.html') .option-group.option-medium input.option-content(type='number', data-for='stats.lvl', ng-model='restoreValues.stats.lvl') span.input-suffix=env.t('level') - //- - //- Commenting out since it doesn't make sense to restore equipment with Armory anymore. They can just restore GP & buy - h3 Equipment - .option-group.option-medium - input.option-content(type='number', data-for='items.weapon', ng-model='restoreValues.items.weapon') - span.input-suffix Weapon - .option-group.option-medium -<<<<<<< HEAD - input.option-content(type='number', data-for='items.armor', ng-model='restoreValues.items.armor') - span.input-suffix Armor -======= - 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') ->>>>>>> develop - .option-group.option-medium - input.option-content(type='number', data-for='items.head', ng-model='restoreValues.items.head') - span.input-suffix Helm - .option-group.option-medium -<<<<<<< HEAD - input.option-content(type='number', data-for='items.shield', ng-model='restoreValues.items.shield') - span.input-suffix Shield h3=env.t('achievements') .option-group.option-medium input.option-content(type='number', data-for='achievements.streak', ng-model='restoreValues.achievements.streak') @@ -75,20 +48,6 @@ script(type='text/ng-template', id='modals/restore.html') .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') -======= - 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') ->>>>>>> develop //div(modal='modals.delete') script(type='text/ng-template', id='modals/delete.html') From ff4969563538d5599d98f0f123d34b4eb6842fb5 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Sat, 1 Feb 2014 16:46:48 +0100 Subject: [PATCH 10/42] refactor(bs3): misc fixes & port death modal --- bower.json | 4 ---- public/css/index.styl | 6 +++--- public/js/controllers/notificationCtrl.js | 10 +++++++++- views/shared/header/menu.jade | 2 +- views/shared/modals/death.jade | 14 +++++++------- 5 files changed, 20 insertions(+), 16 deletions(-) diff --git a/bower.json b/bower.json index 1dadcfef82..feef1b4642 100644 --- a/bower.json +++ b/bower.json @@ -44,9 +44,5 @@ }, "devDependencies": { "angular-mocks": "~1.2.1" - }, - "resolutions": { - "jquery": ">=1.6.4", - "bootstrap": "~3.1.0" } } diff --git a/public/css/index.styl b/public/css/index.styl index 37a687c6af..7b6aff8235 100644 --- a/public/css/index.styl +++ b/public/css/index.styl @@ -134,16 +134,16 @@ div.tooltip-inner { .modal whitespace: normal +// notification-character used only by death modal's figure, move .notification-character - float:left + 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 diff --git a/public/js/controllers/notificationCtrl.js b/public/js/controllers/notificationCtrl.js index a93deb9b1a..ea551f8892 100644 --- a/public/js/controllers/notificationCtrl.js +++ b/public/js/controllers/notificationCtrl.js @@ -1,9 +1,17 @@ 'use strict'; habitrpg.controller('NotificationCtrl', - ['$scope', '$rootScope', 'Shared', 'User', 'Guide', 'Notification', function ($scope, $rootScope, Shared, User, Guide, Notification) { + ['$scope', '$rootScope', 'Shared', 'User', 'Guide', 'Notification', '$modal', + function ($scope, $rootScope, Shared, User, Guide, Notification, $modal) { $rootScope.$watch('user.stats.hp', function(after, before) { + if (after <= 0){ + $modal.open({ + templateUrl: 'modals/death.html', + keyboard: false, + backdrop: 'static' + }); + } if (after == before) return; if (User.user.stats.lvl == 0) return; Notification.hp(after - before, 'hp'); diff --git a/views/shared/header/menu.jade b/views/shared/header/menu.jade index d02a9fa8c2..fa7cf337d8 100644 --- a/views/shared/header/menu.jade +++ b/views/shared/header/menu.jade @@ -14,7 +14,7 @@ =env.t('options') li a.task-action-btn.tile.solid(href="http://habitrpg.wikia.com/wiki/FAQ", target='_blank') - span.glyphicon.glyphicon.-book + span.glyphicon.glyphicon-book =env.t('FAQ') li a.task-action-btn.tile.solid(href="https://vimeo.com/57654086", target='_blank') diff --git a/views/shared/modals/death.jade b/views/shared/modals/death.jade index c76322e935..ab10651370 100644 --- a/views/shared/modals/death.jade +++ b/views/shared/modals/death.jade @@ -1,15 +1,15 @@ //div(modal='user.stats.hp <= 0', options='{backdrop:true, keyboard:false, backdropClick:false}') script(type='text/ng-template', id='modals/death.html') .modal-body - .row-fluid - .span4 + .row + .col-md-3 figure.notification-character .GrimReaper - .span8 + .col-md-9 h2=env.t('youDied') - .row-fluid - .span4 + .row + .col-md-3 p - a.btn.btn-danger.btn-large.notification-action(ng-click='user.ops.revive({})')=env.t('continue') - .span8 + a.btn.btn-danger.btn-large(ng-click='user.ops.revive({}); $close()')=env.t('continue') + .col-md-9 p=env.t('dieText') From af42ec263e8a6ade741de05dcf9cc6a33df70884 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Sat, 1 Feb 2014 17:04:21 +0100 Subject: [PATCH 11/42] refactor(bs3): port several modals & css fixes --- public/css/index.styl | 29 ++++++++--------------- public/js/controllers/notificationCtrl.js | 23 ++++++++++++++---- public/js/controllers/rootCtrl.js | 2 -- views/shared/modals/achievements.jade | 12 +++++----- views/shared/modals/death.jade | 2 +- 5 files changed, 36 insertions(+), 32 deletions(-) diff --git a/public/css/index.styl b/public/css/index.styl index 7b6aff8235..6dafe909b7 100644 --- a/public/css/index.styl +++ b/public/css/index.styl @@ -131,30 +131,21 @@ div.tooltip-inner { /* Misc -------------------------------------------------- */ -.modal - whitespace: normal - // notification-character used only by death modal's figure, move -.notification-character - float: left - padding: 15px - -.notification-message - display: inline-block; - padding-right: 1em - line-height: 3 +.death-modal // a .modal-body + margin: 10px + figure + float: left + padding: 15px + #reset-modal z-index:1500 #notification-area - position: fixed; - top: 0; - right: 0px; - z-index: 1061; - -.modal-body - margin: 10px - + position: fixed + top: 0 + right: 0px + z-index: 1061 // TODO this is supposed to go in avatar.styl, but stylus is breaking if I even touch that file .profile-modal-header diff --git a/public/js/controllers/notificationCtrl.js b/public/js/controllers/notificationCtrl.js index ea551f8892..f6adac2d55 100644 --- a/public/js/controllers/notificationCtrl.js +++ b/public/js/controllers/notificationCtrl.js @@ -69,24 +69,39 @@ habitrpg.controller('NotificationCtrl', $rootScope.$watch('user.achievements.streak', function(after, before){ if(before == undefined || after == before || after < before) return; - $rootScope.modals.achievements.streak = true; + $modal.open({ + templateUrl: 'modals/achievements/streak.html' + }); }); $rootScope.$watch('user.achievements.ultimateGear', function(after, before){ if (after === before || after !== true) return; - $rootScope.modals.achievements.ultimateGear = true; + $modal.open({ + templateUrl: 'modals/achievements/ultimateGear.html' + }); }); $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; + $modal.open({ + templateUrl: 'modals/achievements/beastMaster.html' + }); }, true); $rootScope.$watch('user.achievements.rebirths', function(after, before){ if(after === before) return; - $rootScope.modals.achievements.rebirth = true; + $modal.open({ + templateUrl: 'modals/achievements/rebirth.html' + }); + }); + + $rootScope.$watch('user.flags.contributor', function(after, before){ + if (after === before || after !== true) return; + $modal.open({ + templateUrl: 'modals/achievements/contributor.html' + }); }); /*_.each(['weapon', 'head', 'chest', 'shield'], function(watched){ diff --git a/public/js/controllers/rootCtrl.js b/public/js/controllers/rootCtrl.js index e37a4a9662..3b119b561a 100644 --- a/public/js/controllers/rootCtrl.js +++ b/public/js/controllers/rootCtrl.js @@ -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; diff --git a/views/shared/modals/achievements.jade b/views/shared/modals/achievements.jade index 9ea49bd5c9..6d1f1f4855 100644 --- a/views/shared/modals/achievements.jade +++ b/views/shared/modals/achievements.jade @@ -6,7 +6,7 @@ script(id='modals/achievements/streak.html', type='text/ng-template') .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 script(id='modals/achievements/ultimateGear.html', type='text/ng-template') @@ -16,10 +16,10 @@ script(id='modals/achievements/ultimateGear.html', type='text/ng-template') .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 -script(id='modals/achievements/ultimateGear.html', type='text/ng-template') +script(id='modals/achievements/beastMaster.html', type='text/ng-template') .modal-header h3=env.t('modalAchievement') .modal-body @@ -27,7 +27,7 @@ script(id='modals/achievements/ultimateGear.html', type='text/ng-template') .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 // activated by user.flags.contributor @@ -40,7 +40,7 @@ script(id='modals/achievements/contributor.html', type='text/ng-template') !=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 script(id='modals/achievements/rebirth.html', type='text/ng-template') @@ -50,4 +50,4 @@ script(id='modals/achievements/rebirth.html', type='text/ng-template') .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') diff --git a/views/shared/modals/death.jade b/views/shared/modals/death.jade index ab10651370..34f58cd776 100644 --- a/views/shared/modals/death.jade +++ b/views/shared/modals/death.jade @@ -1,6 +1,6 @@ //div(modal='user.stats.hp <= 0', options='{backdrop:true, keyboard:false, backdropClick:false}') script(type='text/ng-template', id='modals/death.html') - .modal-body + .modal-body.death-modal .row .col-md-3 figure.notification-character From 4dcf74a38af779aa3cbc2369cb908169c87302e7 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Sat, 1 Feb 2014 17:18:37 +0100 Subject: [PATCH 12/42] refactor(bs3): port avatar level label --- public/css/avatar.styl | 15 ++++++++++++++- public/css/index.styl | 13 +------------ views/shared/header/avatar.jade | 2 +- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/public/css/avatar.styl b/public/css/avatar.styl index 3a774d4f65..e0cb66bc2a 100644 --- a/public/css/avatar.styl +++ b/public/css/avatar.styl @@ -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 @@ -93,4 +106,4 @@ future re: pets and whatnot, this is just temporary. position: absolute .herobox.isLeader - background: $better + background: $better \ No newline at end of file diff --git a/public/css/index.styl b/public/css/index.styl index 6dafe909b7..62a14fd6ac 100644 --- a/public/css/index.styl +++ b/public/css/index.styl @@ -134,7 +134,7 @@ div.tooltip-inner { // notification-character used only by death modal's figure, move .death-modal // a .modal-body margin: 10px - + figure float: left padding: 15px @@ -147,17 +147,6 @@ div.tooltip-inner { right: 0px z-index: 1061 -// 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 diff --git a/views/shared/header/avatar.jade b/views/shared/header/avatar.jade index fa54dcc12a..9b368cfe09 100644 --- a/views/shared/header/avatar.jade +++ b/views/shared/header/avatar.jade @@ -43,7 +43,7 @@ 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")') + .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}} From f6a8b9e4cb03d234eeb7119ed053888b03063a6c Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Sat, 1 Feb 2014 19:19:48 +0100 Subject: [PATCH 13/42] refactor(bs3): port some modals & css fixes --- public/css/tasks.styl | 12 ++++++++---- public/js/controllers/notificationCtrl.js | 9 +++++++++ public/js/controllers/rootCtrl.js | 12 ++++++++++-- views/shared/footer.jade | 2 +- views/shared/gems.jade | 2 +- views/shared/modals/buy-gems.jade | 2 +- views/shared/modals/classes.jade | 6 ++---- views/shared/modals/rebirth.jade | 2 +- views/shared/modals/reroll.jade | 2 +- views/shared/tasks/task.jade | 23 ++++++++++++++++++----- 10 files changed, 52 insertions(+), 20 deletions(-) diff --git a/public/css/tasks.styl b/public/css/tasks.styl index 3e59280ac9..22a460525d 100644 --- a/public/css/tasks.styl +++ b/public/css/tasks.styl @@ -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 @@ -112,6 +114,9 @@ for $stage in $stages &:last-child margin-bottom: 0 + label + font-weight: 400 + // task content .task-text display: block @@ -273,10 +278,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 diff --git a/public/js/controllers/notificationCtrl.js b/public/js/controllers/notificationCtrl.js index f6adac2d55..6089fcabe9 100644 --- a/public/js/controllers/notificationCtrl.js +++ b/public/js/controllers/notificationCtrl.js @@ -116,6 +116,15 @@ habitrpg.controller('NotificationCtrl', }) });*/ + $rootScope.$watch('!user.flags.classSelected && user.stats.lvl >= 10', function(after, before){ + if(after){ + $modal.open({ + templateUrl: 'modals/chooseClass.html', + controller: 'UserCtrl' + }); + } + }); + $rootScope.$watch('user.stats.lvl', function(after, before) { if (after == before) return; if (after > before) { diff --git a/public/js/controllers/rootCtrl.js b/public/js/controllers/rootCtrl.js index 3b119b561a..708a4b87c5 100644 --- a/public/js/controllers/rootCtrl.js +++ b/public/js/controllers/rootCtrl.js @@ -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(){ @@ -64,6 +64,14 @@ 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(modal){ + $modal.open({ + templateUrl: 'modals/' + modal + '.html' + }); + } + $rootScope.dismissAlert = function() { $rootScope.modals.newStuff = false; $rootScope.set({'flags.newStuff':false}); diff --git a/views/shared/footer.jade b/views/shared/footer.jade index 57c1d37f96..f5a1df5666 100644 --- a/views/shared/footer.jade +++ b/views/shared/footer.jade @@ -13,7 +13,7 @@ footer.footer(ng-controller='FooterCtrl') ul.list-unstyled.list-unstyled if (!env.isFrontPage) li - .btn.btn-small.btn-success(ng-click='modals.buyGems = true') + .btn.btn-small.btn-success(ng-click='openModal("buyGems")') span.glyphicon.glyphicon-heart =env.t('companyDonate') li diff --git a/views/shared/gems.jade b/views/shared/gems.jade index 71c3c8e411..ef3738ef91 100644 --- a/views/shared/gems.jade +++ b/views/shared/gems.jade @@ -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 diff --git a/views/shared/modals/buy-gems.jade b/views/shared/modals/buy-gems.jade index b43b1dc6ea..03a610de65 100644 --- a/views/shared/modals/buy-gems.jade +++ b/views/shared/modals/buy-gems.jade @@ -29,4 +29,4 @@ script(id='modals/buyGems.html', type='text/ng-template') 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') diff --git a/views/shared/modals/classes.jade b/views/shared/modals/classes.jade index 4a96a558c3..7fdad4bcd5 100644 --- a/views/shared/modals/classes.jade +++ b/views/shared/modals/classes.jade @@ -1,5 +1,3 @@ -//activated by -// 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') @@ -73,5 +71,5 @@ script(type='text/ng-template', id='modals/chooseClass.html') .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') \ No newline at end of file + 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-click='selectedClass && changeClass(selectedClass); $close()')=env.t('select') \ No newline at end of file diff --git a/views/shared/modals/rebirth.jade b/views/shared/modals/rebirth.jade index 9e7dc610d2..9853aead02 100644 --- a/views/shared/modals/rebirth.jade +++ b/views/shared/modals/rebirth.jade @@ -39,7 +39,7 @@ script(type='text/ng-template', id='modals/rebirth.html') .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') + 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='rebirth()')=env.t('beReborn') diff --git a/views/shared/modals/reroll.jade b/views/shared/modals/reroll.jade index 09bbcc5bee..8bc484eb62 100644 --- a/views/shared/modals/reroll.jade +++ b/views/shared/modals/reroll.jade @@ -10,7 +10,7 @@ script(type='text/ng-template', id='modals/reroll.html') .modal-footer button.btn.btn-large.cancel(ng-click='modals.reroll = false')=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') diff --git a/views/shared/tasks/task.jade b/views/shared/tasks/task.jade index 16911930e7..e1fddad6d3 100644 --- a/views/shared/tasks/task.jade +++ b/views/shared/tasks/task.jade @@ -4,43 +4,54 @@ li(bindonce='list', bo-id='"task-"+task.id', ng-repeat='task in obj[list.type+"s // 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-class='{"label label-danger":moment(task.date).isBefore(_today, "days")}') {{moment(task.date).format('MM/DD')}} // Streak span(ng-show='task.streak') {{task.streak}} span(tooltip=env.t('streakCounter')) + |   span.glyphicon.glyphicon-forward + |   // 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}} - + |   span.glyphicon.glyphicon-tags(tooltip='{{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')) + |   span.glyphicon.glyphicon-pencil(ng-hide='task._editing') + |   // cancel a(ng-hide='!task._editing', ng-click='editTask(task)', tooltip=env.t('cancel')) span.glyphicon.glyphicon-remove(ng-hide='!task._editing') + |   // save a(ng-hide='!task._editing', ng-click='editTask(task);saveTask(task)', tooltip=env.t('save')) span.glyphicon.glyphicon-ok(ng-hide='!task._editing') + |   //challenges span(ng-if='task.challenge.id') span(ng-if='task.challenge.broken') span.glyphicon.glyphicon-bullhorn(style='background-color:red;', ng-click='task._editing = true', tooltip=env.t('brokenChaLink') tooltip-placement='right') + |   span(ng-if='!task.challenge.broken') span.glyphicon.glyphicon-bullhorn(tooltip=env.t('challenge')) + |   // delete a(ng-if='!task.challenge.id', ng-click='removeTask(obj[list.type+"s"], $index)', tooltip=env.t('delete')) span.glyphicon.glyphicon-trash + |   // chart a(ng-show='task.history', ng-click='toggleChart(obj._id+task.id, task)', tooltip=env.t('progress')) span.glyphicon.glyphicon-signal + |   // notes span.task-notes(ng-show='task.notes && !task._editing') span.glyphicon.glyphicon-comment + |   // left-hand side checkbox .task-controls.task-primary @@ -107,16 +118,17 @@ 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)') + 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 + |     =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') - |   + |     span.glyphicon.glyphicon-question-sign(popover=env.t('checklistText'),popover-trigger='mouseenter',popover-placement='bottom') - ul.unstyled + ul.list-unstyled li(ng-repeat='item in task.checklist') a.pull-right.checklist-icons(ng-click='removeChecklistItem(task,$event,$index,true)') span.glyphicon.glyphicon-trash(tooltip=env.t('delete')) @@ -182,6 +194,7 @@ li(bindonce='list', bo-id='"task-"+task.id', ng-repeat='task in obj[list.type+"s 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')) span.glyphicon.glyphicon-question-sign + |   =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') From 8b29eb530aa0b7e99fd9161e2c9cf1c0d2bdd4c7 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Sat, 1 Feb 2014 19:39:05 +0100 Subject: [PATCH 14/42] refactor(bs3): port drops modals --- public/js/services/guideServices.js | 6 ++++-- views/shared/modals/drops.jade | 14 +------------- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/public/js/services/guideServices.js b/public/js/services/guideServices.js index 32df74a401..7c858b8d28 100644 --- a/public/js/services/guideServices.js +++ b/public/js/services/guideServices.js @@ -5,7 +5,7 @@ */ angular.module('guideServices', []). - factory('Guide', ['$rootScope', 'User', '$timeout', function($rootScope, User, $timeout) { + factory('Guide', ['$rootScope', 'User', '$timeout', '$modal', function($rootScope, User, $timeout, $modal) { /** * Init and show the welcome tour. Note we do it listening to a $rootScope broadcasted 'userLoaded' message, @@ -130,7 +130,9 @@ angular.module('guideServices', []). if (!eggs) { eggs['Wolf'] = 1; // This is also set on the server } - $rootScope.modals.dropsEnabled = true; + $modal.open({ + templateUrl: 'modals/dropsEnabled.html' + }); }); $rootScope.$watch('user.items.pets', function(after, before) { diff --git a/views/shared/modals/drops.jade b/views/shared/modals/drops.jade index de42dd85ac..9850d51252 100644 --- a/views/shared/modals/drops.jade +++ b/views/shared/modals/drops.jade @@ -1,4 +1,3 @@ -//div(modal='modals.dropsEnabled') script(type='text/ng-template', id='modals/dropsEnabled.html') .modal-header h3=env.t('dropsEnabled') @@ -11,15 +10,4 @@ script(type='text/ng-template', id='modals/dropsEnabled.html') 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') -script(type='text/ng-template', id='modals/drop.html') - .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') \ No newline at end of file + button.btn.btn-default.cancel(ng-click='$close()')=env.t('close') \ No newline at end of file From 211be37cfc23dfeac2fa628dc83ea606a276ab30 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Sun, 2 Feb 2014 13:42:29 +0100 Subject: [PATCH 15/42] refactor(bs3): fix classes modal --- views/shared/modals/classes.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/shared/modals/classes.jade b/views/shared/modals/classes.jade index 7fdad4bcd5..870ea0e93d 100644 --- a/views/shared/modals/classes.jade +++ b/views/shared/modals/classes.jade @@ -72,4 +72,4 @@ script(type='text/ng-template', id='modals/chooseClass.html') .modal-footer 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-click='selectedClass && changeClass(selectedClass); $close()')=env.t('select') \ No newline at end of file + button.btn.btn-primary.cancel(ng-disabled='!selectedClass' ng-click='changeClass(selectedClass); $close()')=env.t('select') \ No newline at end of file From 3e077fea6dc8d2d60d5573cd5a3c57a5f00d087d Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Sun, 2 Feb 2014 13:52:42 +0100 Subject: [PATCH 16/42] refactor(bs3): port rebirth and reroll modals, misc fixes --- public/js/controllers/settingsCtrl.js | 2 -- public/js/services/guideServices.js | 8 ++++++-- views/options/inventory/inventory.jade | 4 ++-- views/shared/modals/rebirth.jade | 8 +++----- views/shared/modals/reroll.jade | 5 ++--- 5 files changed, 13 insertions(+), 14 deletions(-) diff --git a/public/js/controllers/settingsCtrl.js b/public/js/controllers/settingsCtrl.js index 8ad6419a14..89bf06a638 100644 --- a/public/js/controllers/settingsCtrl.js +++ b/public/js/controllers/settingsCtrl.js @@ -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'); } diff --git a/public/js/services/guideServices.js b/public/js/services/guideServices.js index 7c858b8d28..1f860e6fa9 100644 --- a/public/js/services/guideServices.js +++ b/public/js/services/guideServices.js @@ -139,13 +139,17 @@ angular.module('guideServices', []). if (User.user.achievements && User.user.achievements.beastMaster) return; if (before >= 90) { User.set({'achievements.beastMaster': true}); - $('#beastmaster-achievement-modal').modal('show'); // FIXME + $modal.open({ + templateUrl: 'modals/achievements/beastMaster.html' + }); } }); $rootScope.$watch('user.flags.rebirthEnabled', function(after, before) { if (alreadyShown(before, after)) return; - $rootScope.modals.rebirthEnabled = true; + $modal.open({ + templateUrl: 'modals/rebirthEnabled.html' + }); }); diff --git a/views/options/inventory/inventory.jade b/views/options/inventory/inventory.jade index 3fab6be8c2..751b57d897 100644 --- a/views/options/inventory/inventory.jade +++ b/views/options/inventory/inventory.jade @@ -123,7 +123,7 @@ script(type='text/ng-template', id='partials/options.inventory.drops.html') | {{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='modals.reroll = true', class='inventory_special_fortify') + 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 @@ -133,7 +133,7 @@ script(type='text/ng-template', id='partials/options.inventory.drops.html') | {{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') + 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 diff --git a/views/shared/modals/rebirth.jade b/views/shared/modals/rebirth.jade index 9853aead02..270533dbec 100644 --- a/views/shared/modals/rebirth.jade +++ b/views/shared/modals/rebirth.jade @@ -1,6 +1,5 @@ // Created by Sabe on 12/22/13. -//div(modal='modals.rebirthEnabled') script(type='text/ng-template', id='modals/rebirthEnabled.html') .modal-header h3=env.t('rebirthNew') @@ -9,9 +8,8 @@ script(type='text/ng-template', id='modals/rebirthEnabled.html') p span=env.t('rebirthUnlock') .modal-footer - button.btn.btn-default.cancel(ng-click='modals.rebirthEnabled = false')=env.t('close') + button.btn.btn-default.cancel(ng-click='$close()')=env.t('close') -//div(modal='modals.rebirth') script(type='text/ng-template', id='modals/rebirth.html') .modal-header h3=env.t('rebirthBegin') @@ -37,12 +35,12 @@ script(type='text/ng-template', id='modals/rebirth.html') .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') + button.btn.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='rebirth()')=env.t('beReborn') + a.btn.btn-danger.btn-large(ng-click='$close(); rebirth()')=env.t('beReborn') span.gem-cost | 8  =env.t('gems') diff --git a/views/shared/modals/reroll.jade b/views/shared/modals/reroll.jade index 8bc484eb62..2840418ade 100644 --- a/views/shared/modals/reroll.jade +++ b/views/shared/modals/reroll.jade @@ -1,5 +1,4 @@ // Re-Roll modal -//div(modal='modals.reroll') script(type='text/ng-template', id='modals/reroll.html') .modal-header h3=env.t('fortify') @@ -8,12 +7,12 @@ script(type='text/ng-template', id='modals/reroll.html') p=env.t('fortifyText') .modal-footer - button.btn.btn-large.cancel(ng-click='modals.reroll = false')=env.t('neverMind') + button.btn.btn-large.cancel(ng-click='$close()')=env.t('neverMind') span(ng-if='user.balance < 1') 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  = env.t('gems') From 317a148760d4b319f4018d170ca3430d6d88ad15 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Sun, 2 Feb 2014 15:46:46 +0100 Subject: [PATCH 17/42] refactor(bs3): port newStuff and member modals, misc fixes --- public/css/index.styl | 3 --- public/js/controllers/groupsCtrl.js | 9 ++++++--- public/js/controllers/notificationCtrl.js | 8 ++++++++ public/js/controllers/rootCtrl.js | 1 - views/shared/header/header.jade | 2 +- views/shared/modals/members.jade | 5 +---- views/shared/modals/new-stuff.jade | 8 ++++---- 7 files changed, 20 insertions(+), 16 deletions(-) diff --git a/public/css/index.styl b/public/css/index.styl index cf640817dd..96d9262163 100644 --- a/public/css/index.styl +++ b/public/css/index.styl @@ -153,9 +153,6 @@ a a span.glyphicon color: #333 // Takes base color from bootstrap -#modalMember p - word-wrap: break-word - .btn margin-right: 5px diff --git a/public/js/controllers/groupsCtrl.js b/public/js/controllers/groupsCtrl.js index ddb36c824f..c52b81da9a 100644 --- a/public/js/controllers/groupsCtrl.js +++ b/public/js/controllers/groupsCtrl.js @@ -1,7 +1,7 @@ "use strict"; -habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '$http', 'API_URL', '$q', 'User', 'Members', '$state', - function($scope, $rootScope, Shared, Groups, $http, API_URL, $q, User, Members, $state) { +habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '$http', 'API_URL', '$q', 'User', 'Members', '$state', '$modal', + function($scope, $rootScope, Shared, Groups, $http, API_URL, $q, User, Members, $state, $modal) { $scope.isMember = function(user, group){ return ~(group.members.indexOf(user._id)); @@ -29,7 +29,10 @@ 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; + $modal.open({ + templateUrl: 'modals/member.html', + controller: 'MemberModalCtrl' + }); } } diff --git a/public/js/controllers/notificationCtrl.js b/public/js/controllers/notificationCtrl.js index 6089fcabe9..c270558320 100644 --- a/public/js/controllers/notificationCtrl.js +++ b/public/js/controllers/notificationCtrl.js @@ -116,6 +116,7 @@ habitrpg.controller('NotificationCtrl', }) });*/ + // Classes modal $rootScope.$watch('!user.flags.classSelected && user.stats.lvl >= 10', function(after, before){ if(after){ $modal.open({ @@ -132,6 +133,13 @@ habitrpg.controller('NotificationCtrl', } }); + $rootScope.$watch('!user.flags.mathUpdates', function(after, before){ + if (after === before || after !== true) return; + $modal.open({ + templateUrl: 'modals/mathUpdates.html' + }); + }); + $rootScope.$on('responseError', function(ev, error){ Notification.error(error); }); diff --git a/public/js/controllers/rootCtrl.js b/public/js/controllers/rootCtrl.js index 708a4b87c5..14069e100a 100644 --- a/public/js/controllers/rootCtrl.js +++ b/public/js/controllers/rootCtrl.js @@ -73,7 +73,6 @@ habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$ } $rootScope.dismissAlert = function() { - $rootScope.modals.newStuff = false; $rootScope.set({'flags.newStuff':false}); } diff --git a/views/shared/header/header.jade b/views/shared/header/header.jade index a43113558f..9875741ba4 100644 --- a/views/shared/header/header.jade +++ b/views/shared/header/header.jade @@ -35,5 +35,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")') diff --git a/views/shared/modals/members.jade b/views/shared/modals/members.jade index 47b3f0b03f..822a59b553 100644 --- a/views/shared/modals/members.jade +++ b/views/shared/modals/members.jade @@ -1,6 +1,3 @@ -//div(ng-controller='MemberModalCtrl') - #memberModal(modal='modals.member') - script(type='text/ng-template', id='modals/member.html') .modal-header(bindonce='profile') h3 @@ -25,4 +22,4 @@ script(type='text/ng-template', id='modals/member.html') h3 Achievements include ../profiles/achievements .modal-footer - button.btn.btn-default(ng-click='modals.member = false')=env.t('ok') + button.btn.btn-default(ng-click='$close()')=env.t('ok') diff --git a/views/shared/modals/new-stuff.jade b/views/shared/modals/new-stuff.jade index 0c51815132..5ecb98ba34 100644 --- a/views/shared/modals/new-stuff.jade +++ b/views/shared/modals/new-stuff.jade @@ -1,4 +1,5 @@ //-div(modal='!user.flags.mathUpdates') +script(type='text/ng-template', id='modals/mathUpdates.html') .modal-header h3 Math Updates .modal-body @@ -9,9 +10,8 @@ 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 Trello. .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! @@ -467,5 +467,5 @@ script(type='text/ng-template', id='modals/newStuff.html') 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 \ No newline at end of file + button.btn.btn-default.cancel(ng-click='$close()') Cool + button.btn.btn-warning.cancel(ng-click='dismissAlert(); $close()') Dismiss This Alert \ No newline at end of file From 571954b5cfcf79ff18c3127a516d7a55ddab7f37 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Sun, 2 Feb 2014 16:06:30 +0100 Subject: [PATCH 18/42] refactor(bs3): misc fixes, port restore, delete and reset modals --- public/css/index.styl | 5 +++++ public/js/controllers/rootCtrl.js | 6 ++++-- public/js/controllers/settingsCtrl.js | 2 -- views/options/index.jade | 4 ++++ views/options/settings.jade | 6 +++--- views/shared/header/header.jade | 4 ++++ views/shared/header/menu.jade | 6 ++++++ views/shared/modals/new-stuff.jade | 4 ++-- views/shared/modals/settings.jade | 16 ++++++---------- 9 files changed, 34 insertions(+), 19 deletions(-) diff --git a/public/css/index.styl b/public/css/index.styl index 96d9262163..85f913b1f4 100644 --- a/public/css/index.styl +++ b/public/css/index.styl @@ -130,6 +130,11 @@ div.tooltip-inner { /* Misc -------------------------------------------------- */ +//move + +.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 used only by death modal's figure, move .death-modal // a .modal-body diff --git a/public/js/controllers/rootCtrl.js b/public/js/controllers/rootCtrl.js index 14069e100a..8047127792 100644 --- a/public/js/controllers/rootCtrl.js +++ b/public/js/controllers/rootCtrl.js @@ -66,9 +66,11 @@ habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$ // Open a modal from a template expression (like ng-click,...) // Otherwise use the proper $modal.open - $rootScope.openModal = function(modal){ + $rootScope.openModal = function(template, controller, scope){ $modal.open({ - templateUrl: 'modals/' + modal + '.html' + templateUrl: 'modals/' + template + '.html', + controller: controller, // optional + scope: scope // optional }); } diff --git a/public/js/controllers/settingsCtrl.js b/public/js/controllers/settingsCtrl.js index 89bf06a638..1f2bbebb67 100644 --- a/public/js/controllers/settingsCtrl.js +++ b/public/js/controllers/settingsCtrl.js @@ -96,12 +96,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'); } diff --git a/views/options/index.jade b/views/options/index.jade index 496acde639..9ea9ad4fe2 100644 --- a/views/options/index.jade +++ b/views/options/index.jade @@ -13,18 +13,22 @@ script(id='partials/options.html', type="text/ng-template") li(ng-class="{ active: $state.includes('options.profile') }") a(ui-sref='options.profile') span.glyphicon.glyphicon-user + |   =env.t('profile') li(ng-class="{ active: $state.includes('options.social') }") a(ui-sref='options.social') span.glyphicon.glyphicon-heart + |   =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 + |   =env.t('inventory') li(ng-class="{ active: $state.includes('options.settings') }") a(ui-sref='options.settings') span.glyphicon.glyphicon-wrench + |   =env.t('settings') .tab-content diff --git a/views/options/settings.jade b/views/options/settings.jade index d084c06390..a0bbb78714 100644 --- a/views/options/settings.jade +++ b/views/options/settings.jade @@ -65,7 +65,7 @@ script(type='text/ng-template', id='partials/options.settings.settings.html') 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') + button.btn(ng-click='openModal("restore", "SettingsCtrl")', 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') @@ -86,8 +86,8 @@ script(type='text/ng-template', id='partials/options.settings.settings.html') 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') + 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 diff --git a/views/shared/header/header.jade b/views/shared/header/header.jade index 9875741ba4..8c85538495 100644 --- a/views/shared/header/header.jade +++ b/views/shared/header/header.jade @@ -14,20 +14,24 @@ .bar(style='width: {{Shared.percent(user.stats.hp, 50)}}%;') span.meter-text span.glyphicon.glyphicon-heart + |   | {{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 span.glyphicon.glyphicon-star + |   | {{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')) + |   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 span.glyphicon.glyphicon-fire + |   | {{Math.floor(user.stats.mp)}} / {{user._statsComputed.maxMP}} // party diff --git a/views/shared/header/menu.jade b/views/shared/header/menu.jade index fa7cf337d8..38c409f1da 100644 --- a/views/shared/header/menu.jade +++ b/views/shared/header/menu.jade @@ -8,25 +8,31 @@ a.task-action-btn.tile.solid span(ng-show='$state.includes("options")', ui-sref='tasks') span.glyphicon.glyphicon-ok + |   =env.t('tasks') span(ng-show='$state.includes("tasks")', ui-sref='options') span.glyphicon.glyphicon-wrench + |   =env.t('options') li a.task-action-btn.tile.solid(href="http://habitrpg.wikia.com/wiki/FAQ", target='_blank') span.glyphicon.glyphicon-book + |   =env.t('FAQ') li a.task-action-btn.tile.solid(href="https://vimeo.com/57654086", target='_blank') span.glyphicon.glyphicon-film + //|   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()') span.glyphicon.glyphicon-refresh + |   =env.t('sync') li a.task-action-btn.tile.solid(ng-click='logout()') span.glyphicon.glyphicon-share-alt + |   =env.t('logout') // party invitation notification a(ng-show='user.party.invitation', style='cursor: pointer;', x-bind='click:gotoPartyChat') diff --git a/views/shared/modals/new-stuff.jade b/views/shared/modals/new-stuff.jade index 5ecb98ba34..d8bbbaf918 100644 --- a/views/shared/modals/new-stuff.jade +++ b/views/shared/modals/new-stuff.jade @@ -12,10 +12,10 @@ script(type='text/ng-template', id='modals/mathUpdates.html') .modal-footer button.btn.btn-default.cancel(ng-click='User.set({"flags.mathUpdates":true}); $close()') Dismiss -script(type='text/ng-template', id='modals/newStuff.html') +script(type='text/ng-template', id='modals/newStuff.html') .modal-header h3 New Stuff! - .modal-body + .modal-body.new-stuff-modal table tr td diff --git a/views/shared/modals/settings.jade b/views/shared/modals/settings.jade index 4aca070e2f..634fc92cc0 100644 --- a/views/shared/modals/settings.jade +++ b/views/shared/modals/settings.jade @@ -1,5 +1,3 @@ -//div(ng-controller='SettingsCtrl') Above all - div(modal='modals.reset') script(type='text/ng-template', id='modals/reset.html') .modal-header h3=env.t('resetAccount') @@ -7,10 +5,9 @@ script(type='text/ng-template', id='modals/reset.html') 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') + 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') script(type='text/ng-template', id='modals/restore.html') .modal-header h3=env.t('fixValues') @@ -46,10 +43,9 @@ script(type='text/ng-template', id='modals/restore.html') 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') + button.btn.btn-default.cancel(ng-click='$close()')=env.t('discardChanges') + button.btn.btn-primary(ng-click='$close(); restore()')=env.t('saveAndClose') -//div(modal='modals.delete') script(type='text/ng-template', id='modals/delete.html') .modal-header h3=env.t('deleteAccount') @@ -58,5 +54,5 @@ script(type='text/ng-template', id='modals/delete.html') 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') + 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') From 07593dc1226e8ebc760625948dcfd1083e7cf480 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Sun, 2 Feb 2014 16:43:58 +0100 Subject: [PATCH 19/42] refactor(bs3): port quests modals, fix restore modal and various bugs --- public/js/controllers/authCtrl.js | 1 - public/js/controllers/groupsCtrl.js | 2 +- public/js/controllers/inventoryCtrl.js | 18 +++++++++++------- public/js/controllers/notificationCtrl.js | 19 ++++++++++++++++++- public/js/controllers/rootCtrl.js | 2 +- public/js/controllers/settingsCtrl.js | 11 +++++------ public/js/controllers/userCtrl.js | 4 ++-- views/options/settings.jade | 2 +- views/shared/header/menu.jade | 1 - views/shared/modals/quests.jade | 20 ++++++++------------ views/shared/modals/settings.jade | 14 +++++++------- 11 files changed, 54 insertions(+), 40 deletions(-) diff --git a/public/js/controllers/authCtrl.js b/public/js/controllers/authCtrl.js index 381ed62e32..1312b40d35 100644 --- a/public/js/controllers/authCtrl.js +++ b/public/js/controllers/authCtrl.js @@ -27,7 +27,6 @@ angular.module('authCtrl', []) runAuth = function(id, token) { User.authenticate(id, token, function(err) { $window.location.href = '/'; - //$rootScope.modals.login = false; }); }; diff --git a/public/js/controllers/groupsCtrl.js b/public/js/controllers/groupsCtrl.js index c52b81da9a..3c66eabdcd 100644 --- a/public/js/controllers/groupsCtrl.js +++ b/public/js/controllers/groupsCtrl.js @@ -222,7 +222,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("Create Guild for 4 Gems?")) { group.$save(function(saved){ diff --git a/public/js/controllers/inventoryCtrl.js b/public/js/controllers/inventoryCtrl.js index 122295ddb9..4710b3a9c7 100644 --- a/public/js/controllers/inventoryCtrl.js +++ b/public/js/controllers/inventoryCtrl.js @@ -1,5 +1,5 @@ -habitrpg.controller("InventoryCtrl", ['$rootScope', '$scope', '$window', 'User', 'Content', - function($rootScope, $scope, $window, User, Content) { +habitrpg.controller("InventoryCtrl", ['$rootScope', '$scope', '$window', 'User', 'Content', '$modal', + function($rootScope, $scope, $window, User, Content, $modal) { var user = User.user; @@ -87,7 +87,7 @@ 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 == 'hatchingPotion') ? 'hatching potion' : type; // give hatchingPotion a space var message = "Buy this " + string + " with " + item.value + " of your " + gems + " Gems?" if($window.confirm(message)) @@ -127,12 +127,13 @@ habitrpg.controller("InventoryCtrl", ['$rootScope', '$scope', '$window', 'User', if (item.lvl && item.lvl > user.stats.lvl) return alert("You must be level " + item.lvl + '.'); $rootScope.selectedQuest = item; - $rootScope.modals.showQuest = true; + $modal.open({ + templateUrl: 'modals/showQuest.html', + controller: '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 +149,10 @@ habitrpg.controller("InventoryCtrl", ['$rootScope', '$scope', '$window', 'User', if (!completedPrevious) return $scope.purchase("quests", item); $rootScope.selectedQuest = item; - $rootScope.modals.buyQuest = true; + $modal.open({ + templateUrl: 'modals/buyQuest.html', + controller: 'InventoryCtrl' + }); } } ]); diff --git a/public/js/controllers/notificationCtrl.js b/public/js/controllers/notificationCtrl.js index c270558320..a8f4ece386 100644 --- a/public/js/controllers/notificationCtrl.js +++ b/public/js/controllers/notificationCtrl.js @@ -133,13 +133,30 @@ habitrpg.controller('NotificationCtrl', } }); + // Math updates modal $rootScope.$watch('!user.flags.mathUpdates', function(after, before){ - if (after === before || after !== true) return; + if (after == before || after != true) return; $modal.open({ templateUrl: 'modals/mathUpdates.html' }); }); + // Completed quest modal + $rootScope.$watch('user.party.quest.completed', function(after, before){ + if (after == before || after != true) return; + $modal.open({ + templateUrl: 'modals/questCompleted.html', + controller: 'InventoryCtrl' + }); + }); + + $rootScope.$watch('party.quest.key && !party.quest.active && !questHold && party.quest.members[user._id] == undefined', function(after, before){ + if (after == before || after != true) return; + $modal.open({ + templateUrl: 'modals/questInvitation.html' + }); + }); + $rootScope.$on('responseError', function(ev, error){ Notification.error(error); }); diff --git a/public/js/controllers/rootCtrl.js b/public/js/controllers/rootCtrl.js index 8047127792..35e001a95e 100644 --- a/public/js/controllers/rootCtrl.js +++ b/public/js/controllers/rootCtrl.js @@ -67,7 +67,7 @@ habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$ // Open a modal from a template expression (like ng-click,...) // Otherwise use the proper $modal.open $rootScope.openModal = function(template, controller, scope){ - $modal.open({ + return $modal.open({ templateUrl: 'modals/' + template + '.html', controller: controller, // optional scope: scope // optional diff --git a/public/js/controllers/settingsCtrl.js b/public/js/controllers/settingsCtrl.js index 1f2bbebb67..9d56526bd5 100644 --- a/public/js/controllers/settingsCtrl.js +++ b/public/js/controllers/settingsCtrl.js @@ -78,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, diff --git a/public/js/controllers/userCtrl.js b/public/js/controllers/userCtrl.js index ce3c629d82..43abc3e327 100644 --- a/public/js/controllers/userCtrl.js +++ b/public/js/controllers/userCtrl.js @@ -53,10 +53,10 @@ habitrpg.controller("UserCtrl", ['$rootScope', '$scope', '$location', 'User', '$ if (fullSet) { if (confirm("Purchase for 5 Gems?") !== 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("Purchase for 2 Gems?") !== 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}}) } diff --git a/views/options/settings.jade b/views/options/settings.jade index a0bbb78714..c6e6fc88aa 100644 --- a/views/options/settings.jade +++ b/views/options/settings.jade @@ -65,7 +65,7 @@ script(type='text/ng-template', id='partials/options.settings.settings.html') br button.btn(ng-click='showBailey()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('showBaileyPop'))= env.t('showBailey') br - button.btn(ng-click='openModal("restore", "SettingsCtrl")', popover-trigger='mouseenter', popover-placement='right', popover=env.t('fixValPop'))= env.t('fixVal') + button.btn(ng-click='openRestoreModal()', 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') diff --git a/views/shared/header/menu.jade b/views/shared/header/menu.jade index 38c409f1da..d812ded929 100644 --- a/views/shared/header/menu.jade +++ b/views/shared/header/menu.jade @@ -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}} diff --git a/views/shared/modals/quests.jade b/views/shared/modals/quests.jade index 8c26933369..0efc6be7f3 100644 --- a/views/shared/modals/quests.jade +++ b/views/shared/modals/quests.jade @@ -11,7 +11,6 @@ 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}}" @@ -20,9 +19,8 @@ script(type='text/ng-template', id='modals/questCompleted.html') 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}} @@ -35,10 +33,9 @@ script(type='text/ng-template', id='modals/showQuest.html') .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}} @@ -47,10 +44,9 @@ script(type='text/ng-template', id='modals/buyQuest.html') 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') @@ -59,6 +55,6 @@ script(type='text/ng-template', id='modals/questInvitation.html') 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') diff --git a/views/shared/modals/settings.jade b/views/shared/modals/settings.jade index 634fc92cc0..644c0a60e3 100644 --- a/views/shared/modals/settings.jade +++ b/views/shared/modals/settings.jade @@ -18,33 +18,33 @@ script(type='text/ng-template', id='modals/restore.html') 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') + input.option-content(type='number', step="any", data-for='stats.hp', ng-model='$parent.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') + input.option-content(type='number', step="any", data-for='stats.exp', ng-model='$parent.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='$parent.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') + input.option-content(type='number', step="any", data-for='stats.mp', ng-model='$parent.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') + input.option-content(type='number', data-for='stats.lvl', ng-model='$parent.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') + input.option-content(type='number', data-for='achievements.streak', ng-model='$parent.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='$close()')=env.t('discardChanges') - button.btn.btn-primary(ng-click='$close(); restore()')=env.t('saveAndClose') + button.btn.btn-primary(ng-click='restore(); $close();')=env.t('saveAndClose') script(type='text/ng-template', id='modals/delete.html') .modal-header From cdc13d2ffb93ac8fa0e69d52abe82a28e1e6fa45 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Mon, 3 Feb 2014 19:24:37 +0100 Subject: [PATCH 20/42] refactor(bs3): misc --- public/js/controllers/authCtrl.js | 10 ++--- public/js/controllers/groupsCtrl.js | 9 ++--- public/js/controllers/inventoryCtrl.js | 14 ++----- public/js/controllers/notificationCtrl.js | 48 ++++++----------------- public/js/controllers/rootCtrl.js | 6 ++- public/js/services/guideServices.js | 20 ++-------- 6 files changed, 30 insertions(+), 77 deletions(-) diff --git a/public/js/controllers/authCtrl.js b/public/js/controllers/authCtrl.js index 1312b40d35..9c65ee3541 100644 --- a/public/js/controllers/authCtrl.js +++ b/public/js/controllers/authCtrl.js @@ -5,8 +5,8 @@ */ angular.module('authCtrl', []) - .controller("AuthCtrl", ['$scope', '$rootScope', 'User', '$http', '$location', '$window','API_URL', '$modal', - function($scope, $rootScope, User, $http, $location, $window, API_URL, $modal) { + .controller("AuthCtrl", ['$scope', '$rootScope', 'User', '$http', '$location', '$window','API_URL', + function($scope, $rootScope, User, $http, $location, $window, API_URL) { var runAuth; var showedFacebookMessage; @@ -71,10 +71,8 @@ angular.module('authCtrl', []) if (User.authenticated()) { window.location.href = '/#/tasks'; } else { - $modal.open({ - templateUrl: 'modals/login.html' - // Using controller: 'AuthCtrl' it causes problems - }); + // Using controller: 'AuthCtrl' it causes problems + $rootScope.openModal('login'); } } diff --git a/public/js/controllers/groupsCtrl.js b/public/js/controllers/groupsCtrl.js index d1f97a8a08..c3910a9030 100644 --- a/public/js/controllers/groupsCtrl.js +++ b/public/js/controllers/groupsCtrl.js @@ -1,7 +1,7 @@ "use strict"; -habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '$http', 'API_URL', '$q', 'User', 'Members', '$state', '$modal', - function($scope, $rootScope, Shared, Groups, $http, API_URL, $q, User, Members, $state, $modal) { +habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '$http', 'API_URL', '$q', 'User', 'Members', '$state', + function($scope, $rootScope, Shared, Groups, $http, API_URL, $q, User, Members, $state) { $scope.isMember = function(user, group){ return ~(group.members.indexOf(user._id)); @@ -29,10 +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); - $modal.open({ - templateUrl: 'modals/member.html', - controller: 'MemberModalCtrl' - }); + $rootScope.openModal('member', 'MemberModalCtrl'); } } diff --git a/public/js/controllers/inventoryCtrl.js b/public/js/controllers/inventoryCtrl.js index 4710b3a9c7..96f81644aa 100644 --- a/public/js/controllers/inventoryCtrl.js +++ b/public/js/controllers/inventoryCtrl.js @@ -1,5 +1,5 @@ -habitrpg.controller("InventoryCtrl", ['$rootScope', '$scope', '$window', 'User', 'Content', '$modal', - function($rootScope, $scope, $window, User, Content, $modal) { +habitrpg.controller("InventoryCtrl", ['$rootScope', '$scope', '$window', 'User', 'Content', + function($rootScope, $scope, $window, User, Content) { var user = User.user; @@ -127,10 +127,7 @@ habitrpg.controller("InventoryCtrl", ['$rootScope', '$scope', '$window', 'User', if (item.lvl && item.lvl > user.stats.lvl) return alert("You must be level " + item.lvl + '.'); $rootScope.selectedQuest = item; - $modal.open({ - templateUrl: 'modals/showQuest.html', - controller: 'InventoryCtrl' - }); + $rootScope.openModal('showQuest', 'InventoryCtrl'); } $scope.closeQuest = function(){ $rootScope.selectedQuest = undefined; @@ -149,10 +146,7 @@ habitrpg.controller("InventoryCtrl", ['$rootScope', '$scope', '$window', 'User', if (!completedPrevious) return $scope.purchase("quests", item); $rootScope.selectedQuest = item; - $modal.open({ - templateUrl: 'modals/buyQuest.html', - controller: 'InventoryCtrl' - }); + $rootScope.openModal('showQuest', 'buyQuest'); } } ]); diff --git a/public/js/controllers/notificationCtrl.js b/public/js/controllers/notificationCtrl.js index a8f4ece386..d72a11546f 100644 --- a/public/js/controllers/notificationCtrl.js +++ b/public/js/controllers/notificationCtrl.js @@ -1,16 +1,12 @@ 'use strict'; habitrpg.controller('NotificationCtrl', - ['$scope', '$rootScope', 'Shared', 'User', 'Guide', 'Notification', '$modal', - function ($scope, $rootScope, Shared, User, Guide, Notification, $modal) { + ['$scope', '$rootScope', 'Shared', 'User', 'Guide', 'Notification', + function ($scope, $rootScope, Shared, User, Guide, Notification) { $rootScope.$watch('user.stats.hp', function(after, before) { if (after <= 0){ - $modal.open({ - templateUrl: 'modals/death.html', - keyboard: false, - backdrop: 'static' - }); + $rootScope.openModal('death', undefined, undefined, false, 'static'); } if (after == before) return; if (User.user.stats.lvl == 0) return; @@ -69,39 +65,29 @@ habitrpg.controller('NotificationCtrl', $rootScope.$watch('user.achievements.streak', function(after, before){ if(before == undefined || after == before || after < before) return; - $modal.open({ - templateUrl: 'modals/achievements/streak.html' - }); + $rootScope.openModal('achievements/streak'); }); $rootScope.$watch('user.achievements.ultimateGear', function(after, before){ if (after === before || after !== true) return; - $modal.open({ - templateUrl: 'modals/achievements/ultimateGear.html' - }); + $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; - $modal.open({ - templateUrl: 'modals/achievements/beastMaster.html' - }); + $rootScope.openModal('achievements/beastMaster'); }, true); $rootScope.$watch('user.achievements.rebirths', function(after, before){ if(after === before) return; - $modal.open({ - templateUrl: 'modals/achievements/rebirth.html' - }); + $rootScope.openModal('achievements/rebirth'); }); $rootScope.$watch('user.flags.contributor', function(after, before){ if (after === before || after !== true) return; - $modal.open({ - templateUrl: 'modals/achievements/contributor.html' - }); + $rootScope.openModal('achievements/contributor'); }); /*_.each(['weapon', 'head', 'chest', 'shield'], function(watched){ @@ -119,10 +105,7 @@ habitrpg.controller('NotificationCtrl', // Classes modal $rootScope.$watch('!user.flags.classSelected && user.stats.lvl >= 10', function(after, before){ if(after){ - $modal.open({ - templateUrl: 'modals/chooseClass.html', - controller: 'UserCtrl' - }); + $rootScope.openModal('chooseClass', 'UserCtrl'); } }); @@ -136,25 +119,18 @@ habitrpg.controller('NotificationCtrl', // Math updates modal $rootScope.$watch('!user.flags.mathUpdates', function(after, before){ if (after == before || after != true) return; - $modal.open({ - templateUrl: 'modals/mathUpdates.html' - }); + $rootScope.openModal('mathUpdates'); }); // Completed quest modal $rootScope.$watch('user.party.quest.completed', function(after, before){ if (after == before || after != true) return; - $modal.open({ - templateUrl: 'modals/questCompleted.html', - controller: 'InventoryCtrl' - }); + $rootScope.openModal('questCompleted', 'InventoryCtrl'); }); $rootScope.$watch('party.quest.key && !party.quest.active && !questHold && party.quest.members[user._id] == undefined', function(after, before){ if (after == before || after != true) return; - $modal.open({ - templateUrl: 'modals/questInvitation.html' - }); + $rootScope.openModal('questInvitation'); }); $rootScope.$on('responseError', function(ev, error){ diff --git a/public/js/controllers/rootCtrl.js b/public/js/controllers/rootCtrl.js index 35e001a95e..7cdc782ea1 100644 --- a/public/js/controllers/rootCtrl.js +++ b/public/js/controllers/rootCtrl.js @@ -66,11 +66,13 @@ habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$ // Open a modal from a template expression (like ng-click,...) // Otherwise use the proper $modal.open - $rootScope.openModal = function(template, controller, scope){ + $rootScope.openModal = function(template, controller, scope, keyboard, backdrop){ return $modal.open({ templateUrl: 'modals/' + template + '.html', controller: controller, // optional - scope: scope // optional + scope: scope, // optional + keyboard: keyboard, // optional + backdrop: backdrop // optional }); } diff --git a/public/js/services/guideServices.js b/public/js/services/guideServices.js index 1f860e6fa9..c512c72e23 100644 --- a/public/js/services/guideServices.js +++ b/public/js/services/guideServices.js @@ -5,7 +5,7 @@ */ angular.module('guideServices', []). - factory('Guide', ['$rootScope', 'User', '$timeout', '$modal', function($rootScope, User, $timeout, $modal) { + factory('Guide', ['$rootScope', 'User', '$timeout', function($rootScope, User, $timeout) { /** * Init and show the welcome tour. Note we do it listening to a $rootScope broadcasted 'userLoaded' message, @@ -130,26 +130,12 @@ angular.module('guideServices', []). if (!eggs) { eggs['Wolf'] = 1; // This is also set on the server } - $modal.open({ - templateUrl: 'modals/dropsEnabled.html' - }); - }); - - $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}); - $modal.open({ - templateUrl: 'modals/achievements/beastMaster.html' - }); - } + $rootScope.openModal('dropsEnabled'); }); $rootScope.$watch('user.flags.rebirthEnabled', function(after, before) { if (alreadyShown(before, after)) return; - $modal.open({ - templateUrl: 'modals/rebirthEnabled.html' - }); + $rootScope.openModal('rebirthEnabled'); }); From b89081dd413330f80fa0d468677e44bb8ee6b90e Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Tue, 4 Feb 2014 20:18:27 +0100 Subject: [PATCH 21/42] refactor(bs3): misc fixes --- views/options/inventory/inventory.jade | 2 +- views/options/social/chat-box.jade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/views/options/inventory/inventory.jade b/views/options/inventory/inventory.jade index 2fadfdb606..3c22068dc2 100644 --- a/views/options/inventory/inventory.jade +++ b/views/options/inventory/inventory.jade @@ -3,7 +3,7 @@ script(type='text/ng-template', id='partials/options.inventory.equipment.html') .span6.border-right h3.equipment-title=env.t('battleGear')   - i.icon-question-sign(popover-trigger='mouseenter', popover-placement='right', popover=env.t('battleGearText')) + .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]') diff --git a/views/options/social/chat-box.jade b/views/options/social/chat-box.jade index e2abc37737..3a135fc502 100644 --- a/views/options/social/chat-box.jade +++ b/views/options/social/chat-box.jade @@ -13,4 +13,4 @@ form.chat-form(ng-submit='postChat(group,message.content)') 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') + span.glyphicon.glyphicon-refresh.pull-right From 379da419825d60b9fdcae0ba3729b6dda4645f1e Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Tue, 4 Feb 2014 20:53:09 +0100 Subject: [PATCH 22/42] refactor(bs3): port notifications --- bower.json | 2 +- public/css/alerts.styl | 17 +++++++++++++- public/css/index.styl | 5 ----- public/js/controllers/notificationCtrl.js | 3 ++- public/js/services/notificationServices.js | 26 +++++++++++----------- 5 files changed, 32 insertions(+), 21 deletions(-) diff --git a/bower.json b/bower.json index feef1b4642..b3aa4eddab 100644 --- a/bower.json +++ b/bower.json @@ -28,7 +28,7 @@ "angular-bindonce": "~0.2.1", "bootstrap": "~3.1.0", "bootstrap-datepicker": "1.3.0", - "bootstrap-growl": "~1.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", diff --git a/public/css/alerts.styl b/public/css/alerts.styl index 4b765329b1..1893e93389 100644 --- a/public/css/alerts.styl +++ b/public/css/alerts.styl @@ -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 diff --git a/public/css/index.styl b/public/css/index.styl index 85f913b1f4..129b692a25 100644 --- a/public/css/index.styl +++ b/public/css/index.styl @@ -146,11 +146,6 @@ div.tooltip-inner { #reset-modal z-index:1500 -#notification-area - position: fixed - top: 0 - right: 0px - z-index: 1061 a cursor: pointer diff --git a/public/js/controllers/notificationCtrl.js b/public/js/controllers/notificationCtrl.js index d72a11546f..775ab060c7 100644 --- a/public/js/controllers/notificationCtrl.js +++ b/public/js/controllers/notificationCtrl.js @@ -128,7 +128,8 @@ habitrpg.controller('NotificationCtrl', $rootScope.openModal('questCompleted', 'InventoryCtrl'); }); - $rootScope.$watch('party.quest.key && !party.quest.active && !questHold && party.quest.members[user._id] == undefined', function(after, before){ + // 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'); }); diff --git a/public/js/services/notificationServices.js b/public/js/services/notificationServices.js index 7b4a48c817..1ce793794e 100644 --- a/public/js/services/notificationServices.js +++ b/public/js/services/notificationServices.js @@ -6,11 +6,11 @@ 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', 'error', 'success', 'gp', 'xp', 'hp', 'lvl', 'death', 'mp', 'crit') top_offset: 20, align: 'right', //('left', 'right', or 'center') width: 250, //(integer, or 'auto') - delay: 7000, + delay: 700000000, allow_dismiss: true, stackup_spacing: 10 // spacing between consecutive stacecked growls. }); @@ -25,11 +25,11 @@ angular.module("notificationServices", []) gold = Math.floor(absolute); silver = Math.floor((absolute - gold) * 100); if (gold && silver > 0) { - return "" + gold + " " + silver + " "; + return "" + gold + " " + silver + " "; } else if (gold > 0) { - return "" + gold + " "; + return "" + gold + " "; } else if (silver > 0) { - return "" + silver + " "; + return "" + silver + " "; } }; @@ -45,11 +45,11 @@ angular.module("notificationServices", []) coins: coins, hp: function(val) { // don't show notifications if user dead - growl(" " + sign(val) + " " + round(val) + " HP", 'hp'); + growl("  " + sign(val) + " " + round(val) + " HP", 'hp'); }, exp: function(val) { if (val < -50) return; // don't show when they level up (resetting their exp) - growl(" " + sign(val) + " " + round(val) + " XP", 'xp'); + growl("  " + sign(val) + " " + round(val) + " 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(' Level Up!', 'lvl'); + growl('  Level Up!', 'lvl'); }, death: function(){ - growl(" Respawn!", "death"); + growl("  Respawn!", "death"); }, error: function(error){ - growl(" " + error, "error"); + growl("  " + error, "error"); }, mp: function(val) { - growl(" " + sign(val) + " " + round(val) + " MP", 'mp'); + growl("  " + sign(val) + " " + round(val) + " MP", 'mp'); }, crit: function(val) { - growl(" Critical Hit! Bonus: " + Math.round(val) + "%", 'crit'); + growl("  Critical Hit! Bonus: " + Math.round(val) + "%", 'crit'); }, drop: function(val) { - growl(" " + val, 'drop'); + growl("  " + val, 'drop'); } }; } From c663221229c8fb55a4a2632605613a11aa7b91b1 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Tue, 4 Feb 2014 21:27:05 +0100 Subject: [PATCH 23/42] refactor(bs3): misc fixes, use bootstrap own grid for tasks lists --- public/css/index.styl | 1 - public/css/responsive.styl | 61 ------ public/css/tasks.styl | 6 + public/js/services/notificationServices.js | 2 +- views/main/filters.jade | 56 +++--- views/shared/tasks/lists.jade | 215 +++++++++++---------- 6 files changed, 144 insertions(+), 197 deletions(-) delete mode 100644 public/css/responsive.styl diff --git a/public/css/index.styl b/public/css/index.styl index 129b692a25..e79adff584 100644 --- a/public/css/index.styl +++ b/public/css/index.styl @@ -17,7 +17,6 @@ @import "./inventory.styl" @import "./alerts.styl" @import "./helpers.styl" -@import "./responsive.styl" @import "./header.styl" @import "./filters.styl" @import "./scrollbars.styl" diff --git a/public/css/responsive.styl b/public/css/responsive.styl deleted file mode 100644 index c7200751f8..0000000000 --- a/public/css/responsive.styl +++ /dev/null @@ -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 \ No newline at end of file diff --git a/public/css/tasks.styl b/public/css/tasks.styl index 22a460525d..963a425ea4 100644 --- a/public/css/tasks.styl +++ b/public/css/tasks.styl @@ -38,6 +38,12 @@ for $stage in $stages // 2. Columns & Tasks // =================== +.tasks-lists + .col-md-3 + padding-left: 10px // Override Bootstrap 15px padding + padding-right: 10px // Override Bootstrap 15px padding + margin-bottom: 15px + // main columns // ------------ .task-column diff --git a/public/js/services/notificationServices.js b/public/js/services/notificationServices.js index 1ce793794e..991145f971 100644 --- a/public/js/services/notificationServices.js +++ b/public/js/services/notificationServices.js @@ -10,7 +10,7 @@ angular.module("notificationServices", []) top_offset: 20, align: 'right', //('left', 'right', or 'center') width: 250, //(integer, or 'auto') - delay: 700000000, + delay: 7000, allow_dismiss: true, stackup_spacing: 10 // spacing between consecutive stacecked growls. }); diff --git a/views/main/filters.jade b/views/main/filters.jade index 1d8c262c86..ba20fcc753 100644 --- a/views/main/filters.jade +++ b/views/main/filters.jade @@ -1,27 +1,29 @@ -.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 - a(rel='tooltip', title=env.t('clearFilters'), ng-click='user.filters = {}') - span.glyphicon.glyphicon-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 + a(rel='tooltip', title=env.t('clearFilters'), ng-click='user.filters = {}') + span.glyphicon.glyphicon-remove-sign diff --git a/views/shared/tasks/lists.jade b/views/shared/tasks/lists.jade index 752cb4b9cf..b9a767ea41 100644 --- a/views/shared/tasks/lists.jade +++ b/views/shared/tasks/lists.jade @@ -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(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')) - 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 - // + // 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 + // - // 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 - 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}} + // 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 - 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}} + // 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 - 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}} + // 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') - 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') + // 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') \ No newline at end of file + // 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') \ No newline at end of file From d711d61a1fd5918be30c41ee2ceb1fea56a49a6b Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Tue, 4 Feb 2014 21:53:23 +0100 Subject: [PATCH 24/42] refactor(bs3): re-enable two columns views for tablets --- public/css/tasks.styl | 18 ++++++++++++++---- views/shared/tasks/lists.jade | 2 +- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/public/css/tasks.styl b/public/css/tasks.styl index 963a425ea4..bde1603316 100644 --- a/public/css/tasks.styl +++ b/public/css/tasks.styl @@ -39,10 +39,15 @@ for $stage in $stages // =================== .tasks-lists - .col-md-3 - padding-left: 10px // Override Bootstrap 15px padding - padding-right: 10px // Override Bootstrap 15px padding - margin-bottom: 15px + + .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 // ------------ @@ -56,6 +61,11 @@ for $stage in $stages margin: 0 0 0.5em padding: 0 +// 50% width columns with scrollbars +@media (max-width: 960px) + .task-column + max-height: 18.6em + overflow-y: scroll // add new task form // ----------------- diff --git a/views/shared/tasks/lists.jade b/views/shared/tasks/lists.jade index b9a767ea41..be5f5d1d0f 100644 --- a/views/shared/tasks/lists.jade +++ b/views/shared/tasks/lists.jade @@ -4,7 +4,7 @@ script(id='templates/habitrpg-tasks.html', type="text/ng-template") .tasks-lists.container-fluid .row - .col-md-3(bindonce='lists', ng-repeat='list in lists', bo-class='{"rewards-module": list.type==="reward"}') + .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 From ccc1230828337c6c44c9ebe23dac6c92291b9b4d Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Tue, 4 Feb 2014 22:21:12 +0100 Subject: [PATCH 25/42] refactor(bs3): misc --- public/css/tasks.styl | 4 ++-- public/js/controllers/authCtrl.js | 10 ++++++---- views/shared/footer.jade | 10 +++++----- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/public/css/tasks.styl b/public/css/tasks.styl index bde1603316..35daa3e10a 100644 --- a/public/css/tasks.styl +++ b/public/css/tasks.styl @@ -61,8 +61,8 @@ for $stage in $stages margin: 0 0 0.5em padding: 0 -// 50% width columns with scrollbars -@media (max-width: 960px) +// 50% width columns with scrollbars for tablets +@media (min-width: 768px) and (max-width: 970px) .task-column max-height: 18.6em overflow-y: scroll diff --git a/public/js/controllers/authCtrl.js b/public/js/controllers/authCtrl.js index 9c65ee3541..1312b40d35 100644 --- a/public/js/controllers/authCtrl.js +++ b/public/js/controllers/authCtrl.js @@ -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; @@ -71,8 +71,10 @@ angular.module('authCtrl', []) if (User.authenticated()) { window.location.href = '/#/tasks'; } else { - // Using controller: 'AuthCtrl' it causes problems - $rootScope.openModal('login'); + $modal.open({ + templateUrl: 'modals/login.html' + // Using controller: 'AuthCtrl' it causes problems + }); } } diff --git a/views/shared/footer.jade b/views/shared/footer.jade index f5a1df5666..231ab211e0 100644 --- a/views/shared/footer.jade +++ b/views/shared/footer.jade @@ -1,14 +1,14 @@ footer.footer(ng-controller='FooterCtrl') .container .row - .col-md-3 + .col-sm-3 h4=env.t('footerMobile') 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') - .col-md-3 + .col-sm-3 h4=env.t('footerCompany') ul.list-unstyled.list-unstyled if (!env.isFrontPage) @@ -28,7 +28,7 @@ footer.footer(ng-controller='FooterCtrl') a(href='/static/privacy')=env.t('companyPrivacy') li a(href='/static/terms')=env.t('companyTerms') - .col-md-3 + .col-sm-3 h4=env.t('footerCommunity') ul.list-unstyled 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') - .col-md-3 + .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,7 +64,7 @@ footer.footer(ng-controller='FooterCtrl') tr td a.addthis_button_google_plusone(g:plusone:size='medium') - else + else if(!env.isFrontPage) h4 Debug ul.list-unstyled li From ce5edbee58376ab7376f231e7fb0100950d5e09c Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Wed, 5 Feb 2014 16:51:35 +0100 Subject: [PATCH 26/42] refactor(bs3): consistent style for modals --- public/css/index.styl | 70 +++++------ public/js/controllers/notificationCtrl.js | 2 +- public/js/controllers/rootCtrl.js | 4 +- views/shared/modals/achievements.jade | 10 +- views/shared/modals/buy-gems.jade | 4 +- views/shared/modals/classes.jade | 135 +++++++++++----------- views/shared/modals/death.jade | 25 ++-- views/shared/modals/drops.jade | 4 +- views/shared/modals/members.jade | 37 +++--- views/shared/modals/new-stuff.jade | 4 +- views/shared/modals/quests.jade | 8 +- views/shared/modals/rebirth.jade | 82 ++++++------- views/shared/modals/reroll.jade | 4 +- views/shared/modals/settings.jade | 73 ++++++------ 14 files changed, 237 insertions(+), 225 deletions(-) diff --git a/public/css/index.styl b/public/css/index.styl index e79adff584..4cc2e94b8d 100644 --- a/public/css/index.styl +++ b/public/css/index.styl @@ -51,27 +51,25 @@ hr -------------------------------------------------- */ /* 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; -} +.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; -} +div.tooltip-inner + max-width: 300px /* Customizations to make footer sticky */ /*html, body {height: 100%;}*/ @@ -79,11 +77,9 @@ div.tooltip-inner { z-index:-1 padding: 0 15px // Required by Bootstrap 3 when using .container-fluid -@media (max-width: 600px) { - #wrap { +@media (max-width: 600px) + #wrap margin-top: 0 - } -} /* Gems -------------------------------------------------- */ @@ -102,17 +98,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,6 +131,9 @@ div.tooltip-inner { overflow-y: auto max-height: 400px // Taken from Bootstrap 2.3.2 css, may need to change + h5 + font-weight: 700 + // notification-character used only by death modal's figure, move .death-modal // a .modal-body margin: 10px @@ -152,6 +151,9 @@ a a span.glyphicon color: #333 // Takes base color from bootstrap +.muted + color: #999 + .btn margin-right: 5px diff --git a/public/js/controllers/notificationCtrl.js b/public/js/controllers/notificationCtrl.js index 775ab060c7..8e568206e4 100644 --- a/public/js/controllers/notificationCtrl.js +++ b/public/js/controllers/notificationCtrl.js @@ -105,7 +105,7 @@ habitrpg.controller('NotificationCtrl', // Classes modal $rootScope.$watch('!user.flags.classSelected && user.stats.lvl >= 10', function(after, before){ if(after){ - $rootScope.openModal('chooseClass', 'UserCtrl'); + $rootScope.openModal('chooseClass', 'UserCtrl', undefined, false, 'static'); } }); diff --git a/public/js/controllers/rootCtrl.js b/public/js/controllers/rootCtrl.js index 7cdc782ea1..8bd97d6270 100644 --- a/public/js/controllers/rootCtrl.js +++ b/public/js/controllers/rootCtrl.js @@ -71,8 +71,8 @@ habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$ templateUrl: 'modals/' + template + '.html', controller: controller, // optional scope: scope, // optional - keyboard: keyboard, // optional - backdrop: backdrop // optional + keyboard: (keyboard === undefined ? true : keyboard), // optional + backdrop: (backdrop === undefined ? true : backdrop) // optional }); } diff --git a/views/shared/modals/achievements.jade b/views/shared/modals/achievements.jade index 6d1f1f4855..3693a22d43 100644 --- a/views/shared/modals/achievements.jade +++ b/views/shared/modals/achievements.jade @@ -1,7 +1,7 @@ // 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') @@ -11,7 +11,7 @@ script(id='modals/achievements/streak.html', type='text/ng-template') // Max Gear 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') @@ -21,7 +21,7 @@ script(id='modals/achievements/ultimateGear.html', type='text/ng-template') // Beast Master 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 @@ -33,7 +33,7 @@ script(id='modals/achievements/beastMaster.html', type='text/ng-template') // 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 @@ -45,7 +45,7 @@ script(id='modals/achievements/contributor.html', type='text/ng-template') //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}}"}) diff --git a/views/shared/modals/buy-gems.jade b/views/shared/modals/buy-gems.jade index 03a610de65..fface7fe89 100644 --- a/views/shared/modals/buy-gems.jade +++ b/views/shared/modals/buy-gems.jade @@ -19,12 +19,12 @@ script(id='modals/buyGems.html', type='text/ng-template') =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') p - small.muted(style='line-height:10px;')=env.t('payNote') + small.muted=env.t('payNote') div(ng-include="'partials/options.settings.subscription.html'") diff --git a/views/shared/modals/classes.jade b/views/shared/modals/classes.jade index 870ea0e93d..089eaf7e34 100644 --- a/views/shared/modals/classes.jade +++ b/views/shared/modals/classes.jade @@ -1,74 +1,75 @@ 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({}); $close()', popover-placement='top', popover-trigger='mouseenter', popover=env.t('optOutText'))=env.t('optOut') diff --git a/views/shared/modals/death.jade b/views/shared/modals/death.jade index 34f58cd776..4c756524d7 100644 --- a/views/shared/modals/death.jade +++ b/views/shared/modals/death.jade @@ -1,15 +1,16 @@ //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 - .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') + .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') diff --git a/views/shared/modals/drops.jade b/views/shared/modals/drops.jade index 9850d51252..a7904187a0 100644 --- a/views/shared/modals/drops.jade +++ b/views/shared/modals/drops.jade @@ -1,9 +1,9 @@ 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 diff --git a/views/shared/modals/members.jade b/views/shared/modals/members.jade index 964776aaad..da90f985d5 100644 --- a/views/shared/modals/members.jade +++ b/views/shared/modals/members.jade @@ -1,25 +1,26 @@ script(type='text/ng-template', id='modals/member.html') .modal-header(bindonce='profile') - h3 + h4 span {{profile.profile.name}} span(ng-if='profile.contributor.level') - {{contribText(profile.contributor, profile.backer)}} .modal-body(bindonce='profile') - .row-fluid - .span6 - 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;') - li {{profile._id}} - li(ng-show='profile.auth.timestamps.created')=env.t('memberSince') - | {{timestamp(profile.auth.timestamps.created)}} - - li(ng-show='profile.auth.timestamps.loggedin')=env.t('lastLoggedIn') - | {{timestamp(profile.auth.timestamps.loggedin)}} - - h3=env.t('stats') - .label.label-info {{ {warrior:'Warrior',wizard:'Mage',healer:'Healer',rogue:'Rogue'}[profile.stats.class] }} - include ../profiles/stats - .span6 - include ../header/avatar - h3 Achievements - include ../profiles/achievements + .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.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)}} - + li(ng-show='profile.auth.timestamps.loggedin')=env.t('lastLoggedIn') + | {{timestamp(profile.auth.timestamps.loggedin)}} - + h3=env.t('stats') + .label.label-info {{ {warrior:'Warrior',wizard:'Mage',healer:'Healer',rogue:'Rogue'}[profile.stats.class] }} + include ../profiles/stats + .col-md-6 + include ../header/avatar + h3 Achievements + include ../profiles/achievements .modal-footer button.btn.btn-default(ng-click='$close()')=env.t('ok') \ No newline at end of file diff --git a/views/shared/modals/new-stuff.jade b/views/shared/modals/new-stuff.jade index d8bbbaf918..083cd7eac0 100644 --- a/views/shared/modals/new-stuff.jade +++ b/views/shared/modals/new-stuff.jade @@ -1,7 +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. Follow our progress here, and please do chime in! @@ -14,7 +14,7 @@ script(type='text/ng-template', id='modals/mathUpdates.html') script(type='text/ng-template', id='modals/newStuff.html') .modal-header - h3 New Stuff! + h4 New Stuff! .modal-body.new-stuff-modal table tr diff --git a/views/shared/modals/quests.jade b/views/shared/modals/quests.jade index 0efc6be7f3..a7e2e5e451 100644 --- a/views/shared/modals/quests.jade +++ b/views/shared/modals/quests.jade @@ -13,7 +13,7 @@ script(id='partials/options.social.party.quest-rewards.html', type='text/ng-temp 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}} @@ -23,7 +23,7 @@ script(type='text/ng-template', id='modals/questCompleted.html') 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') @@ -38,7 +38,7 @@ script(type='text/ng-template', id='modals/showQuest.html') 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') @@ -49,7 +49,7 @@ script(type='text/ng-template', id='modals/buyQuest.html') 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') diff --git a/views/shared/modals/rebirth.jade b/views/shared/modals/rebirth.jade index 270533dbec..4eeb07f7df 100644 --- a/views/shared/modals/rebirth.jade +++ b/views/shared/modals/rebirth.jade @@ -1,46 +1,46 @@ // Created by Sabe on 12/22/13. script(type='text/ng-template', id='modals/rebirthEnabled.html') - .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='$close()')=env.t('close') + .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') script(type='text/ng-template', id='modals/rebirth.html') - .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='$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  - =env.t('gems') + .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  + =env.t('gems') diff --git a/views/shared/modals/reroll.jade b/views/shared/modals/reroll.jade index 2840418ade..f01d53e4ea 100644 --- a/views/shared/modals/reroll.jade +++ b/views/shared/modals/reroll.jade @@ -1,13 +1,13 @@ // Re-Roll modal 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='$close()')=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='openModal("buyGems")')=env.t('buyMoreGems') span.gem-cost=env.t('notEnoughGems') diff --git a/views/shared/modals/settings.jade b/views/shared/modals/settings.jade index 644c0a60e3..149d39d6cf 100644 --- a/views/shared/modals/settings.jade +++ b/views/shared/modals/settings.jade @@ -1,6 +1,6 @@ script(type='text/ng-template', id='modals/reset.html') .modal-header - h3=env.t('resetAccount') + h4=env.t('resetAccount') .modal-body p=env.t('resetText1') p=env.t('resetText2') @@ -10,49 +10,56 @@ script(type='text/ng-template', id='modals/reset.html') script(type='text/ng-template', id='modals/restore.html') .modal-header - h3=env.t('fixValues') + h4=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='$parent.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='$parent.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='$parent.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='$parent.restoreValues.stats.mp') - span.input-suffix=env.t('mana') - .option-group.option-medium - input.option-content(type='number', data-for='stats.lvl', ng-model='$parent.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='$parent.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') + 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') script(type='text/ng-template', id='modals/delete.html') .modal-header - h3=env.t('deleteAccount') + h4=env.t('deleteAccount') .modal-body p!=env.t('deleteText') - p - input(type='text', ng-model='_deleteAccount') + 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') From 5d4d82ad51ab1d416fe78cf60e83b48c27e22e71 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Wed, 5 Feb 2014 19:05:42 +0100 Subject: [PATCH 27/42] refactor(bs3): port options (profile, inventory, social (groups and hall)) and misc --- public/css/game-pane.styl | 15 +- public/css/index.styl | 16 +- public/css/tasks.styl | 6 - public/js/services/notificationServices.js | 4 +- views/options/index.jade | 57 ++-- views/options/inventory/inventory.jade | 264 ++++++++--------- views/options/inventory/stable.jade | 158 +++++----- views/options/profile.jade | 206 ++++++------- views/options/social/chat-box.jade | 28 +- views/options/social/chat-message.jade | 6 +- views/options/social/create-group.jade | 48 ++-- views/options/social/group.jade | 317 +++++++++++---------- views/options/social/hall.jade | 116 ++++---- views/options/social/index.jade | 5 +- views/options/social/tavern.jade | 244 ++++++++-------- views/shared/profiles/achievements.jade | 245 ++++++++-------- views/shared/tasks/task.jade | 4 +- 17 files changed, 865 insertions(+), 874 deletions(-) diff --git a/public/css/game-pane.styl b/public/css/game-pane.styl index 346e86f44c..b345f20a99 100644 --- a/public/css/game-pane.styl +++ b/public/css/game-pane.styl @@ -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 diff --git a/public/css/index.styl b/public/css/index.styl index 4cc2e94b8d..f0ae049a29 100644 --- a/public/css/index.styl +++ b/public/css/index.styl @@ -67,10 +67,6 @@ hr display: inline margin-right: 10px -/* Bootstrap overrides */ -div.tooltip-inner - max-width: 300px - /* Customizations to make footer sticky */ /*html, body {height: 100%;}*/ #wrap @@ -151,6 +147,9 @@ a a span.glyphicon color: #333 // Takes base color from bootstrap +a.label + color: #fff + .muted color: #999 @@ -165,15 +164,6 @@ a span.glyphicon 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 diff --git a/public/css/tasks.styl b/public/css/tasks.styl index 35daa3e10a..5175732a56 100644 --- a/public/css/tasks.styl +++ b/public/css/tasks.styl @@ -33,8 +33,6 @@ for $stage in $stages .reward background-color: white - - // 2. Columns & Tasks // =================== @@ -145,10 +143,6 @@ 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 diff --git a/public/js/services/notificationServices.js b/public/js/services/notificationServices.js index 991145f971..3b6cb82284 100644 --- a/public/js/services/notificationServices.js +++ b/public/js/services/notificationServices.js @@ -6,7 +6,7 @@ angular.module("notificationServices", []) function growl(html, type) { $.bootstrapGrowl(html, { ele: '#notification-area', - type: type || 'warning', //('info', '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') @@ -64,7 +64,7 @@ angular.module("notificationServices", []) growl("  Respawn!", "death"); }, error: function(error){ - growl("  " + error, "error"); + growl("  " + error, "danger"); }, mp: function(val) { growl("  " + sign(val) + " " + round(val) + " MP", 'mp'); diff --git a/views/options/index.jade b/views/options/index.jade index 9ea9ad4fe2..421f0adfe9 100644 --- a/views/options/index.jade +++ b/views/options/index.jade @@ -4,33 +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') - span.glyphicon.glyphicon-user - |   - =env.t('profile') - li(ng-class="{ active: $state.includes('options.social') }") - a(ui-sref='options.social') - span.glyphicon.glyphicon-heart - |   - =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 - |   - =env.t('inventory') - li(ng-class="{ active: $state.includes('options.settings') }") - a(ui-sref='options.settings') - span.glyphicon.glyphicon-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 + |   + =env.t('profile') + li(ng-class="{ active: $state.includes('options.social') }") + a(ui-sref='options.social') + span.glyphicon.glyphicon-heart + |   + =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 + |   + =env.t('inventory') + li(ng-class="{ active: $state.includes('options.settings') }") + a(ui-sref='options.settings') + span.glyphicon.glyphicon-wrench + |   + =env.t('settings') - .tab-content - .tab-pane.active - div(ui-view) + .tab-content + .tab-pane.active + div(ui-view) diff --git a/views/options/inventory/inventory.jade b/views/options/inventory/inventory.jade index 3c22068dc2..8e2237857f 100644 --- a/views/options/inventory/inventory.jade +++ b/views/options/inventory/inventory.jade @@ -1,146 +1,148 @@ script(type='text/ng-template', id='partials/options.inventory.equipment.html') - .row-fluid - .span6.border-right - h3.equipment-title=env.t('battleGear') -   - .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}') - .span6 - h3.equipment-title=env.t('costume') -   - 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') +   + .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') +   + 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') + ' ' + env.t('scrollsText2') + '' - 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}} - - .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') + ' ' + env.t('scrollsText2') + '' - 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 - 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 + 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}} + + .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') + ' ' + env.t('scrollsText2') + '' + 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 diff --git a/views/options/inventory/stable.jade b/views/options/inventory/stable.jade index d85fc484fc..d9e1ce8130 100644 --- a/views/options/inventory/stable.jade +++ b/views/options/inventory/stable.jade @@ -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') + ' ' - | - =env.t('mattBochText2') - | - = ' ' + 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') + ' ' + | + =env.t('mattBochText2') + | + = ' ' + 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]', 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 - 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}} diff --git a/views/options/profile.jade b/views/options/profile.jade index e72ef230a9..831796b3f5 100644 --- a/views/options/profile.jade +++ b/views/options/profile.jade @@ -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 / @@ -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') + ' ' - .span4 + .col-md-4 h3=env.t('bodyHead') small | 2 / @@ -77,7 +77,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') + ' ' - .span4 + .col-md-4 h3=env.t('bodySkin') small | 2 / @@ -105,109 +105,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] }}  - a.btn.btn-danger.btn-mini(ng-click='changeClass(null)')=env.t('changeClass') - small 3 - table.table.table-striped - tr - td - strong - {{user.stats.points}}  - =env.t('unallocated') -   - 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') -   - 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') + .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] }}  + a.btn.btn-danger.btn-mini(ng-click='changeClass(null)')=env.t('changeClass') + small 3 + table.table.table-striped + tr + td + strong + {{user.stats.points}}  + =env.t('unallocated') +   + 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')   - 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') -   - 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') -   - 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 -   - =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') +   + 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') +   + 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') +   + 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 +   + =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') -  - =env.t('none') - |  - + .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') -  + =env.t('none') + |  - - h4=env.t('displayPhoto') - img(ng-show='profile.profile.imageUrl', ng-src='{{profile.profile.imageUrl}}') - span.muted(ng-hide='profile.profile.imageUrl') -  - =env.t('none') - |  - + h4=env.t('displayPhoto') + img(ng-show='profile.profile.imageUrl', ng-src='{{profile.profile.imageUrl}}') + span.muted(ng-hide='profile.profile.imageUrl') -  + =env.t('none') + |  - - h4=env.t('displayBlurb') - markdown(ng-show='profile.profile.blurb', ng-model='profile.profile.blurb') - span.muted(ng-hide='profile.profile.blurb') -  - =env.t('none') - |  - - //{{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') -  + =env.t('none') + |  - + //{{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 diff --git a/views/options/social/chat-box.jade b/views/options/social/chat-box.jade index 3a135fc502..77e8f5470d 100644 --- a/views/options/social/chat-box.jade +++ b/views/options/social/chat-box.jade @@ -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')) - span.glyphicon.glyphicon-refresh.pull-right + 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 \ No newline at end of file diff --git a/views/options/social/chat-message.jade b/views/options/social/chat-message.jade index bf8e731a66..5d48818b8c 100644 --- a/views/options/social/chat-message.jade +++ b/views/options/social/chat-message.jade @@ -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}}  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') span.glyphicon.glyphicon-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)') + 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}}  diff --git a/views/options/social/create-group.jade b/views/options/social/create-group.jade index edf985d1a4..53c8879a02 100644 --- a/views/options/social/create-group.jade +++ b/views/options/social/create-group.jade @@ -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}}  - =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}}  + =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')) diff --git a/views/options/social/group.jade b/views/options/social/group.jade index caa9d3469e..44c33c4da9 100644 --- a/views/options/social/group.jade +++ b/views/options/social/group.jade @@ -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 + // ------ 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='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 - 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)}}%;') + 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.progress.hp | number:0}} / {{Content.quests[group.quest.key].boss.hp}} + | {{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') + ':' + 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.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='(k,v) in group.members', ng-show='group.quest.members[v._id]') + td {{v.profile.name}} + quest-rewards(key='{{group.quest.key}}') - div(ng-bind-html='Content.quests[group.quest.key].notes') + 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 + |{{group.memberCount - group.members.length}} + = ' ' + env.t('moreMembers') + | + + 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') +   + 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)') - 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 - |{{group.memberCount - group.members.length}} - = ' ' + env.t('moreMembers') - | - - 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)') - span.glyphicon.glyphicon-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 diff --git a/views/options/social/hall.jade b/views/options/social/hall.jade index f494892d2c..2a648ee94c 100644 --- a/views/options/social/hall.jade +++ b/views/options/social/hall.jade @@ -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}}  - 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') + 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}}  + 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}} diff --git a/views/options/social/index.jade b/views/options/social/index.jade index 4fbb2a03b0..3f3303b0d3 100644 --- a/views/options/social/index.jade +++ b/views/options/social/index.jade @@ -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 diff --git a/views/options/social/tavern.jade b/views/options/social/tavern.jade index 349065f739..13d67e04a9 100644 --- a/views/options/social/tavern.jade +++ b/views/options/social/tavern.jade @@ -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:Looking_for_a_Group_(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:Looking_for_a_Group_(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') - // 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 - | - =env.t('visitHeroes') - |
    - | - =env.t('conLearn') - |
    - | - =env.t('conLearnHow') - | - table.table.table-striped - tr - td - a.label.label-contributor-1(ng-click='toggleUserTier($event)')=env.t('friendBadge') - 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('eliteBadge') - 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('championBadge') - 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('legendaryBadge') - div(style='display:none;') - p - !=env.t('legSeventh') - tr - td - a.label.label-contributor-8(ng-click='toggleUserTier($event)')=env.t('heroicBadge') - 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 + | + =env.t('visitHeroes') + |
    + | + =env.t('conLearn') + |
    + | + =env.t('conLearnHow') + | + table.table.table-striped + tr + td + a.label.label-contributor-1(ng-click='toggleUserTier($event)')=env.t('friendBadge') + 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('eliteBadge') + 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('championBadge') + 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('legendaryBadge') + div(style='display:none;') + p + !=env.t('legSeventh') + tr + td + a.label.label-contributor-8(ng-click='toggleUserTier($event)')=env.t('heroicBadge') + 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') + ' ' + env.t('tavernAlert2') + '.' - 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') + ' ' + env.t('tavernAlert2') + '.' + ul.list-unstyled.tavern-chat + include ./chat-message diff --git a/views/shared/profiles/achievements.jade b/views/shared/profiles/achievements.jade index 2ef6789a86..64cb816b10 100644 --- a/views/shared/profiles/achievements.jade +++ b/views/shared/profiles/achievements.jade @@ -1,133 +1,132 @@ -.achievements-container - //
    - //
    - //
    - //
    - //
    - //
    - //
    - //
    - //
    - //
    - //
    - //
    +//
    +//
    +//
    +//
    +//
    +//
    +//
    +//
    +//
    +//
    +//
    +//
    - 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 diff --git a/views/shared/tasks/task.jade b/views/shared/tasks/task.jade index 7fbf934489..633eb414bc 100644 --- a/views/shared/tasks/task.jade +++ b/views/shared/tasks/task.jade @@ -3,12 +3,12 @@ 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-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 + |   span(ng-show='task.streak') {{task.streak}} span(tooltip=env.t('streakCounter')) - |   span.glyphicon.glyphicon-forward |   From 0cc31465ed437329f839804f5700019b6afd81eb Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Wed, 5 Feb 2014 19:39:26 +0100 Subject: [PATCH 28/42] refactor(bs3): challenges --- public/css/challenges.styl | 10 +- views/options/social/challenge-box.jade | 8 +- views/options/social/challenges.jade | 219 +++++++++++++----------- 3 files changed, 120 insertions(+), 117 deletions(-) diff --git a/public/css/challenges.styl b/public/css/challenges.styl index 98d12edb17..d3a39eaca1 100644 --- a/public/css/challenges.styl +++ b/public/css/challenges.styl @@ -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; \ No newline at end of file + margin-top: 0px; \ No newline at end of file diff --git a/views/options/social/challenge-box.jade b/views/options/social/challenge-box.jade index 683d5ba829..2dae335b30 100644 --- a/views/options/social/challenge-box.jade +++ b/views/options/social/challenge-box.jade @@ -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') span.glyphicon.glyphicon-question-sign - .modal-body(bindonce='group.challenges') + .panel-body(bindonce='group.challenges') div(ng-if='group.challenges.length > 0') table.table.table-striped tr(ng-repeat='challenge in group.challenges') diff --git a/views/options/social/challenges.jade b/views/options/social/challenges.jade index 37b31ff9f4..e361f11493 100644 --- a/views/options/social/challenges.jade +++ b/views/options/social/challenges.jade @@ -9,32 +9,34 @@ 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') @@ -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') - span.glyphicon.glyphicon-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 - span.glyphicon.glyphicon-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)') - 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}} - .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) From 5b9bbb9729acccd9ac64b6897e4a37c7bd84477f Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Wed, 5 Feb 2014 19:54:50 +0100 Subject: [PATCH 29/42] refactor(bs3): settings --- views/options/settings.jade | 184 ++++++++++++++++++------------------ 1 file changed, 94 insertions(+), 90 deletions(-) diff --git a/views/options/settings.jade b/views/options/settings.jade index c6e6fc88aa..8499188cb4 100644 --- a/views/options/settings.jade +++ b/views/options/settings.jade @@ -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') -   - span.glyphicon.glyphicon-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') -   - span.glyphicon.glyphicon-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') -   - span.glyphicon.glyphicon-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') -   - span.glyphicon.glyphicon-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') -   - span.glyphicon.glyphicon-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='openRestoreModal()', 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') +   + 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') +   + 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') +   + 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') +   + 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') +   + 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='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') + //- 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 From 3d1ee318566d44095ae2dfce14a95c7d4c3faf4e Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Wed, 5 Feb 2014 20:19:09 +0100 Subject: [PATCH 30/42] refactor(bs3): remove unused bootstrap-datepicker from bower --- bower.json | 1 - 1 file changed, 1 deletion(-) diff --git a/bower.json b/bower.json index b3aa4eddab..9958494676 100644 --- a/bower.json +++ b/bower.json @@ -27,7 +27,6 @@ "angular-loading-bar": "~0.3.0", "angular-bindonce": "~0.2.1", "bootstrap": "~3.1.0", - "bootstrap-datepicker": "1.3.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", From 4ce2dfd60da67944a3d437a40b2222df4b1eb97e Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Wed, 5 Feb 2014 20:23:10 +0100 Subject: [PATCH 31/42] refactor(bs3): remove unused bootstrap-datepicker from bower --- public/css/index.styl | 1 - 1 file changed, 1 deletion(-) diff --git a/public/css/index.styl b/public/css/index.styl index f0ae049a29..89f7b90743 100644 --- a/public/css/index.styl +++ b/public/css/index.styl @@ -3,7 +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/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" From d6b3279e5c64f52822b695626140a2cf56684ef3 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Thu, 6 Feb 2014 18:35:12 +0100 Subject: [PATCH 32/42] refactor(bs3): misc fixes --- public/css/footer.styl | 1 + public/css/index.styl | 28 ++-------------------------- public/css/tasks.styl | 4 +--- public/js/controllers/groupsCtrl.js | 4 ++-- 4 files changed, 6 insertions(+), 31 deletions(-) diff --git a/public/css/footer.styl b/public/css/footer.styl index 31cddc1e2e..ad03be3f23 100644 --- a/public/css/footer.styl +++ b/public/css/footer.styl @@ -4,5 +4,6 @@ .footer padding-top: 20px margin-top: 40px + padding-bottom: 20px border-top: 1px solid #e5e5e5 background-color: #f5f5f5 \ No newline at end of file diff --git a/public/css/index.styl b/public/css/index.styl index 89f7b90743..edfc5ed750 100644 --- a/public/css/index.styl +++ b/public/css/index.styl @@ -25,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 @@ -45,29 +42,8 @@ hr 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 - /* Customizations to make footer sticky */ -/*html, body {height: 100%;}*/ + #wrap z-index:-1 padding: 0 15px // Required by Bootstrap 3 when using .container-fluid diff --git a/public/css/tasks.styl b/public/css/tasks.styl index 5175732a56..ed44a187ad 100644 --- a/public/css/tasks.styl +++ b/public/css/tasks.styl @@ -147,11 +147,10 @@ for $stage in $stages 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 // ---------------------- @@ -310,7 +309,6 @@ form [class$="-options"] padding: 1em 1em 0 color: #333 - z-index: 0 position: relative //background-color: diff --git a/public/js/controllers/groupsCtrl.js b/public/js/controllers/groupsCtrl.js index 3b259c3019..9a97d9b1c3 100644 --- a/public/js/controllers/groupsCtrl.js +++ b/public/js/controllers/groupsCtrl.js @@ -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, From d313a4629901f277738393c3e8bb816795cad846 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Thu, 6 Feb 2014 18:46:43 +0100 Subject: [PATCH 33/42] refactor(bs3): push footer down --- public/css/index.styl | 5 +++++ views/index.jade | 31 +++++++++++++++---------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/public/css/index.styl b/public/css/index.styl index edfc5ed750..d15a95ff32 100644 --- a/public/css/index.styl +++ b/public/css/index.styl @@ -44,9 +44,14 @@ hr /* Customizations to make footer sticky */ +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 diff --git a/views/index.jade b/views/index.jade index 8cc51654a7..28aedc5728 100644 --- a/views/index.jade +++ b/views/index.jade @@ -24,23 +24,22 @@ html(ng-app="habitrpg", ng-controller="RootCtrl", ng-class='{"applying-action":a link(href='//fonts.googleapis.com/css?family=Lato:300,400,700,400italic,700italic', rel='stylesheet', type='text/css') - body(ng-cloak) - div(ng-controller='GroupsCtrl') - include ./shared/modals/index - include ./shared/header/header + body(ng-cloak, ng-controller='GroupsCtrl') + include ./shared/modals/index + include ./shared/header/header - include ./shared/tasks/lists - include ./main/index - include ./options/index + include ./shared/tasks/lists + include ./main/index + include ./options/index - #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 + #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) + .row + .col-md-12.exp-chart(ng-show='charts.exp') + #main(ui-view) - include ./shared/footer \ No newline at end of file + include ./shared/footer \ No newline at end of file From 5d0ef5542993aab4e1f5230f1603d6fdc5100435 Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Fri, 7 Feb 2014 13:43:41 -0700 Subject: [PATCH 34/42] chore(bailey): update with stability info & subscriber links --- views/shared/modals/new-stuff.jade | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/views/shared/modals/new-stuff.jade b/views/shared/modals/new-stuff.jade index 6edf896590..fc911dd637 100644 --- a/views/shared/modals/new-stuff.jade +++ b/views/shared/modals/new-stuff.jade @@ -31,7 +31,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 only 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 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 only 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. Subscribe now, 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 +45,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 progress here, but here are some workarounds for now: + ul + li Click slower. VersionError 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 From ef3e1396cb3f36e06ae18f64c60dad785c14f046 Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Fri, 7 Feb 2014 13:55:39 -0700 Subject: [PATCH 35/42] Revert "chore(bower): strange temporary fix. Can't remember where I picked this" This reverts commit 2d4d103ca6104d7d60ac355f42269db2b5a7db74. --- .bowerrc | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.bowerrc b/.bowerrc index 20772d5d24..9c9ea40600 100644 --- a/.bowerrc +++ b/.bowerrc @@ -1,8 +1,3 @@ { - "directory": "public/bower_components", - "storage": { - "packages": ".bower-cache", - "registry": ".bower-registry" - }, - "tmp": ".bower-tmp" + "directory": "public/bower_components" } \ No newline at end of file From e404f357056063c3671fe1832c000f630a31df83 Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Fri, 7 Feb 2014 14:17:48 -0700 Subject: [PATCH 36/42] Revert "chore(cluster): temporarily disable cluster (revert here)" This reverts commit e36d3264bed5a015888f834c967d92f953365e51. --- src/middleware.js | 14 ++++++++++++++ src/server.js | 17 ++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/middleware.js b/src/middleware.js index 311995fe3f..236b6807ff 100644 --- a/src/middleware.js +++ b/src/middleware.js @@ -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) diff --git a/src/server.js b/src/server.js index 3f2cb65f3e..c585c3a95f 100644 --- a/src/server.js +++ b/src/server.js @@ -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(require('os').cpus().length, 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; \ No newline at end of file + module.exports = server; +} From 00c8a7f757512ba09ad0fd52a3d7f2de1e491272 Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Fri, 7 Feb 2014 14:18:04 -0700 Subject: [PATCH 37/42] chore(cluster): max 2-core --- src/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server.js b/src/server.js index c585c3a95f..6cefab8db0 100644 --- a/src/server.js +++ b/src/server.js @@ -10,7 +10,7 @@ var isDev = nconf.get('NODE_ENV') === 'development'; if (cluster.isMaster && (isDev || isProd)) { // Fork workers. - _.times(require('os').cpus().length, function(){ + _.times(_.min([require('os').cpus().length,2]), function(){ cluster.fork(); }); From 25941623b19730204f09ef484b22bbd2ad658b49 Mon Sep 17 00:00:00 2001 From: deilann Date: Fri, 7 Feb 2014 17:44:56 -0800 Subject: [PATCH 38/42] putting in issue ticket correctly putting in issue ticket for "report a bug" --- views/options/social/tavern.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/options/social/tavern.jade b/views/options/social/tavern.jade index 1221da51b4..ac08376161 100644 --- a/views/options/social/tavern.jade +++ b/views/options/social/tavern.jade @@ -39,7 +39,7 @@ 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') + 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') From 37340d23180da02d3742dc9be40a5fb780ecb13b Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Fri, 7 Feb 2014 21:47:50 -0700 Subject: [PATCH 39/42] fix(mounts): fix pets & mounts css to position the user based on pet/mount equip --- public/css/avatar.styl | 31 ++++++++++--------------------- views/shared/header/avatar.jade | 2 +- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/public/css/avatar.styl b/public/css/avatar.styl index e0cb66bc2a..ddb676ef84 100644 --- a/public/css/avatar.styl +++ b/public/css/avatar.styl @@ -53,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%) @@ -65,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 @@ -87,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 diff --git a/views/shared/header/avatar.jade b/views/shared/header/avatar.jade index 9b368cfe09..cb4923357a 100644 --- a/views/shared/header/avatar.jade +++ b/views/shared/header/avatar.jade @@ -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="
    Level: {{profile.stats.lvl}}
    GP: {{profile.stats.gp | number:0}}
    {{count(profile.items.pets)}} / 90 Pets Found
    ") -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}}') From 5db96ebca2fbd5b64f49af03a5137ea80f6b1673 Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Fri, 7 Feb 2014 21:57:26 -0700 Subject: [PATCH 40/42] fix(bs3): port pet feeding bar --- views/options/inventory/stable.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/options/inventory/stable.jade b/views/options/inventory/stable.jade index d9e1ce8130..e38114cf7f 100644 --- a/views/options/inventory/stable.jade +++ b/views/options/inventory/stable.jade @@ -56,8 +56,8 @@ script(type='text/ng-template', id='partials/options.inventory.pets.html') 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}}%;") + .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)') From 8d03cfc6b59b82900badbc9b4397f079e11ee2e1 Mon Sep 17 00:00:00 2001 From: Lorian Date: Fri, 7 Feb 2014 21:08:13 -0800 Subject: [PATCH 41/42] Made incorrect username and password show the same error, for security purposes. --- src/controllers/auth.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/auth.js b/src/controllers/auth.js index 25bc4d78bb..47c3b19c24 100644 --- a/src/controllers/auth.js +++ b/src/controllers/auth.js @@ -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}); }); }); From 7fbd84afd943adfb84beb3af7cec6fbdcc3343fe Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Fri, 7 Feb 2014 22:20:26 -0700 Subject: [PATCH 42/42] chore(angular): upgrade 1.2.1 => 1.2.11 --- bower.json | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/bower.json b/bower.json index 9958494676..843fb7e786 100644 --- a/bower.json +++ b/bower.json @@ -17,9 +17,9 @@ "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": "~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", @@ -42,6 +42,9 @@ "ngInfiniteScroll": "~1.0.0" }, "devDependencies": { - "angular-mocks": "~1.2.1" + "angular-mocks": "~1.2.11" + }, + "resolutions": { + "angular": "~1.2.11" } }