@capillarytech/creatives-library 2.0.15 → 2.0.16
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/containers/CreativesContainer/SlideBoxContent.js +9 -2
- package/containers/CreativesContainer/index.js +35 -21
- package/containers/CreativesContainer/index.scss +1 -1
- package/containers/Templates/index.js +69 -43
- package/containers/Templates/messages.js +114 -90
- package/containers/TemplatesV2/index.js +28 -14
- package/package.json +1 -1
|
@@ -28,6 +28,8 @@ function SlideBoxContent(props) {
|
|
|
28
28
|
onCreateNew,
|
|
29
29
|
toggleShowSlideBox,
|
|
30
30
|
showSlideBox,
|
|
31
|
+
currentChannel,
|
|
32
|
+
onChannelChange,
|
|
31
33
|
} = props;
|
|
32
34
|
const type = messageDetails.type.toLowerCase(); // type is context in get tags values : outbound | dvs | referral | loyalty | coupons
|
|
33
35
|
const query = { type: 'embedded', module: 'library' };
|
|
@@ -42,8 +44,9 @@ function SlideBoxContent(props) {
|
|
|
42
44
|
let isEmailEditWithContent = false;
|
|
43
45
|
let isPreview = false;
|
|
44
46
|
let isEmailPreview = false;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
+
let channel = currentChannel;//for create mode
|
|
48
|
+
if (templateData && channel) {
|
|
49
|
+
channel = templateData.type;// for edit mode with template data
|
|
47
50
|
isEditSms = slidBoxContent === 'editTemplate' && channel === constants.SMS;
|
|
48
51
|
isCreateSms = slidBoxContent === 'createTemplate' && channel === constants.SMS;
|
|
49
52
|
isEditEmailWithId = slidBoxContent === 'editTemplate' && channel === constants.EMAIL && templateData._id;
|
|
@@ -61,6 +64,8 @@ function SlideBoxContent(props) {
|
|
|
61
64
|
handlePeviewTemplate={onPreviewTemplate}
|
|
62
65
|
location={location}
|
|
63
66
|
createNew={onCreateNew}
|
|
67
|
+
channel={channel}
|
|
68
|
+
onChannelChange={onChannelChange}
|
|
64
69
|
/>
|
|
65
70
|
)}
|
|
66
71
|
{isPreview && (
|
|
@@ -147,5 +152,7 @@ SlideBoxContent.propTypes = {
|
|
|
147
152
|
onCreateNew: PropTypes.func,
|
|
148
153
|
toggleShowSlideBox: PropTypes.func,
|
|
149
154
|
showSlideBox: PropTypes.bool,
|
|
155
|
+
onChannelChange: PropTypes.func,
|
|
156
|
+
currentChannel: PropTypes.string,
|
|
150
157
|
};
|
|
151
158
|
export default SlideBoxContent;
|
|
@@ -19,8 +19,9 @@ class Creatives extends React.Component {
|
|
|
19
19
|
super(props);
|
|
20
20
|
this.state = {
|
|
21
21
|
showSlideBox: true,
|
|
22
|
-
slidBoxContent: this.getSlideBocContent({mode: props.creativesMode, templateData: props.templateData}),
|
|
22
|
+
slidBoxContent: this.getSlideBocContent({mode: props.creativesMode, templateData: props.templateData, isFullMode: props.isFullMode}),
|
|
23
23
|
templateData: this.getTemplateData(props.templateData),
|
|
24
|
+
currentChannel: this.props.channel || 'sms',
|
|
24
25
|
};
|
|
25
26
|
}
|
|
26
27
|
componentWillUnmount() {
|
|
@@ -44,27 +45,13 @@ class Creatives extends React.Component {
|
|
|
44
45
|
onShowTemplates = () => {
|
|
45
46
|
this.setState({ slidBoxContent: 'templates', showSlideBox: true });
|
|
46
47
|
};
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if (mode === 'create' && isEmpty(templateData)) {
|
|
50
|
-
creativesMode = 'templates';
|
|
51
|
-
} else if (mode === 'edit') {
|
|
52
|
-
creativesMode = 'editTemplate';
|
|
53
|
-
}
|
|
54
|
-
return creativesMode;
|
|
48
|
+
onChannelChange = (channel) => {
|
|
49
|
+
this.setState({currentChannel: channel});
|
|
55
50
|
}
|
|
56
|
-
|
|
57
|
-
const templateData = {channel };
|
|
58
|
-
if (channel === constants.SMS && template.value.base) {
|
|
59
|
-
templateData.messageBody = template.value.base['sms-editor'];
|
|
60
|
-
} else if (channel === constants.EMAIL && template.value.base) {
|
|
61
|
-
templateData.emailBody = template.value.base.html_content;
|
|
62
|
-
templateData.emailSubject = template.value.base.subject;
|
|
63
|
-
}
|
|
64
|
-
return templateData;
|
|
65
|
-
};
|
|
51
|
+
|
|
66
52
|
getTemplateData = (templateData) => { //from consumers to creatives
|
|
67
|
-
|
|
53
|
+
const {isFullMode} = this.props;
|
|
54
|
+
if (!isFullMode && templateData) { // for component mode
|
|
68
55
|
const {channel} = templateData;
|
|
69
56
|
let creativesTeplateData = {type: channel };
|
|
70
57
|
if (channel === constants.SMS) {
|
|
@@ -99,6 +86,27 @@ class Creatives extends React.Component {
|
|
|
99
86
|
return null;
|
|
100
87
|
}
|
|
101
88
|
|
|
89
|
+
getCreativesData = (channel, template) => { //from creatives to consumers
|
|
90
|
+
const templateData = {channel };
|
|
91
|
+
if (channel === constants.SMS && template.value.base) {
|
|
92
|
+
templateData.messageBody = template.value.base['sms-editor'];
|
|
93
|
+
} else if (channel === constants.EMAIL && template.value.base) {
|
|
94
|
+
templateData.emailBody = template.value.base.html_content;
|
|
95
|
+
templateData.emailSubject = template.value.base.subject;
|
|
96
|
+
}
|
|
97
|
+
return templateData;
|
|
98
|
+
};
|
|
99
|
+
getSlideBocContent({mode, templateData, isFullMode}) {
|
|
100
|
+
let creativesMode = isFullMode ? 'createTemplate' : 'templates';// for library mode templates page is initial mode and for full mode createTemplates
|
|
101
|
+
if (mode === 'create' && isFullMode) {
|
|
102
|
+
creativesMode = 'createTemplate';
|
|
103
|
+
} else if (mode === 'create' && isEmpty(templateData)) {
|
|
104
|
+
creativesMode = 'templates';
|
|
105
|
+
} else if (mode === 'edit') {
|
|
106
|
+
creativesMode = 'editTemplate';
|
|
107
|
+
}
|
|
108
|
+
return creativesMode;
|
|
109
|
+
}
|
|
102
110
|
getFormData = (template) => {
|
|
103
111
|
if (template.validity) {
|
|
104
112
|
this.setState(
|
|
@@ -123,7 +131,8 @@ class Creatives extends React.Component {
|
|
|
123
131
|
this.setState({ isGetFormData: true });
|
|
124
132
|
};
|
|
125
133
|
render() {
|
|
126
|
-
const {slidBoxContent, isGetFormData, showSlideBox, templateData} = this.state;
|
|
134
|
+
const {slidBoxContent, isGetFormData, showSlideBox, templateData, currentChannel} = this.state;
|
|
135
|
+
const {isFullMode} = this.props;
|
|
127
136
|
return (
|
|
128
137
|
<div className={classnames(`${classPrefix}`)}>
|
|
129
138
|
<CapSlideBox
|
|
@@ -148,6 +157,9 @@ class Creatives extends React.Component {
|
|
|
148
157
|
isGetFormData={isGetFormData}
|
|
149
158
|
toggleShowSlideBox={this.toggleShowSlideBox}
|
|
150
159
|
showSlideBox={showSlideBox}
|
|
160
|
+
isFullMode={isFullMode}
|
|
161
|
+
currentChannel={currentChannel}
|
|
162
|
+
onChannelChange={this.onChannelChange}
|
|
151
163
|
/>
|
|
152
164
|
}
|
|
153
165
|
footer={
|
|
@@ -175,5 +187,7 @@ Creatives.propTypes = {
|
|
|
175
187
|
location: PropTypes.object,
|
|
176
188
|
handleCloseCreatives: PropTypes.func,
|
|
177
189
|
templateData: PropTypes.object,
|
|
190
|
+
isFullMode: PropTypes.bool,
|
|
191
|
+
channel: PropTypes.string,
|
|
178
192
|
};
|
|
179
193
|
export default injectIntl(Creatives);
|
|
@@ -44,6 +44,7 @@ import * as commonUtil from '../../utils/common';
|
|
|
44
44
|
import SlideBox from '../../components/SlideBox';
|
|
45
45
|
import Pagination from '../../components/Pagination';
|
|
46
46
|
import EmailPreview from '../../components/EmailPreview';
|
|
47
|
+
import CreativesContainer from '../CreativesContainer';
|
|
47
48
|
const MenuItem = Menu.Item;
|
|
48
49
|
const Option = Select.Option;
|
|
49
50
|
const BreadcrumbItem = Breadcrumb.Item;
|
|
@@ -307,10 +308,10 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
307
308
|
this.props.createNew();
|
|
308
309
|
return;
|
|
309
310
|
}
|
|
310
|
-
this.
|
|
311
|
+
this.setState({routeParams: {
|
|
311
312
|
pathname: `/${nextProps.route.name.toLowerCase()}/create`,
|
|
312
313
|
query: type === 'embedded' ? {type: 'embedded', module, isLanguageSupport, isEdmSupport} : {module},
|
|
313
|
-
});
|
|
314
|
+
}});
|
|
314
315
|
}
|
|
315
316
|
|
|
316
317
|
if (!nextProps.Templates.sendingFile && !_.isEqual(this.props.Templates.sendingFile, nextProps.Templates.sendingFile) && nextProps.Templates.errorSendingFile) {
|
|
@@ -369,14 +370,8 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
369
370
|
this.getAllTemplates({params, resetPage: true});
|
|
370
371
|
});
|
|
371
372
|
}
|
|
373
|
+
onPaginationChange = () => { this.getAllTemplates({getNextPage: true}); }
|
|
372
374
|
|
|
373
|
-
getMappedLocale = (locale) => {
|
|
374
|
-
const map = {
|
|
375
|
-
'en': 'en',
|
|
376
|
-
'zh-cn': 'zh',
|
|
377
|
-
};
|
|
378
|
-
return map[locale];
|
|
379
|
-
};
|
|
380
375
|
|
|
381
376
|
getAllTemplates = ({params, getNextPage, resetPage}, resetTemplates) => {
|
|
382
377
|
let queryParams = params;
|
|
@@ -423,7 +418,13 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
423
418
|
});
|
|
424
419
|
}
|
|
425
420
|
};
|
|
426
|
-
|
|
421
|
+
getMappedLocale = (locale) => {
|
|
422
|
+
const map = {
|
|
423
|
+
'en': 'en',
|
|
424
|
+
'zh-cn': 'zh',
|
|
425
|
+
};
|
|
426
|
+
return map[locale];
|
|
427
|
+
};
|
|
427
428
|
setLocale = () => {
|
|
428
429
|
const user = localStorage.getItem('user');
|
|
429
430
|
let locale = 'en';
|
|
@@ -444,39 +445,49 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
444
445
|
};
|
|
445
446
|
parent.postMessage(JSON.stringify(response), '*');
|
|
446
447
|
}
|
|
447
|
-
|
|
448
|
+
getCreativesMode = () => {
|
|
449
|
+
const routeParams = this.state.routeParams;
|
|
450
|
+
let creativesMode = '';
|
|
451
|
+
if (routeParams) {
|
|
452
|
+
if (routeParams.pathname.indexOf('create') > -1) {
|
|
453
|
+
creativesMode = 'create';
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return creativesMode;
|
|
457
|
+
}
|
|
448
458
|
skipTemplateSelection = (e) => {
|
|
449
459
|
console.log("vvv", e);
|
|
450
460
|
const type = this.props.location.query.type;
|
|
451
461
|
const module = (type === 'embedded') ? this.props.location.query.module : 'default';
|
|
462
|
+
let routeParams = {};
|
|
452
463
|
if (this.state.channel.toLowerCase() === 'email') {
|
|
453
464
|
const isLanguageSupport = this.props.location.query.isLanguageSupport || false;
|
|
454
|
-
|
|
465
|
+
routeParams = {
|
|
455
466
|
pathname: `/email/view`,
|
|
456
467
|
query: type === 'embedded' ? {type: 'embedded', module, isLanguageSupport} : {},
|
|
457
|
-
}
|
|
468
|
+
};
|
|
458
469
|
} else if (this.state.channel.toLowerCase() === 'sms') {
|
|
459
|
-
|
|
470
|
+
routeParams = {
|
|
460
471
|
pathname: `/sms/view`,
|
|
461
472
|
query: type === 'embedded' ? {type: 'embedded', module} : {},
|
|
462
|
-
}
|
|
473
|
+
};
|
|
463
474
|
} else if (this.state.channel.toLowerCase() === 'mobilepush') {
|
|
464
|
-
|
|
475
|
+
routeParams = {
|
|
465
476
|
pathname: `/mobilepush/edit/${e.template_id}`,
|
|
466
477
|
query: type === 'embedded' ? {type: 'embedded', module, account_id: e.account_id} : {},
|
|
467
|
-
}
|
|
478
|
+
};
|
|
468
479
|
} else if (this.state.channel.toLowerCase() === 'wechat') {
|
|
469
|
-
|
|
480
|
+
routeParams = {
|
|
470
481
|
pathname: `/wechat/edit/${e.template_id}`,
|
|
471
482
|
query: type === 'embedded' ? {type: 'embedded', module, source_account_id: e.source_account_id} : {},
|
|
472
|
-
}
|
|
483
|
+
};
|
|
473
484
|
} else if (this.state.channel.toLowerCase() === 'line') {
|
|
474
|
-
|
|
485
|
+
routeParams = {
|
|
475
486
|
pathname: `/line/view/${e.msg_type}/`,
|
|
476
487
|
query: type === 'embedded' ? {type: 'embedded', module, account_id: e.account_id } : {},
|
|
477
|
-
}
|
|
488
|
+
};
|
|
478
489
|
}
|
|
479
|
-
this.setState({loading: true});
|
|
490
|
+
this.setState({loading: true, routeParams});
|
|
480
491
|
}
|
|
481
492
|
|
|
482
493
|
handleMenuAction = (item, key) => {
|
|
@@ -493,6 +504,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
493
504
|
handleBlankTemplateAction = (item, channel) => {
|
|
494
505
|
const type = this.props.location.query.type;
|
|
495
506
|
const module = this.props.location.query.module ? this.props.location.query.module : 'default';
|
|
507
|
+
let routeParams = {};
|
|
496
508
|
if (item === "uploadFile") {
|
|
497
509
|
document.getElementById('filename').click();
|
|
498
510
|
} else if (item === "editor") {
|
|
@@ -500,16 +512,17 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
500
512
|
} else if (this.isEnabledInLibraryModule("callCreateFromProps")) {
|
|
501
513
|
this.props.createNew(item);
|
|
502
514
|
} else if (item === 'textTemplate') {
|
|
503
|
-
|
|
515
|
+
routeParams = {
|
|
504
516
|
pathname: `/${channel === 'line' ? 'line' : 'mobilepush'}/create/text`,
|
|
505
517
|
query: type === 'embedded' ? {type: 'embedded', module} : {module},
|
|
506
|
-
}
|
|
518
|
+
};
|
|
507
519
|
} else if (item === 'imageTemplate') {
|
|
508
|
-
|
|
520
|
+
routeParams = {
|
|
509
521
|
pathname: `/${channel === 'line' ? 'line' : 'mobilepush'}/create/image`,
|
|
510
522
|
query: type === 'embedded' ? {type: 'embedded', module} : {module},
|
|
511
|
-
}
|
|
523
|
+
};
|
|
512
524
|
}
|
|
525
|
+
this.setState({routeParams});
|
|
513
526
|
}
|
|
514
527
|
|
|
515
528
|
handleFileUpload = (e, {files}) => {
|
|
@@ -538,10 +551,10 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
538
551
|
this.props.createNew();
|
|
539
552
|
return;
|
|
540
553
|
}
|
|
541
|
-
this.
|
|
554
|
+
this.setState({routeParams: {
|
|
542
555
|
pathname: `/${this.props.route.name.toLowerCase()}/create`,
|
|
543
556
|
query: type === 'embedded' ? {type: 'embedded', module, isLanguageSupport, isEdmSupport} : {module},
|
|
544
|
-
});
|
|
557
|
+
}});
|
|
545
558
|
};
|
|
546
559
|
reader.readAsText(files[0]);
|
|
547
560
|
} else {
|
|
@@ -554,10 +567,10 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
554
567
|
// const index = _.findIndex(this.props.Templates.weCRMtemplates, {template_id: key});
|
|
555
568
|
// console.log('Wechat menu clicked ', item, key, index);
|
|
556
569
|
const type = this.props.location.query.type;
|
|
557
|
-
this.
|
|
570
|
+
this.setState({routeParams: {
|
|
558
571
|
pathname: `/wechat/create`,
|
|
559
572
|
query: type === 'embedded' ? {type: 'embedded'} : {},
|
|
560
|
-
});
|
|
573
|
+
}});
|
|
561
574
|
}
|
|
562
575
|
|
|
563
576
|
prepareWeChatPreviewData(content, templateTags, tagData) {
|
|
@@ -721,19 +734,21 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
721
734
|
const module = this.props.location.query.module ? this.props.location.query.module : 'default';
|
|
722
735
|
const channel = this.state.channel.toLowerCase();
|
|
723
736
|
//const keyType = ev.key && ev.key.toLowerCase() !== undefined ? ev.state.toLowerCase() : '';
|
|
737
|
+
let routeParams = {};
|
|
724
738
|
if (this.isEnabledInLibraryModule("callCreateFromProps")) {
|
|
725
739
|
this.props.createNew();
|
|
726
740
|
} else if (ev.key && (ev.key.toLowerCase() === "text" || ev.key.toLowerCase() === "image")) {
|
|
727
|
-
|
|
741
|
+
routeParams = {
|
|
728
742
|
pathname: `/${channel === 'line' ? 'line' : 'mobilepush'}/create/${ev.key.toLowerCase()}`,
|
|
729
743
|
query: type === 'embedded' ? {type: 'embedded', module} : {module},
|
|
730
|
-
}
|
|
744
|
+
};
|
|
731
745
|
} else {
|
|
732
|
-
|
|
746
|
+
routeParams = {
|
|
733
747
|
pathname: `/templates/${this.state.channel.toLowerCase()}/create`,
|
|
734
748
|
query: type === 'embedded' ? {type: 'embedded', module} : {module},
|
|
735
|
-
}
|
|
749
|
+
};
|
|
736
750
|
}
|
|
751
|
+
this.setState({routeParams});
|
|
737
752
|
}
|
|
738
753
|
|
|
739
754
|
searchTemplate(data) {
|
|
@@ -861,10 +876,10 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
861
876
|
this.props.createNew();
|
|
862
877
|
return;
|
|
863
878
|
}
|
|
864
|
-
this.
|
|
879
|
+
this.setState({routeParams: {
|
|
865
880
|
pathname: `/${this.state.channel.toLowerCase()}/create`,
|
|
866
881
|
query: getQuery,
|
|
867
|
-
});
|
|
882
|
+
}});
|
|
868
883
|
}
|
|
869
884
|
};
|
|
870
885
|
|
|
@@ -906,10 +921,10 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
906
921
|
if (this.state.channel.toLowerCase() === 'ebill') {
|
|
907
922
|
pathName = `/ebill/edit/${id}`;
|
|
908
923
|
}
|
|
909
|
-
this.
|
|
924
|
+
this.setState({routeParams: {
|
|
910
925
|
pathname: pathName,
|
|
911
926
|
query: getQuery,
|
|
912
|
-
});
|
|
927
|
+
}});
|
|
913
928
|
}
|
|
914
929
|
}
|
|
915
930
|
|
|
@@ -1206,6 +1221,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1206
1221
|
/>
|
|
1207
1222
|
);
|
|
1208
1223
|
}
|
|
1224
|
+
|
|
1209
1225
|
render() {
|
|
1210
1226
|
console.log('templates props', this.props);
|
|
1211
1227
|
let pageHeaderText = '';
|
|
@@ -1261,8 +1277,8 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1261
1277
|
/>
|
|
1262
1278
|
<div style={{display: "flex", justifyContent: "space-between", alignItems: 'center'}}>
|
|
1263
1279
|
<CapButton
|
|
1264
|
-
type={this.props.
|
|
1265
|
-
onClick={(ev) => this.props.
|
|
1280
|
+
type={this.props.isFullMode ? "primary" : "secondary"}
|
|
1281
|
+
onClick={(ev) => this.props.isFullMode ? this.createTemplate(ev) : this.handleBlankTemplateAction()} >
|
|
1266
1282
|
{ this.props.intl.formatMessage(messages.createNewActionButton) }
|
|
1267
1283
|
</CapButton>
|
|
1268
1284
|
</div>
|
|
@@ -1310,7 +1326,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1310
1326
|
const pageHeader = (
|
|
1311
1327
|
<div>
|
|
1312
1328
|
{(this.props.location.query.type !== 'embedded') && `${pageHeaderText}`}
|
|
1313
|
-
{
|
|
1329
|
+
{this.props.isFullMode && templateText}
|
|
1314
1330
|
{(this.isEnabledInLibraryModule("showAccountSelection") || (((this.state.channel.toUpperCase() === 'WECHAT' || this.state.channel.toUpperCase() === "MOBILEPUSH") && (this.props.location.query.type !== 'embedded') && !_.isEmpty(this.props.Templates.weCrmAccounts)))) &&
|
|
1315
1331
|
<CapSelect className="selectAccount" onSelect={this.onAccountSelect} value={this.props.Templates.selectedWeChatAccount ? this.props.Templates.selectedWeChatAccount.name : undefined} placeholder={this.props.intl.formatMessage(messages.selectAccount)}>
|
|
1316
1332
|
{accountOptions}
|
|
@@ -1449,6 +1465,8 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1449
1465
|
const templateList = this.populateTemplatesList(this.props.TemplatesList, true);
|
|
1450
1466
|
|
|
1451
1467
|
const isSearch = this.props.Templates.isSearch;
|
|
1468
|
+
const creativesMode = this.getCreativesMode();
|
|
1469
|
+
const {isFullMode, route} = this.props;
|
|
1452
1470
|
return (
|
|
1453
1471
|
<div>
|
|
1454
1472
|
<Spin
|
|
@@ -1458,7 +1476,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1458
1476
|
<input type="file" id="filename" style={{ display: 'none'}} accept=".zip, .html, .htm" onChange={(event) => this.handleFileUpload(event, {files: event.target.files})} />
|
|
1459
1477
|
<Row>
|
|
1460
1478
|
<Col>
|
|
1461
|
-
{(
|
|
1479
|
+
{(this.props.isFullMode || this.props.location.query.type !== "embedded") &&
|
|
1462
1480
|
<Breadcrumb>
|
|
1463
1481
|
<BreadcrumbItem>{this.props.intl.formatMessage(messages.campaigns)}</BreadcrumbItem>
|
|
1464
1482
|
<BreadcrumbItem>{this.props.intl.formatMessage(messages.creatives)}</BreadcrumbItem>
|
|
@@ -1502,6 +1520,14 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1502
1520
|
</div>}
|
|
1503
1521
|
</Row>
|
|
1504
1522
|
<Row>
|
|
1523
|
+
{!_.isEmpty(creativesMode) && isFullMode &&
|
|
1524
|
+
<CreativesContainer
|
|
1525
|
+
messageDetails={{type: "default"}}
|
|
1526
|
+
creativesMode={creativesMode}
|
|
1527
|
+
messages={messages}
|
|
1528
|
+
isFullMode={isFullMode}
|
|
1529
|
+
channel={route.name.toUpperCase()}/>
|
|
1530
|
+
}
|
|
1505
1531
|
<PreviewSideBar
|
|
1506
1532
|
showPreview={this.state.previewOpen}
|
|
1507
1533
|
templateData={this.state.previewTemplate}
|
|
@@ -1559,7 +1585,7 @@ Templates.propTypes = {
|
|
|
1559
1585
|
createNew: PropTypes.func,
|
|
1560
1586
|
onSelectTemplate: PropTypes.func,
|
|
1561
1587
|
lineActions: PropTypes.object,
|
|
1562
|
-
|
|
1588
|
+
isFullMode: PropTypes.bool,
|
|
1563
1589
|
renderNewCardGrid: PropTypes.func,
|
|
1564
1590
|
};
|
|
1565
1591
|
|
|
@@ -4,234 +4,258 @@
|
|
|
4
4
|
* This contains all the text for the Templates component.
|
|
5
5
|
*/
|
|
6
6
|
import { defineMessages } from 'react-intl';
|
|
7
|
-
|
|
7
|
+
const scope = `app.containers.Templates`;
|
|
8
8
|
export default defineMessages({
|
|
9
9
|
"header": {
|
|
10
|
-
id:
|
|
11
|
-
defaultMessage:
|
|
10
|
+
id: `${scope}.header`,
|
|
11
|
+
defaultMessage: `This is Templates container !`,
|
|
12
12
|
},
|
|
13
13
|
"uploadedAt": {
|
|
14
|
-
id:
|
|
15
|
-
defaultMessage:
|
|
14
|
+
id: `${scope}.uploadedAt`,
|
|
15
|
+
defaultMessage: `Modified`,
|
|
16
16
|
},
|
|
17
17
|
"uploadedBy": {
|
|
18
|
-
id:
|
|
19
|
-
defaultMessage:
|
|
18
|
+
id: `${scope}.uploadedBy`,
|
|
19
|
+
defaultMessage: `Uploaded By`,
|
|
20
20
|
},
|
|
21
21
|
"mapTemplate": {
|
|
22
|
-
id:
|
|
23
|
-
defaultMessage:
|
|
22
|
+
id: `${scope}.mapTemplate`,
|
|
23
|
+
defaultMessage: `Map Template`,
|
|
24
24
|
},
|
|
25
25
|
"somethingWentWrong": {
|
|
26
|
-
id:
|
|
27
|
-
defaultMessage:
|
|
26
|
+
id: `${scope}.somethingWentWrong`,
|
|
27
|
+
defaultMessage: `Something Went Wrong!!`,
|
|
28
28
|
},
|
|
29
29
|
"wechatHeader": {
|
|
30
|
-
id:
|
|
31
|
-
defaultMessage:
|
|
30
|
+
id: `${scope}.wechatHeader`,
|
|
31
|
+
defaultMessage: `WECHAT`,
|
|
32
32
|
},
|
|
33
33
|
"smsHeader": {
|
|
34
|
-
id:
|
|
35
|
-
defaultMessage:
|
|
34
|
+
id: `${scope}.smsHeader`,
|
|
35
|
+
defaultMessage: `SMS`,
|
|
36
36
|
},
|
|
37
37
|
"emailHeader": {
|
|
38
|
-
id:
|
|
39
|
-
defaultMessage:
|
|
38
|
+
id: `${scope}.emailHeader`,
|
|
39
|
+
defaultMessage: `Email`,
|
|
40
40
|
},
|
|
41
41
|
"mobilepushHeader": {
|
|
42
|
-
id:
|
|
43
|
-
defaultMessage:
|
|
42
|
+
id: `${scope}.mobilepushHeader`,
|
|
43
|
+
defaultMessage: `Mobile Push`,
|
|
44
44
|
},
|
|
45
45
|
"ebillHeader": {
|
|
46
|
-
id:
|
|
47
|
-
defaultMessage:
|
|
46
|
+
id: `${scope}.ebillHeader`,
|
|
47
|
+
defaultMessage: `Ebill`,
|
|
48
48
|
},
|
|
49
49
|
"lineHeader": {
|
|
50
|
-
id:
|
|
51
|
-
defaultMessage:
|
|
50
|
+
id: `${scope}.lineHeader`,
|
|
51
|
+
defaultMessage: `Line`,
|
|
52
52
|
},
|
|
53
53
|
"selectWechatHeader": {
|
|
54
|
-
id:
|
|
55
|
-
defaultMessage:
|
|
54
|
+
id: `${scope}.selectWechatHeader`,
|
|
55
|
+
defaultMessage: `Select WECHAT Template`,
|
|
56
56
|
},
|
|
57
57
|
"selectSmsHeader": {
|
|
58
|
-
id:
|
|
59
|
-
defaultMessage:
|
|
58
|
+
id: `${scope}.selectSmsHeader`,
|
|
59
|
+
defaultMessage: `Select SMS Template`,
|
|
60
60
|
},
|
|
61
61
|
"selectAccount": {
|
|
62
|
-
id:
|
|
62
|
+
id: `${scope}.selectAccount`,
|
|
63
63
|
defaultMessage: "Select Account",
|
|
64
64
|
},
|
|
65
65
|
"gettingAllTemplates": {
|
|
66
|
-
id:
|
|
66
|
+
id: `${scope}.gettingAllTemplates`,
|
|
67
67
|
defaultMessage: "Getting all templates...",
|
|
68
68
|
},
|
|
69
69
|
"smsChannelTemplatesHeader": {
|
|
70
|
-
id:
|
|
70
|
+
id: `${scope}.smsChannelTemplatesHeader`,
|
|
71
71
|
defaultMessage: "SMS Templates",
|
|
72
72
|
},
|
|
73
73
|
"wechatChannelTemplatesHeader": {
|
|
74
|
-
id:
|
|
74
|
+
id: `${scope}.wechatChannelTemplatesHeader`,
|
|
75
75
|
defaultMessage: "WECHAT Templates",
|
|
76
76
|
},
|
|
77
77
|
"blankTemplate": {
|
|
78
|
-
id:
|
|
78
|
+
id: `${scope}.blankTemplate`,
|
|
79
79
|
defaultMessage: "Blank Template",
|
|
80
80
|
},
|
|
81
81
|
"selectButton": {
|
|
82
|
-
id:
|
|
82
|
+
id: `${scope}.selectButton`,
|
|
83
83
|
defaultMessage: "Select",
|
|
84
84
|
},
|
|
85
85
|
"previewButton": {
|
|
86
|
-
id:
|
|
86
|
+
id: `${scope}.previewButton`,
|
|
87
87
|
defaultMessage: "Preview",
|
|
88
88
|
},
|
|
89
89
|
"editButton": {
|
|
90
|
-
id:
|
|
90
|
+
id: `${scope}.editButton`,
|
|
91
91
|
defaultMessage: "Edit",
|
|
92
92
|
},
|
|
93
93
|
"duplicateButton": {
|
|
94
|
-
id:
|
|
94
|
+
id: `${scope}.duplicateButton`,
|
|
95
95
|
defaultMessage: "Duplicate",
|
|
96
96
|
},
|
|
97
97
|
"deleteButton": {
|
|
98
|
-
id:
|
|
98
|
+
id: `${scope}.deleteButton`,
|
|
99
99
|
defaultMessage: "Delete",
|
|
100
100
|
},
|
|
101
101
|
"mostRecentOption": {
|
|
102
|
-
id:
|
|
102
|
+
id: `${scope}.mostRecentOption`,
|
|
103
103
|
defaultMessage: "Most Recent",
|
|
104
104
|
},
|
|
105
105
|
"alphabeticallyOption": {
|
|
106
|
-
id:
|
|
106
|
+
id: `${scope}.alphabeticallyOption`,
|
|
107
107
|
defaultMessage: "Alphabetically",
|
|
108
108
|
},
|
|
109
109
|
"searchText": {
|
|
110
|
-
id:
|
|
110
|
+
id: `${scope}.searchText`,
|
|
111
111
|
defaultMessage: "Search",
|
|
112
112
|
},
|
|
113
113
|
"noAccountMessage": {
|
|
114
|
-
id:
|
|
114
|
+
id: `${scope}.noAccountMessage`,
|
|
115
115
|
defaultMessage: "Please select an account to proceed",
|
|
116
116
|
},
|
|
117
117
|
"noTemplatesMessage": {
|
|
118
|
-
id:
|
|
118
|
+
id: `${scope}.noTemplatesMessage`,
|
|
119
119
|
defaultMessage: "No Templates Available",
|
|
120
120
|
},
|
|
121
121
|
"createSmsActionButton": {
|
|
122
|
-
id:
|
|
122
|
+
id: `${scope}.createSmsActionButton`,
|
|
123
123
|
defaultMessage: "Create SMS",
|
|
124
124
|
},
|
|
125
125
|
"createEmailActionButton": {
|
|
126
|
-
id:
|
|
126
|
+
id: `${scope}.createEmailActionButton`,
|
|
127
127
|
defaultMessage: "Create Email",
|
|
128
128
|
},
|
|
129
129
|
"sortBy": {
|
|
130
|
-
id:
|
|
130
|
+
id: `${scope}.sortBy`,
|
|
131
131
|
defaultMessage: "Sort by",
|
|
132
132
|
},
|
|
133
133
|
"unMapButton": {
|
|
134
|
-
id:
|
|
134
|
+
id: `${scope}.unMapButton`,
|
|
135
135
|
defaultMessage: "Unmap",
|
|
136
136
|
},
|
|
137
137
|
"templateDuplicateSuccess": {
|
|
138
|
-
id:
|
|
138
|
+
id: `${scope}.templateDuplicateSuccess`,
|
|
139
139
|
defaultMessage: "Template Duplicated Successfully",
|
|
140
140
|
},
|
|
141
141
|
"templateDeleteSuccess": {
|
|
142
|
-
id:
|
|
142
|
+
id: `${scope}.templateDeleteSuccess`,
|
|
143
143
|
defaultMessage: "SMS Template Deleted Successfully",
|
|
144
144
|
},
|
|
145
145
|
"uploadFile": {
|
|
146
|
-
id:
|
|
146
|
+
id: `${scope}.uploadFile`,
|
|
147
147
|
defaultMessage: "Upload File",
|
|
148
148
|
},
|
|
149
149
|
"useEditor": {
|
|
150
|
-
id:
|
|
150
|
+
id: `${scope}.useEditor`,
|
|
151
151
|
defaultMessage: "Use Editor",
|
|
152
152
|
},
|
|
153
153
|
"newTemplate": {
|
|
154
|
-
id:
|
|
154
|
+
id: `${scope}.newTemplate`,
|
|
155
155
|
defaultMessage: "New Template",
|
|
156
156
|
},
|
|
157
157
|
"uploadingFile": {
|
|
158
|
-
id:
|
|
158
|
+
id: `${scope}.uploadingFile`,
|
|
159
159
|
defaultMessage: "Uploading File",
|
|
160
160
|
},
|
|
161
161
|
"zipUploadFailed": {
|
|
162
|
-
id:
|
|
163
|
-
defaultMessage:
|
|
162
|
+
id: `${scope}.zipUploadFailed`,
|
|
163
|
+
defaultMessage: `Failed to Upload zip file`,
|
|
164
164
|
},
|
|
165
165
|
"campaigns": {
|
|
166
|
-
id:
|
|
167
|
-
defaultMessage:
|
|
166
|
+
id: `${scope}.campaigns`,
|
|
167
|
+
defaultMessage: `Campaigns`,
|
|
168
168
|
},
|
|
169
169
|
"creatives": {
|
|
170
|
-
id:
|
|
171
|
-
defaultMessage:
|
|
170
|
+
id: `${scope}.creatives`,
|
|
171
|
+
defaultMessage: `Creatives`,
|
|
172
172
|
},
|
|
173
173
|
"ebillPreview": {
|
|
174
|
-
id:
|
|
175
|
-
defaultMessage:
|
|
174
|
+
id: `${scope}.ebillPreview`,
|
|
175
|
+
defaultMessage: `Ebill Preview`,
|
|
176
176
|
},
|
|
177
177
|
"emailPreview": {
|
|
178
|
-
id:
|
|
179
|
-
defaultMessage:
|
|
178
|
+
id: `${scope}.emailPreview`,
|
|
179
|
+
defaultMessage: `Email Preview`,
|
|
180
180
|
},
|
|
181
181
|
"Template deleted successfully": {
|
|
182
|
-
id:
|
|
183
|
-
defaultMessage:
|
|
182
|
+
id: `${scope}.deletedSuccssfully`,
|
|
183
|
+
defaultMessage: `Template deleted successfully`,
|
|
184
184
|
},
|
|
185
185
|
"Template deletion failed": {
|
|
186
|
-
id:
|
|
187
|
-
defaultMessage:
|
|
186
|
+
id: `${scope}.deletionFailed`,
|
|
187
|
+
defaultMessage: `Template deletion failed`,
|
|
188
188
|
},
|
|
189
189
|
"preview": {
|
|
190
|
-
id:
|
|
191
|
-
defaultMessage:
|
|
190
|
+
id: `${scope}.preview`,
|
|
191
|
+
defaultMessage: `Preview`,
|
|
192
192
|
},
|
|
193
193
|
"invalidUploadFileError": {
|
|
194
|
-
id:
|
|
195
|
-
defaultMessage:
|
|
194
|
+
id: `${scope}.invalidUploadFileError`,
|
|
195
|
+
defaultMessage: `File cannot be uploaded. Please select another file with valid file format.`,
|
|
196
196
|
},
|
|
197
197
|
"templateDeleteConfirm": {
|
|
198
|
-
id:
|
|
199
|
-
defaultMessage:
|
|
198
|
+
id: `${scope}.templateDeleteConfirm`,
|
|
199
|
+
defaultMessage: `Are you sure you want to delete this Template?`,
|
|
200
200
|
},
|
|
201
201
|
"cancelText": {
|
|
202
|
-
id:
|
|
203
|
-
defaultMessage:
|
|
202
|
+
id: `${scope}.cancelText`,
|
|
203
|
+
defaultMessage: `Cancel`,
|
|
204
204
|
},
|
|
205
205
|
"yesText": {
|
|
206
|
-
id:
|
|
207
|
-
defaultMessage:
|
|
206
|
+
id: `${scope}.yesText`,
|
|
207
|
+
defaultMessage: `Yes`,
|
|
208
208
|
},
|
|
209
209
|
"templateSelection": {
|
|
210
|
-
id:
|
|
211
|
-
defaultMessage:
|
|
210
|
+
id: `${scope}.templateSelection`,
|
|
211
|
+
defaultMessage: `Template Selection`,
|
|
212
212
|
},
|
|
213
213
|
"layoutSelection": {
|
|
214
|
-
id:
|
|
215
|
-
defaultMessage:
|
|
214
|
+
id: `${scope}.layoutSelection`,
|
|
215
|
+
defaultMessage: `Select Layout`,
|
|
216
216
|
},
|
|
217
217
|
"textTemplate": {
|
|
218
|
-
id:
|
|
219
|
-
defaultMessage:
|
|
218
|
+
id: `${scope}.textTemplate`,
|
|
219
|
+
defaultMessage: `Text`,
|
|
220
220
|
},
|
|
221
221
|
"imageTemplate": {
|
|
222
|
-
id:
|
|
223
|
-
defaultMessage:
|
|
222
|
+
id: `${scope}.imageTemplate`,
|
|
223
|
+
defaultMessage: `Image`,
|
|
224
224
|
},
|
|
225
225
|
"selectDefaultButton": {
|
|
226
|
-
id:
|
|
227
|
-
defaultMessage:
|
|
226
|
+
id: `${scope}.selectDefaultButton`,
|
|
227
|
+
defaultMessage: `Select`,
|
|
228
228
|
},
|
|
229
229
|
"previewGenerateText": {
|
|
230
|
-
id:
|
|
231
|
-
defaultMessage:
|
|
230
|
+
id: `${scope}.previewGenerateText`,
|
|
231
|
+
defaultMessage: `Preview is being generated...`,
|
|
232
232
|
},
|
|
233
233
|
"createNewActionButton": {
|
|
234
|
-
id:
|
|
235
|
-
defaultMessage:
|
|
234
|
+
id: `${scope}.createNewActionButton`,
|
|
235
|
+
defaultMessage: `Create new`,
|
|
236
|
+
},
|
|
237
|
+
"creativeTemplates": {
|
|
238
|
+
id: `${scope}.creativeTemplates`,
|
|
239
|
+
defaultMessage: `Creative templates`,
|
|
240
|
+
},
|
|
241
|
+
"editMessageContent": {
|
|
242
|
+
id: `${scope}.editMessageContent`,
|
|
243
|
+
defaultMessage: `Edit message Content`,
|
|
244
|
+
},
|
|
245
|
+
"createMessageContent": {
|
|
246
|
+
id: `${scope}.editMessageContent`,
|
|
247
|
+
defaultMessage: `New message`,
|
|
248
|
+
},
|
|
249
|
+
"creativeTemplatesDesc": {
|
|
250
|
+
id: `${scope}.creativeTemplatesDesc`,
|
|
251
|
+
defaultMessage: `(Select only one creative)`,
|
|
252
|
+
},
|
|
253
|
+
"creativesTemplatesSave": {
|
|
254
|
+
id: `${scope}.creativesTemplatesSave`,
|
|
255
|
+
defaultMessage: `Done`,
|
|
256
|
+
},
|
|
257
|
+
"creativesTemplatesEdit": {
|
|
258
|
+
id: `${scope}.creativesTemplatesSave`,
|
|
259
|
+
defaultMessage: `Edit`,
|
|
236
260
|
},
|
|
237
261
|
});
|
|
@@ -23,17 +23,25 @@ const {CapCustomCardList} = CapCustomCard;
|
|
|
23
23
|
export class TemplatesV2 extends React.Component { // eslint-disable-line react/prefer-stateless-function
|
|
24
24
|
constructor(props) {
|
|
25
25
|
super(props);
|
|
26
|
+
const defaultChannel = this.props.channel || 'sms';
|
|
27
|
+
const deafaultPanes = [
|
|
28
|
+
{content: <div></div>, tab: 'Sms', key: 'sms'},
|
|
29
|
+
{content: <div></div>, tab: 'Email', key: 'email'},
|
|
30
|
+
// {content: this.getTemplatesComponent('wechat'), tab: 'Wechat', key: 'wechat'},
|
|
31
|
+
// {content: this.getTemplatesComponent('mobilepush'), tab: 'Mpush', key: 'mobilepush'},
|
|
32
|
+
];
|
|
33
|
+
const panes = this.setChannelContent(defaultChannel, deafaultPanes);
|
|
26
34
|
this.state = {
|
|
27
|
-
selectedChannel:
|
|
28
|
-
panes
|
|
29
|
-
{content: this.getTemplatesComponent('sms'), tab: 'Sms', key: 'sms'},
|
|
30
|
-
{content: this.getTemplatesComponent('email'), tab: 'Email', key: 'email'},
|
|
31
|
-
{content: this.getTemplatesComponent('wechat'), tab: 'Wechat', key: 'wechat'},
|
|
32
|
-
{content: this.getTemplatesComponent('mobilepush'), tab: 'Mpush', key: 'mobilepush'},
|
|
33
|
-
],
|
|
35
|
+
selectedChannel: defaultChannel,
|
|
36
|
+
panes,
|
|
34
37
|
};
|
|
35
38
|
}
|
|
36
|
-
|
|
39
|
+
componentWillReceiveProps(nextProps) {
|
|
40
|
+
if (this.props.channel !== nextProps.channel) {
|
|
41
|
+
const panes = this.setChannelContent(nextProps.channel, this.state.panes);
|
|
42
|
+
this.setState({selectedChannel: nextProps.channel, panes });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
37
45
|
getTemplateDataForGrid = ({templates, handlers, filterContent}) => {
|
|
38
46
|
const cardDataList = templates.map((template) => (
|
|
39
47
|
{
|
|
@@ -60,25 +68,30 @@ export class TemplatesV2 extends React.Component { // eslint-disable-line react/
|
|
|
60
68
|
location={{pathname: `/${channel}`, search: '', query}}
|
|
61
69
|
route={{name: channel}}
|
|
62
70
|
router={this.props.router}
|
|
63
|
-
|
|
71
|
+
isFullMode={this.props.isFullMode}
|
|
64
72
|
createNew={this.props.createNew}
|
|
65
73
|
onSelectTemplate={(id) => this.props.onSelectTemplate(this.selectTemplate(id))}
|
|
66
74
|
renderNewCardGrid={this.getTemplateDataForGrid}
|
|
67
75
|
/>);
|
|
68
76
|
}
|
|
69
|
-
selectTemplate = (id) => find(this.props.TemplatesList, {_id: id})
|
|
70
77
|
|
|
71
|
-
|
|
72
|
-
const panes =
|
|
78
|
+
setChannelContent = (selectedChannel, argsPanes) => {
|
|
79
|
+
const panes = argsPanes.map((p) => {
|
|
73
80
|
const pane = p;
|
|
74
81
|
if (pane.key === selectedChannel) {
|
|
75
82
|
pane.content = this.getTemplatesComponent(pane.tab.toLowerCase());
|
|
76
83
|
return pane;
|
|
77
84
|
}
|
|
78
|
-
return pane;
|
|
85
|
+
return {...pane, content: <div></div>};
|
|
79
86
|
});
|
|
80
|
-
|
|
87
|
+
return panes;
|
|
81
88
|
}
|
|
89
|
+
channelChange = (selectedChannel) => {
|
|
90
|
+
const panes = this.setChannelContent(selectedChannel, this.state.panes);
|
|
91
|
+
this.setState({panes, selectedChannel}, () => { this.props.onChannelChange(selectedChannel); });
|
|
92
|
+
}
|
|
93
|
+
selectTemplate = (id) => find(this.props.TemplatesList, {_id: id})
|
|
94
|
+
|
|
82
95
|
isLoading() {
|
|
83
96
|
return this.props.Templates.loadingTemplates;
|
|
84
97
|
}
|
|
@@ -108,6 +121,7 @@ TemplatesV2.propTypes = {
|
|
|
108
121
|
TemplatesList: PropTypes.arrayOf(PropTypes.object),
|
|
109
122
|
handlePeviewTemplate: PropTypes.func,
|
|
110
123
|
intl: intlShape,
|
|
124
|
+
onChannelChange: PropTypes.func,
|
|
111
125
|
};
|
|
112
126
|
|
|
113
127
|
TemplatesV2.defaultProps = {
|