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 } />