diff --git a/core/css/icons.scss b/core/css/icons.scss index 7c47a3e12c..6d855381fa 100644 --- a/core/css/icons.scss +++ b/core/css/icons.scss @@ -493,16 +493,23 @@ img, object, video, button, textarea, input, select { .icon-category-installed { background-image: url('../img/actions/user.svg?v=1'); } + .icon-category-enabled { background-image: url('../img/actions/checkmark.svg?v=1'); } + .icon-category-disabled { background-image: url('../img/actions/close.svg?v=1'); } + .icon-category-app-bundles { background-image: url('../img/categories/bundles.svg?v=1'); } +.icon-category-updates { + background-image: url('../img/actions/download.svg?v=1'); +} + .icon-category-files { background-image: url('../img/categories/files.svg?v=1'); } diff --git a/settings/Controller/AppSettingsController.php b/settings/Controller/AppSettingsController.php index ac77b2e7dd..da59461e5f 100644 --- a/settings/Controller/AppSettingsController.php +++ b/settings/Controller/AppSettingsController.php @@ -52,6 +52,7 @@ class AppSettingsController extends Controller { const CAT_DISABLED = 1; const CAT_ALL_INSTALLED = 2; const CAT_APP_BUNDLES = 3; + const CAT_UPDATES = 4; /** @var \OCP\IL10N */ private $l10n; @@ -130,8 +131,10 @@ class AppSettingsController extends Controller { private function getAllCategories() { $currentLanguage = substr($this->l10nFactory->findLanguage(), 0, 2); + $updateCount = count($this->getAppsWithUpdates()); $formattedCategories = [ ['id' => self::CAT_ALL_INSTALLED, 'ident' => 'installed', 'displayName' => (string)$this->l10n->t('Your apps')], + ['id' => self::CAT_UPDATES, 'ident' => 'updates', 'displayName' => (string)$this->l10n->t('Updates'), 'counter' => $updateCount], ['id' => self::CAT_ENABLED, 'ident' => 'enabled', 'displayName' => (string)$this->l10n->t('Enabled apps')], ['id' => self::CAT_DISABLED, 'ident' => 'disabled', 'displayName' => (string)$this->l10n->t('Disabled apps')], ['id' => self::CAT_APP_BUNDLES, 'ident' => 'app-bundles', 'displayName' => (string)$this->l10n->t('App bundles')], @@ -273,6 +276,28 @@ class AppSettingsController extends Controller { return $formattedApps; } + private function getAppsWithUpdates() { + $appClass = new \OC_App(); + $apps = $appClass->listAllApps(); + foreach($apps as $key => $app) { + $newVersion = \OC\Installer::isUpdateAvailable($app['id'], $this->appFetcher); + if($newVersion !== false) { + $apps[$key]['update'] = $newVersion; + } else { + unset($apps[$key]); + } + } + usort($apps, function ($a, $b) { + $a = (string)$a['name']; + $b = (string)$b['name']; + if ($a === $b) { + return 0; + } + return ($a < $b) ? -1 : 1; + }); + return $apps; + } + /** * Get all available apps in a category * @@ -301,6 +326,10 @@ class AppSettingsController extends Controller { return ($a < $b) ? -1 : 1; }); break; + // updates + case 'updates': + $apps = $this->getAppsWithUpdates(); + break; // enabled apps case 'enabled': $apps = $appClass->listAllApps(); diff --git a/settings/js/apps.js b/settings/js/apps.js index 39e800636c..ab0a4da558 100644 --- a/settings/js/apps.js +++ b/settings/js/apps.js @@ -42,6 +42,7 @@ OC.Settings.Apps = OC.Settings.Apps || { var categories = [ {displayName: t('settings', 'Your apps'), ident: 'installed', id: '0'}, + {displayName: t('settings', 'Updates'), ident: 'updates', id: '3'}, {displayName: t('settings', 'Enabled apps'), ident: 'enabled', id: '1'}, {displayName: t('settings', 'Disabled apps'), ident: 'disabled', id: '2'} ]; @@ -58,6 +59,12 @@ OC.Settings.Apps = OC.Settings.Apps || { type:'GET', success:function (jsondata) { var html = template(jsondata); + var updateCategory = $.grep(jsondata, function(element, index) { + return element.ident === 'updates' + }); + if (updateCategory.length === 1) { + OC.Settings.Apps.State.availableUpdates = updateCategory[0].counter; + } $('#apps-categories').html(html); $('#app-category-' + OC.Settings.Apps.State.currentCategory).addClass('active'); }, @@ -99,7 +106,7 @@ OC.Settings.Apps = OC.Settings.Apps || { return _.extend({level: 0}, app); }); var source; - if (categoryId === 'enabled' || categoryId === 'disabled' || categoryId === 'installed' || categoryId === 'app-bundles') { + if (categoryId === 'enabled' || categoryId === 'updates' || categoryId === 'disabled' || categoryId === 'installed' || categoryId === 'app-bundles') { source = $("#app-template-installed").html(); $('#apps-list').addClass('installed'); } else { @@ -134,13 +141,8 @@ OC.Settings.Apps = OC.Settings.Apps || { var $update = $('#app-' + app.id + ' .update'); $update.removeClass('hidden'); $update.val(t('settings', 'Update to %s').replace(/%s/g, app.update)); - OC.Settings.Apps.State.availableUpdates++; } }); - - if (OC.Settings.Apps.State.availableUpdates > 0) { - OC.Settings.Apps.State.$updateNotification = OC.Notification.show(n('settings', 'You have %n app update pending', 'You have %n app updates pending', OC.Settings.Apps.State.availableUpdates)); - } } else { $('#apps-list').addClass('hidden'); $('#apps-list-empty').removeClass('hidden').find('h2').text(t('settings', 'No apps found for your version')); @@ -539,14 +541,8 @@ OC.Settings.Apps = OC.Settings.Apps || { var $version = $('#app-' + appId + ' .app-version'); $version.text(OC.Settings.Apps.State.apps[appId]['update']); - if (OC.Settings.Apps.State.$updateNotification) { - OC.Notification.hide(OC.Settings.Apps.State.$updateNotification); - } - OC.Settings.Apps.State.availableUpdates--; - if (OC.Settings.Apps.State.availableUpdates > 0) { - OC.Settings.Apps.State.$updateNotification = OC.Notification.show(n('settings', 'You have %n app update pending', 'You have %n app updates pending', OC.Settings.Apps.State.availableUpdates)); - } + OC.Settings.Apps.refreshUpdateCounter(); } },'json'); }, @@ -656,6 +652,10 @@ OC.Settings.Apps = OC.Settings.Apps || { }); }, + refreshUpdateCounter: function() { + $('#app-category-updates').find('.app-navigation-entry-utils-counter').html(OC.Settings.Apps.State.availableUpdates); + }, + showErrorMessage: function(appId, message) { $('div#app-'+appId+' .warning') .show() diff --git a/settings/templates/apps.php b/settings/templates/apps.php index 91a73fcbe5..f0fc5791e5 100644 --- a/settings/templates/apps.php +++ b/settings/templates/apps.php @@ -19,6 +19,11 @@ script( {{#each this}}
  • {{displayName}} +
    + +
  • {{/each}} @@ -65,9 +70,6 @@ script(
    - {{#if canUnInstall}} diff --git a/tests/Settings/Controller/AppSettingsControllerTest.php b/tests/Settings/Controller/AppSettingsControllerTest.php index 9633c77159..e264d0dfbf 100644 --- a/tests/Settings/Controller/AppSettingsControllerTest.php +++ b/tests/Settings/Controller/AppSettingsControllerTest.php @@ -101,6 +101,12 @@ class AppSettingsControllerTest extends TestCase { 'ident' => 'installed', 'displayName' => 'Your apps', ], + [ + 'id' => 4, + 'ident' => 'updates', + 'displayName' => 'Updates', + 'counter' => 0, + ], [ 'id' => 0, 'ident' => 'enabled',