seperating components into multiple files

This commit is contained in:
Amine Ben hammou
2018-02-19 14:02:01 +01:00
committed by pavel-mailpoet
parent ddbabcfcb5
commit 8603e2a96a
5 changed files with 287 additions and 266 deletions

View File

@@ -0,0 +1,15 @@
import React from 'react';
class Loading extends React.Component {
componentWillMount() {
MailPoet.Modal.loading(true);
}
componentWillUnmount() {
MailPoet.Modal.loading(false);
}
render() {
return null;
}
}
export default Loading;

View File

@@ -4,6 +4,10 @@ import MailPoet from 'mailpoet';
import { confirmAlert } from 'react-confirm-alert'; import { confirmAlert } from 'react-confirm-alert';
import Breadcrumb from 'newsletters/breadcrumb.jsx'; import Breadcrumb from 'newsletters/breadcrumb.jsx';
import HelpTooltip from 'help-tooltip.jsx'; import HelpTooltip from 'help-tooltip.jsx';
import Loading from 'common/loading.jsx';
import Tabs from 'newsletters/templates/tabs.jsx';
import TemplateBox from 'newsletters/templates/template_box.jsx';
import ImportTemplate from 'newsletters/templates/import_template.jsx';
const getEditorUrl = id => `admin.php?page=mailpoet-newsletter-editor&id=${id}`; const getEditorUrl = id => `admin.php?page=mailpoet-newsletter-editor&id=${id}`;
@@ -38,272 +42,6 @@ const templatesCategories = [
}, },
]; ];
class Loading extends React.Component {
componentWillMount() {
MailPoet.Modal.loading(true);
}
componentWillUnmount() {
MailPoet.Modal.loading(false);
}
render() {
return null;
}
}
const Tabs = ({ tabs, selected, select }) => (
<div className="wp-filter hide-if-no-js">
<ul className="filter-links">
{tabs.map(({ name, label }) => (
<li key={name}><a
href="javascript:"
className={selected === name ? 'current' : ''}
onClick={() => select(name)}
> {label}
</a></li>
))}
</ul>
</div>
);
/**
* props = {
* index, id, newsletterId, name, description, thumbnail, readonly,
* beforeDelete, afterDelete, beforeSelect, afterSelect
* }
*/
class TemplateBox extends React.Component {
onDelete() {
const { id, name, beforeDelete, afterDelete } = this.props;
const onConfirm = () => {
beforeDelete();
MailPoet.Ajax.post({
api_version: window.mailpoet_api_version,
endpoint: 'newsletterTemplates',
action: 'delete',
data: {
id: id,
},
}).done(() => {
afterDelete(true, id);
}).fail((response) => {
if (response.errors.length > 0) {
MailPoet.Notice.error(
response.errors.map(error => error.message),
{ scroll: true }
);
}
afterDelete(false);
});
};
confirmAlert({
title: MailPoet.I18n.t('confirmTitle'),
message: MailPoet.I18n.t('confirmTemplateDeletion').replace('%$1s', name),
confirmLabel: MailPoet.I18n.t('confirmLabel'),
cancelLabel: MailPoet.I18n.t('cancelLabel'),
onConfirm: onConfirm,
onCancel: () => {},
});
}
onPreview() {
MailPoet.Modal.popup({
title: this.props.name,
template: '<div class="mailpoet_boxes_preview" style="background-color: {{ body.globalStyles.body.backgroundColor }}"><img src="{{ thumbnail }}" /></div>',
data: this.props,
});
}
onSelect() {
const { newsletterId, name, beforeSelect } = this.props;
let body = this.props.body;
if (!_.isUndefined(body)) {
body = JSON.stringify(body);
}
beforeSelect();
MailPoet.trackEvent('Emails > Template selected', {
'MailPoet Free version': window.mailpoet_version,
'Email name': name,
});
MailPoet.Ajax.post({
api_version: window.mailpoet_api_version,
endpoint: 'newsletters',
action: 'save',
data: {
id: newsletterId,
body: body,
},
}).done((response) => {
afterSelect(true, response.data.id);
}).fail((response) => {
if (response.errors.length > 0) {
MailPoet.Notice.error(
response.errors.map(error => error.message),
{ scroll: true }
);
}
afterSelect(false);
});
}
render() {
const { index, name, thumbnail, description, readonly } = this.props;
const onDelete = this.onDelete.bind(this);
const onPreview = this.onPreview.bind(this);
const onSelect = this.onSelect.bind(this);
const deleteLink = (
<div className="mailpoet_delete">
<a href="javascript:;" onClick={onDelete}>{MailPoet.I18n.t('delete')}</a>
</div>
);
let preview = '';
if (typeof thumbnail === 'string' && thumbnail.length > 0) {
preview = (
<a href="javascript:;" onClick={onPreview}>
<img src={thumbnail} />
<div className="mailpoet_overlay"></div>
</a>
);
}
return (
<li>
<div className="mailpoet_thumbnail">
{ preview }
</div>
<div className="mailpoet_description">
<h3>{ name }</h3>
<p>{ description }</p>
</div>
<div className="mailpoet_actions">
<a
className="button button-secondary"
onClick={onPreview}
>{MailPoet.I18n.t('preview')}</a>
&nbsp;
<a
className="button button-primary"
data-automation-id={`select_template_${index}`}
onClick={onSelect}
> {MailPoet.I18n.t('select')} </a>
</div>
{ readonly === '1' ? false : deleteLink }
</li>
);
}
}
/**
* props = {beforeImport, afterImport}
*/
class ImportTemplate extends React.Component {
saveTemplate(saveTemplate) {
const template = saveTemplate;
const {beforeImport, afterImport} = this.props;
// Stringify to enable transmission of primitive non-string value types
if (!_.isUndefined(template.body)) {
template.body = JSON.stringify(template.body);
}
try {
template.categories = JSON.parse(template.categories);
} catch (err) {
template.categories = [];
}
if (template.categories.indexOf('saved') === -1) {
template.categories.push('saved');
}
if (
template.categories.indexOf('standard') === -1 &&
template.categories.indexOf('welcome') === -1 &&
template.categories.indexOf('notification') === -1
) {
template.categories.push('standard');
}
template.categories = JSON.stringify(template.categories);
beforeImport();
MailPoet.Ajax.post({
api_version: window.mailpoet_api_version,
endpoint: 'newsletterTemplates',
action: 'save',
data: template,
}).done((response) => {
afterImport(true, response.data);
}).fail((response) => {
if (response.errors.length > 0) {
MailPoet.Notice.error(
response.errors.map(error => error.message),
{ scroll: true }
);
}
afterImport(false);
});
}
handleSubmit(e) {
e.preventDefault();
if (_.size(this.refs.templateFile.files) <= 0) {
return false;
}
const file = _.first(this.refs.templateFile.files);
const reader = new FileReader();
reader.onload = (evt) => {
try {
this.saveTemplate(JSON.parse(evt.target.result));
MailPoet.trackEvent('Emails > Template imported', {
'MailPoet Free version': window.mailpoet_version,
});
} catch (err) {
MailPoet.Notice.error(MailPoet.I18n.t('templateFileMalformedError'));
}
};
reader.readAsText(file);
return true;
}
render() {
const handleSubmit = this.handleSubmit.bind(this);
return (
<div>
<h2>
{MailPoet.I18n.t('importTemplateTitle')}
<HelpTooltip
tooltip={MailPoet.I18n.t('helpTooltipTemplateUpload')}
place="right"
className="tooltip-help-import-template"
/>
</h2>
<form onSubmit={handleSubmit}>
<input type="file" placeholder={MailPoet.I18n.t('selectJsonFileToUpload')} ref="templateFile" />
<p className="submit">
<input
className="button button-primary"
type="submit"
value={MailPoet.I18n.t('upload')} />
</p>
</form>
</div>
);
}
}
class NewsletterTemplates extends React.Component { class NewsletterTemplates extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);

View File

@@ -0,0 +1,110 @@
import React from 'react';
import _ from 'underscore';
import MailPoet from 'mailpoet';
import HelpTooltip from 'help-tooltip.jsx';
/**
* props = {beforeImport, afterImport}
*/
class ImportTemplate extends React.Component {
saveTemplate(saveTemplate) {
const template = saveTemplate;
const {beforeImport, afterImport} = this.props;
// Stringify to enable transmission of primitive non-string value types
if (!_.isUndefined(template.body)) {
template.body = JSON.stringify(template.body);
}
try {
template.categories = JSON.parse(template.categories);
} catch (err) {
template.categories = [];
}
if (template.categories.indexOf('saved') === -1) {
template.categories.push('saved');
}
if (
template.categories.indexOf('standard') === -1 &&
template.categories.indexOf('welcome') === -1 &&
template.categories.indexOf('notification') === -1
) {
template.categories.push('standard');
}
template.categories = JSON.stringify(template.categories);
beforeImport();
MailPoet.Ajax.post({
api_version: window.mailpoet_api_version,
endpoint: 'newsletterTemplates',
action: 'save',
data: template,
}).done((response) => {
afterImport(true, response.data);
}).fail((response) => {
if (response.errors.length > 0) {
MailPoet.Notice.error(
response.errors.map(error => error.message),
{ scroll: true }
);
}
afterImport(false);
});
}
handleSubmit(e) {
e.preventDefault();
if (_.size(this.refs.templateFile.files) <= 0) {
return false;
}
const file = _.first(this.refs.templateFile.files);
const reader = new FileReader();
reader.onload = (evt) => {
try {
this.saveTemplate(JSON.parse(evt.target.result));
MailPoet.trackEvent('Emails > Template imported', {
'MailPoet Free version': window.mailpoet_version,
});
} catch (err) {
MailPoet.Notice.error(MailPoet.I18n.t('templateFileMalformedError'));
}
};
reader.readAsText(file);
return true;
}
render() {
const handleSubmit = this.handleSubmit.bind(this);
return (
<div>
<h2>
{MailPoet.I18n.t('importTemplateTitle')}
<HelpTooltip
tooltip={MailPoet.I18n.t('helpTooltipTemplateUpload')}
place="right"
className="tooltip-help-import-template"
/>
</h2>
<form onSubmit={handleSubmit}>
<input type="file" placeholder={MailPoet.I18n.t('selectJsonFileToUpload')} ref="templateFile" />
<p className="submit">
<input
className="button button-primary"
type="submit"
value={MailPoet.I18n.t('upload')} />
</p>
</form>
</div>
);
}
}
export default ImportTemplate;

View File

@@ -0,0 +1,18 @@
import React from 'react';
const Tabs = ({ tabs, selected, select }) => (
<div className="wp-filter hide-if-no-js">
<ul className="filter-links">
{tabs.map(({ name, label }) => (
<li key={name}><a
href="javascript:"
className={selected === name ? 'current' : ''}
onClick={() => select(name)}
> {label}
</a></li>
))}
</ul>
</div>
);
export default Tabs;

View File

@@ -0,0 +1,140 @@
import React from 'react';
import MailPoet from 'mailpoet';
import { confirmAlert } from 'react-confirm-alert';
/**
* props = {
* index, id, newsletterId, name, description, thumbnail, readonly,
* beforeDelete, afterDelete, beforeSelect, afterSelect
* }
*/
class TemplateBox extends React.Component {
onDelete() {
const { id, name, beforeDelete, afterDelete } = this.props;
const onConfirm = () => {
beforeDelete();
MailPoet.Ajax.post({
api_version: window.mailpoet_api_version,
endpoint: 'newsletterTemplates',
action: 'delete',
data: {
id: id,
},
}).done(() => {
afterDelete(true, id);
}).fail((response) => {
if (response.errors.length > 0) {
MailPoet.Notice.error(
response.errors.map(error => error.message),
{ scroll: true }
);
}
afterDelete(false);
});
};
confirmAlert({
title: MailPoet.I18n.t('confirmTitle'),
message: MailPoet.I18n.t('confirmTemplateDeletion').replace('%$1s', name),
confirmLabel: MailPoet.I18n.t('confirmLabel'),
cancelLabel: MailPoet.I18n.t('cancelLabel'),
onConfirm: onConfirm,
onCancel: () => {},
});
}
onPreview() {
MailPoet.Modal.popup({
title: this.props.name,
template: '<div class="mailpoet_boxes_preview" style="background-color: {{ body.globalStyles.body.backgroundColor }}"><img src="{{ thumbnail }}" /></div>',
data: this.props,
});
}
onSelect() {
const { newsletterId, name, beforeSelect, afterSelect } = this.props;
let body = this.props.body;
if (!_.isUndefined(body)) {
body = JSON.stringify(body);
}
beforeSelect();
MailPoet.trackEvent('Emails > Template selected', {
'MailPoet Free version': window.mailpoet_version,
'Email name': name,
});
MailPoet.Ajax.post({
api_version: window.mailpoet_api_version,
endpoint: 'newsletters',
action: 'save',
data: {
id: newsletterId,
body: body,
},
}).done((response) => {
afterSelect(true, response.data.id);
}).fail((response) => {
if (response.errors.length > 0) {
MailPoet.Notice.error(
response.errors.map(error => error.message),
{ scroll: true }
);
}
afterSelect(false);
});
}
render() {
const { index, name, thumbnail, description, readonly } = this.props;
const onDelete = this.onDelete.bind(this);
const onPreview = this.onPreview.bind(this);
const onSelect = this.onSelect.bind(this);
const deleteLink = (
<div className="mailpoet_delete">
<a href="javascript:;" onClick={onDelete}>{MailPoet.I18n.t('delete')}</a>
</div>
);
let preview = '';
if (typeof thumbnail === 'string' && thumbnail.length > 0) {
preview = (
<a href="javascript:;" onClick={onPreview}>
<img src={thumbnail} />
<div className="mailpoet_overlay"></div>
</a>
);
}
return (
<li>
<div className="mailpoet_thumbnail">
{ preview }
</div>
<div className="mailpoet_description">
<h3>{ name }</h3>
<p>{ description }</p>
</div>
<div className="mailpoet_actions">
<a
className="button button-secondary"
onClick={onPreview}
>{MailPoet.I18n.t('preview')}</a>
&nbsp;
<a
className="button button-primary"
data-automation-id={`select_template_${index}`}
onClick={onSelect}
> {MailPoet.I18n.t('select')} </a>
</div>
{ readonly === '1' ? false : deleteLink }
</li>
);
}
}
export default TemplateBox;