From dda70ad64632a87bd1802d3023f74a4fb34cca15 Mon Sep 17 00:00:00 2001 From: Eric Andrew Lewis Date: Tue, 13 May 2014 16:05:36 -0400 Subject: [PATCH] Add a bulk edit mode. Add an option to wp.media.view.AttachmentsBrowser `bulkEdit`, which defaults to false. When set to true, conditionally create a SelectionBulkEdit view when multiple items are selected. Multiple delete now possible. --- core-js-overrides/media-views.js | 52 ++++++++++++++++++++++++++++++++ media-template.php | 10 ++++++ styles.css | 14 +++++++++ wp-media-grid.php | 6 ++++ 4 files changed, 82 insertions(+) create mode 100644 media-template.php diff --git a/core-js-overrides/media-views.js b/core-js-overrides/media-views.js index 1830b23..8f0dfcd 100644 --- a/core-js-overrides/media-views.js +++ b/core-js-overrides/media-views.js @@ -2145,6 +2145,7 @@ filters: state.get('filterable'), display: state.get('displaySettings'), dragInfo: state.get('dragInfo'), + bulkEdit: true, suggestedWidth: state.get('suggestedWidth'), suggestedHeight: state.get('suggestedHeight'), @@ -5521,6 +5522,7 @@ filters: false, search: true, display: false, + bulkEdit: false, AttachmentView: media.view.Attachment.Library }); @@ -5675,6 +5677,9 @@ } selection.on( 'selection:single', this.createSingle, this ); + if ( this.options.bulkEdit ) { + selection.on( 'selection:single', this.maybeCreateMultiple, this ); + } selection.on( 'selection:unsingle', this.disposeSingle, this ); if ( selection.single() ) { @@ -5682,10 +5687,32 @@ } }, + maybeCreateMultiple: function() { + var sidebar = this.sidebar, + single = this.options.selection.single(); + + // Bail early if there isn't a multi-selection. + if ( this.options.selection.length <=1 ) { + sidebar.unset( 'selection' ); + return; + } + sidebar.set( 'selection', new media.view.SelectionBulkEdit({ + controller: this.controller, + collection: this.options.selection, + priority: -40 + }).render() ); + }, + createSingle: function() { var sidebar = this.sidebar, single = this.options.selection.single(); + // If bulk edit is enabled and more than one attachment has been + // selected, bail early. + if ( this.options.bulkEdit && this.options.selection.length > 1 ) { + return; + } + sidebar.set( 'details', new media.view.Attachment.Details({ controller: this.controller, model: single, @@ -5793,6 +5820,31 @@ } }); + /** + * wp.media.view.SelectionBulkEdit + * + * @constructor + * @augments wp.media.view.Selection + * @augments wp.media.View + * @augments wp.Backbone.View + * @augments Backbone.View + */ + media.view.SelectionBulkEdit = media.view.Selection.extend({ + template: media.template('media-selection-bulk-edit'), + events: { + 'click .clear-selection': 'clear', + 'click .delete-selection': 'delete' + }, + + // Delete click handler. + delete: function( event ) { + event.preventDefault(); + // Fold this string into the l10n object later. + if ( confirm( "You are about to permanently delete these items.\n'Cancel' to stop, 'OK' to delete." ) ) { + this.collection.invoke( 'destroy' ); + } + } + }); /** * wp.media.view.Attachment.Selection diff --git a/media-template.php b/media-template.php new file mode 100644 index 0000000..37f1efc --- /dev/null +++ b/media-template.php @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/styles.css b/styles.css index f1d8ce7..90ff92a 100644 --- a/styles.css +++ b/styles.css @@ -41,4 +41,18 @@ background: rgba(0,0,0,0.6); color: #fff; cursor: default; +} + +#media-library .media-selection { + position: static; +} +#media-library .attachments-browser .media-selection { + height: auto; +} +#media-library .attachments-browser .media-selection .selection-view { + display: block; +} +#media-library .attachments-browser .media-selection .attachments { + position: static; + height: auto; } \ No newline at end of file diff --git a/wp-media-grid.php b/wp-media-grid.php index f56d78f..da0c5cf 100644 --- a/wp-media-grid.php +++ b/wp-media-grid.php @@ -17,6 +17,8 @@ function __construct() { add_action( 'load-upload.php', array( $this, 'media_grid' ) ); add_action( 'admin_init', array( $this, 'enqueue' ) ); + add_action( 'wp_enqueue_media', array( $this, 'wp_enqueue_media' ) ); + } @@ -84,6 +86,10 @@ public function enqueue() { wp_enqueue_style( 'wp-media-grid', plugins_url( 'styles.css', __FILE__ ) ); wp_enqueue_script( 'live-filter', plugins_url( 'libs/jquery.liveFilter.js', __FILE__ ) ); } + + public function wp_enqueue_media() { + require_once( plugin_dir_path( __FILE__ ) . 'media-template.php' ); + } } /**