From 9a4448cb03b575471c4986aa66da08d5cce8b9ae Mon Sep 17 00:00:00 2001 From: Dmytro Derkach Date: Thu, 11 Jan 2024 10:47:31 +0200 Subject: [PATCH 1/7] Added checking if assets/dataobjects checked inside folder grid then they are removing if not removing current folder. Also added a counter and full path of removing items inside confirmation popup. --- public/js/pimcore/asset/folder.js | 13 +++++++++++-- public/js/pimcore/asset/listfolder.js | 19 +++++++++++++++++++ public/js/pimcore/elementservice.js | 14 ++++++++++++-- public/js/pimcore/object/folder.js | 13 +++++++++++-- public/js/pimcore/object/folder/search.js | 19 +++++++++++++++++++ .../Admin/ElementControllerBase.php | 1 + translations/admin.en.yaml | 2 +- 7 files changed, 74 insertions(+), 7 deletions(-) diff --git a/public/js/pimcore/asset/folder.js b/public/js/pimcore/asset/folder.js index 404b1b2540..ebc0065c81 100644 --- a/public/js/pimcore/asset/folder.js +++ b/public/js/pimcore/asset/folder.js @@ -252,10 +252,19 @@ pimcore.asset.folder = Class.create(pimcore.asset.asset, { } this.toolbarButtons.remove = new Ext.Button({ - tooltip: t('delete_folder'), + tooltip: t('delete'), iconCls: "pimcore_material_icon_delete pimcore_material_icon", scale: "medium", - handler: this.remove.bind(this) + handler: function () { + var options = this.listfolder.onRawDeleteSelectedRows(); + if (!options) { + options = { + "elementType" : "asset", + "id": this.id + }; + } + pimcore.elementservice.deleteElement(options); + }.bind(this) }); this.toolbarButtons.rename = new Ext.Button({ diff --git a/public/js/pimcore/asset/listfolder.js b/public/js/pimcore/asset/listfolder.js index a863c34d5a..416d70199f 100644 --- a/public/js/pimcore/asset/listfolder.js +++ b/public/js/pimcore/asset/listfolder.js @@ -459,6 +459,25 @@ pimcore.asset.listfolder = Class.create(pimcore.asset.helpers.gridTabAbstract, { return config; }, + onRawDeleteSelectedRows: function () { + var ids = []; + var selectedRows = this.grid.getSelectionModel().getSelection(); + for (var i = 0; i < selectedRows.length; i++) { + ids.push(selectedRows[i].data.id); + } + ids = ids.join(','); + + var options = { + "elementType" : "asset", + "id": ids, + "success": function() { + this.store.reload(); + }.bind(this) + }; + + return ids.length ? options : null; + }, + onRowContextmenu: function (grid, record, tr, rowIndex, e, eOpts ) { var menu = new Ext.menu.Menu(); diff --git a/public/js/pimcore/elementservice.js b/public/js/pimcore/elementservice.js index c1b580d253..8f25a01dc9 100644 --- a/public/js/pimcore/elementservice.js +++ b/public/js/pimcore/elementservice.js @@ -83,9 +83,19 @@ pimcore.elementservice.deleteElementsComplete = function(options, response) { pimcore.elementservice.deleteElementCheckDependencyComplete = function (window, res, options) { try { - let message = res.batchDelete ? t('delete_message_batch') : t('delete_message'); + let message = ''; + if (res.batchDelete) { + message += sprintf(t('delete_message_batch'), res.itemResults.length) + "
"; + res.itemResults.forEach(function (item) { + message += "\"" + htmlspecialchars(item.path + item.key) + "\""; + }) + message += "
"; + } else { + message += t('delete_message'); + } + if (res.elementKey) { - message += "
\"" + htmlspecialchars(res.elementKey) + "\""; + message += "
\"" + htmlspecialchars(res.itemResults[0].path + res.elementKey) + "\""; } if (res.hasDependencies) { message += "
" + t('delete_message_dependencies'); diff --git a/public/js/pimcore/object/folder.js b/public/js/pimcore/object/folder.js index 2870f58ad3..5dd9e828aa 100644 --- a/public/js/pimcore/object/folder.js +++ b/public/js/pimcore/object/folder.js @@ -214,10 +214,19 @@ pimcore.object.folder = Class.create(pimcore.object.abstract, { }); this.toolbarButtons.remove = new Ext.Button({ - tooltip: t('delete_folder'), + tooltip: t('delete'), iconCls: "pimcore_material_icon_delete pimcore_material_icon", scale: "medium", - handler: this.remove.bind(this) + handler: function () { + var options = this.search.onRawDeleteSelectedRows(); + if (!options) { + options = { + "elementType" : "object", + "id": this.id + }; + } + pimcore.elementservice.deleteElement(options); + }.bind(this) }); this.toolbarButtons.rename = new Ext.Button({ diff --git a/public/js/pimcore/object/folder/search.js b/public/js/pimcore/object/folder/search.js index b27ba8af07..1b0df00a3c 100644 --- a/public/js/pimcore/object/folder/search.js +++ b/public/js/pimcore/object/folder/search.js @@ -422,6 +422,25 @@ pimcore.object.search = Class.create(pimcore.object.helpers.gridTabAbstract, { return config; }, + onRawDeleteSelectedRows: function () { + var ids = []; + var selectedRows = this.grid.getSelectionModel().getSelection(); + for (var i = 0; i < selectedRows.length; i++) { + ids.push(selectedRows[i].data.id); + } + ids = ids.join(','); + + var options = { + "elementType" : "object", + "id": ids, + "success": function() { + this.store.reload(); + }.bind(this) + }; + + return ids.length ? options : null; + }, + onRowContextmenu: function (grid, record, tr, rowIndex, e, eOpts) { var menu = new Ext.menu.Menu(); diff --git a/src/Controller/Admin/ElementControllerBase.php b/src/Controller/Admin/ElementControllerBase.php index b2883e5717..03ab514a00 100644 --- a/src/Controller/Admin/ElementControllerBase.php +++ b/src/Controller/Admin/ElementControllerBase.php @@ -152,6 +152,7 @@ public function deleteInfoAction(Request $request, EventDispatcherInterface $eve 'id' => $element->getId(), 'type' => $element->getType(), 'key' => $element->getKey(), + 'path' => $element->getPath(), 'allowed' => true, ]; diff --git a/translations/admin.en.yaml b/translations/admin.en.yaml index d4090b223c..6bae6ecea3 100644 --- a/translations/admin.en.yaml +++ b/translations/admin.en.yaml @@ -420,7 +420,7 @@ add_variant: 'Add variant' delete_message_dependencies: 'There are dependencies, delete anyway?' delete_message: 'Do you really want to delete this item?' delete_message_advanced: "Do you really want to delete %s '%s' ?" -delete_message_batch: 'Do you really want to delete these elements?' +delete_message_batch: 'Do you really want to delete these %s elements?' delete_group_message: 'Do you really want to delete this group and all of its contents?' no_further_objectbricks_allowed: 'No further objectbricks allowed' grid_current_language: 'Current language' From d4a65688d0a74979e45b91d45b5283bdf08403bd Mon Sep 17 00:00:00 2001 From: Blackbit Date: Wed, 17 Jan 2024 12:47:28 +0100 Subject: [PATCH 2/7] Update public/js/pimcore/elementservice.js Co-authored-by: JiaJia Ji --- public/js/pimcore/elementservice.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/js/pimcore/elementservice.js b/public/js/pimcore/elementservice.js index 8f25a01dc9..81df4ab81d 100644 --- a/public/js/pimcore/elementservice.js +++ b/public/js/pimcore/elementservice.js @@ -85,7 +85,7 @@ pimcore.elementservice.deleteElementCheckDependencyComplete = function (window, try { let message = ''; if (res.batchDelete) { - message += sprintf(t('delete_message_batch'), res.itemResults.length) + "
"; + message += sprintf(t('delete_message_batch'), res.itemResults.length) + "
"; res.itemResults.forEach(function (item) { message += "\"" + htmlspecialchars(item.path + item.key) + "\""; }) From b01fd27f7f0025722ff3ffd9060fa1a2b5e06f07 Mon Sep 17 00:00:00 2001 From: Blackbit Date: Wed, 17 Jan 2024 12:47:53 +0100 Subject: [PATCH 3/7] Update public/js/pimcore/elementservice.js Co-authored-by: JiaJia Ji --- public/js/pimcore/elementservice.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/public/js/pimcore/elementservice.js b/public/js/pimcore/elementservice.js index 81df4ab81d..885b7b62d6 100644 --- a/public/js/pimcore/elementservice.js +++ b/public/js/pimcore/elementservice.js @@ -87,7 +87,13 @@ pimcore.elementservice.deleteElementCheckDependencyComplete = function (window, if (res.batchDelete) { message += sprintf(t('delete_message_batch'), res.itemResults.length) + "
"; res.itemResults.forEach(function (item) { - message += "\"" + htmlspecialchars(item.path + item.key) + "\""; + if (res.itemResults.length > 0) { + message += "
    "; + res.itemResults.forEach(function (item) { + message += '
  • ' + htmlspecialchars(item.path) + '' + htmlspecialchars(item.key) + '
  • '; + }) + message += "
"; + } }) message += "
"; } else { From 1606b5eb8c357f06058dda9acaae148aa6cfa7cd Mon Sep 17 00:00:00 2001 From: JiaJia Ji Date: Thu, 7 Mar 2024 10:50:55 +0100 Subject: [PATCH 4/7] Update public/js/pimcore/elementservice.js --- public/js/pimcore/elementservice.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/public/js/pimcore/elementservice.js b/public/js/pimcore/elementservice.js index 885b7b62d6..638d7c0dc1 100644 --- a/public/js/pimcore/elementservice.js +++ b/public/js/pimcore/elementservice.js @@ -86,15 +86,13 @@ pimcore.elementservice.deleteElementCheckDependencyComplete = function (window, let message = ''; if (res.batchDelete) { message += sprintf(t('delete_message_batch'), res.itemResults.length) + "
"; - res.itemResults.forEach(function (item) { - if (res.itemResults.length > 0) { - message += "
    "; - res.itemResults.forEach(function (item) { - message += '
  • ' + htmlspecialchars(item.path) + '' + htmlspecialchars(item.key) + '
  • '; - }) - message += "
"; - } - }) + if (res.itemResults.length > 0) { + message += "
    "; + res.itemResults.forEach(function (item) { + message += '
  • ' + htmlspecialchars(item.path) + '' + htmlspecialchars(item.key) + '
  • '; + }) + message += "
"; + } message += "
"; } else { message += t('delete_message'); From 722f8b68f1596c01f9ee6979e965cd64abc7b5a4 Mon Sep 17 00:00:00 2001 From: Blackbit Date: Thu, 7 Mar 2024 15:28:53 +0100 Subject: [PATCH 5/7] Update public/js/pimcore/asset/listfolder.js Co-authored-by: JiaJia Ji --- public/js/pimcore/asset/listfolder.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/js/pimcore/asset/listfolder.js b/public/js/pimcore/asset/listfolder.js index 416d70199f..ba33234da2 100644 --- a/public/js/pimcore/asset/listfolder.js +++ b/public/js/pimcore/asset/listfolder.js @@ -460,7 +460,7 @@ pimcore.asset.listfolder = Class.create(pimcore.asset.helpers.gridTabAbstract, { }, onRawDeleteSelectedRows: function () { - var ids = []; + let ids = []; var selectedRows = this.grid.getSelectionModel().getSelection(); for (var i = 0; i < selectedRows.length; i++) { ids.push(selectedRows[i].data.id); From ad17a1a118d078f82f9bdb3d149968a3a46a08fa Mon Sep 17 00:00:00 2001 From: Jan Walther Date: Mon, 2 Sep 2024 11:10:41 +0200 Subject: [PATCH 6/7] check if grid is actually loaded --- public/js/pimcore/asset/listfolder.js | 4 ++++ public/js/pimcore/object/folder/search.js | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/public/js/pimcore/asset/listfolder.js b/public/js/pimcore/asset/listfolder.js index ba33234da2..dcf6bd8e67 100644 --- a/public/js/pimcore/asset/listfolder.js +++ b/public/js/pimcore/asset/listfolder.js @@ -460,6 +460,10 @@ pimcore.asset.listfolder = Class.create(pimcore.asset.helpers.gridTabAbstract, { }, onRawDeleteSelectedRows: function () { + if(typeof this.grid === "undefined") { + return null; + } + let ids = []; var selectedRows = this.grid.getSelectionModel().getSelection(); for (var i = 0; i < selectedRows.length; i++) { diff --git a/public/js/pimcore/object/folder/search.js b/public/js/pimcore/object/folder/search.js index 1b0df00a3c..f113f702ea 100644 --- a/public/js/pimcore/object/folder/search.js +++ b/public/js/pimcore/object/folder/search.js @@ -423,6 +423,10 @@ pimcore.object.search = Class.create(pimcore.object.helpers.gridTabAbstract, { }, onRawDeleteSelectedRows: function () { + if (typeof this.grid === "undefined") { + return null; + } + var ids = []; var selectedRows = this.grid.getSelectionModel().getSelection(); for (var i = 0; i < selectedRows.length; i++) { From 0c67498b8de86ee89a1e364925762ce1d772fabd Mon Sep 17 00:00:00 2001 From: Jan Walther Date: Thu, 12 Sep 2024 17:00:52 +0200 Subject: [PATCH 7/7] add changelog for "Prevent accidental deletion" --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95bb36ef00..2bb629d03c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ #### v1.6.0 -- show tree search even if all child elements fit on one page (according to `tree_paging_limit`) - if there are at least 30 children in total +- Show tree search even if all child elements fit on one page (according to `tree_paging_limit`) - if there are at least 30 children in total +- Prevent accidental deletion of folder if items get selected in grid and then the "Delete folder" button gets clicked. Instead: If grid items are selected, delete button asks if the selected items should be deleted. If no grid items are selected, the folder gets deleted (after confirmation). #### v1.5.0 - [Assets] Metadata can be now displayed as a read-only tab when the user is granted `view` permissions to the asset.