From cea97e4da824e4121356d6e0c99e2c13ad4d8b59 Mon Sep 17 00:00:00 2001 From: Daniel Hammond Date: Sat, 28 Mar 2015 01:21:39 -0400 Subject: [PATCH] Documenting the (Bootstrap recommended!) wrapper workaround for tooltips on disabled elements. Added code to prevent user from posting blank messages by using meta-enter as a workaround. --- CHANGELOG.md | 615 +------------------- website/public/css/global-modules.styl | 25 +- website/public/js/controllers/groupsCtrl.js | 7 +- website/views/shared/modals/members.jade | 8 +- 4 files changed, 26 insertions(+), 629 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe6304f5f2..28685fe452 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,616 +1,3 @@ My app - Changelog -# (2015-03-24) - - -## Bug Fixes - -- **.task-filter:** force long words to wrap - ([9c2c08c0](watch/commits/9c2c08c03d8449db5e8b4474a4663e8011f3a6fd), - [#4308](watch/issues/4308)) -- **Bailey:** correct date - ([17138430](watch/commits/1713843067df6b40187755bc40c73da1ec6972e5)) -- **Gems:** Clarify badge count - ([f2c6c07f](watch/commits/f2c6c07ff87f9d90b710d64cb89dc150ecea8a4b)) -- **I18N:** - - Remove more hardcoded text - ([8cd1ea48](watch/commits/8cd1ea48dbc4eea07cd4822bd0743046cad00aba)) - - Remove hardcoded text - ([29f693cd](watch/commits/29f693cd246c20f0a85c644442566657e7a8fd93)) - - Translate TT in menu - ([506c396b](watch/commits/506c396baf0ee708026644ef49a2c52ec676f620)) - - Make Time Travel translatable - ([35b02cfd](watch/commits/35b02cfdd894a21f69175b81b5fefc74a0c35cda)) - - Translate Time Travelers - ([8d042745](watch/commits/8d042745bed9cff86b15987882f56a4a9214194f)) -- **NYE:** - - fix cards - ([ccfe4809](watch/commits/ccfe48099fda85f7af5c354533637c1c16b15b96)) - - Correct achievement badge - ([438516b2](watch/commits/438516b26f8d799de6401d359fc1d9f1c00614e4)) - - I18N for random text - ([e3572286](watch/commits/e35722865abad24f22bac9833a53f3bbd7d8e1ac)) - - I18N for random text - ([7a16c644](watch/commits/7a16c644c3b9946abffe3713178d60155af850e0)) - - t undefined - ([11beb14e](watch/commits/11beb14e1421e2376d22edcbed61b9272cf4bd60)) - - Card to self exploit - ([e7388822](watch/commits/e7388822f1d3c01350408778b4af6c33c49d7207)) - - I18N shop text - ([5623fb00](watch/commits/5623fb00780ec294b84ec04964254268a3bc8a06)) -- **analytics:** remove testing code - ([5de42b03](watch/commits/5de42b03c9b6500c26354e556c463becd58e2a93)) -- **auth:** - - upgrade facebook to Graph API 2, fixes #4832 - ([0c63f6cb](watch/commits/0c63f6cb7dbe741ffdbaef53a947c1ffb1138b0a)) - - search case-insensitive usernames when registering - ([c3bb42b1](watch/commits/c3bb42b1086fccfa955d87e9d37801eb979204da)) -- **avatar:** - - prevent avatar from obscuring name - ([8cf3cd66](watch/commits/8cf3cd66ccd35cf0171a08a696ff67b5243d4235)) - - Correct "Facial Hair" text - ([e4df3435](watch/commits/e4df3435e13690288c920236c039b70988bc24cf)) -- **avatar-sharing:** - - screw it, 1.3.3 backwards compat isn't working at the router level anyway. Besides, avatar sharing hasn't worked via addthis for a while, so we don't need this - ([a44e0f7c](watch/commits/a44e0f7c31dbb7f70c0a024a961ae10b7d5554e6)) - - angular@1.3.9 upgrade fixed the /#?memberId=x bug. Also, anon wasn't able to view avatar shares! - ([a053486f](watch/commits/a053486fcde200fb212e9863ffefe60f3a562600)) -- **avatar.styl:** improve label layout - ([0943a229](watch/commits/0943a229ec5cbb976e204ec7ec4641b138aea39b), - [#4349](watch/issues/4349)) -- **backgrounds:** Frigid, not Snowy, Peak - ([285ff622](watch/commits/285ff6228cd2b2b5d82a0f887b6ac3fc8530c1db)) -- **bailey:** mystery 3014 promo - ([bd5f8d79](watch/commits/bd5f8d79eaddcbcc42957f92c2e059da8b44979e)) -- **billing:** script to fix current_period_end, see #4420 - ([ca2d4511](watch/commits/ca2d45113c7f0d9ad5b59ac919355bb0d93737ef)) -- **cds:** max hour is 23 not 24 - ([193b92c1](watch/commits/193b92c16ba4a312d97194e7f2eba31a33acfd81)) -- **console:** remove console.log - ([c301bd3e](watch/commits/c301bd3e89e4fb0b02bc62b5b16356cf327f46c0)) -- **content:** Cannot call 'toString' of undefined - ([d5eb5bbf](watch/commits/d5eb5bbfe0416fbfa7270f371edc956c8c166c6b)) -- **date:** - - typo - ([756fa834](watch/commits/756fa83418e470578b0b43975a7c4e3d2e244284)) - - add YYYY/MM/DD format - ([cb13b5ac](watch/commits/cb13b5ac26c7bd43eb024679ca6083e328a2598c)) -- **db:** upgrade flags.recaptureEmailsPhase to new values - ([eb1ca43c](watch/commits/eb1ca43c44788ee8bf45d2bfe4f7874b0b24a213)) -- **emails:** - - send emails to new fb users - ([92a6af72](watch/commits/92a6af72cff29536985da2f3ef3f207d74842abb)) - - parse json - ([925bfe8a](watch/commits/925bfe8af44765ea05cef4a59a57b0eb88325c26)) - - remove unused variable - ([739d8885](watch/commits/739d8885a36057bbf2198e350d507e92f87503d4)) -- **event:** - - Card notif display - ([de21ec8c](watch/commits/de21ec8cf51c253a4eda21bf6fc70c64635d68f1)) - - Correct card notifs - ([37ae50a7](watch/commits/37ae50a77af4ca176d42a44efb3ae9b8c2109645)) - - Line breakage II - ([9a44ab76](watch/commits/9a44ab76ec3e093f093abee06475da998c8a23f0)) - - Line breakage II - ([281e3fdb](watch/commits/281e3fdbb54a1d1adb6709ca295a546153d6703b)) - - Line breakage - ([358b4213](watch/commits/358b42133080c897923043c899ad2ef4146fc8bd)) - - Localize poems - ([9fddb08a](watch/commits/9fddb08aebfca32deb9287a43fcc49fe32b5538b)) - - Valentine's strings - ([432eee75](watch/commits/432eee750f5bc31668a67b3b3b45b4f0fc3f5116)) - - Robes not for your head - ([7e0d8104](watch/commits/7e0d8104632539468d547aa1b9b66936088ddc92)) - - Party robes - ([51b2b9bd](watch/commits/51b2b9bda15b35eded359154888359396fb7f229)) - - Leave old achievement - ([efd1333c](watch/commits/efd1333c06bb5572147a8d10b9dba6f5fb9d1c7c)) - - Correct achievement award - ([a654d7ea](watch/commits/a654d7ea10748010885fdcf0f1845c63c985e6b9)) - - Robes shop icon - ([0cc819cc](watch/commits/0cc819cc646960e003ba182096aeeaafb6aa6618)) - - Mystery sprite error - ([37db763f](watch/commits/37db763fc28bc6db2b2dcb56eb2d18ede2f0c1b4)) - - Mystery typo - ([6c8f9e39](watch/commits/6c8f9e39b63d4a4475458b7a010b137fcb3820b5)) - - Better quest text placement - ([1b4843ff](watch/commits/1b4843ff586340abc51b3f45ccad0fe195fd6475)) - - quest syntax - ([f4c582eb](watch/commits/f4c582eb2475e6f1bb846aba44b3ad690c4fc0b7)) - - Better shop flow - ([1c908865](watch/commits/1c9088654881d91e3120dcc9729d6d0b2708db0b)) - - head, not helm - ([e62cb74a](watch/commits/e62cb74ad01cf7395b81abd2c3764548291a6455)) - - grunt - ([a4a94f79](watch/commits/a4a94f79734c136bdfd293d56c8a4dc473b93814)) - - Festify missed NPCs - ([d37dd904](watch/commits/d37dd90484c83200dd513f6596a8b78a3dd41919)) -- **flag-chat:** correct url for tavern flags - ([4c785e84](watch/commits/4c785e84590c2fa6d69e697e6240020152599346)) -- **flag-email:** correctly format date - ([635ebf62](watch/commits/635ebf626bdbef17531cd945726a9837457d598c)) -- **flag-message:** small refactor - ([948d5762](watch/commits/948d5762cd2c73179a77835bd22bb7fae76458d6)) -- **flags-emails:** - - allow arrays in FLAG_REPORT_EMAIL - ([9d22e65e](watch/commits/9d22e65e19ba63a5f91ae8cd03c2c1d3c655f552)) - - allow arrays in tnxEmails - ([065227fa](watch/commits/065227fa8c347d6a1643378edd9f1c29c33ccd6c)) -- **footerCtrl.js:** disable addThis hover - ([45d30ffe](watch/commits/45d30ffef56cdec74849448195e9cca02af58d7d)) -- **gem-cap:** use customerId in gem purchase - ([2018cc84](watch/commits/2018cc84ab9891d7ec32dd4dbae0cedfba7786b8)) -- **gifts:** - - $rootScope => Payments - ([3423e985](watch/commits/3423e9857d6a00f8305e7906f01ee5760650d8dc)) - - allow gifting 0local - ([5ec2c118](watch/commits/5ec2c118a5ab51b652915f1a9cfbe3c6ff98785d)) - - allow users to move from facebook=>local - ([a4c2bf61](watch/commits/a4c2bf61b26011765443c54481c065f475f675e4)) -- **flag-chat:** - - fetch author and add some group variables - ([2d4c5e7b](watch/commits/2d4c5e7b98152b215ac875acef919bc3ae3896de)) - - add some variables - ([7aff280a](watch/commits/7aff280a71b85d81daf47491cb4466e0f7c68879)) - - start implemnting email - ([652ce10e](watch/commits/652ce10e2246a7b7a9e699f9aa005999b40f69b4)) -- **flag-message:** - - add server methods - ([e84880d3](watch/commits/e84880d3e872e85af3e29e0a0381a6a4ad8b4551)) - - add server methods - ([ae6e0255](watch/commits/ae6e0255c69b4ecb60b0c3502840e875a9ff1085)) -- **gifts:** - - allow gifting subscriptions - ([5b01fff7](watch/commits/5b01fff70038886f470f2769235759ff29d7fcf5)) - - allow gifting gems from paypal/stripe - ([e8dbd5ca](watch/commits/e8dbd5ca1a89c45d1d63f2dfc714822bdc444a9d)) - - allow gifting from balance - ([7e9b92fc](watch/commits/7e9b92fcad3d2ad43da5395b34f580b8d961d648)) -- **google-discount:** add google discount - ([5fc001e4](watch/commits/5fc001e4f6bac35020dbe63667d034c2957a47d0)) -- **i18n:** - - add strings - ([09015370](watch/commits/09015370f0b9eef726ccf5dd3f695f2ea87d8f75)) - - add string - ([ff9280de](watch/commits/ff9280deea2326987c67c627cd622bf0925ca62a)) - - add string - ([bb855bf9](watch/commits/bb855bf9931dc127304e2c1e47394196fc25c937)) -- **iap:** ignore keys/ directory. upload any keys/iap-sandbox iap-live etc on a private branch - ([9d6caaa1](watch/commits/9d6caaa138d31d4c784737150ea313d68c69b745)) -- **interactive-tour:** disable ads till lvl 2 - ([d84549e2](watch/commits/d84549e2395046c4d94475778cf421eab0f720e5)) -- **loggly:** - - change tag based on base_url, logs internal server errors - ([dac2fc68](watch/commits/dac2fc682dfedbd9373b9d2695a857b1cf7afebb)) - - enable json loggin and start loggin errors during cron - ([8935538b](watch/commits/8935538b5351d8da9b0aee454b1444b63480932c)) - - add test log, use only in production and add sample config - ([af1ff6d7](watch/commits/af1ff6d74059e12683603ca89a55e5a12ff1a9e4)) - - add loggly - ([7356e0ba](watch/commits/7356e0bafeb3843d6c457c654abc7a68f999cf44)) -- **mystery:** - - Migration - ([55066480](watch/commits/55066480fb3685ae54ff637bfe470e1e257cdfa6)) - - February 2015 - ([d4f8acd0](watch/commits/d4f8acd0ef0879f0a0f459c0a79225b8e791313c)) - - January subscriber set - ([524761f1](watch/commits/524761f1cf4895b4a876ec696805c0f7c6998f21)) - - January subscriber set - ([e2f47651](watch/commits/e2f47651a4facc79afec1edfd8c2c76bafee1ed7)) -- **mystery items:** March subscriber sprites added - ([e918aa15](watch/commits/e918aa158d9d7835efcde86239919c7b830cda27)) -- **news:** - - Promo images - ([0ec9e5b1](watch/commits/0ec9e5b1e1edb86db3266e4cf633047d27d1dabf)) - - move old news to /static/old-news, better use of content space - ([66b4dae0](watch/commits/66b4dae0d98853edd67a117cc4a196f7bdce69f7)) -- **pie:** Add pie - ([1120d334](watch/commits/1120d334c31c8f3836d4a88b4e1a0a31cd2e48d1)) -- **plans:** - - time traveler - by full sets - ([bf7e1e66](watch/commits/bf7e1e66ed7ef4338d31807587ce6569eb06ef88)) - - add time traveler - buy individual mystery items - ([d81badde](watch/commits/d81badde69e5cd3c3b7ef4babc82337aec87c006)) - - add consecutive-month benefits for subscribers - ([76be625f](watch/commits/76be625f6dd86d82ad3a52fcf066c4670cd770ad)) - - cleanup plans' perks page, rename Time Trinket => Mystic Hourglass - ([8c5842eb](watch/commits/8c5842eb527632d2ffa30d2f01eb87ec09cf6609)) - - time travelers tab, 1 trinket to buy 1 set - ([0fffd665](watch/commits/0fffd66588e603513803967f1983797f530011a2)) - - allow block subscriptions from paypal/stripe - ([7f2b6b5c](watch/commits/7f2b6b5cfbff94dc7339126308428ee93e23e1a5)) - - consectuive-month subscription perks (gifting) - ([5fd805db](watch/commits/5fd805db881901df68b342fc66ec741bb85da581)) - - consecutive months & extra months (like a time-card) - ([57bfee02](watch/commits/57bfee02cf34b9b44f662f90328d2615cc8f4ebe)) -- **presskit:** add presskit page cc @lemoness - ([cba232ef](watch/commits/cba232ef83fb15c3fd74ed8eb535b5dc3d317bad)) -- **quest:** - - Bunny quest - ([4cb67835](watch/commits/4cb6783544b483865d008990e7e6f243e8339e52)) - - Pet Rocks - ([0608ac5c](watch/commits/0608ac5caa8e753ba4e9c3a92b5fb3c7424f4f30)) - - T-Rex pet - ([c260362d](watch/commits/c260362d96b629a47d0ce18bacfd7fcc9554b065)) - - T-Rex pet - ([0b63e48c](watch/commits/0b63e48c6e10478e1717f0ce132ceb0ade4ccb4d)) - - Implement Penguin pet quest - ([d25455fa](watch/commits/d25455fa5ad9f15815c3220f6bf292e868b57a00)) -- **quests:** - - Differentiated scrolls - ([41241750](watch/commits/412417505f2d84d049572a9bfc73d78c3f63c344)) - - Differentiated scrolls - ([2ca6636c](watch/commits/2ca6636c944c67f9e527d96cc41987dc83a718b2)) -- **seasonal:** - - Normal view - ([48246d6a](watch/commits/48246d6a7239687f3b44ad82c56aed8f6e625f4e)) - - Normal view - ([c9b81414](watch/commits/c9b81414a4079ee8a706d19971ac68e4aa26f856)) - - Implement Snowball - ([53fff0db](watch/commits/53fff0dbc61c2bb11bf21f1575c487ab05016214)) - - Implement snowball - ([f7d45c95](watch/commits/f7d45c951e24abf4cfe11804f8a53a85e31df573)) - - Seasonal Shop - ([a98a6859](watch/commits/a98a68597127f385c7729f25ff6f9f282ea20d0a)) - - Seasonal shop - ([c7ee171e](watch/commits/c7ee171ee415be5af0f090cffd8378f7890fea74)) -- **spring:** Fling - ([f3f5669a](watch/commits/f3f5669ab28e944e7c65deef256ac8248f98e4e5)) -- **subscriptions:** Show count of purchasable Gems - ([62e526f8](watch/commits/62e526f8dc7b490b969a7ee9afa2ddc9c41956b2)) -- **surveys:** - - Close out survey - ([7065b400](watch/commits/7065b400bc6c221641a57b8129f5ade5f9aded4c)) - - Survey achievement - ([9cfa27f0](watch/commits/9cfa27f08948a2b6b8773d6fa0d4d1bf0c36f9df)) -- **thanksgiving:** - - revert npcs back to normal - ([eb27a767](watch/commits/eb27a767093905ab045196f58c07389bf76eaf81)) - - add migration for turkey mounts / pets - ([a8cf1026](watch/commits/a8cf10261042a6925f4b4949313ba891a1ca5dd0)) -- **tour:** - - Early quit classes tour - ([18649144](watch/commits/18649144a8b47ac6822d19c40243b32566ceb573)) - - add the other tour entries @lemoness - ([1e8265a9](watch/commits/1e8265a9f13c364c7f2cdca1124cf2767c714926)) - - ESC to perma-close #4886 @lemoness @alys - ([cca2d81b](watch/commits/cca2d81bc3deb757d74c3ac3283ca45c52643034)) - - update habits step wording @lemoness - ([152853a8](watch/commits/152853a877afd1d59eb6e2c03f4a7c560f9a6283)) - - Refactor the Justin Guide to be much more streamlined and interactive. Backdrop focuses user on present task. Chapterized guides - ([812493fe](watch/commits/812493fec5c5a15db3c2411df0ad64b30c8ceba1)) -- **world-boss:** - - Desperation move - ([3ee965d8](watch/commits/3ee965d8d25e896b942d8e1bfda796e83a0b0540)) - - Desperation move - ([7925935f](watch/commits/7925935ff5de77699df31da6369a74a78ef9bcfe)) - - Healing on rage - ([480b4e27](watch/commits/480b4e276435c93fcef31248430dee4dc3d2d1c7)) - - Healing on rage - ([ad7c02d5](watch/commits/ad7c02d50d5a62570b7ecf356c93930a9047fb15)) +# (2015-03-28) diff --git a/website/public/css/global-modules.styl b/website/public/css/global-modules.styl index 45b0567d0a..e209b6406e 100644 --- a/website/public/css/global-modules.styl +++ b/website/public/css/global-modules.styl @@ -7,7 +7,7 @@ $clearfix // Text shadow mixin hrpg-text-shadow-mixin($hrpg-text-shadow-base-color) text-shadow: - -1px -1px 1px darken($hrpg-text-shadow-base-color,70%), + -1px -1px 1px darken($hrpg-text-shadow-base-color,70%), 1px -1px 1px darken($hrpg-text-shadow-base-color,70%), -1px 1px 1px darken($hrpg-text-shadow-base-color,70%), 1px 1px 1px darken($hrpg-text-shadow-base-color,70%); @@ -21,8 +21,8 @@ hrpg-button-color-mixin($hrpg-button-color) @media screen and (min-width:768px) &:hover background-color: darken($hrpg-button-color, 2.36%) !important - > a, > button, > input, textarea - color: darken($hrpg-button-color, 70%) !important + > a, > button, > input, textarea + color: darken($hrpg-button-color, 70%) !important border-color: darken($hrpg-button-color, 16.18%) !important > input, textarea &:hover @@ -43,7 +43,7 @@ hrpg-button-color-mixin($hrpg-button-color) @media screen and (min-width:768px) border:1px solid darken($hrpg-button-color, 16.18%) h4 - color: darken($hrpg-button-color, 61.8%) + color: darken($hrpg-button-color, 61.8%) background-color: $hrpg-button-color border-color: darken($hrpg-button-color, 16.18%) > ul:first-child:before, > div:first-child:before @@ -81,7 +81,7 @@ $hrpg-button-master .glyphicon position: relative top: 0.132em - > a, > button + > a, > button &:active background-color: #aaa !important $hrpg-button @@ -113,7 +113,7 @@ $hrpg-button-with-input height: auto input, textarea border: 1px solid #ccc - border-radius: 0.382em 0em 0em 0.382em !important + border-radius: 0.382em 0em 0em 0.382em !important padding-left: 0.618em background-color: #fff !important -webkit-appearance: none @@ -186,7 +186,7 @@ $hrpg-label > a color: #fff text-shadow: - -1px -1px 1px #333, + -1px -1px 1px #333, 1px -1px 1px #333, -1px 1px 1px #333, 1px 1px 1px #333; @@ -250,9 +250,9 @@ $hrpg-modal-dropdown z-index:2 width:16px height:16px - border-top-width: 1px + border-top-width: 1px border-top-style: solid - border-left-width: 1px + border-left-width: 1px border-left-style: solid transform: rotate(45deg) $hrpg-modal-dropdown-left @@ -270,7 +270,7 @@ $hrpg-modal-dropdown-right > ul:first-child:before, > div:first-child:before, h4:before left: 1em $hrpg-modal-controls - text-align: right + text-align: right border-radius:0px 0px 0.382em 0.382em background-color: #fff li @@ -317,6 +317,9 @@ hrpg-tag-color-mixin($hrpg-tag-color) background-color: darken($hrpg-tag-color,32.8%) &.active:hover > a:before border-right-color: darken($hrpg-tag-color,32.8%) +// Tooltips wrapper for disabled elements +.disabled-tooltip-wrapper + display: inline-block $hrpg-tag-master display: inline-block @@ -348,7 +351,7 @@ $hrpg-tag-master position: absolute top: 0 left: -1.5em - &:before + &:before width: 0; height: 0; border-top: 1em solid transparent diff --git a/website/public/js/controllers/groupsCtrl.js b/website/public/js/controllers/groupsCtrl.js index a87992f43d..a0e1331ac9 100644 --- a/website/public/js/controllers/groupsCtrl.js +++ b/website/public/js/controllers/groupsCtrl.js @@ -86,7 +86,7 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', ' }); }else{ $scope.removeMemberData = undefined; - } + } } $scope.openInviteModal = function(group){ @@ -118,7 +118,7 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', ' $rootScope.openModal('private-message',{controller:'MemberModalCtrl'}); }); } - + }]) .controller('InviteToGroupCtrl', ['$scope', 'User', 'Groups', 'injectedGroup', '$http', 'Notification', function($scope, User, Groups, injectedGroup, $http, Notification){ @@ -159,6 +159,9 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', ' $scope.profile = member; }); $scope.sendPrivateMessage = function(uuid, message){ + // Don't do anything if the user somehow gets here without a message. + if (!message) return; + $http.post('/api/v2/members/'+uuid+'/message',{message:message}).success(function(){ Notification.text(window.env.t('messageSentAlert')); $rootScope.User.sync(); diff --git a/website/views/shared/modals/members.jade b/website/views/shared/modals/members.jade index 4df7fedbef..e816af71ba 100644 --- a/website/views/shared/modals/members.jade +++ b/website/views/shared/modals/members.jade @@ -49,8 +49,12 @@ script(type='text/ng-template', id='modals/private-message.html') textarea.form-control(type='text',rows='5',ui-keydown='{"meta-enter":"sendPrivateMessage(profile._id, _message)"}',placeholder=env.t('needsTextPlaceholder'),ng-model='_message') .modal-footer //- Due to a quirk in Bootstrap UI, we need to wrap this so the tooltip can - //- appear when disabled. - div(style='display:inline-block',tooltip="{{_message ? '' : env.t('needsText')}}") + //- appear when the button is disabled. + // + //- Source: http://getbootstrap.com/javascript/#tooltips + // "Tooltips on disabled elements require wrapper elements" + // + .disabled-tooltip-wrapper(tooltip="{{_message ? '' : env.t('needsText')}}") button.btn.btn-primary(ng-disabled='!_message',ng-click='sendPrivateMessage(profile._id, _message)')=env.t("send") button.btn.btn-default(ng-click='$close()')=env.t('cancel')