diff --git a/assets/js/src/form/fields/field.jsx b/assets/js/src/form/fields/field.jsx index 757f42cbe4..59d683a53c 100644 --- a/assets/js/src/form/fields/field.jsx +++ b/assets/js/src/form/fields/field.jsx @@ -61,6 +61,11 @@ function( case 'date': field = (); break; + + case 'reactComponent': + console.log(data); + field = (); + break; } if(inline === true) { @@ -121,4 +126,4 @@ function( }); return FormField; -}); \ No newline at end of file +}); diff --git a/assets/js/src/form/fields/text.jsx b/assets/js/src/form/fields/text.jsx index ff8f214d80..2e472c7b54 100644 --- a/assets/js/src/form/fields/text.jsx +++ b/assets/js/src/form/fields/text.jsx @@ -30,4 +30,4 @@ function( }); return FormFieldText; -}); \ No newline at end of file +}); diff --git a/assets/js/src/newsletters/newsletters.jsx b/assets/js/src/newsletters/newsletters.jsx index 6c6ee8767d..435546c51b 100644 --- a/assets/js/src/newsletters/newsletters.jsx +++ b/assets/js/src/newsletters/newsletters.jsx @@ -6,8 +6,8 @@ import NewsletterTypes from 'newsletters/types.jsx' import NewsletterTemplates from 'newsletters/templates.jsx' import NewsletterSend from 'newsletters/send.jsx' import NewsletterStandard from 'newsletters/types/standard.jsx' -import NewsletterWelcome from 'newsletters/types/welcome.jsx' -import NewsletterNotification from 'newsletters/types/notification.jsx' +import NewsletterWelcome from 'newsletters/types/welcome/welcome.jsx' +import NewsletterNotification from 'newsletters/types/notification/notification.jsx' import createHashHistory from 'history/lib/createHashHistory' let history = createHashHistory({ queryKey: false }) diff --git a/assets/js/src/newsletters/types/notification/notification.jsx b/assets/js/src/newsletters/types/notification/notification.jsx new file mode 100644 index 0000000000..2d0a572bb8 --- /dev/null +++ b/assets/js/src/newsletters/types/notification/notification.jsx @@ -0,0 +1,95 @@ +define( + [ + 'underscore', + 'react', + 'react-router', + 'mailpoet', + 'newsletters/types/notification/scheduling.jsx', + 'newsletters/breadcrumb.jsx' + ], + function( + _, + React, + Router, + MailPoet, + Scheduling, + Breadcrumb + ) { + + var field = { + name: 'options', + label: 'Periodicity', + type: 'reactComponent', + component: Scheduling, + }; + + var NewsletterNotification = React.createClass({ + mixins: [ + Router.History + ], + getInitialState: function() { + return { + options: { + intervalType: 'daily', + timeOfDay: 0, + weekDay: 1, + monthDay: 0, + nthWeekDay: 1, + } + }; + }, + handleValueChange: function(event) { + var state = this.state; + state[event.target.name] = event.target.value; + this.setState(state); + }, + handleNext: function() { + MailPoet.Ajax.post({ + endpoint: 'newsletters', + action: 'create', + data: _.extend({}, this.state, { + type: 'notification' + }), + }).done(function(response) { + if(response.result && response.newsletter.id) { + this.showTemplateSelection(response.newsletter.id); + } else { + if(response.errors.length > 0) { + response.errors.map(function(error) { + MailPoet.Notice.error(error); + }); + } + } + }.bind(this)); + }, + showTemplateSelection: function(newsletterId) { + this.history.pushState(null, `/template/${newsletterId}`); + }, + render: function() { + return ( +
+

{MailPoet.I18n.t('postNotificationNewsletterTypeTitle')}

+ + +

{MailPoet.I18n.t('selectPeriodicity')}

+ + + +

+ +

+
+ ); + }, + }); + + return NewsletterNotification; + } +); diff --git a/assets/js/src/newsletters/types/notification.jsx b/assets/js/src/newsletters/types/notification/scheduling.jsx similarity index 59% rename from assets/js/src/newsletters/types/notification.jsx rename to assets/js/src/newsletters/types/notification/scheduling.jsx index 2d5b787e6a..a5c7f28ca3 100644 --- a/assets/js/src/newsletters/types/notification.jsx +++ b/assets/js/src/newsletters/types/notification/scheduling.jsx @@ -4,26 +4,18 @@ define( 'react', 'react-router', 'mailpoet', - 'form/form.jsx', - 'form/fields/select.jsx', - 'form/fields/selection.jsx', - 'form/fields/text.jsx', - 'newsletters/breadcrumb.jsx' + 'form/fields/select.jsx' ], function( _, React, Router, MailPoet, - Form, - Select, - Selection, - Text, - Breadcrumb + Select ) { var intervalField = { - name: 'interval', + name: 'intervalType', values: { 'daily': MailPoet.I18n.t('daily'), 'weekly': MailPoet.I18n.t('weekly'), @@ -96,137 +88,113 @@ define( }, }; - var NewsletterWelcome = React.createClass({ - mixins: [ - Router.History - ], - getInitialState: function() { - return { - intervalType: 'immediate', // 'immediate'|'daily'|'weekly'|'monthly' - timeOfDay: 0, - weekDay: 1, - monthDay: 0, - nthWeekDay: 1, - }; + var NotificationScheduling = React.createClass({ + _getCurrentValue: function() { + return this.props.item[this.props.field.name] || {}; + }, + handleValueChange: function(name, value) { + var oldValue = this._getCurrentValue(), + newValue = {}; + newValue[name] = value; + + return this.props.onValueChange({ + target: { + name: this.props.field.name, + value: _.extend({}, oldValue, newValue) + } + }); }, handleIntervalChange: function(event) { - this.setState({ - intervalType: event.target.value, - }); + return this.handleValueChange( + 'intervalType', + event.target.value + ); }, handleTimeOfDayChange: function(event) { - this.setState({ - timeOfDay: event.target.value, - }); + return this.handleValueChange( + 'timeOfDay', + event.target.value + ); }, handleWeekDayChange: function(event) { - this.setState({ - weekDay: event.target.value, - }); + return this.handleValueChange( + 'weekDay', + event.target.value + ); }, handleMonthDayChange: function(event) { - this.setState({ - monthDay: event.target.value, - }); + return this.handleValueChange( + 'monthDay', + event.target.value + ); }, handleNthWeekDayChange: function(event) { - this.setState({ - nthWeekDay: event.target.value, - }); - }, - handleNext: function() { - MailPoet.Ajax.post({ - endpoint: 'newsletters', - action: 'create', - data: { - type: 'notification', - options: this.state, - }, - }).done(function(response) { - if(response.result && response.newsletter.id) { - this.showTemplateSelection(response.newsletter.id); - } else { - if(response.errors.length > 0) { - response.errors.map(function(error) { - MailPoet.Notice.error(error); - }); - } - } - }.bind(this)); - }, - showTemplateSelection: function(newsletterId) { - this.history.pushState(null, `/template/${newsletterId}`); + return this.handleValueChange( + 'nthWeekDay', + event.target.value + ); }, render: function() { - var timeOfDaySelection, + var value = this._getCurrentValue(), + timeOfDaySelection, weekDaySelection, monthDaySelection, nthWeekDaySelection; - if (this.state.intervalType !== 'immediately') { + + if (value.intervalType !== 'immediately') { timeOfDaySelection = ( ); } - if (this.state.intervalType === 'monthly') { + if (value.intervalType === 'monthly') { monthDaySelection = ( ); } return (
-

{MailPoet.I18n.t('postNotificationNewsletterTypeTitle')}

- - -

); }, }); - return NewsletterWelcome; + return NotificationScheduling; } ); diff --git a/assets/js/src/newsletters/types/standard.jsx b/assets/js/src/newsletters/types/standard.jsx index d8a53c5bcc..ec6bc091c5 100644 --- a/assets/js/src/newsletters/types/standard.jsx +++ b/assets/js/src/newsletters/types/standard.jsx @@ -3,16 +3,12 @@ define( 'react', 'react-router', 'mailpoet', - 'form/form.jsx', - 'form/fields/selection.jsx', 'newsletters/breadcrumb.jsx' ], function( React, Router, MailPoet, - Form, - Selection, Breadcrumb ) { diff --git a/assets/js/src/newsletters/types/welcome.jsx b/assets/js/src/newsletters/types/welcome/scheduling.jsx similarity index 68% rename from assets/js/src/newsletters/types/welcome.jsx rename to assets/js/src/newsletters/types/welcome/scheduling.jsx index 3e84eeea64..2f46e2071e 100644 --- a/assets/js/src/newsletters/types/welcome.jsx +++ b/assets/js/src/newsletters/types/welcome/scheduling.jsx @@ -4,9 +4,7 @@ define( 'react', 'react-router', 'mailpoet', - 'form/form.jsx', 'form/fields/select.jsx', - 'form/fields/selection.jsx', 'form/fields/text.jsx', 'newsletters/breadcrumb.jsx' ], @@ -15,9 +13,7 @@ define( React, Router, MailPoet, - Form, Select, - Selection, Text, Breadcrumb ) { @@ -64,43 +60,51 @@ define( } }; - var NewsletterWelcome = React.createClass({ - mixins: [ - Router.History - ], - getInitialState: function() { - return { - event: 'segment', - segment: 1, - role: 'subscriber', - afterTimeNumber: 1, - afterTimeType: 'immediate', - }; + var WelcomeScheduling = React.createClass({ + _getCurrentValue: function() { + return this.props.item[this.props.field.name] || {}; + }, + handleValueChange: function(name, value) { + var oldValue = this._getCurrentValue(), + newValue = {}; + newValue[name] = value; + + return this.props.onValueChange({ + target: { + name: this.props.field.name, + value: _.extend({}, oldValue, newValue) + } + }); }, handleEventChange: function(event) { - this.setState({ - event: event.target.value, - }); + return this.handleValueChange( + 'event', + event.target.value + ); }, handleSegmentChange: function(event) { - this.setState({ - segment: event.target.value, - }); + return this.handleValueChange( + 'segment', + event.target.value + ); }, handleRoleChange: function(event) { - this.setState({ - role: event.target.value, - }); + return this.handleValueChange( + 'role', + event.target.value + ); }, handleAfterTimeNumberChange: function(event) { - this.setState({ - afterTimeNumber: event.target.value, - }); + return this.handleValueChange( + 'afterTimeNumber', + event.target.value + ); }, handleAfterTimeTypeChange: function(event) { - this.setState({ - afterTimeType: event.target.value, - }); + return this.handleValueChange( + 'afterTimeType', + event.target.value + ); }, handleNext: function() { MailPoet.Ajax.post({ @@ -126,40 +130,38 @@ define( this.history.pushState(null, `/template/${newsletterId}`); }, render: function() { - var roleSegmentSelection, timeNumber; - if (this.state.event === 'user') { + var value = this._getCurrentValue(), + roleSegmentSelection, timeNumber; + + if (value.event === 'user') { roleSegmentSelection = ( ); } - if (this.state.afterTimeType !== 'immediate') { + if (value.afterTimeType !== 'immediate') { timeNumber = ( ); } + return (
-

{MailPoet.I18n.t('welcomeNewsletterTypeTitle')}

- - -

{MailPoet.I18n.t('selectEventToSendWelcomeEmail')}

- - -

- -

); }, }); - return NewsletterWelcome; + return WelcomeScheduling; } ); + diff --git a/assets/js/src/newsletters/types/welcome/welcome.jsx b/assets/js/src/newsletters/types/welcome/welcome.jsx new file mode 100644 index 0000000000..0f11595489 --- /dev/null +++ b/assets/js/src/newsletters/types/welcome/welcome.jsx @@ -0,0 +1,95 @@ +define( + [ + 'underscore', + 'react', + 'react-router', + 'mailpoet', + 'newsletters/types/welcome/scheduling.jsx', + 'newsletters/breadcrumb.jsx' + ], + function( + _, + React, + Router, + MailPoet, + Scheduling, + Breadcrumb + ) { + + var field = { + name: 'options', + label: 'Event', + type: 'reactComponent', + component: Scheduling, + }; + + var NewsletterWelcome = React.createClass({ + mixins: [ + Router.History + ], + getInitialState: function() { + return { + options: { + event: 'segment', + segment: 1, + role: 'subscriber', + afterTimeNumber: 1, + afterTimeType: 'immediate', + } + }; + }, + handleValueChange: function(event) { + var state = this.state; + state[event.target.name] = event.target.value; + this.setState(state); + }, + handleNext: function() { + MailPoet.Ajax.post({ + endpoint: 'newsletters', + action: 'create', + data: _.extend({}, this.state, { + type: 'welcome' + }), + }).done(function(response) { + if(response.result && response.newsletter.id) { + this.showTemplateSelection(response.newsletter.id); + } else { + if(response.errors.length > 0) { + response.errors.map(function(error) { + MailPoet.Notice.error(error); + }); + } + } + }.bind(this)); + }, + showTemplateSelection: function(newsletterId) { + this.history.pushState(null, `/template/${newsletterId}`); + }, + render: function() { + return ( +
+

{MailPoet.I18n.t('welcomeNewsletterTypeTitle')}

+ + +

{MailPoet.I18n.t('selectEventToSendWelcomeEmail')}

+ + + +

+ +

+
+ ); + }, + }); + + return NewsletterWelcome; + } +); diff --git a/views/newsletters.html b/views/newsletters.html index 64fff75e0b..5aa450b3bb 100644 --- a/views/newsletters.html +++ b/views/newsletters.html @@ -85,6 +85,8 @@ 'setUp': __('Set up'), 'postNotificationNewsletterTypeTitle': __('Post notifications'), 'postNotificationsNewsletterTypeDescription': __('Automatically send posts immediately, daily, weekly or monthly. Filter by categories, if you like.'), + 'selectPeriodicity': __('Select a periodicity'), + 'periodicity': __('Periodicity'), 'daily': __('Once a day at...'), 'weekly': __('Weekly on...'),