From d57ea0bd46507cf0de29fe8e8f6ac26a4f061695 Mon Sep 17 00:00:00 2001 From: Svenvdzwet Date: Tue, 27 Dec 2022 13:55:08 +0100 Subject: [PATCH 01/10] Added uploader javascript to the top of the cms page so the reducer is added whenever the cms is loaded. --- _config/config.yml | 3 +++ src/BulkUploader/BulkUploader.php | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 _config/config.yml diff --git a/_config/config.yml b/_config/config.yml new file mode 100644 index 0000000..4df111e --- /dev/null +++ b/_config/config.yml @@ -0,0 +1,3 @@ +SilverStripe\Admin\LeftAndMain: + extra_requirements_javascript: + - 'colymba/gridfield-bulk-editing-tools: client/dist/js/main.js' diff --git a/src/BulkUploader/BulkUploader.php b/src/BulkUploader/BulkUploader.php index 2097c11..9a4b7e8 100644 --- a/src/BulkUploader/BulkUploader.php +++ b/src/BulkUploader/BulkUploader.php @@ -293,8 +293,8 @@ class BulkUploader implements GridField_HTMLProvider, GridField_URLHandler 'Colspan' => (count($gridField->getColumns() ?? [])), 'UploadField' => $uploadField->Field() // call ->Field() to get requirements in right order )); - - Requirements::javascript('colymba/gridfield-bulk-editing-tools:client/dist/js/main.js'); + //This one is no longer needed since the javascript is now loaded at the top of the cms + //Requirements::javascript('colymba/gridfield-bulk-editing-tools:client/dist/js/main.js'); Requirements::css('colymba/gridfield-bulk-editing-tools:client/dist/styles/main.css'); Requirements::add_i18n_javascript('colymba/gridfield-bulk-editing-tools:client/lang'); From d333fad49c870d892f9abe75bbedf3f238fcaec2 Mon Sep 17 00:00:00 2001 From: Svenvdzwet Date: Wed, 28 Dec 2022 11:29:24 +0100 Subject: [PATCH 02/10] Changed namespacing so the fix is usable as long as the fix is not merged --- .upgrade.yml | 18 ++++++------ _config/config.yml | 2 +- client/src/js/manager.js | 2 +- client/src/js/managerBulkEditingForm.js | 2 +- composer.json | 8 +++--- docs/en/BULK_MANAGER.md | 8 +++--- src/BulkManager/BulkAction/ArchiveHandler.php | 22 +++++++-------- src/BulkManager/BulkAction/DeleteHandler.php | 22 +++++++-------- src/BulkManager/BulkAction/EditHandler.php | 26 ++++++++--------- src/BulkManager/BulkAction/Handler.php | 28 +++++++++---------- src/BulkManager/BulkAction/PublishHandler.php | 24 ++++++++-------- .../BulkAction/UnPublishHandler.php | 24 ++++++++-------- src/BulkManager/BulkAction/UnlinkHandler.php | 22 +++++++-------- src/BulkManager/BulkManager.php | 4 +-- src/BulkTools/HTTPBulkToolsResponse.php | 2 +- src/BulkUploader/BulkUploadField.php | 2 +- src/BulkUploader/BulkUploadHandler.php | 12 ++++---- src/BulkUploader/BulkUploader.php | 8 +++--- .../BulkManager/BulkManagerButtons.ss | 0 .../BulkUpload/BulkUploader.ss | 0 20 files changed, 118 insertions(+), 118 deletions(-) rename templates/{Colymba => Violet88}/BulkManager/BulkManagerButtons.ss (100%) rename templates/{Colymba => Violet88}/BulkUpload/BulkUploader.ss (100%) diff --git a/.upgrade.yml b/.upgrade.yml index be82823..2257e30 100644 --- a/.upgrade.yml +++ b/.upgrade.yml @@ -1,10 +1,10 @@ mappings: - GridFieldBulkActionDeleteHandler: Colymba\BulkManager\BulkAction\DeleteHandler - GridFieldBulkActionEditHandler: Colymba\BulkManager\BulkAction\EditHandler - GridFieldBulkActionHandler: Colymba\BulkManager\BulkAction\Handler - GridFieldBulkActionUnlinkHandler: Colymba\BulkManager\BulkAction\UnlinkHandler - GridFieldBulkManager: Colymba\BulkManager\BulkManager - BulkUploadField: Colymba\BulkUpload\BulkUploadField - GridFieldBulkImageUpload: Colymba\BulkUpload\GridFieldBulkImageUpload - GridFieldBulkUpload: Colymba\BulkUpload\BulkUploader - GridFieldBulkUpload_Request: Colymba\BulkUpload\BulkUploadHandler + GridFieldBulkActionDeleteHandler: Violet88\BulkManager\BulkAction\DeleteHandler + GridFieldBulkActionEditHandler: Violet88\BulkManager\BulkAction\EditHandler + GridFieldBulkActionHandler: Violet88\BulkManager\BulkAction\Handler + GridFieldBulkActionUnlinkHandler: Violet88\BulkManager\BulkAction\UnlinkHandler + GridFieldBulkManager: Violet88\BulkManager\BulkManager + BulkUploadField: Violet88\BulkUpload\BulkUploadField + GridFieldBulkImageUpload: Violet88\BulkUpload\GridFieldBulkImageUpload + GridFieldBulkUpload: Violet88\BulkUpload\BulkUploader + GridFieldBulkUpload_Request: Violet88\BulkUpload\BulkUploadHandler diff --git a/_config/config.yml b/_config/config.yml index 4df111e..7893658 100644 --- a/_config/config.yml +++ b/_config/config.yml @@ -1,3 +1,3 @@ SilverStripe\Admin\LeftAndMain: extra_requirements_javascript: - - 'colymba/gridfield-bulk-editing-tools: client/dist/js/main.js' + - 'violet88/gridfield-bulk-editing-tools: client/dist/js/main.js' diff --git a/client/src/js/manager.js b/client/src/js/manager.js index 06e3957..649d5e2 100644 --- a/client/src/js/manager.js +++ b/client/src/js/manager.js @@ -2,7 +2,7 @@ import jQuery from 'jquery'; import i18n from 'i18n'; -jQuery.entwine('colymba', ($) => { +jQuery.entwine('violet88', ($) => { /** * Makes sure the component is above the headers */ diff --git a/client/src/js/managerBulkEditingForm.js b/client/src/js/managerBulkEditingForm.js index 5be7856..9c69708 100644 --- a/client/src/js/managerBulkEditingForm.js +++ b/client/src/js/managerBulkEditingForm.js @@ -1,7 +1,7 @@ /* global window */ import jQuery from 'jquery'; -jQuery.entwine('colymba', ($) => { +jQuery.entwine('violet88', ($) => { /** * Toggle all accordion forms * open or closed diff --git a/composer.json b/composer.json index 70eb9ce..c93a756 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "colymba/gridfield-bulk-editing-tools", + "name": "violet88/gridfield-bulk-editing-tools", "type": "silverstripe-vendormodule", "description": "SilverStripe GridField component to upload images/files and edit records in bulk", "homepage": "https://github.com/colymba/GridFieldBulkEditingTools", @@ -30,9 +30,9 @@ }, "autoload": { "psr-4": { - "Colymba\\BulkTools\\": "src/BulkTools/", - "Colymba\\BulkManager\\": "src/BulkManager/", - "Colymba\\BulkUpload\\": "src/BulkUploader/" + "Violet88\\BulkTools\\": "src/BulkTools/", + "Violet88\\BulkManager\\": "src/BulkManager/", + "Violet88\\BulkUpload\\": "src/BulkUploader/" } } } diff --git a/docs/en/BULK_MANAGER.md b/docs/en/BULK_MANAGER.md index 3838016..7cfc171 100644 --- a/docs/en/BULK_MANAGER.md +++ b/docs/en/BULK_MANAGER.md @@ -12,7 +12,7 @@ $config->addComponent(new \Colymba\BulkManager\BulkManager()); The component's options can be configurated individually or in bulk through the 'config' functions like this: ```php -$config->getComponentByType('Colymba\\BulkManager\\BulkManager')->setConfig($reference, $value); +$config->getComponentByType('Violet88\\BulkManager\\BulkManager')->setConfig($reference, $value); ``` ### $config overview @@ -27,14 +27,14 @@ To add a custom bulk action to the list use: ```php $config - ->getComponentByType('Colymba\\BulkManager\\BulkManager') + ->getComponentByType('Violet88\\BulkManager\\BulkManager') ->addBulkAction('Namespace\\ClassName') ``` #### Custom action handler -When creating your own bulk action `RequestHandler`, you should extend `Colymba\BulkManager\BulkAction\Handler` which will expose 2 useful functions `getRecordIDList()` and `getRecords()` returning either an array with the selected records IDs or a `DataList` of the selected records. +When creating your own bulk action `RequestHandler`, you should extend `Violet88\BulkManager\BulkAction\Handler` which will expose 2 useful functions `getRecordIDList()` and `getRecords()` returning either an array with the selected records IDs or a `DataList` of the selected records. Make sure to define the handler's `$url_segment`, from which the handler will be called and its relating `$allowed_actions` and `$url_handlers`. See `Handler`, `DeleteHandler` and `UnlinkHandler` for examples. #### Front-end config -Bulk action handler's front-end configuration is set via class properties `label`, `icon`, `buttonClasses`, `xhr` and `destructive`. See `Handler`, `DeleteHandler` and `UnlinkHandler` for reference and examples. +Bulk action handler's front-end configuration is set via class properties `label`, `icon`, `buttonClasses`, `xhr` and `destructive`. See `Handler`, `DeleteHandler` and `UnlinkHandler` for reference and examples. diff --git a/src/BulkManager/BulkAction/ArchiveHandler.php b/src/BulkManager/BulkAction/ArchiveHandler.php index 32b4b9d..a40b3d8 100644 --- a/src/BulkManager/BulkAction/ArchiveHandler.php +++ b/src/BulkManager/BulkAction/ArchiveHandler.php @@ -1,9 +1,9 @@ addExtraClass('center cms-content'); $form->setAttribute('data-pjax-fragment', 'CurrentForm Content'); - Requirements::javascript('colymba/gridfield-bulk-editing-tools:client/dist/js/main.js'); - Requirements::css('colymba/gridfield-bulk-editing-tools:client/dist/styles/main.css'); - Requirements::add_i18n_javascript('colymba/gridfield-bulk-editing-tools:lang'); + Requirements::javascript('violet88/gridfield-bulk-editing-tools:client/dist/js/main.js'); + Requirements::css('violet88/gridfield-bulk-editing-tools:client/dist/styles/main.css'); + Requirements::add_i18n_javascript('violet88/gridfield-bulk-editing-tools:lang'); if ($this->request->isAjax()) { $response = new HTTPResponse( diff --git a/src/BulkManager/BulkAction/Handler.php b/src/BulkManager/BulkAction/Handler.php index 69be806..2926514 100644 --- a/src/BulkManager/BulkAction/Handler.php +++ b/src/BulkManager/BulkAction/Handler.php @@ -1,6 +1,6 @@ destructive = $destructive; return $this; } - + /** * True if the hanlder performs destructive actions - * + * * @return boolean */ public function getDestructive() @@ -130,11 +130,11 @@ class Handler extends RequestHandler /** * Set if handler is called via XHR - * + * * @param boolean xhr If true the handler will be called via an XHR from front-end * @return RequestHandler */ - + public function setXhr($xhr) { $this->xhr = $xhr; diff --git a/src/BulkManager/BulkAction/PublishHandler.php b/src/BulkManager/BulkAction/PublishHandler.php index 0afd41e..c090be0 100644 --- a/src/BulkManager/BulkAction/PublishHandler.php +++ b/src/BulkManager/BulkAction/PublishHandler.php @@ -1,9 +1,9 @@ setStatusCode(500); $response->setMessage($ex->getMessage()); } - + return $response; } } diff --git a/src/BulkManager/BulkAction/UnPublishHandler.php b/src/BulkManager/BulkAction/UnPublishHandler.php index 7bdec81..f6821d4 100644 --- a/src/BulkManager/BulkAction/UnPublishHandler.php +++ b/src/BulkManager/BulkAction/UnPublishHandler.php @@ -1,9 +1,9 @@ getRecords(); $response = new HTTPBulkToolsResponse(false, $this->gridField); - + try { foreach ($records as $record) { diff --git a/src/BulkManager/BulkAction/UnlinkHandler.php b/src/BulkManager/BulkAction/UnlinkHandler.php index 0dc8f45..f6ed78c 100644 --- a/src/BulkManager/BulkAction/UnlinkHandler.php +++ b/src/BulkManager/BulkAction/UnlinkHandler.php @@ -1,9 +1,9 @@ addExtraClass('bulkActionName no-change-track form-group--no-label') ->setAttribute('id', '') ->setEmptyString(_t('SilverStripe\Admin\LeftAndMain.DropdownBatchActionsDefault', 'Choose an action...')); - + $templateData = array( 'Menu' => $dropDownActionsList->FieldHolder(), diff --git a/src/BulkTools/HTTPBulkToolsResponse.php b/src/BulkTools/HTTPBulkToolsResponse.php index 6c6c930..c0c0ac1 100644 --- a/src/BulkTools/HTTPBulkToolsResponse.php +++ b/src/BulkTools/HTTPBulkToolsResponse.php @@ -1,6 +1,6 @@ component->getFileRelationName($this->gridField); $record->{"{$fileRelationName}ID"} = $fileID; $record->write(); //HasManyList call write on record but not ManyManyList, so we call it here again - + $this->gridField->list->add($record); if ( @@ -111,7 +111,7 @@ class BulkUploadHandler extends RequestHandler { $assetAdmin = AssetAdmin::singleton(); $uploadResponse = $assetAdmin->apiCreateFile($request); - + if ($uploadResponse->getStatusCode() == 200) { $responseData = Convert::json2array($uploadResponse->getBody()); @@ -121,7 +121,7 @@ class BulkUploadHandler extends RequestHandler $bulkToolsResponse = new HTTPBulkToolsResponse(false, $this->gridField); $bulkToolsResponse->addSuccessRecord($record); - + $responseData['bulkTools'] = json_decode($bulkToolsResponse->getBody() ?? ''); $uploadResponse->setBody(json_encode(array($responseData))); } diff --git a/src/BulkUploader/BulkUploader.php b/src/BulkUploader/BulkUploader.php index 9a4b7e8..b7ebc63 100644 --- a/src/BulkUploader/BulkUploader.php +++ b/src/BulkUploader/BulkUploader.php @@ -1,6 +1,6 @@ $data->renderWith('Colymba\\BulkUpload\\BulkUploader'), + 'before' => $data->renderWith('Violet88\\BulkUpload\\BulkUploader'), ); } diff --git a/templates/Colymba/BulkManager/BulkManagerButtons.ss b/templates/Violet88/BulkManager/BulkManagerButtons.ss similarity index 100% rename from templates/Colymba/BulkManager/BulkManagerButtons.ss rename to templates/Violet88/BulkManager/BulkManagerButtons.ss diff --git a/templates/Colymba/BulkUpload/BulkUploader.ss b/templates/Violet88/BulkUpload/BulkUploader.ss similarity index 100% rename from templates/Colymba/BulkUpload/BulkUploader.ss rename to templates/Violet88/BulkUpload/BulkUploader.ss From 4653be679fad893ee1a332336c7e4bdbb429952b Mon Sep 17 00:00:00 2001 From: Svenvdzwet Date: Wed, 28 Dec 2022 11:48:07 +0100 Subject: [PATCH 03/10] Changed namespacing so the fix is usable as long as the fix is not merged --- client/dist/js/main.js | 2 +- composer.json | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/client/dist/js/main.js b/client/dist/js/main.js index 57f53a3..2dc6023 100644 --- a/client/dist/js/main.js +++ b/client/dist/js/main.js @@ -1 +1 @@ -!function(){"use strict";var e={157:function(e,t,i){var s;((s=i(311))&&s.__esModule?s:{default:s}).default.entwine("ss",(e=>{window.bulkTools={gridfieldRefresh(e,t){t.isError||(t.isDestructive?this.removeGridFieldRows(e,t.records.success):this.updateGridFieldRows(e,t.records.success),this.failedGridFieldRows(e,t.records.failed))},getGridFieldRow(e,t){return e.find(`.ss-gridfield-item[data-id="${t.id}"][data-class="${t.class}"]`)},cleanGridFieldRow(e){return e.removeClass("bt-deleted bt-failed bt-updated").removeAttr("bt-error")},removeGridFieldRows(e,t){t.forEach((function(t){this.getGridFieldRow(e,t).addClass("bt-deleted").fadeOut(2e3)}),this),e.entwine(".").entwine("ss").delay(2e3).reload()},failedGridFieldRows(e,t){t.forEach((function(t){this.getGridFieldRow(e,t).addClass("bt-failed").attr("bt-error",t.message)}),this)},updateGridFieldRows(t,i){t.find(".ss-gridfield-item.ss-gridfield-no-items").remove(),i.forEach((function(i){const s=this.getGridFieldRow(t,i),d=e(i.row).addClass("bt-updated");1===s.length?s.replaceWith(d):t.find(".ss-gridfield-items").prepend(d)}),this)}}}))},572:function(e,t,i){var s=n(i(311)),d=n(i(754));function n(e){return e&&e.__esModule?e:{default:e}}s.default.entwine("colymba",(e=>{e(".bulkManagerOptions").entwine({onmatch(){const t=this.parents("thead"),i=t.find("tr"),s=t.find([".filter-header",".sortable-header"].join(",")),d=i.index(this);let n=i.length-1;s.each(((e,t)=>{const s=i.index(t);sn&&i.eq(n).insertAfter(e(this))}}),e("td.col-bulkSelect").entwine({onmouseover(){e(this).parents(".ss-gridfield-item").find(".edit-link").removeClass("edit-link").addClass("tempDisabledEditLink")},onmouseout(){e(this).parents(".ss-gridfield-item").find(".tempDisabledEditLink").addClass("edit-link").removeClass("tempDisabledEditLink")},onclick(t){const i=e(t.target).find("input");e(i).prop("checked")?e(i).prop("checked",!1):e(i).prop("checked",!0)}}),e("td.col-bulkSelect input").entwine({onmatch(){},onunmatch(){},onclick(){e(this).parents(".grid-field__table").find("input.bulkSelectAll").prop("checked","")}}),e("input.bulkSelectAll").entwine({onclick(){const t=e(this).prop("checked");e(this).parents(".grid-field__table").find("td.col-bulkSelect input").prop("checked",t).trigger("change")},getSelectRecordsID(){return e(this).parents(".grid-field__table").find("td.col-bulkSelect input:checked").map((function(){return parseInt(e(this).data("record"),10)})).get()}}),e("select.bulkActionName").entwine({onchange(){const t=e(this).val(),i=e(this).parents(".bulkManagerOptions").find(".doBulkActionButton"),s=i.data("config");if(e.each(s,((e,s)=>{e!==t&&i.removeClass(s.buttonClasses)})),t){if(i.removeClass("disabled"),i.addClass(s[t].buttonClasses).addClass("btn-outline-secondary"),s[t].icon){const e=i.find("img");e.length?e.attr("src",s[t].icon):i.prepend(``)}else i.find("img").remove();s[t].destructive?i.addClass("btn-outline-danger"):i.removeClass("btn-outline-danger")}else i.addClass("disabled")}}),e(".doBulkActionButton").entwine({getActionURL(e,t){const i=(new Date).getTime();let s=t.split("?"),d="";return e&&(d=`/${e}`),s=s[1]?`${s[0]+d}?${s[1]}&cacheBuster=${i}`:`${s[0]+d}?cacheBuster=${i}`,s},onclick(){const t=e(this).parents(".bulkManagerOptions").find("select.bulkActionName").val(),i=e(this).parents(".bulkManagerOptions").find("input.bulkSelectAll:first").getSelectRecordsID();this.doBulkAction(t,i)},doBulkAction(t,i){const{bulkTools:s}=window,n=e(this).parents(".bulkManagerOptions"),a=n.find("a.doBulkActionButton"),r=n.find(".message"),l=a.data("config");let o=this.getActionURL(t,e(this).data("url"));const c={records:i};if(i.length<=0)return alert(d.default._t("GRIDFIELD_BULK_MANAGER.BULKACTION_EMPTY_SELECT")),!1;if(l[t].destructive&&!confirm(d.default._t("GRIDFIELD_BULK_MANAGER.CONFIRM_DESTRUCTIVE_ACTION")))return!1;if(a.addClass("loading"),r.removeClass("static show error warning"),l[t].xhr)e.ajax({url:o,data:c,type:"POST",context:e(this)}).always((function(t){let i=t;a.removeClass("loading"),t.responseText&&(i=JSON.parse(t.responseText)),r.html(i.message),i.isError?r.addClass("static error"):i.isWarning?r.addClass("show warning"):r.addClass("show"),s.gridfieldRefresh(e(this).parents(".ss-gridfield"),i)}));else{o=`${o}&${`records[]=${i.join("&records[]=")}`}`,window.location.href=o}return!0}})}))},453:function(e,t,i){var s;((s=i(311))&&s.__esModule?s:{default:s}).default.entwine("colymba",(e=>{e("#bulkEditToggle").entwine({onclick(){const t=this.parents("form").find(".ss-toggle .ui-accordion-header");let i=this.data("state");i=i&&"close"!==i?"close":"open",t.each((function(){const t=e(this);"open"!==i||t.hasClass("ui-state-active")||t.click(),"close"===i&&t.hasClass("ui-state-active")&&t.click()})),this.data("state",i)}}),e(".bulkEditingFieldHolder").entwine({onchange(){this.removeClass("updated"),this.hasClass("hasUpdate")||this.addClass("hasUpdate")}})}))},545:function(e,t,i){var s=n(i(311)),d=n(i(648));function n(e){return e&&e.__esModule?e:{default:e}}const{bulkTools:a}=window,r=e=>()=>(t,i)=>{let{type:d,payload:n}=i;switch(d){case"UPLOADFIELD_ADD_FILE":return-1!==n.fieldId.indexOf("_BU")&&n.file.id&&(e=>{const t=(0,s.default)(`#${e.fieldId}`),i=t.parents(".ss-gridfield"),d=t.data("schema");s.default.ajax(d.data.attachFileEndpoint.url,{method:d.data.attachFileEndpoint.method,data:{fileID:e.file.id}}).done((e=>{a.gridfieldRefresh(i,e)}))})(n),e(t,{type:d,payload:n});case"UPLOADFIELD_UPLOAD_SUCCESS":return-1!==n.fieldId.indexOf("_BU")&&(e=>{const t=(0,s.default)(`#${e.fieldId}`).parents(".ss-gridfield");a.gridfieldRefresh(t,e.json.bulkTools)})(n),e(t,{type:d,payload:n});default:return e(t,{type:d,payload:n})}};document.addEventListener("DOMContentLoaded",(()=>{d.default.transform("bulkUploaderTransformation",(e=>{e.reducer("assetAdmin",r)}))}))},648:function(e){e.exports=Injector},754:function(e){e.exports=i18n},311:function(e){e.exports=jQuery}},t={};function i(s){var d=t[s];if(void 0!==d)return d.exports;var n=t[s]={exports:{}};return e[s](n,n.exports,i),n.exports}i(157),i(572),i(453),i(545)}(); \ No newline at end of file +!function(){"use strict";var e={157:function(e,t,i){var s;((s=i(311))&&s.__esModule?s:{default:s}).default.entwine("ss",(e=>{window.bulkTools={gridfieldRefresh(e,t){t.isError||(t.isDestructive?this.removeGridFieldRows(e,t.records.success):this.updateGridFieldRows(e,t.records.success),this.failedGridFieldRows(e,t.records.failed))},getGridFieldRow(e,t){return e.find(`.ss-gridfield-item[data-id="${t.id}"][data-class="${t.class}"]`)},cleanGridFieldRow(e){return e.removeClass("bt-deleted bt-failed bt-updated").removeAttr("bt-error")},removeGridFieldRows(e,t){t.forEach((function(t){this.getGridFieldRow(e,t).addClass("bt-deleted").fadeOut(2e3)}),this),e.entwine(".").entwine("ss").delay(2e3).reload()},failedGridFieldRows(e,t){t.forEach((function(t){this.getGridFieldRow(e,t).addClass("bt-failed").attr("bt-error",t.message)}),this)},updateGridFieldRows(t,i){t.find(".ss-gridfield-item.ss-gridfield-no-items").remove(),i.forEach((function(i){const s=this.getGridFieldRow(t,i),d=e(i.row).addClass("bt-updated");1===s.length?s.replaceWith(d):t.find(".ss-gridfield-items").prepend(d)}),this)}}}))},572:function(e,t,i){var s=n(i(311)),d=n(i(754));function n(e){return e&&e.__esModule?e:{default:e}}s.default.entwine("colymba",(e=>{e(".bulkManagerOptions").entwine({onmatch(){const t=this.parents("thead"),i=t.find("tr"),s=t.find([".filter-header",".sortable-header"].join(",")),d=i.index(this);let n=i.length-1;s.each(((e,t)=>{const s=i.index(t);sn&&i.eq(n).insertAfter(e(this))}}),e("td.col-bulkSelect").entwine({onmouseover(){e(this).parents(".ss-gridfield-item").find(".edit-link").removeClass("edit-link").addClass("tempDisabledEditLink")},onmouseout(){e(this).parents(".ss-gridfield-item").find(".tempDisabledEditLink").addClass("edit-link").removeClass("tempDisabledEditLink")},onclick(t){const i=e(t.target).find("input");e(i).prop("checked")?e(i).prop("checked",!1):e(i).prop("checked",!0)}}),e("td.col-bulkSelect input").entwine({onmatch(){},onunmatch(){},onclick(){e(this).parents(".grid-field__table").find("input.bulkSelectAll").prop("checked","")}}),e("input.bulkSelectAll").entwine({onclick(){const t=e(this).prop("checked");e(this).parents(".grid-field__table").find("td.col-bulkSelect input").prop("checked",t).trigger("change")},getSelectRecordsID(){return e(this).parents(".grid-field__table").find("td.col-bulkSelect input:checked").map((function(){return parseInt(e(this).data("record"),10)})).get()}}),e("select.bulkActionName").entwine({onchange(){const t=e(this).val(),i=e(this).parents(".bulkManagerOptions").find(".doBulkActionButton"),s=i.data("config");if(e.each(s,((e,s)=>{e!==t&&i.removeClass(s.buttonClasses)})),t){if(i.removeClass("disabled"),i.addClass(s[t].buttonClasses).addClass("btn-outline-secondary"),s[t].icon){const e=i.find("img");e.length?e.attr("src",s[t].icon):i.prepend(``)}else i.find("img").remove();s[t].destructive?i.addClass("btn-outline-danger"):i.removeClass("btn-outline-danger")}else i.addClass("disabled")}}),e(".doBulkActionButton").entwine({getActionURL(e,t){const i=(new Date).getTime();let s=t.split("?"),d="";return e&&(d=`/${e}`),s=s[1]?`${s[0]+d}?${s[1]}&cacheBuster=${i}`:`${s[0]+d}?cacheBuster=${i}`,s},onclick(){const t=e(this).parents(".bulkManagerOptions").find("select.bulkActionName").val(),i=e(this).parents(".bulkManagerOptions").find("input.bulkSelectAll:first").getSelectRecordsID();this.doBulkAction(t,i)},doBulkAction(t,i){const{bulkTools:s}=window,n=e(this).parents(".bulkManagerOptions"),a=n.find("a.doBulkActionButton"),r=n.find(".message"),l=a.data("config");let o=this.getActionURL(t,e(this).data("url"));const c={records:i};if(i.length<=0)return alert(d.default._t("GRIDFIELD_BULK_MANAGER.BULKACTION_EMPTY_SELECT")),!1;if(l[t].destructive&&!confirm(d.default._t("GRIDFIELD_BULK_MANAGER.CONFIRM_DESTRUCTIVE_ACTION")))return!1;if(a.addClass("loading"),r.removeClass("static show error warning"),l[t].xhr)e.ajax({url:o,data:c,type:"POST",context:e(this)}).always((function(t){let i=t;a.removeClass("loading"),t.responseText&&(i=JSON.parse(t.responseText)),r.html(i.message),i.isError?r.addClass("static error"):i.isWarning?r.addClass("show warning"):r.addClass("show"),s.gridfieldRefresh(e(this).parents(".ss-gridfield"),i)}));else{o=`${o}&${`records[]=${i.join("&records[]=")}`}`,window.location.href=o}return!0}})}))},453:function(e,t,i){var s;((s=i(311))&&s.__esModule?s:{default:s}).default.entwine("colymba",(e=>{e("#bulkEditToggle").entwine({onclick(){const t=this.parents("form").find(".ss-toggle .ui-accordion-header");let i=this.data("state");i=i&&"close"!==i?"close":"open",t.each((function(){const t=e(this);"open"!==i||t.hasClass("ui-state-active")||t.click(),"close"===i&&t.hasClass("ui-state-active")&&t.click()})),this.data("state",i)}}),e(".bulkEditingFieldHolder").entwine({onchange(){this.removeClass("updated"),this.hasClass("hasUpdate")||this.addClass("hasUpdate")}})}))},545:function(e,t,i){var s=n(i(311)),d=n(i(648));function n(e){return e&&e.__esModule?e:{default:e}}const{bulkTools:a}=window,r=e=>()=>(t,i)=>{let{type:d,payload:n}=i;switch(d){case"UPLOADFIELD_ADD_FILE":return-1!==n.fieldId.indexOf("_BU")&&n.file.id&&(e=>{const t=(0,s.default)(`#${e.fieldId}`),i=t.parents(".ss-gridfield"),d=t.data("schema");s.default.ajax(d.data.attachFileEndpoint.url,{method:d.data.attachFileEndpoint.method,data:{fileID:e.file.id}}).done((e=>{a.gridfieldRefresh(i,e)}))})(n),e(t,{type:d,payload:n});case"UPLOADFIELD_UPLOAD_SUCCESS":return-1!==n.fieldId.indexOf("_BU")&&(e=>{const t=(0,s.default)(`#${e.fieldId}`).parents(".ss-gridfield");a.gridfieldRefresh(t,e.json.bulkTools)})(n),e(t,{type:d,payload:n});default:return e(t,{type:d,payload:n})}};document.addEventListener("DOMContentLoaded",(()=>{d.default.transform("bulkUploaderTransformation",(e=>{e.reducer("assetAdmin",r)}))}))},648:function(e){e.exports=Injector},754:function(e){e.exports=i18n},311:function(e){e.exports=jQuery}},t={};function i(s){var d=t[s];if(void 0!==d)return d.exports;var n=t[s]={exports:{}};return e[s](n,n.exports,i),n.exports}i(157),i(572),i(453),i(545)}(); diff --git a/composer.json b/composer.json index c93a756..816f11d 100644 --- a/composer.json +++ b/composer.json @@ -34,5 +34,11 @@ "Violet88\\BulkManager\\": "src/BulkManager/", "Violet88\\BulkUpload\\": "src/BulkUploader/" } + }, + "config": { + "allow-plugins": { + "composer/installers": true, + "silverstripe/vendor-plugin": true + } } } From e826bfebd62230d49911174c49837a321312af02 Mon Sep 17 00:00:00 2001 From: Svenvdzwet Date: Wed, 28 Dec 2022 11:57:30 +0100 Subject: [PATCH 04/10] Changed namespacing so the fix is usable as long as the fix is not merged --- src/BulkManager/BulkManager.php | 8 ++++---- src/BulkUploader/BulkUploader.php | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/BulkManager/BulkManager.php b/src/BulkManager/BulkManager.php index 4cb613d..fc51bce 100644 --- a/src/BulkManager/BulkManager.php +++ b/src/BulkManager/BulkManager.php @@ -263,9 +263,9 @@ class BulkManager implements GridField_HTMLProvider, GridField_ColumnProvider, G */ public function getHTMLFragments($gridField) { - Requirements::javascript('colymba/gridfield-bulk-editing-tools:client/dist/js/main.js'); - Requirements::css('colymba/gridfield-bulk-editing-tools:client/dist/styles/main.css'); - Requirements::add_i18n_javascript('colymba/gridfield-bulk-editing-tools:client/lang'); + Requirements::javascript('violet88/gridfield-bulk-editing-tools:client/dist/js/main.js'); + Requirements::css('violet88/gridfield-bulk-editing-tools:client/dist/styles/main.css'); + Requirements::add_i18n_javascript('violet88/gridfield-bulk-editing-tools:client/lang'); if (!count($this->config['actions'] ?? [])) { user_error('Trying to use BulkManager without any bulk action.', E_USER_ERROR); @@ -308,7 +308,7 @@ class BulkManager implements GridField_HTMLProvider, GridField_ColumnProvider, G $templateData = new ArrayData($templateData); return array( - 'header' => $templateData->renderWith('Colymba\\BulkManager\\BulkManagerButtons'), + 'header' => $templateData->renderWith('Violet88\\BulkManager\\BulkManagerButtons'), ); } diff --git a/src/BulkUploader/BulkUploader.php b/src/BulkUploader/BulkUploader.php index b7ebc63..9d22714 100644 --- a/src/BulkUploader/BulkUploader.php +++ b/src/BulkUploader/BulkUploader.php @@ -294,7 +294,7 @@ class BulkUploader implements GridField_HTMLProvider, GridField_URLHandler 'UploadField' => $uploadField->Field() // call ->Field() to get requirements in right order )); //This one is no longer needed since the javascript is now loaded at the top of the cms - //Requirements::javascript('colymba/gridfield-bulk-editing-tools:client/dist/js/main.js'); + //Requirements::javascript('violet88/gridfield-bulk-editing-tools:client/dist/js/main.js'); Requirements::css('violet88/gridfield-bulk-editing-tools:client/dist/styles/main.css'); Requirements::add_i18n_javascript('violet88/gridfield-bulk-editing-tools:client/lang'); From a208bee68593ad117065cc45e05d2ac608304f28 Mon Sep 17 00:00:00 2001 From: PixNyb Date: Wed, 20 Mar 2024 10:37:21 +0000 Subject: [PATCH 05/10] SS5 compatibility --- .gitignore | 5 ++++- composer.json | 7 ++++++- src/BulkTools/HTTPBulkToolsResponse.php | 6 +++--- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 9034277..4a02812 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,7 @@ .transifexrc **/css/bourbon **/.sass-cache -node_modules/ \ No newline at end of file +node_modules/ +vendor/ +public/ +composer.lock diff --git a/composer.json b/composer.json index 816f11d..83f4ae7 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,12 @@ "type": "silverstripe-vendormodule", "description": "SilverStripe GridField component to upload images/files and edit records in bulk", "homepage": "https://github.com/colymba/GridFieldBulkEditingTools", - "keywords": ["silverstripe", "bulk upload", "image upload", "gridfield bulk upload"], + "keywords": [ + "silverstripe", + "bulk upload", + "image upload", + "gridfield bulk upload" + ], "license": "BSD-3-Clause", "authors": [ { diff --git a/src/BulkTools/HTTPBulkToolsResponse.php b/src/BulkTools/HTTPBulkToolsResponse.php index c0c0ac1..a498068 100644 --- a/src/BulkTools/HTTPBulkToolsResponse.php +++ b/src/BulkTools/HTTPBulkToolsResponse.php @@ -123,7 +123,7 @@ class HTTPBulkToolsResponse extends HTTPResponse */ public function addHeader($header, $value) { - if($header === "content-type") { + if ($header === "content-type") { return $this; } return parent::addHeader($header, $value); @@ -139,7 +139,7 @@ class HTTPBulkToolsResponse extends HTTPResponse */ public function removeHeader($header) { - if($header === "content-type") { + if ($header === "content-type") { return $this; } return parent::removeHeader($header); @@ -333,7 +333,7 @@ class HTTPBulkToolsResponse extends HTTPResponse ); foreach ($this->successRecords as $record) { - $data = array('id' => $record->ID, 'class' => str_replace('\\', '\\\\', $record->ClassName)); + $data = array('id' => $record->ID, 'class' => str_replace('\\', '\\\\', $record->ClassName ?? '')); if (!$this->removesRows) { $data['row'] = $this->getRecordGridfieldRow($record); } From 4fbab0d232359c3c6eabfcddf47e068ebf70c417 Mon Sep 17 00:00:00 2001 From: PixNyb Date: Wed, 3 Apr 2024 12:15:04 +0000 Subject: [PATCH 06/10] Updated to SS5 and reverted original namespacing --- .upgrade.yml | 18 +- _config/config.yml | 2 +- client/src/js/manager.js | 167 ++++++++++-------- client/src/js/managerBulkEditingForm.js | 37 ++-- composer.json | 8 +- docs/en/BULK_MANAGER.md | 19 +- src/BulkManager/BulkAction/ArchiveHandler.php | 14 +- src/BulkManager/BulkAction/DeleteHandler.php | 6 +- src/BulkManager/BulkAction/EditHandler.php | 22 +-- src/BulkManager/BulkAction/Handler.php | 2 +- src/BulkManager/BulkAction/PublishHandler.php | 14 +- .../BulkAction/UnPublishHandler.php | 14 +- src/BulkManager/BulkAction/UnlinkHandler.php | 6 +- src/BulkManager/BulkManager.php | 19 +- src/BulkTools/HTTPBulkToolsResponse.php | 2 +- src/BulkUploader/BulkUploadField.php | 2 +- src/BulkUploader/BulkUploadHandler.php | 7 +- src/BulkUploader/BulkUploader.php | 15 +- 18 files changed, 195 insertions(+), 179 deletions(-) diff --git a/.upgrade.yml b/.upgrade.yml index 2257e30..be82823 100644 --- a/.upgrade.yml +++ b/.upgrade.yml @@ -1,10 +1,10 @@ mappings: - GridFieldBulkActionDeleteHandler: Violet88\BulkManager\BulkAction\DeleteHandler - GridFieldBulkActionEditHandler: Violet88\BulkManager\BulkAction\EditHandler - GridFieldBulkActionHandler: Violet88\BulkManager\BulkAction\Handler - GridFieldBulkActionUnlinkHandler: Violet88\BulkManager\BulkAction\UnlinkHandler - GridFieldBulkManager: Violet88\BulkManager\BulkManager - BulkUploadField: Violet88\BulkUpload\BulkUploadField - GridFieldBulkImageUpload: Violet88\BulkUpload\GridFieldBulkImageUpload - GridFieldBulkUpload: Violet88\BulkUpload\BulkUploader - GridFieldBulkUpload_Request: Violet88\BulkUpload\BulkUploadHandler + GridFieldBulkActionDeleteHandler: Colymba\BulkManager\BulkAction\DeleteHandler + GridFieldBulkActionEditHandler: Colymba\BulkManager\BulkAction\EditHandler + GridFieldBulkActionHandler: Colymba\BulkManager\BulkAction\Handler + GridFieldBulkActionUnlinkHandler: Colymba\BulkManager\BulkAction\UnlinkHandler + GridFieldBulkManager: Colymba\BulkManager\BulkManager + BulkUploadField: Colymba\BulkUpload\BulkUploadField + GridFieldBulkImageUpload: Colymba\BulkUpload\GridFieldBulkImageUpload + GridFieldBulkUpload: Colymba\BulkUpload\BulkUploader + GridFieldBulkUpload_Request: Colymba\BulkUpload\BulkUploadHandler diff --git a/_config/config.yml b/_config/config.yml index 7893658..a587c82 100644 --- a/_config/config.yml +++ b/_config/config.yml @@ -1,3 +1,3 @@ SilverStripe\Admin\LeftAndMain: extra_requirements_javascript: - - 'violet88/gridfield-bulk-editing-tools: client/dist/js/main.js' + - "colymba/gridfield-bulk-editing-tools: client/dist/js/main.js" diff --git a/client/src/js/manager.js b/client/src/js/manager.js index 649d5e2..ae6bec3 100644 --- a/client/src/js/manager.js +++ b/client/src/js/manager.js @@ -1,18 +1,18 @@ /* global window, alert, confirm */ -import jQuery from 'jquery'; -import i18n from 'i18n'; +import jQuery from "jquery"; +import i18n from "i18n"; -jQuery.entwine('violet88', ($) => { +jQuery.entwine("colymba", ($) => { /** * Makes sure the component is above the headers */ - $('.bulkManagerOptions').entwine({ + $(".bulkManagerOptions").entwine({ onmatch() { - const $parent = this.parents('thead'); - const $tr = $parent.find('tr'); + const $parent = this.parents("thead"); + const $tr = $parent.find("tr"); - const targets = ['.filter-header', '.sortable-header']; - const $target = $parent.find(targets.join(',')); + const targets = [".filter-header", ".sortable-header"]; + const $target = $parent.find(targets.join(",")); const index = $tr.index(this); let newIndex = $tr.length - 1; @@ -30,77 +30,84 @@ jQuery.entwine('violet88', ($) => { }, }); - /** * Bulkselect table cell behaviours */ - $('td.col-bulkSelect').entwine({ + $("td.col-bulkSelect").entwine({ onmouseover() { // disable default row click behaviour -> avoid navigation to edit form when // clicking the checkbox - $(this).parents('.ss-gridfield-item').find('.edit-link').removeClass('edit-link') - .addClass('tempDisabledEditLink'); + $(this) + .parents(".ss-gridfield-item") + .find(".edit-link") + .removeClass("edit-link") + .addClass("tempDisabledEditLink"); }, onmouseout() { // re-enable default row click behaviour - $(this).parents('.ss-gridfield-item').find('.tempDisabledEditLink').addClass('edit-link') - .removeClass('tempDisabledEditLink'); + $(this) + .parents(".ss-gridfield-item") + .find(".tempDisabledEditLink") + .addClass("edit-link") + .removeClass("tempDisabledEditLink"); }, onclick(e) { // check/uncheck checkbox when clicking cell - const cb = $(e.target).find('input'); - if (!$(cb).prop('checked')) { - $(cb).prop('checked', true); + const cb = $(e.target).find("input"); + if (!$(cb).prop("checked")) { + $(cb).prop("checked", true); } else { - $(cb).prop('checked', false); + $(cb).prop("checked", false); } - } + }, }); /** * Individual select checkbox behaviour */ - $('td.col-bulkSelect input').entwine({ - onmatch() { - }, - onunmatch() { - }, + $("td.col-bulkSelect input").entwine({ + onmatch() {}, + onunmatch() {}, onclick() { - $(this).parents('.grid-field__table').find('input.bulkSelectAll').prop('checked', ''); - } + $(this) + .parents(".grid-field__table") + .find("input.bulkSelectAll") + .prop("checked", ""); + }, }); /** * Bulkselect checkbox behaviours */ - $('input.bulkSelectAll').entwine({ + $("input.bulkSelectAll").entwine({ onclick() { - const state = $(this).prop('checked'); - $(this).parents('.grid-field__table') - .find('td.col-bulkSelect input') - .prop('checked', state) - .trigger('change'); + const state = $(this).prop("checked"); + $(this) + .parents(".grid-field__table") + .find("td.col-bulkSelect input") + .prop("checked", state) + .trigger("change"); }, getSelectRecordsID() { - return $(this).parents('.grid-field__table') - .find('td.col-bulkSelect input:checked') + return $(this) + .parents(".grid-field__table") + .find("td.col-bulkSelect input:checked") .map(function () { - return parseInt($(this).data('record'), 10); + return parseInt($(this).data("record"), 10); }) .get(); - } + }, }); - /** * Bulk action dropdown behaviours */ - $('select.bulkActionName').entwine({ + $("select.bulkActionName").entwine({ onchange() { const value = $(this).val(); - const $parent = $(this).parents('.bulkManagerOptions'); - const $btn = $parent.find('.doBulkActionButton'); - const config = $btn.data('config'); + const $parent = $(this).parents(".bulkManagerOptions"); + const $btn = $parent.find(".doBulkActionButton"); + const config = $btn.data("config"); $.each(config, (configKey, configData) => { if (configKey !== value) { @@ -109,45 +116,45 @@ jQuery.entwine('violet88', ($) => { }); if (!value) { - $btn.addClass('disabled'); + $btn.addClass("disabled"); return; } - $btn.removeClass('disabled'); + $btn.removeClass("disabled"); - $btn.addClass(config[value].buttonClasses).addClass('btn-outline-secondary'); + $btn + .addClass(config[value].buttonClasses) + .addClass("btn-outline-secondary"); if (config[value].icon) { - const $img = $btn.find('img'); + const $img = $btn.find("img"); if ($img.length) { - $img.attr('src', config[value].icon); + $img.attr("src", config[value].icon); } else { $btn.prepend(``); } } else { - $btn.find('img').remove(); + $btn.find("img").remove(); } - if (config[value].destructive) { - $btn.addClass('btn-outline-danger'); + $btn.addClass("btn-outline-danger"); } else { - $btn.removeClass('btn-outline-danger'); + $btn.removeClass("btn-outline-danger"); } - } + }, }); - /** * bulk action button behaviours */ - $('.doBulkActionButton').entwine({ + $(".doBulkActionButton").entwine({ getActionURL(action, url) { const cacheBuster = new Date().getTime(); - let newUrl = url.split('?'); + let newUrl = url.split("?"); - let newAction = ''; + let newAction = ""; if (action) { newAction = `/${action}`; } @@ -160,9 +167,12 @@ jQuery.entwine('violet88', ($) => { return newUrl; }, onclick() { - const $parent = $(this).parents('.bulkManagerOptions'); - const action = $parent.find('select.bulkActionName').val(); - const ids = $(this).parents('.bulkManagerOptions').find('input.bulkSelectAll:first').getSelectRecordsID(); + const $parent = $(this).parents(".bulkManagerOptions"); + const action = $parent.find("select.bulkActionName").val(); + const ids = $(this) + .parents(".bulkManagerOptions") + .find("input.bulkSelectAll:first") + .getSelectRecordsID(); this.doBulkAction(action, ids); }, @@ -170,38 +180,40 @@ jQuery.entwine('violet88', ($) => { doBulkAction(action, ids) { const { bulkTools } = window; - const $parent = $(this).parents('.bulkManagerOptions'); - const $btn = $parent.find('a.doBulkActionButton'); - const $msg = $parent.find('.message'); + const $parent = $(this).parents(".bulkManagerOptions"); + const $btn = $parent.find("a.doBulkActionButton"); + const $msg = $parent.find(".message"); - const config = $btn.data('config'); - let url = this.getActionURL(action, $(this).data('url')); + const config = $btn.data("config"); + let url = this.getActionURL(action, $(this).data("url")); const inputData = { records: ids }; if (ids.length <= 0) { - alert(i18n._t('GRIDFIELD_BULK_MANAGER.BULKACTION_EMPTY_SELECT')); + alert(i18n._t("GRIDFIELD_BULK_MANAGER.BULKACTION_EMPTY_SELECT")); return false; } // if ( $btn.hasClass('ss-ui-action-destructive') ) if (config[action].destructive) { - if (!confirm(i18n._t('GRIDFIELD_BULK_MANAGER.CONFIRM_DESTRUCTIVE_ACTION'))) { + if ( + !confirm(i18n._t("GRIDFIELD_BULK_MANAGER.CONFIRM_DESTRUCTIVE_ACTION")) + ) { return false; } } - $btn.addClass('loading'); - $msg.removeClass('static show error warning'); + $btn.addClass("loading"); + $msg.removeClass("static show error warning"); if (config[action].xhr) { $.ajax({ url, data: inputData, - type: 'POST', - context: $(this) + type: "POST", + context: $(this), }).always(function (data) { let returnData = data; - $btn.removeClass('loading'); + $btn.removeClass("loading"); // if request fail, return a +4xx status code, extract json response if (data.responseText) { @@ -211,23 +223,26 @@ jQuery.entwine('violet88', ($) => { $msg.html(returnData.message); if (returnData.isError) { - $msg.addClass('static error'); + $msg.addClass("static error"); } else if (returnData.isWarning) { - $msg.addClass('show warning'); + $msg.addClass("show warning"); } else { - $msg.addClass('show'); + $msg.addClass("show"); } - bulkTools.gridfieldRefresh($(this).parents('.ss-gridfield'), returnData); + bulkTools.gridfieldRefresh( + $(this).parents(".ss-gridfield"), + returnData, + ); }); } else { - const records = `records[]=${ids.join('&records[]=')}`; + const records = `records[]=${ids.join("&records[]=")}`; url = `${url}&${records}`; window.location.href = url; } return true; - } + }, }); }); diff --git a/client/src/js/managerBulkEditingForm.js b/client/src/js/managerBulkEditingForm.js index 9c69708..f21895b 100644 --- a/client/src/js/managerBulkEditingForm.js +++ b/client/src/js/managerBulkEditingForm.js @@ -1,49 +1,50 @@ /* global window */ -import jQuery from 'jquery'; +import jQuery from "jquery"; -jQuery.entwine('violet88', ($) => { +jQuery.entwine("colymba", ($) => { /** * Toggle all accordion forms * open or closed */ - $('#bulkEditToggle').entwine({ + $("#bulkEditToggle").entwine({ onclick() { - const toggleFields = this.parents('form').find('.ss-toggle .ui-accordion-header'); - let state = this.data('state'); + const toggleFields = this.parents("form").find( + ".ss-toggle .ui-accordion-header", + ); + let state = this.data("state"); - if (!state || state === 'close') { - state = 'open'; + if (!state || state === "close") { + state = "open"; } else { - state = 'close'; + state = "close"; } toggleFields.each(function () { const $this = $(this); - if (state === 'open' && !$this.hasClass('ui-state-active')) { + if (state === "open" && !$this.hasClass("ui-state-active")) { $this.click(); } - if (state === 'close' && $this.hasClass('ui-state-active')) { + if (state === "close" && $this.hasClass("ui-state-active")) { $this.click(); } }); - this.data('state', state); - } + this.data("state", state); + }, }); - /** * Contains each rocrds editing fields, * tracks changes and updates... */ - $('.bulkEditingFieldHolder').entwine({ + $(".bulkEditingFieldHolder").entwine({ onchange() { - this.removeClass('updated'); - if (!this.hasClass('hasUpdate')) { - this.addClass('hasUpdate'); + this.removeClass("updated"); + if (!this.hasClass("hasUpdate")) { + this.addClass("hasUpdate"); } - } + }, }); }); diff --git a/composer.json b/composer.json index 83f4ae7..5b369f5 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "violet88/gridfield-bulk-editing-tools", + "name": "colymba/gridfield-bulk-editing-tools", "type": "silverstripe-vendormodule", "description": "SilverStripe GridField component to upload images/files and edit records in bulk", "homepage": "https://github.com/colymba/GridFieldBulkEditingTools", @@ -35,9 +35,9 @@ }, "autoload": { "psr-4": { - "Violet88\\BulkTools\\": "src/BulkTools/", - "Violet88\\BulkManager\\": "src/BulkManager/", - "Violet88\\BulkUpload\\": "src/BulkUploader/" + "Colymba\\BulkTools\\": "src/BulkTools/", + "Colymba\\BulkManager\\": "src/BulkManager/", + "Colymba\\BulkUpload\\": "src/BulkUploader/" } }, "config": { diff --git a/docs/en/BULK_MANAGER.md b/docs/en/BULK_MANAGER.md index 7cfc171..89a7115 100644 --- a/docs/en/BULK_MANAGER.md +++ b/docs/en/BULK_MANAGER.md @@ -1,7 +1,9 @@ # Bulk Manager -Perform actions on multiple records straight from the GridField. Comes with *unlink*, *delete* and bulk *editing*. You can also easily create/add your own. + +Perform actions on multiple records straight from the GridField. Comes with _unlink_, _delete_ and bulk _editing_. You can also easily create/add your own. ## Usage + Simply add component to your `GridFieldConfig` ```php @@ -9,32 +11,39 @@ $config->addComponent(new \Colymba\BulkManager\BulkManager()); ``` ## Configuration + The component's options can be configurated individually or in bulk through the 'config' functions like this: ```php -$config->getComponentByType('Violet88\\BulkManager\\BulkManager')->setConfig($reference, $value); +$config->getComponentByType('Colymba\\BulkManager\\BulkManager')->setConfig($reference, $value); ``` ### $config overview + The available configuration options are: -* 'editableFields' : array of string referencing specific CMS fields available for editing + +- 'editableFields' : array of string referencing specific CMS fields available for editing ## Custom actions + You can remove or add individual action or replace them all via `addBulkAction()` and `removeBulkAction()` ### Adding a custom action + To add a custom bulk action to the list use: ```php $config - ->getComponentByType('Violet88\\BulkManager\\BulkManager') + ->getComponentByType('Colymba\\BulkManager\\BulkManager') ->addBulkAction('Namespace\\ClassName') ``` #### Custom action handler -When creating your own bulk action `RequestHandler`, you should extend `Violet88\BulkManager\BulkAction\Handler` which will expose 2 useful functions `getRecordIDList()` and `getRecords()` returning either an array with the selected records IDs or a `DataList` of the selected records. + +When creating your own bulk action `RequestHandler`, you should extend `Colymba\BulkManager\BulkAction\Handler` which will expose 2 useful functions `getRecordIDList()` and `getRecords()` returning either an array with the selected records IDs or a `DataList` of the selected records. Make sure to define the handler's `$url_segment`, from which the handler will be called and its relating `$allowed_actions` and `$url_handlers`. See `Handler`, `DeleteHandler` and `UnlinkHandler` for examples. #### Front-end config + Bulk action handler's front-end configuration is set via class properties `label`, `icon`, `buttonClasses`, `xhr` and `destructive`. See `Handler`, `DeleteHandler` and `UnlinkHandler` for reference and examples. diff --git a/src/BulkManager/BulkAction/ArchiveHandler.php b/src/BulkManager/BulkAction/ArchiveHandler.php index a40b3d8..f712477 100644 --- a/src/BulkManager/BulkAction/ArchiveHandler.php +++ b/src/BulkManager/BulkAction/ArchiveHandler.php @@ -1,9 +1,9 @@ gridField); try { - foreach ($records as $record) - { + foreach ($records as $record) { $done = $record->doArchive(); - if ($done) - { + if ($done) { $response->addSuccessRecord($record); - }else{ + } else { $response->addFailedRecord($record, $done); } } diff --git a/src/BulkManager/BulkAction/DeleteHandler.php b/src/BulkManager/BulkAction/DeleteHandler.php index a33f9a6..aa8c172 100644 --- a/src/BulkManager/BulkAction/DeleteHandler.php +++ b/src/BulkManager/BulkAction/DeleteHandler.php @@ -1,9 +1,9 @@ setAttribute('data-icon', 'decline') ->setAttribute('href', $one_level_up->Link) ->setUseButtonTag(true) - ->setAttribute('src', '')//changes type to image so isn't hooked by default actions handlers + ->setAttribute('src', '') //changes type to image so isn't hooked by default actions handlers ); $recordList = $this->getRecordIDList(); @@ -164,7 +164,7 @@ class EditHandler extends Handler ); $header = LiteralField::create( 'bulkEditHeader', - '

'.$headerText.'

' + '

' . $headerText . '

' ); $recordsFieldList->push($header); @@ -184,9 +184,9 @@ class EditHandler extends Handler $record->getTitle(), $recordEditingFields ) - ->setHeadingLevel(4) - ->setAttribute('data-id', $id) - ->addExtraClass('bulkEditingFieldHolder'); + ->setHeadingLevel(4) + ->setAttribute('data-id', $id) + ->addExtraClass('bulkEditingFieldHolder'); $recordsFieldList->push($toggleField); } @@ -206,7 +206,7 @@ class EditHandler extends Handler //and add record ids GET var $bulkEditForm->setAttribute( 'action', - $this->Link('bulkEditForm?records[]='.implode('&', $recordList)) + $this->Link('bulkEditForm?records[]=' . implode('&', $recordList)) ); return $bulkEditForm; @@ -368,9 +368,9 @@ class EditHandler extends Handler $form->addExtraClass('center cms-content'); $form->setAttribute('data-pjax-fragment', 'CurrentForm Content'); - Requirements::javascript('violet88/gridfield-bulk-editing-tools:client/dist/js/main.js'); - Requirements::css('violet88/gridfield-bulk-editing-tools:client/dist/styles/main.css'); - Requirements::add_i18n_javascript('violet88/gridfield-bulk-editing-tools:lang'); + Requirements::javascript('colymba/gridfield-bulk-editing-tools:client/dist/js/main.js'); + Requirements::css('colymba/gridfield-bulk-editing-tools:client/dist/styles/main.css'); + Requirements::add_i18n_javascript('colymba/gridfield-bulk-editing-tools:lang'); if ($this->request->isAjax()) { $response = new HTTPResponse( diff --git a/src/BulkManager/BulkAction/Handler.php b/src/BulkManager/BulkAction/Handler.php index 2926514..71a7bb8 100644 --- a/src/BulkManager/BulkAction/Handler.php +++ b/src/BulkManager/BulkAction/Handler.php @@ -1,6 +1,6 @@ gridField); try { - foreach ($records as $record) - { + foreach ($records as $record) { $done = $record->publishRecursive(); - if ($done) - { + if ($done) { $response->addSuccessRecord($record); - }else{ + } else { $response->addFailedRecord($record, $done); } } diff --git a/src/BulkManager/BulkAction/UnPublishHandler.php b/src/BulkManager/BulkAction/UnPublishHandler.php index f6821d4..84d2851 100644 --- a/src/BulkManager/BulkAction/UnPublishHandler.php +++ b/src/BulkManager/BulkAction/UnPublishHandler.php @@ -1,9 +1,9 @@ gridField); try { - foreach ($records as $record) - { + foreach ($records as $record) { $done = $record->doUnpublish(); - if ($done) - { + if ($done) { $response->addSuccessRecord($record); - }else{ + } else { $response->addFailedRecord($record, $done); } } diff --git a/src/BulkManager/BulkAction/UnlinkHandler.php b/src/BulkManager/BulkAction/UnlinkHandler.php index f6ed78c..d1e929f 100644 --- a/src/BulkManager/BulkAction/UnlinkHandler.php +++ b/src/BulkManager/BulkAction/UnlinkHandler.php @@ -1,9 +1,9 @@ get($handlerClassName); $urlSegment = $handler->config()->get('url_segment'); - if (!$urlSegment) - { + if (!$urlSegment) { $rc = new ReflectionClass($handlerClassName); $urlSegment = $rc->getShortName(); } @@ -154,10 +153,8 @@ class BulkManager implements GridField_HTMLProvider, GridField_ColumnProvider, G user_error("Provide either a class name or URL segment", E_USER_ERROR); } - foreach ($this->config['actions'] as $url => $class) - { - if ($handlerClassName === $class || $urlSegment === $url) - { + foreach ($this->config['actions'] as $url => $class) { + if ($handlerClassName === $class || $urlSegment === $url) { unset($this->config['actions'][$url]); return $this; } @@ -263,9 +260,9 @@ class BulkManager implements GridField_HTMLProvider, GridField_ColumnProvider, G */ public function getHTMLFragments($gridField) { - Requirements::javascript('violet88/gridfield-bulk-editing-tools:client/dist/js/main.js'); - Requirements::css('violet88/gridfield-bulk-editing-tools:client/dist/styles/main.css'); - Requirements::add_i18n_javascript('violet88/gridfield-bulk-editing-tools:client/lang'); + Requirements::javascript('colymba/gridfield-bulk-editing-tools:client/dist/js/main.js'); + Requirements::css('colymba/gridfield-bulk-editing-tools:client/dist/styles/main.css'); + Requirements::add_i18n_javascript('colymba/gridfield-bulk-editing-tools:client/lang'); if (!count($this->config['actions'] ?? [])) { user_error('Trying to use BulkManager without any bulk action.', E_USER_ERROR); @@ -308,7 +305,7 @@ class BulkManager implements GridField_HTMLProvider, GridField_ColumnProvider, G $templateData = new ArrayData($templateData); return array( - 'header' => $templateData->renderWith('Violet88\\BulkManager\\BulkManagerButtons'), + 'header' => $templateData->renderWith('Colymba\\BulkManager\\BulkManagerButtons'), ); } diff --git a/src/BulkTools/HTTPBulkToolsResponse.php b/src/BulkTools/HTTPBulkToolsResponse.php index a498068..97c6bd8 100644 --- a/src/BulkTools/HTTPBulkToolsResponse.php +++ b/src/BulkTools/HTTPBulkToolsResponse.php @@ -1,6 +1,6 @@ apiCreateFile($request); - if ($uploadResponse->getStatusCode() == 200) - { + if ($uploadResponse->getStatusCode() == 200) { $responseData = Convert::json2array($uploadResponse->getBody()); $responseData = array_shift($responseData); diff --git a/src/BulkUploader/BulkUploader.php b/src/BulkUploader/BulkUploader.php index 9d22714..5f05cae 100644 --- a/src/BulkUploader/BulkUploader.php +++ b/src/BulkUploader/BulkUploader.php @@ -1,6 +1,6 @@ $type) { - if ($type === 'SilverStripe\\Assets\\Image' + if ( + $type === 'SilverStripe\\Assets\\Image' || $type === 'SilverStripe\\Assets\\File' || is_subclass_of($type, 'SilverStripe\\Assets\\File') ) { @@ -245,7 +246,7 @@ class BulkUploader implements GridField_HTMLProvider, GridField_URLHandler $uploadField = BulkUploadField::create($gridField, $fieldName, '') ->setForm($gridField->getForm()) ->setRecord(DataObject::create()) // avoid UploadField to get auto-config from the Page (e.g fix allowedMaxFileNumber) - ; + ; //UploadField setup foreach ($this->ufSetup as $fn => $param) { @@ -294,12 +295,12 @@ class BulkUploader implements GridField_HTMLProvider, GridField_URLHandler 'UploadField' => $uploadField->Field() // call ->Field() to get requirements in right order )); //This one is no longer needed since the javascript is now loaded at the top of the cms - //Requirements::javascript('violet88/gridfield-bulk-editing-tools:client/dist/js/main.js'); - Requirements::css('violet88/gridfield-bulk-editing-tools:client/dist/styles/main.css'); - Requirements::add_i18n_javascript('violet88/gridfield-bulk-editing-tools:client/lang'); + //Requirements::javascript('colymba/gridfield-bulk-editing-tools:client/dist/js/main.js'); + Requirements::css('colymba/gridfield-bulk-editing-tools:client/dist/styles/main.css'); + Requirements::add_i18n_javascript('colymba/gridfield-bulk-editing-tools:client/lang'); return array( - 'before' => $data->renderWith('Violet88\\BulkUpload\\BulkUploader'), + 'before' => $data->renderWith('Colymba\\BulkUpload\\BulkUploader'), ); } From a97bea9efcdbfbb684e433d50713e7ce6a23cae2 Mon Sep 17 00:00:00 2001 From: PixNyb Date: Wed, 3 Apr 2024 12:27:12 +0000 Subject: [PATCH 07/10] Fix Link method in EditHandler.php --- src/BulkManager/BulkAction/EditHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BulkManager/BulkAction/EditHandler.php b/src/BulkManager/BulkAction/EditHandler.php index 4557538..c14968f 100644 --- a/src/BulkManager/BulkAction/EditHandler.php +++ b/src/BulkManager/BulkAction/EditHandler.php @@ -108,7 +108,7 @@ class EditHandler extends Handler */ public function Link($action = null) { - return Controller::join_links(parent::Link(), $this->stat('url_segment'), $action); + return Controller::join_links(parent::Link(), self::$url_segment, $action); } /** From a012c7a3709b47b78c64c08de3629d1785407831 Mon Sep 17 00:00:00 2001 From: PixNyb Date: Wed, 3 Apr 2024 12:45:48 +0000 Subject: [PATCH 08/10] Fixed(?) button icons --- src/BulkManager/BulkAction/EditHandler.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/BulkManager/BulkAction/EditHandler.php b/src/BulkManager/BulkAction/EditHandler.php index c14968f..75d7273 100644 --- a/src/BulkManager/BulkAction/EditHandler.php +++ b/src/BulkManager/BulkAction/EditHandler.php @@ -130,7 +130,7 @@ class EditHandler extends Handler FormAction::create('doSave', _t('GRIDFIELD_BULKMANAGER_EDIT_HANDLER.SAVE_BTN_LABEL', 'Save all')) ->setAttribute('id', 'bulkEditingSaveBtn') ->addExtraClass('btn btn-success') - ->setAttribute('data-icon', 'accept') + ->setAttribute('data-icon', '! ') ->setUseButtonTag(true) ); @@ -138,7 +138,7 @@ class EditHandler extends Handler FormAction::create('Cancel', _t('GRIDFIELD_BULKMANAGER_EDIT_HANDLER.CANCEL_BTN_LABEL', 'Cancel')) ->setAttribute('id', 'bulkEditingUpdateCancelBtn') ->addExtraClass('btn btn-danger cms-panel-link') - ->setAttribute('data-icon', 'decline') + ->setAttribute('data-icon', 'P ') ->setAttribute('href', $one_level_up->Link) ->setUseButtonTag(true) ->setAttribute('src', '') //changes type to image so isn't hooked by default actions handlers From ff0a0c012f86f22603f0c4f7646c74c9103024dc Mon Sep 17 00:00:00 2001 From: PixNyb Date: Wed, 3 Apr 2024 12:49:32 +0000 Subject: [PATCH 09/10] Renamed the Violet88 templates folder back to the original Colymba --- templates/{Violet88 => Colymba}/BulkManager/BulkManagerButtons.ss | 0 templates/{Violet88 => Colymba}/BulkUpload/BulkUploader.ss | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename templates/{Violet88 => Colymba}/BulkManager/BulkManagerButtons.ss (100%) rename templates/{Violet88 => Colymba}/BulkUpload/BulkUploader.ss (100%) diff --git a/templates/Violet88/BulkManager/BulkManagerButtons.ss b/templates/Colymba/BulkManager/BulkManagerButtons.ss similarity index 100% rename from templates/Violet88/BulkManager/BulkManagerButtons.ss rename to templates/Colymba/BulkManager/BulkManagerButtons.ss diff --git a/templates/Violet88/BulkUpload/BulkUploader.ss b/templates/Colymba/BulkUpload/BulkUploader.ss similarity index 100% rename from templates/Violet88/BulkUpload/BulkUploader.ss rename to templates/Colymba/BulkUpload/BulkUploader.ss From 7931f98d839ed85539ed6e340a79a2c67fbf46ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ro=C3=ABl=20Couwenberg?= Date: Thu, 18 Apr 2024 19:13:01 +0200 Subject: [PATCH 10/10] Update composer.json --- composer.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 5b369f5..bfe2e77 100644 --- a/composer.json +++ b/composer.json @@ -21,8 +21,7 @@ } ], "require": { - "silverstripe/framework": "^5", - "silverstripe/asset-admin": "^2" + "silverstripe/framework": "^5 || ^4" }, "extra": { "branch-alias": {