@capillarytech/creatives-library 3.0.35 → 3.1.0

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.
Files changed (218) hide show
  1. package/assets/noImage.png +0 -0
  2. package/components/BreadCrumbs/messages.js +1 -1
  3. package/components/CapTagList/index.js +3 -3
  4. package/components/CapTagList/messages.js +4 -16
  5. package/components/Ckeditor/messages.js +1 -1
  6. package/components/CustomPopOver/index.js +4 -3
  7. package/components/CustomPopOver/messages.js +1 -5
  8. package/components/DateFilter/index.js +12 -12
  9. package/components/DateFilter/messages.js +0 -40
  10. package/components/DateRange/index.js +4 -5
  11. package/components/DateRange/messages.js +1 -13
  12. package/components/Edmeditor/messages.js +1 -1
  13. package/components/EmailPreview/index.js +4 -4
  14. package/components/EmailPreview/messages.js +2 -18
  15. package/components/Footer/messages.js +1 -1
  16. package/components/FormBuilder/index.js +19 -15
  17. package/components/FormBuilder/messages.js +1 -33
  18. package/components/Header/messages.js +4 -4
  19. package/components/ImagePreview/index.js +1 -1
  20. package/components/ImagePreview/messages.js +1 -5
  21. package/components/PageHeader/messages.js +1 -1
  22. package/components/PreviewSideBar/index.js +2 -2
  23. package/components/PreviewSideBar/messages.js +6 -14
  24. package/components/Sidebar/messages.js +3 -3
  25. package/components/SmsTest/index.js +4 -6
  26. package/components/SmsTest/messages.js +1 -9
  27. package/components/TemplatePreview/WechatRichmediaTemplatePreview/messages.js +3 -3
  28. package/components/TemplatePreview/index.js +10 -11
  29. package/components/TemplatePreview/messages.js +7 -23
  30. package/components/Toastr/messages.js +1 -1
  31. package/components/ToastrMessage/index.js +1 -4
  32. package/components/ToastrMessage/messages.js +1 -5
  33. package/components/TopBar/messages.js +1 -1
  34. package/config/app.js +0 -2
  35. package/containers/Assets/Gallery/messages.js +20 -20
  36. package/containers/Cap/index.js +5 -5
  37. package/containers/Dashboard/index.js +2 -2
  38. package/containers/Dashboard/messages.js +1 -1
  39. package/containers/Ebill/index.js +1 -1
  40. package/containers/Ebill/messages.js +16 -20
  41. package/containers/Email/index.js +24 -24
  42. package/containers/Email/messages.js +59 -107
  43. package/containers/Line/Create/index.js +7 -7
  44. package/containers/Line/Create/messages.js +42 -58
  45. package/containers/Line/Edit/index.js +14 -14
  46. package/containers/Line/Edit/messages.js +38 -58
  47. package/containers/Login/components/LoginForm/index.js +7 -10
  48. package/containers/Login/components/LoginForm/messages.js +3 -15
  49. package/containers/Login/index.js +1 -1
  50. package/containers/Login/messages.js +3 -7
  51. package/containers/MobilePush/Create/index.js +45 -45
  52. package/containers/MobilePush/Create/messages.js +75 -111
  53. package/containers/MobilePush/Edit/index.js +45 -45
  54. package/containers/MobilePush/Edit/messages.js +83 -100
  55. package/containers/NotFoundPage/messages.js +1 -1
  56. package/containers/Sms/Create/index.js +8 -7
  57. package/containers/Sms/Create/messages.js +19 -43
  58. package/containers/Sms/Edit/index.js +4 -4
  59. package/containers/Sms/Edit/messages.js +20 -36
  60. package/containers/TagList/messages.js +1 -1
  61. package/containers/Templates/index.js +19 -20
  62. package/containers/Templates/messages.js +64 -136
  63. package/containers/TestPage/messages.js +1 -1
  64. package/containers/Testv2/index.js +2 -2
  65. package/containers/Testv2/messages.js +1 -9
  66. package/containers/WeChat/MapTemplates/index.js +10 -10
  67. package/containers/WeChat/MapTemplates/messages.js +17 -49
  68. package/containers/WeChat/RichmediaTemplates/Create/messages.js +33 -33
  69. package/containers/WeChat/RichmediaTemplates/Edit/messages.js +1 -1
  70. package/containers/WeChat/RichmediaTemplates/View/index.js +2 -2
  71. package/containers/WeChat/RichmediaTemplates/View/messages.js +1 -9
  72. package/index.js +20 -8
  73. package/package.json +4 -1
  74. package/routes.js +16 -2
  75. package/services/api.js +2 -17
  76. package/services/getSchema.js +4 -1
  77. package/translations/en.json +360 -1396
  78. package/translations/zh.json +381 -1417
  79. package/utils/smsCharCountV2.js +10 -26
  80. package/v2Components/BreadCrumbs/messages.js +1 -1
  81. package/v2Components/CallTaskPreview/messages.js +1 -1
  82. package/v2Components/CapTagList/index.js +5 -6
  83. package/v2Components/CapTagList/messages.js +4 -24
  84. package/v2Components/Ckeditor/index.js +0 -1
  85. package/v2Components/Ckeditor/messages.js +1 -1
  86. package/v2Components/CmsTemplatesComponent/messages.js +2 -2
  87. package/v2Components/CustomPopOver/index.js +2 -4
  88. package/v2Components/CustomPopOver/messages.js +1 -5
  89. package/v2Components/DateFilter/index.js +349 -0
  90. package/v2Components/DateFilter/messages.js +17 -0
  91. package/v2Components/DateFilter/tests/index.test.js +15 -0
  92. package/v2Components/DateRange/index.js +113 -0
  93. package/v2Components/DateRange/messages.js +13 -0
  94. package/v2Components/DateRange/tests/index.test.js +10 -0
  95. package/v2Components/Edmeditor/messages.js +1 -1
  96. package/v2Components/EmailPreview/index.js +2 -2
  97. package/v2Components/EmailPreview/messages.js +3 -11
  98. package/v2Components/EmailPreviewV2/index.js +1 -1
  99. package/v2Components/EmailPreviewV2/messages.js +9 -13
  100. package/v2Components/Footer/messages.js +1 -1
  101. package/v2Components/FormBuilder/_formBuilder.scss +19 -0
  102. package/v2Components/FormBuilder/index.js +58 -27
  103. package/v2Components/FormBuilder/messages.js +1 -49
  104. package/v2Components/Header/index.js +2 -2
  105. package/v2Components/Header/messages.js +4 -4
  106. package/v2Components/ImagePreview/index.js +2 -3
  107. package/v2Components/ImagePreview/messages.js +1 -5
  108. package/v2Components/MobilePushPreviewV2/index.js +5 -2
  109. package/v2Components/MobilePushPreviewV2/messages.js +1 -9
  110. package/v2Components/NavigationBar/messages.js +1 -1
  111. package/v2Components/NewCallTask/messages.js +5 -5
  112. package/v2Components/PageHeader/_pageHeader.scss +22 -0
  113. package/v2Components/PageHeader/index.js +37 -0
  114. package/v2Components/PageHeader/messages.js +13 -0
  115. package/v2Components/PageHeader/tests/index.test.js +10 -0
  116. package/v2Components/PreviewSideBar/messages.js +6 -6
  117. package/v2Components/Sidebar/_sidebar.scss +115 -0
  118. package/v2Components/Sidebar/index.js +208 -0
  119. package/v2Components/Sidebar/messages.js +21 -0
  120. package/v2Components/Sidebar/tests/index.test.js +10 -0
  121. package/v2Components/SmsEditor/index.js +55 -0
  122. package/v2Components/SmsEditor/tests/index.test.js +10 -0
  123. package/v2Components/SmsTest/index.js +4 -6
  124. package/v2Components/SmsTest/messages.js +1 -9
  125. package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/_wechatRichmediaTemplatePrev.scss +2 -0
  126. package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/index.js +18 -28
  127. package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/messages.js +3 -3
  128. package/v2Components/TemplatePreview/_templatePreview.scss +0 -9
  129. package/v2Components/TemplatePreview/index.js +16 -35
  130. package/v2Components/TemplatePreview/messages.js +7 -23
  131. package/v2Components/Toastr/messages.js +1 -1
  132. package/v2Components/ToastrMessage/index.js +2 -3
  133. package/v2Components/ToastrMessage/messages.js +1 -5
  134. package/v2Components/TopBar/_topbar.scss +46 -0
  135. package/v2Components/TopBar/messages.js +7 -7
  136. package/v2Containers/App/constants.js +0 -11
  137. package/v2Containers/Assets/Gallery/messages.js +24 -24
  138. package/v2Containers/CallTask/messages.js +6 -6
  139. package/v2Containers/Cap/actions.js +0 -1
  140. package/v2Containers/Cap/index.js +9 -6
  141. package/v2Containers/Cap/messsages.js +15 -19
  142. package/v2Containers/Cap/sagas.js +8 -1
  143. package/v2Containers/ChannelTemplates/messages.js +1 -1
  144. package/v2Containers/CreativesContainer/SlideBoxContent.js +39 -1
  145. package/v2Containers/CreativesContainer/SlideBoxFooter.js +7 -1
  146. package/v2Containers/CreativesContainer/SlideBoxHeader.js +21 -3
  147. package/v2Containers/CreativesContainer/index.js +95 -50
  148. package/v2Containers/CreativesContainer/index.scss +15 -0
  149. package/v2Containers/CreativesContainer/messages.js +12 -16
  150. package/v2Containers/Dashboard/index.js +1 -2
  151. package/v2Containers/Dashboard/messages.js +1 -1
  152. package/v2Containers/Ebill/index.js +1 -1
  153. package/v2Containers/Ebill/messages.js +16 -20
  154. package/v2Containers/Email/index.js +20 -20
  155. package/v2Containers/Email/messages.js +61 -101
  156. package/v2Containers/EmailWrapper/index.js +44 -64
  157. package/v2Containers/EmailWrapper/messages.js +12 -12
  158. package/v2Containers/Line/Create/index.js +3 -3
  159. package/v2Containers/Line/Create/messages.js +41 -53
  160. package/v2Containers/Line/Edit/index.js +10 -10
  161. package/v2Containers/Line/Edit/messages.js +39 -55
  162. package/v2Containers/Login/components/LoginForm/index.js +6 -9
  163. package/v2Containers/Login/components/LoginForm/messages.js +3 -15
  164. package/v2Containers/Login/index.js +1 -1
  165. package/v2Containers/Login/messages.js +3 -7
  166. package/v2Containers/MobilePush/Create/_mobilePushCreate.scss +3 -0
  167. package/v2Containers/MobilePush/Create/index.js +33 -33
  168. package/v2Containers/MobilePush/Create/messages.js +81 -109
  169. package/v2Containers/MobilePush/Edit/_mobilePushCreate.scss +3 -0
  170. package/v2Containers/MobilePush/Edit/index.js +22 -22
  171. package/v2Containers/MobilePush/Edit/messages.js +79 -95
  172. package/v2Containers/MobilePush/initialSchema.js +1 -2
  173. package/v2Containers/MobilepushWrapper/messages.js +5 -5
  174. package/v2Containers/NotFoundPage/messages.js +1 -1
  175. package/v2Containers/Sms/Create/index.js +6 -6
  176. package/v2Containers/Sms/Create/messages.js +21 -41
  177. package/v2Containers/Sms/Edit/index.js +6 -6
  178. package/v2Containers/Sms/Edit/messages.js +20 -36
  179. package/v2Containers/TagList/messages.js +1 -1
  180. package/v2Containers/Templates/_templates.scss +31 -5
  181. package/v2Containers/Templates/index.js +243 -248
  182. package/v2Containers/Templates/messages.js +7 -15
  183. package/v2Containers/Templates/sagas.js +0 -1
  184. package/v2Containers/TemplatesV2/_templatesV2.scss +5 -0
  185. package/v2Containers/TemplatesV2/index.js +4 -1
  186. package/v2Containers/TemplatesV2/messages.js +5 -29
  187. package/v2Containers/TestPage/messages.js +1 -1
  188. package/v2Containers/Testv2/index.js +2 -2
  189. package/v2Containers/Testv2/messages.js +1 -9
  190. package/v2Containers/WeChat/MapTemplates/_mapTemplates.scss +16 -0
  191. package/v2Containers/WeChat/MapTemplates/actions.js +4 -2
  192. package/v2Containers/WeChat/MapTemplates/index.js +800 -872
  193. package/v2Containers/WeChat/MapTemplates/initialSchema.js +184 -0
  194. package/v2Containers/WeChat/MapTemplates/messages.js +19 -43
  195. package/v2Containers/WeChat/MapTemplates/sagas.js +6 -2
  196. package/v2Containers/WeChat/MapTemplates/selectors.js +1 -1
  197. package/v2Containers/WeChat/RichmediaTemplates/Create/_createRichmedia.scss +118 -28
  198. package/v2Containers/WeChat/RichmediaTemplates/Create/actions.js +3 -1
  199. package/v2Containers/WeChat/RichmediaTemplates/Create/index.js +262 -306
  200. package/v2Containers/WeChat/RichmediaTemplates/Create/messages.js +43 -95
  201. package/v2Containers/WeChat/RichmediaTemplates/Create/reducer.js +2 -1
  202. package/v2Containers/WeChat/RichmediaTemplates/Create/richmediaschema.js +113 -246
  203. package/v2Containers/WeChat/RichmediaTemplates/Create/sagas.js +5 -2
  204. package/v2Containers/WeChat/RichmediaTemplates/Create/selectors.js +1 -1
  205. package/v2Containers/WeChat/RichmediaTemplates/Edit/actions.js +2 -2
  206. package/v2Containers/WeChat/RichmediaTemplates/Edit/index.js +11 -10
  207. package/v2Containers/WeChat/RichmediaTemplates/Edit/messages.js +1 -1
  208. package/v2Containers/WeChat/RichmediaTemplates/Edit/reducer.js +1 -0
  209. package/v2Containers/WeChat/RichmediaTemplates/Edit/sagas.js +4 -2
  210. package/v2Containers/WeChat/RichmediaTemplates/Edit/selectors.js +1 -1
  211. package/v2Containers/WeChat/RichmediaTemplates/View/messages.js +1 -9
  212. package/v2Containers/WeChat/Wrapper/_wrapper.scss +0 -0
  213. package/v2Containers/WeChat/Wrapper/constants.js +5 -0
  214. package/v2Containers/WeChat/Wrapper/index.js +194 -0
  215. package/v2Containers/WeChat/Wrapper/messages.js +21 -0
  216. package/v2Containers/WeChat/helper.js +12 -0
  217. package/containers/Cap/messages.js +0 -75
  218. package/v2Containers/Cap/messages.js +0 -75
@@ -12,10 +12,17 @@ import styled from 'styled-components';
12
12
  import {injectIntl, intlShape, FormattedMessage } from 'react-intl';
13
13
  import { createStructuredSelector } from 'reselect';
14
14
  import moment from "moment";
15
- import _ from 'lodash';
15
+ import get from 'lodash/get';
16
+ import isEmpty from 'lodash/isEmpty';
17
+ import isEqual from 'lodash/isEqual';
18
+ import forEach from 'lodash/forEach';
19
+ import findIndex from 'lodash/findIndex';
20
+ import cloneDeep from 'lodash/cloneDeep';
21
+ import find from 'lodash/find';
22
+ import map from 'lodash/map';
16
23
  import { bindActionCreators } from 'redux';
17
- import { Modal} from 'antd';
18
- import {CapMenu, CapDropdown, CapButton, CapInput, CapIcon, CapSelect, CapPopover, CapSpin, CapCustomCard, CapRow, CapSlideBox, CapLink, CapHeading, CapNotification, CapIllustration} from '@capillarytech/cap-ui-library';
24
+ import { Modal, Form} from 'antd';
25
+ import {CapMenu, CapDropdown, CapButton, CapInput, CapIcon, CapRadioCard, CapPopover, CapSpin, CapCustomCard, CapRow, CapSlideBox, CapLink, CapHeading, CapNotification, CapIllustration, CapHeader, CapLabel, CapRadio} from '@capillarytech/cap-ui-library';
19
26
  import { makeSelectTemplates, makeSelectTemplatesResponse } from './selectors';
20
27
  import { makeSelectCreate as makeSelectCreateSms} from '../Sms/Create/selectors';
21
28
  import { makeSelectCreate as makeSelectCreateMobilePush } from '../MobilePush/Create/selectors';
@@ -59,6 +66,13 @@ const InlineDiv = styled.div`
59
66
  }
60
67
  }
61
68
  `;
69
+ const ACCOUNT_SELECTION_MODE = "accountSelectionMode";
70
+ const TEMPLATES_MODE = "templatesMode";
71
+ const WECHAT_FILTERS = {
72
+ ALL: 'all',
73
+ RICHMEDIA: 'richmedia',
74
+ MAPTEMPLATES: 'maptemplate',
75
+ };
62
76
  export class Templates extends React.Component { // eslint-disable-line react/prefer-stateless-function
63
77
  constructor(props) {
64
78
  super(props);
@@ -83,6 +97,8 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
83
97
  defaultAccount: true,
84
98
  modeType: null,
85
99
  routeParams: null,
100
+ activeMode: TEMPLATES_MODE,
101
+ wechatFilter: WECHAT_FILTERS.ALL,
86
102
  };
87
103
 
88
104
  this.handleOnHoverItem = this.handleOnHoverItem.bind(this);
@@ -109,6 +125,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
109
125
  componentWillMount() {
110
126
  if (this.state.channel === '') {
111
127
  let channel = '';
128
+ let activeMode = TEMPLATES_MODE;
112
129
 
113
130
  switch (this.props.route.name.toUpperCase()) {
114
131
  case SMS:
@@ -116,10 +133,12 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
116
133
  break;
117
134
  case MOBILE_PUSH:
118
135
  channel = "MobilePush";
136
+ activeMode = ACCOUNT_SELECTION_MODE;
119
137
  this.props.actions.getWeCrmAccounts(channel);
120
138
  break;
121
139
  case WECHAT:
122
140
  channel = 'wechat';
141
+ activeMode = ACCOUNT_SELECTION_MODE;
123
142
  this.props.actions.getWeCrmAccounts();
124
143
  break;
125
144
  case EMAIL:
@@ -134,8 +153,8 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
134
153
  default:
135
154
  channel = '';
136
155
  }
137
- this.setState({ channel });
138
- if (_.isEmpty(this.props.Templates.userList)) {
156
+ this.setState({ channel, activeMode });
157
+ if (isEmpty(this.props.Templates.userList)) {
139
158
  this.props.actions.getUserList();
140
159
  }
141
160
  }
@@ -145,21 +164,21 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
145
164
  if (this.props.location.query.type === 'embedded' && this.isEnabledInLibraryModule("setLocale")) {
146
165
  this.setLocale();
147
166
  }
148
- if (this.state.channel.toLowerCase() === 'line' || 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))) {
167
+ if (this.state.channel.toLowerCase() === 'line' || 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))) {
149
168
  const queryParams = {
150
169
  // name: this.state.searchText,
151
170
  // sortBy: this.state.sortBy,
152
171
  };
153
- if (this.state.channel.toLowerCase() === 'wechat' && !_.isEmpty(this.props.Templates.selectedWeChatAccount)) {
172
+ if (this.state.channel.toLowerCase() === 'wechat' && get(this.props, 'Templates.selectedWeChatAccount.configs', false)) {
154
173
  queryParams.wecrmId = this.props.Templates.selectedWeChatAccount.configs.wecrm_app_id;
155
174
  queryParams.wecrmToken = this.props.Templates.selectedWeChatAccount.configs.wecrm_token;
156
175
  queryParams.originalId = this.props.Templates.selectedWeChatAccount.sourceAccountIdentifier;
157
176
  }
158
- if (this.state.channel.toLowerCase() === "mobilepush" && !_.isEmpty(this.props.Templates.selectedWeChatAccount)) {
177
+ if (this.state.channel.toLowerCase() === "mobilepush" && !isEmpty(this.props.Templates.selectedWeChatAccount)) {
159
178
  const account = this.props.Templates.selectedWeChatAccount;
160
179
  queryParams.accountId = account.id;
161
- const isAndroidSupported = _.get(account, "configs.android") === '1';
162
- const isIosSupported = _.get(account, "configs.ios") === '1';
180
+ const isAndroidSupported = get(account, "configs.android") === '1';
181
+ const isIosSupported = get(account, "configs.ios") === '1';
163
182
  if (!(isAndroidSupported || isIosSupported)) {
164
183
  this.props.actions.resetAccount();
165
184
  return;
@@ -182,10 +201,10 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
182
201
  name: this.state.searchText,
183
202
  sortBy: this.state.sortBy,
184
203
  };
185
- if (!_.isEmpty(this.props.TemplatesList) && !this.props.Templates.getAllTemplatesInProgress && this.props.TemplatesList[0] && this.props.TemplatesList[0].totalCount && this.state.templatesCount === 0) {
204
+ if (!isEmpty(this.props.TemplatesList) && !this.props.Templates.getAllTemplatesInProgress && this.props.TemplatesList[0] && this.props.TemplatesList[0].totalCount && this.state.templatesCount === 0) {
186
205
  this.setState({templatesCount: this.props.TemplatesList[0].totalCount});
187
206
  }
188
- if (!_.isEqual(nextProps.route.name, this.props.route.name)) {
207
+ if (!isEqual(nextProps.route.name, this.props.route.name)) {
189
208
  let channel = '';
190
209
  this.props.actions.resetTemplate();
191
210
  this.props.actions.resetAccount();
@@ -208,13 +227,13 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
208
227
  channel = 'Line';
209
228
  }
210
229
  this.setState({ channel }, () => {
211
- if (this.state.channel.toLowerCase() === 'line' || this.state.channel.toLowerCase() === 'sms' || this.state.channel.toLowerCase() === 'email' || this.state.channel.toLowerCase() === 'ebill' || (this.state.channel.toLowerCase() === 'wechat' && !_.isEmpty(nextProps.Templates.selectedWeChatAccount))) {
212
- if (this.state.channel.toLowerCase() === 'wechat' && !_.isEmpty(nextProps.Templates.selectedWeChatAccount)) {
230
+ if (this.state.channel.toLowerCase() === 'line' || this.state.channel.toLowerCase() === 'sms' || this.state.channel.toLowerCase() === 'email' || this.state.channel.toLowerCase() === 'ebill' || (this.state.channel.toLowerCase() === 'wechat' && !isEmpty(nextProps.Templates.selectedWeChatAccount))) {
231
+ if (this.state.channel.toLowerCase() === 'wechat' && !isEmpty(nextProps.Templates.selectedWeChatAccount)) {
213
232
  params.wecrmId = nextProps.Templates.selectedWeChatAccount.configs.wecrm_app_id;
214
233
  params.wecrmToken = nextProps.Templates.selectedWeChatAccount.configs.wecrm_token;
215
234
  params.originalId = nextProps.Templates.selectedWeChatAccount.sourceAccountIdentifier;
216
235
  }
217
- if (this.state.channel.toLowerCase() === "mobilepush" && !_.isEmpty(nextProps.Templates.selectedWeChatAccount)) {
236
+ if (this.state.channel.toLowerCase() === "mobilepush" && !isEmpty(nextProps.Templates.selectedWeChatAccount)) {
218
237
  params.accountId = nextProps.Templates.selectedWeChatAccount.id;
219
238
  }
220
239
  this.getAllTemplates({params}, true);
@@ -229,13 +248,13 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
229
248
  if (this.state.channel.toLowerCase() === "mobilepush" && nextProps.Templates.selectedWeChatAccount) {
230
249
  params.accountId = nextProps.Templates.selectedWeChatAccount.id;
231
250
  }
232
- if ((this.state.channel.toLowerCase() === 'wechat' || this.state.channel.toLowerCase() === 'mobilepush') && _.isEmpty(nextProps.Templates.selectedWeChatAccount) && (this.props.location.query.type === 'embedded') && !this.isEnabledInLibraryModule("showAccountSelection")) {
251
+ if ((this.state.channel.toLowerCase() === 'wechat' || this.state.channel.toLowerCase() === 'mobilepush') && isEmpty(nextProps.Templates.selectedWeChatAccount) && (this.props.location.query.type === 'embedded') && !this.isEnabledInLibraryModule("showAccountSelection")) {
233
252
  let selectedAccount = '';
234
- if (_.isEmpty(nextProps.Templates.weCrmAccounts)) {
253
+ if (isEmpty(nextProps.Templates.weCrmAccounts)) {
235
254
  return;
236
255
  }
237
256
  if (this.state.channel.toLowerCase() === 'wechat') {
238
- _.forEach(nextProps.Templates.weCrmAccounts, (account) => {
257
+ forEach(nextProps.Templates.weCrmAccounts, (account) => {
239
258
  if (account.configs && account.configs.is_wecrm_enabled) {
240
259
  if (nextProps.location.query.source_account_id && account.sourceAccountIdentifier === nextProps.location.query.source_account_id) {
241
260
  selectedAccount = account;
@@ -250,7 +269,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
250
269
  this.getAllTemplates({params});
251
270
  });
252
271
  } else if (this.state.channel.toLowerCase() === 'mobilepush' && (nextProps.location.query.account_id || nextProps.location.query.source_account_id)) {
253
- _.forEach(nextProps.Templates.weCrmAccounts, (account) => {
272
+ forEach(nextProps.Templates.weCrmAccounts, (account) => {
254
273
  if ((nextProps.location.query.account_id && account.id === Number(nextProps.location.query.account_id)) || (nextProps.location.query.source_account_id && account.sourceAccountIdentifier && account.sourceAccountIdentifier === nextProps.location.query.source_account_id)) {
255
274
  selectedAccount = account;
256
275
  }
@@ -285,7 +304,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
285
304
  this.props.lineActions.clearCreateResponse();
286
305
  }
287
306
 
288
- if (nextProps.Create && this.props.Create && nextProps.Create.createTemplateError && !_.isEqual(nextProps.Create.createTemplateError, this.props.Create.createTemplateError)) {
307
+ if (nextProps.Create && this.props.Create && nextProps.Create.createTemplateError && !isEqual(nextProps.Create.createTemplateError, this.props.Create.createTemplateError)) {
289
308
  const message = this.props.intl.formatMessage(messages.somethingWentWrong);
290
309
  CapNotification.error({key: 'somethingWrong', message});
291
310
  if (this.state.channel.toLowerCase() === "sms") {
@@ -302,14 +321,14 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
302
321
  if (nextProps.Edit && nextProps.Edit.editResponse && nextProps.Edit.editResponse.templateId && nextProps.Edit.editResponse.templateId !== '') {
303
322
  this.props.smsEditActions.clearEditResponse();
304
323
  }
305
- if (!nextProps.Templates.deleteTemplateInProgress && !_.isEqual(nextProps.Templates.deleteTemplateInProgress, this.props.Templates.deleteTemplateInProgress) &&
324
+ if (!nextProps.Templates.deleteTemplateInProgress && !isEqual(nextProps.Templates.deleteTemplateInProgress, this.props.Templates.deleteTemplateInProgress) &&
306
325
  nextProps.Templates.deleteResponse) {
307
326
  const message = `${this.state.channel.toUpperCase()} ${this.props.intl.formatMessage(messages['Template deleted successfully'])}`;
308
327
  CapNotification.success({key: 'deleteSucess', message});
309
328
  this.getAllTemplates({params, resetPage: true});
310
329
  }
311
330
 
312
- if (!nextProps.Templates.sendingFile && !_.isEqual(this.props.Templates.sendingFile, nextProps.Templates.sendingFile) && !nextProps.Templates.errorSendingFile) {
331
+ if (!nextProps.Templates.sendingFile && !isEqual(this.props.Templates.sendingFile, nextProps.Templates.sendingFile) && !nextProps.Templates.errorSendingFile) {
313
332
  const module = this.props.location.query.module ? this.props.location.query.module : 'default';
314
333
  const isLanguageSupport = (this.props.location.query.isLanguageSupport) ? this.props.location.query.isLanguageSupport : true;
315
334
  const isEdmSupport = (this.props.location.query.isEdmSupport !== "false") || false;
@@ -324,7 +343,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
324
343
  }});
325
344
  }
326
345
 
327
- if (!nextProps.Templates.sendingFile && !_.isEqual(this.props.Templates.sendingFile, nextProps.Templates.sendingFile) && nextProps.Templates.errorSendingFile) {
346
+ if (!nextProps.Templates.sendingFile && !isEqual(this.props.Templates.sendingFile, nextProps.Templates.sendingFile) && nextProps.Templates.errorSendingFile) {
328
347
  let errorMessage = this.props.intl.formatMessage(messages.zipUploadFailed);
329
348
  if (nextProps.Templates.errorMessage && nextProps.Templates.errorMessage !== "") {
330
349
  errorMessage = nextProps.Templates.errorMessage;
@@ -332,7 +351,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
332
351
  CapNotification.error({key: 'uploadError', message: errorMessage});
333
352
  }
334
353
 
335
- if (!_.isEmpty(nextProps.Templates.templateDetails) && !_.isEqual(nextProps.Templates.templateDetails, this.props.Templates.templateDetails)) {
354
+ if (!isEmpty(nextProps.Templates.templateDetails) && !isEqual(nextProps.Templates.templateDetails, this.props.Templates.templateDetails)) {
336
355
  this.setState({previewTemplate: nextProps.Templates.templateDetails});
337
356
  }
338
357
 
@@ -350,7 +369,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
350
369
  nextProps.actions.setWeChatAccount(nextProps.Templates.weCrmAccounts[0]);
351
370
  paramsDefault.accountId = nextProps.Templates.weCrmAccounts[0].id;
352
371
  }
353
- this.setState({defaultAccount: false});
372
+ this.setState({defaultAccount: false, activeMode: TEMPLATES_MODE, selectedAccount: nextProps.Templates.weCrmAccounts[0].name });
354
373
  this.getAllTemplates({params: paramsDefault}, true);
355
374
  }
356
375
  }
@@ -359,26 +378,29 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
359
378
  window.removeEventListener("message", this.handleFrameTasks);
360
379
  this.props.actions.resetTemplateStoreData();
361
380
  this.props.globalActions.clearMetaEntities();
381
+ // this.props.actions.resetAccount();
362
382
  // this.setState({defaultAccount: false});
363
383
  }
364
384
 
365
- onAccountSelect(value) {
385
+ onAccountSelect(e) {
386
+ const value = e.target.value;
387
+ console.log("onAccountSelect", e, value);
366
388
  this.setState({selectedAccount: value}, () => {
367
389
  const params = {
368
390
  name: this.state.searchText,
369
391
  sortBy: this.state.sortBy,
370
392
  };
371
393
  if (this.state.channel.toLowerCase() === 'wechat') {
372
- params.wecrmId = this.props.Templates.weCrmAccounts[_.findIndex(this.props.Templates.weCrmAccounts, { name: value})].configs.wecrm_app_id;
373
- params.wecrmToken = this.props.Templates.weCrmAccounts[_.findIndex(this.props.Templates.weCrmAccounts, { name: value})].configs.wecrm_token;
374
- this.props.actions.setWeChatAccount(this.props.Templates.weCrmAccounts[_.findIndex(this.props.Templates.weCrmAccounts, { name: value})]);
375
- params.originalId = this.props.Templates.weCrmAccounts[_.findIndex(this.props.Templates.weCrmAccounts, { name: value})].sourceAccountIdentifier;
394
+ params.wecrmId = this.props.Templates.weCrmAccounts[findIndex(this.props.Templates.weCrmAccounts, { name: value})].configs.wecrm_app_id;
395
+ params.wecrmToken = this.props.Templates.weCrmAccounts[findIndex(this.props.Templates.weCrmAccounts, { name: value})].configs.wecrm_token;
396
+ this.props.actions.setWeChatAccount(this.props.Templates.weCrmAccounts[findIndex(this.props.Templates.weCrmAccounts, { name: value})]);
397
+ params.originalId = this.props.Templates.weCrmAccounts[findIndex(this.props.Templates.weCrmAccounts, { name: value})].sourceAccountIdentifier;
376
398
  } else if (this.state.channel.toLowerCase() === 'mobilepush') {
377
- this.props.actions.setWeChatAccount(this.props.Templates.weCrmAccounts[_.findIndex(this.props.Templates.weCrmAccounts, { name: value})]);
378
- const account = this.props.Templates.weCrmAccounts[_.findIndex(this.props.Templates.weCrmAccounts, { name: value})];
399
+ this.props.actions.setWeChatAccount(this.props.Templates.weCrmAccounts[findIndex(this.props.Templates.weCrmAccounts, { name: value})]);
400
+ const account = this.props.Templates.weCrmAccounts[findIndex(this.props.Templates.weCrmAccounts, { name: value})];
379
401
  params.accountId = account.id;
380
- const isAndroidSupported = _.get(account, "configs.android") === '1';
381
- const isIosSupported = _.get(account, "configs.ios") === '1';
402
+ const isAndroidSupported = get(account, "configs.android") === '1';
403
+ const isIosSupported = get(account, "configs.ios") === '1';
382
404
  if (!(isAndroidSupported || isIosSupported)) {
383
405
  this.setState({selectedAccountError: true});
384
406
  this.props.actions.resetTemplate();
@@ -387,7 +409,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
387
409
  this.setState({selectedAccountError: false});
388
410
  }
389
411
  }
390
-
412
+ this.setState({activeMode: TEMPLATES_MODE});
391
413
  console.log("getAllTemplates params: ", params);
392
414
  this.getAllTemplates({params, resetPage: true});
393
415
  });
@@ -411,12 +433,20 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
411
433
  getCreativesParams = () => {
412
434
  const routeParams = this.state.routeParams;
413
435
  let creativesParams = {mode: ''};
414
- if (!_.isEmpty(routeParams)) {
415
- if (routeParams.pathname.indexOf('create') > -1) {
436
+ if (!isEmpty(routeParams)) {
437
+ const { pathname } = routeParams;
438
+ if (pathname.includes('create')) {
416
439
  creativesParams.mode = 'create';
417
- } else if (routeParams.pathname.indexOf('edit') > -1) {
440
+ } else if (pathname.includes('edit')) {
418
441
  creativesParams.mode = 'edit';
419
- creativesParams._id = routeParams.pathname.split('/')[3];
442
+ if (pathname.includes('richmedia')) {
443
+ creativesParams._id = pathname.split('/')[4];
444
+ creativesParams.definition = {
445
+ msgcontent: "RICH_MEDIA_WECHAT",
446
+ };
447
+ } else {
448
+ creativesParams._id = pathname.split('/')[3];
449
+ }
420
450
  creativesParams.type = this.state.channel.toUpperCase();
421
451
  }
422
452
  }
@@ -452,6 +482,11 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
452
482
  queryParams.sortBy = this.state.sortBy;
453
483
  queryParams.page = this.state.page;
454
484
  queryParams.perPage = this.state.perPageLimit;
485
+ if (this.state.channel.toLowerCase() === 'wechat' && !isEmpty(this.props.Templates.selectedWeChatAccount)) {
486
+ queryParams.wecrmId = this.props.Templates.selectedWeChatAccount.configs.wecrm_app_id;
487
+ queryParams.wecrmToken = this.props.Templates.selectedWeChatAccount.configs.wecrm_token;
488
+ queryParams.originalId = this.props.Templates.selectedWeChatAccount.sourceAccountIdentifier;
489
+ }
455
490
  const channel = this.state.channel;
456
491
  this.props.actions.getAllTemplates(channel, queryParams);
457
492
  } else if ((resetPage || (page === 1 && this.state.templatesCount === 0) || page <= (this.state.templatesCount / this.state.perPageLimit))) {
@@ -463,17 +498,17 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
463
498
  page = 1;
464
499
  templatesCount = 0;
465
500
  }
466
- if (!params || _.isEmpty(params)) {
501
+ if (!params || isEmpty(params)) {
467
502
  queryParams = {
468
503
  name: this.state.searchText,
469
504
  sortBy: this.state.sortBy,
470
505
  };
471
- if (this.state.channel.toLowerCase() === 'wechat' && !_.isEmpty(this.props.Templates.selectedWeChatAccount)) {
506
+ if (this.state.channel.toLowerCase() === 'wechat' && !isEmpty(this.props.Templates.selectedWeChatAccount)) {
472
507
  queryParams.wecrmId = this.props.Templates.selectedWeChatAccount.configs.wecrm_app_id;
473
508
  queryParams.wecrmToken = this.props.Templates.selectedWeChatAccount.configs.wecrm_token;
474
509
  queryParams.originalId = this.props.Templates.selectedWeChatAccount.sourceAccountIdentifier;
475
510
  }
476
- if (this.state.channel.toLowerCase() === "mobilepush" && !_.isEmpty(this.props.Templates.selectedWeChatAccount)) {
511
+ if (this.state.channel.toLowerCase() === "mobilepush" && !isEmpty(this.props.Templates.selectedWeChatAccount)) {
477
512
  queryParams.accountId = this.props.Templates.selectedWeChatAccount.id;
478
513
  if (this.state.mode) {
479
514
  queryParams.mode = this.state.mode.toLowerCase();
@@ -488,9 +523,28 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
488
523
  });
489
524
  }
490
525
  };
526
+ filterWechatTemplates = (templates) => {
527
+ const { wechatFilter } = this.state;
528
+ switch(wechatFilter) {
529
+ case WECHAT_FILTERS.RICHMEDIA:
530
+ return templates.filter(function (template) {
531
+ return template.definition && template.definition.msgcontent.toUpperCase() === "RICH_MEDIA_WECHAT";
532
+ });
533
+ case WECHAT_FILTERS.MAPTEMPLATES:
534
+ return templates.filter(function (template) {
535
+ return !template.definition;
536
+ });
537
+ default:
538
+ return templates;
539
+ };
540
+ }
491
541
  getTemplateDataForGrid = ({templates, handlers, filterContent, channel, isLoading, loadingTip}) => {
492
542
  const currentChannel = channel.toUpperCase();
493
- const cardDataList = templates && templates.length ? _.map(templates, (template) => {
543
+ let filteredTemplates = templates;
544
+ if (currentChannel === WECHAT) {
545
+ filteredTemplates = this.filterWechatTemplates(templates);
546
+ }
547
+ const cardDataList = filteredTemplates && filteredTemplates.length ? map(filteredTemplates, (template) => {
494
548
  const templateData =
495
549
  {
496
550
  key: `${currentChannel}-card-${template.name}`,
@@ -502,19 +556,19 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
502
556
  onClick={() => { if (this.props.isFullMode) { handlers.handlePreviewClick(template); } else { this.props.handlePeviewTemplate(template); } }}
503
557
  />,
504
558
  ],
505
- hoverOption: <CapButton onClick={(e) => handlers.handleEditClick(e, template._id)}>{this.props.intl.formatMessage(this.props.isFullMode ? messages.creativesTemplatesEdit : messages.selectButton)}</CapButton>,
559
+ hoverOption: <CapButton onClick={(e) => handlers.handleEditClick(e, template)}>{this.props.intl.formatMessage(this.props.isFullMode ? messages.creativesTemplatesEdit : messages.selectButton)}</CapButton>,
506
560
  };
507
561
  if (this.props.isFullMode) {
508
562
  templateData.extra.push(<CapDropdown
509
563
  overlay={
510
564
  <CapMenu>
511
- <CapMenu.Item onClick={() => this.duplicateTemplate(template)}>
565
+ {this.state.channel.toUpperCase() !== WECHAT && <CapMenu.Item onClick={() => this.duplicateTemplate(template)}>
512
566
  <FormattedMessage {...messages.duplicateButton} />
513
- </CapMenu.Item>
567
+ </CapMenu.Item>}
514
568
  <CapMenu.Item
515
569
  onClick={() => this.deleteTemplate(template)}
516
570
  >
517
- <FormattedMessage {...messages.deleteButton} />
571
+ {this.state.channel.toUpperCase() === WECHAT && !template.definition ? <FormattedMessage {...messages.unMapButton} /> : <FormattedMessage {...messages.deleteButton} />}
518
572
  </CapMenu.Item>
519
573
  </CapMenu>
520
574
  }
@@ -522,40 +576,51 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
522
576
  <CapIcon type="more" />
523
577
  </CapDropdown>);
524
578
  }
525
- if (currentChannel === "SMS") {
526
- templateData.content = template.versions.base['sms-editor'];
527
- } else if (currentChannel === "EMAIL") {
528
- const url = template.versions.base.preview_http_url;
529
- if (url) {
530
- templateData.url = url;
531
- } else {
532
- templateData.content = template.versions.base.subject;
579
+ switch (currentChannel) {
580
+ case SMS:
581
+ templateData.content = template.versions.base['sms-editor'];
582
+ break;
583
+ case EMAIL: {
584
+ const url = template.versions.base.preview_http_url;
585
+ if (url) {
586
+ templateData.url = url;
587
+ } else {
588
+ templateData.content = template.versions.base.subject;
589
+ }
590
+ break;
533
591
  }
534
- } else if (currentChannel === "MOBILEPUSH" && template.type === "MOBILEPUSH") {
535
- templateData.content = template;
592
+ case MOBILE_PUSH:
593
+ templateData.content = template;
594
+ break;
595
+ case WECHAT:
596
+ templateData.content = this.prepareWeChatPreviewData(template);
597
+ break;
598
+ default:
599
+ templateData.content = "";
536
600
  }
537
601
  return templateData;
538
602
  }) : [];
539
- const accountId = _.get(this.props, 'Templates.selectedWeChatAccount.uuid');
540
- const accounts = _.get(this.props, 'Templates.weCrmAccounts');
603
+ const accountId = get(this.props, 'Templates.selectedWeChatAccount.uuid');
604
+ const accounts = get(this.props, 'Templates.weCrmAccounts');
541
605
  return (<div>
606
+ { [WECHAT, MOBILE_PUSH].includes(currentChannel) && this.showAccountName() }
542
607
  {filterContent}
543
608
  <CapSpin spinning={isLoading} tip={loadingTip} style={{width: '100%'}}>
544
609
  {!isLoading && <div>
545
- {!_.isEmpty(templates) || !_.isEmpty(this.state.searchText) || !_.isEmpty(this.props.Templates.templateError) ? (
546
- <div className={!_.isEmpty(this.state.searchText) && _.isEmpty(cardDataList) ? '' : "pagination-container"}>
547
- <CapCustomCardList key={`${currentChannel}-card-list`} cardList={cardDataList} type={currentChannel} />
610
+ {!isEmpty(filteredTemplates) || !isEmpty(this.state.searchText) || !isEmpty(this.props.Templates.templateError) ? (
611
+ <div className={!isEmpty(this.state.searchText) && isEmpty(cardDataList) ? '' : "pagination-container"}>
612
+ <CapCustomCardList key={`${currentChannel}-card-list`} cardList={cardDataList} type={currentChannel} style={{marginLeft: '16px'}}/>
548
613
  </div>)
549
614
  : ['sms', "email"].includes(this.state.channel.toLowerCase()) && <CapIllustration {...this.getChannelTypeIllustrationInfo(currentChannel)} />
550
615
  }
551
616
 
552
- {(this.state.selectedAccount === '' && _.isEmpty(this.props.Templates.selectedWeChatAccount)) && (this.state.channel.toLowerCase() === 'wechat' || this.state.channel.toLowerCase() === "mobilepush") &&
617
+ {(this.state.selectedAccount === '' && isEmpty(this.props.Templates.selectedWeChatAccount)) && (this.state.channel.toLowerCase() === 'wechat' || this.state.channel.toLowerCase() === "mobilepush") &&
553
618
  <div style={{ height: '65vh', textAlign: 'center', lineHeight: '65vh'}}>
554
619
  <CapHeading type="h6">{accounts ? this.props.intl.formatMessage(messages.noAccountMessage) : this.props.intl.formatMessage(messages.noAccountsPresent)}</CapHeading>
555
620
  </div>
556
621
  }
557
622
 
558
- { !_.isEmpty(this.props.Templates.selectedWeChatAccount) && this.state.channel.toLowerCase() === "mobilepush" && this.state.selectedAccountError ?
623
+ { !isEmpty(this.props.Templates.selectedWeChatAccount) && this.state.channel.toLowerCase() === "mobilepush" && this.state.selectedAccountError ?
559
624
  <div style={{ height: '65vh', textAlign: 'center', lineHeight: '65vh'}}>
560
625
  <CapHeading type="h6" >
561
626
  {this.props.intl.formatMessage(messages.accountConfigError)}
@@ -565,8 +630,8 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
565
630
  </CapHeading>
566
631
  </div> : (
567
632
  ["mobilepush"].includes(this.state.channel.toLowerCase()) &&
568
- _.isEmpty(templates) &&
569
- _.isEmpty(this.state.searchText) &&
633
+ isEmpty(filteredTemplates) &&
634
+ isEmpty(this.state.searchText) &&
570
635
  <div style={this.isFullMode() ? { height: "calc(100vh - 325px)", overflow: 'auto'} : {}}>
571
636
  <CapIllustration {...this.getChannelTypeIllustrationInfo(currentChannel)} />
572
637
  </div>
@@ -689,8 +754,9 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
689
754
  };
690
755
 
691
756
  prepareWeChatPreviewData(template) {
692
- if (template && template.versions && template.versions.base && !_.isEmpty(template.versions.base)) {
757
+ if (template && template.versions && template.versions.base && !isEmpty(template.versions.base)) {
693
758
  if (template.definition && template.definition.msgcontent && template.definition.msgcontent === "RICH_MEDIA_WECHAT") {
759
+ console.log("prepareWeChatPreviewData", template, JSON.stringify(template), template.versions.base.mediaList, JSON.stringify(template.versions.base.mediaList));
694
760
  return template.versions.base.mediaList;
695
761
  }
696
762
  return this.prepareWeChatMappedPreviewData(template.versions.base.content, template.versions.base.Tag, template.versions.base.data);
@@ -699,8 +765,8 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
699
765
  }
700
766
 
701
767
  prepareWeChatMappedPreviewData(content, templateTags, tagData) {
702
- let formattedContent = _.cloneDeep(content);
703
- _.forEach(templateTags, (tag) => {
768
+ let formattedContent = cloneDeep(content);
769
+ forEach(templateTags, (tag) => {
704
770
  if (tagData[tag].value !== undefined) {
705
771
  formattedContent = formattedContent.replace(`{{${tag}.DATA}}`, tagData[tag].value);
706
772
  }
@@ -737,7 +803,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
737
803
  </div>}
738
804
  {(data.expandableDetails && data.expandableDetails.ctas && ((data.expandableDetails.ctas[0] && data.expandableDetails.ctas[0].actionText) || (data.expandableDetails.ctas[1] && data.expandableDetails.ctas[1].actionText))) ?
739
805
  <div className="actions">
740
- {_.map(data.expandableDetails.ctas, (action) => !!action.actionText &&
806
+ {map(data.expandableDetails.ctas, (action) => !!action.actionText &&
741
807
  <span className="action">{action.actionText && action.actionText.toUpperCase()}</span>)}
742
808
  </div>
743
809
  :
@@ -889,7 +955,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
889
955
  });
890
956
  } else if (ev && ev.key && ev.key.toLowerCase() === "richmedia_template") {
891
957
  type = this.props.location.query.type;
892
- if (this.props.Templates && this.props.Templates.selectedWeChatAccount && this.props.Templates.selectedWeChatAccount.configs && (_.isEmpty(this.props.Templates.selectedWeChatAccount.configs.wechat_app_id) || _.isEmpty(this.props.Templates.selectedWeChatAccount.configs.wechat_app_secret))) {
958
+ if (this.props.Templates && this.props.Templates.selectedWeChatAccount && this.props.Templates.selectedWeChatAccount.configs && (isEmpty(this.props.Templates.selectedWeChatAccount.configs.wechat_app_id) || isEmpty(this.props.Templates.selectedWeChatAccount.configs.wechat_app_secret))) {
893
959
  const errorMessage = this.props.intl.formatMessage(messages.wechatAccountNotConfigured);
894
960
  CapNotification.error({key: 'wechatError', message: errorMessage});
895
961
  } else {
@@ -980,7 +1046,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
980
1046
  }
981
1047
 
982
1048
  duplicateTemplate(template) {
983
- const duplicateObj = _.cloneDeep(template);
1049
+ const duplicateObj = cloneDeep(template);
984
1050
  duplicateObj.name = `Copy of ${template.name} ${moment().format('MM-DD-YYYY hh:mma')}`;
985
1051
  delete duplicateObj._id;
986
1052
  const params = {
@@ -1028,7 +1094,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1028
1094
 
1029
1095
  handleEdmDefaultTemplateSelection = (isSelected, id) => {
1030
1096
  if (isSelected) {
1031
- const data = _.find(this.props.Templates.cmsTemplates, {_id: id});
1097
+ const data = find(this.props.Templates.cmsTemplates, {_id: id});
1032
1098
  const type = this.props.location.query.type;
1033
1099
  const module = this.props.location.query.module ? this.props.location.query.module : 'default';
1034
1100
  const isLanguageSupport = (this.props.location.query.isLanguageSupport) ? this.props.location.query.isLanguageSupport : true;
@@ -1052,10 +1118,11 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1052
1118
  }
1053
1119
  };
1054
1120
 
1055
- handleEditClick(e, id, modeType, path) {
1121
+ handleEditClick(e, template, modeType, path) {
1056
1122
  if (modeType && modeType !== undefined) {
1057
1123
  this.setState({modeType});
1058
1124
  }
1125
+ const { _id: id } = template;
1059
1126
  const type = this.props.location.query.type;
1060
1127
  const module = this.props.location.query.module;
1061
1128
  const isLanguageSupport = (this.props.location.query.isLanguageSupport) ? this.props.location.query.isLanguageSupport : false;
@@ -1085,6 +1152,13 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1085
1152
  if (this.state.channel.toLowerCase() === 'line') {
1086
1153
  pathName = `/line/edit/${modeType}/${id}`;
1087
1154
  }
1155
+ if (this.state.channel.toUpperCase() === WECHAT) {
1156
+ if (get(template, 'definition.msgcontent', '') === "RICH_MEDIA_WECHAT") {
1157
+ pathName = `/wechat/richmedia/edit/${id}`;
1158
+ } else {
1159
+ pathName = `/wechat/edit/${id}`;
1160
+ }
1161
+ }
1088
1162
  if (this.isEnabledInLibraryModule("callSelectFromProps")) {
1089
1163
  this.props.onSelectTemplate(id);
1090
1164
  } else {
@@ -1100,7 +1174,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1100
1174
 
1101
1175
  handlePreviewClick(template, modeType) {
1102
1176
  this.togglePreview();
1103
- const templateInfo = _.cloneDeep(template);
1177
+ const templateInfo = cloneDeep(template);
1104
1178
  if (this.state.channel.toLowerCase() === 'line') {
1105
1179
  templateInfo.modeType = modeType;
1106
1180
  }
@@ -1194,7 +1268,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1194
1268
  temp.id = template._id;
1195
1269
  if (this.state.channel === 'wechat') {
1196
1270
  let path = '';
1197
- if (template && template.versions && template.versions.base && !_.isEmpty(template.versions.base)) {
1271
+ if (template && template.versions && template.versions.base && !isEmpty(template.versions.base)) {
1198
1272
  if (template.definition && template.definition.msgcontent && template.definition.msgcontent === "RICH_MEDIA_WECHAT") {
1199
1273
  path = `/wechat/richmedia/edit/${template._id}`;
1200
1274
  content = <WechatRichmediaTemplatePreview type={this.props.location && this.props.location.query.type ? this.props.location.query.type : ''} content={template.versions.base.mediaList}/>;
@@ -1208,7 +1282,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1208
1282
  <div className={`sms-text ${this.state.hoveredItem === template._id ? 'sms-text-blurred' : ''}`}>
1209
1283
  {content || ''}
1210
1284
  </div>
1211
- {template._id === this.state.hoveredItem ? <CapButton onClick={(e) => this.handleEditClick(e, template._id, null, path)} className="edit-button" type="secondary">{type === 'embedded' ? this.props.intl.formatMessage(messages.selectButton) : this.props.intl.formatMessage(messages.editButton)}</CapButton> : ''}
1285
+ {template._id === this.state.hoveredItem ? <CapButton onClick={(e) => this.handleEditClick(e, template, null, path)} className="edit-button" type="secondary">{type === 'embedded' ? this.props.intl.formatMessage(messages.selectButton) : this.props.intl.formatMessage(messages.editButton)}</CapButton> : ''}
1212
1286
  {template._id === this.state.hoveredItem ? <CapButton onClick={() => this.handlePreviewClick(template)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
1213
1287
  </div>
1214
1288
  );
@@ -1226,7 +1300,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1226
1300
  <div className={`sms-text ${this.state.hoveredItem === template._id ? 'sms-text-blurred' : ''}`}>
1227
1301
  {content}
1228
1302
  </div>
1229
- {!layoutSelection && 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> : ''}
1303
+ {!layoutSelection && template._id === this.state.hoveredItem ? <CapButton onClick={(e) => this.handleEditClick(e, template)} className="edit-button" type="secondary">{type === 'embedded' ? this.props.intl.formatMessage(messages.selectButton) : this.props.intl.formatMessage(messages.editButton)}</CapButton> : ''}
1230
1304
  {layoutSelection && template._id === this.state.hoveredItem ? <CapButton onClick={() => this.handleEdmDefaultTemplateSelection(true, template._id)} className="select-button" type="secondary">{type === 'embedded' ? this.props.intl.formatMessage(messages.selectDefaultButton) : this.props.intl.formatMessage(messages.selectDefaultButton)}</CapButton> : ''}
1231
1305
  {!layoutSelection && template._id === this.state.hoveredItem ? <CapButton onClick={() => this.handlePreviewClick(template)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
1232
1306
  </div>);
@@ -1237,7 +1311,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1237
1311
  <div className={`mobilepush-message ${this.state.hoveredItem === template._id ? 'sms-text-blurred' : ''}`}>
1238
1312
  {content || ''}
1239
1313
  </div>
1240
- {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> : ''}
1314
+ {template._id === this.state.hoveredItem ? <CapButton onClick={(e) => this.handleEditClick(e, template)} className="edit-button" type="secondary">{type === 'embedded' ? this.props.intl.formatMessage(messages.selectButton) : this.props.intl.formatMessage(messages.editButton)}</CapButton> : ''}
1241
1315
  {template._id === this.state.hoveredItem ? <CapButton onClick={() => this.handlePreviewClick(template)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
1242
1316
  </div>);
1243
1317
  } else if (this.state.channel.toLowerCase() === 'line') {
@@ -1252,7 +1326,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1252
1326
  {content.bodyText ? <div className={`sms-text ${this.state.hoveredItem === template._id ? 'sms-text-blurred' : ''}`}>{content.bodyText || ''}</div> : ''}
1253
1327
  {content.bodyImage ? <div className={`sms-text ${this.state.hoveredItem === template._id ? 'sms-text-blurred' : ''}`}>
1254
1328
  <img src={content.bodyImage} role={"presentation"} style={{maxWidth: '100%', objectFit: 'cover', height: '100%'}}/></div> : ''}
1255
- {template._id === this.state.hoveredItem ? <CapButton onClick={(e) => this.handleEditClick(e, template._id, modeType)} className="edit-button" type="secondary">{type === 'embedded' ? this.props.intl.formatMessage(messages.selectButton) : this.props.intl.formatMessage(messages.editButton)}</CapButton> : ''}
1329
+ {template._id === this.state.hoveredItem ? <CapButton onClick={(e) => this.handleEditClick(e, template, modeType)} className="edit-button" type="secondary">{type === 'embedded' ? this.props.intl.formatMessage(messages.selectButton) : this.props.intl.formatMessage(messages.editButton)}</CapButton> : ''}
1256
1330
  {template._id === this.state.hoveredItem ? <CapButton onClick={() => this.handlePreviewClick(template, modeType)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
1257
1331
  </div>
1258
1332
  );
@@ -1267,7 +1341,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1267
1341
  <div
1268
1342
  className="sms-template-content">
1269
1343
  <div className={`sms-text ${this.state.hoveredItem === template._id ? 'sms-text-blurred' : ''}`}>{content || ''}</div>
1270
- {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> : ''}
1344
+ {template._id === this.state.hoveredItem ? <CapButton onClick={(e) => this.handleEditClick(e, template)} className="edit-button" type="secondary">{type === 'embedded' ? this.props.intl.formatMessage(messages.selectButton) : this.props.intl.formatMessage(messages.editButton)}</CapButton> : ''}
1271
1345
  {template._id === this.state.hoveredItem ? <CapButton onClick={() => this.handlePreviewClick(template)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
1272
1346
  </div>
1273
1347
  );
@@ -1356,7 +1430,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1356
1430
  let isDisabled = this.isLoading();
1357
1431
  const channel = this.state.channel.toUpperCase();
1358
1432
  if (channel === MOBILE_PUSH || channel === WECHAT) {
1359
- isDisabled = isDisabled || _.isEmpty(this.props.Templates.selectedWeChatAccount);
1433
+ isDisabled = isDisabled || isEmpty(this.props.Templates.selectedWeChatAccount);
1360
1434
  }
1361
1435
  if (channel === MOBILE_PUSH) {
1362
1436
  isDisabled = this.checkSearchDisabled();
@@ -1447,160 +1521,100 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1447
1521
  return modal;
1448
1522
  };
1449
1523
 
1450
- render() {
1524
+ renderAccountSelection = () => {
1451
1525
  const accountOptions = [];
1452
- const isFullMode = this.isFullMode();
1453
- if ((this.state.channel.toUpperCase() === 'WECHAT' || this.state.channel.toUpperCase() === "MOBILEPUSH") && !_.isEmpty(this.props.Templates.weCrmAccounts)) {
1454
- _.forEach(this.props.Templates.weCrmAccounts, (account) => {
1455
- if ((this.state.channel.toUpperCase() === 'WECHAT' && account.configs && account.configs.is_wecrm_enabled) || this.state.channel.toUpperCase() === 'MOBILEPUSH') {
1456
- if (this.props.location.query.type === 'embedded' && (!this.props.location.query.module || (this.props.location.query.module && this.props.location.query.module !== 'library'))) {
1457
- if (this.props.location.query.source_account_id && account.sourceAccountIdentifier === this.props.location.query.source_account_id) {
1526
+ let { channel = '' } = this.state;
1527
+ channel = channel.toUpperCase();
1528
+ const { Templates: templates = {}, location = {} } = this.props;
1529
+ const { query = {} } = location;
1530
+ const { weCrmAccounts = [], fetchingWeCrmAccounts = false } = templates;
1531
+ const isWechatChannel = channel === WECHAT;
1532
+ const isMobilePushChannel = channel === MOBILE_PUSH;
1533
+
1534
+ if ((isWechatChannel || isMobilePushChannel) && !isEmpty(weCrmAccounts)) {
1535
+ forEach(weCrmAccounts, (account) => {
1536
+ if ((isWechatChannel && account.configs && account.configs.is_wecrm_enabled) || isMobilePushChannel) {
1537
+ if (query.type === 'embedded' && (!query.module || (query.module && query.module !== 'library'))) {
1538
+ if (query.source_account_id && account.sourceAccountIdentifier === query.source_account_id) {
1458
1539
  accountOptions.push(
1459
- { key: this.state.channel.toUpperCase() === "MOBILEPUSH" ? account.id : account.uuid,
1460
- label: account.name,
1540
+ { key: isMobilePushChannel ? account.id : account.uuid,
1541
+ title: account.name,
1461
1542
  value: account.name,
1543
+ icon: <CapIcon.CapIconAvatar text={account.name[0]} width="2rem" height="2rem"/>,
1462
1544
  }
1463
1545
  );
1464
- } else if (this.props.location.query.module && (this.state.channel.toUpperCase() === "WECHAT" || this.state.channel.toUpperCase() === "MOBILEPUSH")) {
1546
+ } else if (query.module && (isWechatChannel || isMobilePushChannel)) {
1465
1547
  accountOptions.push(
1466
1548
  {
1467
- key: this.state.channel.toUpperCase() === "MOBILEPUSH" ? account.id : account.uuid,
1549
+ key: isMobilePushChannel ? account.id : account.uuid,
1468
1550
  value: account.name,
1469
- label: account.name,
1551
+ title: account.name,
1552
+ icon: <CapIcon.CapIconAvatar text={account.name[0]} width="2rem" height="2rem"/>,
1470
1553
  }
1471
1554
  );
1472
1555
  }
1473
1556
  } else {
1474
1557
  accountOptions.push(
1475
1558
  {
1476
- key: this.state.channel.toUpperCase() === "MOBILEPUSH" ? account.id : account.uuid,
1559
+ key: isMobilePushChannel ? account.id : account.uuid,
1477
1560
  value: account.name,
1478
- label: account.name,
1561
+ title: account.name,
1562
+ icon: <CapIcon.CapIconAvatar text={account.name[0]} width="2rem" height="2rem"/>,
1479
1563
  }
1480
1564
  );
1481
1565
  }
1482
1566
  }
1483
1567
  });
1484
1568
  }
1485
- const pageHeader = (
1486
- <div>
1487
- {(this.isEnabledInLibraryModule("showAccountSelection") || (((this.state.channel.toUpperCase() === 'WECHAT' || this.state.channel.toUpperCase() === "MOBILEPUSH") && (this.props.location.query.type !== 'embedded') && !_.isEmpty(this.props.Templates.weCrmAccounts)))) &&
1488
- <CapSelect
1489
- className="selectAccount"
1490
- onSelect={this.onAccountSelect}
1491
- value={this.props.Templates.selectedWeChatAccount ? this.props.Templates.selectedWeChatAccount.name : undefined}
1492
- placeholder={this.props.intl.formatMessage(messages.selectAccount)}
1493
- options={accountOptions}
1494
- style={{width: '200px'}}
1569
+ return (<CapSpin spinning={fetchingWeCrmAccounts}>
1570
+ {isEmpty(weCrmAccounts) && !fetchingWeCrmAccounts ? <FormattedMessage {...messages.noAccountsPresentWeChat} /> :
1571
+ <div style={{overflowX: "auto"}}>
1572
+ <CapHeader
1573
+ title={isMobilePushChannel ? this.props.intl.formatMessage(messages.mobilepushAccount) : this.props.intl.formatMessage(messages.wechatAccount)}
1574
+ description={this.props.intl.formatMessage(messages.chooseAccount)}
1575
+ size="regular"
1576
+ className="select-account-header"
1495
1577
  />
1496
- }
1578
+ <CapRadioCard
1579
+ className="select-account"
1580
+ onChange={this.onAccountSelect}
1581
+ value={this.props.Templates.selectedWeChatAccount ? this.props.Templates.selectedWeChatAccount.name : undefined}
1582
+ panes={accountOptions}
1583
+ cardHeight="48px"
1584
+ cardWidth="276px"
1585
+ size="small"
1586
+ />
1497
1587
  </div>
1498
- );
1499
- const pageHeaderDvs = (
1500
- <div>
1501
- {((this.state.channel.toUpperCase() === 'WECHAT' || this.state.channel.toUpperCase() === "MOBILEPUSH") && (this.props.location.query.type === 'embedded') && !_.isEmpty(this.props.Templates.weCrmAccounts)) &&
1502
- <CapSelect
1503
- className="selectAccount"
1504
- onSelect={this.onAccountSelect}
1505
- value={this.props.Templates.selectedWeChatAccount ? this.props.Templates.selectedWeChatAccount.name : undefined} placeholder={this.props.intl.formatMessage(messages.selectAccount)}
1506
- options={accountOptions}
1507
- style={{width: '200px'}}
1508
-
1509
- />
1510
- }
1511
- </div>
1512
- );
1513
- // let actionButton = '';
1514
- // if (this.props.location.query.type !== 'embedded') {
1515
- // if (this.state.channel.toUpperCase() === 'WECHAT') {
1516
- // const createPushMenu = (
1517
- // <Menu onClick={this.menuOnClickEvent}>
1518
- // <MenuItem key="map_template">
1519
- // {this.props.intl.formatMessage(messages.mapTemplate)}
1520
- // </MenuItem>
1521
- // <MenuItem key="richmedia_template">
1522
- // {this.props.intl.formatMessage(messages.weChatRichmediaTemplate)}
1523
- // </MenuItem>
1524
- // </Menu>
1525
- // );
1526
- // actionButton = (<Dropdown disabled={_.isEmpty(this.props.Templates.selectedWeChatAccount)} overlay={createPushMenu} trigger={['click']}>
1527
- // <CapButton style={{paddingLeft: '24px', paddingRight: '4px'}}>
1528
- // <div style={{display: 'inline-flex'}}>
1529
- // <p style={{ lineHeight: '28px'}}>{this.props.intl.formatMessage(messages.newTemplate)}</p>
1530
- // <p style={{ height: '28px'}}>
1531
- // <i style={{ color: '#fff', paddingTop: '2px', margin: '0', paddingRight: '8px'}} className="material-icons">arrow_drop_down</i>
1532
- // </p>
1533
- // </div>
1534
- // </CapButton>
1535
- // </Dropdown>);
1536
- // } else if (this.state.channel.toUpperCase() === 'EMAIL' || this.state.channel.toUpperCase() === 'EBILL') {
1537
- // const menuItems = [];
1538
- // menuItems.push(<MenuItem key={'uploadFile'}>{this.props.intl.formatMessage(messages.uploadFile)}</MenuItem>);
1539
- // menuItems.push(<MenuItem key={'useEditor'}>{this.props.intl.formatMessage(messages.useEditor)}</MenuItem>);
1540
- // const menu = (
1541
- // <Menu onClick={this.handleMenuAction}>
1542
- // {menuItems}
1543
- // </Menu>
1544
- // );
1545
- // actionButton = (
1546
- // <Dropdown overlay={menu} trigger={["click"]}>
1547
- // <CapButton style={{paddingLeft: '24px', paddingRight: '4px'}}>
1548
- // <div style={{display: 'inline-flex'}}>
1549
- // <p style={{ lineHeight: '32px', paddingRight: '12px' }}>{this.props.intl.formatMessage(messages.newTemplate)}</p>
1550
- // <p style={{ height: '32px' }}>
1551
- // <i style={{ color: '#fff', lineHeight: '32px', margin: '0'}} className="material-icons">arrow_drop_down</i>
1552
- // </p>
1553
- // </div>
1554
- // </CapButton>
1555
- // </Dropdown>
1556
- // );
1557
- // } else if (this.props.route.name.toLowerCase() === "mobilepush") {
1558
- // const createPushMenu = (
1559
- // <Menu onClick={this.createTemplate}>
1560
- // <MenuItem key="text">
1561
- // {this.props.intl.formatMessage(messages.textTemplate)}
1562
- // </MenuItem>
1563
- // <MenuItem key="image">
1564
- // {this.props.intl.formatMessage(messages.imageTemplate)}
1565
- // </MenuItem>
1566
- // </Menu>
1567
- // );
1568
- // actionButton = (<Dropdown disabled={_.isEmpty(this.props.Templates.selectedWeChatAccount)} overlay={createPushMenu} trigger={['click']}>
1569
- // <CapButton style={{paddingLeft: '24px', paddingRight: '4px'}}>
1570
- // <div style={{display: 'inline-flex'}}>
1571
- // <p style={{ lineHeight: '28px'}}>New Template</p>
1572
- // <p style={{ height: '28px'}}>
1573
- // <i style={{ color: '#fff', paddingTop: '2px', margin: '0', paddingRight: '8px'}} className="material-icons">arrow_drop_down</i>
1574
- // </p>
1575
- // </div>
1576
- // </CapButton>
1577
- // </Dropdown>);
1578
- // } else if (this.props.route.name.toLowerCase() === "line") {
1579
- // const lineMenu = (
1580
- // <Menu onClick={this.createTemplate}>
1581
- // <MenuItem key="text">
1582
- // {this.props.intl.formatMessage(messages.textTemplate)}
1583
- // </MenuItem>
1584
- // <MenuItem key="image">
1585
- // {this.props.intl.formatMessage(messages.imageTemplate)}
1586
- // </MenuItem>
1587
- // </Menu>
1588
- // );
1589
- // actionButton = (<Dropdown overlay={lineMenu} trigger={['click']}>
1590
- // <CapButton style={{paddingLeft: '24px', paddingRight: '4px'}}>
1591
- // <div style={{display: 'inline-flex'}}>
1592
- // <p style={{ lineHeight: '28px'}}>New Template</p>
1593
- // <p style={{ height: '28px'}}>
1594
- // <i style={{ color: '#fff', paddingTop: '2px', margin: '0', paddingRight: '8px'}} className="material-icons">arrow_drop_down</i>
1595
- // </p>
1596
- // </div>
1597
- // </CapButton>
1598
- // </Dropdown>);
1599
- // } else {
1600
- // actionButton = (<CapButton onClick={this.createTemplate}>{this.state.channel.toUpperCase() === 'SMS' ? this.props.intl.formatMessage(messages.createSmsActionButton) : 'Create SMS'}</CapButton>);
1601
- // }
1602
- // }
1588
+ }
1589
+ </CapSpin>);
1590
+ };
1591
+
1592
+ setAccountSelectionMode = () => {
1593
+ this.setState({activeMode: ACCOUNT_SELECTION_MODE});
1594
+ }
1595
+
1596
+ showAccountName = () => {
1597
+ const { selectedAccount, channel } = this.state;
1598
+ const { Templates: templates = {}} = this.props;
1599
+ const { weCrmAccounts = []} = templates;
1600
+ const isMobilePushChannel = channel === MOBILE_PUSH;
1601
+ return (<CapHeader
1602
+ title={<CapHeading type="h4">{isMobilePushChannel ? this.props.intl.formatMessage(messages.mobilepushAccount) : this.props.intl.formatMessage(messages.wechatAccount)}</CapHeading>}
1603
+ description={<><CapHeading type="h3">{selectedAccount} {weCrmAccounts.length > 1 && <CapLink onClick={this.setAccountSelectionMode} style={{display: 'inline-block', position: 'relative', top: '3px'}} fontWeight="regular" fontSize="14px" title="change"/>} </CapHeading></>}
1604
+ size="regular"
1605
+ />);
1606
+ }
1603
1607
 
1608
+ setWechatFilter = (e) => this.setState({wechatFilter: e.target.value});
1609
+
1610
+ render() {
1611
+ const isFullMode = this.isFullMode();
1612
+ const { activeMode, channel, wechatFilter } = this.state;
1613
+ if (activeMode === ACCOUNT_SELECTION_MODE) {
1614
+ return this.renderAccountSelection();
1615
+ }
1616
+ const pageHeader = "";
1617
+ const pageHeaderDvs = "";
1604
1618
  const isLoading = this.isLoading();
1605
1619
  let previewHeader = this.props.intl.formatMessage(messages.preview);
1606
1620
  // const previewHeader = (this.state.channel.toLowerCase() === 'email' ? <h3>{this.props.intl.formatMessage(messages.emailPreview)}</h3> : <h3>{this.props.intl.formatMessage(messages.ebillPreview)}</h3>);
@@ -1621,8 +1635,10 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1621
1635
  >
1622
1636
  </CardGrid>
1623
1637
  );
1624
- const isfilterContentVisisble = !_.isEmpty(this.props.TemplatesList) || !_.isEmpty(this.state.searchText) || !_.isEmpty(this.props.Templates.templateError);
1625
- const filterContent = (( isfilterContentVisisble || this.state.channel.toLowerCase() === 'mobilepush' ) && <div className="action-container">
1638
+ //TODO -> uncomment the following line
1639
+ // const isfilterContentVisisble = !isEmpty(this.props.TemplatesList) || !isEmpty(this.state.searchText) || !isEmpty(this.props.Templates.templateError);
1640
+ const isfilterContentVisisble = true;
1641
+ const filterContent = (( isfilterContentVisisble || [WECHAT, MOBILE_PUSH].includes(this.state.channel.toUpperCase())) && <div className="action-container">
1626
1642
  {isfilterContentVisisble && <CapInput.Search
1627
1643
  className="search-text"
1628
1644
  style={{width: '210px'}}
@@ -1632,8 +1648,14 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1632
1648
  disabled={this.checkSearchDisabled()}
1633
1649
  onClear={() => this.searchTemplate('')}
1634
1650
  />}
1651
+ {
1652
+ channel.toUpperCase() === WECHAT && <CapRadio.CapRadioGroup className="wechat-filters" defaultValue={wechatFilter} onChange={this.setWechatFilter}>
1653
+ <CapRadio.Button value={WECHAT_FILTERS.ALL}><CapLabel type="label2">All</CapLabel></CapRadio.Button>
1654
+ <CapRadio.Button value={WECHAT_FILTERS.MAPTEMPLATES}><CapLabel type="label2">Map templates</CapLabel></CapRadio.Button>
1655
+ <CapRadio.Button value={WECHAT_FILTERS.RICHMEDIA}><CapLabel type="label2">Rich media templates</CapLabel></CapRadio.Button>
1656
+ </CapRadio.CapRadioGroup>
1657
+ }
1635
1658
  <div style={{display: "flex", justifyContent: "space-between", alignItems: 'center'}}>
1636
- {(this.props.location.query.type === 'embedded' ) ? pageHeaderDvs : pageHeader}
1637
1659
  {isfilterContentVisisble && <CapButton
1638
1660
  type={"primary"}
1639
1661
  disabled={this.isCreateDisabled()}
@@ -1665,21 +1687,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1665
1687
  <Pagination onPageChange={templates.length ? this.onPaginationChange : () => {}} paginationSelector="pagination-container">
1666
1688
  {this.getTemplateDataForGrid({isLoading, loadingTip, channel: this.state.channel, templates: this.props.TemplatesList, filterContent, handlers: {handlePreviewClick: this.handlePreviewClick, handleEditClick: this.handleEditClick}})}
1667
1689
  </Pagination>
1668
- {/* {!this.props.renderNewCardGrid && ((templateList && templateList.length > 0) || isSearch) && // old UI GRID
1669
- <Pagination onPageChange={this.onPaginationChange} paginationSelector="pagination-container">
1670
- <CardGrid
1671
- className={this.state.channel.toLowerCase() === "mobilepush" ? "mobilepush-templates" : ""}
1672
- listItem={templateList}
1673
- filterContent={filterContent}
1674
- onHoverItem={this.handleOnHoverItem}
1675
- onItemClick={this.handleOnItemClick}
1676
- enablePagination
1677
- isLoading={isLoading}
1678
- loadingTip={loadingTip}
1679
- >
1680
- </CardGrid>
1681
- </Pagination>} */}
1682
- {(((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 && !_.isEmpty(this.state.searchText) &&
1690
+ {(((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 && !isEmpty(this.state.searchText) &&
1683
1691
  <div style={{ height: '65vh', textAlign: 'center', lineHeight: '65vh'}}>
1684
1692
  <CapHeading type="h6">{this.props.intl.formatMessage(messages.noTemplatesFound)}</CapHeading>
1685
1693
  </div>}
@@ -1687,7 +1695,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1687
1695
 
1688
1696
 
1689
1697
  <CapRow>
1690
- {!_.isEmpty(creativesParams.mode) && isFullMode && //creatives container for fullmode
1698
+ {!isEmpty(creativesParams.mode) && isFullMode && //creatives container for fullmode
1691
1699
  <CreativesContainer
1692
1700
  key={creativesParams.mode}
1693
1701
  messageDetails={{type: "default"}}
@@ -1697,25 +1705,12 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1697
1705
  templateData={creativesParams}
1698
1706
  getCreativesData={() => { this.onCreateComplete(true); }}
1699
1707
  channel={route.name.toUpperCase()}
1700
- handleCloseCreatives={this.onCreateComplete}/>
1708
+ handleCloseCreatives={this.onCreateComplete}
1709
+ selectedWeChatAccount={get(this.props, 'Templates.selectedWeChatAccount', {})}
1710
+ />
1701
1711
  }
1702
1712
  </CapRow>
1703
1713
  <CapRow>
1704
- {this.state.channel.toLowerCase() === 'wechat' && this.state.previewTemplate && this.state.previewTemplate.definition && this.state.previewTemplate.definition.msgcontent && this.state.previewTemplate.definition.msgcontent === 'RICH_MEDIA_WECHAT' &&
1705
- <WechatRichmediaTemplatePreview
1706
- show={this.state.previewOpen}
1707
- closeSlideBox={this.togglePreview}
1708
- header={this.state.previewTemplate.name}
1709
- width={30}
1710
- showSlidebox
1711
- const type={this.props.location && this.props.location.query.type ? this.props.location.query.type : ''}
1712
- content={this.state.previewTemplate.versions.base.mediaList}
1713
- onEditClick={this.handleEditClick}
1714
- showEdit
1715
- templateId={this.state.previewTemplate._id}
1716
- path={`/wechat/richmedia/edit/${this.state.previewTemplate._id}`}
1717
- />
1718
- }
1719
1714
 
1720
1715
  {(this.state.channel.toLowerCase() === 'ebill' || this.state.channel.toLowerCase() === 'email') && htmlPreviewContent && <EmailPreview
1721
1716
  header={previewHeader}
@@ -1724,7 +1719,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1724
1719
  device={this.state.device}
1725
1720
  handleClose={this.toggleEmailPreview}
1726
1721
  changePreviewDevice={this.changePreviewDevice}
1727
- versions={_.get(this.state, 'previewTemplate.versions', {})}
1722
+ versions={get(this.state, 'previewTemplate.versions', {})}
1728
1723
  lastModified={this.state.previewTemplate ? this.state.previewTemplate.updatedAt : ''}
1729
1724
  updatedByName={commonUtil.getUserNameById(parseInt(this.state.previewTemplate.updatedBy, 10), commonUtil.getMergedUserList(this.props.Templates.userList))}
1730
1725
  />}