diff --git a/assets/css/src/listing.styl b/assets/css/src/listing.styl index 2833bf4360..a09db4f010 100644 --- a/assets/css/src/listing.styl +++ b/assets/css/src/listing.styl @@ -1,2 +1,16 @@ .mailpoet_listing_loading tbody tr - opacity: 0.2; \ No newline at end of file + opacity: 0.2; + +.widefat tfoot td.mailpoet_check_column, +.widefat thead td.mailpoet_check_column + padding-top: 10px; + +.widefat tbody th.mailpoet_check_column, +.widefat tfoot td.mailpoet_check_column, +.widefat thead td.mailpoet_check_column + padding: 11px 0 0 3px; + +.widefat .mailpoet_check_column + padding: 6px 0 25px; + vertical-align: top; + width: 2.2em; \ No newline at end of file diff --git a/assets/js/src/listing/bulk_actions.jsx b/assets/js/src/listing/bulk_actions.jsx index 96caa37093..a42e600143 100644 --- a/assets/js/src/listing/bulk_actions.jsx +++ b/assets/js/src/listing/bulk_actions.jsx @@ -14,7 +14,7 @@ define('bulk_actions', ['react'], function(React) { var action = this.getSelectedAction(); if(action !== null && action['onApply'] !== undefined) { - action.onApply(this.props.selected); + action.onApply(); } }, getSelectedAction: function() { diff --git a/assets/js/src/listing/groups.jsx b/assets/js/src/listing/groups.jsx index 3b80b86266..2221b33a53 100644 --- a/assets/js/src/listing/groups.jsx +++ b/assets/js/src/listing/groups.jsx @@ -1,7 +1,7 @@ define('groups', ['react', 'classnames'], function(React, classNames) { var ListingGroups = React.createClass({ handleSelect: function(group) { - return this.props.onSelect(group); + return this.props.onSelectGroup(group); }, render: function() { var count = this.props.groups.length; diff --git a/assets/js/src/listing/header.jsx b/assets/js/src/listing/header.jsx index caec83f6ac..cd3e2b444b 100644 --- a/assets/js/src/listing/header.jsx +++ b/assets/js/src/listing/header.jsx @@ -2,7 +2,7 @@ define('header', ['react', 'classnames'], function(React, classNames) { /* props: onSort: callback(sort_by, sort_order) - onSelectAll: callback(is_checked) + onSelectItems: callback(is_checked) sort_by: (string) field name columns -> (array) column -> { @@ -13,9 +13,9 @@ define('header', ['react', 'classnames'], function(React, classNames) { } */ var ListingHeader = React.createClass({ - handleSelectAll: function() { - return this.props.onSelectAll( - this.refs.select_all.getDOMNode().checked + handleSelectItems: function() { + return this.props.onSelectItems( + this.refs.toggle.getDOMNode().checked ); }, render: function() { @@ -32,14 +32,15 @@ define('header', ['react', 'classnames'], function(React, classNames) { return ( - + + ref="toggle" + checked={ this.props.selected } + onChange={ this.handleSelectItems } /> {columns} diff --git a/assets/js/src/listing/listing.jsx b/assets/js/src/listing/listing.jsx index 7e4aece186..8d0eb0cda3 100644 --- a/assets/js/src/listing/listing.jsx +++ b/assets/js/src/listing/listing.jsx @@ -25,10 +25,10 @@ define( ListingFilters ) { var ListingItem = React.createClass({ - handleSelect: function(e) { + handleSelectItem: function(e) { var is_checked = jQuery(e.target).is(':checked'); - this.props.onSelect( + this.props.onSelectItem( parseInt(e.target.value, 10), is_checked ); @@ -38,14 +38,14 @@ define( render: function() { return ( - + + checked={ this.props.item.selected } + onChange={ this.handleSelectItem } /> { this.props.onRenderItem(this.props.item) } @@ -76,11 +76,13 @@ define( return ( {this.props.items.map(function(item) { - item.selected = (this.props.selected.indexOf(item.id) !== -1); + item.id = parseInt(item.id, 10); + item.selected = (this.props.selected_ids.indexOf(item.id) !== -1); + return ( @@ -106,7 +108,8 @@ define( groups: [], group: 'all', filters: [], - selected: [] + selected_ids: [], + selected: false }; }, componentDidMount: function() { @@ -131,18 +134,37 @@ define( this.getItems(); }.bind(this)); }, - handleSelect: function(id, is_checked) { - var selected = this.state.selected; + handleSelectItem: function(id, is_checked) { + var selected_ids = this.state.selected_ids; if(is_checked) { - selected = jQuery.merge(selected, [ id ]); + selected_ids = jQuery.merge(selected_ids, [ id ]); } else { - selected.splice(selected.indexOf(id), 1); + selected_ids.splice(selected_ids.indexOf(id), 1); } + this.setState({ - selected: selected + selected: false, + selected_ids: selected_ids }); }, + handleSelectItems: function(is_checked) { + if(is_checked === false) { + this.setState({ + selected_ids: [], + selected: false + }); + } else { + var selected_ids = this.state.items.map(function(item) { + return ~~item.id; + }); + + this.setState({ + selected_ids: selected_ids, + selected: 'page' + }); + } + }, handleGroup: function(group) { // reset search jQuery('#search_input').val(''); @@ -150,26 +172,14 @@ define( this.setState({ group: group, filters: [], - selected: [], + selected: false, + selected_ids: [], search: '', page: 1 }, function() { this.getItems(); }.bind(this)); }, - handleSelectAll: function(is_checked) { - if(is_checked === false) { - this.setState({ selected: [] }); - } else { - var selected = this.state.items.map(function(item) { - return ~~item.id; - }); - - this.setState({ - selected: selected - }); - } - }, handleSetPage: function(page) { this.setState({ page: page }, function() { this.getItems(); @@ -201,14 +211,13 @@ define( + onSelectGroup={ this.handleGroup } />
+ actions={ this.props.actions } /> @@ -229,15 +239,16 @@ define( @@ -246,8 +257,7 @@ define(
+ actions={ this.props.actions } />