@capillarytech/creatives-library 2.0.28 → 2.0.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/CmsTemplatesComponent/index.js +2 -3
- package/containers/CreativesContainer/SlideBoxContent.js +8 -2
- package/containers/CreativesContainer/SlideBoxFooter.js +20 -16
- package/containers/CreativesContainer/index.js +18 -9
- package/containers/Email/index.js +25 -29
- package/containers/Email/sagas.js +2 -6
- package/containers/EmailWrapper/index.js +56 -47
- package/containers/EmailWrapper/messages.js +8 -0
- package/containers/Sms/Edit/index.js +1 -0
- package/package.json +1 -1
- package/routes.js +3 -1
|
@@ -15,19 +15,18 @@ function CmsTemplatesComponent(props) {
|
|
|
15
15
|
const cardDataList = props.cmsTemplates.map((template) => (
|
|
16
16
|
{
|
|
17
17
|
title: template.name,
|
|
18
|
-
|
|
18
|
+
url: template.versions.base.preview_http_url,
|
|
19
19
|
hoverOption: <CapButton onClick={() => props.handleEdmDefaultTemplateSelection(template._id)}><FormattedMessage {...messages.select}/></CapButton>,
|
|
20
20
|
}));
|
|
21
21
|
return (<div>
|
|
22
22
|
<div className="pagination-container">
|
|
23
|
-
<CapCustomCardList cardList={cardDataList} type="
|
|
23
|
+
<CapCustomCardList cardList={cardDataList} type="Email" />
|
|
24
24
|
</div>
|
|
25
25
|
</div>);
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
CmsTemplatesComponent.propTypes = {
|
|
29
29
|
cmsTemplates: PropTypes.array,
|
|
30
|
-
handleEdmDefaultTemplateSelection: PropTypes.func,
|
|
31
30
|
};
|
|
32
31
|
|
|
33
32
|
export default CmsTemplatesComponent;
|
|
@@ -32,6 +32,7 @@ function SlideBoxContent(props) {
|
|
|
32
32
|
onEmailModeChange,
|
|
33
33
|
emailCreateMode,
|
|
34
34
|
emailStep,
|
|
35
|
+
onEmailNextStep,
|
|
35
36
|
} = props;
|
|
36
37
|
const type = messageDetails.type.toLowerCase(); // type is context in get tags values : outbound | dvs | referral | loyalty | coupons
|
|
37
38
|
const query = { type: 'embedded', module: 'library' };
|
|
@@ -110,9 +111,10 @@ function SlideBoxContent(props) {
|
|
|
110
111
|
isGetFormData={isGetFormData}
|
|
111
112
|
getFormdata={getFormData}
|
|
112
113
|
templateData={templateData}
|
|
113
|
-
|
|
114
|
-
getDefaultTags={type}
|
|
114
|
+
type={type}
|
|
115
115
|
step={emailStep}
|
|
116
|
+
showNextStep={onEmailNextStep}
|
|
117
|
+
isFullMode={false}
|
|
116
118
|
/>
|
|
117
119
|
)}
|
|
118
120
|
{(isEditEmailWithId || isEmailEditWithContent) && (
|
|
@@ -145,5 +147,9 @@ SlideBoxContent.propTypes = {
|
|
|
145
147
|
onCreateNew: PropTypes.func,
|
|
146
148
|
onChannelChange: PropTypes.func,
|
|
147
149
|
currentChannel: PropTypes.string,
|
|
150
|
+
onEmailModeChange: PropTypes.func,
|
|
151
|
+
emailCreateMode: PropTypes.string,
|
|
152
|
+
emailStep: PropTypes.string,
|
|
153
|
+
onEmailNextStep: PropTypes.func,
|
|
148
154
|
};
|
|
149
155
|
export default SlideBoxContent;
|
|
@@ -4,26 +4,28 @@ import { CapButton } from '@capillarytech/cap-ui-library';
|
|
|
4
4
|
import PropTypes from 'prop-types';
|
|
5
5
|
import * as constants from './constants';
|
|
6
6
|
function SlideBoxFooter(props) {
|
|
7
|
-
const { slidBoxContent, onSave, messages, onEditTemplate, currentChannel, onEmailNextStep } = props;
|
|
8
|
-
const isEmailCreate = slidBoxContent === 'createTemplate' && currentChannel === constants.EMAIL;
|
|
7
|
+
const { slidBoxContent, onSave, messages, onEditTemplate, currentChannel, onEmailNextStep, emailStep, emailCreateMode } = props;
|
|
8
|
+
const isEmailCreate = slidBoxContent === 'createTemplate' && currentChannel === constants.EMAIL && emailStep !== 'createTemplate';
|
|
9
9
|
const isCreate = (slidBoxContent === 'editTemplate' || slidBoxContent === 'createTemplate') && !isEmailCreate;
|
|
10
10
|
return (
|
|
11
11
|
<div>
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
<
|
|
15
|
-
|
|
16
|
-
)}
|
|
17
|
-
{slidBoxContent &&
|
|
18
|
-
<CapButton onClick={onEmailNextStep}>
|
|
19
|
-
<FormattedMessage {...messages.continue} />
|
|
12
|
+
<div>
|
|
13
|
+
{(isCreate) && (
|
|
14
|
+
<CapButton onClick={onSave}>
|
|
15
|
+
<FormattedMessage {...messages.creativesTemplatesSave} />
|
|
20
16
|
</CapButton>
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
17
|
+
)}
|
|
18
|
+
{isEmailCreate && emailCreateMode &&
|
|
19
|
+
<CapButton onClick={onEmailNextStep}>
|
|
20
|
+
<FormattedMessage {...messages.continue} />
|
|
21
|
+
</CapButton>
|
|
22
|
+
}
|
|
23
|
+
{slidBoxContent === 'preview' && (
|
|
24
|
+
<CapButton onClick={onEditTemplate} type="secondary">
|
|
25
|
+
<FormattedMessage {...messages.creativesTemplatesEdit} />
|
|
26
|
+
</CapButton>
|
|
27
|
+
)}
|
|
28
|
+
</div>
|
|
27
29
|
</div>
|
|
28
30
|
);
|
|
29
31
|
}
|
|
@@ -34,5 +36,7 @@ SlideBoxFooter.propTypes = {
|
|
|
34
36
|
onEditTemplate: PropTypes.func,
|
|
35
37
|
currentChannel: PropTypes.string,
|
|
36
38
|
onEmailNextStep: PropTypes.func,
|
|
39
|
+
emailStep: PropTypes.string,
|
|
40
|
+
emailCreateMode: PropTypes.string,
|
|
37
41
|
};
|
|
38
42
|
export default SlideBoxFooter;
|
|
@@ -21,12 +21,17 @@ class Creatives extends React.Component {
|
|
|
21
21
|
constructor(props) {
|
|
22
22
|
super(props);
|
|
23
23
|
this.state = {
|
|
24
|
-
emailStep:
|
|
24
|
+
emailStep: 1, //modeSelection: for selecting upload or editor, and createTemplate to create template create based on modeSelection
|
|
25
25
|
showSlideBox: true,
|
|
26
26
|
slidBoxContent: this.getSlideBocContent({mode: props.creativesMode, templateData: props.templateData, isFullMode: props.isFullMode}),
|
|
27
27
|
templateData: this.getTemplateData(props.templateData),
|
|
28
28
|
currentChannel: this.props.channel || 'sms',
|
|
29
29
|
};
|
|
30
|
+
this.creativesEmailSteps = {
|
|
31
|
+
1: 'modeSelection',
|
|
32
|
+
2: 'templateSelection',
|
|
33
|
+
3: 'createTemplate',
|
|
34
|
+
};
|
|
30
35
|
}
|
|
31
36
|
componentWillUnmount() {
|
|
32
37
|
console.log("unmounting creatives");
|
|
@@ -54,7 +59,14 @@ class Creatives extends React.Component {
|
|
|
54
59
|
onChannelChange = (channel) => {
|
|
55
60
|
this.setState({currentChannel: channel});
|
|
56
61
|
}
|
|
57
|
-
|
|
62
|
+
onEmailNextStep = () => {
|
|
63
|
+
this.setState((prevState) => ({
|
|
64
|
+
emailStep: prevState.emailStep + 1,
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
onEmailModeChange = (mode) => {
|
|
68
|
+
this.setState({ emailCreateMode: mode});
|
|
69
|
+
}
|
|
58
70
|
getTemplateData = (templateData) => { //from consumers to creatives
|
|
59
71
|
const {isFullMode} = this.props;
|
|
60
72
|
if (!isFullMode && templateData) { // for component mode
|
|
@@ -113,12 +125,6 @@ class Creatives extends React.Component {
|
|
|
113
125
|
}
|
|
114
126
|
return creativesMode;
|
|
115
127
|
}
|
|
116
|
-
onEmailModeChange = (mode) => {
|
|
117
|
-
this.setState({ emailCreateMode: mode});
|
|
118
|
-
}
|
|
119
|
-
onEmailNextStep = (step) => {
|
|
120
|
-
this.setState({emailStep: step });
|
|
121
|
-
}
|
|
122
128
|
getFormData = (template) => {
|
|
123
129
|
if (template.validity) {
|
|
124
130
|
this.setState(
|
|
@@ -176,7 +182,8 @@ class Creatives extends React.Component {
|
|
|
176
182
|
onChannelChange={this.onChannelChange}
|
|
177
183
|
onEmailModeChange={this.onEmailModeChange}//used when create is clicked in email
|
|
178
184
|
emailCreateMode={emailCreateMode}// upload zip || use editor are values
|
|
179
|
-
emailStep={emailStep}
|
|
185
|
+
emailStep={this.creativesEmailSteps[emailStep]}
|
|
186
|
+
onEmailNextStep={this.onEmailNextStep}
|
|
180
187
|
/>
|
|
181
188
|
}
|
|
182
189
|
footer={
|
|
@@ -187,6 +194,8 @@ class Creatives extends React.Component {
|
|
|
187
194
|
slidBoxContent={slidBoxContent}
|
|
188
195
|
onEmailNextStep={this.onEmailNextStep}
|
|
189
196
|
currentChannel={currentChannel.toUpperCase()}
|
|
197
|
+
emailStep={this.creativesEmailSteps[emailStep]}
|
|
198
|
+
emailCreateMode={emailCreateMode}
|
|
190
199
|
/>
|
|
191
200
|
}
|
|
192
201
|
handleClose={this.toggleShowSlideBox}
|
|
@@ -10,7 +10,7 @@ import React from 'react';
|
|
|
10
10
|
import { connect } from 'react-redux';
|
|
11
11
|
import { bindActionCreators } from 'redux';
|
|
12
12
|
import Helmet from 'react-helmet';
|
|
13
|
-
import { Row, Col, Spin,
|
|
13
|
+
import { Row, Col, Spin, Popover, Modal, Select } from 'antd';
|
|
14
14
|
import { injectIntl, intlShape, FormattedMessage } from 'react-intl';
|
|
15
15
|
import { CapButton, CapInput } from '@capillarytech/cap-react-ui-library';
|
|
16
16
|
import { createStructuredSelector } from 'reselect';
|
|
@@ -1123,11 +1123,11 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
|
|
|
1123
1123
|
this.setState({currentTab: data, formData, schema});
|
|
1124
1124
|
}
|
|
1125
1125
|
|
|
1126
|
-
onTemplateNameChange = (
|
|
1126
|
+
onTemplateNameChange = () => {
|
|
1127
1127
|
|
|
1128
1128
|
}
|
|
1129
1129
|
|
|
1130
|
-
onTagSelect = (data
|
|
1130
|
+
onTagSelect = (data) => {
|
|
1131
1131
|
const isDragDrop = this.state.formData[`${this.state.currentTab - 1}`][this.state.formData[`${this.state.currentTab - 1}`].activeTab].is_drag_drop;
|
|
1132
1132
|
const formData = _.cloneDeep(this.state.formData);
|
|
1133
1133
|
const isEdmSupport = (this.props.location.query.isEdmSupport !== "false") || false;
|
|
@@ -1148,7 +1148,7 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
|
|
|
1148
1148
|
}
|
|
1149
1149
|
}
|
|
1150
1150
|
|
|
1151
|
-
onImageSelect = (
|
|
1151
|
+
onImageSelect = () => {
|
|
1152
1152
|
this.setState({ showImageSelectionBox: true }, () => {
|
|
1153
1153
|
const params = {
|
|
1154
1154
|
name: this.state.searchText,
|
|
@@ -1234,8 +1234,7 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
|
|
|
1234
1234
|
const isEdmSupport = (this.props.location.query.isEdmSupport !== "false") || false;
|
|
1235
1235
|
const formData = _.cloneDeep(this.state.formData);
|
|
1236
1236
|
|
|
1237
|
-
const
|
|
1238
|
-
const schema = (this.props.location.query.type === 'embedded') ? this.removeStandAlone() : _.cloneDeep(this.state.schema);
|
|
1237
|
+
const schema = (this.props.location.query.type === 'embedded') ? this.removeStandAlone(this.state.schema) : _.cloneDeep(this.state.schema);
|
|
1239
1238
|
const containers = _.cloneDeep(schema.containers.slice());
|
|
1240
1239
|
let tabKey = "";
|
|
1241
1240
|
let currentTab = _.cloneDeep(this.state.currentTab);
|
|
@@ -1699,7 +1698,7 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
|
|
|
1699
1698
|
this.setState({schema, formData, showModal: false});
|
|
1700
1699
|
}
|
|
1701
1700
|
|
|
1702
|
-
initFormData(props
|
|
1701
|
+
initFormData(props) {
|
|
1703
1702
|
let newFormData = {};
|
|
1704
1703
|
if (props.Global.currentOrgDetails && props.Global.currentOrgDetails.basic_details) {
|
|
1705
1704
|
newFormData = {
|
|
@@ -1887,7 +1886,7 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
|
|
|
1887
1886
|
this.setState({formData});
|
|
1888
1887
|
}
|
|
1889
1888
|
|
|
1890
|
-
handleOnHoverItem = (isHovering
|
|
1889
|
+
handleOnHoverItem = (isHovering) => {
|
|
1891
1890
|
if (!isHovering) {
|
|
1892
1891
|
// const data = _.find(this.props.Email.assetList, {_id: id});
|
|
1893
1892
|
//
|
|
@@ -1944,7 +1943,7 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
|
|
|
1944
1943
|
showSubject = () => {
|
|
1945
1944
|
const schema = _.cloneDeep(this.state.schema);
|
|
1946
1945
|
if (schema.standalone) {
|
|
1947
|
-
if (
|
|
1946
|
+
if ((this.props.location.query.module === "loyalty" || this.props.location.query.module === "dvs" || this.props.location.query.module === "timeline" || this.props.location.query.module === "coupon_expiry" ||
|
|
1948
1947
|
this.props.location.query.module === "library")) {
|
|
1949
1948
|
schema.standalone.sections[0].inputFields[0].style.display = "";
|
|
1950
1949
|
schema.standalone.sections[0].inputFields[0].labelStyle.display = "";
|
|
@@ -2018,7 +2017,7 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
|
|
|
2018
2017
|
this.setState({ device });
|
|
2019
2018
|
}
|
|
2020
2019
|
|
|
2021
|
-
handleVersionSelect = (status, formData
|
|
2020
|
+
handleVersionSelect = (status, formData) => {
|
|
2022
2021
|
const newFormData = _.cloneDeep(this.state.formData);
|
|
2023
2022
|
const schema = _.cloneDeep(this.state.schema);
|
|
2024
2023
|
const versionIndex = _.findIndex(formData['template-version-options'], {key: status});
|
|
@@ -2038,7 +2037,7 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
|
|
|
2038
2037
|
this.setState({formData: newFormData, schema, currentTab: (versionIndex + 1), isSchemaChanged: true});
|
|
2039
2038
|
}
|
|
2040
2039
|
|
|
2041
|
-
afterPaste = (
|
|
2040
|
+
afterPaste = () => {
|
|
2042
2041
|
|
|
2043
2042
|
}
|
|
2044
2043
|
|
|
@@ -2061,11 +2060,11 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
|
|
|
2061
2060
|
this.setState({showConfirmationModal: true});
|
|
2062
2061
|
}
|
|
2063
2062
|
|
|
2064
|
-
renameVersion = (
|
|
2063
|
+
renameVersion = () => {
|
|
2065
2064
|
|
|
2066
2065
|
}
|
|
2067
2066
|
|
|
2068
|
-
markFinalVersion = (
|
|
2067
|
+
markFinalVersion = () => {
|
|
2069
2068
|
const message = getMessageObject('success', this.props.intl.formatMessage(messages["Template Marked as Final Successfully"]), true);
|
|
2070
2069
|
this.props.globalActions.addMessageToQueue(message);
|
|
2071
2070
|
}
|
|
@@ -2399,7 +2398,7 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
|
|
|
2399
2398
|
injectEvents = (schema) => {
|
|
2400
2399
|
const type = this.props.location.query.type;
|
|
2401
2400
|
|
|
2402
|
-
|
|
2401
|
+
let temp = _.cloneDeep(schema);
|
|
2403
2402
|
temp.standalone.sections = this.injectSections(temp.standalone.sections);
|
|
2404
2403
|
_.forEach(temp.containers, (container) => {
|
|
2405
2404
|
let tempContainer = container;
|
|
@@ -2469,11 +2468,8 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
|
|
|
2469
2468
|
}
|
|
2470
2469
|
});
|
|
2471
2470
|
//}
|
|
2472
|
-
|
|
2473
|
-
this.setState({schema, isSchemaChanged: true}, () => {
|
|
2474
|
-
if (type === 'embedded') {
|
|
2475
|
-
this.removeStandAlone();
|
|
2476
|
-
}
|
|
2471
|
+
temp = type === 'embedded' ? this.removeStandAlone(temp) : temp;
|
|
2472
|
+
this.setState({schema: temp, isSchemaChanged: true}, () => {
|
|
2477
2473
|
if (type === 'embedded' && (this.props.route.name === 'EmailView' || (this.props.location.query.module && (this.props.location.query.module.toLowerCase() === 'loyalty' || this.props.location.query.module.toLowerCase() === 'dvs' || this.props.location.query.module.toLowerCase() === 'coupon_expiry' || this.props.location.query.module.toLowerCase() === 'timeline')))) {
|
|
2478
2474
|
if ((this.props.route.name === "EmailEdit" || this.props.route.name === "EmailCreate") && (this.props.location.query.module === "dvs" || this.props.location.query.module.toLowerCase() === 'coupon_expiry')) {
|
|
2479
2475
|
return;
|
|
@@ -2497,17 +2493,17 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
|
|
|
2497
2493
|
this.props.globalActions.fetchSchemaForEntity(query);
|
|
2498
2494
|
}
|
|
2499
2495
|
|
|
2500
|
-
removeStandAlone() {
|
|
2501
|
-
const
|
|
2502
|
-
delete
|
|
2503
|
-
|
|
2504
|
-
|
|
2496
|
+
removeStandAlone(schema) {
|
|
2497
|
+
const newSchema = _.cloneDeep(schema);
|
|
2498
|
+
delete newSchema.standalone;
|
|
2499
|
+
newSchema.standalone = {};
|
|
2500
|
+
newSchema.standalone.sections = [];
|
|
2505
2501
|
if (this.props.location.query.type === 'embedded' && (this.props.location.query.module === "loyalty" || this.props.location.query.module === "dvs" || this.props.location.query.module === "coupon_expiry" || this.props.location.query.module === "timeline" ||
|
|
2506
2502
|
this.props.location.query.module === "library")) {
|
|
2507
|
-
|
|
2503
|
+
newSchema.standalone.sections.push(_.cloneDeep(schema.standalone.sections[0]));
|
|
2508
2504
|
}
|
|
2509
2505
|
|
|
2510
|
-
_.forEach(
|
|
2506
|
+
_.forEach(newSchema.containers, (container) => {
|
|
2511
2507
|
const temp = container;
|
|
2512
2508
|
if (temp.type === 'tabs') {
|
|
2513
2509
|
// temp.tabBarExtraContent = {};
|
|
@@ -2543,8 +2539,7 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
|
|
|
2543
2539
|
temp.panes.push(basePane);
|
|
2544
2540
|
}
|
|
2545
2541
|
});
|
|
2546
|
-
|
|
2547
|
-
return schema;
|
|
2542
|
+
return newSchema;
|
|
2548
2543
|
}
|
|
2549
2544
|
|
|
2550
2545
|
startTemplateCreation(data) {
|
|
@@ -2561,7 +2556,7 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
|
|
|
2561
2556
|
const formData = _.cloneDeep(this.state.formData);
|
|
2562
2557
|
formData[0].selectedLanguages = [];
|
|
2563
2558
|
let tabKey;
|
|
2564
|
-
if (
|
|
2559
|
+
if ((this.props.location.query.isLanguageSupport === undefined || this.props.location.query.isLanguageSupport === 'false')) {
|
|
2565
2560
|
formData['template-subject'] = data.base.subject ? data.base.subject : '';
|
|
2566
2561
|
const baseLanguage = this.props.Global.currentOrgDetails.basic_details.base_language;
|
|
2567
2562
|
let languageIndex = _.findIndex(this.supportedLanguages, {iso_code: baseLanguage});
|
|
@@ -2833,6 +2828,7 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
|
|
|
2833
2828
|
postAction: this.state.getFormDataValue || 'next',
|
|
2834
2829
|
value: this.transformFormData(passedData),
|
|
2835
2830
|
validity: this.state.isFormValid,
|
|
2831
|
+
type: 'EMAIL',
|
|
2836
2832
|
};
|
|
2837
2833
|
|
|
2838
2834
|
this.setState({checkValidation: true});
|
|
@@ -7,7 +7,6 @@ import * as types from './constants';
|
|
|
7
7
|
export function* createTemplate(template) {
|
|
8
8
|
let errorMsg;
|
|
9
9
|
try {
|
|
10
|
-
console.log('Template data ', template);
|
|
11
10
|
const result = yield call(Api.createEmailTemplate, template);
|
|
12
11
|
if (result.message || result.status.code === 500) {
|
|
13
12
|
errorMsg = result.message;
|
|
@@ -21,7 +20,6 @@ export function* createTemplate(template) {
|
|
|
21
20
|
export function* duplicateTemplate(id, channel) {
|
|
22
21
|
let errorMsg;
|
|
23
22
|
try {
|
|
24
|
-
console.log('Duplicate template ', id, channel);
|
|
25
23
|
const result = yield call(Api.duplicateTemplate, id, channel );
|
|
26
24
|
if (result.message || result.status.code === 500) {
|
|
27
25
|
errorMsg = result.message;
|
|
@@ -34,7 +32,6 @@ export function* duplicateTemplate(id, channel) {
|
|
|
34
32
|
|
|
35
33
|
export function* getTemplateDetails(id) {
|
|
36
34
|
try {
|
|
37
|
-
console.log('saga get Template details', id);
|
|
38
35
|
const result = yield call(Api.getTemplateDetails, id);
|
|
39
36
|
// const sidebar = result.response.sidebar;
|
|
40
37
|
yield put({ type: types.GET_TEMPLATE_DETAILS_SUCCESS, data: result.response });
|
|
@@ -54,9 +51,8 @@ export function* getAllAssets(assetType, queryParams) {
|
|
|
54
51
|
|
|
55
52
|
export function* getCmsSetting({cmsType, projectId, cmsMode, langId, isEdmSupport}) {
|
|
56
53
|
try {
|
|
57
|
-
console.log('cms sagas', langId);
|
|
58
54
|
const result = yield call(Api.getCmsTemplateSettings, cmsType, projectId, cmsMode, langId, isEdmSupport);
|
|
59
|
-
|
|
55
|
+
|
|
60
56
|
yield put({ type: types.GET_CMS_EDITOR_DETAILS_SUCCESS, settings: result.data.response.cmsDetails });
|
|
61
57
|
} catch (error) {
|
|
62
58
|
yield put({ type: types.GET_CMS_EDITOR_DETAILS_FAILURE, error });
|
|
@@ -66,7 +62,7 @@ export function* getCmsSetting({cmsType, projectId, cmsMode, langId, isEdmSuppor
|
|
|
66
62
|
export function* getCmsData({cmsType, projectId, langId}) {
|
|
67
63
|
try {
|
|
68
64
|
const result = yield call(Api.getCmsTemplateData, cmsType, projectId, langId);
|
|
69
|
-
|
|
65
|
+
|
|
70
66
|
yield put({ type: types.GET_CMS_EDITOR_DATA_SUCCESS, data: result.data.response.data, langId: result.data.response.langId });
|
|
71
67
|
} catch (error) {
|
|
72
68
|
yield put({ type: types.GET_CMS_EDITOR_DATA_FAILURE, error });
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
import PropTypes from 'prop-types';
|
|
7
7
|
import React from 'react';
|
|
8
8
|
import { connect } from 'react-redux';
|
|
9
|
-
import { FormattedMessage, injectIntl } from 'react-intl';
|
|
9
|
+
import { FormattedMessage, injectIntl, intlShape } from 'react-intl';
|
|
10
10
|
import { createStructuredSelector } from 'reselect';
|
|
11
11
|
import { bindActionCreators } from 'redux';
|
|
12
12
|
import _ from 'lodash';
|
|
13
|
-
import {
|
|
13
|
+
import { CapRadioCard, CapHeader, CapNotification} from '@capillarytech/cap-ui-library';
|
|
14
14
|
import { UserIsAuthenticated } from '../../utils/authWrapper';
|
|
15
15
|
import {selectEmailLayout, selectCmsTemplates, selectEdmEditor} from '../Templates/selectors';
|
|
16
16
|
import * as templatesActionsCreators from '../Templates/actions';
|
|
@@ -21,13 +21,15 @@ export class EmailWrapper extends React.Component { // eslint-disable-line react
|
|
|
21
21
|
constructor(props) {
|
|
22
22
|
super(props);
|
|
23
23
|
this.state = {
|
|
24
|
+
templateName: '',
|
|
24
25
|
routeParams: {
|
|
25
26
|
pathname: `/email/create`,
|
|
26
|
-
query: {},
|
|
27
|
+
query: { module: 'library', type: 'embedded', isEdmSupport: true, isLanguageSupport: true},
|
|
27
28
|
},
|
|
28
29
|
modeContent: {
|
|
29
30
|
|
|
30
31
|
},
|
|
32
|
+
// selectedCreateMode: '',
|
|
31
33
|
|
|
32
34
|
};
|
|
33
35
|
this.modes = [
|
|
@@ -43,19 +45,21 @@ export class EmailWrapper extends React.Component { // eslint-disable-line react
|
|
|
43
45
|
},
|
|
44
46
|
];
|
|
45
47
|
}
|
|
48
|
+
|
|
46
49
|
componentDidUpdate() {
|
|
47
|
-
const {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
const {modeContent} = this.state;
|
|
51
|
+
// const isValid = this.isValid();
|
|
52
|
+
const {emailCreateMode, EmailLayout, CmsTemplates, step, SelectedEdmDefaultTemplate, templatesActions} = this.props;
|
|
53
|
+
if (step === "modeSelection" && !this.state.selectedCreateMode && emailCreateMode === 'upload' && !EmailLayout) {
|
|
54
|
+
document.getElementById('upload-email-template').click();
|
|
55
|
+
} else if (step === "templateSelection" && !this.state.selectedCreateMode) {
|
|
56
|
+
if (emailCreateMode === "editor" && !CmsTemplates) {
|
|
57
|
+
templatesActions.getEdmDefaultTemplates();
|
|
53
58
|
}
|
|
54
|
-
} else if (step === "createTemplate") {
|
|
55
|
-
const {modeContent} = this.state;
|
|
59
|
+
} else if (step === "createTemplate" && !this.state.selectedCreateMode) {
|
|
56
60
|
if (emailCreateMode === 'upload' && !EmailLayout) {
|
|
57
61
|
this.handleFileUpload(modeContent.e, modeContent.files);
|
|
58
|
-
} else if (emailCreateMode === "editor" &&
|
|
62
|
+
} else if (emailCreateMode === "editor" && _.isEmpty(SelectedEdmDefaultTemplate)) {
|
|
59
63
|
this.handleEdmDefaultTemplateSelection(modeContent.id);
|
|
60
64
|
}
|
|
61
65
|
}
|
|
@@ -63,72 +67,76 @@ export class EmailWrapper extends React.Component { // eslint-disable-line react
|
|
|
63
67
|
onChange = (e) => {
|
|
64
68
|
this.props.onEmailModeChange( e.target.value );
|
|
65
69
|
};
|
|
70
|
+
onTemplateNameChange = (ev) => {
|
|
71
|
+
this.setState({templateName: ev.target.vale});
|
|
72
|
+
}
|
|
73
|
+
//isValid = () => !_.isEmpty(this.state.templateName)
|
|
74
|
+
setCreateMode = (emailCreateMode) => {
|
|
75
|
+
this.setState({selectedCreateMode: emailCreateMode});
|
|
76
|
+
}
|
|
66
77
|
handleFileUpload = (e, files) => {
|
|
67
|
-
const {
|
|
78
|
+
const { templatesActions, intl } = this.props;
|
|
68
79
|
if (files.length === 0) {
|
|
69
80
|
return;
|
|
70
81
|
}
|
|
82
|
+
this.setCreateMode('upload');
|
|
71
83
|
const fileExtension = files[0].name.split('.').pop();
|
|
72
84
|
const supportedZipFormats = ['zip'];
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const isEdmSupport = (location.query.isEdmSupport !== "false") || false;
|
|
85
|
+
//TODO: has to be changed based on props.
|
|
86
|
+
|
|
76
87
|
|
|
77
88
|
if (supportedZipFormats.indexOf(fileExtension.toLowerCase()) !== -1) {
|
|
78
89
|
templatesActions.handleZipUpload(files[0]);
|
|
79
|
-
document.getElementById("
|
|
90
|
+
document.getElementById("upload-email-template").value = "";
|
|
80
91
|
} else if (fileExtension === 'html' || fileExtension === 'htm') {
|
|
81
92
|
const reader = new FileReader();
|
|
82
93
|
reader.onload = () => {
|
|
83
94
|
const text = reader.result;
|
|
84
95
|
templatesActions.handleHtmlUpload(text);
|
|
85
|
-
document.getElementById("
|
|
86
|
-
const type = location.query.type;
|
|
87
|
-
this.setState({routeParams: {
|
|
88
|
-
pathname: `/email/create`,
|
|
89
|
-
query: type === 'embedded' ? {type: 'embedded', module, isLanguageSupport, isEdmSupport} : {module},
|
|
90
|
-
}});
|
|
96
|
+
document.getElementById("upload-email-template").value = "";
|
|
91
97
|
};
|
|
92
98
|
reader.readAsText(files[0]);
|
|
93
99
|
} else {
|
|
94
|
-
|
|
95
|
-
|
|
100
|
+
const message = {
|
|
101
|
+
message: intl.formatMessage(messages.invalidUploadFileError),
|
|
102
|
+
description: intl.formatMessage(messages.invalidUploadFileErrorDesc),
|
|
103
|
+
};
|
|
104
|
+
CapNotification.error(message);
|
|
96
105
|
}
|
|
97
106
|
};
|
|
98
107
|
|
|
99
108
|
handleEdmDefaultTemplateSelection = (id) => {
|
|
100
109
|
const {CmsTemplates, templatesActions } = this.props;
|
|
101
110
|
const data = _.find(CmsTemplates, {_id: id});
|
|
102
|
-
const module = 'default'; //location.query.module || 'default';
|
|
103
|
-
const isLanguageSupport = true; //location.query.isLanguageSupport || true;
|
|
104
|
-
const isEdmSupport = true; //(location.query.isEdmSupport !== "false") || false;
|
|
105
111
|
|
|
106
112
|
templatesActions.setEdmTemplate(data);
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
pathname: `/email/create`,
|
|
110
|
-
query: getQuery,
|
|
111
|
-
}});
|
|
113
|
+
this.setState({
|
|
114
|
+
selectedCreateMode: 'editor'});
|
|
112
115
|
};
|
|
113
116
|
useFileUpload = (e, {files}) => {
|
|
114
|
-
this.setState({modeContent: {e, files}});
|
|
117
|
+
this.setState({modeContent: {e, files}}, this.props.showNextStep);
|
|
115
118
|
}
|
|
116
119
|
useEditor = (id) => {
|
|
117
|
-
this.setState({modeContent: {id}});
|
|
120
|
+
this.setState({modeContent: {id}}, this.props.showNextStep);
|
|
118
121
|
}
|
|
122
|
+
|
|
123
|
+
isShowEmailCreate = () => !_.isEmpty(this.state.selectedCreateMode) && (!_.isEmpty(this.props.EmailLayout) || this.props.SelectedEdmDefaultTemplate)
|
|
119
124
|
render() {
|
|
120
|
-
const {emailCreateMode, isGetFormData,
|
|
121
|
-
const
|
|
125
|
+
const {emailCreateMode, isGetFormData, getFormdata, type, CmsTemplates, step} = this.props;
|
|
126
|
+
const {templateName} = this.state;
|
|
127
|
+
const isShowEmailCreate = this.isShowEmailCreate();
|
|
122
128
|
return (
|
|
123
129
|
<div>
|
|
124
|
-
<input type="file" id="
|
|
130
|
+
<input type="file" id="upload-email-template" style={{ display: 'none'}} accept=".zip, .html, .htm" onChange={(event) => this.useFileUpload(event, {files: event.target.files})} />
|
|
125
131
|
|
|
126
|
-
{
|
|
132
|
+
{step === "modeSelection" || (step === "templateSelection" && emailCreateMode === "upload") ?
|
|
127
133
|
<div>
|
|
128
|
-
<CapInput
|
|
134
|
+
{/* <CapInput
|
|
129
135
|
label={<FormattedMessage {...messages.creativeName}/>}
|
|
130
|
-
|
|
131
|
-
|
|
136
|
+
onChange={this.onTemplateNameChange}
|
|
137
|
+
value={templateName}
|
|
138
|
+
labelPosition="top"/> */}
|
|
139
|
+
<CapHeader size="small" title={<FormattedMessage {...messages.createMode}/>}/>
|
|
132
140
|
<CapRadioCard
|
|
133
141
|
panes={this.modes}
|
|
134
142
|
onChange={this.onChange}
|
|
@@ -143,9 +151,10 @@ export class EmailWrapper extends React.Component { // eslint-disable-line react
|
|
|
143
151
|
route={{ name: 'email' }}
|
|
144
152
|
params={{}}
|
|
145
153
|
isGetFormData={isGetFormData}
|
|
146
|
-
getFormdata={
|
|
147
|
-
getFormSubscriptionData={
|
|
154
|
+
getFormdata={getFormdata}
|
|
155
|
+
getFormSubscriptionData={getFormdata}
|
|
148
156
|
getDefaultTags={type}
|
|
157
|
+
defaultData={{templateName}}
|
|
149
158
|
/>}
|
|
150
159
|
{CmsTemplates && !isShowEmailCreate && <CmsTemplatesComponent cmsTemplates={CmsTemplates} handleEdmDefaultTemplateSelection={this.useEditor}/>}
|
|
151
160
|
|
|
@@ -160,16 +169,16 @@ export class EmailWrapper extends React.Component { // eslint-disable-line react
|
|
|
160
169
|
EmailWrapper.propTypes = {
|
|
161
170
|
onEmailModeChange: PropTypes.func.isRequired,
|
|
162
171
|
isGetFormData: PropTypes.bool,
|
|
163
|
-
getFormData: PropTypes.func,
|
|
164
172
|
type: PropTypes.string,
|
|
165
173
|
emailCreateMode: PropTypes.string,
|
|
166
174
|
EmailLayout: PropTypes.object,
|
|
167
|
-
location: PropTypes.object,
|
|
168
|
-
route: PropTypes.object,
|
|
169
175
|
templatesActions: PropTypes.object,
|
|
170
176
|
CmsTemplates: PropTypes.arrayOf(PropTypes.object),
|
|
171
177
|
SelectedEdmDefaultTemplate: PropTypes.object,
|
|
172
178
|
step: PropTypes.string,
|
|
179
|
+
showNextStep: PropTypes.func,
|
|
180
|
+
getFormdata: PropTypes.func,
|
|
181
|
+
intl: intlShape,
|
|
173
182
|
};
|
|
174
183
|
|
|
175
184
|
const mapStateToProps = createStructuredSelector({
|
|
@@ -34,4 +34,12 @@ export default defineMessages({
|
|
|
34
34
|
id: 'app.containers.EmailWrapper.createMode',
|
|
35
35
|
defaultMessage: 'How do you want to create ?',
|
|
36
36
|
},
|
|
37
|
+
invalidUploadFileError: {
|
|
38
|
+
id: `app.containers.EmailWrapper.invalidUploadFileError`,
|
|
39
|
+
defaultMessage: `File cannot be uploaded.`,
|
|
40
|
+
},
|
|
41
|
+
invalidUploadFileErrorDesc: {
|
|
42
|
+
id: `app.containers.EmailWrapper.invalidUploadFileDesc`,
|
|
43
|
+
defaultMessage: `Please select another file with valid file format.`,
|
|
44
|
+
},
|
|
37
45
|
});
|
|
@@ -297,6 +297,7 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
|
|
|
297
297
|
value: result,
|
|
298
298
|
postAction: value || 'next',
|
|
299
299
|
validity: this.state.isFormValid,
|
|
300
|
+
type: 'SMS',
|
|
300
301
|
};
|
|
301
302
|
this.setState({checkValidation: true});
|
|
302
303
|
console.log('posting final result internal', response);
|
package/package.json
CHANGED
package/routes.js
CHANGED
|
@@ -557,13 +557,15 @@ export default function createRoutes(store) {
|
|
|
557
557
|
import('containers/Templates/reducer'),
|
|
558
558
|
import('containers/Templates/sagas'),
|
|
559
559
|
import('containers/TemplatesV2'),
|
|
560
|
+
import('containers/Email/sagas'),
|
|
560
561
|
]);
|
|
561
562
|
|
|
562
563
|
const renderRoute = loadModule(cb);
|
|
563
564
|
|
|
564
|
-
importModules.then(([reducer, sagas, component]) => {
|
|
565
|
+
importModules.then(([reducer, sagas, component, emailContainerSagas]) => {
|
|
565
566
|
injectReducer('templates', reducer.default);
|
|
566
567
|
injectSagas(sagas.default);
|
|
568
|
+
injectSagas(emailContainerSagas.default);
|
|
567
569
|
renderRoute(component);
|
|
568
570
|
});
|
|
569
571
|
|