diff --git a/CHANGELOG.md b/CHANGELOG.md index 95bb36ef0..2bb629d03 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. diff --git a/public/js/pimcore/asset/folder.js b/public/js/pimcore/asset/folder.js index e6261a408..516b670d4 100644 --- a/public/js/pimcore/asset/folder.js +++ b/public/js/pimcore/asset/folder.js @@ -247,10 +247,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 6ef8cb948..e443345da 100644 --- a/public/js/pimcore/asset/listfolder.js +++ b/public/js/pimcore/asset/listfolder.js @@ -460,6 +460,29 @@ pimcore.asset.listfolder = Class.create(pimcore.asset.helpers.gridTabAbstract, { return config; }, + 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++) { + 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 5ed77bd4e..9df30dcd5 100644 --- a/public/js/pimcore/elementservice.js +++ b/public/js/pimcore/elementservice.js @@ -83,9 +83,23 @@ 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) + "
"; + if (res.itemResults.length > 0) { + message += ""; + } + 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 3d5908553..a450592de 100644 --- a/public/js/pimcore/object/folder.js +++ b/public/js/pimcore/object/folder.js @@ -296,10 +296,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 da560b721..bf5994ab3 100644 --- a/public/js/pimcore/object/folder/search.js +++ b/public/js/pimcore/object/folder/search.js @@ -422,6 +422,29 @@ pimcore.object.search = Class.create(pimcore.object.helpers.gridTabAbstract, { return config; }, + 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++) { + 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 113419814..ae9ae783f 100644 --- a/src/Controller/Admin/ElementControllerBase.php +++ b/src/Controller/Admin/ElementControllerBase.php @@ -150,6 +150,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 74359cadb..e74b55485 100644 --- a/translations/admin.en.yaml +++ b/translations/admin.en.yaml @@ -424,7 +424,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'