diff --git a/classes/controller.php b/classes/controller.php
index cd561cbd..ac0c4270 100644
--- a/classes/controller.php
+++ b/classes/controller.php
@@ -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;
}
diff --git a/themes/grav/app/updates/index.js b/themes/grav/app/updates/index.js
index f0ac27f1..7afe8059 100644
--- a/themes/grav/app/updates/index.js
+++ b/themes/grav/app/updates/index.js
@@ -111,7 +111,7 @@ export default class Updates {
v${resources[item].available} ${translations.PLUGIN_ADMIN.OF_THIS} ${singles[index]} ${translations.PLUGIN_ADMIN.IS_NOW_AVAILABLE}!
- ${translations.PLUGIN_ADMIN.UPDATE} ${singles[index].charAt(0).toUpperCase() + singles[index].substr(1).toLowerCase()}
+ ${translations.PLUGIN_ADMIN.UPDATE} ${singles[index].charAt(0).toUpperCase() + singles[index].substr(1).toLowerCase()}
`);
}
diff --git a/themes/grav/app/utils/packages.js b/themes/grav/app/utils/packages.js
index 218093d5..5aa054af 100644
--- a/themes/grav/app/utils/packages.js
+++ b/themes/grav/app/utils/packages.js
@@ -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(`${text}`);
}
- 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();
diff --git a/themes/grav/templates/partials/modal-remove-package.html.twig b/themes/grav/templates/partials/modal-remove-package.html.twig
index b2be7361..fbe1b464 100644
--- a/themes/grav/templates/partials/modal-remove-package.html.twig
+++ b/themes/grav/templates/partials/modal-remove-package.html.twig
@@ -10,7 +10,7 @@
-
+
diff --git a/themes/grav/templates/partials/plugins-details.html.twig b/themes/grav/templates/partials/plugins-details.html.twig
index ba74b792..1167c710 100644
--- a/themes/grav/templates/partials/plugins-details.html.twig
+++ b/themes/grav/templates/partials/plugins-details.html.twig
@@ -31,7 +31,7 @@
{% else %}
{% endif %}
diff --git a/themes/grav/templates/partials/plugins-list.html.twig b/themes/grav/templates/partials/plugins-list.html.twig
index 9727c5f5..be309bbf 100644
--- a/themes/grav/templates/partials/plugins-list.html.twig
+++ b/themes/grav/templates/partials/plugins-list.html.twig
@@ -28,7 +28,7 @@
{% elseif (installing) %}
- {{ "PLUGIN_ADMIN.INSTALL"|tu }}
+ {{ "PLUGIN_ADMIN.INSTALL"|tu }}
{% endif %}
diff --git a/themes/grav/templates/partials/themes-details.html.twig b/themes/grav/templates/partials/themes-details.html.twig
index f06d40bb..57994743 100644
--- a/themes/grav/templates/partials/themes-details.html.twig
+++ b/themes/grav/templates/partials/themes-details.html.twig
@@ -99,7 +99,7 @@
{% endif %}
{% else %}
{% endif %}