@capillarytech/creatives-library 0.0.4 → 0.0.6

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.
@@ -218,4 +218,16 @@ export default defineMessages({
218
218
  id: 'app.containers.Email.deleteVersionConfirm',
219
219
  defaultMessage: 'Do you really want to delete this version?',
220
220
  },
221
+ uploadingImage: {
222
+ id: 'app.containers.Email.uploadingImage',
223
+ defaultMessage: 'Uploading Image...',
224
+ },
225
+ uploadSizeError: {
226
+ id: 'app.containers.Email.uploadSizeError',
227
+ defaultMessage: 'File Size Too large to upload. Please upload file upto 5 MB',
228
+ },
229
+ assetUploadFailed: {
230
+ id: 'app.containers.Email.assetUploadFailed',
231
+ defaultMessage: 'Image uploaded failed',
232
+ },
221
233
  });
@@ -8,7 +8,10 @@ import { fromJS } from 'immutable';
8
8
  import * as types from './constants';
9
9
 
10
10
 
11
- const initialState = fromJS({});
11
+ const initialState = fromJS({
12
+ createTemplateInProgress: false,
13
+ createResponse: {},
14
+ });
12
15
 
13
16
  function emailReducer(state = initialState, action) {
14
17
  switch (action.type) {
@@ -19,7 +19,13 @@ const makeSelectEmail = () => createSelector(
19
19
  (substate) => substate.toJS()
20
20
  );
21
21
 
22
+ const makeSelectCreateResponse = () => createSelector(
23
+ selectEmailDomain(), (dimensionState) => dimensionState.get('createResponse')
24
+ );
25
+
26
+
22
27
  export default makeSelectEmail;
23
28
  export {
24
- selectEmailDomain,
29
+ makeSelectEmail,
30
+ makeSelectCreateResponse,
25
31
  };
@@ -117,7 +117,7 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
117
117
 
118
118
  componentWillReceiveProps(nextProps) {
119
119
  console.log('recieved props ', nextProps, nextProps.Create, this.props.Create);
120
- if (nextProps.location.query.module === 'subscription' && nextProps.isGetFormData) {
120
+ if (nextProps.location.query.module === 'library' && nextProps.isGetFormData) {
121
121
  nextProps.getFormSubscriptionData(this.getFormData());
122
122
  }
123
123
  if (nextProps.createResponse && nextProps.createResponse.templateId) {
@@ -141,7 +141,7 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
141
141
  if (nextProps.metaEntities && nextProps.metaEntities.layouts && nextProps.metaEntities.layouts.length > 0 && _.isEmpty(this.state.schema)) {
142
142
  console.log('final schema is**', nextProps.metaEntities.layouts[0].definition);
143
143
  this.injectEvents(nextProps.metaEntities.layouts[0].definition);
144
- if (this.props.location.query.module !== 'subscription') {
144
+ if (this.props.location.query.module !== 'library') {
145
145
  const query = {
146
146
  layout: 'SMS',
147
147
  type: 'TAG',
@@ -1397,7 +1397,7 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
1397
1397
  const schema = this.state.schema;
1398
1398
  const spinning = this.state.loading || (this.props.Create && "createTemplateInProgress" in this.props.Create && this.props.Create.createTemplateInProgress);
1399
1399
  let tags = this.props.metaEntities && this.props.metaEntities.tags ? this.props.metaEntities.tags.standard : [];
1400
- if (this.props.location.query.type === 'embedded' && this.props.location.query.module === 'subscription') {
1400
+ if (this.props.location.query.type === 'embedded' && this.props.location.query.module === 'library') {
1401
1401
  tags = this.props.supportedTags;
1402
1402
  }
1403
1403
  return (
@@ -93,3 +93,16 @@
93
93
  type: types.RESET_TEMPLATE_DATA,
94
94
  };
95
95
  }
96
+
97
+ export function resetUploadData() {
98
+ console.log('clearing upload data');
99
+ return {
100
+ type: types.RESET_UPLOAD_DATA,
101
+ };
102
+ }
103
+
104
+ export function resetTemplateStoreData() {
105
+ return {
106
+ type: types.CLEAR_TEMPLATE_STORE_DATA,
107
+ };
108
+ }
@@ -41,4 +41,5 @@ export const SET_EDM_TEMPLATE = "app/containers/Templates/SET_EDM_TEMPLATE";
41
41
  export const RESET_ACCOUNT = "app/containers/Templates/RESET_ACCOUNT";
42
42
  export const RESET_TEMPLATE = "app/containers/Templates/RESET_TEMPLATE";
43
43
  export const RESET_TEMPLATE_DATA = "app/containers/Templates/RESET_TEMPLATE_DATA";
44
-
44
+ export const RESET_UPLOAD_DATA = "app/containers/Templates/RESET_UPLOAD_DATA";
45
+ export const CLEAR_TEMPLATE_STORE_DATA = "app/containers/Templates/CLEAR_TEMPLATE_STORE_DATA";
@@ -17,7 +17,8 @@ import { CapInput, CapButton, CapPopover, CapSelect } from '@capillarytech/cap-r
17
17
  import { makeSelectTemplates, makeSelectTemplatesResponse } from './selectors';
18
18
  import { makeSelectCreate as makeSelectCreateSms} from '../Sms/Create/selectors';
19
19
  import { makeSelectCreate as makeSelectCreateMobilePush } from '../MobilePush/Create/selectors';
20
- // import { makeSelectEbill as makeSelectCreateEbill } from '../Ebill/selectors';
20
+ import { makeSelectEbill as makeSelectCreateEbill } from '../Ebill/selectors';
21
+ import { makeSelectEmail as makeSelectCreateEmail } from '../Email/selectors';
21
22
  import { makeSelectEdit } from '../Sms/Edit/selectors';
22
23
  import { UserIsAuthenticated } from '../../utils/authWrapper';
23
24
  import messages from './messages';
@@ -26,6 +27,8 @@ import * as actions from './actions';
26
27
  import * as smsActions from '../Sms/Create/actions';
27
28
  import * as mobilepushActions from '../MobilePush/Create/actions';
28
29
  import * as smsEditActions from '../Sms/Edit/actions';
30
+ import * as ebillActions from '../Ebill/actions';
31
+ import * as emailActions from '../Email/actions';
29
32
  import CardGrid from '../../components/CardGrid';
30
33
  import PreviewSideBar from '../../components/PreviewSideBar';
31
34
  import './_templates.scss';
@@ -113,7 +116,6 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
113
116
 
114
117
  componentDidMount() {
115
118
  if (this.state.channel.toLowerCase() === 'sms' || this.state.channel.toLowerCase() === 'email' || this.state.channel.toLowerCase() === 'ebill' || ((this.state.channel.toLowerCase() === 'wechat' || this.state.channel.toLowerCase() === 'mobilepush') && !_.isEmpty(this.props.Templates.selectedWeChatAccount))) {
116
- console.log('getting templates 1');
117
119
  const queryParams = {
118
120
  name: this.state.searchText,
119
121
  sortBy: this.state.sortBy,
@@ -125,7 +127,6 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
125
127
  queryParams.page = this.state.page;
126
128
  queryParams.perPage = this.state.perPageLimit;
127
129
  const channel = this.state.channel;
128
- console.log('getting templates 9');
129
130
  this.props.actions.getAllTemplates(channel, queryParams);
130
131
  //this.getAllTemplates({});
131
132
  // if (this.state.channel.toLowerCase() === "email") {
@@ -172,7 +173,6 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
172
173
  if (this.state.channel.toLowerCase() === "mobilepush" && !_.isEmpty(nextProps.Templates.selectedWeChatAccount)) {
173
174
  params.accountId = nextProps.Templates.selectedWeChatAccount.id;
174
175
  }
175
- console.log('getting templates 2');
176
176
  this.getAllTemplates({params}, true);
177
177
  }
178
178
  });
@@ -201,7 +201,6 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
201
201
  params.wecrmId = selectedAccount.configs.wecrm_app_id;
202
202
  params.wecrmToken = selectedAccount.configs.wecrm_token;
203
203
  nextProps.actions.setWeChatAccount(selectedAccount);
204
- console.log('getting templates 3');
205
204
  this.getAllTemplates({params});
206
205
  });
207
206
  } else if (this.state.channel.toLowerCase() === 'mobilepush' && nextProps.location.query.account_id) {
@@ -212,31 +211,34 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
212
211
  });
213
212
  this.props.actions.setWeChatAccount(selectedAccount);
214
213
  params.accountId = Number(nextProps.location.query.account_id);
215
- console.log('getting templates 4');
216
214
  this.getAllTemplates({params});
217
215
  }
218
216
  }
219
217
  if (this.state.channel.toLowerCase() === "sms" && nextProps.Create && nextProps.Create.response && nextProps.Create.response.templateId && nextProps.Create.response.templateId !== '') {
220
- const message = getMessageObject('success', this.props.intl.formatMessage(messages.templateDuplicateSuccess), true);
218
+ const message = getMessageObject('success', `${this.state.channel} ${this.props.intl.formatMessage(messages.templateDuplicateSuccess)}`, true);
221
219
  this.props.globalActions.addMessageToQueue(message);
222
- console.log('getting templates 5');
223
220
  this.getAllTemplates({params});
224
221
  this.props.smsActions.clearCreateResponse();
225
222
  }
226
223
  if (this.state.channel.toLowerCase() === "mobilepush" && nextProps.CreateMobilePush && nextProps.CreateMobilePush.response && nextProps.CreateMobilePush.response.templateId && nextProps.CreateMobilePush.response.templateId !== '') {
227
- const message = getMessageObject('success', this.props.intl.formatMessage(messages.templateDuplicateSuccess), true);
224
+ const message = getMessageObject('success', `${this.state.channel} ${this.props.intl.formatMessage(messages.templateDuplicateSuccess)}`, true);
228
225
  this.props.globalActions.addMessageToQueue(message);
229
- console.log('getting templates 6');
230
226
  this.getAllTemplates({params});
231
227
  this.props.mobilepushActions.clearCreateResponse();
232
228
  }
233
229
 
234
- if (this.state.channel.toLowerCase() === "ebill" && nextProps.CreateEbill && nextProps.CreateEbill.response && nextProps.CreateEbill.response.templateId && nextProps.CreateEbill.response.templateId !== '') {
235
- const message = getMessageObject('success', this.props.intl.formatMessage(messages.templateDuplicateSuccess), true);
230
+ if (this.state.channel.toLowerCase() === "ebill" && nextProps.CreateEbill && nextProps.CreateEbill.createResponse && nextProps.CreateEbill.createResponse.templateId && nextProps.CreateEbill.createResponse.templateId !== '') {
231
+ const message = getMessageObject('success', `${this.state.channel} ${this.props.intl.formatMessage(messages.templateDuplicateSuccess)}`, true);
236
232
  this.props.globalActions.addMessageToQueue(message);
237
- console.log('getting templates 5');
238
233
  this.getAllTemplates({params});
239
- this.props.ebillActions.clearCreateResponse();
234
+ this.props.ebillActions.clearCRUDResponse();
235
+ }
236
+
237
+ if (this.state.channel.toLowerCase() === "email" && nextProps.EmailCreate && nextProps.EmailCreate.createResponse && nextProps.EmailCreate.createResponse.templateId && nextProps.EmailCreate.createResponse.templateId !== '') {
238
+ const message = getMessageObject('success', `${this.state.channel} ${this.props.intl.formatMessage(messages.templateDuplicateSuccess)}`, true);
239
+ this.props.globalActions.addMessageToQueue(message);
240
+ this.getAllTemplates({params});
241
+ this.props.emailActions.clearStoreValues();
240
242
  }
241
243
 
242
244
  if (nextProps.Create && this.props.Create && nextProps.Create.createTemplateError && !_.isEqual(nextProps.Create.createTemplateError, this.props.Create.createTemplateError)) {
@@ -259,7 +261,6 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
259
261
  console.log("delete");
260
262
  const message = getMessageObject('success', `${this.state.channel.toUpperCase()} ${this.props.intl.formatMessage(messages['Template deleted successfully'])}`, true);
261
263
  nextProps.globalActions.addMessageToQueue(message);
262
- console.log('getting templates 7');
263
264
  this.getAllTemplates({params, resetPage: true});
264
265
  }
265
266
 
@@ -292,6 +293,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
292
293
  componentWillUnmount() {
293
294
  console.log('removed listener templates');
294
295
  window.removeEventListener("message", this.handleFrameTasks);
296
+ this.props.actions.resetTemplateStoreData();
295
297
  }
296
298
 
297
299
  onAccountSelect(value, option) {
@@ -309,7 +311,6 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
309
311
  this.props.actions.setWeChatAccount(this.props.Templates.weCrmAccounts[_.findIndex(this.props.Templates.weCrmAccounts, { name: value})]);
310
312
  params.accountId = this.props.Templates.weCrmAccounts[_.findIndex(this.props.Templates.weCrmAccounts, { name: value})].id;
311
313
  }
312
- console.log('getting templates 8');
313
314
  this.getAllTemplates({params, resetPage: true});
314
315
  });
315
316
  }
@@ -325,7 +326,6 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
325
326
  queryParams.page = this.state.page;
326
327
  queryParams.perPage = this.state.perPageLimit;
327
328
  const channel = this.state.channel;
328
- console.log('getting templates 9');
329
329
  this.props.actions.getAllTemplates(channel, queryParams);
330
330
  } else if ((resetPage || (page === 1 && this.state.templatesCount === 0) || page <= (this.state.templatesCount / this.state.perPageLimit))) {
331
331
  if (getNextPage) {
@@ -356,7 +356,6 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
356
356
  queryParams.page = page;
357
357
  queryParams.perPage = this.state.perPageLimit;
358
358
  const channel = this.state.channel;
359
- console.log('getting templates 9');
360
359
  this.props.actions.getAllTemplates(channel, queryParams);
361
360
  });
362
361
  }
@@ -376,9 +375,10 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
376
375
  const type = this.props.location.query.type;
377
376
  const module = (type === 'embedded') ? this.props.location.query.module : 'default';
378
377
  if (this.state.channel.toLowerCase() === 'email') {
378
+ const isLanguageSupport = this.props.location.query.isLanguageSupport || false;
379
379
  this.props.router.push({
380
- pathname: `/email/create`,
381
- query: type === 'embedded' ? {type: 'embedded', module} : {},
380
+ pathname: `/email/view`,
381
+ query: type === 'embedded' ? {type: 'embedded', module, isLanguageSupport} : {},
382
382
  });
383
383
  } else if (this.state.channel.toLowerCase() === 'sms') {
384
384
  this.props.router.push({
@@ -443,14 +443,16 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
443
443
  if (supportedZipFormats.indexOf(fileExtension.toLowerCase()) !== -1) {
444
444
  console.log('Zip Format got');
445
445
  this.props.actions.handleZipUpload(files[0]);
446
+ document.getElementById("filename").value = "";
446
447
  } else if (fileExtension === 'html' || fileExtension === 'htm') {
447
448
  console.log('html Format got');
448
449
  const reader = new FileReader();
449
450
  reader.onload = () => {
450
451
  const text = reader.result;
451
452
  this.props.actions.handleHtmlUpload(text);
453
+ document.getElementById("filename").value = "";
452
454
  const type = this.props.location.query.type;
453
- if (type === 'embedded' && module === "subscription") {
455
+ if (type === 'embedded' && module === "library") {
454
456
  this.props.createNew();
455
457
  return;
456
458
  }
@@ -635,7 +637,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
635
637
  createTemplate(ev) {
636
638
  const type = this.props.location.query.type;
637
639
  const module = this.props.location.query.module ? this.props.location.query.module : 'default';
638
- if (this.props.location.query.module === 'subscription') {
640
+ if (this.props.location.query.module === 'library') {
639
641
  this.props.createNew();
640
642
  } else if (ev.key && (ev.key.toLowerCase() === "text" || ev.key.toLowerCase() === "image")) {
641
643
  this.props.router.push({
@@ -664,7 +666,6 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
664
666
  if (this.state.channel.toLowerCase() === "mobilepush") {
665
667
  params.accountId = this.props.Templates.selectedWeChatAccount.id;
666
668
  }
667
- console.log('getting templates 10');
668
669
  this.getAllTemplates({params, resetPage: true});
669
670
  });
670
671
  }
@@ -682,7 +683,6 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
682
683
  if (this.state.channel.toLowerCase() === "mobilepush") {
683
684
  params.accountId = this.props.Templates.selectedWeChatAccount.id;
684
685
  }
685
- console.log('getting templates 11');
686
686
  this.getAllTemplates({params, resetPage: true});
687
687
  });
688
688
  }
@@ -698,7 +698,6 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
698
698
  if (this.state.channel.toLowerCase() === 'mobilepush' && data.toLowerCase() !== "all") {
699
699
  params.mode = this.state.mode.toLowerCase();
700
700
  }
701
- console.log('getting templates 12');
702
701
  this.getAllTemplates({params, resetPage: true});
703
702
  });
704
703
  };
@@ -738,6 +737,8 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
738
737
  this.props.mobilepushActions.createTemplate(duplicateObj);
739
738
  } else if (this.state.channel.toLowerCase() === "ebill") {
740
739
  this.props.ebillActions.createTemplate(duplicateObj);
740
+ } else if (this.state.channel.toLowerCase() === "email") {
741
+ this.props.emailActions.createTemplate(duplicateObj);
741
742
  }
742
743
  }
743
744
 
@@ -765,12 +766,12 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
765
766
  let getQuery = '';
766
767
  console.log('Selected EDM Data ', data);
767
768
  this.props.actions.setEdmTemplate(data);
768
- if (type && type.toLowerCase() === 'email') {
769
+ if (this.state.channel && this.state.channel.toLowerCase() === 'email') {
769
770
  getQuery = (type === 'embedded') ? {type: 'embedded', module, isLanguageSupport, isEdmSupport} : {module, isLanguageSupport, isEdmSupport};
770
771
  } else {
771
772
  getQuery = (type === 'embedded') ? {type: 'embedded', module} : {module};
772
773
  }
773
- if (type === 'embedded' && module === "subscription") {
774
+ if (type === 'embedded' && module === "library") {
774
775
  this.props.createNew();
775
776
  return;
776
777
  }
@@ -785,7 +786,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
785
786
  console.log('inside props****', this.props);
786
787
  const type = this.props.location.query.type;
787
788
  const module = this.props.location.query.module;
788
- const isLanguageSupport = (this.props.location.query.isLanguageSupport) ? this.props.location.query.isLanguageSupport : true;
789
+ const isLanguageSupport = (this.props.location.query.isLanguageSupport) ? this.props.location.query.isLanguageSupport : false;
789
790
  const isEdmSupport = (this.props.location.query.isEdmSupport) ? this.props.location.query.isEdmSupport : true;
790
791
  let getQuery = "";
791
792
  console.log('type**** ', type);
@@ -799,7 +800,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
799
800
  if (this.state.channel.toLowerCase() === 'email') {
800
801
  pathName = `/email/edit/${id}`;
801
802
  }
802
- if (type && type.toLowerCase() === 'email') {
803
+ if (this.state.channel.toLowerCase() === 'email') {
803
804
  getQuery = type === 'embedded' ? {type: 'embedded', module, isLanguageSupport, isEdmSupport} : {module};
804
805
  } else {
805
806
  getQuery = type === 'embedded' ? {type: 'embedded', module, account_id: this.props.location.query.account_id} : {module};
@@ -807,7 +808,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
807
808
  if (this.state.channel.toLowerCase() === 'ebill') {
808
809
  pathName = `/ebill/edit/${id}`;
809
810
  }
810
- if (module && module === 'subscription') {
811
+ if (module && module === 'library') {
811
812
  this.props.onSelectTemplate(id);
812
813
  } else {
813
814
  if (this.state.channel.toLowerCase() === 'ebill') {
@@ -923,7 +924,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
923
924
  data.map( (template) => {
924
925
  // console.log("Templates ", template._id, " Data ", template);
925
926
  const temp = {};
926
- console.log('template ', template);
927
+ // console.log('template ', template);
927
928
  const updateDateTime = (moment().format('DD-MM-YYYY') === moment(template.updatedAt).format('DD-MM-YYYY')) ? moment(template.updatedAt).format('hh:mma') : moment(template.updatedAt).format('DD MMM YYYY');
928
929
  let content = '';
929
930
  temp.id = template._id;
@@ -932,32 +933,32 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
932
933
  temp.content = (
933
934
  <div
934
935
  className="sms-template-content">
935
- <div className={`sms-text ${this.state.clickedItem === template._id ? 'sms-text-blurred' : ''}`}>
936
+ <div className={`sms-text ${this.state.hoveredItem === template._id ? 'sms-text-blurred' : ''}`}>
936
937
  {content || ''}
937
938
  </div>
938
- {template._id === this.state.clickedItem ? <CapButton onClick={(e) => this.handleEditClick(e, template._id)} className="edit-button" type="secondary">{type === 'embedded' ? this.props.intl.formatMessage(messages.selectButton) : this.props.intl.formatMessage(messages.editButton)}</CapButton> : ''}
939
- {template._id === this.state.clickedItem ? <CapButton onClick={() => this.handlePreviewClick(template)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
939
+ {template._id === this.state.hoveredItem ? <CapButton onClick={(e) => this.handleEditClick(e, template._id)} className="edit-button" type="secondary">{type === 'embedded' ? this.props.intl.formatMessage(messages.selectButton) : this.props.intl.formatMessage(messages.editButton)}</CapButton> : ''}
940
+ {template._id === this.state.hoveredItem ? <CapButton onClick={() => this.handlePreviewClick(template)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
940
941
  </div>);
941
942
  } else if (this.state.channel.toLowerCase() === 'email') {
942
943
  // console.log('Data Prepare');
943
944
  temp.content = (
944
945
  <div
945
946
  className="sms-template-content">
946
- <div className={`sms-text ${this.state.clickedItem === template._id ? 'sms-text-blurred' : ''}`}>
947
+ <div className={`sms-text ${this.state.hoveredItem === template._id ? 'sms-text-blurred' : ''}`}>
947
948
 
948
949
  </div>
949
- {template._id === this.state.clickedItem ? <CapButton onClick={(e) => this.handleEditClick(e, template._id)} className="edit-button" type="secondary">{type === 'embedded' ? this.props.intl.formatMessage(messages.selectButton) : this.props.intl.formatMessage(messages.editButton)}</CapButton> : ''}
950
- {template._id === this.state.clickedItem ? <CapButton onClick={() => this.handlePreviewClick(template)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
950
+ {template._id === this.state.hoveredItem ? <CapButton onClick={(e) => this.handleEditClick(e, template._id)} className="edit-button" type="secondary">{type === 'embedded' ? this.props.intl.formatMessage(messages.selectButton) : this.props.intl.formatMessage(messages.editButton)}</CapButton> : ''}
951
+ {template._id === this.state.hoveredItem ? <CapButton onClick={() => this.handlePreviewClick(template)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
951
952
  </div>);
952
953
  } else if (this.state.channel.toLowerCase() === 'mobilepush') {
953
954
  content = this.prepareMobilePushPreviewData(template.versions.base);
954
955
  temp.content = (
955
956
  <div>
956
- <div className={`mobilepush-message ${this.state.clickedItem === template._id ? 'sms-text-blurred' : ''}`}>
957
+ <div className={`mobilepush-message ${this.state.hoveredItem === template._id ? 'sms-text-blurred' : ''}`}>
957
958
  {content || ''}
958
959
  </div>
959
- {template._id === this.state.clickedItem ? <CapButton onClick={(e) => this.handleEditClick(e, template._id)} className="edit-button" type="secondary">{type === 'embedded' ? this.props.intl.formatMessage(messages.selectButton) : this.props.intl.formatMessage(messages.editButton)}</CapButton> : ''}
960
- {template._id === this.state.clickedItem ? <CapButton onClick={() => this.handlePreviewClick(template)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
960
+ {template._id === this.state.hoveredItem ? <CapButton onClick={(e) => this.handleEditClick(e, template._id)} className="edit-button" type="secondary">{type === 'embedded' ? this.props.intl.formatMessage(messages.selectButton) : this.props.intl.formatMessage(messages.editButton)}</CapButton> : ''}
961
+ {template._id === this.state.hoveredItem ? <CapButton onClick={() => this.handlePreviewClick(template)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
961
962
  </div>);
962
963
  } else {
963
964
  content = template && template.versions && template.versions.base ? template.versions.base['sms-editor'] : '';
@@ -969,9 +970,9 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
969
970
  temp.content = (
970
971
  <div
971
972
  className="sms-template-content">
972
- <div className={`sms-text ${this.state.clickedItem === template._id ? 'sms-text-blurred' : ''}`}>{content || ''}</div>
973
- {template._id === this.state.clickedItem ? <CapButton onClick={(e) => this.handleEditClick(e, template._id)} className="edit-button" type="secondary">{type === 'embedded' ? this.props.intl.formatMessage(messages.selectButton) : this.props.intl.formatMessage(messages.editButton)}</CapButton> : ''}
974
- {template._id === this.state.clickedItem ? <CapButton onClick={() => this.handlePreviewClick(template)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
973
+ <div className={`sms-text ${this.state.hoveredItem === template._id ? 'sms-text-blurred' : ''}`}>{content || ''}</div>
974
+ {template._id === this.state.hoveredItem ? <CapButton onClick={(e) => this.handleEditClick(e, template._id)} className="edit-button" type="secondary">{type === 'embedded' ? this.props.intl.formatMessage(messages.selectButton) : this.props.intl.formatMessage(messages.editButton)}</CapButton> : ''}
975
+ {template._id === this.state.hoveredItem ? <CapButton onClick={() => this.handlePreviewClick(template)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
975
976
  </div>
976
977
  );
977
978
  }
@@ -1270,6 +1271,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1270
1271
  htmlPreviewContent = this.state.previewTemplate && this.state.previewTemplate.versions && this.state.previewTemplate.versions.base && this.state.previewTemplate.versions.base[this.props.Global.currentOrgDetails.basic_details.base_language ? this.props.Global.currentOrgDetails.basic_details.base_language : 'en']['template-content'];
1271
1272
  }
1272
1273
 
1274
+ const templateList = this.populateTemplatesList(this.props.TemplatesList, true);
1273
1275
  return (
1274
1276
  <div>
1275
1277
  <Spin
@@ -1297,31 +1299,25 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1297
1299
  { name: 'description', content: 'Description of Templates' },
1298
1300
  ]}
1299
1301
  />
1300
- <Pagination onPageChange={() => { this.getAllTemplates({getNextPage: true}); }} paginationSelector="pagination-container">
1302
+ {templateList && templateList.length > 0 && <Pagination onPageChange={() => { this.getAllTemplates({getNextPage: true}); }} paginationSelector="pagination-container">
1301
1303
  <CardGrid
1302
1304
  className={this.state.channel.toLowerCase() === "mobilepush" ? "mobilepush-templates" : ""}
1303
- listItem={this.populateTemplatesList(this.props.TemplatesList, true)}
1305
+ listItem={templateList}
1304
1306
  filterContent={filterContent}
1305
1307
  onHoverItem={this.handleOnHoverItem}
1306
1308
  onItemClick={this.handleOnItemClick}
1307
1309
  enablePagination
1308
1310
  >
1309
1311
  </CardGrid>
1310
- {(this.state.selectedAccount === '' && _.isEmpty(this.props.Templates.selectedWeChatAccount)) && (this.state.channel.toLowerCase() === 'wechat' || this.state.channel.toLowerCase() === "mobilepush") && <div style={{ height: '65vh', textAlign: 'center', lineHeight: '65vh'}}>
1311
- <span style={{ fontFamily: 'open-sans', fontSize: '24px', color: '#B5B5B5'}}>{this.props.intl.formatMessage(messages.noAccountMessage)}</span>
1312
- </div>}
1313
- {(((this.state.selectedAccount !== '' && !_.isEmpty(this.props.Templates.selectedWeChatAccount) && this.state.channel.toLowerCase() === 'wechat') || this.state.channel.toLowerCase() !== 'wechat') && _.isEmpty(this.props.TemplatesList)) && !this.props.Templates.getAllTemplatesInProgress && <div style={{ height: '65vh', textAlign: 'center', lineHeight: '65vh'}}>
1314
- <span style={{ fontFamily: 'open-sans', fontSize: '24px', color: '#B5B5B5'}}>{this.props.intl.formatMessage(messages.noTemplatesMessage)}</span>
1315
- </div>}
1316
- </Pagination>
1317
- </Row>
1318
- <Row>
1319
- {/* {(this.state.selectedAccount === '' && _.isEmpty(this.props.Templates.selectedWeChatAccount)) && (this.state.channel.toLowerCase() === 'wechat' || this.state.channel.toLowerCase() === "mobilepush") && <div style={{ height: '65vh', textAlign: 'center', lineHeight: '65vh'}}>
1312
+ </Pagination>}
1313
+ {(this.state.selectedAccount === '' && _.isEmpty(this.props.Templates.selectedWeChatAccount)) && (this.state.channel.toLowerCase() === 'wechat' || this.state.channel.toLowerCase() === "mobilepush") && <div style={{ height: '65vh', textAlign: 'center', lineHeight: '65vh'}}>
1320
1314
  <span style={{ fontFamily: 'open-sans', fontSize: '24px', color: '#B5B5B5'}}>{this.props.intl.formatMessage(messages.noAccountMessage)}</span>
1321
1315
  </div>}
1322
1316
  {(((this.state.selectedAccount !== '' && !_.isEmpty(this.props.Templates.selectedWeChatAccount) && this.state.channel.toLowerCase() === 'wechat') || this.state.channel.toLowerCase() !== 'wechat') && _.isEmpty(this.props.TemplatesList)) && !this.props.Templates.getAllTemplatesInProgress && <div style={{ height: '65vh', textAlign: 'center', lineHeight: '65vh'}}>
1323
1317
  <span style={{ fontFamily: 'open-sans', fontSize: '24px', color: '#B5B5B5'}}>{this.props.intl.formatMessage(messages.noTemplatesMessage)}</span>
1324
- </div>} */}
1318
+ </div>}
1319
+ </Row>
1320
+ <Row>
1325
1321
  <PreviewSideBar
1326
1322
  showPreview={this.state.previewOpen}
1327
1323
  templateData={this.state.previewTemplate}
@@ -1366,6 +1362,7 @@ Templates.propTypes = {
1366
1362
  mobilepushActions: PropTypes.object,
1367
1363
  smsEditActions: PropTypes.object,
1368
1364
  ebillActions: PropTypes.object,
1365
+ emailActions: PropTypes.object,
1369
1366
  TemplatesList: PropTypes.array,
1370
1367
  Templates: PropTypes.object,
1371
1368
  route: PropTypes.object,
@@ -1384,8 +1381,9 @@ const mapStateToProps = createStructuredSelector({
1384
1381
  TemplatesList: makeSelectTemplatesResponse(),
1385
1382
  Create: makeSelectCreateSms(),
1386
1383
  CreateMobilePush: makeSelectCreateMobilePush(),
1387
- // CreateEbill: makeSelectCreateEbill(),
1384
+ CreateEbill: makeSelectCreateEbill(),
1388
1385
  Edit: makeSelectEdit(),
1386
+ EmailCreate: makeSelectCreateEmail(),
1389
1387
  Global: makeSelectAuthenticated(),
1390
1388
  });
1391
1389
 
@@ -1395,6 +1393,8 @@ function mapDispatchToProps(dispatch) {
1395
1393
  smsActions: bindActionCreators(smsActions, dispatch),
1396
1394
  mobilepushActions: bindActionCreators(mobilepushActions, dispatch),
1397
1395
  smsEditActions: bindActionCreators(smsEditActions, dispatch),
1396
+ ebillActions: bindActionCreators(ebillActions, dispatch),
1397
+ emailActions: bindActionCreators(emailActions, dispatch),
1398
1398
  globalActions: bindActionCreators(globalActions, dispatch),
1399
1399
  };
1400
1400
  }
@@ -132,7 +132,7 @@ export default defineMessages({
132
132
  },
133
133
  templateDuplicateSuccess: {
134
134
  id: 'app.containers.Templates.templateDuplicateSuccess',
135
- defaultMessage: "SMS Template Duplicated Successfully",
135
+ defaultMessage: "Template Duplicated Successfully",
136
136
  },
137
137
  templateDeleteSuccess: {
138
138
  id: 'app.containers.Templates.templateDeleteSuccess',
@@ -78,8 +78,11 @@ function templatesReducer(state = initialState, action) {
78
78
  .set('templates', fromJS([]));
79
79
  case types.SET_SELECTED_LAYOUT:
80
80
  return state
81
- .set('selectedEmailLayout', action.selectedTemplate)
81
+ .set('selectedEmailLayout', fromJS(action.selectedTemplate))
82
82
  .set('edmTemplate', fromJS({}));
83
+ case types.RESET_UPLOAD_DATA:
84
+ return state
85
+ .set('selectedEmailLayout', "");
83
86
  case types.SEND_ZIPPED_FILE_REQUEST:
84
87
  return state
85
88
  .set('sendingFile', true)
@@ -88,7 +91,7 @@ function templatesReducer(state = initialState, action) {
88
91
  case types.SEND_ZIPPED_FILE_SUCCESS:
89
92
  return state
90
93
  .set('sendingFile', false)
91
- .set('selectedEmailLayout', action.selectedTemplate)
94
+ .set('selectedEmailLayout', fromJS(action.selectedTemplate))
92
95
  .set('edmTemplate', fromJS({}));
93
96
  case types.SEND_ZIPPED_FILE_FAILURE:
94
97
  return state
@@ -124,6 +127,10 @@ function templatesReducer(state = initialState, action) {
124
127
  return state
125
128
  .set('getTemplateDetailsInProgress', false)
126
129
  .set('templateDetails', fromJS({}));
130
+ case types.CLEAR_TEMPLATE_STORE_DATA:
131
+ return state
132
+ .set('templates', fromJS({}))
133
+ .set('weCRMtemplates', fromJS({}));
127
134
  default:
128
135
  return state;
129
136
  }
package/initialState.js CHANGED
@@ -28,5 +28,11 @@ export default {
28
28
  },
29
29
  templates: {
30
30
 
31
+ },
32
+ email: {
33
+
34
+ },
35
+ ebill: {
36
+
31
37
  },
32
38
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@capillarytech/creatives-library",
3
3
  "author": "meharaj",
4
- "version": "0.0.4",
4
+ "version": "0.0.6",
5
5
  "description": "Capillary creatives ui",
6
6
  "main": "./index.js",
7
7
  "module": "./index.es.js",
@@ -25,6 +25,7 @@
25
25
  "express": "4.14.0",
26
26
  "fixed-data-table": "^0.6.4",
27
27
  "fontfaceobserver": "2.0.7",
28
+ "fs-extra": "^5.0.0",
28
29
  "immutable": "3.8.1",
29
30
  "intl": "1.2.5",
30
31
  "invariant": "2.2.2",
package/reducers.js CHANGED
@@ -14,6 +14,8 @@ import createSmsReducer from 'containers/Sms/Create/reducer';
14
14
  import editSmsReducer from 'containers/Sms/Edit/reducer';
15
15
  import templateReducer from 'containers/Templates/reducer';
16
16
  import tagsReducer from 'containers/TagList/reducer';
17
+ import emailReducer from 'containers/Email/reducer';
18
+ import ebillReducer from 'containers/Ebill/reducer';
17
19
 
18
20
  /*
19
21
  * routeReducer
@@ -56,6 +58,8 @@ export default function createReducer(asyncReducers) {
56
58
  edit: editSmsReducer,
57
59
  templates: templateReducer,
58
60
  tagList: tagsReducer,
61
+ email: emailReducer,
62
+ ebill: ebillReducer,
59
63
  ...asyncReducers,
60
64
  });
61
65
  }
package/routes.js CHANGED
@@ -8,6 +8,7 @@ import * as smsSagas from 'containers/Sms/Create/sagas';
8
8
  import * as smsEditSagas from 'containers/Sms/Edit/sagas';
9
9
  import * as mobilpushSagas from 'containers/MobilePush/Create/sagas';
10
10
  import * as ebillSagas from 'containers/Ebill/sagas';
11
+ import * as emailSagas from 'containers/Email/sagas';
11
12
  import * as templateSagas from 'containers/Templates/sagas';
12
13
  const errorLoading = (err) => {
13
14
  console.error('Dynamic page loading failed', err); // eslint-disable-line no-console
@@ -182,6 +183,7 @@ export default function createRoutes(store) {
182
183
  importModules.then(([reducer, sagas, component]) => {
183
184
  injectReducer('templates', reducer.default);
184
185
  injectSagas(sagas.default);
186
+ injectSagas(emailSagas.default);
185
187
  injectSagas(rootSaga.default);
186
188
  renderRoute(component);
187
189
  });
@@ -213,7 +215,7 @@ export default function createRoutes(store) {
213
215
  },
214
216
  {
215
217
  path: '/assets',
216
- name: 'Assets',
218
+ name: 'GALLERY',
217
219
  getComponent(nextState, cb) {
218
220
  const importModules = Promise.all([
219
221
  import('containers/Assets/Gallery/reducer'),
@@ -294,8 +296,28 @@ export default function createRoutes(store) {
294
296
  importModules.catch(errorLoading);
295
297
  },
296
298
  }, {
299
+ path: '/email/view',
300
+ name: 'EmailView',
301
+ getComponent(nextState, cb) {
302
+ const importModules = Promise.all([
303
+ import('containers/Email/reducer'),
304
+ import('containers/Email/sagas'),
305
+ import('containers/Email'),
306
+ ]);
307
+ const renderRoute = loadModule(cb);
308
+
309
+ importModules.then(([reducer, sagas, component]) => {
310
+ injectReducer('email', reducer.default);
311
+ injectSagas(sagas.default);
312
+ injectSagas(rootSaga.default);
313
+ injectSagas(templateSagas.default);
314
+ renderRoute(component);
315
+ });
316
+ importModules.catch(errorLoading);
317
+ },
318
+ }, {
297
319
  path: '/email/edit/:id',
298
- name: 'Email',
320
+ name: 'EmailEdit',
299
321
  getComponent(nextState, cb) {
300
322
  const importModules = Promise.all([
301
323
  import('containers/Email/reducer'),