diff --git a/src/App/Page.php b/src/App/Page.php index e22625212..965c04915 100644 --- a/src/App/Page.php +++ b/src/App/Page.php @@ -253,6 +253,11 @@ class Page implements ArrayAccess '$touch_icon' => $touch_icon, '$block_public' => intval($config->get('system', 'block_public')), '$stylesheets' => $this->stylesheets, + '$likeError' => $l10n->t('Like not successfull'), + '$dislikeError' => $l10n->t('Dislike not successfull'), + '$announceError' => $l10n->t('Sharing not successfull'), + '$srvError' => $l10n->t('Backend error'), + '$netError' => $l10n->t('Network error'), ]) . $this->page['htmlhead']; } diff --git a/src/Core/System.php b/src/Core/System.php index 107303d6a..bf3f247dd 100644 --- a/src/Core/System.php +++ b/src/Core/System.php @@ -445,34 +445,28 @@ class System */ public static function getLoadAvg(bool $get_processes = true): array { + $load_arr = sys_getloadavg(); + if (empty($load_arr)) { + return []; + } + + $load = [ + 'average1' => $load_arr[0], + 'average5' => $load_arr[1], + 'average15' => $load_arr[2], + 'runnable' => 0, + 'scheduled' => 0 + ]; + if ($get_processes && @is_readable('/proc/loadavg')) { $content = @file_get_contents('/proc/loadavg'); - if (empty($content)) { - $content = shell_exec('uptime | sed "s/.*averages*: //" | sed "s/,//g"'); + if (!empty($content) && preg_match("#([.\d]+)\s([.\d]+)\s([.\d]+)\s(\d+)/(\d+)#", $content, $matches)) { + $load['runnable'] = (float)$matches[4]; + $load['scheduled'] = (float)$matches[5]; } } - if (empty($content) || !preg_match("#([.\d]+)\s([.\d]+)\s([.\d]+)\s(\d+)/(\d+)#", $content, $matches)) { - $load_arr = sys_getloadavg(); - if (empty($load_arr)) { - return []; - } - return [ - 'average1' => $load_arr[0], - 'average5' => $load_arr[1], - 'average15' => $load_arr[2], - 'runnable' => 0, - 'scheduled' => 0 - ]; - } - - return [ - 'average1' => (float)$matches[1], - 'average5' => (float)$matches[2], - 'average15' => (float)$matches[3], - 'runnable' => (float)$matches[4], - 'scheduled' => (float)$matches[5] - ]; + return $load; } /** diff --git a/src/Core/Worker.php b/src/Core/Worker.php index 9d1fde85c..70ba0ffe4 100644 --- a/src/Core/Worker.php +++ b/src/Core/Worker.php @@ -662,16 +662,24 @@ class Worker DBA::close($r); } + $stamp = (float)microtime(true); + $used = 0; + $sleep = 0; + $data = DBA::p("SHOW PROCESSLIST"); + while ($row = DBA::fetch($data)) { + if ($row['Command'] != 'Sleep') { + ++$used; + } else { + ++$sleep; + } + } + DBA::close($data); + self::$db_duration += (microtime(true) - $stamp); + // If $max is set we will use the processlist to determine the current number of connections // The processlist only shows entries of the current user if ($max != 0) { - $stamp = (float)microtime(true); - $r = DBA::p('SHOW PROCESSLIST'); - self::$db_duration += (microtime(true) - $stamp); - $used = DBA::numRows($r); - DBA::close($r); - - Logger::info('Connection usage (user values)', ['usage' => $used, 'max' => $max]); + Logger::info('Connection usage (user values)', ['working' => $used, 'sleeping' => $sleep, 'max' => $max]); $level = ($used / $max) * 100; @@ -695,11 +703,11 @@ class Worker if (!DBA::isResult($r)) { return false; } - $used = intval($r['Value']); + $used = max($used, intval($r['Value'])) - $sleep; if ($used == 0) { return false; } - Logger::info('Connection usage (system values)', ['used' => $used, 'max' => $max]); + Logger::info('Connection usage (system values)', ['working' => $used, 'sleeping' => $sleep, 'max' => $max]); $level = $used / $max * 100; diff --git a/view/lang/C/messages.po b/view/lang/C/messages.po index 52888018b..3c45d3670 100644 --- a/view/lang/C/messages.po +++ b/view/lang/C/messages.po @@ -673,7 +673,27 @@ msgid "" "notifications." msgstr "" -#: src/App/Page.php:320 +#: src/App/Page.php:256 +msgid "Like not successfull" +msgstr "" + +#: src/App/Page.php:257 +msgid "Dislike not successfull" +msgstr "" + +#: src/App/Page.php:258 +msgid "Sharing not successfull" +msgstr "" + +#: src/App/Page.php:259 +msgid "Backend error" +msgstr "" + +#: src/App/Page.php:260 +msgid "Network error" +msgstr "" + +#: src/App/Page.php:325 msgid "toggle mobile" msgstr "" diff --git a/view/theme/frio/js/theme.js b/view/theme/frio/js/theme.js index 60aa88ba5..9196858bb 100644 --- a/view/theme/frio/js/theme.js +++ b/view/theme/frio/js/theme.js @@ -764,12 +764,95 @@ function htmlToText(htmlString) { * @param {boolean} un Whether to perform an activity removal instead of creation */ function doActivityItemAction(ident, verb, un) { - if (verb.indexOf("attend") === 0) { - $(".item-" + ident + " .button-event:not(#" + verb + "-" + ident + ")").removeClass("active"); + _verb = un ? 'un' + verb : verb; + var thumbsClass = ''; + switch (verb) { + case 'like': + thumbsClass = 'fa-thumbs-up'; + break; + case 'dislike': + thumbsClass = 'fa-thumbs-down'; + break; + case 'announce': + thumbsClass = 'fa-retweet'; } - $("#" + verb + "-" + ident).toggleClass("active"); - - doActivityItem(ident, verb, un); + if (verb.indexOf('announce') === 0 ) { + // Share-Button(s) + // remove share-symbol, to replace it by rotator + $('button[id^=shareMenuOptions-' + ident.toString() + '] i:first-child').removeClass('fa-share'); + $('button[id^=announce-' + ident.toString() + '] i:first-child').removeClass('fa-retweet'); + // avoid multiple rotators on like/share-button if klicked multiple times. + if ($('img[id^=waitfor-' + verb + '-' + ident.toString() + ']').length == 0) { + // append rotator to the shareMenu-button for small media + $('') + .attr({id: 'waitfor-' + verb + '-' + ident.toString(), src: 'images/rotator.gif'}) + .addClass('fa') + .appendTo($('button[id^=shareMenuOptions-' + ident.toString() + '] i:first-child' )); + } + } + $('button[id^=' + verb + '-' + ident.toString() + '] i:first-child').removeClass(thumbsClass); + // if verb is announce, then one rotator is added above to the shareMedia-dropdown button + if ($('button:not(button.dropdown-toggle) img#waitfor-' + verb + '-' + ident.toString()).length == 0) { + $('') + .attr({id: 'waitfor-' + verb + '-' + ident.toString(), src: 'images/rotator.gif'}) + .addClass('fa') + .appendTo($('button[id^=' + verb + '-' + ident.toString() + '] i:first-child')); + } + $.post('item/' + ident.toString() + '/activity/' + _verb) + .success(function(data){ + $('img[id^=waitfor-' + verb + '-' + ident.toString() + ']').remove(); + if (data.status == 'ok') { + if (data.verb == 'un' + verb) { + // like/dislike buttons + $('button[id^=' + verb + '-' + ident.toString() + ']' ) + .removeClass('active') + .attr('onclick', 'doActivityItemAction(' + ident +', "' + verb + '",false )'); + // link in share-menu + $('a[id^=' + verb + '-' + ident.toString() + ']' ) + .removeClass('active') + .attr('href', 'javascript:doActivityItemAction(' + ident +', "' + verb + '",false )'); + $('a[id^=' + verb + '-' + ident.toString() + '] i:first-child' ).addClass('fa-retweet').removeClass('fa-ban'); + } else { + // like/dislike buttons + $('button[id^=' + verb + '-' + ident.toString() + ']' ) + .addClass('active') + .attr('onclick', 'doActivityItemAction(' + ident + ', "' + verb + '", true )'); + // link in share-menu + $('a[id^=' + verb + '-' + ident.toString() + ']' ) + .addClass('active') + .attr('href', 'javascript:doActivityItemAction(' + ident + ', "' + verb + '", true )'); + $('a[id^=' + verb + '-' + ident.toString() + '] i:first-child' ).removeClass('fa-retweet').addClass('fa-ban'); + } + $('button[id^=' + verb + '-' + ident.toString() + '] i:first-child').addClass(thumbsClass).show(); + if (verb.indexOf('announce') === 0 ) { + // ShareMenuButton + $('button[id^=shareMenuOptions-' + ident.toString() + '] i:first-child').addClass('fa-share'); + if (data.verb == 'un' + verb) { + $('button[id^=shareMenuOptions-' + ident.toString() + ']').removeClass('active'); + } else { + $('button[id^=shareMenuOptions-' + ident.toString() + ']').addClass('active'); + } + } + } else { + /* server-response was not ok. Database-problems or some changes in + * data? + * reset all buttons + */ + $('img[id^=waitfor-' + verb + '-' + ident.toString() + ']').remove(); + $('button[id^=shareMenuOptions-' + ident.toString() + '] i:first-child').addClass('fa-share'); + $('button[id^=' + verb + '-' + ident.toString() + '] i:first-child').addClass(thumbsClass); + $('a[id^=' + verb + '-' + ident.toString() + '] i:first-child').addClass(thumbsClass); + $.jGrowl(aActErr[verb] + '
(' + aErrType['srvErr'] + ')', {sticky: false, theme: 'info', life: 5000}); + } + }) + .error(function(data){ + // Server could not be reached successfully + $('img[id^=waitfor-' + verb + '-' + ident.toString() + ']').remove(); + $('button[id^=shareMenuOptions-' + ident.toString() + '] i:first-child').addClass('fa-share'); + $('button[id^=' + verb + '-' + ident.toString() + '] i:first-child').addClass(thumbsClass); + $('a[id^=' + verb + '-' + ident.toString() + '] i:first-child').addClass(thumbsClass); + $.jGrowl(aActErr[verb] + '
(' + aErrType['netErr'] + ')', {sticky: false, theme: 'info', life: 5000}); + }); } // Decodes a hexadecimally encoded binary string diff --git a/view/theme/frio/templates/js_strings.tpl b/view/theme/frio/templates/js_strings.tpl index c27921afd..39445a0ac 100644 --- a/view/theme/frio/templates/js_strings.tpl +++ b/view/theme/frio/templates/js_strings.tpl @@ -10,4 +10,13 @@ They are loaded into the html so that js functions can use them *}} 'blockAuthor' : "{{$blockAuthor|escape:'javascript' nofilter}}", 'ignoreAuthor' : "{{$ignoreAuthor|escape:'javascript' nofilter}}", }; + var aActErr = { + 'like' : "{{$likeError}}", + 'dislike' : "{{$dislikeError}}", + 'announce' : "{{$announceError}}", + }; + var aErrType = { + 'srvErr' : "{{$srvError}}", + 'netErr' : "{{$netError}}", + }; diff --git a/view/theme/frio/templates/like_noshare.tpl b/view/theme/frio/templates/like_noshare.tpl index df335c32e..3514d79e7 100644 --- a/view/theme/frio/templates/like_noshare.tpl +++ b/view/theme/frio/templates/like_noshare.tpl @@ -3,8 +3,7 @@ {{if !$hide_dislike}} @@ -13,9 +12,8 @@ class="btn-link button-likes{{if $responses.dislike.self}} active" aria-pressed="true{{/if}}" id="dislike-{{$id}}" title="{{$dislike_title}}" - onclick="doActivityItemAction({{$id}}, 'dislike'{{if $responses.dislike.self}}, true{{/if}});" - data-toggle="button"> {{$dislike}} + onclick="doActivityItemAction({{$id}}, 'dislike'{{if $responses.dislike.self}}, true{{/if}});"> +  {{$dislike}} {{/if}} - diff --git a/view/theme/frio/templates/wall_thread.tpl b/view/theme/frio/templates/wall_thread.tpl index e4f87f940..b4cd291b0 100644 --- a/view/theme/frio/templates/wall_thread.tpl +++ b/view/theme/frio/templates/wall_thread.tpl @@ -280,18 +280,18 @@ as the value of $top_child_total (this is done at the end of this file)
{{* Action buttons to interact with the item (like: like, dislike, share and so on *}} -
{{/if}}