Update newsletter saving to reflect code review comments
- Switch to using full segment objects when saving newsletters - Fix stale comment in newsletter editor's Newsletter model - Fix typo in newsletter editor tests
This commit is contained in:
@ -122,9 +122,10 @@ function(
|
|||||||
} else {
|
} else {
|
||||||
value = e.target.value;
|
value = e.target.value;
|
||||||
}
|
}
|
||||||
|
var transformedValue = this.transformChangedValue(value);
|
||||||
this.props.onValueChange({
|
this.props.onValueChange({
|
||||||
target: {
|
target: {
|
||||||
value: value,
|
value: transformedValue,
|
||||||
name: this.props.field.name
|
name: this.props.field.name
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -148,6 +149,16 @@ function(
|
|||||||
}
|
}
|
||||||
return item.id;
|
return item.id;
|
||||||
},
|
},
|
||||||
|
// When it's impossible to represent the desired value in DOM,
|
||||||
|
// this function may be used to transform the placeholder value into
|
||||||
|
// desired value.
|
||||||
|
transformChangedValue: function(value) {
|
||||||
|
if(typeof this.props.field['transformChangedValue'] === 'function') {
|
||||||
|
return this.props.field.transformChangedValue.call(this, value);
|
||||||
|
} else {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
},
|
||||||
render: function() {
|
render: function() {
|
||||||
const options = this.state.items.map((item, index) => {
|
const options = this.state.items.map((item, index) => {
|
||||||
let label = this.getLabel(item);
|
let label = this.getLabel(item);
|
||||||
|
@ -18,7 +18,8 @@ define([
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
toJSON: function() {
|
toJSON: function() {
|
||||||
// Remove stale attributes from resulting JSON object
|
// Use only whitelisted properties to ensure properties editor
|
||||||
|
// doesn't control don't change.
|
||||||
return _.pick(SuperModel.prototype.toJSON.call(this), this.whitelisted);
|
return _.pick(SuperModel.prototype.toJSON.call(this), this.whitelisted);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
define(
|
define(
|
||||||
[
|
[
|
||||||
'mailpoet',
|
'mailpoet',
|
||||||
'newsletters/types/notification/scheduling.jsx'
|
'newsletters/types/notification/scheduling.jsx',
|
||||||
|
'underscore'
|
||||||
],
|
],
|
||||||
function(
|
function(
|
||||||
MailPoet,
|
MailPoet,
|
||||||
Scheduling
|
Scheduling,
|
||||||
|
_
|
||||||
) {
|
) {
|
||||||
|
|
||||||
var settings = window.mailpoet_settings || {};
|
var settings = window.mailpoet_settings || {};
|
||||||
@ -42,6 +44,14 @@ define(
|
|||||||
getLabel: function(segment) {
|
getLabel: function(segment) {
|
||||||
return segment.name + ' (' + parseInt(segment.subscribers).toLocaleString() + ')';
|
return segment.name + ' (' + parseInt(segment.subscribers).toLocaleString() + ')';
|
||||||
},
|
},
|
||||||
|
transformChangedValue: function(segment_ids) {
|
||||||
|
var all_segments = this.state.items;
|
||||||
|
return _.map(segment_ids, function(id) {
|
||||||
|
return _.find(all_segments, function(segment) {
|
||||||
|
return segment.id === id;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
validation: {
|
validation: {
|
||||||
'data-parsley-required': true,
|
'data-parsley-required': true,
|
||||||
'data-parsley-required-message': MailPoet.I18n.t('noSegmentsSelectedError')
|
'data-parsley-required-message': MailPoet.I18n.t('noSegmentsSelectedError')
|
||||||
|
@ -348,6 +348,14 @@ define(
|
|||||||
getLabel: function(segment) {
|
getLabel: function(segment) {
|
||||||
return segment.name + ' (' + parseInt(segment.subscribers).toLocaleString() + ')';
|
return segment.name + ' (' + parseInt(segment.subscribers).toLocaleString() + ')';
|
||||||
},
|
},
|
||||||
|
transformChangedValue: function(segment_ids) {
|
||||||
|
var all_segments = this.state.items;
|
||||||
|
return _.map(segment_ids, function(id) {
|
||||||
|
return _.find(all_segments, function(segment) {
|
||||||
|
return segment.id === id;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
validation: {
|
validation: {
|
||||||
'data-parsley-required': true,
|
'data-parsley-required': true,
|
||||||
'data-parsley-required-message': MailPoet.I18n.t('noSegmentsSelectedError')
|
'data-parsley-required-message': MailPoet.I18n.t('noSegmentsSelectedError')
|
||||||
|
@ -40,9 +40,9 @@ class Newsletters extends APIEndpoint {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function save($data = array()) {
|
function save($data = array()) {
|
||||||
$segment_ids = array();
|
$segments = array();
|
||||||
if(isset($data['segments'])) {
|
if(isset($data['segments'])) {
|
||||||
$segment_ids = $data['segments'];
|
$segments = $data['segments'];
|
||||||
unset($data['segments']);
|
unset($data['segments']);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,14 +58,14 @@ class Newsletters extends APIEndpoint {
|
|||||||
if(!empty($errors)) {
|
if(!empty($errors)) {
|
||||||
return $this->badRequest($errors);
|
return $this->badRequest($errors);
|
||||||
} else {
|
} else {
|
||||||
if(!empty($segment_ids)) {
|
if(!empty($segments)) {
|
||||||
NewsletterSegment::where('newsletter_id', $newsletter->id)
|
NewsletterSegment::where('newsletter_id', $newsletter->id)
|
||||||
->deleteMany();
|
->deleteMany();
|
||||||
|
|
||||||
foreach($segment_ids as $segment_id) {
|
foreach($segments as $segment) {
|
||||||
$id = (is_array($segment_id)) ? (int)$segment_id['id'] : (int)$segment_id;
|
if(!is_array($segment)) continue;
|
||||||
$relation = NewsletterSegment::create();
|
$relation = NewsletterSegment::create();
|
||||||
$relation->segment_id = $id;
|
$relation->segment_id = (int)$segment['id'];
|
||||||
$relation->newsletter_id = $newsletter->id;
|
$relation->newsletter_id = $newsletter->id;
|
||||||
$relation->save();
|
$relation->save();
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,7 @@ define([
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe('toJSON()', function() {
|
describe('toJSON()', function() {
|
||||||
it('will only contain properties modifyable by the editor', function() {
|
it('will only contain properties modifiable by the editor', function() {
|
||||||
var model = new (ContentComponent.NewsletterModel)({
|
var model = new (ContentComponent.NewsletterModel)({
|
||||||
id: 19,
|
id: 19,
|
||||||
subject: 'some subject',
|
subject: 'some subject',
|
||||||
|
@ -82,6 +82,27 @@ class NewslettersTest extends MailPoetTest {
|
|||||||
expect($updated_newsletter->subject)->equals('My Updated Newsletter');
|
expect($updated_newsletter->subject)->equals('My Updated Newsletter');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testItCanModifySegmentsOfExistingNewsletter() {
|
||||||
|
$segment_1 = Segment::createOrUpdate(array('name' => 'Segment 1'));
|
||||||
|
$fake_segment_id = 1;
|
||||||
|
|
||||||
|
$router = new Newsletters();
|
||||||
|
$newsletter_data = array(
|
||||||
|
'id' => $this->newsletter->id,
|
||||||
|
'subject' => 'My Updated Newsletter',
|
||||||
|
'segments' => array($segment_1->asArray(), $fake_segment_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
$response = $router->save($newsletter_data);
|
||||||
|
expect($response->status)->equals(APIResponse::STATUS_OK);
|
||||||
|
|
||||||
|
$updated_newsletter =
|
||||||
|
Newsletter::findOne($this->newsletter->id)->withSegments();
|
||||||
|
|
||||||
|
expect(count($updated_newsletter->segments))->equals(1);
|
||||||
|
expect($updated_newsletter->segments[0]['name'])->equals('Segment 1');
|
||||||
|
}
|
||||||
|
|
||||||
function testItCanSetANewsletterStatus() {
|
function testItCanSetANewsletterStatus() {
|
||||||
$router = new Newsletters();
|
$router = new Newsletters();
|
||||||
// set status to sending
|
// set status to sending
|
||||||
|
Reference in New Issue
Block a user