Skip to content

Commit 986af0f

Browse files
committed
MAGETWO-55242: Create Extensions Grid
1 parent 6d60a51 commit 986af0f

File tree

11 files changed

+553
-9
lines changed

11 files changed

+553
-9
lines changed

setup/config/di.config.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
'Magento\Setup\Controller\Success',
3131
'Magento\Setup\Controller\Modules',
3232
'Magento\Setup\Controller\ComponentGrid',
33+
'Magento\Setup\Controller\ExtensionGrid',
3334
'Magento\Setup\Controller\StartUpdater',
3435
'Magento\Setup\Controller\UpdaterSuccess',
3536
'Magento\Setup\Controller\BackupActionItems',

setup/config/states.home.config.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,17 @@
3535
'order' => 1,
3636
'type' => 'update'
3737
],
38+
[
39+
'id' => 'root.extension',
40+
'url' => 'extension-grid',
41+
'templateUrl' => "$base/extension-grid",
42+
'title' => 'Extension Manager',
43+
'controller' => 'extensionGridController',
44+
'nav' => false,
45+
'noMenu' => true,
46+
'order' => 1,
47+
'type' => 'extension'
48+
],
3849
[
3950
'id' => 'root.install',
4051
'url' => 'install-extension-grid',

setup/pub/magento/setup/app.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ var app = angular.module(
1919
'install',
2020
'success',
2121
'component-grid',
22+
'extension-grid',
2223
'install-extension-grid',
2324
'create-backup',
2425
'complete-backup',
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
/**
2+
* Copyright © 2016 Magento. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
'use strict';
7+
8+
angular.module('extension-grid', ['ngStorage'])
9+
.controller('extensionGridController', ['$rootScope', '$scope', '$http', '$localStorage', '$state',
10+
function ($rootScope, $scope, $http, $localStorage, $state) {
11+
$rootScope.extensionsProcessed = false;
12+
$scope.syncError = false;
13+
$http.get('index.php/extensionGrid/extensions').success(function (data) {
14+
$scope.extensions = data.extensions;
15+
$scope.total = data.total;
16+
17+
if (typeof data.lastSyncData.lastSyncDate === 'undefined') {
18+
$scope.isOutOfSync = true;
19+
$scope.countOfUpdate = 0;
20+
$scope.countOfInstall = 0;
21+
} else {
22+
$scope.lastSyncDate = data.lastSyncData.lastSyncDate.date;
23+
$scope.lastSyncTime = data.lastSyncData.lastSyncDate.time;
24+
$scope.countOfUpdate = data.lastSyncData.countOfUpdate;
25+
$scope.countOfInstall = data.lastSyncData.countOfInstall;
26+
$scope.enabledInstall = data.lastSyncData.countOfInstall ? true : false;
27+
$scope.isOutOfSync = false;
28+
}
29+
$scope.availableUpdatePackages = data.lastSyncData.packages;
30+
$scope.currentPage = 1;
31+
$scope.rowLimit = 20;
32+
$scope.numberOfPages = Math.ceil($scope.total / $scope.rowLimit);
33+
$rootScope.extensionsProcessed = true;
34+
});
35+
36+
$scope.$watch('currentPage + rowLimit', function () {
37+
var begin = ($scope.currentPage - 1) * $scope.rowLimit;
38+
var end = parseInt(begin) + parseInt($scope.rowLimit);
39+
$scope.numberOfPages = Math.ceil($scope.total / $scope.rowLimit);
40+
41+
if ($scope.currentPage > $scope.numberOfPages) {
42+
$scope.currentPage = $scope.numberOfPages;
43+
}
44+
});
45+
46+
$scope.isOutOfSync = false;
47+
$scope.isHiddenSpinner = true;
48+
$scope.selectedExtension = null;
49+
50+
$scope.isActiveActionsCell = function(extension) {
51+
return $scope.selectedExtension === extension;
52+
};
53+
54+
$scope.toggleActiveActionsCell = function(extension) {
55+
$scope.selectedExtension = $scope.selectedExtension == extension ? null : extension;
56+
};
57+
58+
$scope.closeActiveActionsCell = function(extension) {
59+
$scope.toggleActiveActionsCell(extension);
60+
};
61+
62+
$scope.predicate = 'name';
63+
$scope.reverse = false;
64+
$scope.order = function(predicate) {
65+
$scope.reverse = $scope.predicate === predicate ? !$scope.reverse : false;
66+
$scope.predicate = predicate;
67+
};
68+
69+
$scope.sync = function() {
70+
$scope.isHiddenSpinner = false;
71+
$http.get('index.php/extensionGrid/sync').success(function(data) {
72+
if (typeof data.lastSyncData.lastSyncDate !== 'undefined') {
73+
$scope.lastSyncDate = data.lastSyncData.lastSyncDate.date;
74+
$scope.lastSyncTime = data.lastSyncData.lastSyncDate.time;
75+
}
76+
77+
if (data.error !== '') {
78+
$scope.syncError = true;
79+
$scope.ErrorMessage = data.error;
80+
}
81+
$scope.availableUpdatePackages = data.lastSyncData.packages;
82+
$scope.countOfUpdate = data.lastSyncData.countOfUpdate;
83+
$scope.countOfInstall = data.lastSyncData.countOfInstall;
84+
$scope.enabledInstall = data.lastSyncData.countOfInstall ? true : false;
85+
$scope.isHiddenSpinner = true;
86+
$scope.isOutOfSync = false;
87+
});
88+
};
89+
$scope.isAvailableUpdatePackage = function(packageName) {
90+
$localStorage.isMarketplaceAuthorized = typeof $localStorage.isMarketplaceAuthorized !== 'undefined' ? $localStorage.isMarketplaceAuthorized : false;
91+
var isAvailable = typeof $scope.availableUpdatePackages !== 'undefined'
92+
&& $localStorage.isMarketplaceAuthorized
93+
&& packageName in $scope.availableUpdatePackages;
94+
return isAvailable;
95+
};
96+
97+
$scope.getIndicatorInfo = function(extension, type) {
98+
var indicators = {
99+
'info': {
100+
'icon': '_info', 'label': 'Update Available'
101+
},
102+
'on': {
103+
'icon': '_on', 'label': 'On'
104+
},
105+
'off': {
106+
'icon': '_off', 'label': 'Off'
107+
}
108+
};
109+
110+
var types = ['label', 'icon'];
111+
112+
if (types.indexOf(type) === -1) {
113+
type = 'icon';
114+
}
115+
116+
if ($scope.isAvailableUpdatePackage(extension.name)) {
117+
return indicators.info[type];
118+
} else if (extension.disable === true) {
119+
return indicators.off[type];
120+
}
121+
return indicators.on[type];
122+
};
123+
124+
$scope.update = function(extension) {
125+
$localStorage.packages = [
126+
{
127+
name: extension.name,
128+
version: $scope.availableUpdatePackages[extension.name]['latestVersion']
129+
}
130+
];
131+
if (extension.moduleName) {
132+
$localStorage.moduleName = extension.moduleName;
133+
} else {
134+
$localStorage.moduleName = extension.name;
135+
}
136+
if ($localStorage.titles['update'].indexOf($localStorage.moduleName) < 0 ) {
137+
$localStorage.titles['update'] = 'Update ' + $localStorage.moduleName;
138+
}
139+
$rootScope.titles = $localStorage.titles;
140+
$scope.nextState();
141+
};
142+
143+
$scope.uninstall = function(extension) {
144+
$localStorage.packages = [
145+
{
146+
name: extension.name
147+
}
148+
];
149+
if (extension.moduleName) {
150+
$localStorage.moduleName = extension.moduleName;
151+
} else {
152+
$localStorage.moduleName = extension.name;
153+
}
154+
if ($localStorage.titles['uninstall'].indexOf($localStorage.moduleName) < 0 ) {
155+
$localStorage.titles['uninstall'] = 'Uninstall ' + $localStorage.moduleName;
156+
}
157+
$rootScope.titles = $localStorage.titles;
158+
$localStorage.extensionType = extension.type;
159+
$state.go('root.readiness-check-uninstall');
160+
};
161+
162+
$scope.enableDisable = function(type, extension) {
163+
if (extension.type.indexOf('module') >= 0) {
164+
$localStorage.packages = [
165+
{
166+
name: extension.moduleName
167+
}
168+
];
169+
if (extension.moduleName) {
170+
$localStorage.moduleName = extension.moduleName;
171+
} else {
172+
$localStorage.moduleName = extension.name;
173+
}
174+
if ($localStorage.titles[type].indexOf($localStorage.moduleName) < 0 ) {
175+
$localStorage.titles[type] = type.charAt(0).toUpperCase() + type.slice(1) + ' '
176+
+ $localStorage.moduleName;
177+
}
178+
$rootScope.titles = $localStorage.titles;
179+
$localStorage.extensionType = extension.type;
180+
$state.go('root.readiness-check-' + type);
181+
}
182+
};
183+
}
184+
])
185+
.filter('startFrom', function () {
186+
return function (input, start) {
187+
if (input !== undefined && start !== 'NaN') {
188+
start = parseInt(start, 10);
189+
return input.slice(start);
190+
}
191+
}
192+
});

setup/pub/styles/setup.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Setup\Controller;
8+
9+
use Magento\Framework\Composer\ComposerInformation;
10+
use Magento\Setup\Model\PackagesAuth;
11+
use Magento\Setup\Model\PackagesData;
12+
use Zend\Mvc\Controller\AbstractActionController;
13+
use Zend\View\Model\JsonModel;
14+
use Zend\View\Model\ViewModel;
15+
16+
/**
17+
* Controller for extension grid tasks
18+
*/
19+
class ExtensionGrid extends AbstractActionController
20+
{
21+
/**
22+
* @var \Magento\Framework\Composer\ComposerInformation
23+
*/
24+
private $composerInformation;
25+
26+
/**
27+
* @var PackagesData
28+
*/
29+
private $packagesData;
30+
31+
/**
32+
* @var PackagesAuth
33+
*/
34+
private $packagesAuth;
35+
36+
/**
37+
* @param ComposerInformation $composerInformation
38+
* @param PackagesData $packagesData
39+
* @param PackagesAuth $packagesAuth
40+
*/
41+
public function __construct(
42+
ComposerInformation $composerInformation,
43+
\Magento\Setup\Model\PackagesData $packagesData,
44+
\Magento\Setup\Model\PackagesAuth $packagesAuth
45+
) {
46+
$this->composerInformation = $composerInformation;
47+
$this->packagesData = $packagesData;
48+
$this->packagesAuth = $packagesAuth;
49+
}
50+
51+
/**
52+
* Index page action
53+
*
54+
* @return \Zend\View\Model\ViewModel
55+
*/
56+
public function indexAction()
57+
{
58+
$view = new \Zend\View\Model\ViewModel();
59+
$view->setTerminal(true);
60+
return $view;
61+
}
62+
63+
/**
64+
* Get extensions info action
65+
*
66+
* @return JsonModel
67+
* @throws \RuntimeException
68+
*/
69+
public function extensionsAction()
70+
{
71+
$lastSyncData = [];
72+
$authDetails = $this->packagesAuth->getAuthJsonData();
73+
if ($authDetails) {
74+
$lastSyncData = $this->packagesData->syncPackagesData();
75+
}
76+
77+
$extensions = $this->packagesData->getPackagesForInstall();
78+
$packages = isset($extensions['packages']) ? $extensions['packages'] : [];
79+
return new JsonModel(
80+
[
81+
'success' => true,
82+
'extensions' => array_values($packages),
83+
'total' => count($packages),
84+
'lastSyncData' => $lastSyncData
85+
]
86+
);
87+
}
88+
89+
/**
90+
* Sync action
91+
*
92+
* @return JsonModel
93+
*/
94+
public function syncAction()
95+
{
96+
$error = '';
97+
$lastSyncData = [];
98+
try {
99+
$lastSyncData = $this->packagesData->syncPackagesData();
100+
} catch (\Exception $e) {
101+
$error = $e->getMessage();
102+
}
103+
return new JsonModel(
104+
[
105+
'success' => true,
106+
'lastSyncData' => $lastSyncData,
107+
'error' => $error
108+
]
109+
);
110+
}
111+
}

setup/src/Magento/Setup/Model/PackagesData.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ protected function unsetDevVersions($package)
296296
*/
297297
public function getPackagesForInstall()
298298
{
299-
$actualInstallackages = [];
299+
$actualInstallPackages = [];
300300
$installPackagesInfo = $this->syncPackagesForInstall();
301301

302302
try {
@@ -314,11 +314,11 @@ public function getPackagesForInstall()
314314
) {
315315
$package['metapackage'] =
316316
isset($metaPackageByPackage[$package['name']]) ? $metaPackageByPackage[$package['name']] : '';
317-
$actualInstallackages[$package['name']] = $package;
318-
$actualInstallackages[$package['name']]['version'] = $package['versions'][0];
317+
$actualInstallPackages[$package['name']] = $package;
318+
$actualInstallPackages[$package['name']]['version'] = $package['versions'][0];
319319
}
320320
}
321-
$installPackagesInfo['packages'] = $actualInstallackages;
321+
$installPackagesInfo['packages'] = $actualInstallPackages;
322322
return $installPackagesInfo;
323323
} catch (\Exception $e) {
324324
throw new \RuntimeException('Error in getting new packages to install');

setup/view/layout/layout.phtml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
->appendFile($this->basePath() . '/pub/magento/setup/main.js')
3030
->appendFile($this->basePath() . '/pub/magento/setup/landing.js')
3131
->appendFile($this->basePath() . '/pub/magento/setup/component-grid.js')
32+
->appendFile($this->basePath() . '/pub/magento/setup/extension-grid.js')
3233
->appendFile($this->basePath() . '/pub/magento/setup/readiness-check.js')
3334
->appendFile($this->basePath() . '/pub/magento/setup/add-database.js')
3435
->appendFile($this->basePath() . '/pub/magento/setup/web-configuration.js')

0 commit comments

Comments
 (0)