@capillarytech/creatives-library 2.0.15 → 2.0.17

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.
@@ -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
- if (templateData) {
46
- const channel = templateData.type;
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.toLowerCase()}
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
- getSlideBocContent({mode, templateData}) {
48
- let creativesMode = 'templates';
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
- getCreativesData = (channel, template) => { //from creatives to consumers
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
- if (templateData) {
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);
@@ -1,4 +1,4 @@
1
- @import '@capillarytech/cap-ui-library/styles/_variables.scss';
1
+ @import '~@capillarytech/cap-ui-library/styles/_variables.scss';
2
2
 
3
3
  $classPrefix: add-creatives-section;
4
4
 
@@ -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.props.router.push({
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
- onPaginationChange = () => { this.getAllTemplates({getNextPage: true}); }
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
- this.props.router.push({
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
- this.props.router.push({
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
- this.props.router.push({
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
- this.props.router.push({
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
- this.props.router.push({
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
- this.props.router.push({
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
- this.props.router.push({
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.props.router.push({
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.props.router.push({
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
- this.props.router.push({
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
- this.props.router.push({
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.props.router.push({
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.props.router.push({
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.isComponent ? "secondary" : "primary"}
1265
- onClick={(ev) => this.props.isComponent ? this.handleBlankTemplateAction() : this.createTemplate(ev)} >
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
- {!this.props.isComponent && templateText}
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
- {(!this.props.isComponent || this.props.location.query.type !== "embedded") &&
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
- isComponent: PropTypes.bool,
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: 'app.containers.Templates.header',
11
- defaultMessage: 'This is Templates container !',
10
+ id: `${scope}.header`,
11
+ defaultMessage: `This is Templates container !`,
12
12
  },
13
13
  "uploadedAt": {
14
- id: 'app.containers.Templates.uploadedAt',
15
- defaultMessage: 'Modified',
14
+ id: `${scope}.uploadedAt`,
15
+ defaultMessage: `Modified`,
16
16
  },
17
17
  "uploadedBy": {
18
- id: 'app.containers.Templates.uploadedBy',
19
- defaultMessage: 'Uploaded By',
18
+ id: `${scope}.uploadedBy`,
19
+ defaultMessage: `Uploaded By`,
20
20
  },
21
21
  "mapTemplate": {
22
- id: 'app.containers.Templates.mapTemplate',
23
- defaultMessage: 'Map Template',
22
+ id: `${scope}.mapTemplate`,
23
+ defaultMessage: `Map Template`,
24
24
  },
25
25
  "somethingWentWrong": {
26
- id: 'app.containers.Templates.somethingWentWrong',
27
- defaultMessage: 'Something Went Wrong!!',
26
+ id: `${scope}.somethingWentWrong`,
27
+ defaultMessage: `Something Went Wrong!!`,
28
28
  },
29
29
  "wechatHeader": {
30
- id: 'app.containers.Templates.wechatHeader',
31
- defaultMessage: 'WECHAT',
30
+ id: `${scope}.wechatHeader`,
31
+ defaultMessage: `WECHAT`,
32
32
  },
33
33
  "smsHeader": {
34
- id: 'app.containers.Templates.smsHeader',
35
- defaultMessage: 'SMS',
34
+ id: `${scope}.smsHeader`,
35
+ defaultMessage: `SMS`,
36
36
  },
37
37
  "emailHeader": {
38
- id: 'app.containers.Templates.emailHeader',
39
- defaultMessage: 'Email',
38
+ id: `${scope}.emailHeader`,
39
+ defaultMessage: `Email`,
40
40
  },
41
41
  "mobilepushHeader": {
42
- id: 'app.containers.Templates.mobilepushHeader',
43
- defaultMessage: 'Mobile Push',
42
+ id: `${scope}.mobilepushHeader`,
43
+ defaultMessage: `Mobile Push`,
44
44
  },
45
45
  "ebillHeader": {
46
- id: 'app.containers.Templates.ebillHeader',
47
- defaultMessage: 'Ebill',
46
+ id: `${scope}.ebillHeader`,
47
+ defaultMessage: `Ebill`,
48
48
  },
49
49
  "lineHeader": {
50
- id: 'app.containers.Templates.lineHeader',
51
- defaultMessage: 'Line',
50
+ id: `${scope}.lineHeader`,
51
+ defaultMessage: `Line`,
52
52
  },
53
53
  "selectWechatHeader": {
54
- id: 'app.containers.Templates.selectWechatHeader',
55
- defaultMessage: 'Select WECHAT Template',
54
+ id: `${scope}.selectWechatHeader`,
55
+ defaultMessage: `Select WECHAT Template`,
56
56
  },
57
57
  "selectSmsHeader": {
58
- id: 'app.containers.Templates.selectSmsHeader',
59
- defaultMessage: 'Select SMS Template',
58
+ id: `${scope}.selectSmsHeader`,
59
+ defaultMessage: `Select SMS Template`,
60
60
  },
61
61
  "selectAccount": {
62
- id: 'app.containers.Templates.selectAccount',
62
+ id: `${scope}.selectAccount`,
63
63
  defaultMessage: "Select Account",
64
64
  },
65
65
  "gettingAllTemplates": {
66
- id: 'app.containers.Templates.gettingAllTemplates',
66
+ id: `${scope}.gettingAllTemplates`,
67
67
  defaultMessage: "Getting all templates...",
68
68
  },
69
69
  "smsChannelTemplatesHeader": {
70
- id: 'app.containers.Templates.smsChannelTemplatesHeader',
70
+ id: `${scope}.smsChannelTemplatesHeader`,
71
71
  defaultMessage: "SMS Templates",
72
72
  },
73
73
  "wechatChannelTemplatesHeader": {
74
- id: 'app.containers.Templates.wechatChannelTemplatesHeader',
74
+ id: `${scope}.wechatChannelTemplatesHeader`,
75
75
  defaultMessage: "WECHAT Templates",
76
76
  },
77
77
  "blankTemplate": {
78
- id: 'app.containers.Templates.blankTemplate',
78
+ id: `${scope}.blankTemplate`,
79
79
  defaultMessage: "Blank Template",
80
80
  },
81
81
  "selectButton": {
82
- id: 'app.containers.Templates.selectButton',
82
+ id: `${scope}.selectButton`,
83
83
  defaultMessage: "Select",
84
84
  },
85
85
  "previewButton": {
86
- id: 'app.containers.Templates.previewButton',
86
+ id: `${scope}.previewButton`,
87
87
  defaultMessage: "Preview",
88
88
  },
89
89
  "editButton": {
90
- id: 'app.containers.Templates.editButton',
90
+ id: `${scope}.editButton`,
91
91
  defaultMessage: "Edit",
92
92
  },
93
93
  "duplicateButton": {
94
- id: 'app.containers.Templates.duplicateButton',
94
+ id: `${scope}.duplicateButton`,
95
95
  defaultMessage: "Duplicate",
96
96
  },
97
97
  "deleteButton": {
98
- id: 'app.containers.Templates.deleteButton',
98
+ id: `${scope}.deleteButton`,
99
99
  defaultMessage: "Delete",
100
100
  },
101
101
  "mostRecentOption": {
102
- id: 'app.containers.Templates.mostRecentOption',
102
+ id: `${scope}.mostRecentOption`,
103
103
  defaultMessage: "Most Recent",
104
104
  },
105
105
  "alphabeticallyOption": {
106
- id: 'app.containers.Templates.alphabeticallyOption',
106
+ id: `${scope}.alphabeticallyOption`,
107
107
  defaultMessage: "Alphabetically",
108
108
  },
109
109
  "searchText": {
110
- id: 'app.containers.Templates.searchText',
110
+ id: `${scope}.searchText`,
111
111
  defaultMessage: "Search",
112
112
  },
113
113
  "noAccountMessage": {
114
- id: 'app.containers.Templates.noAccountMessage',
114
+ id: `${scope}.noAccountMessage`,
115
115
  defaultMessage: "Please select an account to proceed",
116
116
  },
117
117
  "noTemplatesMessage": {
118
- id: 'app.containers.Templates.noTemplatesMessage',
118
+ id: `${scope}.noTemplatesMessage`,
119
119
  defaultMessage: "No Templates Available",
120
120
  },
121
121
  "createSmsActionButton": {
122
- id: 'app.containers.Templates.createSmsActionButton',
122
+ id: `${scope}.createSmsActionButton`,
123
123
  defaultMessage: "Create SMS",
124
124
  },
125
125
  "createEmailActionButton": {
126
- id: 'app.containers.Templates.createEmailActionButton',
126
+ id: `${scope}.createEmailActionButton`,
127
127
  defaultMessage: "Create Email",
128
128
  },
129
129
  "sortBy": {
130
- id: 'app.containers.Templates.sortBy',
130
+ id: `${scope}.sortBy`,
131
131
  defaultMessage: "Sort by",
132
132
  },
133
133
  "unMapButton": {
134
- id: 'app.containers.Templates.unMapButton',
134
+ id: `${scope}.unMapButton`,
135
135
  defaultMessage: "Unmap",
136
136
  },
137
137
  "templateDuplicateSuccess": {
138
- id: 'app.containers.Templates.templateDuplicateSuccess',
138
+ id: `${scope}.templateDuplicateSuccess`,
139
139
  defaultMessage: "Template Duplicated Successfully",
140
140
  },
141
141
  "templateDeleteSuccess": {
142
- id: 'app.containers.Templates.templateDeleteSuccess',
142
+ id: `${scope}.templateDeleteSuccess`,
143
143
  defaultMessage: "SMS Template Deleted Successfully",
144
144
  },
145
145
  "uploadFile": {
146
- id: 'app.containers.Templates.uploadFile',
146
+ id: `${scope}.uploadFile`,
147
147
  defaultMessage: "Upload File",
148
148
  },
149
149
  "useEditor": {
150
- id: 'app.containers.Templates.useEditor',
150
+ id: `${scope}.useEditor`,
151
151
  defaultMessage: "Use Editor",
152
152
  },
153
153
  "newTemplate": {
154
- id: 'app.containers.Templates.newTemplate',
154
+ id: `${scope}.newTemplate`,
155
155
  defaultMessage: "New Template",
156
156
  },
157
157
  "uploadingFile": {
158
- id: 'app.containers.Templates.uploadingFile',
158
+ id: `${scope}.uploadingFile`,
159
159
  defaultMessage: "Uploading File",
160
160
  },
161
161
  "zipUploadFailed": {
162
- id: 'app.containers.Templates.zipUploadFailed',
163
- defaultMessage: 'Failed to Upload zip file',
162
+ id: `${scope}.zipUploadFailed`,
163
+ defaultMessage: `Failed to Upload zip file`,
164
164
  },
165
165
  "campaigns": {
166
- id: 'app.containers.Templates.campaigns',
167
- defaultMessage: 'Campaigns',
166
+ id: `${scope}.campaigns`,
167
+ defaultMessage: `Campaigns`,
168
168
  },
169
169
  "creatives": {
170
- id: 'app.containers.Templates.creatives',
171
- defaultMessage: 'Creatives',
170
+ id: `${scope}.creatives`,
171
+ defaultMessage: `Creatives`,
172
172
  },
173
173
  "ebillPreview": {
174
- id: 'app.containers.Templates.ebillPreview',
175
- defaultMessage: 'Ebill Preview',
174
+ id: `${scope}.ebillPreview`,
175
+ defaultMessage: `Ebill Preview`,
176
176
  },
177
177
  "emailPreview": {
178
- id: 'app.containers.Templates.emailPreview',
179
- defaultMessage: 'Email Preview',
178
+ id: `${scope}.emailPreview`,
179
+ defaultMessage: `Email Preview`,
180
180
  },
181
181
  "Template deleted successfully": {
182
- id: 'app.containers.Templates.deletedSuccssfully',
183
- defaultMessage: 'Template deleted successfully',
182
+ id: `${scope}.deletedSuccssfully`,
183
+ defaultMessage: `Template deleted successfully`,
184
184
  },
185
185
  "Template deletion failed": {
186
- id: 'app.containers.Templates.deletionFailed',
187
- defaultMessage: 'Template deletion failed',
186
+ id: `${scope}.deletionFailed`,
187
+ defaultMessage: `Template deletion failed`,
188
188
  },
189
189
  "preview": {
190
- id: 'app.containers.Templates.preview',
191
- defaultMessage: 'Preview',
190
+ id: `${scope}.preview`,
191
+ defaultMessage: `Preview`,
192
192
  },
193
193
  "invalidUploadFileError": {
194
- id: 'app.containers.Templates.invalidUploadFileError',
195
- defaultMessage: 'File cannot be uploaded. Please select another file with valid file format.',
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: 'app.containers.Templates.templateDeleteConfirm',
199
- defaultMessage: 'Are you sure you want to delete this Template?',
198
+ id: `${scope}.templateDeleteConfirm`,
199
+ defaultMessage: `Are you sure you want to delete this Template?`,
200
200
  },
201
201
  "cancelText": {
202
- id: 'app.containers.Templates.cancelText',
203
- defaultMessage: 'Cancel',
202
+ id: `${scope}.cancelText`,
203
+ defaultMessage: `Cancel`,
204
204
  },
205
205
  "yesText": {
206
- id: 'app.containers.Templates.yesText',
207
- defaultMessage: 'Yes',
206
+ id: `${scope}.yesText`,
207
+ defaultMessage: `Yes`,
208
208
  },
209
209
  "templateSelection": {
210
- id: 'app.containers.Templates.templateSelection',
211
- defaultMessage: 'Template Selection',
210
+ id: `${scope}.templateSelection`,
211
+ defaultMessage: `Template Selection`,
212
212
  },
213
213
  "layoutSelection": {
214
- id: 'app.containers.Templates.layoutSelection',
215
- defaultMessage: 'Select Layout',
214
+ id: `${scope}.layoutSelection`,
215
+ defaultMessage: `Select Layout`,
216
216
  },
217
217
  "textTemplate": {
218
- id: 'app.containers.Templates.textTemplate',
219
- defaultMessage: 'Text',
218
+ id: `${scope}.textTemplate`,
219
+ defaultMessage: `Text`,
220
220
  },
221
221
  "imageTemplate": {
222
- id: 'app.containers.Templates.imageTemplate',
223
- defaultMessage: 'Image',
222
+ id: `${scope}.imageTemplate`,
223
+ defaultMessage: `Image`,
224
224
  },
225
225
  "selectDefaultButton": {
226
- id: 'app.containers.Templates.selectDefaultButton',
227
- defaultMessage: 'Select',
226
+ id: `${scope}.selectDefaultButton`,
227
+ defaultMessage: `Select`,
228
228
  },
229
229
  "previewGenerateText": {
230
- id: 'app.containers.Templates.previewGenerateText',
231
- defaultMessage: 'Preview is being generated...',
230
+ id: `${scope}.previewGenerateText`,
231
+ defaultMessage: `Preview is being generated...`,
232
232
  },
233
233
  "createNewActionButton": {
234
- id: 'app.containers.Templates.createNewActionButton',
235
- defaultMessage: 'Create new',
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: this.props.channel || 'sms',
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
- isComponent={!this.props.isFullMode}
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
- channelChange = (selectedChannel) => {
72
- const panes = this.state.panes.map((p) => {
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
- this.setState({panes, selectedChannel});
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 = {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@capillarytech/creatives-library",
3
3
  "author": "meharaj",
4
- "version": "2.0.15",
4
+ "version": "2.0.17",
5
5
  "description": "Capillary creatives ui",
6
6
  "main": "./index.js",
7
7
  "module": "./index.es.js",