More groundwork to allow installing multiple packages at once

This commit is contained in:
Flavio Copes
2016-03-09 21:19:13 +01:00
parent 68a183c05c
commit d9ffd603ea
7 changed files with 63 additions and 62 deletions

View File

@@ -261,22 +261,25 @@ class AdminController
*
* @return bool
*/
protected function taskPackageDependencies()
protected function taskGetPackagesDependencies()
{
$data = $this->post;
$package = isset($data['package']) ? $data['package'] : '';
$packages = isset($data['packages']) ? $data['packages'] : '';
$packages = (array)$packages;
$dependencies = $this->admin->getDependenciesNeededToInstall([$package]);
$dependencies = $this->admin->getDependenciesNeededToInstall($packages);
$this->admin->json_response = ['status' => 'success', 'dependencies' => $dependencies];
return true;
}
protected function taskInstallDependenciesOfPackage()
protected function taskInstallDependenciesOfPackages()
{
$data = $this->post;
$package = isset($data['package']) ? $data['package'] : '';
$packages = isset($data['packages']) ? $data['packages'] : '';
$packages = (array)$packages;
$type = isset($data['type']) ? $data['type'] : '';
if (!$this->authorizeTask('install ' . $type, ['admin.' . $type, 'admin.super'])) {
@@ -286,7 +289,7 @@ class AdminController
require_once __DIR__ . '/gpm.php';
$dependencies = $this->admin->getDependenciesNeededToInstall([$package]);
$dependencies = $this->admin->getDependenciesNeededToInstall($packages);
$result = \Grav\Plugin\Admin\Gpm::install(array_keys($dependencies), ['theme' => ($type == 'theme')]);
@@ -314,7 +317,7 @@ class AdminController
$result = \Grav\Plugin\Admin\Gpm::install($package, ['theme' => ($type == 'theme')]);
if ($result) {
$this->admin->json_response = ['status' => 'success', 'message' => $this->admin->translate('PLUGIN_ADMIN.INSTALLATION_SUCCESSFUL')];
$this->admin->json_response = ['status' => 'success', 'message' => "Package $package installed successfully"];
} else {
$this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.INSTALLATION_FAILED')];
}
@@ -334,7 +337,7 @@ class AdminController
$type = isset($data['type']) ? $data['type'] : '';
if (!$this->authorizeTask('uninstall ' . $type, ['admin.' . $type, 'admin.super'])) {
$this->admin->json_response = ['status' => 'error', 'message' => 'Unauthorized'];
$this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK')];
return false;
}

View File

@@ -111,7 +111,7 @@ export default class Updates {
<p>
<i class="fa fa-bullhorn"></i>
<strong>v${resources[item].available}</strong> ${translations.PLUGIN_ADMIN.OF_THIS} ${singles[index]} ${translations.PLUGIN_ADMIN.IS_NOW_AVAILABLE}!
<a href="#" class="button button-small secondary" data-remodal-target="add-package" data-package-slug="${item}" data-${singles[index]}-action="get-package-dependencies">${translations.PLUGIN_ADMIN.UPDATE} ${singles[index].charAt(0).toUpperCase() + singles[index].substr(1).toLowerCase()}</a>
<a href="#" class="button button-small secondary" data-remodal-target="add-package" data-packages-slugs="${item}" data-${singles[index]}-action="get-package-dependencies">${translations.PLUGIN_ADMIN.UPDATE} ${singles[index].charAt(0).toUpperCase() + singles[index].substr(1).toLowerCase()}</a>
</p>
`);
}

View File

@@ -26,7 +26,7 @@ class Packages {
}
static getTaskUrl(type, task) {
var url = `${config.base_url_relative}`;
let url = `${config.base_url_relative}`;
url += `/${type}s.json`;
url += `/task${config.param_sep}${task}`;
return url;
@@ -36,16 +36,12 @@ class Packages {
return `${Packages.getTaskUrl(type, 'removePackage')}`;
}
static getAddPackageUrl(type) {
return `${Packages.getTaskUrl(type, 'addPackage')}`;
static getGetPackagesDependenciesUrl(type) {
return `${Packages.getTaskUrl(type, 'getPackagesDependencies')}`;
}
static getPackageDependenciesUrl(type) {
return `${Packages.getTaskUrl(type, 'packageDependencies')}`;
}
static getInstallDependenciesOfPackageUrl(type) {
return `${Packages.getTaskUrl(type, 'installDependenciesOfPackage')}`;
static getInstallDependenciesOfPackagesUrl(type) {
return `${Packages.getTaskUrl(type, 'installDependenciesOfPackages')}`;
}
static getInstallPackageUrl(type) {
@@ -106,13 +102,13 @@ class Packages {
list.append(`<li>${text}</li>`);
}
getPackageDependencies(type, slug, finishedLoadingCallback) {
let url = Packages.getPackageDependenciesUrl(type);
getPackagesDependencies(type, slugs, finishedLoadingCallback) {
let url = Packages.getGetPackagesDependenciesUrl(type);
request(url, {
method: 'post',
body: {
package: slug
packages: slugs
}
}, (response) => {
@@ -120,7 +116,7 @@ class Packages {
if (response.status === 'success') {
if (response.dependencies) {
var hasDependencies = false;
let hasDependencies = false;
for (var dependency in response.dependencies) {
if (response.dependencies.hasOwnProperty(dependency)) {
hasDependencies = true;
@@ -143,51 +139,46 @@ class Packages {
});
}
installDependenciesOfPackage(type, slug, callbackSuccess, callbackError) {
let url = Packages.getInstallDependenciesOfPackageUrl(type);
installDependenciesOfPackages(type, slugs, callbackSuccess, callbackError) {
let url = Packages.getInstallDependenciesOfPackagesUrl(type);
request(url, {
method: 'post',
body: {
package: slug
packages: slugs
}
}, (response) => {
if (response.status === 'success') {
callbackSuccess();
} else {
callbackError();
}
});
}, callbackSuccess);
}
installPackage(type, slug, callbackSuccess) {
installPackage(type, slugs, callbackSuccess) {
let url = Packages.getInstallPackageUrl(type);
request(url, {
method: 'post',
body: {
package: slug,
type: type
}
}, () => {
callbackSuccess();
slugs.forEach((slug) => {
request(url, {
method: 'post',
body: {
package: slug,
type: type
}
}, callbackSuccess);
});
}
static getSlugFromEvent(event) {
var slug = '';
if ($(event.target).is('[data-package-slug]')) {
slug = $(event.target).data('package-slug');
static getSlugsFromEvent(event) {
let slugs = '';
if ($(event.target).is('[data-packages-slugs]')) {
slugs = $(event.target).data('packages-slugs');
} else {
slug = $(event.target).parent('[data-package-slug]').data('package-slug');
slugs = $(event.target).parent('[data-packages-slugs]').data('packages-slugs');
}
return slug;
slugs = slugs.split(',');
return typeof slugs === 'string' ? [slugs] : slugs;
}
handleGettingPackageDependencies(type, event) {
var slug = Packages.getSlugFromEvent(event);
let slugs = Packages.getSlugsFromEvent(event);
event.preventDefault();
event.stopPropagation();
@@ -200,34 +191,41 @@ class Packages {
$('[data-remodal-id="add-package"] .install-dependencies-package-container .button-bar').removeClass('hidden');
$('[data-remodal-id="add-package"] .install-package-container .button-bar').removeClass('hidden');
this.getPackageDependencies(type, slug, () => {
$(`[data-remodal-id="add-package"] [data-${type}-action="install-dependencies-and-package"]`).attr('data-package-slug', slug);
$(`[data-remodal-id="add-package"] [data-${type}-action="install-package"]`).attr('data-package-slug', slug);
this.getPackagesDependencies(type, slugs, () => {
let slugs_string = slugs.join();
$(`[data-remodal-id="add-package"] [data-${type}-action="install-dependencies-and-package"]`).attr('data-packages-slugs', slugs_string);
$(`[data-remodal-id="add-package"] [data-${type}-action="install-package"]`).attr('data-packages-slugs', slugs_string);
$('[data-remodal-id="add-package"] .loading').addClass('hidden');
});
}
handleInstallingDependenciesAndPackage(type, event) {
var slug = Packages.getSlugFromEvent(event);
let slugs = Packages.getSlugsFromEvent(event);
event.preventDefault();
event.stopPropagation();
$('.install-dependencies-package-container .button-bar').addClass('hidden');
$('.installing-dependencies').removeClass('hidden');
this.installDependenciesOfPackage(type, slug, () => {
this.installDependenciesOfPackages(type, slugs, () => {
$('.installing-dependencies').addClass('hidden');
$('.installing-package').removeClass('hidden');
this.installPackage(type, slug, () => {
this.installPackage(type, slugs, () => {
$('.installing-package').addClass('hidden');
$('.installation-complete').removeClass('hidden');
window.location.href = `${config.base_url_relative}/${type}s/${slug}`;
if (slugs.length === 1) {
window.location.href = `${config.base_url_relative}/${type}s/${slugs[0]}`;
} else {
window.location.href = `${config.base_url_relative}/${type}s`;
}
});
});
}
handleInstallingPackage(type, event) {
var slug = Packages.getSlugFromEvent(event);
let slug = Packages.getSlugsFromEvent(event);
event.preventDefault();
event.stopPropagation();
@@ -242,7 +240,7 @@ class Packages {
}
handleRemovingPackage(type, event) {
let slug = $(event.target).data('package-slug');
let slug = $(event.target).data('packages-slugs');
event.preventDefault();
event.stopPropagation();

View File

@@ -10,7 +10,7 @@
<div class="button-bar">
<button data-remodal-action="cancel" class="button secondary remodal-cancel"><i class="fa fa-fw fa-close"></i> {{ "PLUGIN_ADMIN.CANCEL"|tu }}</button>
<button data-{{ type }}-action="remove-package" data-package-slug="{{ package.slug }}" class="button"><i class="fa fa-fw fa-check"></i> {{ "PLUGIN_ADMIN.CONTINUE"|tu }}</button>
<button data-{{ type }}-action="remove-package" data-packages-slugs="{{ package.slug }}" class="button"><i class="fa fa-fw fa-check"></i> {{ "PLUGIN_ADMIN.CONTINUE"|tu }}</button>
</div>
</div>

View File

@@ -31,7 +31,7 @@
</div>
{% else %}
<div class="button-bar success">
<a class="button" href="#" data-remodal-target="add-package" data-package-slug="{{ plugin.slug }}" data-plugin-action="get-package-dependencies"><i class="fa fa-plus"></i> {{ "PLUGIN_ADMIN.INSTALL"|tu }}</a>
<a class="button" href="#" data-remodal-target="add-package" data-packages-slugs="{{ plugin.slug }}" data-plugin-action="get-package-dependencies"><i class="fa fa-plus"></i> {{ "PLUGIN_ADMIN.INSTALL"|tu }}</a>
</div>
{% endif %}

View File

@@ -28,7 +28,7 @@
<i class="fa fa-fw fa-toggle-{{ data.get('enabled') ? 'on' : 'off' }}"></i>
</a>
{% elseif (installing) %}
<a class="button" href="#" data-remodal-target="add-package" data-package-slug="{{ plugin.slug }}" data-plugin-action="get-package-dependencies"><i class="fa fa-plus"></i> {{ "PLUGIN_ADMIN.INSTALL"|tu }}</a>
<a class="button" href="#" data-remodal-target="add-package" data-packages-slugs="{{ plugin.slug }}" data-plugin-action="get-package-dependencies"><i class="fa fa-plus"></i> {{ "PLUGIN_ADMIN.INSTALL"|tu }}</a>
{% endif %}
<span class="gpm-details-expand"><i class="fa fa-chevron-down"></i></span>
</td>

View File

@@ -99,7 +99,7 @@
{% endif %}
{% else %}
<div class="button-bar success">
<a class="button" href="#" data-remodal-target="add-package" data-package-slug="{{ theme.slug }}" data-theme-action="get-package-dependencies"><i class="fa fa-plus"></i> {{ "PLUGIN_ADMIN.INSTALL_THEME"|tu }}</a>
<a class="button" href="#" data-remodal-target="add-package" data-packages-slugs="{{ theme.slug }}" data-theme-action="get-package-dependencies"><i class="fa fa-plus"></i> {{ "PLUGIN_ADMIN.INSTALL_THEME"|tu }}</a>
</div>
{% endif %}