From cb123a179334d6395320f885ca648b7d7d228f82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thierry=20Fran=C3=A7ois?= Date: Fri, 2 Mar 2018 12:33:17 +0200 Subject: [PATCH] NEW Versioned Bulk Actions (Publish, Unpublish & Archive) --- lang/en.yml | 3 + src/BulkManager/BulkAction/ArchiveHandler.php | 121 ++++++++++++++++++ src/BulkManager/BulkAction/PublishHandler.php | 121 ++++++++++++++++++ .../BulkAction/UnPublishHandler.php | 121 ++++++++++++++++++ src/BulkManager/BulkManager.php | 9 +- 5 files changed, 374 insertions(+), 1 deletion(-) create mode 100644 src/BulkManager/BulkAction/ArchiveHandler.php create mode 100644 src/BulkManager/BulkAction/PublishHandler.php create mode 100644 src/BulkManager/BulkAction/UnPublishHandler.php diff --git a/lang/en.yml b/lang/en.yml index 23f7cc1..ac2878c 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -7,6 +7,9 @@ en: DELETE_SELECT_LABEL: Delete ACTION_BTN_LABEL: Go SELECT_ALL_LABEL: Select all + PUBLISH_SELECT_LABEL: Publish + UNPUBLISH_SELECT_LABEL: UnPublish + ARCHIVE_SELECT_LABEL: Archive GRIDFIELD_BULKMANAGER_EDIT_HANDLER: HEADER_TEXT: Editing {count} {class} TOGGLE_ALL_LINK: Show/Hide all diff --git a/src/BulkManager/BulkAction/ArchiveHandler.php b/src/BulkManager/BulkAction/ArchiveHandler.php new file mode 100644 index 0000000..6797138 --- /dev/null +++ b/src/BulkManager/BulkAction/ArchiveHandler.php @@ -0,0 +1,121 @@ + action map. + * + * @var array + */ + private static $url_handlers = array( + '' => 'archive', + ); + + /** + * Front-end label for this handler's action + * + * @var string + */ + protected $label = 'Archive'; + + /** + * Front-end icon path for this handler's action. + * + * @var string + */ + protected $icon = ''; + + /** + * Extra classes to add to the bulk action button for this handler + * Can also be used to set the button font-icon e.g. font-icon-trash + * + * @var string + */ + protected $buttonClasses = 'font-icon-trash'; + + /** + * Whether this handler should be called via an XHR from the front-end + * + * @var boolean + */ + protected $xhr = true; + + /** + * Set to true is this handler will destroy any data. + * A warning and confirmation will be shown on the front-end. + * + * @var boolean + */ + protected $destructive = true; + + /** + * Return i18n localized front-end label + * + * @return array + */ + public function getI18nLabel() + { + return _t('GRIDFIELD_BULK_MANAGER.ARCHIVE_SELECT_LABEL', $this->getLabel()); + } + + /** + * Archive the selected records passed from the archive bulk action. + * + * @param HTTPRequest $request + * + * @return HTTPResponse List of affected records ID + */ + public function archive(HTTPRequest $request) + { + $records = $this->getRecords(); + + $successes = array(); + $errors = array(); + + foreach ($records as $record) + { + $done = $record->doArchive(); + if ($done) + { + array_push($successes, $record->ID); + }else{ + array_push($errors, array('id' => $record->ID, 'message' => $done)); + } + } + + $response = new HTTPResponse(Convert::raw2json(array( + 'done' => $successes, + 'errors' => $errors, + ))); + $response->addHeader('Content-Type', 'text/json'); + + return $response; + } +} diff --git a/src/BulkManager/BulkAction/PublishHandler.php b/src/BulkManager/BulkAction/PublishHandler.php new file mode 100644 index 0000000..92c043f --- /dev/null +++ b/src/BulkManager/BulkAction/PublishHandler.php @@ -0,0 +1,121 @@ + action map. + * + * @var array + */ + private static $url_handlers = array( + '' => 'publish', + ); + + /** + * Front-end label for this handler's action + * + * @var string + */ + protected $label = 'Publish'; + + /** + * Front-end icon path for this handler's action. + * + * @var string + */ + protected $icon = ''; + + /** + * Extra classes to add to the bulk action button for this handler + * Can also be used to set the button font-icon e.g. font-icon-trash + * + * @var string + */ + protected $buttonClasses = 'font-icon-rocket'; + + /** + * Whether this handler should be called via an XHR from the front-end + * + * @var boolean + */ + protected $xhr = true; + + /** + * Set to true is this handler will destroy any data. + * A warning and confirmation will be shown on the front-end. + * + * @var boolean + */ + protected $destructive = false; + + /** + * Return i18n localized front-end label + * + * @return array + */ + public function getI18nLabel() + { + return _t('GRIDFIELD_BULK_MANAGER.PUBLISH_SELECT_LABEL', $this->getLabel()); + } + + /** + * Publish the selected records passed from the publish bulk action. + * + * @param HTTPRequest $request + * + * @return HTTPResponse List of affected records ID + */ + public function publish(HTTPRequest $request) + { + $records = $this->getRecords(); + + $successes = array(); + $errors = array(); + + foreach ($records as $record) + { + $done = $record->publishRecursive(); + if ($done) + { + array_push($successes, $record->ID); + }else{ + array_push($errors, array('id' => $record->ID, 'message' => $done)); + } + } + + $response = new HTTPResponse(Convert::raw2json(array( + 'done' => $successes, + 'errors' => $errors, + ))); + $response->addHeader('Content-Type', 'text/json'); + + return $response; + } +} diff --git a/src/BulkManager/BulkAction/UnPublishHandler.php b/src/BulkManager/BulkAction/UnPublishHandler.php new file mode 100644 index 0000000..7047a47 --- /dev/null +++ b/src/BulkManager/BulkAction/UnPublishHandler.php @@ -0,0 +1,121 @@ + action map. + * + * @var array + */ + private static $url_handlers = array( + '' => 'unPublish', + ); + + /** + * Front-end label for this handler's action + * + * @var string + */ + protected $label = 'UnPublish'; + + /** + * Front-end icon path for this handler's action. + * + * @var string + */ + protected $icon = ''; + + /** + * Extra classes to add to the bulk action button for this handler + * Can also be used to set the button font-icon e.g. font-icon-trash + * + * @var string + */ + protected $buttonClasses = ''; + + /** + * Whether this handler should be called via an XHR from the front-end + * + * @var boolean + */ + protected $xhr = true; + + /** + * Set to true is this handler will destroy any data. + * A warning and confirmation will be shown on the front-end. + * + * @var boolean + */ + protected $destructive = false; + + /** + * Return i18n localized front-end label + * + * @return array + */ + public function getI18nLabel() + { + return _t('GRIDFIELD_BULK_MANAGER.UNPUBLISH_SELECT_LABEL', $this->getLabel()); + } + + /** + * UnPublish the selected records passed from the unPublish bulk action. + * + * @param HTTPRequest $request + * + * @return HTTPResponse List of affected records ID + */ + public function unPublish(HTTPRequest $request) + { + $records = $this->getRecords(); + + $successes = array(); + $errors = array(); + + foreach ($records as $record) + { + $done = $record->doUnpublish(); + if ($done) + { + array_push($successes, $record->ID); + }else{ + array_push($errors, array('id' => $record->ID, 'message' => $done)); + } + } + + $response = new HTTPResponse(Convert::raw2json(array( + 'done' => $successes, + 'errors' => $errors, + ))); + $response->addHeader('Content-Type', 'text/json'); + + return $response; + } +} diff --git a/src/BulkManager/BulkManager.php b/src/BulkManager/BulkManager.php index 99296d6..2a29934 100644 --- a/src/BulkManager/BulkManager.php +++ b/src/BulkManager/BulkManager.php @@ -45,7 +45,7 @@ class BulkManager implements GridField_HTMLProvider, GridField_ColumnProvider, G * @param array $editableFields List of editable fields * @param bool $defaultActions Use default actions list. False to start fresh. */ - public function __construct($editableFields = null, $defaultActions = true) + public function __construct($editableFields = null, $defaultActions = true, $defaultVersionedActions = false) { if ($editableFields != null) { $this->setConfig('editableFields', $editableFields); @@ -56,6 +56,13 @@ class BulkManager implements GridField_HTMLProvider, GridField_ColumnProvider, G ->addBulkAction(BulkAction\EditHandler::class) ->addBulkAction(BulkAction\UnlinkHandler::class) ->addBulkAction(BulkAction\DeleteHandler::class); + } elseif ($defaultVersionedActions) { + $this + ->addBulkAction(BulkAction\EditHandler::class) + ->addBulkAction(BulkAction\UnlinkHandler::class) + ->addBulkAction(BulkAction\ArchiveHandler::class) + ->addBulkAction(BulkAction\UnPublishHandler::class) + ->addBulkAction(BulkAction\PublishHandler::class); } }