diff --git a/app/code/Magento/MediaGallery/Model/Directory/Command/CreateByPaths.php b/app/code/Magento/MediaGallery/Model/Directory/Command/CreateByPaths.php
index f33c22a18b4b8..d0ba786c7084e 100644
--- a/app/code/Magento/MediaGallery/Model/Directory/Command/CreateByPaths.php
+++ b/app/code/Magento/MediaGallery/Model/Directory/Command/CreateByPaths.php
@@ -78,7 +78,7 @@ public function execute(array $paths): void
if (!empty($failedPaths)) {
throw new CouldNotSaveException(
__(
- 'Could not save directories: %paths',
+ 'Could not create directories: %paths',
[
'paths' => implode(' ,', $failedPaths)
]
diff --git a/app/code/Magento/MediaGalleryUi/Model/Directories/GetFolderTree.php b/app/code/Magento/MediaGalleryUi/Model/Directories/GetFolderTree.php
index f0998a3e120f2..c22165ba4e51f 100644
--- a/app/code/Magento/MediaGalleryUi/Model/Directories/GetFolderTree.php
+++ b/app/code/Magento/MediaGalleryUi/Model/Directories/GetFolderTree.php
@@ -7,13 +7,14 @@
namespace Magento\MediaGalleryUi\Model\Directories;
+use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\Exception\ValidatorException;
use Magento\Framework\Filesystem;
use Magento\Framework\Filesystem\Directory\Read;
use Magento\MediaGalleryApi\Api\IsPathExcludedInterface;
/**
- * Build folder tree structure by path
+ * Build media gallery folder tree structure by path
*/
class GetFolderTree
{
@@ -22,43 +23,45 @@ class GetFolderTree
*/
private $filesystem;
- /**
- * @var string
- */
- private $path;
-
/**
* @var IsPathExcludedInterface
*/
private $isPathExcluded;
/**
- * Constructor
- *
* @param Filesystem $filesystem
- * @param string $path
* @param IsPathExcludedInterface $isPathExcluded
*/
public function __construct(
Filesystem $filesystem,
- string $path,
IsPathExcludedInterface $isPathExcluded
) {
$this->filesystem = $filesystem;
- $this->path = $path;
$this->isPathExcluded = $isPathExcluded;
}
/**
* Return directory folder structure in array
*
- * @param bool $skipRoot
* @return array
* @throws ValidatorException
*/
- public function execute(bool $skipRoot = true): array
+ public function execute(): array
{
- return $this->buildFolderTree($this->getDirectories(), $skipRoot);
+ $tree = [
+ 'name' => 'root',
+ 'path' => '/',
+ 'children' => []
+ ];
+ $directories = $this->getDirectories();
+ foreach ($directories as $idx => &$node) {
+ $node['children'] = [];
+ $result = $this->findParent($node, $tree);
+ $parent = &$result['treeNode'];
+
+ $parent['children'][] = &$directories[$idx];
+ }
+ return $tree['children'];
}
/**
@@ -72,7 +75,7 @@ private function getDirectories(): array
$directories = [];
/** @var Read $directory */
- $directory = $this->filesystem->getDirectoryRead($this->path);
+ $directory = $this->filesystem->getDirectoryRead(DirectoryList::MEDIA);
if (!$directory->isDirectory()) {
return $directories;
@@ -96,30 +99,6 @@ private function getDirectories(): array
return $directories;
}
- /**
- * Build folder tree structure by provided directories path
- *
- * @param array $directories
- * @param bool $skipRoot
- * @return array
- */
- private function buildFolderTree(array $directories, bool $skipRoot): array
- {
- $tree = [
- 'name' => 'root',
- 'path' => '/',
- 'children' => []
- ];
- foreach ($directories as $idx => &$node) {
- $node['children'] = [];
- $result = $this->findParent($node, $tree);
- $parent = & $result['treeNode'];
-
- $parent['children'][] =& $directories[$idx];
- }
- return $skipRoot ? $tree['children'] : $tree;
- }
-
/**
* Find parent directory
*
diff --git a/app/code/Magento/MediaGalleryUi/Test/Mftf/ActionGroup/AssertFolderIsChangedActionGroup.xml b/app/code/Magento/MediaGalleryUi/Test/Mftf/ActionGroup/AssertFolderIsChangedActionGroup.xml
new file mode 100644
index 0000000000000..090dbed8b4f78
--- /dev/null
+++ b/app/code/Magento/MediaGalleryUi/Test/Mftf/ActionGroup/AssertFolderIsChangedActionGroup.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+ Assert that folder is changed
+
+
+
+
+
+
+
+ {{newSelectedFolder}}
+ {{oldSelectedFolder}}
+
+
+
diff --git a/app/code/Magento/MediaGalleryUi/Test/Mftf/Test/AdminMediaGallerySwitchingBetweenViewsTest.xml b/app/code/Magento/MediaGalleryUi/Test/Mftf/Test/AdminMediaGallerySwitchingBetweenViewsTest.xml
new file mode 100644
index 0000000000000..01b8c27b7371d
--- /dev/null
+++ b/app/code/Magento/MediaGalleryUi/Test/Mftf/Test/AdminMediaGallerySwitchingBetweenViewsTest.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/code/Magento/MediaGalleryUi/Test/Mftf/Test/AdminMediaGalleryUploadCategoryImageTest.xml b/app/code/Magento/MediaGalleryUi/Test/Mftf/Test/AdminMediaGalleryUploadCategoryImageTest.xml
index ca7a71258fead..3dd294fa50605 100644
--- a/app/code/Magento/MediaGalleryUi/Test/Mftf/Test/AdminMediaGalleryUploadCategoryImageTest.xml
+++ b/app/code/Magento/MediaGalleryUi/Test/Mftf/Test/AdminMediaGalleryUploadCategoryImageTest.xml
@@ -36,6 +36,7 @@
+
diff --git a/app/code/Magento/MediaGalleryUi/Ui/Component/DirectoriesTree.php b/app/code/Magento/MediaGalleryUi/Ui/Component/DirectoryTree.php
similarity index 81%
rename from app/code/Magento/MediaGalleryUi/Ui/Component/DirectoriesTree.php
rename to app/code/Magento/MediaGalleryUi/Ui/Component/DirectoryTree.php
index 4047a4fcb98d8..269bc1f8bcba7 100644
--- a/app/code/Magento/MediaGalleryUi/Ui/Component/DirectoriesTree.php
+++ b/app/code/Magento/MediaGalleryUi/Ui/Component/DirectoryTree.php
@@ -14,7 +14,7 @@
/**
* Directories tree component
*/
-class DirectoriesTree extends Container
+class DirectoryTree extends Container
{
/**
* @var UrlInterface
@@ -50,9 +50,9 @@ public function prepare(): void
array_replace_recursive(
(array) $this->getData('config'),
[
- 'getDirectoryTreeUrl' => $this->url->getUrl("media_gallery/directories/gettree"),
- 'deleteDirectoryUrl' => $this->url->getUrl("media_gallery/directories/delete"),
- 'createDirectoryUrl' => $this->url->getUrl("media_gallery/directories/create")
+ 'getDirectoryTreeUrl' => $this->url->getUrl('media_gallery/directories/gettree'),
+ 'deleteDirectoryUrl' => $this->url->getUrl('media_gallery/directories/delete'),
+ 'createDirectoryUrl' => $this->url->getUrl('media_gallery/directories/create')
]
)
);
diff --git a/app/code/Magento/MediaGalleryUi/etc/di.xml b/app/code/Magento/MediaGalleryUi/etc/di.xml
index a8c4e2a8d8963..6ed3a98bbf03a 100644
--- a/app/code/Magento/MediaGalleryUi/etc/di.xml
+++ b/app/code/Magento/MediaGalleryUi/etc/di.xml
@@ -28,11 +28,6 @@
-
-
- media
-
-
diff --git a/app/code/Magento/MediaGalleryUi/view/adminhtml/ui_component/media_gallery_listing.xml b/app/code/Magento/MediaGalleryUi/view/adminhtml/ui_component/media_gallery_listing.xml
index 49206043725f9..66731b1cbae6f 100644
--- a/app/code/Magento/MediaGalleryUi/view/adminhtml/ui_component/media_gallery_listing.xml
+++ b/app/code/Magento/MediaGalleryUi/view/adminhtml/ui_component/media_gallery_listing.xml
@@ -219,7 +219,7 @@
diff --git a/app/code/Magento/MediaGalleryUi/view/adminhtml/ui_component/standalone_media_gallery_listing.xml b/app/code/Magento/MediaGalleryUi/view/adminhtml/ui_component/standalone_media_gallery_listing.xml
index 655178c104492..3656a8ea25f74 100644
--- a/app/code/Magento/MediaGalleryUi/view/adminhtml/ui_component/standalone_media_gallery_listing.xml
+++ b/app/code/Magento/MediaGalleryUi/view/adminhtml/ui_component/standalone_media_gallery_listing.xml
@@ -206,7 +206,7 @@
diff --git a/app/code/Magento/MediaGalleryUi/view/adminhtml/web/js/action/deleteImageWithDetailConfirmation.js b/app/code/Magento/MediaGalleryUi/view/adminhtml/web/js/action/deleteImageWithDetailConfirmation.js
index ed40674df20f0..28c021fe4728f 100644
--- a/app/code/Magento/MediaGalleryUi/view/adminhtml/web/js/action/deleteImageWithDetailConfirmation.js
+++ b/app/code/Magento/MediaGalleryUi/view/adminhtml/web/js/action/deleteImageWithDetailConfirmation.js
@@ -21,25 +21,24 @@ define([
* @param {String} deleteImageUrl
*/
deleteImageAction: function (recordsIds, imageDetailsUrl, deleteImageUrl) {
- var confirmationContent = $t('%1 Are you sure you want to delete "%2" image(s)?')
+ var confirmationContent = $t('%1Are you sure you want to delete "%2" image(s)?')
.replace('%2', Object.keys(recordsIds).length),
deferred = $.Deferred();
- getDetails(imageDetailsUrl, recordsIds)
- .then(function (imageDetails) {
+ getDetails(imageDetailsUrl, recordsIds).then(function (images) {
confirmationContent = confirmationContent.replace(
'%1',
- this.getRecordRelatedContentMessage(imageDetails)
+ this.getRecordRelatedContentMessage(images) + ' '
);
}.bind(this)).fail(function () {
- confirmationContent = confirmationContent.replace('%1', '');
- }).always(function () {
- deleteImages(recordsIds, deleteImageUrl, confirmationContent).then(function (status) {
- deferred.resolve(status);
- }).fail(function (error) {
- deferred.reject(error);
- });
- });
+ confirmationContent = confirmationContent.replace('%1', '');
+ }).always(function () {
+ deleteImages(recordsIds, deleteImageUrl, confirmationContent).then(function (status) {
+ deferred.resolve(status);
+ }).fail(function (error) {
+ deferred.reject(error);
+ });
+ });
return deferred.promise();
},
diff --git a/app/code/Magento/MediaGalleryUi/view/adminhtml/web/js/directory/directories.js b/app/code/Magento/MediaGalleryUi/view/adminhtml/web/js/directory/directories.js
index d7f756d8bbd90..6d8d38a1ca1d6 100644
--- a/app/code/Magento/MediaGalleryUi/view/adminhtml/web/js/directory/directories.js
+++ b/app/code/Magento/MediaGalleryUi/view/adminhtml/web/js/directory/directories.js
@@ -23,6 +23,7 @@ define([
deleteButtonSelector: '#delete_folder',
createFolderButtonSelector: '#create_folder',
messageDelay: 5,
+ selectedFolder: null,
messagesName: 'media_gallery_listing.media_gallery_listing.messages',
modules: {
directoryTree: '${ $.parentName }.media_gallery_directories',
@@ -47,51 +48,57 @@ define([
*/
initEvents: function () {
$(this.deleteButtonSelector).on('delete_folder', function () {
- this.getConfirmationPopupDeleteFolder();
+ this.deleteFolder();
}.bind(this));
$(this.createFolderButtonSelector).on('create_folder', function () {
- this.getPrompt({
- title: $t('New Folder Name:'),
- content: '',
- actions: {
- /**
- * Confirm action
- */
- confirm: function (folderName) {
- createDirectory(
- this.directoryTree().createDirectoryUrl,
- [this.getNewFolderPath(folderName)]
- ).then(function () {
- this.directoryTree().reloadJsTree().then(function () {
- $(this.directoryTree().directoryTreeSelector).on('loaded.jstree', function () {
- this.directoryTree().locateNode(this.getNewFolderPath(folderName));
- }.bind(this));
- }.bind(this));
+ this.createFolder();
+ }.bind(this));
+ },
- }.bind(this)).fail(function (error) {
- uiAlert({
- content: error
- });
+ /**
+ * Show confirmation popup and create folder based on user input
+ */
+ createFolder: function () {
+ this.getPrompt({
+ title: $t('New Folder Name:'),
+ content: '',
+ actions: {
+ /**
+ * Confirm action
+ */
+ confirm: function (folderName) {
+ createDirectory(
+ this.directoryTree().createDirectoryUrl,
+ [this.getNewFolderPath(folderName)]
+ ).then(function () {
+ this.directoryTree().reloadJsTree().then(function () {
+ $(this.directoryTree().directoryTreeSelector).on('loaded.jstree', function () {
+ this.directoryTree().locateNode(this.getNewFolderPath(folderName));
+ }.bind(this));
+ }.bind(this));
+ }.bind(this)).fail(function (error) {
+ uiAlert({
+ content: error
});
- }.bind(this)
- },
- buttons: [{
- text: $t('Cancel'),
- class: 'action-secondary action-dismiss',
+ });
+ }.bind(this)
+ },
+ buttons: [{
+ text: $t('Cancel'),
+ class: 'action-secondary action-dismiss',
- /**
- * Close modal
- */
- click: function () {
- this.closeModal();
- }
- }, {
- text: $t('Confirm'),
- class: 'action-primary action-accept'
- }]
- });
- }.bind(this));
+ /**
+ * Close modal
+ */
+ click: function () {
+ this.closeModal();
+ }
+ }, {
+ text: $t('Confirm'),
+ class: 'action-primary action-accept'
+ }]
+ });
},
/**
@@ -101,11 +108,11 @@ define([
* @returns {String}
*/
getNewFolderPath: function (folderName) {
- var selectedFolder = _.isUndefined(this.selectedFolder()) ||
- _.isNull(this.selectedFolder()) ? '/' : this.selectedFolder(),
- folderToCreate = selectedFolder !== '/' ? selectedFolder + '/' + folderName : folderName;
+ if (_.isUndefined(this.selectedFolder()) || _.isNull(this.selectedFolder())) {
+ return folderName;
+ }
- return folderToCreate;
+ return this.selectedFolder() + '/' + folderName;
},
/**
@@ -136,7 +143,7 @@ define([
/**
* Confirmation popup for delete folder action.
*/
- getConfirmationPopupDeleteFolder: function () {
+ deleteFolder: function () {
confirm({
title: $t('Are you sure you want to delete this folder?'),
modalClass: 'delete-folder-confirmation-popup',
diff --git a/app/code/Magento/MediaGalleryUi/view/adminhtml/web/js/directory/directoryTree.js b/app/code/Magento/MediaGalleryUi/view/adminhtml/web/js/directory/directoryTree.js
index decc337e1b83c..2e1e9a980cd59 100644
--- a/app/code/Magento/MediaGalleryUi/view/adminhtml/web/js/directory/directoryTree.js
+++ b/app/code/Magento/MediaGalleryUi/view/adminhtml/web/js/directory/directoryTree.js
@@ -20,13 +20,15 @@ define([
filterChipsProvider: 'componentType = filters, ns = ${ $.ns }',
directoryTreeSelector: '#media-gallery-directory-tree',
getDirectoryTreeUrl: 'media_gallery/directories/gettree',
+ createDirectoryUrl: 'media_gallery/directories/create',
+ deleteDirectoryUrl: 'media_gallery/directories/delete',
jsTreeReloaded: null,
modules: {
directories: '${ $.name }_directories',
filterChips: '${ $.filterChipsProvider }'
},
listens: {
- '${ $.provider }:params.filters.path': 'clearFiltersHandle'
+ '${ $.provider }:params.filters.path': 'updateSelectedDirectory'
},
viewConfig: [{
component: 'Magento_MediaGalleryUi/js/directory/directories',
@@ -49,7 +51,8 @@ define([
this.renderDirectoryTree().then(function () {
this.initEvents();
}.bind(this));
- }.bind(this));
+ }.bind(this)
+ );
return this;
},
@@ -58,7 +61,6 @@ define([
* Render directory tree component.
*/
renderDirectoryTree: function () {
-
return this.getJsonTree().then(function (data) {
this.createFolderIfNotExists(data).then(function (isFolderCreated) {
if (isFolderCreated) {
@@ -87,37 +89,37 @@ define([
* @param {Array} directories
*/
createFolderIfNotExists: function (directories) {
- var isMediaBrowser = !_.isUndefined(window.MediabrowserUtility),
- currentTreePath = isMediaBrowser ? window.MediabrowserUtility.pathId : null,
+ var requestedDirectory = this.getRequestedDirectory(),
deferred = $.Deferred(),
- decodedPath,
pathArray;
- if (currentTreePath) {
- decodedPath = Base64.idDecode(currentTreePath);
-
- if (!this.isDirectoryExist(directories[0], decodedPath)) {
- pathArray = this.convertPathToPathsArray(decodedPath);
+ if (_.isNull(requestedDirectory)) {
+ deferred.resolve(false);
- $.each(pathArray, function (i, val) {
- if (this.isDirectoryExist(directories[0], val)) {
- pathArray.splice(i, 1);
- }
- }.bind(this));
+ return deferred.promise();
+ }
- createDirectory(
- this.createDirectoryUrl,
- pathArray
- ).then(function () {
- deferred.resolve(true);
- });
- } else {
- deferred.resolve(false);
- }
- } else {
+ if (this.isDirectoryExist(directories[0], requestedDirectory)) {
deferred.resolve(false);
+
+ return deferred.promise();
}
+ pathArray = this.convertPathToPathsArray(requestedDirectory);
+
+ $.each(pathArray, function (i, val) {
+ if (this.isDirectoryExist(directories[0], val)) {
+ pathArray.splice(i, 1);
+ }
+ }.bind(this));
+
+ createDirectory(
+ this.createDirectoryUrl,
+ pathArray
+ ).then(function () {
+ deferred.resolve(true);
+ });
+
return deferred.promise();
},
@@ -199,7 +201,7 @@ define([
/**
* Remove ability to multiple select on nodes
*/
- overrideMultiselectBehavior: function () {
+ disableMultiselectBehavior: function () {
$.jstree.defaults.ui['select_range_modifier'] = false;
$.jstree.defaults.ui['select_multiple_modifier'] = false;
},
@@ -208,8 +210,8 @@ define([
* Handle jstree events
*/
initEvents: function () {
- this.firejsTreeEvents();
- this.overrideMultiselectBehavior();
+ this.initJsTreeEvents();
+ this.disableMultiselectBehavior();
$(window).on('reload.MediaGallery', function () {
this.getJsonTree().then(function (data) {
@@ -217,10 +219,10 @@ define([
if (isCreated) {
this.renderDirectoryTree().then(function () {
this.setJsTreeReloaded(true);
- this.firejsTreeEvents();
+ this.initJsTreeEvents();
}.bind(this));
} else {
- this.checkChipFiltersState();
+ this.updateSelectedDirectory();
}
}.bind(this));
}.bind(this));
@@ -230,30 +232,33 @@ define([
/**
* Fire event for jstree component
*/
- firejsTreeEvents: function () {
+ initJsTreeEvents: function () {
$(this.directoryTreeSelector).on('select_node.jstree', function (element, data) {
- var path = $(data.rslt.obj).data('path');
-
- this.setActiveNodeFilter(path);
+ this.setActiveNodeFilter($(data.rslt.obj).data('path'));
this.setJsTreeReloaded(false);
}.bind(this));
$(this.directoryTreeSelector).on('loaded.jstree', function () {
- this.checkChipFiltersState();
+ this.updateSelectedDirectory();
}.bind(this));
-
},
/**
* Verify directory filter on init event, select folder per directory filter state
*/
- checkChipFiltersState: function () {
+ updateSelectedDirectory: function () {
var currentFilterPath = this.filterChips().filters.path,
- isMediaBrowser = !_.isUndefined(window.MediabrowserUtility),
+ requestedDirectory = this.getRequestedDirectory(),
currentTreePath;
- currentTreePath = this.isFiltersApplied(currentFilterPath) || !isMediaBrowser ? currentFilterPath :
- Base64.idDecode(window.MediabrowserUtility.pathId);
+ if (_.isUndefined(currentFilterPath)) {
+ this.clearFiltersHandle();
+
+ return;
+ }
+
+ currentTreePath = this.isFilterApplied(currentFilterPath) || _.isNull(requestedDirectory) ?
+ currentFilterPath : requestedDirectory;
if (this.folderExistsInTree(currentTreePath)) {
this.locateNode(currentTreePath);
@@ -275,14 +280,23 @@ define([
return false;
},
+ /**
+ * Get requested directory from MediabrowserUtility
+ *
+ * @returns {String|null}
+ */
+ getRequestedDirectory: function () {
+ return !_.isUndefined(window.MediabrowserUtility) && window.MediabrowserUtility.pathId !== '' ?
+ Base64.idDecode(window.MediabrowserUtility.pathId) : null;
+ },
+
/**
* Check if need to select directory by filters state
*
* @param {String} currentFilterPath
*/
- isFiltersApplied: function (currentFilterPath) {
- return !_.isUndefined(currentFilterPath) && currentFilterPath !== '' &&
- currentFilterPath !== 'wysiwyg' && currentFilterPath !== 'catalog/category';
+ isFilterApplied: function (currentFilterPath) {
+ return !_.isUndefined(currentFilterPath) && currentFilterPath !== '';
},
/**
@@ -291,9 +305,7 @@ define([
* @param {String} path
*/
locateNode: function (path) {
- var selectedId = $(this.directoryTreeSelector).jstree('get_selected').attr('id');
-
- if (path === selectedId) {
+ if (path === $(this.directoryTreeSelector).jstree('get_selected').attr('id')) {
return;
}
path = path.replace(/\//g, '\\/');
@@ -303,14 +315,12 @@ define([
},
/**
- * Listener to clear filters event
+ * Clear filters
*/
clearFiltersHandle: function () {
- if (_.isUndefined(this.filterChips().filters.path)) {
- $(this.directoryTreeSelector).jstree('deselect_all');
- this.activeNode(null);
- this.directories().setInActive();
- }
+ $(this.directoryTreeSelector).jstree('deselect_all');
+ this.activeNode(null);
+ this.directories().setInActive();
},
/**
@@ -319,7 +329,6 @@ define([
* @param {String} nodePath
*/
setActiveNodeFilter: function (nodePath) {
-
if (this.activeNode() === nodePath && !this.jsTreeReloaded) {
this.selectStorageRoot();
} else {
@@ -341,14 +350,13 @@ define([
this.filterChips().set('applied', filters);
this.activeNode(null);
this.waitForCondition(
- function () {
- return _.isUndefined(this.directories());
- }.bind(this),
function () {
- this.directories().setInActive();
- }.bind(this)
- );
-
+ return _.isUndefined(this.directories());
+ }.bind(this),
+ function () {
+ this.directories().setInActive();
+ }.bind(this)
+ );
},
/**
@@ -372,8 +380,8 @@ define([
},
/**
- * Remove active node from directory tree, and select next
- */
+ * Remove active node from directory tree, and select next
+ */
removeNode: function () {
$(this.directoryTreeSelector).jstree('remove');
},
@@ -390,7 +398,6 @@ define([
filters = $.extend(true, filters, applied);
filters.path = path;
this.filterChips().set('applied', filters);
-
},
/**