From 15339fcf9a588c8c4a85ec1a06e7a472b0c4795b Mon Sep 17 00:00:00 2001 From: Johannes Wachter Date: Mon, 11 Jul 2016 12:25:05 +0200 Subject: [PATCH] fixed #3 added delete button on list and edit-form --- Controller/ArticleController.php | 38 ++++++++++++++++ .../dist/components/articles/edit/main.js | 2 +- .../dist/components/articles/list/main.js | 2 +- .../js/components/articles/edit/main.js | 45 ++++++++++++------- .../js/components/articles/list/main.js | 16 +++---- .../Controller/ArticleControllerTest.php | 42 +++++++++++++++++ 6 files changed, 117 insertions(+), 28 deletions(-) diff --git a/Controller/ArticleController.php b/Controller/ArticleController.php index 49dc765a7..47cbc6a73 100644 --- a/Controller/ArticleController.php +++ b/Controller/ArticleController.php @@ -205,6 +205,44 @@ public function putAction(Request $request, $uuid) ); } + /** + * Deletes multiple documents. + * + * @param Request $request + * + * @return Response + */ + public function cdeleteAction(Request $request) + { + $ids = array_filter(explode(',', $request->get('ids', ''))); + + $documentManager = $this->getDocumentManager(); + foreach ($ids as $id) { + $document = $documentManager->find($id); + $documentManager->remove($document); + } + $documentManager->flush(); + + return $this->handleView($this->view(null)); + } + + /** + * Deletes multiple documents. + * + * @param string $id + * + * @return Response + */ + public function deleteAction($id) + { + $documentManager = $this->getDocumentManager(); + $document = $documentManager->find($id); + $documentManager->remove($document); + $documentManager->flush(); + + return $this->handleView($this->view(null)); + } + /** * Persists the document using the given information. * diff --git a/Resources/public/dist/components/articles/edit/main.js b/Resources/public/dist/components/articles/edit/main.js index 7866e5581..93f67cce3 100644 --- a/Resources/public/dist/components/articles/edit/main.js +++ b/Resources/public/dist/components/articles/edit/main.js @@ -1 +1 @@ -define(["jquery","underscore"],function(a,b){"use strict";return{defaults:{options:{config:{}},templates:{url:"/admin/api/articles<% if (!!id) { %>/<%= id %><% } %>?locale=<%= locale %>"},translations:{headline:"sulu_article.edit.title"}},header:function(){return{tabs:{url:"/admin/content-navigations?alias=article",options:{data:function(){return this.sandbox.util.deepCopy(this.data)}.bind(this),url:function(){return this.templates.url({id:this.options.id,locale:this.options.locale})}.bind(this),config:this.options.config},componentOptions:{values:this.data}},toolbar:{buttons:{save:{parent:"saveWithOptions"},template:{options:{dropdownOptions:{url:"/admin/articles/templates?type="+(this.options.type||this.data.type),callback:function(a){this.template=a.template,this.sandbox.emit("sulu.tab.template-change",a)}.bind(this)}}}}}}},initialize:function(){this.saveState="disabled",this.bindCustomEvents()},bindCustomEvents:function(){this.sandbox.on("sulu.header.back",this.toList.bind(this)),this.sandbox.on("sulu.tab.dirty",this.enableSave.bind(this)),this.sandbox.on("sulu.toolbar.save",this.save.bind(this)),this.sandbox.on("sulu.tab.data-changed",this.setData.bind(this)),this.sandbox.on("sulu.header.language-changed",function(a){this.sandbox.sulu.saveUserSetting(this.options.config.settingsKey,a.id),this.toEdit(a.id)}.bind(this))},toEdit:function(a,b){this.sandbox.emit("sulu.router.navigate","articles/"+(a||this.options.locale)+"/edit:"+(b||this.options.id),!0,!0)},toList:function(){1===this.options.config.types.length?this.sandbox.emit("sulu.router.navigate","articles/"+this.options.locale):this.sandbox.emit("sulu.router.navigate","articles:"+(this.options.type||this.data.type)+"/"+this.options.locale)},toAdd:function(){1===this.options.config.types.length?this.sandbox.emit("sulu.router.navigate","articles/"+this.options.locale+"/add",!0,!0):this.sandbox.emit("sulu.router.navigate","articles/"+this.options.locale+"/add:"+(this.options.type||this.data.type),!0,!0)},save:function(a){this.loadingSave(),this.saveTab().then(function(b){this.afterSave(a,b)}.bind(this))},setData:function(a){this.data=a},saveTab:function(){var b=a.Deferred();return this.sandbox.once("sulu.tab.saved",function(a){this.setData(a),b.resolve(a)}.bind(this)),this.sandbox.emit("sulu.tab.save"),b},enableSave:function(a){(a||"loading"!==this.saveState)&&(this.saveState="enabled",this.sandbox.emit("sulu.header.toolbar.item.enable","save",!1))},disableSave:function(a){(a||"loading"!==this.saveState)&&(this.saveState="disabled",this.sandbox.emit("sulu.header.toolbar.item.disable","save",!0))},loadingSave:function(){this.saveState="loading",this.sandbox.emit("sulu.header.toolbar.item.loading","save")},afterSave:function(a,b){this.disableSave(!0),this.sandbox.emit("sulu.header.saved",b),"back"===a?this.toList():"new"===a?this.toAdd():this.options.id||this.toEdit(this.options.locale,b.id)},loadComponentData:function(){var c=a.Deferred();return this.options.id?(this.sandbox.util.load(b.template(this.defaults.templates.url,{id:this.options.id,locale:this.options.locale})).done(function(a){c.resolve(a)}),c):(c.resolve({}),c)}}}); \ No newline at end of file +define(["jquery","underscore"],function(a,b){"use strict";return{defaults:{options:{config:{}},templates:{url:"/admin/api/articles<% if (!!id) { %>/<%= id %><% } %>?locale=<%= locale %>"},translations:{headline:"sulu_article.edit.title"}},header:function(){var a={save:{parent:"saveWithOptions"},template:{options:{dropdownOptions:{url:"/admin/articles/templates?type="+(this.options.type||this.data.type),callback:function(a){this.template=a.template,this.sandbox.emit("sulu.tab.template-change",a)}.bind(this)}}}};return this.options.id&&(a["delete"]={}),{tabs:{url:"/admin/content-navigations?alias=article",options:{data:function(){return this.sandbox.util.deepCopy(this.data)}.bind(this),url:function(){return this.templates.url({id:this.options.id,locale:this.options.locale})}.bind(this),config:this.options.config},componentOptions:{values:this.data}},toolbar:{buttons:a}}},initialize:function(){this.saveState="disabled",this.bindCustomEvents()},bindCustomEvents:function(){this.sandbox.on("sulu.header.back",this.toList.bind(this)),this.sandbox.on("sulu.tab.dirty",this.enableSave.bind(this)),this.sandbox.on("sulu.toolbar.save",this.save.bind(this)),this.sandbox.on("sulu.toolbar.delete",this.deleteItem.bind(this)),this.sandbox.on("sulu.tab.data-changed",this.setData.bind(this)),this.sandbox.on("sulu.header.language-changed",function(a){this.sandbox.sulu.saveUserSetting(this.options.config.settingsKey,a.id),this.toEdit(a.id)}.bind(this))},deleteItem:function(){this.sandbox.util.save("/admin/api/articles/"+this.options.id,"DELETE").then(function(){this.toList()}.bind(this))},toEdit:function(a,b){this.sandbox.emit("sulu.router.navigate","articles/"+(a||this.options.locale)+"/edit:"+(b||this.options.id),!0,!0)},toList:function(){1===this.options.config.types.length?this.sandbox.emit("sulu.router.navigate","articles/"+this.options.locale):this.sandbox.emit("sulu.router.navigate","articles:"+(this.options.type||this.data.type)+"/"+this.options.locale)},toAdd:function(){1===this.options.config.types.length?this.sandbox.emit("sulu.router.navigate","articles/"+this.options.locale+"/add",!0,!0):this.sandbox.emit("sulu.router.navigate","articles/"+this.options.locale+"/add:"+(this.options.type||this.data.type),!0,!0)},save:function(a){this.loadingSave(),this.saveTab().then(function(b){this.afterSave(a,b)}.bind(this))},setData:function(a){this.data=a},saveTab:function(){var b=a.Deferred();return this.sandbox.once("sulu.tab.saved",function(a){this.setData(a),b.resolve(a)}.bind(this)),this.sandbox.emit("sulu.tab.save"),b},enableSave:function(a){(a||"loading"!==this.saveState)&&(this.saveState="enabled",this.sandbox.emit("sulu.header.toolbar.item.enable","save",!1))},disableSave:function(a){(a||"loading"!==this.saveState)&&(this.saveState="disabled",this.sandbox.emit("sulu.header.toolbar.item.disable","save",!0))},loadingSave:function(){this.saveState="loading",this.sandbox.emit("sulu.header.toolbar.item.loading","save")},afterSave:function(a,b){this.disableSave(!0),this.sandbox.emit("sulu.header.saved",b),"back"===a?this.toList():"new"===a?this.toAdd():this.options.id||this.toEdit(this.options.locale,b.id)},loadComponentData:function(){var c=a.Deferred();return this.options.id?(this.sandbox.util.load(b.template(this.defaults.templates.url,{id:this.options.id,locale:this.options.locale})).done(function(a){c.resolve(a)}),c):(c.resolve({}),c)}}}); \ No newline at end of file diff --git a/Resources/public/dist/components/articles/list/main.js b/Resources/public/dist/components/articles/list/main.js index ea4cd3d53..e149fa7e2 100644 --- a/Resources/public/dist/components/articles/list/main.js +++ b/Resources/public/dist/components/articles/list/main.js @@ -1 +1 @@ -define(["underscore"],function(a){"use strict";var b={options:{config:{}},templates:{list:['
','
','
','
','
'].join("")},translations:{headline:"sulu_article.list.title"}};return{defaults:b,header:function(){var b,c=this.options.config.types,d={icon:"plus-circle",title:"public.add-new"},e=!1;return 1===c.length?d.callback=function(){this.toAdd(c[0])}.bind(this):(d.dropdownItems=a.map(c,function(a){return{title:a,callback:function(){this.toAdd(a)}.bind(this)}}.bind(this)),b=a.map(c,function(a){return{id:a,name:a,key:a}}),e={componentOptions:{callback:this.typeChange.bind(this),preselector:"name",preselect:this.options.type},data:b}),{title:this.translations.headline,underline:!1,noBack:!0,tabs:e,toolbar:{buttons:{addArticle:{options:d},deleteSelected:{}},languageChanger:{data:this.options.config.languageChanger,preSelected:this.options.locale}}}},layout:{content:{width:"max"}},initialize:function(){this.render(),this.bindCustomEvents()},render:function(){this.$el.html(this.templates.list()),this.sandbox.sulu.initListToolbarAndList.call(this,"article","/admin/api/articles/fields",{el:this.$find(".list-toolbar-container"),instanceName:"articles",template:this.sandbox.sulu.buttons.get({settings:{options:{dropdownItems:[{type:"columnOptions"}]}}})},{el:this.sandbox.dom.find(".datagrid-container"),url:"/admin/api/articles?locale="+this.options.locale+"&type="+this.options.type,searchInstanceName:"articles",searchFields:["title"],resultKey:"articles",instanceName:"articles",actionCallback:function(a){this.toEdit(a)}.bind(this),viewOptions:{table:{actionIconColumn:"title"}}})},toEdit:function(a,b){this.sandbox.emit("sulu.router.navigate","articles/"+(b||this.options.locale)+"/edit:"+a)},toAdd:function(a,b){this.sandbox.emit("sulu.router.navigate","articles/"+(b||this.options.locale)+"/add"+(this.options.config.types.length>1?":"+a:""))},toList:function(a){this.sandbox.emit("sulu.router.navigate","articles/"+(a||this.options.locale))},deleteItems:function(a){for(var b=0,c=a.length;b0?"enable":"disable";this.sandbox.emit("sulu.header.toolbar.item."+b,"deleteSelected",!1)}.bind(this)),this.sandbox.on("sulu.toolbar.delete",function(){this.sandbox.emit("husky.datagrid.news.items.get-selected",this.deleteItems.bind(this))}.bind(this)),this.sandbox.on("sulu.header.language-changed",function(a){this.sandbox.sulu.saveUserSetting(this.options.config.settingsKey,a.id),this.toList(a.id)}.bind(this))}}}); \ No newline at end of file +define(["underscore"],function(a){"use strict";var b={options:{config:{}},templates:{list:['
','
','
','
','
'].join("")},translations:{headline:"sulu_article.list.title"}};return{defaults:b,header:function(){var b,c=this.options.config.types,d={icon:"plus-circle",title:"public.add-new"},e=!1;return 1===c.length?d.callback=function(){this.toAdd(c[0])}.bind(this):(d.dropdownItems=a.map(c,function(a){return{title:a,callback:function(){this.toAdd(a)}.bind(this)}}.bind(this)),b=a.map(c,function(a){return{id:a,name:a,key:a}}),e={componentOptions:{callback:this.typeChange.bind(this),preselector:"name",preselect:this.options.type},data:b}),{title:this.translations.headline,underline:!1,noBack:!0,tabs:e,toolbar:{buttons:{addArticle:{options:d},deleteSelected:{}},languageChanger:{data:this.options.config.languageChanger,preSelected:this.options.locale}}}},layout:{content:{width:"max"}},initialize:function(){this.render(),this.bindCustomEvents()},render:function(){this.$el.html(this.templates.list()),this.sandbox.sulu.initListToolbarAndList.call(this,"article","/admin/api/articles/fields",{el:this.$find(".list-toolbar-container"),instanceName:"articles",template:this.sandbox.sulu.buttons.get({settings:{options:{dropdownItems:[{type:"columnOptions"}]}}})},{el:this.sandbox.dom.find(".datagrid-container"),url:"/admin/api/articles?locale="+this.options.locale+"&type="+this.options.type,searchInstanceName:"articles",searchFields:["title"],resultKey:"articles",instanceName:"articles",actionCallback:function(a){this.toEdit(a)}.bind(this),viewOptions:{table:{actionIconColumn:"title"}}})},toEdit:function(a,b){this.sandbox.emit("sulu.router.navigate","articles/"+(b||this.options.locale)+"/edit:"+a)},toAdd:function(a,b){this.sandbox.emit("sulu.router.navigate","articles/"+(b||this.options.locale)+"/add"+(this.options.config.types.length>1?":"+a:""))},toList:function(a){this.sandbox.emit("sulu.router.navigate","articles/"+(a||this.options.locale))},deleteItems:function(b){this.sandbox.util.save("/admin/api/articles?ids="+b.join(","),"DELETE").then(function(){a.each(b,function(a){this.sandbox.emit("husky.datagrid.articles.record.remove",a)}.bind(this))}.bind(this))},typeChange:function(a){this.sandbox.emit("husky.datagrid.articles.url.update",{type:a.id}),this.sandbox.emit("sulu.router.navigate","articles:"+a.id+"/"+this.options.locale,!1,!1)},bindCustomEvents:function(){this.sandbox.on("husky.datagrid.articles.number.selections",function(a){var b=a>0?"enable":"disable";this.sandbox.emit("sulu.header.toolbar.item."+b,"deleteSelected",!1)}.bind(this)),this.sandbox.on("sulu.toolbar.delete",function(){this.sandbox.emit("husky.datagrid.articles.items.get-selected",this.deleteItems.bind(this))}.bind(this)),this.sandbox.on("sulu.header.language-changed",function(a){this.sandbox.sulu.saveUserSetting(this.options.config.settingsKey,a.id),this.toList(a.id)}.bind(this))}}}); \ No newline at end of file diff --git a/Resources/public/js/components/articles/edit/main.js b/Resources/public/js/components/articles/edit/main.js index 973ac5d92..45d16fc04 100644 --- a/Resources/public/js/components/articles/edit/main.js +++ b/Resources/public/js/components/articles/edit/main.js @@ -28,6 +28,27 @@ define(['jquery', 'underscore'], function($, _) { }, header: function() { + var buttons = { + save: { + parent: 'saveWithOptions' + }, + template: { + options: { + dropdownOptions: { + url: '/admin/articles/templates?type=' + (this.options.type || this.data.type), + callback: function(item) { + this.template = item.template; + this.sandbox.emit('sulu.tab.template-change', item); + }.bind(this) + } + } + } + }; + + if (!!this.options.id) { + buttons.delete = {}; + } + return { tabs: { url: '/admin/content-navigations?alias=article', @@ -46,22 +67,7 @@ define(['jquery', 'underscore'], function($, _) { }, toolbar: { - buttons: { - save: { - parent: 'saveWithOptions' - }, - template: { - options: { - dropdownOptions: { - url: '/admin/articles/templates?type=' + (this.options.type || this.data.type), - callback: function(item) { - this.template = item.template; - this.sandbox.emit('sulu.tab.template-change', item); - }.bind(this) - } - } - } - } + buttons: buttons } }; }, @@ -76,6 +82,7 @@ define(['jquery', 'underscore'], function($, _) { this.sandbox.on('sulu.header.back', this.toList.bind(this)); this.sandbox.on('sulu.tab.dirty', this.enableSave.bind(this)); this.sandbox.on('sulu.toolbar.save', this.save.bind(this)); + this.sandbox.on('sulu.toolbar.delete', this.deleteItem.bind(this)); this.sandbox.on('sulu.tab.data-changed', this.setData.bind(this)); this.sandbox.on('sulu.header.language-changed', function(item) { @@ -84,6 +91,12 @@ define(['jquery', 'underscore'], function($, _) { }.bind(this)); }, + deleteItem: function() { + this.sandbox.util.save('/admin/api/articles/' + this.options.id, 'DELETE').then(function() { + this.toList(); + }.bind(this)); + }, + toEdit: function(locale, id) { this.sandbox.emit('sulu.router.navigate', 'articles/' + (locale || this.options.locale) + '/edit:' + (id || this.options.id), true, true); }, diff --git a/Resources/public/js/components/articles/list/main.js b/Resources/public/js/components/articles/list/main.js index 36e555dba..5901a4e7c 100644 --- a/Resources/public/js/components/articles/list/main.js +++ b/Resources/public/js/components/articles/list/main.js @@ -163,14 +163,10 @@ define(['underscore'], function(_) { }, deleteItems: function(ids) { - for (var i = 0, length = ids.length; i < length; i++) { - this.deleteItem(ids[i]); - } - }, - - deleteItem: function(id) { - this.sandbox.util.save('/admin/api/articles/' + id, 'DELETE').then(function() { - this.sandbox.emit('husky.datagrid.news.record.remove', id); + this.sandbox.util.save('/admin/api/articles?ids=' + ids.join(','), 'DELETE').then(function() { + _.each(ids, function(id) { + this.sandbox.emit('husky.datagrid.articles.record.remove', id); + }.bind(this)); }.bind(this)); }, @@ -180,13 +176,13 @@ define(['underscore'], function(_) { }, bindCustomEvents: function() { - this.sandbox.on('husky.datagrid.news.number.selections', function(number) { + this.sandbox.on('husky.datagrid.articles.number.selections', function(number) { var postfix = number > 0 ? 'enable' : 'disable'; this.sandbox.emit('sulu.header.toolbar.item.' + postfix, 'deleteSelected', false); }.bind(this)); this.sandbox.on('sulu.toolbar.delete', function() { - this.sandbox.emit('husky.datagrid.news.items.get-selected', this.deleteItems.bind(this)); + this.sandbox.emit('husky.datagrid.articles.items.get-selected', this.deleteItems.bind(this)); }.bind(this)); this.sandbox.on('sulu.header.language-changed', function(item) { diff --git a/Tests/Functional/Controller/ArticleControllerTest.php b/Tests/Functional/Controller/ArticleControllerTest.php index 4d4940ac5..aebe4f947 100644 --- a/Tests/Functional/Controller/ArticleControllerTest.php +++ b/Tests/Functional/Controller/ArticleControllerTest.php @@ -237,6 +237,48 @@ function ($item) { $this->assertContains([$article2['id'], $article2['title']], $items); } + public function testDelete() + { + $this->purgeIndex(); + + $article = $this->testPost('Sulu'); + $this->flush(); + + $client = $this->createAuthenticatedClient(); + $client->request('DELETE', '/api/articles/' . $article['id']); + $this->flush(); + + $this->assertHttpStatusCode(204, $client->getResponse()); + + $client->request('GET', '/api/articles?locale=de&type=blog'); + + $response = json_decode($client->getResponse()->getContent(), true); + $this->assertEquals(0, $response['total']); + $this->assertCount(0, $response['_embedded']['articles']); + } + + public function testCDelete() + { + $this->purgeIndex(); + + $article1 = $this->testPost('Sulu'); + $this->flush(); + $article2 = $this->testPost('Sulu is awesome', 'simple'); + $this->flush(); + + $client = $this->createAuthenticatedClient(); + $client->request('DELETE', '/api/articles?ids=' . implode(',', [$article1['id'], $article2['id']])); + $this->flush(); + + $this->assertHttpStatusCode(204, $client->getResponse()); + + $client->request('GET', '/api/articles?locale=de&type=blog'); + + $response = json_decode($client->getResponse()->getContent(), true); + $this->assertEquals(0, $response['total']); + $this->assertCount(0, $response['_embedded']['articles']); + } + private function purgeIndex() { /** @var IndexerInterface $indexer */