From 3595a9d2c570c9b9bbf446e3e01b98b1195d5f8f Mon Sep 17 00:00:00 2001 From: Simon Grim Date: Fri, 4 Sep 2015 03:21:33 +0500 Subject: [PATCH] introduce #groupchat #UI --- css/profile.css | 56 +++--- css/style.css | 302 ++++++++++++++++++++----------- following.html | 166 ++++++++++++++--- home.html | 174 ++++++++++++++---- js/interface_common.js | 123 +++++++++++-- js/interface_localization.js | 221 +++++++++++++++++++++++ js/mobile_abstract.js | 61 ++++--- js/twister_directmsg.js | 310 ++++++++++++++++++++++++++++++-- js/twister_following.js | 2 +- js/twister_formatpost.js | 2 +- js/twister_newmsgs.js | 37 +++- theme_calm/css/profile.css | 61 ++++--- theme_calm/css/style.css | 333 ++++++++++++++++++++++------------- theme_nin/css/style.css | 170 ++++++++++++++++-- 14 files changed, 1622 insertions(+), 396 deletions(-) diff --git a/css/profile.css b/css/profile.css index f0c2b39..16906a4 100644 --- a/css/profile.css +++ b/css/profile.css @@ -58,34 +58,14 @@ color: #fff; } -.profile-card-buttons -{ - position: absolute; - bottom: 30px; - right: 0; +.profile-card-buttons { + padding: 4px 0; } -.profile-card-buttons .direct-messages-with-user, -.profile-card-buttons .mentions-from-user, -.profile-card-buttons .follow, -.profile-card-buttons .unfollow -{ - display: inline; - padding: 4px 12px; - font-size: 12px; - width: auto; - text-align: center; - color: rgba( 0, 0, 0, .7 ); - background: rgba( 0, 0, 0, .1 ); - border: none; - transition: all .2s linear; -} - -.profile-card-buttons .direct-messages-with-user:hover, -.profile-card-buttons .mentions-from-user:hover -{ - color: #fff; - background: #45474d; +.twister-user-info .profile-card-buttons { + position: absolute; + top: 0; + right: 0; } .profile-card.forEdition @@ -308,3 +288,27 @@ h1.profile-name { h2.profile-screen-name { display: block; } + +.group-messages-control .invite-form, .group-messages-control .secret-key { + display: none; + font-size: 12px; + text-align: center; + padding: 4px 0; +} + +.group-messages-control .invite-form input { + vertical-align: middle; + width: 73%; + margin: 0 4px; +} + +.group-messages-control .invite-form button { + color: #DDD; + background-color: #45474D; + border: medium none; + vertical-align: middle; +} + +.group-messages-control .invite-form button:hover { + color: #FFF; +} diff --git a/css/style.css b/css/style.css index 8a5b111..f9de08b 100644 --- a/css/style.css +++ b/css/style.css @@ -96,28 +96,24 @@ h3 ************** BUTTONS *************** **************************************/ -button -{ +button { + color: rgba(255, 255, 255, .8); background: #45474d; - color: rgba( 255, 255, 255, .8 ); border: none; padding: 5px 10px; cursor: pointer; } -button:hover -{ +button:hover { color: #fff; } -button.disabled -{ +button:disabled, button.disabled { opacity: .4; } -button.disabled:hover -{ - color: rgba( 255, 255, 255, .8 ); +button:disabled:hover, button.disabled:hover { + color: rgba(255, 255, 255, .8); } button.follow, button.unfollow, .following-list button.private { @@ -151,11 +147,32 @@ button.follow:hover, button.unfollow:hover, .following-list button.private:hover margin-right: 10px; } +.b-buttons { + text-align: right; + padding: 4px; +} + +.b-buttons button { + color: rgba(0, 0, 0, .7); + background-color: rgba(0, 0, 0, .08); + border: none; + font-size: 12px; + text-align: center; + width: auto; + padding: 4px 12px; + transition: all .1s linear; +} + +.b-buttons button:hover { + color: #FFF; + background: #45474D; +} + /************************************* -**************************** MENU ***** +**************** MENU **************** **************************************/ -.userMenu -{ + +.userMenu { width: 900px; position: fixed; left: 50%; @@ -164,12 +181,13 @@ button.follow:hover, button.unfollow:hover, .following-list button.private:hover background: #45474d; z-index: 2; } + .userMenu.w1200 { width: 1200px; margin-left: -600px; } -.userMenu:after -{ + +.userMenu:after { content: ""; position: absolute; right: 0; @@ -177,16 +195,14 @@ button.follow:hover, button.unfollow:hover, .following-list button.private:hover height: 54px; background: url(../img/twister_mini.png) no-repeat right 5px; } -.userMenu > ul -{ -} -.userMenu > ul > li -{ + +.userMenu > ul > li { float: left; + height: 40px; margin: 0; } -.userMenu > ul > li > a -{ + +.userMenu > ul > li > a { line-height: 40px; height: 40px; padding: 0 20px 0 45px; @@ -198,115 +214,89 @@ button.follow:hover, button.unfollow:hover, .following-list button.private:hover transition: all .2s linear; position: relative; } -.userMenu li > a:hover -{ + +.userMenu li:hover, .userMenu li:active { + background-color: rgba(0, 0, 0 , .4); +} + +.userMenu li:hover > a, .userMenu li:active > a { text-decoration: none; opacity: 1; } -.userMenu li.current > a -{ + +.userMenu li.current { + background-color: #B43E34; +} + +.userMenu li.current > a { color: #fff; opacity: 1; } -.userMenu li.userMenu-home > a -{ + +.userMenu li.userMenu-home > a { background: url(../img/home.png) no-repeat 5px center; } -.userMenu li.userMenu-home:hover > a -{ - background: url(../img/home.png) no-repeat 5px center rgba( 0, 0, 0 , .4 ); -} -.userMenu li.userMenu-home.current > a -{ - background: url(../img/home.png) no-repeat 5px center #b43e34; -} -.userMenu li.userMenu-connections > a -{ + +.userMenu li.userMenu-connections > a { background: url(../img/connections.png) no-repeat 5px center; - padding: 0 30px 0 20px; + padding: 0 24px; opacity: 1; } -.userMenu li.userMenu-connections:hover > a -{ - background: url(../img/connections.png) no-repeat 5px center rgba( 0, 0, 0 , .4 ); -} -.userMenu li.userMenu-connections.current > a -{ - background: url(../img/connections.png) no-repeat 5px center #b43e34; -} -.userMenu li.userMenu-network > a -{ + +.userMenu li.userMenu-network > a { background: url(../img/network.png) no-repeat 5px center; } -.userMenu li.userMenu-network:hover > a -{ - background: url(../img/network.png) no-repeat 5px center rgba( 0, 0, 0 , .4 ); -} -.userMenu li.userMenu-network.current > a -{ - background: url(../img/network.png) no-repeat 5px center #b43e34; -} -.userMenu li.userMenu-messages > a -{ + +.userMenu li.userMenu-messages > a { background: url(../img/messages.png) no-repeat center center; - padding: 0 25px 0 35px; + padding: 0 24px; opacity: 1; } -.userMenu li.userMenu-messages:hover > a -{ - background: url(../img/messages.png) no-repeat center center rgba( 0, 0, 0 , .4 ); + +.userMenu li.userMenu-messages > a:empty { + padding: 0 20px 0 30px; + opacity: .7; } -.userMenu li.userMenu-messages.current > a -{ - background: url(../img/messages.png) no-repeat center center #b43e34; + +.userMenu li.userMenu-groupmessages > a { + background: url(../img/groupmessages.png) no-repeat center center; + background-size: 22px 22px; + padding: 0 24px; + opacity: 0.9; } -.userMenu li.userMenu-profile > a -{ + +.userMenu li.userMenu-profile > a { background: url(../img/profile.png) no-repeat 5px center; } -.userMenu li.userMenu-profile:hover > a -{ - background: url(../img/profile.png) no-repeat 5px center rgba( 0, 0, 0 , .4 ); -} -.userMenu li.userMenu-profile.current > a -{ - background: url(../img/profile.png) no-repeat 5px center #b43e34; -} -.userMenu li.userMenu-config -{ + +.userMenu li.userMenu-config { float: right; position: relative; margin-right: 40px; } -.userMenu li.userMenu-search -{ + +.userMenu li.userMenu-search { float: right; position: relative; } -.userMenu li.userMenu-config > a -{ + +.userMenu li.userMenu-search:hover { + background-color: transparent; +} + +.userMenu li.userMenu-config > a { background: url(../img/config.png) no-repeat 5px center; padding: 0 30px 0 45px; } -.userMenu li.userMenu-config > a:after -{ + +.userMenu li.userMenu-config > a:after { content: "▼"; position: absolute; font-size: 10px; transition: all .2 linear; } -.userMenu li.userMenu-config:hover > a, -.userMenu li.userMenu-config:active > a -{ - background: url(../img/config.png) no-repeat 5px center rgba( 0, 0, 0 , .4 ); -} -.userMenu li.userMenu-messages > a:empty -{ - padding: 0 20px 0 30px; - opacity: .7; -} -.wrapper -{ + +.wrapper { width: 900px; margin: 0 auto; background: #f8f5ee; @@ -315,10 +305,12 @@ button.follow:hover, button.unfollow:hover, .following-list button.private:hover z-index: 1; min-height: 100%; } + .wrapper.w1200 { width: 1200px; padding: 55px 7px 15px 7px; } + .dashboard.left { width: 320px; position: fixed; @@ -332,8 +324,7 @@ button.follow:hover, button.unfollow:hover, .following-list button.private:hover margin-left: 864px; } -.module -{ +.module { border: solid 1px rgba( 69, 71, 77, .1 ); background: #fff; } @@ -342,8 +333,7 @@ button.follow:hover, button.unfollow:hover, .following-list button.private:hover margin: 0 0 3%; } -.messages-qtd -{ +.messages-qtd { position: absolute; background: #b43e34; color: #fff; @@ -352,10 +342,11 @@ button.follow:hover, button.unfollow:hover, .following-list button.private:hover font-size: 8px; margin-top: 4px; } -.userMenu-connections .messages-qtd -{ + +.userMenu-connections .messages-qtd { margin: 4px 0 0 10px; } + /******************************************************* ****************** CONFIG SUBMENU & SEARCH RESULTS ***** *******************************************************/ @@ -1581,6 +1572,98 @@ ol.toptrends-list { content: '\2714'; } +/************************************* +****** GM NEW GROUP SETUP MODAL ****** +**************************************/ + +.group-messages-new-group.modal-wrapper { + height: auto; /*about 320px*/ + margin-top: -160px; +} + +.group-messages-new-group .modal-content .module { + margin: 4px; +} + +.group-messages-new-group .modal-content div div { + width: 100%; + margin: 4px 0; + padding: 4px 12px; +} + +.group-messages-new-group .modal-content div div:last-child { + text-align: right; +} + +.group-messages-new-group .modal-content div div:last-child button { + margin: 8px 4px; +} + +.group-messages-new-group .modal-content textarea { + border: solid 1px rgba(0, 0, 0, .3); + border-radius: 3px; + width: 500px; + height: 56px; + resize: none; + margin: 12px 16px; + padding: 2px 4px; +} + +.group-messages-new-group .modal-content textarea:focus { + border: solid 1px rgba(227, 79, 66, .5); +} + +/************************************* +****** GM JOIN GROUP SETUP MODAL ***** +**************************************/ + +.group-messages-join-group.modal-wrapper { + height: auto; /*about 360px*/ + margin-top: -240px; +} + +.group-messages-join-group .modal-content .module { + margin: 4px; +} + +.group-messages-join-group .modal-content div div { + width: 100%; + margin: 4px 0; + padding: 4px 12px; +} + +.group-messages-join-group .modal-content div div:last-child { + text-align: right; +} + +.group-messages-join-group .modal-content div div:last-child button { + margin: 8px 4px; +} + +.group-messages-join-group .modal-content input { + border: solid 1px rgba(0, 0, 0, .3); + border-radius: 3px; + width: 500px; + margin: 12px 16px; + padding: 2px 4px; +} + +.group-messages-join-group .modal-content input:focus { + border: solid 1px rgba(227, 79, 66, .5); +} + +.group-messages-join-group .modal-content input[type='checkbox'] { + display: inline; + width: auto; + margin: 2px; +} + +.group-messages-join-group .modal-content .groups-list { + height: 120px; + overflow-y: auto; + margin: 8px 8px 0; +} + /************************************* *********** NEW USER MODAL *********** **************************************/ @@ -1693,6 +1776,7 @@ ol.toptrends-list { .prompt-wrapper { background: #fff; + font-size: 13px; z-index: 5; position: fixed; top: 50%; @@ -1713,6 +1797,20 @@ ol.toptrends-list { margin: 4px; } +/************************************* +*********** CONFIRM POPUP ************ +**************************************/ + +.confirm-popup .message { + text-align: center; + margin: 12px; +} + +.confirm-popup .modal-buttons { + text-align: center; + padding: 4px; +} + /************************************* ****** FOLLOWING-CONFIG PROMPT ******* **************************************/ diff --git a/following.html b/following.html index 30ee04a..0ca6122 100644 --- a/following.html +++ b/following.html @@ -36,7 +36,7 @@
  • Home
  • Network
  • Profile
  • -
  • +
  • @@ -63,6 +64,11 @@ +
  • + + + +
  • @@ -95,21 +101,21 @@
    + +
    - -
    user-photo
    View @@ -211,7 +217,6 @@
    -
  • @@ -247,8 +252,8 @@
    140 - - + +
    @@ -293,12 +298,12 @@
    @@ -309,14 +314,22 @@
    +
    +
    + +
    +
    140 - - + +
    @@ -378,13 +391,114 @@
    140 - - + +
    +
    +
    + + +
    +
    + +
    +
    + + + +
    + +
    +
    +
    + +
    +
    +
    +
    +
    +
    + + + + +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    + + user-photo + +
    + +
    +
    + +
    +
    +
    +

    Group description

    + +
    +
    +

    Peers to invite

    + +
    +
    + +
    +
    +
    + +
    +
    +
    +

    Select group(s)

    +
      +
      +
      + +
      +
      +
      +
      +

      Import secret key

      + +
      +
      +

      With group alias

      + +
      +
      + +
      +
      +
      + +
      +
    • + // +
    • +
      +
      @@ -418,7 +532,7 @@
    •  Followers
    • -
      +
      diff --git a/home.html b/home.html index bf094a5..b94eb16 100644 --- a/home.html +++ b/home.html @@ -54,8 +54,9 @@ Setup account Following users Change user - - Direct Messages + + Direct Messages + Group Messages
      @@ -69,6 +70,11 @@ +
    • + + + +
    • @@ -101,22 +107,21 @@
      + +
      - - -
      user-photo
      View @@ -132,8 +137,8 @@
      140 - - + +
      @@ -169,8 +174,8 @@
      140 - - + +
      @@ -338,8 +343,8 @@
      140 - - + +
      @@ -385,12 +390,12 @@
      @@ -401,14 +406,22 @@
      +
      +
      + +
      +
      140 - - + +
      @@ -470,13 +483,114 @@
      140 - - + +
      +
      +
      + + +
      +
      + +
      +
      + + + +
      + +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + + + +
      + +
      +
      +
      +
      +
      +
      + +
      +
      +
      + + user-photo + +
      + +
      +
      + +
      +
      +
      +

      Group description

      + +
      +
      +

      Peers to invite

      + +
      +
      + +
      +
      +
      + +
      +
      +
      +

      Select group(s)

      +
        +
        +
        + +
        +
        +
        +
        +

        Import secret key

        + +
        +
        +

        With group alias

        + +
        +
        + +
        +
        +
        + +
        +
      • + // +
      • +
        +
        @@ -510,7 +624,7 @@
      •  Followers
      • -
        +
        diff --git a/js/interface_common.js b/js/interface_common.js index e7a4065..c08197c 100644 --- a/js/interface_common.js +++ b/js/interface_common.js @@ -55,12 +55,56 @@ function closeModal() { }); } +function closePrompt() { + closeModalHandler('.prompt-wrapper'); +} + function closeModalHandler(classBase) { var modalWindows = $(classBase+':not(#templates *)'); modalWindows.fadeOut('fast', function() {modalWindows.remove();}); } +function confirmPopup(event, req) { + event.stopPropagation(); + + var modal = openModal({ + classBase: '.prompt-wrapper', + classAdd: 'confirm-popup', + content: $('#confirm-popup-template').children().clone(true), + title: req.titleTxt + }); + + if (req.messageTxt) + modal.content.find('.message').text(req.messageTxt); + + var btn = modal.content.find('.confirm'); + if (req.confirmTxt) + btn.text(req.confirmTxt); + else + btn.text(polyglot.t('Confirm')); + if (req.confirmFunc) { + btn.on('click', function () { + closePrompt(); + req.confirmFunc(req.confirmFuncArgs); + }); + } else + btn.on('click', closePrompt); + + var btn = modal.content.find('.cancel'); + if (req.cancelTxt) + btn.text(req.cancelTxt); + else + btn.text(polyglot.t('Cancel')); + if (req.cancelFunc) { + btn.on('click', function () { + closePrompt(); + req.cancelFunc(req.cancelFuncArgs); + }); + } else + btn.on('click', closePrompt); +} + function checkNetworkStatusAndAskRedirect(cbFunc, cbArg) { networkUpdate(function(args) { if (!twisterdConnectedAndUptodate) { @@ -98,7 +142,43 @@ function timeSincePost(t) { return polyglot.t('time_ago', {time: expression}); } -function openProfileModalWithUsernameHandler(username) { +function openGroupProfileModalWithNameHandler(groupAlias) { + var modal = openModal({ + classAdd: 'profile-modal', + content: $('#group-profile-modal-template').children().clone(true), + title: polyglot.t('users_profile', {username: '' + groupAlias + ''}) + }); + + modal.content.find('.profile-card').attr('data-screen-name', groupAlias); + + groupMsgGetGroupInfo(groupAlias, + function(req, ret) { + if (ret) { + req.modal.content.find('.profile-bio').text(ret.description); + + if (ret.members.indexOf(defaultScreenName) !== -1) + req.modal.content.find('.group-messages-control').children('button').attr('disabled', false); + + var membersList = req.modal.content.find('.members'); + var memberTemplate = $('#group-profile-member-template').children(); + for (var i = 0; i < ret.members.length; i++) { + var item = memberTemplate.clone(true).appendTo(membersList); + + item.find('.twister-user-info').attr('data-screen-name', ret.members[i]); + item.find('.twister-user-name').attr('href', $.MAL.userUrl(ret.members[i])); + + getAvatar(ret.members[i], item.find('.twister-user-photo')); + getFullname(ret.members[i], item.find('.twister-user-full')); + getBio(ret.members[i], item.find('.bio')); + } + } + }, {modal: modal} + ); + + +} + +function openUserProfileModalWithNameHandler(username) { var content = $('#profile-modal-template').children().clone(true); updateProfileData(content, username); @@ -333,18 +413,26 @@ function loadModalFromHash() { var hashdata = hashstring.split(':'); if (hashdata[0] !== '#web+twister') - hashdata = hashstring.match(/(hashtag|profile|mentions|directmessages|following|conversation)\?(?:user|hashtag|post)=(.+)/); + hashdata = hashstring.match(/(hashtag|profile|mentions|directmessages|following|conversation)\?(?:group|user|hashtag|post)=(.+)/); // need to rework hash scheme to use group|user|hashtag|post or drop it if (hashdata && hashdata[1] !== undefined && hashdata[2] !== undefined) { if (hashdata[1] === 'profile') - openProfileModalWithUsernameHandler(hashdata[2]); + if (hashdata[2][0] === '*') + openGroupProfileModalWithNameHandler(hashdata[2]); + else + openUserProfileModalWithNameHandler(hashdata[2]); + else if (hashdata[1] === 'hashtag') openHashtagModalFromSearchHandler(hashdata[2]); else if (hashdata[1] === 'mentions') openMentionsModalHandler(hashdata[2]); - else if (hashdata[1] === 'directmessages') - openDmWithUserModal(hashdata[2]); - else if (hashdata[1] === 'following') + else if (hashdata[1] === 'directmessages') { + if (hashdata[2][0] === '*') + openGroupMessagesModal(hashdata[2]); + else + openDmWithUserModal(hashdata[2]); + + } else if (hashdata[1] === 'following') openFollowingModal(hashdata[2]); else if (hashdata[1] === 'conversation') { splithashdata2 = hashdata[2].split(':'); @@ -352,6 +440,12 @@ function loadModalFromHash() { } } else if (hashstring === '#directmessages') directMessagesPopup(); + else if (hashstring === '#groupmessages') + openGroupMessagesModal(); + else if (hashstring === '#groupmessages+newgroup') + openGroupMessagesNewGroupModal(); + else if (hashstring === '#groupmessages+joingroup') + openGroupMessagesJoinGroupModal(); else if (hashstring === '#whotofollow') openWhoToFollowModal(); } @@ -1317,7 +1411,7 @@ function postSubmit(e, oldLastPostId) { } if (btnPostSubmit.parents('.prompt-wrapper').length) - closeModalHandler('.prompt-wrapper'); + closePrompt(); else { textArea.val('').attr('placeholder', polyglot.t('Your message was sent!')); var tweetForm = btnPostSubmit.parents('form'); @@ -1338,7 +1432,7 @@ function retweetSubmit(e) { newRtMsg($(this).closest('.prompt-wrapper').find('.post-data')); - closeModalHandler('.prompt-wrapper'); + closePrompt(); } function changeStyle() { @@ -1409,7 +1503,7 @@ function replaceDashboards() { } function initInterfaceCommon() { - $('.cancel').on('click', function() { + $('.modal-close, .modal-blackout').not('.prompt-close').on('click', function() { if ($('.modal-content').attr('style') != undefined) $('.modal-content').removeAttr('style'); $('.modal-back').css('display', 'none'); @@ -1419,10 +1513,7 @@ function initInterfaceCommon() { $('.modal-back').on('click', function() {history.back();}); - $('.prompt-close').on('click', function(e) { - e.stopPropagation(); - closeModalHandler('.prompt-wrapper'); - }); + $('.prompt-close').on('click', closePrompt); /* $('.modal-back').on('click', function() { @@ -1499,6 +1590,12 @@ function killInterfaceModule(module) { $('.module.'+module).empty().hide(); } +function inputEnterActivator(event) { + var elemEvent = $(event.target); + elemEvent.parents(event.data.parentSelector).find(event.data.enterSelector) + .attr('disabled', elemEvent.val().trim() === ''); +} + function setTextcompleteOnEventTarget(event) { // cursor has not set yet and we need to wait 100ms to skip global click event setTimeout(setTextcompleteOnElement, 100, event.target); diff --git a/js/interface_localization.js b/js/interface_localization.js index 9b08e75..7eb855f 100644 --- a/js/interface_localization.js +++ b/js/interface_localization.js @@ -44,6 +44,9 @@ if(preferredLanguage == "en"){ "busted_oh": "oh noes!", "busted_avowal": "I\'m busted trying inject this suspicious stuff here", "Cancel": "Cancel", + "Confirm": "Confirm", + "сonfirm_group_leaving_header": "Confirm group leaving", + "сonfirm_group_leaving_body": "Are you sure want to leave %{alias} group?", "Change user": "Change user", "Checking...": "Checking...", // checking if username is available "Collapse": "Collapse", // smaller view of a post @@ -54,6 +57,9 @@ if(preferredLanguage == "en"){ "Detailed information": "Detailed information", "DHT network down.": "DHT network down.", "Direct Messages": "Direct Messages", + "Group Messages": "Group Messages", + "Group Messages — New Group Creation": "Group Messages — New Group Creation", + "Group Messages — Join Group": "Group Messages — Join Group", "direct_messages_with": "Direct messages with %{username}", "Disable": "Disable", "Display mentions to @": "Display mentions to @", @@ -94,6 +100,16 @@ if(preferredLanguage == "en"){ "Network status": "Network status", "New direct message...": "New direct message...", "New Post...": "New Post...", + "New group": "New group", + "Group description": "Group description", + "Peers to invite": "Peers to invite", + "Join group": "Join group", + "Select group(s)": "Select group(s)", + "Create": "Create", + "Join": "Join", + "Invite": "Invite", + "Invite peers": "Invite peers", + "Leave group": "Leave group", "You got": "You got", "in postboard": "in postboard", "in search result": "in search result", @@ -101,6 +117,7 @@ if(preferredLanguage == "en"){ "new_posts": "%{smart_count} new post |||| %{smart_count} new posts", "new_mentions": "%{smart_count} new mention |||| %{smart_count} new mentions", "new_direct_messages": "%{smart_count} new direct message |||| %{smart_count} new direct messages", + "new_group_messages": "%{smart_count} new group message |||| %{smart_count} new group messages", "nobody": "nobody", // used to promote a post without attaching the user "Not available": "Not available", // username is not available "notify_desktop_error": "Twister cannot perform desktop notification: unknown error occured.", @@ -344,6 +361,9 @@ if(preferredLanguage == "es"){ "busted_oh": "oh noes!", "busted_avowal": "I\'m busted trying inject this suspicious stuff here", "Cancel": "Cancelar", + "Confirm": "Confirm", + "сonfirm_group_leaving_header": "Confirm group leaving", + "сonfirm_group_leaving_body": "Are you sure want to leave %{alias} group?", "Change user": "Cambiar de usuario", "Checking...": "Comprobando ...", // checking if username is available "Collapse": "Colapsar", // smaller view of a post @@ -354,6 +374,9 @@ if(preferredLanguage == "es"){ "Detailed information": "Información detallada", "DHT network down.": "Red DHT caida.", "Direct Messages": "Mensajes directos", + "Group Messages": "Group Messages", + "Group Messages — New Group Creation": "Group Messages — New Group Creation", + "Group Messages — Join Group": "Group Messages — Join Group", "direct_messages_with": "Mensajes directos con %{username}", "Disable": "Inhabilitar", "Display mentions to @": "Visualización de menciones a @", @@ -394,6 +417,16 @@ if(preferredLanguage == "es"){ "Network status": "Estado de la red", "New direct message...": "Nuevo mensaje directo...", "New Post...": "Nuevo Post...", + "New group": "New group", + "Group description": "Group description", + "Peers to invite": "Peers to invite", + "Join group": "Join group", + "Select group(s)": "Select group(s)", + "Create": "Create", + "Join": "Join", + "Invite": "Invite", + "Invite peers": "Invite peers", + "Leave group": "Leave group", "You got": "You got", "in postboard": "in postboard", "in search result": "in search result", @@ -401,6 +434,7 @@ if(preferredLanguage == "es"){ "new_posts": "%{smart_count} nuevo post |||| %{smart_count} nuevos posts", "new_mentions": "%{smart_count} new mention |||| %{smart_count} new mentions", "new_direct_messages": "%{smart_count} new direct message |||| %{smart_count} new direct messages", + "new_group_messages": "%{smart_count} new group message |||| %{smart_count} new group messages", "nobody": "Nadie", // used to promote a post without attaching the user "Not available": "No disponible", // username is not available "notify_desktop_error": "Twister cannot perform desktop notification: unknown error occured.", @@ -628,6 +662,9 @@ if(preferredLanguage == "uk"){ "busted_oh": "oh noes!", "busted_avowal": "I\'m busted trying inject this suspicious stuff here", "Cancel": "Відміна", + "Confirm": "Confirm", + "сonfirm_group_leaving_header": "Confirm group leaving", + "сonfirm_group_leaving_body": "Are you sure want to leave %{alias} group?", "Change user": "Змінити користувача", "Checking...": "Перевірка...", // checking if username is available "Collapse": "Згорнути", // smaller view of a post @@ -638,6 +675,9 @@ if(preferredLanguage == "uk"){ "Detailed information": "Детальна інформація", "DHT network down.": "Мережа DHT недоступна.", "Direct Messages": "Особисті повідомлення", + "Group Messages": "Group Messages", + "Group Messages — New Group Creation": "Group Messages — New Group Creation", + "Group Messages — Join Group": "Group Messages — Join Group", "direct_messages_with": "Direct messages with %{username}", "Disable": "Вимкнено", "Display mentions to @": "Показати сповіщення @", @@ -679,6 +719,16 @@ if(preferredLanguage == "uk"){ "Network status": "Статус мережі", "New direct message...": "Нове повідомлення...", "New Post...": "Що нового?", + "New group": "New group", + "Group description": "Group description", + "Peers to invite": "Peers to invite", + "Join group": "Join group", + "Select group(s)": "Select group(s)", + "Create": "Create", + "Join": "Join", + "Invite": "Invite", + "Invite peers": "Invite peers", + "Leave group": "Leave group", "You got": "Ви отримали", "in postboard": "в стрічці", "in search result": "в пошуковому запиті", @@ -686,6 +736,7 @@ if(preferredLanguage == "uk"){ "new_posts": "%{smart_count} новий твіст |||| %{smart_count} нових твістів", "new_mentions": "%{smart_count} нове сповіщення |||| %{smart_count} нових сповіщень", "new_direct_messages": "%{smart_count} нове повідомлення |||| %{smart_count} нові повідомлення", + "new_group_messages": "%{smart_count} new group message |||| %{smart_count} new group messages", "nobody": "анонім", // used to promote a post without attaching the user "Not available": "Не доступне", // username is not available "notify_desktop_error": "Twister не може створити сповіщення: невідома помилка.", @@ -911,6 +962,9 @@ if(preferredLanguage == "zh-CN"){ "busted_oh": "噢,阻挡!", "busted_avowal": "系统检测到此用户试图在这里注入恶意代码", "Cancel": "取消", + "Confirm": "Confirm", + "сonfirm_group_leaving_header": "Confirm group leaving", + "сonfirm_group_leaving_body": "Are you sure want to leave %{alias} group?", "Change user": "切换用户", "Checking...": "检查中...", // checking if username is available "Collapse": "折叠", // smaller view of a post @@ -921,6 +975,9 @@ if(preferredLanguage == "zh-CN"){ "Detailed information": "详细信息", "DHT network down.": "DHT网络中断。", "Direct Messages": "私信", + "Group Messages": "Group Messages", + "Group Messages — New Group Creation": "Group Messages — New Group Creation", + "Group Messages — Join Group": "Group Messages — Join Group", "direct_messages_with": "Direct messages with %{username}", "Disable": "关闭", "Display mentions to @": "显示@", @@ -961,6 +1018,16 @@ if(preferredLanguage == "zh-CN"){ "Network status": "网络状态", "New direct message...": "新私信...", "New Post...": "新推文...", + "New group": "New group", + "Group description": "Group description", + "Peers to invite": "Peers to invite", + "Join group": "Join group", + "Select group(s)": "Select group(s)", + "Create": "Create", + "Join": "Join", + "Invite": "Invite", + "Invite peers": "Invite peers", + "Leave group": "Leave group", "You got": "你收到", "in postboard": "在时间线里", "in search result": "在搜索结果里", @@ -968,6 +1035,7 @@ if(preferredLanguage == "zh-CN"){ "new_posts": "%{smart_count} 篇新推文", "new_mentions": "%{smart_count} 次新的提及", "new_direct_messages": "%{smart_count} 封新私信", + "new_group_messages": "%{smart_count} new group message |||| %{smart_count} new group messages", "nobody": "无名", // used to promote a post without attaching the user "Not available": "用户名不可用", // username is not available "notify_desktop_error": "Twister 无法发出桌面提醒:发生未知错误。", @@ -1211,6 +1279,9 @@ if(preferredLanguage == "nl"){ "busted_oh": "oh noes!", "busted_avowal": "I\'m busted trying inject this suspicious stuff here", "Cancel": "Annuleren", + "Confirm": "Confirm", + "сonfirm_group_leaving_header": "Confirm group leaving", + "сonfirm_group_leaving_body": "Are you sure want to leave %{alias} group?", "Change user": "Gebruiker wijzigen", "Checking...": "Controleren...", // checking if username is available "Collapse": "Uitklappen", // smaller view of a post @@ -1221,6 +1292,9 @@ if(preferredLanguage == "nl"){ "Detailed information": "Gedetailleerde informatie", "DHT network down.": "DHT netwerk down.", "Direct Messages": "Privéberichten", + "Group Messages": "Group Messages", + "Group Messages — New Group Creation": "Group Messages — New Group Creation", + "Group Messages — Join Group": "Group Messages — Join Group", "direct_messages_with": "Direct messages with %{username}", "Disable": "Uitschakelen", "Display mentions to @": "Toon vermeldingen voor @", @@ -1261,6 +1335,16 @@ if(preferredLanguage == "nl"){ "Network status": "Netwerkstatus", "New direct message...": "Nieuw privébericht...", "New Post...": "Nieuw bericht...", + "New group": "New group", + "Group description": "Group description", + "Peers to invite": "Peers to invite", + "Join group": "Join group", + "Select group(s)": "Select group(s)", + "Create": "Create", + "Join": "Join", + "Invite": "Invite", + "Invite peers": "Invite peers", + "Leave group": "Leave group", "You got": "You got", "in postboard": "in postboard", "in search result": "in search result", @@ -1268,6 +1352,7 @@ if(preferredLanguage == "nl"){ "new_posts": "%{smart_count} nieuw bericht |||| %{smart_count} nieuwe berichten", "new_mentions": "%{smart_count} new mention |||| %{smart_count} new mentions", "new_direct_messages": "%{smart_count} new direct message |||| %{smart_count} new direct messages", + "new_group_messages": "%{smart_count} new group message |||| %{smart_count} new group messages", "nobody": "nobody", // used to promote a post without attaching the user "Not available": "Niet beschikbaar", // username is not available "notify_desktop_error": "Twister cannot perform desktop notification: unknown error occured.", @@ -1495,6 +1580,9 @@ if(preferredLanguage == "it"){ "busted_oh": "oh noes!", "busted_avowal": "I\'m busted trying inject this suspicious stuff here", "Cancel": "Cancella", + "Confirm": "Confirm", + "сonfirm_group_leaving_header": "Confirm group leaving", + "сonfirm_group_leaving_body": "Are you sure want to leave %{alias} group?", "Change user": "Cambia utente", "Checking...": "Controllo in corso...", // checking if username is available "Collapse": "Chiudi", // smaller view of a post @@ -1505,6 +1593,9 @@ if(preferredLanguage == "it"){ "Detailed information": "Informazioni dettagliate", "DHT network down.": "DHT network inaccessibile.", "Direct Messages": "Messaggi Diretti", + "Group Messages": "Group Messages", + "Group Messages — New Group Creation": "Group Messages — New Group Creation", + "Group Messages — Join Group": "Group Messages — Join Group", "direct_messages_with": "Messaggi Diretti come %{username}", "Disable": "Disabilitato", "Display mentions to @": "Mostra le menzioni di @", @@ -1545,6 +1636,16 @@ if(preferredLanguage == "it"){ "Network status": "Status della rete", "New direct message...": "Nuovo messaggio diretto...", "New Post...": "Nuovo messaggio...", + "New group": "New group", + "Group description": "Group description", + "Peers to invite": "Peers to invite", + "Join group": "Join group", + "Select group(s)": "Select group(s)", + "Create": "Create", + "Join": "Join", + "Invite": "Invite", + "Invite peers": "Invite peers", + "Leave group": "Leave group", "You got": "You got", "in postboard": "in postboard", "in search result": "in search result", @@ -1552,6 +1653,7 @@ if(preferredLanguage == "it"){ "new_posts": "%{smart_count} nuovo messaggio |||| %{smart_count} nuovi messaggi", "new_mentions": "%{smart_count} new mention |||| %{smart_count} new mentions", "new_direct_messages": "%{smart_count} new direct message |||| %{smart_count} new direct messages", + "new_group_messages": "%{smart_count} new group message |||| %{smart_count} new group messages", "nobody": "nessuno", // used to promote a post without attaching the user "Not available": "Non disponibile", // username is not available "notify_desktop_error": "Twister cannot perform desktop notification: unknown error occured.", @@ -1776,6 +1878,9 @@ if(preferredLanguage == "fr"){ "busted_oh": "oh noes!", "busted_avowal": "I\'m busted trying inject this suspicious stuff here", "Cancel": "Annuler", + "Confirm": "Confirm", + "сonfirm_group_leaving_header": "Confirm group leaving", + "сonfirm_group_leaving_body": "Are you sure want to leave %{alias} group?", "Change user": "Changer d'utilisateur", "Checking...": "Vérification...", // checking if username is available "Collapse": "Fermer", // smaller view of a post @@ -1786,6 +1891,9 @@ if(preferredLanguage == "fr"){ "Detailed information": "Informations détaillées", "DHT network down.": "Panne du réseau DHT.", "Direct Messages": "Messages privés", + "Group Messages": "Group Messages", + "Group Messages — New Group Creation": "Group Messages — New Group Creation", + "Group Messages — Join Group": "Group Messages — Join Group", "direct_messages_with": "Messages privés avec %{username}", "Disable": "Désactiver", "Display mentions to @": "Afficher les mentions pour @", @@ -1826,6 +1934,16 @@ if(preferredLanguage == "fr"){ "Network status": "État du réseau", "New direct message...": "Nouveau message privé...", "New Post...": "Nouveau billets...", + "New group": "New group", + "Group description": "Group description", + "Peers to invite": "Peers to invite", + "Join group": "Join group", + "Select group(s)": "Select group(s)", + "Create": "Create", + "Join": "Join", + "Invite": "Invite", + "Invite peers": "Invite peers", + "Leave group": "Leave group", "You got": "Tu as", "in postboard": "sur le postboard", "in search result": "dans les résultats de recherche", @@ -1833,6 +1951,7 @@ if(preferredLanguage == "fr"){ "new_posts": "%{smart_count} nouveau billet |||| %{smart_count} nouveaux billets", "new_mentions": "%{smart_count} nouvelle mention |||| %{smart_count} nouvelles mentions", "new_direct_messages": "%{smart_count} nouveau message privé |||| %{smart_count} nouveaux messages privés", + "new_group_messages": "%{smart_count} new group message |||| %{smart_count} new group messages", "nobody": "nobody", // used to promote a post without attaching the user "Not available": "Non disponible", // username is not available "notify_desktop_error": "Impossible d'afficher les notifications: une erreur inconnue est survenue.", @@ -2062,6 +2181,9 @@ if(preferredLanguage == "ru"){ "busted_oh": "о нет!", "busted_avowal": "я пойман на попытке вставить этот подозрительный код здесь", "Cancel": "Отмена", + "Confirm": "Несомненно", + "сonfirm_group_leaving_header": "Подтверждение ухода из группы", + "сonfirm_group_leaving_body": "Воистину покинуть группу %{alias}?", "Change user": "Сменить пользователя", "Checking...": "Проверка...", "Collapse": "Свернуть", @@ -2072,6 +2194,9 @@ if(preferredLanguage == "ru"){ "Detailed information": "Подробная информация", "DHT network down.": "Недоступна DHT сеть.", "Direct Messages": "Личные сообщения", + "Group Messages": "Групповые сообщения", + "Group Messages — New Group Creation": "Групповые сообщения — Создать новую группу", + "Group Messages — Join Group": "Групповые сообщения — Присоединиться к группе", "direct_messages_with": "Личная переписка с %{username}", "Disable": "Отключено", "Display mentions to @": "Показать ответы для @", @@ -2112,6 +2237,16 @@ if(preferredLanguage == "ru"){ "Network status": "Состояние сети", "New direct message...": "Новое личное сообщение...", "New Post...": "Новый пост...", + "New group": "Создать группу", + "Group description": "Описание группы", + "Peers to invite": "Кого пригласить", + "Join group": "Присоединиться", + "Select group(s)": "Выберите группу(ы)", + "Create": "Создать", + "Join": "Присоединиться", + "Invite": "Пригласить", + "Invite peers": "Пригласить кого", + "Leave group": "Покинуть группу", "You got": "У вас", "in postboard": "в ленте", "in search result": "в результатах поиска", @@ -2119,6 +2254,7 @@ if(preferredLanguage == "ru"){ "new_posts": "%{smart_count} новый пост |||| %{smart_count} новых постов", "new_mentions": "%{smart_count} новое упоминание |||| %{smart_count} новых упоминаний", "new_direct_messages": "%{smart_count} новое личное сообщение |||| %{smart_count} новых личных сообщений", + "new_group_messages": "%{smart_count} новое сообщение в группе |||| %{smart_count} новых групповых сообщений", "nobody": "Анонимно", // used to promote a post without attaching the user "Not available": "Недоступно", "notify_desktop_error": "Твистер не может выполнить уведомление: произошла неизвестная ошибка.", @@ -2351,6 +2487,9 @@ if(preferredLanguage == "de"){ "busted_oh": "Oh nein!", "busted_avowal": "Ich bin ertappt, habe versucht, hier Schadcode einzugeben!", "Cancel": "Abbrechen", + "Confirm": "Confirm", + "сonfirm_group_leaving_header": "Confirm group leaving", + "сonfirm_group_leaving_body": "Are you sure want to leave %{alias} group?", "Change user": "Benutzer wechseln", "Checking...": "Überprüfe...", // checking if username is available "Collapse": "Einklappen", // smaller view of a post @@ -2361,6 +2500,9 @@ if(preferredLanguage == "de"){ "Detailed information": "Detaillierte Informationen", "DHT network down.": "DHT-Netzwerk nicht verfügbar.", "Direct Messages": "Direktnachrichten", + "Group Messages": "Group Messages", + "Group Messages — New Group Creation": "Group Messages — New Group Creation", + "Group Messages — Join Group": "Group Messages — Join Group", "direct_messages_with": "Direktnachrichten mit %{username}", "Disable": "Deaktivieren", "Display mentions to @": "Zeige Erwähnungen von @", //Ist das richtig? Ich weiß nicht, in welchem Zusammenhang das benutzt wird. @@ -2402,6 +2544,16 @@ if(preferredLanguage == "de"){ "Network status": "Netzwerkstatus", "New direct message...": "Neue Direktnachricht...", "New Post...": "Neuer Post...", + "New group": "New group", + "Group description": "Group description", + "Peers to invite": "Peers to invite", + "Join group": "Join group", + "Select group(s)": "Select group(s)", + "Create": "Create", + "Join": "Join", + "Invite": "Invite", + "Invite peers": "Invite peers", + "Leave group": "Leave group", "You got": "Du hast", "in postboard": "in der Timeline", "in search result": "in den Suchergebnissen", @@ -2409,6 +2561,7 @@ if(preferredLanguage == "de"){ "new_posts": "%{smart_count} neuer Post |||| %{smart_count} neue Posts", "new_mentions": "%{smart_count} neue Erwähnung |||| %{smart_count} neue Erwähnungen", "new_direct_messages": "%{smart_count} neue Direktnachricht |||| %{smart_count} neue Direktnachrichten", + "new_group_messages": "%{smart_count} new group message |||| %{smart_count} new group messages", "nobody": "nobody", // used to promote a post without attaching the user "Not available": "Nicht verfügbar", // username is not available "notify_desktop_error": "Twister kann keine Desktop-Meldungen anzeigen: ein unbekannter Fehler trat auf.", @@ -2637,6 +2790,9 @@ if(preferredLanguage == "ja"){ "busted_oh": "oh noes!", "busted_avowal": "I\'m busted trying inject this suspicious stuff here", "Cancel": "キャンセル", + "Confirm": "Confirm", + "сonfirm_group_leaving_header": "Confirm group leaving", + "сonfirm_group_leaving_body": "Are you sure want to leave %{alias} group?", "Change user": "ユーザーを変更", "Checking...": "チェック...", // checking if username is available "Collapse": "閉じる", // smaller view of a post @@ -2647,6 +2803,9 @@ if(preferredLanguage == "ja"){ "Detailed information": "詳細", "DHT network down.": "DHTネットワークがダウンしています", "Direct Messages": "ダイレクトメッセージ", + "Group Messages": "Group Messages", + "Group Messages — New Group Creation": "Group Messages — New Group Creation", + "Group Messages — Join Group": "Group Messages — Join Group", "direct_messages_with": "Direct messages with %{username}", "Disable": "停止", "Display mentions to @": "メンションを表示する", @@ -2687,6 +2846,16 @@ if(preferredLanguage == "ja"){ "Network status": "ネットワークステータス", "New direct message...": "ダイレクトメッセージ...", "New Post...": "投稿する", + "New group": "New group", + "Group description": "Group description", + "Peers to invite": "Peers to invite", + "Join group": "Join group", + "Select group(s)": "Select group(s)", + "Create": "Create", + "Join": "Join", + "Invite": "Invite", + "Invite peers": "Invite peers", + "Leave group": "Leave group", "You got": "You got", "in postboard": "in postboard", "in search result": "in search result", @@ -2694,6 +2863,7 @@ if(preferredLanguage == "ja"){ "new_posts": "%{smart_count} 新投稿 |||| %{smart_count} 新投稿", "new_mentions": "%{smart_count} new mention |||| %{smart_count} new mentions", "new_direct_messages": "%{smart_count} new direct message |||| %{smart_count} new direct messages", + "new_group_messages": "%{smart_count} new group message |||| %{smart_count} new group messages", "nobody": "ナナシ", // used to promote a post without attaching the user "Not available": "使用中", // username is not available "notify_desktop_error": "Twister cannot perform desktop notification: unknown error occured.", @@ -2919,6 +3089,9 @@ if(preferredLanguage == "pt-BR"){ "busted_oh": "oh noes!", "busted_avowal": "I\'m busted trying inject this suspicious stuff here", "Cancel": "Cancelar", + "Confirm": "Confirm", + "сonfirm_group_leaving_header": "Confirm group leaving", + "сonfirm_group_leaving_body": "Are you sure want to leave %{alias} group?", "Change user": "Trocar usuário", "Checking...": "Verificando...", // checking if username is available "Collapse": "Recolher", // smaller view of a post @@ -2929,6 +3102,9 @@ if(preferredLanguage == "pt-BR"){ "Detailed information": "Informações detalhadas", "DHT network down.": "Falha na rede DHT", "Direct Messages": "Mensagens Diretas", + "Group Messages": "Group Messages", + "Group Messages — New Group Creation": "Group Messages — New Group Creation", + "Group Messages — Join Group": "Group Messages — Join Group", "direct_messages_with": "Mensagens Diretas com %{username}", "Disable": "Desabilitado", "Display mentions to @": "Exibir menções a @", @@ -2969,6 +3145,16 @@ if(preferredLanguage == "pt-BR"){ "Network status": "Estado da rede", "New direct message...": "Nova mensagem direta...", "New Post...": "Nova Postagem...", + "New group": "New group", + "Group description": "Group description", + "Peers to invite": "Peers to invite", + "Join group": "Join group", + "Select group(s)": "Select group(s)", + "Create": "Create", + "Join": "Join", + "Invite": "Invite", + "Invite peers": "Invite peers", + "Leave group": "Leave group", "You got": "You got", "in postboard": "in postboard", "in search result": "in search result", @@ -2976,6 +3162,7 @@ if(preferredLanguage == "pt-BR"){ "new_posts": "%{smart_count} nova postagem |||| %{smart_count} novas postagens", "new_mentions": "%{smart_count} new mention |||| %{smart_count} new mentions", "new_direct_messages": "%{smart_count} new direct message |||| %{smart_count} new direct messages", + "new_group_messages": "%{smart_count} new group message |||| %{smart_count} new group messages", "nobody": "nobody", // used to promote a post without attaching the user "Not available": "Indisponível", // username is not available "notify_desktop_error": "Twister cannot perform desktop notification: unknown error occured.", @@ -3205,6 +3392,9 @@ if(preferredLanguage == "tr"){ "busted_oh": "oh noes!", "busted_avowal": "I\'m busted trying inject this suspicious stuff here", "Cancel": "İptal", + "Confirm": "Confirm", + "сonfirm_group_leaving_header": "Confirm group leaving", + "сonfirm_group_leaving_body": "Are you sure want to leave %{alias} group?", "Change user": "Kullanıcı değiştir", "Checking...": "Denetleniyor...", // checking if username is available "Collapse": "Kapat", // smaller view of a post @@ -3215,6 +3405,9 @@ if(preferredLanguage == "tr"){ "Detailed information": "Detaylı bilgi", "DHT network down.": "DHT ağı çalışmıyor.", "Direct Messages": "Direk Mesajlar", + "Group Messages": "Group Messages", + "Group Messages — New Group Creation": "Group Messages — New Group Creation", + "Group Messages — Join Group": "Group Messages — Join Group", "direct_messages_with": "%{username} ile Direk Mesajlar", "Disable": "Kullanılmaz", "Display mentions to @": "@ adının geçtiği gönderiler", @@ -3255,6 +3448,16 @@ if(preferredLanguage == "tr"){ "Network status": "Ağ durumu", "New direct message...": "Yeni direk mesaj...", "New Post...": "Yeni gönderi...", + "New group": "New group", + "Group description": "Group description", + "Peers to invite": "Peers to invite", + "Join group": "Join group", + "Select group(s)": "Select group(s)", + "Create": "Create", + "Join": "Join", + "Invite": "Invite", + "Invite peers": "Invite peers", + "Leave group": "Leave group", "You got": "You got", "in postboard": "in postboard", "in search result": "in search result", @@ -3262,6 +3465,7 @@ if(preferredLanguage == "tr"){ "new_posts": "%{smart_count} yeni gönederi |||| %{smart_count} yeni gönderi", "new_mentions": "%{smart_count} new mention |||| %{smart_count} new mentions", "new_direct_messages": "%{smart_count} new direct message |||| %{smart_count} new direct messages", + "new_group_messages": "%{smart_count} new group message |||| %{smart_count} new group messages", "nobody": "hiçkimse", // used to promote a post without attaching the user "Not available": "Kullanılamaz", // username is not available "notify_desktop_error": "Twister cannot perform desktop notification: unknown error occured.", @@ -3488,6 +3692,9 @@ if(preferredLanguage == "cs"){ "busted_oh": "oh noes!", "busted_avowal": "I\'m busted trying inject this suspicious stuff here", "Cancel": "Zrušit", + "Confirm": "Confirm", + "сonfirm_group_leaving_header": "Confirm group leaving", + "сonfirm_group_leaving_body": "Are you sure want to leave %{alias} group?", "Change user": "Změnit uživatele", "Checking...": "Ověřuji...", // checking if username is available "Collapse": "Složit", // smaller view of a post @@ -3498,6 +3705,9 @@ if(preferredLanguage == "cs"){ "Detailed information": "Podrobné informace", "DHT network down.": "Síť DHT je nedostupná.", "Direct Messages": "Přímé zprávy", + "Group Messages": "Group Messages", + "Group Messages — New Group Creation": "Group Messages — New Group Creation", + "Group Messages — Join Group": "Group Messages — Join Group", "direct_messages_with": "Direct messages with %{username}", "Disable": "Vypnuto", "Display mentions to @": "Zobrazit zmínky o @", @@ -3538,6 +3748,16 @@ if(preferredLanguage == "cs"){ "Network status": "Stav sítě", "New direct message...": "Nová přímá zpráva...", "New Post...": "Nový příspěvek...", + "New group": "New group", + "Group description": "Group description", + "Peers to invite": "Peers to invite", + "Join group": "Join group", + "Select group(s)": "Select group(s)", + "Create": "Create", + "Join": "Join", + "Invite": "Invite", + "Invite peers": "Invite peers", + "Leave group": "Leave group", "You got": "Máte", "in postboard": "na nástěnce", "in search result": "ve výsledcích hledání", @@ -3545,6 +3765,7 @@ if(preferredLanguage == "cs"){ "new_posts": "%{smart_count} nový příspěvek |||| %{smart_count} nové příspěvky |||| %{smart_count} nových příspěvků", "new_mentions": "%{smart_count} novou zmínku |||| %{smart_count} nové zmínky |||| %{smart_count} nových zmínek", "new_direct_messages": "%{smart_count} novou přímou zprávu |||| %{smart_count} nové přímé zprávy |||| %{smart_count} nových přímých zpráv", + "new_group_messages": "%{smart_count} new group message |||| %{smart_count} new group messages", "nobody": "nikdo", // used to promote a post without attaching the user "Not available": "Tuto přezdívku již někdo používá", // username is not available "notify_desktop_error": "Twisteru se nepodařilo zobrazit upozornění na ploše: došlo k neznámé chybě.", diff --git a/js/mobile_abstract.js b/js/mobile_abstract.js index 00b7bb7..2d0673d 100644 --- a/js/mobile_abstract.js +++ b/js/mobile_abstract.js @@ -142,11 +142,14 @@ var MAL = function() // how do we map usernames into urls this.userUrl = function(username) { - if( $.hasOwnProperty("mobile") ) { - return "#profile?user=" + username; - } else { - return "#profile?user=" + username; - } + //if( $.hasOwnProperty("mobile") ) { + // return "#profile?user=" + username; + //} else { + if (username[0] === '*') + return "#profile?group=" + username; + else + return "#profile?user=" + username; + //} } // recover username from url (only for hash) @@ -184,13 +187,13 @@ var MAL = function() } } - this.dmchatUrl = function(username) { - if( $.hasOwnProperty("mobile") ) { - return "#dmchat?user=" + username; + this.dmchatUrl = function (alias) { + if ($.hasOwnProperty('mobile')) { + return '#dmchat?user=' + alias; } else { - return "#directmessages?user=" + username; + return '#directmessages?' + (alias[0] === '*' ? 'group' : 'user') + '=' + alias; } - } + }; this.followingUrl = function(username) { if( $.hasOwnProperty("mobile") ) { @@ -275,6 +278,18 @@ var MAL = function() } } + this.updateNewGroupDMsUI = function(newDMs) { + if( $.hasOwnProperty('mobile') ) { + } else { + var DMsCounter = $('.userMenu-groupmessages .messages-qtd'); + if (newDMs) { + DMsCounter.text(newDMs).fadeIn(); + } else { + DMsCounter.hide(); + } + } + } + this.updateMyOwnPostCount = function(numPosts) { if( $.hasOwnProperty("mobile") ) { console.log("FIXME: implement MAL_updateMyOwnPostCount"); @@ -327,29 +342,29 @@ var MAL = function() } } - this.showDMchat = function(username) { - if (username) { - if( $.hasOwnProperty("mobile") ) { - $.mobile.navigate( this.dmchatUrl(username) ); + this.showDMchat = function(req) { + if (req.alias) { + if ($.hasOwnProperty('mobile')) { + $.mobile.navigate(this.dmchatUrl(req.alias)); } else { - if ($(".postboard").length) { - window.location.hash = this.dmchatUrl(username); + if ($('.postboard').length) { + window.location.hash = this.dmchatUrl(req.alias); } else { - window.location.href = 'home.html'+this.dmchatUrl(username); + window.location.href = 'home.html'+this.dmchatUrl(req.alias); } } } else { - if( $.hasOwnProperty("mobile") ) { - $.mobile.navigate( '#directmsg' ); + if ($.hasOwnProperty('mobile')) { + $.mobile.navigate('#' + (req.group ? '' : 'directmsg')); // FIXME add group messages to tmobile } else { - if ($(".postboard").length) { - window.location.hash = '#directmessages'; + if ($('.postboard').length) { + window.location.hash = '#' + (req.group ? 'groupmessages' : 'directmessages'); } else { - window.location.href = 'home.html#directmessages'; + window.location.href = 'home.html#' + (req.group ? 'groupmessages' : 'directmessages'); } } } - } + }; this.setNetworkStatusMsg = function(msg, statusGood) { if( $.hasOwnProperty("mobile") ) { diff --git a/js/twister_directmsg.js b/js/twister_directmsg.js index 8748bf5..abe346e 100644 --- a/js/twister_directmsg.js +++ b/js/twister_directmsg.js @@ -3,7 +3,9 @@ // // Handle direct messages modal -function requestDMsnippetList(dmThreadList) { +var _groupMsgInviteToGroupQueue = []; + +function requestDMsnippetList(dmThreadList, forGroup) { var followList = []; for (var i = 0; i < followingUsers.length; i++) followList.push({username:followingUsers[i]}); @@ -11,15 +13,19 @@ function requestDMsnippetList(dmThreadList) { followList.push({username:groupChatAliases[i]}); twisterRpc('getdirectmsgs', [defaultScreenName, 1, followList], - function(req, ret) {processDMsnippet(ret, dmThreadList);}, dmThreadList, + function(req, ret) {processDMsnippet(ret, req.dmThreadList, req.forGroup);}, + {dmThreadList: dmThreadList, forGroup: forGroup}, function(req, ret) {console.log('ajax error:' + ret);}, null ); } -function processDMsnippet(dmUsers, dmThreadList) { +function processDMsnippet(dmUsers, dmThreadList, forGroup) { dmThreadList.empty(); for (var u in dmUsers) { + if ((forGroup && u[0] !== '*') || (!forGroup && u[0] === '*')) + continue; + // convert snipped to html and add it to date-sorted list var dmItem = dmDataToSnippetItem(dmUsers[u][0], u); var timeDmItem = parseInt(dmItem.attr('data-time')); @@ -96,7 +102,7 @@ function directMsgSubmit(e) { replyText.siblings('#post-preview').hide(); - newDirectMsg(replyText.val(), $('.directMessages').attr('data-dm-screen-name')); + newDirectMsg(replyText.val(), $('.directMessages').attr('data-screen-name')); replyText.val(''); } @@ -137,7 +143,7 @@ function directMessagesPopup() { return; } - modal = openModal({ + var modal = openModal({ classAdd: 'directMessages', content: $('.direct-messages-template').children().clone(true), title: polyglot.t('Direct Messages') @@ -150,7 +156,8 @@ function directMessagesPopup() { .attr('title', polyglot.t('Mark all as read')) .on('click', function() { for (var user in _newDMsPerUser) { - _newDMsPerUser[user] = 0; + if (!user[0] === '*') + _newDMsPerUser[user] = 0; } saveDMsToStorage(); $.MAL.updateNewDMsUI(getNewDMsCount()); @@ -164,13 +171,13 @@ function openDmWithUserModal(dm_screenname) { return; } - modal = openModal({ + var modal = openModal({ classAdd: 'directMessages', content: $('.messages-thread-template').children().clone(true), title: polyglot.t('direct_messages_with', {username: '' + dm_screenname + ''}) }); - modal.self.attr('data-dm-screen-name', dm_screenname); + modal.self.attr('data-screen-name', dm_screenname); if (dm_screenname.length && dm_screenname[0] === '*') getGroupChatName(dm_screenname, modal.self.find('.modal-header h3 span')); @@ -183,12 +190,233 @@ function openDmWithUserModal(dm_screenname) { .addClass('open').appendTo(modal.content).fadeIn('fast'); } +function openGroupMessagesModal(groupAlias) { + if (!defaultScreenName) { + alert(polyglot.t('You have to log in to use group messages.')); + return; + } + + if (typeof groupAlias === 'undefined') { + var modal = openModal({ + classAdd: 'directMessages groupMessages', + content: $('.direct-messages-template').children().clone(true), + title: polyglot.t('Group Messages') + }); + + modal.content.prepend($('#group-messages-profile-modal-control-template').children().clone(true)); + + requestDMsnippetList(modal.content.find('.direct-messages-list'), true); + + modal.self.find('.mark-all-as-read') + .css('display', 'inline') + .attr('title', polyglot.t('Mark all as read')) + .on('click', function() { + for (var user in _newDMsPerUser) { + if (user[0] === '*') + _newDMsPerUser[user] = 0; + } + saveDMsToStorage(); + $.MAL.updateNewGroupDMsUI(getNewGroupDMsCount()); + }) + ; + } else { + var modal = openModal({ + classAdd: 'directMessages groupMessages', + title: polyglot.t('direct_messages_with', {username: '' + groupAlias + ''}) + }); + + modal.self.attr('data-screen-name', groupAlias); + + getGroupChatName(groupAlias, modal.self.find('.modal-header h3 span')); + + groupMsgGetGroupInfo(groupAlias, + function(req, ret) { + if (ret && ret.members.indexOf(defaultScreenName) !== -1) { + req.modal.content.append($('.messages-thread-template').children().clone(true)); + requestDmConversationModal(req.modal.content.find('.direct-messages-thread'), req.groupAlias); + + var control = $('#group-messages-messages-modal-control-template').children().clone(true) + .appendTo(req.modal.content); + control.find('.profile').on('click', {groupAlias: req.groupAlias}, + function (event) {window.location.href = $.MAL.userUrl(event.data.groupAlias);} + ); + + $('.dm-form-template').children().clone(true) + .addClass('open').appendTo(req.modal.content).fadeIn('fast'); + } + }, {groupAlias: groupAlias, modal: modal} + ); + } +} + +function openGroupMessagesNewGroupModal() { + if (!defaultScreenName) { + alert(polyglot.t('You have to log in to use group messages.')); + return; + } + + var modal = openModal({ + classAdd: 'group-messages-new-group', + content: $('#group-messages-new-group-template').children().clone(true), + title: polyglot.t('Group Messages — New Group Creation') + }); + + modal.content.find('.description').on('input', + {parentSelector: '.module', enterSelector: '.create'}, inputEnterActivator); + modal.content.find('.create').on('click', function (event) { + var elemEvent = $(event.target); + var elemForm = elemEvent.parents('.module') + + var peersToInvite = elemForm.find('.invite').val().toLowerCase().match(/@\w+/g); + if (peersToInvite) + peersToInvite = peersToInvite.join('').slice(1).split('@'); + + groupMsgCreateGroup(elemForm.find('.description').val(), peersToInvite); + + closeModal(); + }); +} + +function openGroupMessagesJoinGroupModal() { + if (!defaultScreenName) { + alert(polyglot.t('You have to log in to use group messages.')); + return; + } + + var modal = openModal({ + classAdd: 'group-messages-join-group', + content: $('#group-messages-join-group-template').children().clone(true), + title: polyglot.t('Group Messages — Join Group') + }); + + var elemGroupsList = modal.content.find('.groups-list'); + var elemGroupTemplate = $('#groups-list-item-template').children(); + groupMsgGetGroupsForPeer(defaultScreenName, + function(req, ret) { + if (ret) { + for (var i = 0; i < groupChatAliases.length; i++) { + if (ret.indexOf(groupChatAliases[i]) === -1) { + var item = req.elemGroupTemplate.clone(true).appendTo(req.elemGroupsList); + + item.find('input') + .attr('data-screen-name', groupChatAliases[i]) + .on('click', function (event) { + var elemEvent = $(event.target); + elemEvent.parents('.module').find('.join') + .attr('disabled', + !elemEvent.parents('.groups-list').find('input:checked').length); + }) + ; + item.find('.twister-user-name') + .text(groupChatAliases[i]) + .attr('href', $.MAL.userUrl(groupChatAliases[i])) + ; + getGroupChatName(groupChatAliases[i], item.find('.description')); // FIXME + } + } + } + }, {elemGroupsList: elemGroupsList, elemGroupTemplate: elemGroupTemplate} + ); + + modal.content.find('.join').on('click', function (event) { + var elemEvent = $(event.target); + var groups = elemEvent.parents('.module').find('.groups-list input:checked'); + for (var i = 0; i < groups.length; i++) + groupMsgInviteToGroup(groups[i].getAttribute('data-screen-name'), [defaultScreenName]); + + closeModal(); + }); + + modal.content.find('.secret-key-import, .username-import').on('input', importSecretKeypress); + + modal.content.find('.import-secret-key').on('click', function (event) { + var elemModule = $(event.target).parents('.module'); + var groupAlias = elemModule.find('.username-import').val().toLowerCase(); + var secretKey = elemModule.find('.secret-key-import').val(); + + twisterRpc('importprivkey', [secretKey, groupAlias], + function(req, ret) { + groupMsgInviteToGroup(req.groupAlias, [defaultScreenName]); + closeModal(); + }, {groupAlias: groupAlias}, + function(req, ret) { + alert(polyglot.t('Error in \'importprivkey\'', {rpc: ret.message})); + }, null + ); + }); +} + +function groupMsgCreateGroup(description, peersToInvite) { + if (!peersToInvite) + peersToInvite = []; + + twisterRpc('creategroup', [description], + function(peersToInvite, ret) { + groupMsgInviteToGroup(ret, peersToInvite.push(defaultScreenName)); + }, peersToInvite, + function(req, ret) { + alert(polyglot.t('error', {error: 'can\'t create group — ' + ret.message})); + }, null + ); +} + +function groupMsgInviteToGroup(groupAlias, peersToInvite) { + _groupMsgInviteToGroupQueue.push({groupAlias: groupAlias, peersToInvite: peersToInvite}); + + if (_groupMsgInviteToGroupQueue.length === 1) + doGroupMsgInviteToGroup(); +} + +function doGroupMsgInviteToGroup() { + twisterRpc('newgroupinvite', + [defaultScreenName, lastPostId + 1, + _groupMsgInviteToGroupQueue[0].groupAlias, _groupMsgInviteToGroupQueue[0].peersToInvite], + function(req, ret) { + incLastPostId(); + _groupMsgInviteToGroupQueue.shift(); + if (_groupMsgInviteToGroupQueue.length) + setTimeout(doGroupMsgInviteToGroup, 200); + }, null, + function(req, ret) { + alert(polyglot.t('error', + {error: 'can\'t invite ' + req[1] + ' to ' + req[0] + ' group — ' + ret.message})); + _groupMsgInviteToGroupQueue.shift(); + if (_groupMsgInviteToGroupQueue.length) + setTimeout(doGroupMsgInviteToGroup, 200); + }, [_groupMsgInviteToGroupQueue[0].groupAlias, _groupMsgInviteToGroupQueue[0].peersToInvite] + ); +} + +function groupMsgLeaveGroup(groupAlias, cbFunc, cbArgs) { + twisterRpc('leavegroup', [defaultScreenName, groupAlias], + cbFunc, cbArgs, + function(req, ret) {alert(polyglot.t('error', {error: 'can\'t leave group — ' + ret.message}));}, null + ); +} + +function groupMsgGetGroupsForPeer(peer, cbFunc, cbArgs) { + twisterRpc('listgroups', [peer], + cbFunc, cbArgs, + function(req, ret) {alert(polyglot.t('error', {error: 'can\'t list groups — ' + ret.message}));}, null + ); +} + +function groupMsgGetGroupInfo(groupAlias, cbFunc, cbArgs) { + twisterRpc('getgroupinfo', [groupAlias], + cbFunc, cbArgs, + function(req, ret) {alert(polyglot.t('error', {error: 'can\'t get group info — ' + ret.message}));}, null + ); +} + function initInterfaceDirectMsg() { - $('.direct-messages').attr('href','#directmessages'); - $('.userMenu-messages a').attr('href','#directmessages'); + $('.direct-messages').attr('href', '#directmessages'); + $('.userMenu-messages a').attr('href', '#directmessages'); + $('.groupmessages').attr('href', '#groupmessages'); + $('.userMenu-groupmessages a').attr('href', '#groupmessages'); $('#dm-snippet-template').on('click', function() { - window.location.hash = '#directmessages?user=' + $(this).attr('data-dm-screen-name'); + var alias = $(this).attr('data-screen-name'); + window.location.hash = '#directmessages?' + (alias[0] === '*' ? 'group' : 'user') + '=' + alias; }); $('.dm-submit').on('click', directMsgSubmit); @@ -196,5 +424,63 @@ function initInterfaceDirectMsg() { window.location.hash = '#directmessages?user=' + $(this).closest('[data-screen-name]').attr('data-screen-name'); }); -} + $('.group-messages-control .invite').on('click', function (event) { + $(event.target).siblings('.invite-form').toggle(); + }); + + $('.group-messages-control .invite-form input').on('input', + {parentSelector: '.invite-form', enterSelector: 'button'}, inputEnterActivator); + + $('.group-messages-control .invite-form button').on('click', function (event) { + var elemEvent = $(event.target); + var elemInput = elemEvent.siblings('input'); + var peersToInvite = elemInput.val().toLowerCase().match(/@\w+/g); + if (peersToInvite) + peersToInvite = peersToInvite.join('').slice(1).split('@'); + + groupMsgInviteToGroup(elemEvent.closest('[data-screen-name]').attr('data-screen-name'), + peersToInvite); + + elemInput.val(''); + elemEvent.parents('.invite-form').toggle(); + + // TODO reload group members list + }); + + $('.group-messages-control .join').on('click', function () { + window.location.hash = '#groupmessages+joingroup'; + }); + + $('.group-messages-control .leave').on('click', function (event) { + var elemEvent = $(event.target); + var groupAlias = elemEvent.closest('[data-screen-name]').attr('data-screen-name'); + confirmPopup(event, { + titleTxt: polyglot.t('сonfirm_group_leaving_header'), + messageTxt: polyglot.t('сonfirm_group_leaving_body', {alias: groupAlias}), + confirmFunc: function (groupAlias) { + groupMsgLeaveGroup(groupAlias, function () {history.back();}); + }, + confirmFuncArgs: groupAlias + }); + }); + + $('.group-messages-control .new').on('click', function () { + window.location.hash = '#groupmessages+newgroup'; + }); + + $('.group-messages-control .secret-key').on('click', promptCopyAttrData); + + $('.group-messages-control .show-secret-key').on('click', function (event) { + var elemEvent = $(event.target); + var elemSecretKey = elemEvent.siblings('.secret-key') + .toggle(); + if (elemSecretKey.css('display') !== 'none') { + dumpPrivkey(elemEvent.closest('[data-screen-name]').attr('data-screen-name'), + function(req, ret) {req.text(ret).attr('data', ret);}, + elemSecretKey + ); + } else + elemSecretKey.text('').attr('data', ''); + }); +} diff --git a/js/twister_following.js b/js/twister_following.js index 46c5b90..6df7f0f 100644 --- a/js/twister_following.js +++ b/js/twister_following.js @@ -710,7 +710,7 @@ function initUserSearch() { $('.following-config-method-buttons .public-following') .on('click', function(e) { setFollowingMethod(e); - closeModalHandler('.prompt-wrapper'); + closePrompt(); window.setTimeout(loadModalFromHash, 500); // delay reload so dhtput may do it's job }) ; diff --git a/js/twister_formatpost.js b/js/twister_formatpost.js index c7f65c4..d113266 100644 --- a/js/twister_formatpost.js +++ b/js/twister_formatpost.js @@ -257,7 +257,7 @@ function setPostInfoSent(n, k, item) { function dmDataToSnippetItem(dmData, remoteUser) { var dmItem = $("#dm-snippet-template").clone(true); dmItem.removeAttr('id'); - dmItem.attr("data-dm-screen-name",remoteUser); + dmItem.attr('data-screen-name', remoteUser); dmItem.attr("data-last_id", dmData.id); dmItem.attr("data-time", dmData.time); diff --git a/js/twister_newmsgs.js b/js/twister_newmsgs.js index 27b3cf6..38214c9 100644 --- a/js/twister_newmsgs.js +++ b/js/twister_newmsgs.js @@ -117,8 +117,25 @@ function requestMentionsCount() { if (newDMs) { $.MAL.soundNotifyDM(); - if ($.Options.showDesktopNotifDMs.val === 'enable') - $.MAL.showDesktopNotif(false, polyglot.t('You got')+' '+polyglot.t('new_direct_messages', newDMs)+'.', false, 'twister_notification_new_DMs', $.Options.showDesktopNotifDMsTimer.val, function(){$.MAL.showDMchat()}, false) + if ($.Options.showDesktopNotifDMs.val === 'enable') { + $.MAL.showDesktopNotif(false, + polyglot.t('You got') + ' ' + polyglot.t('new_direct_messages', newDMs) + '.', + false, 'twister_notification_new_DMs', $.Options.showDesktopNotifDMsTimer.val, + function () {$.MAL.showDMchat();}, false + ); + } + } + var newDMs = getNewGroupDMsCount(); + if (newDMs) { + $.MAL.soundNotifyDM(); + + if ($.Options.showDesktopNotifDMs.val === 'enable') { + $.MAL.showDesktopNotif(false, + polyglot.t('You got') + ' ' + polyglot.t('new_group_messages', newDMs) + '.', + false, 'twister_notification_new_DMs', $.Options.showDesktopNotifDMsTimer.val, + function () {$.MAL.showDMchat({group: true});}, false + ); + } } } } @@ -197,6 +214,7 @@ function requestDMsCount() { if (_newDMsUpdated) { saveDMsToStorage(); $.MAL.updateNewDMsUI(getNewDMsCount()); + $.MAL.updateNewGroupDMsUI(getNewGroupDMsCount()); } }, null, function(req, ret) {console.warn('ajax error:' + ret);}, null @@ -207,7 +225,18 @@ function getNewDMsCount() { var newDMs = 0; for (var user in _newDMsPerUser) { - if (_newDMsPerUser[user]) + if (!user[0] === '*' && _newDMsPerUser[user]) + newDMs += _newDMsPerUser[user]; + } + + return newDMs; +} + +function getNewGroupDMsCount() { + var newDMs = 0; + + for (var user in _newDMsPerUser) { + if (user[0] === '*' && _newDMsPerUser[user]) newDMs += _newDMsPerUser[user]; } @@ -220,6 +249,7 @@ function resetNewDMsCountForUser(user, lastId) { saveDMsToStorage(); $.MAL.updateNewDMsUI(getNewDMsCount()); + $.MAL.updateNewGroupDMsUI(getNewGroupDMsCount()); } function updateGroupList() { @@ -232,6 +262,7 @@ function updateGroupList() { function initDMsCount() { loadDMsFromStorage(); $.MAL.updateNewDMsUI(getNewDMsCount()); + $.MAL.updateNewGroupDMsUI(getNewGroupDMsCount()); //quick hack to obtain list of group chat aliases updateGroupList(); setInterval(updateGroupList, 60000); diff --git a/theme_calm/css/profile.css b/theme_calm/css/profile.css index 929edc9..96aed93 100644 --- a/theme_calm/css/profile.css +++ b/theme_calm/css/profile.css @@ -62,34 +62,14 @@ color: #f8f8f8; } -.profile-card-buttons -{ - position: absolute; - bottom: 30px; - right: 0; +.profile-card-buttons { + padding: 4px 0; } -.profile-card-buttons .direct-messages-with-user, -.profile-card-buttons .mentions-from-user, -.profile-card-buttons .follow, -.profile-card-buttons .unfollow -{ - display: inline; - padding: 4px 12px; - font-size: 12px; - width: auto; - text-align: center; - color: rgba( 0, 0, 0, .7 ); - background: rgba( 0, 0, 0, .1 ); - border: none; - transition: all .2s linear; -} - -.profile-card-buttons .direct-messages-with-user:hover, -.profile-card-buttons .mentions-from-user:hover -{ - color: #fff; - background: #b2d67b; +.twister-user-info .profile-card-buttons { + position: absolute; + top: 0; + right: 0; } .profile-card.forEdition @@ -397,3 +377,32 @@ h2.profile-screen-name { .profile-modal a.profile-bio:empty { display: none; } + +.group-messages-control .invite-form, .group-messages-control .secret-key { + display: none; + font-size: 12px; + text-align: center; + padding: 4px 0; +} + +.group-messages-control .invite-form input { + border: solid 1px rgba(0, 0, 0, .3); + vertical-align: middle; + width: 73%; + margin: 0 4px; +} + +.group-messages-control .invite-form input:focus { + border: solid 1px rgba(118, 145, 206, .8); +} + +.group-messages-control .invite-form button { + color: #DDD; + background-color: #45474D; + border: medium none; + vertical-align: middle; +} + +.group-messages-control .invite-form button:hover { + color: #FFF; +} diff --git a/theme_calm/css/style.css b/theme_calm/css/style.css index 67791ca..fe7191e 100644 --- a/theme_calm/css/style.css +++ b/theme_calm/css/style.css @@ -107,28 +107,24 @@ h3 ************** BUTTONS *************** **************************************/ -button -{ +button { + color: rgba(255, 255, 255, .8); background: #45474d; - color: rgba( 255, 255, 255, .8 ); border: none; padding: 5px 10px; cursor: pointer; } -button:hover -{ +button:hover { color: #fff; } -button.disabled -{ +button:disabled, button.disabled { opacity: .4; } -button.disabled:hover -{ - color: rgba( 255, 255, 255, .8 ); +button:disabled:hover, button.disabled:hover { + color: rgba(255, 255, 255, .8); } button.follow, button.unfollow, .following-list button.private { @@ -172,11 +168,32 @@ button.unfollow:hover { margin-right: 10px; } +.b-buttons { + text-align: right; + padding: 4px; +} + +.b-buttons button { + color: rgba(0, 0, 0, .7); + background-color: rgba(0, 0, 0, .08); + border: none; + font-size: 12px; + text-align: center; + width: auto; + padding: 4px 12px; + transition: all .1s linear; +} + +.b-buttons button:hover { + color: #FFF; + background: #B2D67B; +} + /************************************* -**************************** MENU ***** +**************** MENU **************** **************************************/ -.userMenu -{ + +.userMenu { width: 900px; position: fixed; left: 50%; @@ -185,11 +202,13 @@ button.unfollow:hover { background: #43464d; z-index: 2; } + .userMenu.w1200 { width: 1200px; margin-left: -600px; } -.userMenu:after{ + +.userMenu:after { position: absolute; content: ''; width: 9999px; @@ -197,7 +216,8 @@ button.unfollow:hover { background: #43464d; z-index: -999; } -.userMenu:before{ + +.userMenu:before { position: absolute; content: ''; width: 9999px; @@ -206,16 +226,14 @@ button.unfollow:hover { background: #43464d; z-index: -999; } -.userMenu > ul -{ -} -.userMenu > ul > li -{ + +.userMenu > ul > li { float: left; + height: 40px; margin: 0; } -.userMenu > ul > li > a -{ + +.userMenu > ul > li > a { line-height: 40px; height: 40px; padding: 0 20px 0 45px; @@ -227,119 +245,87 @@ button.unfollow:hover { transition: all .2s linear; position: relative; } -.userMenu li > a:hover -{ + +.userMenu li:hover, .userMenu li:active { + background-color: rgba(0, 0, 0 , .4); +} + +.userMenu li:hover > a, .userMenu li:active > a { text-decoration: none; opacity: 1; } -.userMenu li.current > a -{ + +.userMenu li.current { + background-color: #768FCE; +} + +.userMenu li.current > a { color: #fff; opacity: 1; } -.userMenu li.userMenu-home > a -{ + +.userMenu li.userMenu-home > a { background: url(../img/home.png) no-repeat center center; padding-left: 40px; } -.userMenu li.userMenu-home:hover > a -{ - background: url(../img/home.png) no-repeat center center rgba( 0, 0, 0 , .4 ); -} -.userMenu li.userMenu-home.current > a -{ - background: url(../img/home.png) no-repeat center center #768fce; -} -.userMenu li.userMenu-connections > a -{ + +.userMenu li.userMenu-connections > a { background: url(../img/connections.png) no-repeat center center; opacity: 1; } -.userMenu li.userMenu-connections:hover > a -{ - background: url(../img/connections.png) no-repeat center center rgba( 0, 0, 0 , .4 ); -} -.userMenu li.userMenu-connections.current > a -{ - background: url(../img/connections.png) no-repeat 5px center #b43e34; -} -.userMenu li.userMenu-network > a -{ + +.userMenu li.userMenu-network > a { background: url(../img/network.png) no-repeat 5px center; padding-left: 60px; } -.userMenu li.userMenu-network:hover > a -{ - background: url(../img/network.png) no-repeat 5px center rgba( 0, 0, 0 , .4 ); -} -.userMenu li.userMenu-network.current > a -{ - background: url(../img/network.png) no-repeat 5px center #768fce; -} -.userMenu li.userMenu-following > a -{ +.userMenu li.userMenu-following > a { background: url(../img/following.png) no-repeat 5px center; padding-left: 50px; } -.userMenu li.userMenu-following:hover > a -{ - background: url(../img/following.png) no-repeat 5px center rgba( 0, 0, 0 , .4 ); -} -.userMenu li.userMenu-following.current > a -{ - background: url(../img/following.png) no-repeat 5px center #768fce; -} -.userMenu li.userMenu-options > a -{ + +.userMenu li.userMenu-options > a { background: url(../img/switch.png) no-repeat 5px center; padding-left: 50px; } -.userMenu li.userMenu-options:hover > a -{ - background: url(../img/switch.png) no-repeat 5px center rgba( 0, 0, 0 , .4 ); -} -.userMenu li.userMenu-options.current > a -{ - background: url(../img/switch.png) no-repeat 5px center #768fce; -} -.userMenu li.userMenu-messages > a -{ + +.userMenu li.userMenu-messages > a { background: url(../img/messages.png) no-repeat center center; padding: 0 25px 0 35px; opacity: 1; } -.userMenu li.userMenu-messages:hover > a -{ - background: url(../img/messages.png) no-repeat center center rgba( 0, 0, 0 , .4 ); + +.userMenu li.userMenu-messages > a:empty { + padding: 0 20px 0 30px; + opacity: .7; } -.userMenu li.userMenu-messages.current > a -{ - background: url(../img/messages.png) no-repeat center center #b43e34; + +.userMenu li.userMenu-groupmessages > a { + background: url(../img/groupmessages.png) no-repeat center center; + background-size: 22px 22px; + padding: 0 24px; + opacity: 0.9; } -.userMenu li.userMenu-profile > a -{ + +.userMenu li.userMenu-profile > a { background: url(../img/profile.png) no-repeat 5px center; padding-left: 35px; } -.userMenu li.userMenu-profile:hover > a -{ - background: url(../img/profile.png) no-repeat 5px center rgba( 0, 0, 0 , .4 ); -} -.userMenu li.userMenu-profile.current > a -{ - background: url(../img/profile.png) no-repeat 5px center #768fce; -} -.userMenu li.userMenu-config -{ + +.userMenu li.userMenu-config { float: right; position: relative; } -.userMenu li.userMenu-search -{ + +.userMenu li.userMenu-search { float: right; position: relative; } + +.userMenu li.userMenu-search:hover { + background-color: transparent; +} + input.userMenu-search-field::-webkit-input-placeholder { color: #4d4d4d; font-style: italic; @@ -368,24 +354,20 @@ input.userMenu-search-field:focus::-moz-placeholder { input.userMenu-search-field:focus::-ms-input-placeholder { color: #fff; } -.userMenu li.userMenu-config > a -{ + +.userMenu li.userMenu-config > a { background: url(../img/config.png) no-repeat 5px center; padding: 0 30px 0 45px; } -.userMenu li.userMenu-config > a:after -{ + +.userMenu li.userMenu-config > a:after { content: "▼"; position: absolute; font-size: 10px; transition: all .2 linear; margin-left: 8px; } -.userMenu li.userMenu-config:hover > a, -.userMenu li.userMenu-config:active > a -{ - background: url(../img/config.png) no-repeat 5px center rgba( 0, 0, 0 , .4 ); -} + .userMenu li.userMenu-dhtindicator { background: #000; width: 70px; @@ -402,6 +384,7 @@ input.userMenu-search-field:focus::-ms-input-placeholder { transition: all 200ms; border-radius: 10px; } + .userMenu li.userMenu-dhtindicator a { display: inline-block; font: 12px/25px "Open Sans", sans-serif; @@ -410,6 +393,7 @@ input.userMenu-search-field:focus::-ms-input-placeholder { height: 25px; opacity: .9; } + .userMenu li.userMenu-dhtindicator a:before { content: 'DHT:'; display: inline-block; @@ -418,19 +402,15 @@ input.userMenu-search-field:focus::-ms-input-placeholder { width: 70px; height: 25px; } + .userMenu li.userMenu-dhtindicator:hover { opacity: 1; -webkit-box-shadow: inset 0 0 15px #000; -moz-box-shadow: inset 0 0 15px #000; box-shadow: inset 0 0 15px #000; } -.userMenu li.userMenu-messages > a:empty -{ - padding: 0 20px 0 30px; - opacity: .7; -} -.wrapper -{ + +.wrapper { width: 900px; margin: 0 auto; background: #e0e6f5; @@ -439,15 +419,18 @@ input.userMenu-search-field:focus::-ms-input-placeholder { z-index: 1; min-height: 100%; } + .wrapper.w1200 { width: 1200px; padding: 55px 7px 15px 7px; } + .dashboard.left { width: 320px; position: fixed; top: 55px; } + .dashboard.right { width: 320px; position: fixed; @@ -455,18 +438,18 @@ input.userMenu-search-field:focus::-ms-input-placeholder { margin-left: 864px; } -.module -{ +.module { border: solid 1px rgba( 69, 71, 77, .1 ); background: #f3f5fb; } + .dashboard .module { margin: 0 0 3%; border-radius: 6px; } -.messages-qtd -{ + +.messages-qtd { position: absolute; background: #ef0807; color: #fff; @@ -475,10 +458,11 @@ input.userMenu-search-field:focus::-ms-input-placeholder { font-size: 8px; margin-top: 4px; } -.userMenu-connections .messages-qtd -{ + +.userMenu-connections .messages-qtd { margin: 4px 0 0 -5px; } + /******************************************************* ****************** CONFIG SUBMENU & SEARCH RESULTS ***** *******************************************************/ @@ -1962,6 +1946,100 @@ textarea.splited-post { content: '\2714'; } +/************************************* +****** GM NEW GROUP SETUP MODAL ****** +**************************************/ + +.group-messages-new-group.modal-wrapper { + height: auto; /*about 320px*/ + margin-top: -160px; +} + +.group-messages-new-group .modal-content .module { + margin: 4px; +} + +.group-messages-new-group .modal-content div div { + width: 100%; + margin: 4px 0; + padding: 4px 12px; +} + +.group-messages-new-group .modal-content div div:last-child { + text-align: right; +} + +.group-messages-new-group .modal-content div div:last-child button { + margin: 8px 4px; +} + +.group-messages-new-group .modal-content textarea { + border: solid 1px rgba(0, 0, 0, .3); + border-radius: 3px; + width: 500px; + height: 56px; + resize: none; + margin: 12px 16px; + padding: 2px 4px; +} + +.group-messages-new-group .modal-content textarea:focus { + border: solid 1px rgba(118, 145, 206, .8); + box-shadow: 0 0 10px rgba(0, 0, 0, .3); +} + +/************************************* +****** GM JOIN GROUP SETUP MODAL ***** +**************************************/ + +.group-messages-join-group.modal-wrapper { + height: auto; /*about 360px*/ + margin-top: -240px; +} + +.group-messages-join-group .modal-content .module { + margin: 4px; +} + +.group-messages-join-group .modal-content div div { + width: 100%; + margin: 4px 0; + padding: 4px 12px; +} + +.group-messages-join-group .modal-content div div:last-child { + text-align: right; +} + +.group-messages-join-group .modal-content div div:last-child button { + margin: 8px 4px; +} + +.group-messages-join-group .modal-content input { + border: solid 1px rgba(0, 0, 0, .3); + border-radius: 3px; + width: 500px; + margin: 12px 16px; + padding: 2px 4px; +} + +.group-messages-join-group .modal-content input:focus { + border: solid 1px rgba(118, 145, 206, .8); + box-shadow: 0 0 10px rgba(0, 0, 0, .3); +} + +.group-messages-join-group .modal-content input[type='checkbox'] { + display: inline; + width: auto; + margin: 2px; +} + +.group-messages-join-group .modal-content .groups-list { + height: 120px; + overflow-y: auto; + margin: 8px 8px 0; +} + /************************************* *********** NEW USER MODAL *********** **************************************/ @@ -2087,6 +2165,7 @@ textarea.splited-post { .prompt-wrapper { background: rgba(255,255,255, 1.0); + font-size: 13px; z-index: 5; position: fixed; top: 50%; @@ -2107,6 +2186,20 @@ textarea.splited-post { margin: 4px; } +/************************************* +*********** CONFIRM POPUP ************ +**************************************/ + +.confirm-popup .message { + text-align: center; + margin: 12px; +} + +.confirm-popup .modal-buttons { + text-align: center; + padding: 4px; +} + /************************************* ****** FOLLOWING-CONFIG PROMPT ******* **************************************/ diff --git a/theme_nin/css/style.css b/theme_nin/css/style.css index 6aba4c4..447a746 100644 --- a/theme_nin/css/style.css +++ b/theme_nin/css/style.css @@ -56,7 +56,7 @@ font-style: normal; } /* line 64, ../sass/_fonts.sass */ -[class^="icon-"]:before, [class*=" icon-"]:before, .extend-icon:before, .userMenu li.userMenu-config > a:before, .post-retransmited-icon:before, .post-reply:before, .post-propagate:before, .post-favorite:before, .post .show-more:before, .mini-profile-actions span:before, ul.userMenu-search-profiles button:before, .mini-profile-indicators .userMenu-connections a:before, .mini-profile-indicators .userMenu-messages a:before, .mini-profile-indicators .userMenu-user a:before, .twister-user-remove:before, .refresh-toptrends:before, .twistday-reminder .refresh:before, .refresh-users:before, .modal-close:before, .mark-all-as-read:before, .modal-back:before, .icon-down-after:after { +[class^="icon-"]:before, [class*=" icon-"]:before, .extend-icon:before, .userMenu li.userMenu-config > a:before, .post-retransmited-icon:before, .post-reply:before, .post-propagate:before, .post-favorite:before, .post .show-more:before, .mini-profile-actions span:before, ul.userMenu-search-profiles button:before, .mini-profile-indicators .userMenu-connections a:before, .mini-profile-indicators .userMenu-messages a:before, .twister-user-remove:before, .refresh-toptrends:before, .twistday-reminder .refresh:before, .refresh-users:before, .modal-close:before, .mark-all-as-read:before, .modal-back:before, .icon-down-after:after { font-family: "fontello"; font-style: normal; font-weight: normal; @@ -95,12 +95,6 @@ content: ""; } -/* '' */ -/* line 100, ../sass/_fonts.sass */ -.icon-user:before, .mini-profile-indicators .userMenu-user a:before { - content: ""; -} - /* '' */ /* line 105, ../sass/_fonts.sass */ .icon-camera:before { @@ -365,7 +359,8 @@ article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, display: block; } /* line 65, ../sass/_menu.sass */ -.userMenu li.userMenu-dhtindicator, .userMenu li.userMenu-connections, .userMenu li.userMenu-messages { +.userMenu li.userMenu-dhtindicator, .userMenu li.userMenu-connections, +.userMenu li.userMenu-messages, .userMenu li.userMenu-groupmessages { display: none !important; } /* line 68, ../sass/_menu.sass */ @@ -438,7 +433,7 @@ article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, padding: 0; } /* line 54, ../sass/_profile.sass */ -.profile-modal .modal-content .postboard { +.profile-modal .modal-content .postboard, .profile-modal .modal-content .members { margin-left: 0; height: 100%; bottom: 0; @@ -1703,12 +1698,12 @@ button:hover, .mini-profile-actions span:hover, a.button:hover { text-shadow: 2px 2px 0 rgba(0, 0, 0, 0.1); } /* line 85, ../sass/_commons.sass */ -button.disabled, .mini-profile-actions span.disabled, a.button.disabled { +button:disabled, button.disabled, .mini-profile-actions span.disabled, a.button.disabled { opacity: 0.5; background-color: #999; } /* line 88, ../sass/_commons.sass */ -button.disabled:hover, .mini-profile-actions span.disabled:hover, a.button.disabled:hover { +button:disabled:hover, button.disabled:hover, .mini-profile-actions span.disabled:hover, a.button.disabled:hover { color: white; } @@ -1981,6 +1976,7 @@ ul.userMenu-search-profiles button:after, ul.userMenu-search-profiles .mini-prof position: relative; text-align: center; background: white; + padding: 1em; } /* line 152, ../sass/style.sass */ .mini-profile a.button { @@ -2007,8 +2003,8 @@ ul.userMenu-search-profiles button:after, ul.userMenu-search-profiles .mini-prof /* line 169, ../sass/style.sass */ .mini-profile-indicators { - margin: 0 0 1em 0; background-color: #f3f2f1; + text-align: center; } /* line 173, ../sass/style.sass */ .mini-profile-indicators li { @@ -2016,7 +2012,6 @@ ul.userMenu-search-profiles button:after, ul.userMenu-search-profiles .mini-prof -webkit-box-sizing: border-box; box-sizing: border-box; display: block; - width: 100px; float: left; font-size: 0.8em; position: relative; @@ -2050,6 +2045,21 @@ ul.userMenu-search-profiles button:after, ul.userMenu-search-profiles .mini-prof padding-top: 0.2em; } +.mini-profile-indicators .userMenu-connections, .mini-profile-indicators .userMenu-messages { + width: 30%; +} + +.mini-profile-indicators .userMenu-groupmessages { + width: 40%; +} + +.mini-profile-indicators .userMenu-groupmessages a:before { + content: ""; + background: transparent url("../img/groupmessages.png") no-repeat scroll center center; + background-size: 24px 24px; + height: 1em; +} + /* line 208, ../sass/style.sass */ .messages-qtd { position: absolute; @@ -2971,6 +2981,140 @@ ol.toptrends-list a:hover { left: auto; } + +.group-messages-control .invite-form, .group-messages-control .secret-key { + display: none; + font-size: 12px; + text-align: center; + padding: 4px 0; +} + +.group-messages-control .invite-form input { + border: 1px solid rgba(0, 0, 0, .1); + vertical-align: middle; + width: 73%; + margin: 0 4px; +} + +.group-messages-control .invite-form input:focus { + border-bottom: solid 1px #B4C669; +} + +.group-messages-control .invite-form button { + vertical-align: middle; +} + +.group-messages-control.b-buttons { + padding: 4px; +} + +.profile-card-buttons.group-messages-control.b-buttons { + text-align: center; +} + +.profile-card-buttons.group-messages-control.b-buttons button { + margin: 2px 0; +} + +/************************************* +****** GM NEW GROUP SETUP MODAL ****** +**************************************/ + +.group-messages-new-group.modal-wrapper { + width: 580px; + height: auto; /*about 320px*/ + margin: -180px 0 0 -290px; +} + +.group-messages-new-group .modal-content { + padding: 0; +} + +.group-messages-new-group .modal-content .module { + margin: 4px; +} + +.group-messages-new-group .modal-content div div { + margin: 4px 0; + padding: 4px 12px; +} + +.group-messages-new-group .modal-content div div:last-child { + text-align: right; +} + +.group-messages-new-group .modal-content div div:last-child button { + margin: 8px 4px; +} + +.group-messages-new-group .modal-content textarea { + border: 1px solid rgba(0, 0, 0, .1); + width: 500px; + height: 56px; + resize: none; + margin: 12px 16px; + padding: 2px 4px; +} + +.group-messages-new-group .modal-content textarea:focus { + border-bottom: solid 1px #B4C669; +} + +/************************************* +****** GM JOIN GROUP SETUP MODAL ***** +**************************************/ + +.group-messages-join-group.modal-wrapper { + width: 580px; + height: auto; /*about 360px*/ + margin: -250px 0 0 -290px; +} + +.group-messages-join-group .modal-content { + padding: 0; +} + +.group-messages-join-group .modal-content .module { + margin: 4px; +} + +.group-messages-join-group .modal-content div div { + margin: 4px 0; + padding: 4px 12px; +} + +.group-messages-join-group .modal-content div div:last-child { + text-align: right; +} + +.group-messages-join-group .modal-content div div:last-child button { + margin: 8px 4px; +} + +.group-messages-join-group .modal-content input { + border: 1px solid rgba(0, 0, 0, .1); + width: 500px; + margin: 12px 16px; + padding: 2px 4px; +} + +.group-messages-join-group .modal-content input:focus { + border-bottom: solid 1px #B4C669; +} + +.group-messages-join-group .modal-content input[type='checkbox'] { + display: inline; + width: auto; + margin: 2px; +} + +.group-messages-join-group .modal-content .groups-list { + background-color: #FFF; + height: 120px; + overflow-y: auto; + margin: 8px 8px 0; +} + /********* NEW USER MODAL************* */ .new-user.modal-wrapper {