@capillarytech/creatives-library 8.0.136-alpha.4 → 8.0.136-beta.3

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 (292) hide show
  1. package/components/BreadCrumbs/index.js +65 -0
  2. package/components/BreadCrumbs/messages.js +13 -0
  3. package/components/CapTagList/index.js +235 -0
  4. package/components/CapTagList/messages.js +45 -0
  5. package/components/Card/_customCard.scss +40 -0
  6. package/components/Card/index.js +78 -0
  7. package/components/Card/tests/__snapshots__/index.test.js.snap +22 -0
  8. package/components/Card/tests/index.test.js +20 -0
  9. package/components/CardGrid/index.js +71 -0
  10. package/components/Ckeditor/index.js +238 -0
  11. package/components/Ckeditor/messages.js +13 -0
  12. package/components/Ckeditor/style.scss +3 -0
  13. package/components/Component/index.js +29 -0
  14. package/components/CustomPopOver/index.js +81 -0
  15. package/components/CustomPopOver/messages.js +17 -0
  16. package/components/DateFilter/index.js +349 -0
  17. package/components/DateFilter/messages.js +57 -0
  18. package/components/DateRange/index.js +114 -0
  19. package/components/DateRange/messages.js +25 -0
  20. package/components/Edmeditor/index.js +65 -0
  21. package/components/Edmeditor/messages.js +13 -0
  22. package/components/EmailPreview/_emailPreview.scss +119 -0
  23. package/components/EmailPreview/assets/images/iPad.svg +10 -0
  24. package/components/EmailPreview/assets/images/mobile.png +0 -0
  25. package/components/EmailPreview/index.js +107 -0
  26. package/components/EmailPreview/messages.js +33 -0
  27. package/components/Footer/index.js +27 -0
  28. package/components/Footer/messages.js +13 -0
  29. package/components/FormBuilder/_formBuilder.scss +83 -0
  30. package/components/FormBuilder/index.js +3279 -0
  31. package/components/FormBuilder/messages.js +61 -0
  32. package/components/Header/index.js +44 -0
  33. package/components/Header/messages.js +29 -0
  34. package/components/ImagePreview/_imagePreview.scss +63 -0
  35. package/components/ImagePreview/index.js +52 -0
  36. package/components/ImagePreview/messages.js +17 -0
  37. package/components/PageHeader/_pageHeader.scss +22 -0
  38. package/components/PageHeader/index.js +37 -0
  39. package/components/PageHeader/messages.js +13 -0
  40. package/components/Pagination/_pagination.scss +5 -0
  41. package/components/Pagination/index.js +49 -0
  42. package/components/PreviewSideBar/_previewsidebar.scss +28 -0
  43. package/components/PreviewSideBar/index.js +152 -0
  44. package/components/PreviewSideBar/messages.js +41 -0
  45. package/components/Sidebar/_sidebar.scss +115 -0
  46. package/components/Sidebar/index.js +214 -0
  47. package/components/Sidebar/messages.js +21 -0
  48. package/components/SlideBox/_slideBox.scss +63 -0
  49. package/components/SlideBox/index.js +47 -0
  50. package/components/SlideBox/tests/index.test.js +103 -0
  51. package/components/SmsEditor/index.js +55 -0
  52. package/components/SmsTest/index.js +117 -0
  53. package/components/SmsTest/messages.js +21 -0
  54. package/components/TemplatePreview/WechatRichmediaTemplatePreview/_wechatRichmediaTemplatePrev.scss +42 -0
  55. package/components/TemplatePreview/WechatRichmediaTemplatePreview/index.js +141 -0
  56. package/components/TemplatePreview/WechatRichmediaTemplatePreview/messages.js +21 -0
  57. package/components/TemplatePreview/_templatePreview.scss +642 -0
  58. package/components/TemplatePreview/assets/images/WECHAT_5x.png +0 -0
  59. package/components/TemplatePreview/assets/images/androidPushMessage.svg +45 -0
  60. package/components/TemplatePreview/assets/images/home-screen-android.svg +21 -0
  61. package/components/TemplatePreview/assets/images/home-screen-ios.svg +16 -0
  62. package/components/TemplatePreview/assets/images/iPhonePushMessage.svg +135 -0
  63. package/components/TemplatePreview/assets/images/mobile.svg +24 -0
  64. package/components/TemplatePreview/assets/images/sms-body.png +0 -0
  65. package/components/TemplatePreview/assets/images/sms-icon.png +0 -0
  66. package/components/TemplatePreview/assets/images/sms_mobile.png +0 -0
  67. package/components/TemplatePreview/assets/images/sms_mobile_android.svg +22 -0
  68. package/components/TemplatePreview/assets/images/sms_mobile_ios.svg +16 -0
  69. package/components/TemplatePreview/assets/images/user-icon.svg +19 -0
  70. package/components/TemplatePreview/assets/images/wechat-mobile.svg +78 -0
  71. package/components/TemplatePreview/assets/images/wechat_mobile_android.svg +20 -0
  72. package/components/TemplatePreview/index.js +617 -0
  73. package/components/TemplatePreview/messages.js +78 -0
  74. package/components/Toastr/index.js +60 -0
  75. package/components/Toastr/messages.js +13 -0
  76. package/components/ToastrMessage/index.js +113 -0
  77. package/components/ToastrMessage/messages.js +17 -0
  78. package/components/TopBar/_topbar.scss +46 -0
  79. package/components/TopBar/assets/images/capillary_logo.png +0 -0
  80. package/components/TopBar/assets/images/old_capillary_logo.png +0 -0
  81. package/components/TopBar/index.js +113 -0
  82. package/components/TopBar/messages.js +29 -0
  83. package/containers/App/actions.js +7 -0
  84. package/containers/App/constants.js +114 -0
  85. package/containers/App/index.js +52 -0
  86. package/containers/App/reducer.js +19 -0
  87. package/containers/App/sagas.js +31 -0
  88. package/containers/App/selectors.js +25 -0
  89. package/containers/App/test/saga.test.js +11 -0
  90. package/containers/Assets/Gallery/_gallery.scss +126 -0
  91. package/containers/Assets/Gallery/actions.js +37 -0
  92. package/containers/Assets/Gallery/constants.js +23 -0
  93. package/containers/Assets/Gallery/index.js +473 -0
  94. package/containers/Assets/Gallery/messages.js +93 -0
  95. package/containers/Assets/Gallery/reducer.js +81 -0
  96. package/containers/Assets/Gallery/sagas.js +80 -0
  97. package/containers/Assets/Gallery/selectors.js +25 -0
  98. package/containers/Assets/Gallery/tests/__snapshots__/reducer.test.js.snap +9 -0
  99. package/containers/Assets/Gallery/tests/actions.test.js +25 -0
  100. package/containers/Assets/Gallery/tests/reducer.test.js +96 -0
  101. package/containers/Assets/Gallery/tests/saga.test.js +157 -0
  102. package/containers/Cap/actions.js +66 -0
  103. package/containers/Cap/constants.js +25 -0
  104. package/containers/Cap/index.js +402 -0
  105. package/containers/Cap/messages.js +75 -0
  106. package/containers/Cap/reducer.js +113 -0
  107. package/containers/Cap/sagas.js +159 -0
  108. package/containers/Cap/selectors.js +75 -0
  109. package/containers/Cap/tests/__snapshots__/index.test.js.snap +2269 -0
  110. package/containers/Cap/tests/index.test.js +22 -0
  111. package/containers/Cap/tests/saga.test.js +284 -0
  112. package/containers/Dashboard/actions.js +15 -0
  113. package/containers/Dashboard/constants.js +7 -0
  114. package/containers/Dashboard/index.js +76 -0
  115. package/containers/Dashboard/messages.js +13 -0
  116. package/containers/Dashboard/reducer.js +21 -0
  117. package/containers/Dashboard/sagas.js +17 -0
  118. package/containers/Dashboard/selectors.js +25 -0
  119. package/containers/Dashboard/test/saga.test.js +9 -0
  120. package/containers/Ebill/_ebill.scss +5 -0
  121. package/containers/Ebill/actions.js +43 -0
  122. package/containers/Ebill/constants.js +20 -0
  123. package/containers/Ebill/index.js +1278 -0
  124. package/containers/Ebill/messages.js +77 -0
  125. package/containers/Ebill/reducer.js +72 -0
  126. package/containers/Ebill/sagas.js +74 -0
  127. package/containers/Ebill/selectors.js +25 -0
  128. package/containers/Ebill/test/saga.test.js +11 -0
  129. package/containers/Email/_email.scss +141 -0
  130. package/containers/Email/actions.js +81 -0
  131. package/containers/Email/constants.js +36 -0
  132. package/containers/Email/index.js +3325 -0
  133. package/containers/Email/messages.js +289 -0
  134. package/containers/Email/reducer.js +142 -0
  135. package/containers/Email/sagas.js +135 -0
  136. package/containers/Email/selectors.js +31 -0
  137. package/containers/Email/test/saga.test.js +671 -0
  138. package/containers/LanguageProvider/actions.js +17 -0
  139. package/containers/LanguageProvider/constants.js +8 -0
  140. package/containers/LanguageProvider/index.js +80 -0
  141. package/containers/LanguageProvider/reducer.js +30 -0
  142. package/containers/LanguageProvider/selectors.js +20 -0
  143. package/containers/LanguageProvider/tests/actions.test.js +19 -0
  144. package/containers/LanguageProvider/tests/index.test.js +78 -0
  145. package/containers/LanguageProvider/tests/reducer.test.js +20 -0
  146. package/containers/LanguageProvider/tests/selectors.test.js +15 -0
  147. package/containers/Line/Create/_lineCreate.scss +54 -0
  148. package/containers/Line/Create/actions.js +90 -0
  149. package/containers/Line/Create/constants.js +39 -0
  150. package/containers/Line/Create/index.js +836 -0
  151. package/containers/Line/Create/messages.js +189 -0
  152. package/containers/Line/Create/reducer.js +99 -0
  153. package/containers/Line/Create/sagas.js +121 -0
  154. package/containers/Line/Create/selectors.js +36 -0
  155. package/containers/Line/Create/tests/saga.test.js +202 -0
  156. package/containers/Line/Edit/_lineEdit.scss +35 -0
  157. package/containers/Line/Edit/actions.js +79 -0
  158. package/containers/Line/Edit/constants.js +27 -0
  159. package/containers/Line/Edit/index.js +1050 -0
  160. package/containers/Line/Edit/messages.js +177 -0
  161. package/containers/Line/Edit/reducer.js +83 -0
  162. package/containers/Line/Edit/sagas.js +80 -0
  163. package/containers/Line/Edit/selectors.js +29 -0
  164. package/containers/Line/Edit/test/saga.test.js +160 -0
  165. package/containers/Login/assets/images/capillary_logo.png +0 -0
  166. package/containers/Login/components/LoginForm/index.js +62 -0
  167. package/containers/Login/components/LoginForm/messages.js +33 -0
  168. package/containers/Login/index.js +130 -0
  169. package/containers/Login/messages.js +25 -0
  170. package/containers/Login/selectors.js +25 -0
  171. package/containers/MobilePush/Create/_mobilePushCreate.scss +39 -0
  172. package/containers/MobilePush/Create/actions.js +46 -0
  173. package/containers/MobilePush/Create/constants.js +23 -0
  174. package/containers/MobilePush/Create/index.js +2303 -0
  175. package/containers/MobilePush/Create/messages.js +269 -0
  176. package/containers/MobilePush/Create/reducer.js +70 -0
  177. package/containers/MobilePush/Create/sagas.js +74 -0
  178. package/containers/MobilePush/Create/selectors.js +28 -0
  179. package/containers/MobilePush/Create/test/saga.test.js +19 -0
  180. package/containers/MobilePush/Edit/_mobilePushCreate.scss +39 -0
  181. package/containers/MobilePush/Edit/actions.js +91 -0
  182. package/containers/MobilePush/Edit/constants.js +35 -0
  183. package/containers/MobilePush/Edit/index.js +2601 -0
  184. package/containers/MobilePush/Edit/messages.js +266 -0
  185. package/containers/MobilePush/Edit/reducer.js +112 -0
  186. package/containers/MobilePush/Edit/sagas.js +126 -0
  187. package/containers/MobilePush/Edit/selectors.js +29 -0
  188. package/containers/MobilePush/Edit/tests/saga.test.js +255 -0
  189. package/containers/NotFoundPage/index.js +25 -0
  190. package/containers/NotFoundPage/messages.js +13 -0
  191. package/containers/NotFoundPage/tests/index.test.js +17 -0
  192. package/containers/Sms/Create/_smsCreate.scss +42 -0
  193. package/containers/Sms/Create/actions.js +27 -0
  194. package/containers/Sms/Create/constants.js +16 -0
  195. package/containers/Sms/Create/index.js +1488 -0
  196. package/containers/Sms/Create/messages.js +109 -0
  197. package/containers/Sms/Create/reducer.js +41 -0
  198. package/containers/Sms/Create/sagas.js +40 -0
  199. package/containers/Sms/Create/selectors.js +28 -0
  200. package/containers/Sms/Create/test/saga.test.js +11 -0
  201. package/containers/Sms/Edit/actions.js +40 -0
  202. package/containers/Sms/Edit/constants.js +17 -0
  203. package/containers/Sms/Edit/index.js +1472 -0
  204. package/containers/Sms/Edit/messages.js +105 -0
  205. package/containers/Sms/Edit/reducer.js +50 -0
  206. package/containers/Sms/Edit/sagas.js +60 -0
  207. package/containers/Sms/Edit/selectors.js +32 -0
  208. package/containers/Sms/Edit/test/saga.test.js +13 -0
  209. package/containers/TagList/_tagList.scss +8 -0
  210. package/containers/TagList/actions.js +15 -0
  211. package/containers/TagList/constants.js +32 -0
  212. package/containers/TagList/index.js +236 -0
  213. package/containers/TagList/messages.js +13 -0
  214. package/containers/TagList/reducer.js +23 -0
  215. package/containers/TagList/sagas.js +11 -0
  216. package/containers/TagList/selectors.js +25 -0
  217. package/containers/Templates/_templates.scss +333 -0
  218. package/containers/Templates/actions.js +103 -0
  219. package/containers/Templates/constants.js +60 -0
  220. package/containers/Templates/index.js +1756 -0
  221. package/containers/Templates/messages.js +337 -0
  222. package/containers/Templates/reducer.js +142 -0
  223. package/containers/Templates/sagas.js +163 -0
  224. package/containers/Templates/selectors.js +28 -0
  225. package/containers/Templates/test/saga.test.js +241 -0
  226. package/containers/WeChat/MapTemplates/_mapTemplates.scss +8 -0
  227. package/containers/WeChat/MapTemplates/actions.js +52 -0
  228. package/containers/WeChat/MapTemplates/constants.js +28 -0
  229. package/containers/WeChat/MapTemplates/index.js +1610 -0
  230. package/containers/WeChat/MapTemplates/messages.js +157 -0
  231. package/containers/WeChat/MapTemplates/reducer.js +74 -0
  232. package/containers/WeChat/MapTemplates/sagas.js +84 -0
  233. package/containers/WeChat/MapTemplates/selectors.js +25 -0
  234. package/containers/WeChat/MapTemplates/test/saga.test.js +155 -0
  235. package/containers/WeChat/RichmediaTemplates/Create/_createRichmedia.scss +57 -0
  236. package/containers/WeChat/RichmediaTemplates/Create/actions.js +36 -0
  237. package/containers/WeChat/RichmediaTemplates/Create/constants.js +15 -0
  238. package/containers/WeChat/RichmediaTemplates/Create/index.js +1071 -0
  239. package/containers/WeChat/RichmediaTemplates/Create/messages.js +165 -0
  240. package/containers/WeChat/RichmediaTemplates/Create/reducer.js +60 -0
  241. package/containers/WeChat/RichmediaTemplates/Create/richmediaschema.js +497 -0
  242. package/containers/WeChat/RichmediaTemplates/Create/sagas.js +51 -0
  243. package/containers/WeChat/RichmediaTemplates/Create/selectors.js +37 -0
  244. package/containers/WeChat/RichmediaTemplates/Create/test/saga.test.js +13 -0
  245. package/containers/WeChat/RichmediaTemplates/Edit/actions.js +20 -0
  246. package/containers/WeChat/RichmediaTemplates/Edit/constants.js +10 -0
  247. package/containers/WeChat/RichmediaTemplates/Edit/index.js +136 -0
  248. package/containers/WeChat/RichmediaTemplates/Edit/messages.js +13 -0
  249. package/containers/WeChat/RichmediaTemplates/Edit/reducer.js +28 -0
  250. package/containers/WeChat/RichmediaTemplates/Edit/sagas.js +36 -0
  251. package/containers/WeChat/RichmediaTemplates/Edit/selectors.js +30 -0
  252. package/containers/WeChat/RichmediaTemplates/Edit/test/saga.test.js +12 -0
  253. package/containers/WeChat/RichmediaTemplates/View/actions.js +15 -0
  254. package/containers/WeChat/RichmediaTemplates/View/constants.js +7 -0
  255. package/containers/WeChat/RichmediaTemplates/View/index.js +47 -0
  256. package/containers/WeChat/RichmediaTemplates/View/messages.js +21 -0
  257. package/containers/WeChat/RichmediaTemplates/View/reducer.js +23 -0
  258. package/containers/WeChat/RichmediaTemplates/View/sagas.js +11 -0
  259. package/containers/WeChat/RichmediaTemplates/View/selectors.js +25 -0
  260. package/index.js +2 -4
  261. package/package.json +1 -1
  262. package/routes.js +202 -136
  263. package/services/getSchema.js +1 -1
  264. package/services/localStorageApi.js +0 -1
  265. package/tests/i18n.test.js +1 -1
  266. package/utils/asyncInjectors.js +78 -0
  267. package/utils/authWrapper.js +1 -1
  268. package/utils/callNativeEvent.js +16 -0
  269. package/utils/checkStore.js +21 -0
  270. package/utils/common.js +2 -2
  271. package/utils/customAuthWrapper.js +62 -0
  272. package/utils/customConnectedAuthWrapper.js +26 -0
  273. package/utils/tagValidations.js +1 -1
  274. package/utils/tests/checkStore.test.js +1 -1
  275. package/utils/tests/customAuth.test.js +1 -1
  276. package/utils/transformerUtils.js +195 -1
  277. package/v2Components/CapTagList/index.js +14 -9
  278. package/v2Components/Carousel/style.scss +1 -1
  279. package/v2Components/EmailMobilePreview/index.js +2 -2
  280. package/v2Components/FormBuilder/index.js +2 -2
  281. package/v2Components/TemplatePreview/index.js +1 -2
  282. package/v2Containers/Cap/tests/saga.test.js +1 -1
  283. package/v2Containers/Email/index.js +1 -1
  284. package/v2Containers/FTP/index.js +1 -1
  285. package/v2Containers/Line/Container/Text/index.js +6 -6
  286. package/v2Containers/Sms/Create/index.js +2 -2
  287. package/v2Containers/Sms/Edit/index.js +1 -1
  288. package/v2Containers/TagList/index.js +1 -1
  289. package/v2Containers/TagList/utils.js +1 -1
  290. package/v2Containers/Templates/index.js +1 -1
  291. package/v2Containers/Templates/sagas.js +1 -1
  292. package/constants/unified.js +0 -189
@@ -0,0 +1,1756 @@
1
+ /*
2
+ *
3
+ * Templates
4
+ *
5
+ */
6
+
7
+ import PropTypes from 'prop-types';
8
+
9
+ import React from 'react';
10
+ import { connect } from 'react-redux';
11
+ import Helmet from 'react-helmet';
12
+ import { injectIntl, intlShape } from 'react-intl';
13
+ import { createStructuredSelector } from 'reselect';
14
+ import moment from "moment";
15
+ import _ from 'lodash';
16
+ import { bindActionCreators, compose } from 'redux';
17
+ import { Row, Select, Spin, Dropdown, Col, Breadcrumb, Menu, Modal} from 'antd';
18
+ import { CapInput, CapButton, CapPopover, CapSelect } from '@capillarytech/cap-react-ui-library/';
19
+ import { makeSelectTemplates, makeSelectTemplatesResponse } from './selectors';
20
+ import { makeSelectCreate as makeSelectCreateSms} from '../Sms/Create/selectors';
21
+ import { makeSelectCreate as makeSelectCreateMobilePush } from '../MobilePush/Create/selectors';
22
+ import { makeSelectEbill as makeSelectCreateEbill } from '../Ebill/selectors';
23
+ import { makeSelectEmail as makeSelectCreateEmail } from '../Email/selectors';
24
+ import { makeSelectEdit } from '../Sms/Edit/selectors';
25
+ import { makeSelectLine } from '../Line/Create/selectors';
26
+ import { UserIsAuthenticated } from '../../utils/authWrapper';
27
+ import messages from './messages';
28
+ import {checkUnicode} from '../../utils/smsCharCountV2';
29
+ import * as actions from './actions';
30
+ import * as smsActions from '../Sms/Create/actions';
31
+ import * as mobilepushActions from '../MobilePush/Create/actions';
32
+ import * as smsEditActions from '../Sms/Edit/actions';
33
+ import * as ebillActions from '../Ebill/actions';
34
+ import * as emailActions from '../Email/actions';
35
+ import * as lineActions from '../Line/Create/actions';
36
+ import CardGrid from '../../components/CardGrid';
37
+ import PreviewSideBar from '../../components/PreviewSideBar';
38
+ import './_templates.scss';
39
+ import * as globalActions from '../../containers/Cap/actions';
40
+ import { makeSelectAuthenticated } from '../Cap/selectors';
41
+ import {getMessageObject} from '../../utils/messageUtils';
42
+ import * as commonUtil from '../../utils/common';
43
+ import SlideBox from '../../components/SlideBox';
44
+ import Pagination from '../../components/Pagination';
45
+ import EmailPreview from '../../components/EmailPreview';
46
+ import WechatRichmediaTemplatePreview from '../../components/TemplatePreview/WechatRichmediaTemplatePreview';
47
+ import { EMAIL } from '../../v2Containers/App/constants';
48
+ import injectSaga from '../../utils/injectSaga';
49
+ import injectReducer from '../../utils/injectReducer';
50
+ import { templateSaga } from './sagas';
51
+ import { createSmsSaga } from '../Sms/Create/sagas';
52
+ import { editSmsSaga } from '../Sms/Edit/sagas';
53
+ import { emailSaga } from '../Email/sagas';
54
+ import reducer from './reducer';
55
+ import mobilePushCreateReducer from '../MobilePush/Create/reducer';
56
+ import lineCreateReducer from '../Line/Create/reducer';
57
+ import { ebillSaga } from '../Ebill/sagas';
58
+ import { lineCreateSaga } from '../Line/Create/sagas';
59
+ import { duplicateMPushSaga } from '../MobilePush/Create/sagas';
60
+ import { FALSE, TRUE, TYPE_EMBEDDED } from './constants';
61
+ import { DEFAULT } from '../../v2Containers/Cap/constants';
62
+
63
+ const MenuItem = Menu.Item;
64
+ const Option = Select.Option;
65
+ const BreadcrumbItem = Breadcrumb.Item;
66
+
67
+ export class Templates extends React.Component { // eslint-disable-line react/prefer-stateless-function
68
+ constructor(props) {
69
+ super(props);
70
+ this.state = {
71
+ channel: '',
72
+ hoveredItem: '',
73
+ clickedItem: '',
74
+ previewOpen: false,
75
+ previewTemplate: {},
76
+ searchText: '',
77
+ sortBy: 'Most Recent',
78
+ selectedAccount: '',
79
+ page: 1,
80
+ perPageLimit: 25,
81
+ templatesCount: 0,
82
+ showEdmEmailTemplates: false,
83
+ showModal: false,
84
+ actionTemplate: {},
85
+ showHtmlPreview: false,
86
+ device: 'desktop',
87
+ searchedTemplates: false,
88
+ defaultAccount: true,
89
+ modeType: null,
90
+ };
91
+ this.handleOnHoverItem = this.handleOnHoverItem.bind(this);
92
+ this.handleOnItemClick = this.handleOnItemClick.bind(this);
93
+ this.handleEditClick = this.handleEditClick.bind(this);
94
+ this.handlePreviewClick = this.handlePreviewClick.bind(this);
95
+ this.createTemplate = this.createTemplate.bind(this);
96
+ this.duplicateTemplate = this.duplicateTemplate.bind(this);
97
+ this.deleteTemplate = this.deleteTemplate.bind(this);
98
+ this.togglePreview = this.togglePreview.bind(this);
99
+ this.searchTemplate = this.searchTemplate.bind(this);
100
+ this.handleSortBy = this.handleSortBy.bind(this);
101
+ this.getCurrentWindow = this.getCurrentWindow.bind(this);
102
+ this.handleFrameTasks = this.handleFrameTasks.bind(this);
103
+ this.startTemplateCreation = this.startTemplateCreation.bind(this);
104
+ this.startLoading = this.startLoading.bind(this);
105
+ this.prepareWeChatPreviewData = this.prepareWeChatPreviewData.bind(this);
106
+ this.prepareWeChatMappedPreviewData = this.prepareWeChatMappedPreviewData.bind(this);
107
+ this.onAccountSelect = this.onAccountSelect.bind(this);
108
+ this.prepareMobilePushPreviewData = this.prepareMobilePushPreviewData.bind(this);
109
+ this.menuOnClickEvent = this.menuOnClickEvent.bind(this);
110
+ }
111
+
112
+ componentWillMount() {
113
+ if (this.state.channel === '') {
114
+ let channel = '';
115
+
116
+ switch (this.props.route.name.toLowerCase()) {
117
+ case "sms":
118
+ channel = 'Sms';
119
+ break;
120
+ case "mobilepush":
121
+ channel = "MobilePush";
122
+ this.props.actions.getWeCrmAccounts(channel);
123
+ break;
124
+ case "wechat":
125
+ channel = 'wechat';
126
+ this.props.actions.getWeCrmAccounts();
127
+ break;
128
+ case "email":
129
+ channel = 'Email';
130
+ break;
131
+ case "ebill":
132
+ channel = 'Ebill';
133
+ break;
134
+ case "line":
135
+ channel = "Line";
136
+ break;
137
+ default:
138
+ channel = '';
139
+ }
140
+ this.setState({ channel });
141
+ this.props.actions.getUserList();
142
+ }
143
+ }
144
+
145
+ componentDidMount() {
146
+ if (this.props.location.query.type === 'embedded' && this.isEnabledInLibraryModule("setLocale")) {
147
+ this.setLocale();
148
+ }
149
+ 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))) {
150
+ const queryParams = {
151
+ // name: this.state.searchText,
152
+ // sortBy: this.state.sortBy,
153
+ };
154
+ if (this.state.channel.toLowerCase() === 'wechat' && !_.isEmpty(this.props.Templates.selectedWeChatAccount)) {
155
+ queryParams.wecrmId = this.props.Templates.selectedWeChatAccount.configs.wecrm_app_id;
156
+ queryParams.wecrmToken = this.props.Templates.selectedWeChatAccount.configs.wecrm_token;
157
+ queryParams.originalId = this.props.Templates.selectedWeChatAccount.sourceAccountIdentifier;
158
+ }
159
+ if (this.state.channel.toLowerCase() === "mobilepush" && !_.isEmpty(this.props.Templates.selectedWeChatAccount)) {
160
+ queryParams.accountId = this.props.Templates.selectedWeChatAccount.id;
161
+ }
162
+ queryParams.page = this.state.page;
163
+ queryParams.perPage = this.state.perPageLimit;
164
+ const channel = this.state.channel;
165
+ this.props.actions.getAllTemplates(channel, queryParams);
166
+ //this.getAllTemplates({});
167
+ // if (this.state.channel.toLowerCase() === "email") {
168
+ // this.props.actions.getEdmDefaultTemplates();
169
+ // }
170
+ }
171
+
172
+ window.addEventListener("message", this.handleFrameTasks);
173
+ }
174
+ componentWillReceiveProps(nextProps) {
175
+
176
+ const params = {
177
+ name: this.state.searchText,
178
+ sortBy: this.state.sortBy,
179
+ };
180
+ if (!_.isEmpty(this.props.TemplatesList) && !this.props.Templates.getAllTemplatesInProgress && this.props.TemplatesList[0] && this.props.TemplatesList[0].totalCount && this.state.templatesCount === 0) {
181
+ this.setState({templatesCount: this.props.TemplatesList[0].totalCount});
182
+ }
183
+ if (!_.isEqual(nextProps.route.name, this.props.route.name)) {
184
+ let channel = '';
185
+ this.props.actions.resetTemplate();
186
+ this.props.actions.resetAccount();
187
+ if (nextProps.route.name.toLowerCase() === 'sms') {
188
+ channel = 'Sms';
189
+ } else if (nextProps.route.name.toLowerCase() === 'wechat') {
190
+ this.setState({defaultAccount: true});
191
+ channel = 'wechat';
192
+ nextProps.actions.getWeCrmAccounts();
193
+ } else if (nextProps.route.name.toLowerCase() === 'email') {
194
+ channel = 'Email';
195
+ // this.props.actions.getEdmDefaultTemplates();
196
+ } else if (nextProps.route.name.toLowerCase() === "mobilepush") {
197
+ this.setState({defaultAccount: true});
198
+ channel = "mobilepush";
199
+ nextProps.actions.getWeCrmAccounts(channel);
200
+ } else if (nextProps.route.name.toLowerCase() === 'ebill') {
201
+ channel = 'Ebill';
202
+ } else if (nextProps.route.name.toLowerCase() === 'line') {
203
+ channel = 'Line';
204
+ }
205
+ //
206
+ this.setState({ channel }, () => {
207
+ 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))) {
208
+ if (this.state.channel.toLowerCase() === 'wechat' && !_.isEmpty(nextProps.Templates.selectedWeChatAccount)) {
209
+ params.wecrmId = (nextProps.Templates.selectedWeChatAccount.configs || {}).wecrm_app_id;
210
+ params.wecrmToken = (nextProps.Templates.selectedWeChatAccount.configs || {}).wecrm_token;
211
+ params.originalId = nextProps.Templates.selectedWeChatAccount.sourceAccountIdentifier;
212
+ }
213
+ if (this.state.channel.toLowerCase() === "mobilepush" && !_.isEmpty(nextProps.Templates.selectedWeChatAccount)) {
214
+ params.accountId = nextProps.Templates.selectedWeChatAccount.id;
215
+ }
216
+ this.getAllTemplates({params}, true);
217
+ }
218
+ });
219
+ }
220
+ if (this.state.channel.toLowerCase() === 'wechat' && nextProps.Templates.selectedWeChatAccount) {
221
+ params.wecrmId = (nextProps.Templates.selectedWeChatAccount.configs || {}).wecrm_app_id;
222
+ params.wecrmToken = (nextProps.Templates.selectedWeChatAccount.configs || {}).wecrm_token;
223
+ params.originalId = nextProps.Templates.selectedWeChatAccount.sourceAccountIdentifier;
224
+ }
225
+ if (this.state.channel.toLowerCase() === "mobilepush" && nextProps.Templates.selectedWeChatAccount) {
226
+ params.accountId = nextProps.Templates.selectedWeChatAccount.id;
227
+ }
228
+ if ((this.state.channel.toLowerCase() === 'wechat' || this.state.channel.toLowerCase() === 'mobilepush') && _.isEmpty(nextProps.Templates.selectedWeChatAccount) && (this.props.location.query.type === 'embedded') && !this.isEnabledInLibraryModule("showAccountSelection")) {
229
+ let selectedAccount = '';
230
+ if (_.isEmpty(nextProps.Templates.weCrmAccounts)) {
231
+ return;
232
+ }
233
+ if (this.state.channel.toLowerCase() === 'wechat') {
234
+ _.forEach(nextProps.Templates.weCrmAccounts, (account) => {
235
+ if (account.configs && account.configs.is_wecrm_enabled) {
236
+ if (nextProps.location.query.source_account_id && account.sourceAccountIdentifier === nextProps.location.query.source_account_id) {
237
+ selectedAccount = account;
238
+ }
239
+ }
240
+ });
241
+ if (!_.isEmpty(selectedAccount)) {
242
+ this.setState({selectedAccount: selectedAccount.name}, () => {
243
+ params.wecrmId = selectedAccount.configs.wecrm_app_id;
244
+ params.wecrmToken = selectedAccount.configs.wecrm_token;
245
+ params.originalId = selectedAccount.sourceAccountIdentifier;
246
+ nextProps.actions.setWeChatAccount(selectedAccount);
247
+ this.getAllTemplates({params});
248
+ });
249
+ }
250
+ } else if (this.state.channel.toLowerCase() === 'mobilepush' && (nextProps.location.query.account_id || nextProps.location.query.source_account_id)) {
251
+ _.forEach(nextProps.Templates.weCrmAccounts, (account) => {
252
+ 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)) {
253
+ selectedAccount = account;
254
+ }
255
+ });
256
+ this.props.actions.setWeChatAccount(selectedAccount);
257
+ params.accountId = Number(nextProps.location.query.account_id);
258
+ this.getAllTemplates({params});
259
+ }
260
+ }
261
+ if (this.state.channel.toLowerCase() === "sms" && nextProps.Create && nextProps.Create.response && nextProps.Create.response.templateId && nextProps.Create.response.templateId !== '') {
262
+ const message = getMessageObject('success', `${this.state.channel} ${this.props.intl.formatMessage(messages.templateDuplicateSuccess)}`, true);
263
+ this.props.globalActions.addMessageToQueue(message);
264
+ this.getAllTemplates({params, resetPage: true});
265
+ this.props.smsActions.clearCreateResponse();
266
+ }
267
+ if (this.state.channel.toLowerCase() === "mobilepush" && nextProps.CreateMobilePush && nextProps.CreateMobilePush.response && nextProps.CreateMobilePush.response.templateId && nextProps.CreateMobilePush.response.templateId !== '') {
268
+ if (this.state.channel.toLowerCase() === "mobilepush" && !_.isEmpty(nextProps.Templates.selectedWeChatAccount)) {
269
+ params.accountId = nextProps.Templates.selectedWeChatAccount.id;
270
+ }
271
+ const message = getMessageObject('success', `${this.state.channel} ${this.props.intl.formatMessage(messages.templateDuplicateSuccess)}`, true);
272
+ this.props.globalActions.addMessageToQueue(message);
273
+ this.getAllTemplates({params});
274
+ this.props.mobilepushActions.clearCreateResponse();
275
+ }
276
+
277
+ if (this.state.channel.toLowerCase() === "ebill" && nextProps.CreateEbill && nextProps.CreateEbill.createResponse && nextProps.CreateEbill.createResponse.templateId && nextProps.CreateEbill.createResponse.templateId !== '') {
278
+ const message = getMessageObject('success', `${this.state.channel} ${this.props.intl.formatMessage(messages.templateDuplicateSuccess)}`, true);
279
+ this.props.globalActions.addMessageToQueue(message);
280
+ this.getAllTemplates({params, resetPage: true});
281
+ this.props.ebillActions.clearStoreValues();
282
+ }
283
+
284
+ if (this.state.channel.toLowerCase() === "email" && nextProps.EmailCreate && nextProps.EmailCreate.createResponse && nextProps.EmailCreate.createResponse.templateId && nextProps.EmailCreate.createResponse.templateId !== '') {
285
+ const message = getMessageObject('success', `${this.state.channel} ${this.props.intl.formatMessage(messages.templateDuplicateSuccess)}`, true);
286
+ this.props.globalActions.addMessageToQueue(message);
287
+ this.getAllTemplates({params, resetPage: true});
288
+ this.props.emailActions.clearStoreValues();
289
+ }
290
+
291
+ if (this.state.channel.toLowerCase() === "line" && nextProps.Line && nextProps.Line.response && nextProps.Line.response.templateId && nextProps.Line.response.templateId !== '') {
292
+ const message = getMessageObject('success', `${this.state.channel} ${this.props.intl.formatMessage(messages.templateDuplicateSuccess)}`, true);
293
+ this.props.globalActions.addMessageToQueue(message);
294
+ this.getAllTemplates({params, resetPage: true});
295
+ this.props.lineActions.clearCreateResponse();
296
+ }
297
+
298
+ if (nextProps.Create && this.props.Create && nextProps.Create.createTemplateError && !_.isEqual(nextProps.Create.createTemplateError, this.props.Create.createTemplateError)) {
299
+ const message = getMessageObject('error', this.props.intl.formatMessage(messages.somethingWentWrong), true);
300
+ this.props.globalActions.addMessageToQueue(message);
301
+ if (this.state.channel.toLowerCase() === "sms") {
302
+ this.props.smsActions.clearCreateResponse();
303
+ } else if (this.state.channel.toLowerCase() === "mobilepush") {
304
+ this.props.mobilepushActions.clearCreateResponse();
305
+ } else if (this.state.channel.toLowerCase() === "ebill") {
306
+ this.props.ebillActions.clearCreateResponse();
307
+ } else if (this.state.channel.toLowerCase() === "line") {
308
+ this.props.lineActions.clearCreateResponse();
309
+ }
310
+ }
311
+
312
+ if (nextProps.Edit && nextProps.Edit.editResponse && nextProps.Edit.editResponse.templateId && nextProps.Edit.editResponse.templateId !== '') {
313
+ this.props.smsEditActions.clearEditResponse();
314
+ }
315
+ if (!nextProps.Templates.deleteTemplateInProgress && !_.isEqual(nextProps.Templates.deleteTemplateInProgress, this.props.Templates.deleteTemplateInProgress) &&
316
+ nextProps.Templates.deleteResponse) {
317
+
318
+ const message = getMessageObject('success', `${this.state.channel.toUpperCase()} ${this.props.intl.formatMessage(messages['Template deleted successfully'])}`, true);
319
+ nextProps.globalActions.addMessageToQueue(message);
320
+ this.getAllTemplates({params, resetPage: true});
321
+ }
322
+
323
+ if (!nextProps.Templates.sendingFile && !_.isEqual(this.props.Templates.sendingFile, nextProps.Templates.sendingFile) && !nextProps.Templates.errorSendingFile) {
324
+
325
+ const module = this.props.location.query.module ? this.props.location.query.module : 'default';
326
+ const isLanguageSupport = (this.props.location.query.isLanguageSupport) ? this.props.location.query.isLanguageSupport : true;
327
+ const isEdmSupport = (this.props.location.query.isEdmSupport !== "false") || false;
328
+ const type = this.props.location.querytype;
329
+ if (this.isEnabledInLibraryModule("callCreateFromProps")) {
330
+ this.props.createNew();
331
+ return;
332
+ }
333
+ this.props.router.push({
334
+ pathname: `/${(nextProps.route.name || '').toLowerCase()}/create`,
335
+ search: commonUtil.createQueryString(type === 'embedded' ? {type: 'embedded', module, isLanguageSupport, isEdmSupport} : {module}),
336
+ });
337
+ }
338
+
339
+ if (!nextProps.Templates.sendingFile && !_.isEqual(this.props.Templates.sendingFile, nextProps.Templates.sendingFile) && nextProps.Templates.errorSendingFile) {
340
+ let errorMessage = this.props.intl.formatMessage(messages.zipUploadFailed);
341
+ if (nextProps.Templates.errorMessage && nextProps.Templates.errorMessage !== "") {
342
+ errorMessage = nextProps.Templates.errorMessage;
343
+ }
344
+ const message = getMessageObject('error', errorMessage, true);
345
+ nextProps.globalActions.addMessageToQueue(message);
346
+ }
347
+
348
+ if (!_.isEmpty(nextProps.Templates.templateDetails) && !_.isEqual(nextProps.Templates.templateDetails, this.props.Templates.templateDetails)) {
349
+ this.setState({previewTemplate: nextProps.Templates.templateDetails});
350
+ }
351
+
352
+ if (nextProps.Templates.weCrmAccounts !== undefined && nextProps.Templates.weCrmAccounts.length === 1 && this.state.defaultAccount && (['wechat', 'mobilepush'].indexOf(this.state.channel.toLowerCase()) > -1)) {
353
+ const paramsDefault = {
354
+ name: this.state.searchText,
355
+ sortBy: this.state.sortBy,
356
+ };
357
+ if (this.state.channel.toLowerCase() === 'wechat') {
358
+ paramsDefault.wecrmId = nextProps.Templates.weCrmAccounts[0].configs.wecrm_app_id;
359
+ paramsDefault.wecrmToken = nextProps.Templates.weCrmAccounts[0].configs.wecrm_token;
360
+ paramsDefault.originalId = nextProps.Templates.weCrmAccounts[0].sourceAccountIdentifier;
361
+ nextProps.actions.setWeChatAccount(nextProps.Templates.weCrmAccounts[0]);
362
+ } else if (this.state.channel.toLowerCase() === 'mobilepush') {
363
+ nextProps.actions.setWeChatAccount(nextProps.Templates.weCrmAccounts[0]);
364
+ paramsDefault.accountId = nextProps.Templates.weCrmAccounts[0].id;
365
+ }
366
+ this.setState({defaultAccount: false});
367
+ this.getAllTemplates({params: paramsDefault}, true);
368
+ }
369
+ }
370
+
371
+ componentWillUnmount() {
372
+
373
+ window.removeEventListener("message", this.handleFrameTasks);
374
+ this.props.actions.resetTemplateStoreData();
375
+ // this.setState({defaultAccount: false});
376
+ }
377
+
378
+ onAccountSelect(value, option) {
379
+
380
+ this.setState({selectedAccount: value}, () => {
381
+ const params = {
382
+ name: this.state.searchText,
383
+ sortBy: this.state.sortBy,
384
+ };
385
+ if (this.state.channel.toLowerCase() === 'wechat') {
386
+ params.wecrmId = this.props.Templates.weCrmAccounts[_.findIndex(this.props.Templates.weCrmAccounts, { name: value})].configs.wecrm_app_id;
387
+ params.wecrmToken = this.props.Templates.weCrmAccounts[_.findIndex(this.props.Templates.weCrmAccounts, { name: value})].configs.wecrm_token;
388
+ this.props.actions.setWeChatAccount(this.props.Templates.weCrmAccounts[_.findIndex(this.props.Templates.weCrmAccounts, { name: value})]);
389
+ params.originalId = this.props.Templates.weCrmAccounts[_.findIndex(this.props.Templates.weCrmAccounts, { name: value})].sourceAccountIdentifier;
390
+ } else if (this.state.channel.toLowerCase() === 'mobilepush') {
391
+ this.props.actions.setWeChatAccount(this.props.Templates.weCrmAccounts[_.findIndex(this.props.Templates.weCrmAccounts, { name: value})]);
392
+ params.accountId = this.props.Templates.weCrmAccounts[_.findIndex(this.props.Templates.weCrmAccounts, { name: value})].id;
393
+ }
394
+
395
+ this.getAllTemplates({params, resetPage: true});
396
+ });
397
+ }
398
+
399
+ setLocale = () => {
400
+ const user = localStorage.getItem('user');
401
+ let locale = 'en';
402
+ if (user) {
403
+ locale = JSON.parse(user).lang;
404
+ }
405
+ locale = this.getMappedLocale(locale);
406
+ //locale = 'zh';
407
+
408
+ moment.locale(locale);
409
+ };
410
+
411
+ getMappedLocale = (locale) => {
412
+ const map = {
413
+ 'en': 'en',
414
+ 'zh-cn': 'zh',
415
+ };
416
+ return map[locale];
417
+ };
418
+
419
+ getAllTemplates = ({params, getNextPage, resetPage}, resetTemplates) => {
420
+ let queryParams = params;
421
+ let page = this.state.page;
422
+
423
+ if (resetTemplates) {
424
+ queryParams.name = this.state.searchText;
425
+ queryParams.sortBy = this.state.sortBy;
426
+ queryParams.page = this.state.page;
427
+ queryParams.perPage = this.state.perPageLimit;
428
+ const channel = this.state.channel;
429
+ this.props.actions.getAllTemplates(channel, queryParams);
430
+ } else if ((resetPage || (page === 1 && this.state.templatesCount === 0) || page <= (this.state.templatesCount / this.state.perPageLimit))) {
431
+ if (getNextPage) {
432
+ page += 1;
433
+ }
434
+ let templatesCount = this.state.templatesCount;
435
+ if (resetPage) {
436
+ page = 1;
437
+ templatesCount = 0;
438
+ }
439
+ if (!params || _.isEmpty(params)) {
440
+ queryParams = {
441
+ name: this.state.searchText,
442
+ sortBy: this.state.sortBy,
443
+ };
444
+ if (this.state.channel.toLowerCase() === 'wechat' && !_.isEmpty(this.props.Templates.selectedWeChatAccount)) {
445
+ queryParams.wecrmId = this.props.Templates.selectedWeChatAccount.configs.wecrm_app_id;
446
+ queryParams.wecrmToken = this.props.Templates.selectedWeChatAccount.configs.wecrm_token;
447
+ queryParams.originalId = this.props.Templates.selectedWeChatAccount.sourceAccountIdentifier;
448
+ }
449
+ if (this.state.channel.toLowerCase() === "mobilepush" && !_.isEmpty(this.props.Templates.selectedWeChatAccount)) {
450
+ queryParams.accountId = this.props.Templates.selectedWeChatAccount.id;
451
+ if (this.state.mode) {
452
+ queryParams.mode = this.state.mode.toLowerCase();
453
+ }
454
+ }
455
+ }
456
+ this.setState({page, templatesCount}, () => {
457
+ queryParams.page = page;
458
+ queryParams.perPage = this.state.perPageLimit;
459
+ const channel = this.state.channel;
460
+ this.props.actions.getAllTemplates(channel, queryParams);
461
+ });
462
+ }
463
+ };
464
+
465
+ getCurrentWindow(e) {
466
+
467
+ const response = {
468
+ action: e.action,
469
+ value: 'templates',
470
+ direction: e.value,
471
+ };
472
+ parent.postMessage(JSON.stringify(response), '*');
473
+ }
474
+
475
+ skipTemplateSelection = (e) => {
476
+
477
+ const type = this.props.location.query.type;
478
+ const module = (type === 'embedded') ? this.props.location.query.module : 'default';
479
+ if (this.state.channel.toLowerCase() === 'email') {
480
+ const isLanguageSupport = this.props.location.query.isLanguageSupport || false;
481
+ this.props.router.push({
482
+ pathname: `/email/view`,
483
+ search: commonUtil.createQueryString(type === 'embedded' ? {type: 'embedded', module, isLanguageSupport} : {})
484
+ });
485
+ } else if (this.state.channel.toLowerCase() === 'sms') {
486
+ this.props.router.push({
487
+ pathname: `/sms/view`,
488
+ search: commonUtil.createQueryString(type === 'embedded' ? {type: 'embedded', module} : {})
489
+ });
490
+ } else if (this.state.channel.toLowerCase() === 'mobilepush') {
491
+ this.props.router.push({
492
+ pathname: `/mobilepush/edit/${e.template_id}`,
493
+ search: commonUtil.createQueryString(type === 'embedded' ? {type: 'embedded', module, account_id: e.account_id} : {})
494
+ });
495
+ } else if (this.state.channel.toLowerCase() === 'wechat') {
496
+ if (e.template_type && e.template_type === 'RICHMEDIA_WECHAT_TEMPLATE') {
497
+ this.props.router.push({
498
+ pathname: `/wechat/richmedia/edit/${e.template_id}`,
499
+ search: commonUtil.createQueryString(type === 'embedded' ? {type: 'embedded', module, source_account_id: e.source_account_id} : {})
500
+ });
501
+ } else {
502
+ this.props.router.push({
503
+ pathname: `/wechat/edit/${e.template_id}`,
504
+ search: commonUtil.createQueryString(type === 'embedded' ? {type: 'embedded', module, source_account_id: e.source_account_id} : {})
505
+ });
506
+ }
507
+ } else if (this.state.channel.toLowerCase() === 'line') {
508
+ this.props.router.push({
509
+ pathname: `/line/view/${e.msg_type}/`,
510
+ search: commonUtil.createQueryString(type === 'embedded' ? {type: 'embedded', module, account_id: e.account_id } : {})
511
+ });
512
+ }
513
+ this.setState({loading: true});
514
+ }
515
+
516
+ handleMenuAction = (item = {}, key) => {
517
+
518
+ if ((item.key || '').toLowerCase() === 'uploadfile') {
519
+ document.getElementById('filename').click();
520
+
521
+ } else if ((item.key || '').toLowerCase() === 'useeditor') {
522
+
523
+ this.toggleEdmEmailTemplateSelection();
524
+ }
525
+ };
526
+
527
+ handleBlankTemplateAction = (item, channel) => {
528
+ const type = this.props.location.query.type;
529
+ const module = this.props.location.query.module ? this.props.location.query.module : 'default';
530
+ if (item === "uploadFile") {
531
+ document.getElementById('filename').click();
532
+ } else if (item === "editor") {
533
+ this.toggleEdmEmailTemplateSelection();
534
+ } else if (this.isEnabledInLibraryModule("callCreateFromProps")) {
535
+ this.props.createNew(item);
536
+ } else if (item === 'textTemplate') {
537
+ this.props.router.push({
538
+ pathname: `/${channel === 'line' ? 'line' : 'mobilepush'}/create/text`,
539
+ search: commonUtil.createQueryString(type === 'embedded' ? {type: 'embedded', module} : {module},)
540
+ });
541
+ } else if (item === 'imageTemplate') {
542
+ this.props.router.push({
543
+ pathname: `/${channel === 'line' ? 'line' : 'mobilepush'}/create/image`,
544
+ search: commonUtil.createQueryString(type === 'embedded' ? {type: 'embedded', module} : {module})
545
+ });
546
+ }
547
+ }
548
+
549
+ handleFileUpload = (e, {files}) => {
550
+ if (files.length === 0) {
551
+ return;
552
+ }
553
+ const fileExtension = files[0].name.split('.').pop();
554
+ const supportedZipFormats = ['zip'];
555
+ const module = this.props.location.query.module ? this.props.location.query.module : 'default';
556
+ const isLanguageSupport = this.props.location.query.isLanguageSupport ? this.props.location.query.isLanguageSupport : true;
557
+ const isEdmSupport = (this.props.location.query.isEdmSupport !== "false") || false;
558
+
559
+ if (supportedZipFormats.indexOf(fileExtension.toLowerCase()) !== -1) {
560
+
561
+ this.props.actions.handleZipUpload(files[0]);
562
+ document.getElementById("filename").value = "";
563
+ } else if (fileExtension === 'html' || fileExtension === 'htm') {
564
+
565
+ const reader = new FileReader();
566
+ reader.onload = () => {
567
+ const text = reader.result;
568
+ this.props.actions.handleHtmlUpload(text);
569
+ document.getElementById("filename").value = "";
570
+ const type = this.props.location.query.type;
571
+ if (this.isEnabledInLibraryModule("callCreateFromProps")) {
572
+ this.props.createNew();
573
+ return;
574
+ }
575
+ this.props.router.push({
576
+ pathname: `/${this.props.route.name.toLowerCase()}/create`,
577
+ search: commonUtil.createQueryString(type === 'embedded' ? {type: 'embedded', module, isLanguageSupport, isEdmSupport} : {module}),
578
+ });
579
+ };
580
+ reader.readAsText(files[0]);
581
+ } else {
582
+ const message = getMessageObject('error', this.props.intl.formatMessage(messages.invalidUploadFileError), true);
583
+ this.props.globalActions.addMessageToQueue(message);
584
+ }
585
+ };
586
+
587
+ prepareWeChatPreviewData(template) {
588
+ if (template && template.versions && template.versions.base && !_.isEmpty(template.versions.base)) {
589
+ if (template.definition && template.definition.msgcontent && template.definition.msgcontent === "RICH_MEDIA_WECHAT") {
590
+ return template.versions.base.mediaList;
591
+ }
592
+ return this.prepareWeChatMappedPreviewData(template.versions.base.content, template.versions.base.Tag, template.versions.base.data);
593
+ }
594
+ return 'wrong template';
595
+ }
596
+
597
+ prepareWeChatMappedPreviewData(content, templateTags, tagData) {
598
+ let formattedContent = _.cloneDeep(content);
599
+ _.forEach(templateTags, (tag) => {
600
+ if (tagData[tag].value !== undefined) {
601
+ formattedContent = formattedContent.replace(`{{${tag}.DATA}}`, tagData[tag].value);
602
+ }
603
+ });
604
+ return formattedContent;
605
+ }
606
+
607
+ prepareMobilePushPreviewData(content) {
608
+ let result;
609
+ if (content.ANDROID) {
610
+ const data = content.ANDROID;
611
+ const bodyTextStyle = { WebkitLineClamp: 12};
612
+ if (data.expandableDetails && data.expandableDetails.ctas && ((data.expandableDetails.ctas[0] && data.expandableDetails.ctas[0].actionText) || (data.expandableDetails.ctas[1] && data.expandableDetails.ctas[1].actionText))) {
613
+ bodyTextStyle.WebkitLineClamp = 10;
614
+ }
615
+ if (data.expandableDetails && data.expandableDetails.image) {
616
+ bodyTextStyle.WebkitLineClamp = 3;
617
+ }
618
+ result = (
619
+ <div className="android-push-message-Container">
620
+ <div className="message-pop align-left">
621
+ <div className="message-container">
622
+ <div className="app-name">
623
+ <span className="app-icon"></span> {this.props.Templates.selectedWeChatAccount && this.props.Templates.selectedWeChatAccount.name ? this.props.Templates.selectedWeChatAccount.name : "App name"}
624
+ </div>
625
+ <div className="title">
626
+ {data.title}
627
+ </div>
628
+ <div className="body-text" style={bodyTextStyle} >
629
+ {data.message}
630
+ </div>
631
+ {data.expandableDetails && data.expandableDetails.image && <div className="body-image">
632
+ <img src={data.expandableDetails.image} alt=""/>
633
+ </div>}
634
+ {(data.expandableDetails && data.expandableDetails.ctas && ((data.expandableDetails.ctas[0] && data.expandableDetails.ctas[0].actionText) || (data.expandableDetails.ctas[1] && data.expandableDetails.ctas[1].actionText))) ?
635
+ <div className="actions">
636
+ {_.map(data.expandableDetails.ctas, (action) => !!action.actionText &&
637
+ <span className="action">{action.actionText && action.actionText.toUpperCase()}</span>)}
638
+ </div>
639
+ : ''
640
+ }
641
+ </div>
642
+ </div>
643
+ </div>);
644
+ } else if (content.IOS) {
645
+ const data = content.IOS;
646
+ const bodyTextStyle = { WebkitLineClamp: 11};
647
+ if (data.expandableDetails && data.expandableDetails.ctas && data.expandableDetails.ctas[0] && data.expandableDetails.ctas[0].actionText) {
648
+ bodyTextStyle.WebkitLineClamp = 6;
649
+ }
650
+ if (data.expandableDetails && data.expandableDetails.image) {
651
+ bodyTextStyle.WebkitLineClamp = 1;
652
+ }
653
+ const iosActions = [];
654
+ if (data.expandableDetails.ctas && data.expandableDetails.ctas.length) {
655
+ if (data.expandableDetails.ctas[0].actionLabel) {
656
+ iosActions.push(<div className="actions">
657
+ <span className="action">{data.expandableDetails.ctas[0].actionLabel.toUpperCase()}</span>
658
+ </div>);
659
+ }
660
+ if (data.expandableDetails.ctas[0].actionLabel2) {
661
+ iosActions.push(<div className="actions">
662
+ <span className="action">{data.expandableDetails.ctas[0].actionLabel2.toUpperCase()}</span>
663
+ </div>);
664
+ }
665
+ }
666
+
667
+ result = (
668
+ <div className="iphone-push-message-Container">
669
+ <div className="message-pop align-left">
670
+ <div className="message-container">
671
+ <div className="app-name">
672
+ <span className="app-icon"></span>{this.props.Templates.selectedWeChatAccount && this.props.Templates.selectedWeChatAccount.name ? this.props.Templates.selectedWeChatAccount.name : "App name"} <i className="material-icons">close</i>
673
+ </div>
674
+ {data.expandableDetails && data.expandableDetails.image && <div className={`body-image ${iosActions.length > 0 ? 'image-half' : ''}`}>
675
+ <img src={data.expandableDetails.image} alt=""/>
676
+ </div>}
677
+ <div className="title">
678
+ {data.title}
679
+ </div>
680
+ <div className="body-text" style={bodyTextStyle}>
681
+ {data.message}
682
+ </div>
683
+ {data.expandableDetails && data.expandableDetails.ctas && data.expandableDetails.ctas[0] && data.expandableDetails.ctas[0].actionText ? iosActions : ''}
684
+ </div>
685
+ </div>
686
+ </div>);
687
+ }
688
+ return result;
689
+ }
690
+ startLoading(ifEdit) {
691
+
692
+ if (ifEdit) {
693
+ this.setState({loading: true});
694
+ }
695
+ }
696
+
697
+ startTemplateCreation(data) {
698
+
699
+ if (data.edit) {
700
+ const ifUnicode = checkUnicode(data.content);
701
+
702
+ const content = data.content;
703
+ const tempData = {
704
+ 'sms-editor': content,
705
+ 'unicode-validity': ifUnicode,
706
+ 'base': true,
707
+ };
708
+ const formData = {};
709
+ formData[0] = tempData;
710
+ formData.base = tempData;
711
+ this.setState({formData, loading: false});
712
+ }
713
+ }
714
+
715
+ handleFrameTasks = (e) => {
716
+
717
+ const type = e.data;
718
+ if (typeof type === 'object') {
719
+
720
+ const action = type.action;
721
+ switch (action) {
722
+ case "startTemplateCreation":
723
+ this.startTemplateCreation(type.value);
724
+ break;
725
+ case "startLoading":
726
+ this.startLoading(type.edit);
727
+ break;
728
+ case "getCurrentWindow":
729
+ this.getCurrentWindow(e.data);
730
+ break;
731
+ case "skipTemplateSelection":
732
+ this.skipTemplateSelection(e.data);
733
+ break;
734
+ default:
735
+ break;
736
+ }
737
+ }
738
+ switch (type) {
739
+ case "startTemplateCreation":
740
+
741
+ //this.getFormData(e);
742
+ break;
743
+ case "validateContent":
744
+
745
+ this.validateContent(e);
746
+ break;
747
+ default:
748
+ break;
749
+ }
750
+ };
751
+
752
+ createTemplate(ev) {
753
+
754
+ const type = this.props.location.query.type;
755
+ const module = this.props.location.query.module ? this.props.location.query.module : 'default';
756
+ const channel = this.state.channel.toLowerCase();
757
+ //const keyType = ev.key && ev.key.toLowerCase() !== undefined ? ev.state.toLowerCase() : '';
758
+ if (this.isEnabledInLibraryModule("callCreateFromProps")) {
759
+ this.props.createNew();
760
+ } else if (ev.key && (ev.key.toLowerCase() === "text" || ev.key.toLowerCase() === "image")) {
761
+ this.props.router.push({
762
+ pathname: `/${channel === 'line' ? 'line' : 'mobilepush'}/create/${ev.key.toLowerCase()}`,
763
+ search: commonUtil.createQueryString(type === 'embedded' ? {type: 'embedded', module} : {module}),
764
+ });
765
+ } else {
766
+ this.props.router.push({
767
+ pathname: `/${this.state.channel.toLowerCase()}/create`,
768
+ search: commonUtil.createQueryString(type === 'embedded' ? {type: 'embedded', module} : {module}),
769
+ });
770
+ }
771
+ }
772
+
773
+ menuOnClickEvent(ev) {
774
+ let type = this.props.location.query.type;
775
+ const channel = this.state.channel.toLowerCase();
776
+ switch (channel) {
777
+ case 'wechat':
778
+ if (ev && ev.key && ev.key.toLowerCase() === "map_template") {
779
+ type = this.props.location.query.type;
780
+ this.props.router.push({
781
+ pathname: `/wechat/create`,
782
+ search: commonUtil.createQueryString(type === 'embedded' ? {type: 'embedded'} : {}),
783
+ });
784
+ } else if (ev && ev.key && ev.key.toLowerCase() === "richmedia_template") {
785
+ type = this.props.location.query.type;
786
+ 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))) {
787
+ const errorMessage = this.props.intl.formatMessage(messages.wechatAccountNotConfigured);
788
+ const message = getMessageObject('error', errorMessage, true);
789
+ this.props.globalActions.addMessageToQueue(message);
790
+ } else {
791
+ this.props.router.push(`/wechat/richmedia/create?type=embedded`);
792
+ }
793
+ }
794
+ break;
795
+ default:
796
+ this.props.router.push({
797
+ pathname: `*`,
798
+ });
799
+ break;
800
+ }
801
+ }
802
+
803
+ searchTemplate(data) {
804
+
805
+ this.setState({searchText: data}, () => {
806
+ const params = {
807
+ name: this.state.searchText,
808
+ sortBy: this.state.sortBy,
809
+ };
810
+ if (this.state.channel.toLowerCase() === 'wechat') {
811
+ params.wecrmId = this.props.Templates.selectedWeChatAccount.configs.wecrm_app_id;
812
+ params.wecrmToken = this.props.Templates.selectedWeChatAccount.configs.wecrm_token;
813
+ params.originalId = this.props.Templates.selectedWeChatAccount.sourceAccountIdentifier;
814
+ }
815
+ if (this.state.channel.toLowerCase() === "mobilepush") {
816
+ params.accountId = this.props.Templates.selectedWeChatAccount.id;
817
+ }
818
+ this.getAllTemplates({params, resetPage: true});
819
+ });
820
+ }
821
+
822
+ handleSortBy(data) {
823
+ this.setState({sortBy: data}, () => {
824
+ const params = {
825
+ name: this.state.searchText,
826
+ sortBy: this.state.sortBy,
827
+ };
828
+ if (this.state.channel.toLowerCase() === 'wechat') {
829
+ params.wecrmId = this.props.Templates.selectedWeChatAccount.configs.wecrm_app_id;
830
+ params.wecrmToken = this.props.Templates.selectedWeChatAccount.configs.wecrm_token;
831
+ params.originalId = this.props.Templates.selectedWeChatAccount.sourceAccountIdentifier;
832
+ }
833
+ if (this.state.channel.toLowerCase() === "mobilepush") {
834
+ params.accountId = this.props.Templates.selectedWeChatAccount.id;
835
+ }
836
+ this.getAllTemplates({params, resetPage: true});
837
+ });
838
+ }
839
+ handleType = (data = {}) => {
840
+ this.setState({mode: data}, () => {
841
+ const params = {
842
+ name: this.state.searchText,
843
+ sortBy: this.state.sortBy,
844
+ };
845
+ if (this.state.channel.toLowerCase() === "mobilepush") {
846
+ params.accountId = this.props.Templates.selectedWeChatAccount.id;
847
+ }
848
+ if ( (this.state.channel.toLowerCase() === 'mobilepush' || this.state.channel.toLowerCase() === 'line') && data.toLowerCase() !== "all") {
849
+ params.mode = this.state.mode.toLowerCase();
850
+ }
851
+ this.getAllTemplates({params, resetPage: true});
852
+ });
853
+ };
854
+ togglePreview() {
855
+ if (this.state.channel.toLowerCase() === 'ebill' || this.state.channel.toLowerCase() === 'email') {
856
+ this.toggleEmailPreview();
857
+ } else {
858
+
859
+ this.setState( (prevState) => ({
860
+ previewOpen: !prevState.previewOpen}));
861
+ }
862
+ }
863
+
864
+ toggleEdmEmailTemplateSelection = () => {
865
+
866
+ this.setState( (prevState) => ({
867
+ showEdmEmailTemplates: !prevState.showEdmEmailTemplates}), () => {
868
+ this.props.actions.getEdmDefaultTemplates();
869
+ });
870
+ };
871
+
872
+ deleteTemplate(template) {
873
+
874
+ this.props.actions.deleteTemplate(this.state.channel.toUpperCase(), template._id);
875
+ this.setState({actionTemplate: {}});
876
+ }
877
+
878
+ duplicateTemplate(template) {
879
+
880
+ const duplicateObj = _.cloneDeep(template);
881
+ duplicateObj.name = `${this.props.intl.formatMessage(messages.copyOf)} ${template.name} ${moment().format('MM-DD-YYYY HH:mm:ss')}`;
882
+ delete duplicateObj._id;
883
+ if (this.state.channel.toLowerCase() === "sms") {
884
+ this.props.smsActions.createTemplate(duplicateObj);
885
+ } else if (this.state.channel.toLowerCase() === "mobilepush") {
886
+ duplicateObj.definition.accountId = this.props.Templates.selectedWeChatAccount.id;
887
+ this.props.mobilepushActions.createTemplate(duplicateObj);
888
+ } else if (this.state.channel.toLowerCase() === "ebill") {
889
+ this.props.ebillActions.createTemplate(duplicateObj);
890
+ } else if (this.state.channel.toLowerCase() === "email") {
891
+ this.props.emailActions.duplicateTemplate(template._id, "EMAIL");
892
+ } else if (this.state.channel.toLowerCase() === "line") {
893
+ this.props.lineActions.createTemplate(duplicateObj, (response) => {
894
+ const params = {
895
+ name: this.state.searchText,
896
+ sortBy: this.state.sortBy,
897
+ };
898
+ this.getAllTemplates({params, resetPage: true});
899
+ });
900
+ }
901
+ }
902
+
903
+ handleOnHoverItem(isHovering, id) {
904
+
905
+ if (isHovering) {
906
+ this.setState({hoveredItem: id});
907
+ } else {
908
+ this.setState({hoveredItem: ''});
909
+ }
910
+ }
911
+
912
+ handleOnItemClick(isClicked, id) {
913
+
914
+ this.setState({clickedItem: id});
915
+ }
916
+
917
+ handleEdmDefaultTemplateSelection = (isSelected, id) => {
918
+ if (isSelected) {
919
+ const template = _.find(this.props?.Templates?.cmsTemplates, (template = []) => {
920
+ return template?.versions && template?.versions?.base && _.get(template, 'versions.base.drag_drop_id') === id;
921
+ });
922
+ const {type,module = DEFAULT} = this.props?.location?.query;
923
+ const isLanguageSupport = this.props?.location?.query?.isLanguageSupport === TRUE;
924
+ const isEdmSupport = this.props?.location?.query?.isEdmSupport !== FALSE;
925
+ let getQuery = '';
926
+
927
+ if (template) {
928
+ this.props.actions.setEdmTemplate({
929
+ ...template,
930
+ isEdmSupport,
931
+ isLanguageSupport,
932
+ projectId: template?.versions?.base?.drag_drop_id,
933
+ });
934
+
935
+ if (this.state.channel && this.state.channel.toLowerCase() === EMAIL) {
936
+ getQuery = (type === TYPE_EMBEDDED) ? {
937
+ type: TYPE_EMBEDDED,
938
+ module,
939
+ isLanguageSupport: isLanguageSupport ? 1 : 0,
940
+ isEdmSupport: isEdmSupport ? 1 : 0,
941
+ projectId: template?.versions?.base?.drag_drop_id,
942
+ } : {
943
+ module,
944
+ isLanguageSupport: isLanguageSupport ? 1 : 0,
945
+ isEdmSupport: isEdmSupport ? 1 : 0,
946
+ projectId: template?.versions?.base?.drag_drop_id,
947
+ };
948
+ } else {
949
+ getQuery = (type === TYPE_EMBEDDED) ? {type: TYPE_EMBEDDED, module} : {module};
950
+ }
951
+
952
+ if (this.isEnabledInLibraryModule("callCreateFromProps")) {
953
+ this.props.createNew();
954
+ return;
955
+ }
956
+
957
+ this.props.router.push({
958
+ pathname: `/${this.state.channel.toLowerCase()}/create`,
959
+ search: commonUtil.createQueryString(getQuery),
960
+ });
961
+ }
962
+ }
963
+ };
964
+
965
+ handleEditClick(e, id, modeType, path) {
966
+
967
+ if (modeType && modeType !== undefined) {
968
+ this.setState({modeType});
969
+ }
970
+ const type = this.props.location.query.type;
971
+ const module = this.props.location.query.module;
972
+ const isLanguageSupport = (this.props.location.query.isLanguageSupport) ? this.props.location.query.isLanguageSupport : false;
973
+ const isEdmSupport = (this.props.location.query.isEdmSupport !== "false") || false;
974
+ let getQuery = "";
975
+ let pathName = path;
976
+
977
+ e.stopPropagation();
978
+
979
+ this.props.actions.resetTemplateData();
980
+ if (this.state.channel.toLowerCase() === 'sms') {
981
+ pathName = `/sms/edit/${id}`;
982
+ }
983
+ if (this.state.channel.toLowerCase() === 'mobilepush') {
984
+ pathName = `/mobilepush/edit/${id}`;
985
+ }
986
+ if (this.state.channel.toLowerCase() === 'email') {
987
+ pathName = `/email/edit/${id}`;
988
+ }
989
+ if (this.state.channel.toLowerCase() === 'email') {
990
+ getQuery = type === 'embedded' ? {type: 'embedded', module, isLanguageSupport, isEdmSupport} : {module, isEdmSupport};
991
+ } else {
992
+ getQuery = type === 'embedded' ? {type: 'embedded', module, account_id: this.props.location.query.account_id} : {module};
993
+ }
994
+ if (this.state.channel.toLowerCase() === 'ebill') {
995
+ pathName = `/ebill/edit/${id}`;
996
+ }
997
+ if (this.state.channel.toLowerCase() === 'line') {
998
+ pathName = `/line/edit/${modeType}/${id}`;
999
+ }
1000
+ if (this.isEnabledInLibraryModule("callSelectFromProps")) {
1001
+ this.props.onSelectTemplate(id);
1002
+ } else {
1003
+ if (this.state.channel.toLowerCase() === 'ebill') {
1004
+ pathName = `/ebill/edit/${id}`;
1005
+ }
1006
+ //getQuery
1007
+ this.props.router.push({
1008
+ pathname: pathName,
1009
+ search: commonUtil.createQueryString(getQuery),
1010
+ });
1011
+ }
1012
+ }
1013
+
1014
+ handlePreviewClick(template, modeType) {
1015
+ this.togglePreview();
1016
+ const templateInfo = _.cloneDeep(template);
1017
+ if (this.state.channel.toLowerCase() === 'line') {
1018
+ templateInfo.modeType = modeType;
1019
+ }
1020
+ templateInfo.updatedByName = commonUtil.getUserNameById(parseInt(template.updatedBy, 10), commonUtil.getMergedUserList(this.props.Templates.userList));
1021
+ if (this.state.channel === 'wechat') {
1022
+ templateInfo.content = this.prepareWeChatPreviewData(template);
1023
+ } else if (this.state.channel.toLowerCase() === "mobilepush") {
1024
+ templateInfo.content = template.versions.base;
1025
+ templateInfo.appName = this.props.Templates.selectedWeChatAccount.name;
1026
+ } else if (this.state.channel.toLowerCase() === "email") {
1027
+
1028
+ this.props.actions.getTemplateDetails(template._id, EMAIL);
1029
+ } else if (this.state.channel.toLowerCase() === 'ebill') {
1030
+ this.props.actions.getTemplateDetails(template._id);
1031
+ }
1032
+ if (this.state.channel.toLowerCase() !== 'ebill') {
1033
+ this.setState({previewTemplate: templateInfo});
1034
+ }
1035
+ }
1036
+
1037
+ toggleDeleteTemplateModal = (template) => {
1038
+ this.setState({actionTemplate: template}, () => {
1039
+ this.setState({showModal: true});
1040
+ });
1041
+ }
1042
+
1043
+ handleOk = () => {
1044
+ this.setState({showModal: false});
1045
+ this.deleteTemplate(this.state.actionTemplate);
1046
+ }
1047
+
1048
+ handleCancel = () => {
1049
+ this.setState({showModal: false});
1050
+ }
1051
+
1052
+ populateTemplatesList = (data, blankTemplateRequired, layoutSelection) => {
1053
+ if (!data) {
1054
+ return [];
1055
+ }
1056
+ const type = this.props.location.query.type;
1057
+ const items = [];
1058
+ const channel = this.state.channel.toLowerCase();
1059
+
1060
+ if (type === 'embedded' && channel !== 'wechat' && blankTemplateRequired) {
1061
+ let content;
1062
+ if (channel === 'sms') {
1063
+ content = (<div className="sms-template-content" onClick={this.createTemplate}>
1064
+ <div style={{textAlign: 'center', lineHeight: '260px'}} className="sms-text">{this.props.intl.formatMessage(messages.blankTemplate)}</div>
1065
+ </div>);
1066
+ } else if (channel === 'email') {
1067
+ content = (<div className="sms-template-content">
1068
+ <div style={{textAlign: 'center', lineHeight: '260px'}} className="sms-text">
1069
+ <div>
1070
+ <button type="button" className="ant-btn cap-button edit-button ant-btn-ghost" onClick={() => this.handleBlankTemplateAction('uploadFile')}><span>{this.props.intl.formatMessage(messages.uploadFile)}</span></button>
1071
+ <button type="button" className="ant-btn cap-button preview-button ant-btn-danger" onClick={() => this.handleBlankTemplateAction('editor')}><span>{this.props.intl.formatMessage(messages.useEditor)}</span></button>
1072
+ </div>
1073
+ </div>
1074
+ </div>);
1075
+ } else if (channel === 'mobilepush' || channel === 'line') {
1076
+ content = (<div className="sms-template-content">
1077
+ <div style={{textAlign: 'center', lineHeight: '260px'}} className="sms-text">
1078
+ <div>
1079
+ <button
1080
+ type="button"
1081
+ className="ant-btn cap-button edit-button ant-btn-ghost"
1082
+ onClick={() => this.handleBlankTemplateAction('textTemplate', channel)}>
1083
+ <span>{this.props.intl.formatMessage(messages.textTemplate)}</span>
1084
+ </button>
1085
+ <button
1086
+ type="button"
1087
+ className="ant-btn cap-button preview-button ant-btn-danger"
1088
+ onClick={() => this.handleBlankTemplateAction('imageTemplate', channel)}>
1089
+ <span>{this.props.intl.formatMessage(messages.imageTemplate)}</span>
1090
+ </button>
1091
+ </div>
1092
+ </div>
1093
+ </div>);
1094
+ }
1095
+ items.push(
1096
+ {
1097
+ id: 'blankTemplate',
1098
+ content,
1099
+ }
1100
+ );
1101
+ } /*else if (type === 'embedded' && this.state.channel.toLowerCase() === "mobilepush") {
1102
+ items.push({
1103
+ id: 'blankTemplate',
1104
+ content: <div className={this.state.clickedItem === 'blankTemplate' ? 'sms-text-blurred' : ''}>
1105
+ <div>
1106
+ <div
1107
+ style={{textAlign: 'center', lineHeight: '260px'}}
1108
+ className="sms-text">{this.props.intl.formatMessage(messages.blankTemplate)}</div>
1109
+ </div>
1110
+ {this.state.clickedItem === 'blankTemplate' && <CapButton
1111
+ onClick={() => { this.createTemplate({key: 'text'}); }} key="text" className="edit-button" type="secondary">Text</CapButton>}
1112
+ {this.state.clickedItem === 'blankTemplate' && <CapButton
1113
+ onClick={() => { this.createTemplate({key: 'image'}); }} key="image" className="preview-button" type="secondary">image</CapButton>}
1114
+ </div>,
1115
+ });
1116
+ }*/
1117
+ data.map( (template = {}) => {
1118
+ //
1119
+ const temp = {};
1120
+ //
1121
+ 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');
1122
+ let content = '';
1123
+ temp.id = template._id;
1124
+ if (this.state.channel === 'wechat' && (template.type || '').toLowerCase() === 'wechat') {
1125
+ let path = '';
1126
+ if (template && template.versions && template.versions.base && !_.isEmpty(template.versions.base)) {
1127
+ if (template.definition && template.definition.msgcontent && template.definition.msgcontent === "RICH_MEDIA_WECHAT") {
1128
+ path = `/wechat/richmedia/edit/${template._id}`;
1129
+ content = <WechatRichmediaTemplatePreview type={this.props.location && this.props.location.query.type ? this.props.location.query.type : ''} content={template.versions.base.mediaList}/>;
1130
+ } else {
1131
+ path = `/wechat/edit/${template._id}`;
1132
+ content = this.prepareWeChatPreviewData(template);
1133
+ }
1134
+ temp.content = (
1135
+ <div
1136
+ className="sms-template-content">
1137
+ <div className={`sms-text ${this.state.hoveredItem === template._id ? 'sms-text-blurred' : ''}`}>
1138
+ {content || ''}
1139
+ </div>
1140
+ {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> : ''}
1141
+ {template._id === this.state.hoveredItem ? <CapButton onClick={() => this.handlePreviewClick(template)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
1142
+ </div>
1143
+ );
1144
+ }
1145
+ } else if (this.state.channel.toLowerCase() === 'email' || this.state.channel.toLowerCase() === 'ebill') {
1146
+ //
1147
+
1148
+ const imgSrc = template && template.versions && template.versions.base ? template.versions.base.preview_http_url : '';
1149
+ const ifPreviewGenerated = template && template.versions && template.versions.base ? template.versions.base.isPreviewGenerated : 0;
1150
+ content = <img src={imgSrc || ''} alt={this.props.intl.formatMessage(messages.previewGenerateText)} width="100%" height="100%"/>;
1151
+
1152
+ temp.content = (
1153
+ <div
1154
+ className="sms-template-content">
1155
+ <div className={`sms-text ${this.state.hoveredItem === template._id ? 'sms-text-blurred' : ''}`}>
1156
+ {content}
1157
+ </div>
1158
+ {!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> : ''}
1159
+ {layoutSelection && template._id === this.state.hoveredItem ? <CapButton onClick={(event) =>{this.handleEdmDefaultTemplateSelection(true, template?.versions?.base?.drag_drop_id); event.stopPropagation();}} className="select-button" type="secondary">{type === 'embedded' ? this.props.intl.formatMessage(messages.selectDefaultButton) : this.props.intl.formatMessage(messages.selectDefaultButton)}</CapButton> : ''}
1160
+ {!layoutSelection && template._id === this.state.hoveredItem ? <CapButton onClick={() => this.handlePreviewClick(template)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
1161
+ </div>);
1162
+ } else if (this.state.channel.toLowerCase() === 'mobilepush') {
1163
+ content = this.prepareMobilePushPreviewData(template.versions.base);
1164
+ temp.content = (
1165
+ <div>
1166
+ <div className={`mobilepush-message ${this.state.hoveredItem === template._id ? 'sms-text-blurred' : ''}`}>
1167
+ {content || ''}
1168
+ </div>
1169
+ {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> : ''}
1170
+ {template._id === this.state.hoveredItem ? <CapButton onClick={() => this.handlePreviewClick(template)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
1171
+ </div>);
1172
+ } else if (this.state.channel.toLowerCase() === 'line' && template.type && template.type.toLowerCase() === 'line') {
1173
+ //content = template.versions.base.messages[0].Text;
1174
+ content = {
1175
+ bodyText: template.versions.base.content.messages[0].text ? template.versions.base.content.messages[0].text : '',
1176
+ bodyImage: template.versions.base.content.messages[0].originalContentUrl ? template.versions.base.content.messages[0].originalContentUrl : '',
1177
+ };
1178
+ const modeType = template.versions.base.content.messages[0].type;
1179
+ temp.content = (
1180
+ <div className="sms-template-content" key={template._id}>
1181
+ {content.bodyText ? <div className={`sms-text ${this.state.hoveredItem === template._id ? 'sms-text-blurred' : ''}`}>{content.bodyText || ''}</div> : ''}
1182
+ {content.bodyImage ? <div className={`sms-text ${this.state.hoveredItem === template._id ? 'sms-text-blurred' : ''}`}>
1183
+ <img src={content.bodyImage} role={"presentation"} style={{maxWidth: '100%', objectFit: 'cover', height: '100%'}}/></div> : ''}
1184
+ {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> : ''}
1185
+ {template._id === this.state.hoveredItem ? <CapButton onClick={() => this.handlePreviewClick(template, modeType)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
1186
+ </div>
1187
+ );
1188
+ } else {
1189
+ content = template && template.versions && template.versions.base ? template.versions.base['sms-editor'] : '';
1190
+ for (let idx = 2; idx <= 5; idx += 1) {
1191
+ if ((content === '' || !content) && template && template.versions && template.versions.base && template && template.versions && template.versions.base[`sms-editor${idx}`]) {
1192
+ content = template.versions.base[`sms-editor${idx}`];
1193
+ }
1194
+ }
1195
+ temp.content = (
1196
+ <div
1197
+ className="sms-template-content">
1198
+ <div className={`sms-text ${this.state.hoveredItem === template._id ? 'sms-text-blurred' : ''}`}>{content || ''}</div>
1199
+ {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> : ''}
1200
+ {template._id === this.state.hoveredItem ? <CapButton onClick={() => this.handlePreviewClick(template)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
1201
+ </div>
1202
+ );
1203
+ }
1204
+ let availableTemplates = "Android";
1205
+ if (template.versions && template.versions.base && template.versions.base.ANDROID && template.versions.base.IOS) {
1206
+ availableTemplates = `${availableTemplates} & IOS`;
1207
+ } else if (template.versions && template.versions.base && template.versions.base.IOS) {
1208
+ availableTemplates = 'iOS';
1209
+ }
1210
+ let deleteOption = this.props.intl.formatMessage(messages.deleteButton);
1211
+ if (this.state.channel.toLowerCase() === 'wechat' && !template.definition) {
1212
+ deleteOption = this.props.intl.formatMessage(messages.unMapButton);
1213
+ }
1214
+ if (!layoutSelection) {
1215
+ temp.footer = (
1216
+ <div className="footer-container">
1217
+ <div className="card-title">
1218
+ <span className="template-name" style={{ fontWeight: `${this.state.channel.toLowerCase() === 'wechat' ? '400' : '600'}` }}>
1219
+ { template && template.versions && template.versions.history && template.versions.history.length > 1 && this.state.channel.toLowerCase() !== 'mobilepush' && <i style={{fontSize: '16px', margin: '0 8px 0 0', verticalAlign: 'middle'}} className="material-icons">filter_none</i>}
1220
+ {template.name}
1221
+ </span>
1222
+ {this.props.location.query.type !== 'embedded' && <CapPopover
1223
+ trigger="click"
1224
+ content={
1225
+ <div className="popover-content">
1226
+ {this.state.channel !== 'wechat' && <div className="popover-action-container">
1227
+ <span onClick={() => this.duplicateTemplate(template)} className="popover-action" style={{cursor: 'pointer', padding: '8px 0px'}}>{this.props.intl.formatMessage(messages.duplicateButton)}</span>
1228
+ </div>}
1229
+ <div className="popover-action-container">
1230
+ <span onClick={() => this.toggleDeleteTemplateModal(template)} className="popover-action" style={{cursor: 'pointer', padding: '8px 0px'}}>{deleteOption}</span>
1231
+ </div>
1232
+ </div>
1233
+ }
1234
+ placement="bottomRight"
1235
+ >
1236
+ <i className="material-icons options-icon">&#xE5D4;</i>
1237
+ </CapPopover>}
1238
+ </div>
1239
+ {this.state.channel.toLowerCase() === "mobilepush" ?
1240
+ <p className="card-detail">{availableTemplates}</p>
1241
+ :
1242
+ <p className="card-detail">{this.props.intl.formatMessage(messages.uploadedAt)}: {updateDateTime}</p>
1243
+ }
1244
+ </div>
1245
+ );
1246
+ }
1247
+ items.push(temp);
1248
+ return true;
1249
+ });
1250
+ return items;
1251
+ };
1252
+
1253
+ toggleEmailPreview = () => {
1254
+ this.setState({ showHtmlPreview: !this.state.showHtmlPreview }, () => {
1255
+ if (!this.state.showHtmlPreview) {
1256
+ this.setState({previewTemplate: {}});
1257
+ }
1258
+ });
1259
+ };
1260
+
1261
+ changePreviewDevice = (device) => {
1262
+ this.setState({ device });
1263
+ };
1264
+
1265
+ //Gets called only when creatives gets used as node library
1266
+ isEnabledInLibraryModule = (property) => {
1267
+ if (this.props.location.query.type === "embedded" && this.props.location.query.module === "library") {
1268
+ switch (property) {
1269
+ case "showAccountSelection":
1270
+ return (this.props.route && (this.props.route.name.toLowerCase() === "wechat" || this.props.route.name.toLowerCase() === "mobilepush"));
1271
+ case "setLocale":
1272
+ return true;
1273
+ case "callCreateFromProps":
1274
+ return true;
1275
+ case "callSelectFromProps":
1276
+ return true;
1277
+ default:
1278
+ return false;
1279
+ }
1280
+ } else {
1281
+ return false;
1282
+ }
1283
+ }
1284
+
1285
+ isLoading = () => {
1286
+ const lineLoader = (this.props.Templates.getAllTemplatesInProgress && this.state.channel.toLowerCase() === 'line');
1287
+ const smsLoader = (this.props.Templates.getAllTemplatesInProgress && this.state.channel.toLowerCase() === 'sms');
1288
+ const wechatLoader = (((this.state.selectedAccount !== '' && this.props.Templates.getAllTemplatesInProgress) || (this.props.Templates.fetchingWeCrmAccounts)) && this.state.channel.toLowerCase() === 'wechat');
1289
+ const mobilePushLoader = (((this.props.Templates.getAllTemplatesInProgress) || (this.props.Templates.fetchingWeCrmAccounts)) && this.state.channel.toLowerCase() === 'mobilepush');
1290
+ const emailLoader = ((this.props.Templates.getAllTemplatesInProgress || this.props.Templates.sendingFile) && this.state.channel.toLowerCase() === 'email');
1291
+ const ebillLoader = ((this.props.Templates.getAllTemplatesInProgress || this.props.Templates.sendingFile) && this.state.channel.toLowerCase() === 'ebill');
1292
+ const isLoading = ((wechatLoader !== undefined) ? wechatLoader : false) ||
1293
+ (smsLoader !== undefined ? smsLoader : false) ||
1294
+ (emailLoader !== undefined ? emailLoader : false) ||
1295
+ (ebillLoader !== undefined ? ebillLoader : false) ||
1296
+ (mobilePushLoader !== undefined ? mobilePushLoader : false) ||
1297
+ (lineLoader !== undefined ? lineLoader : false);
1298
+ return isLoading;
1299
+ }
1300
+ renderDeleteConfirmationModal = () => {
1301
+ const modal =
1302
+ (<Modal
1303
+ visible={this.state.showModal}
1304
+ title={"Alert"}
1305
+ onOk={this.handleOk}
1306
+ onCancel={this.handleCancel}
1307
+ footer={[
1308
+ <CapButton key="back" onClick={this.handleCancel}>{this.props.intl.formatMessage(messages.cancelText)}</CapButton>,
1309
+ <CapButton key="submit" type="primary" id="delete-version" onClick={this.handleOk}>
1310
+ {this.props.intl.formatMessage(messages.yesText)}
1311
+ </CapButton>,
1312
+ ]}
1313
+ >
1314
+ {this.props.intl.formatMessage(messages.templateDeleteConfirm)}
1315
+ </Modal>);
1316
+ return modal;
1317
+ };
1318
+
1319
+
1320
+ renderEmailPreviewModal() {
1321
+ const slideboxContent = (
1322
+ <div style={{height: "75vh", width: '55vw'}}>
1323
+ <iframe />
1324
+ </div>
1325
+ );
1326
+
1327
+ return (
1328
+ <SlideBox
1329
+ header={this.state.previewTemplate.name}
1330
+ content={slideboxContent}
1331
+ show={this.state.showEmailPreviewModal}
1332
+ handleClose={this.togglePreview}
1333
+ width={60}
1334
+ />
1335
+ );
1336
+ }
1337
+ render() {
1338
+ let pageHeaderText = '';
1339
+ const moduleName = this.props.location.query.module;
1340
+ if (this.props.location.query.type !== 'embedded') {
1341
+ if (this.state.channel.toUpperCase() === 'WECHAT') {
1342
+ pageHeaderText = this.props.intl.formatMessage(messages.wechatHeader);
1343
+ } else if (this.state.channel.toUpperCase() === 'SMS') {
1344
+ pageHeaderText = this.props.intl.formatMessage(messages.smsHeader);
1345
+ } else if (this.state.channel.toUpperCase() === 'EMAIL') {
1346
+ pageHeaderText = this.props.intl.formatMessage(messages.emailHeader);
1347
+ } else if (this.state.channel.toUpperCase() === 'MOBILEPUSH') {
1348
+ pageHeaderText = this.props.intl.formatMessage(messages.mobilepushHeader);
1349
+ } else if (this.state.channel.toUpperCase() === 'EBILL') {
1350
+ pageHeaderText = this.props.intl.formatMessage(messages.ebillHeader);
1351
+ } else if (this.state.channel.toUpperCase() === 'LINE') {
1352
+ pageHeaderText = this.props.intl.formatMessage(messages.lineHeader);
1353
+ }
1354
+ }
1355
+ const options = [
1356
+ {
1357
+ value: "Most Recent",
1358
+ label: this.props.intl.formatMessage(messages.mostRecentOption),
1359
+ },
1360
+ {
1361
+ value: "Alphabetically",
1362
+ label: this.props.intl.formatMessage(messages.alphabeticallyOption),
1363
+ },
1364
+ ];
1365
+ const typeOptions = [
1366
+ {
1367
+ value: "All",
1368
+ label: this.props.intl.formatMessage(messages.all),
1369
+ },
1370
+ {
1371
+ label: this.props.intl.formatMessage(messages.text),
1372
+ value: 'Text',
1373
+ },
1374
+ {
1375
+ label: this.props.intl.formatMessage(messages.image),
1376
+ value: "Image",
1377
+ },
1378
+ ];
1379
+ const filterContent = (
1380
+ <div className="action-container">
1381
+ <CapInput
1382
+ className="search-text"
1383
+ style={{width: '210px'}}
1384
+ placeholder={this.props.intl.formatMessage(messages.searchText)}
1385
+ prefix={<i className="material-icons" style={{ margin: '0', fontSize: '16px'}}>search</i>}
1386
+ value={this.state.searchText}
1387
+ onChange={(e) => this.searchTemplate(e.target.value)}
1388
+ />
1389
+ <div className="action-container">
1390
+ <div style={{display: "flex", justifyContent: "space-between", alignItems: 'center'}}>
1391
+ <div className="select-font">{this.props.intl.formatMessage(messages.sortBy)}</div>
1392
+ <CapSelect key={"select-account"} style={{width: '120px', marginLeft: '16px', minWidth: 'initial'}} defaultValue="Most Recent" onChange={this.handleSortBy} options={options}>
1393
+ </CapSelect>
1394
+ </div>
1395
+ { (this.state.channel.toLowerCase() === 'mobilepush' || this.state.channel.toLowerCase() === 'line') &&
1396
+ <div style={{display: "flex", justifyContent: "space-between", alignItems: 'center', marginLeft: '16px'}}>
1397
+ <div className="select-font">{this.props.intl.formatMessage(messages.type)}</div>
1398
+ <CapSelect key={"select-type"} style={{width: '120px', marginLeft: '16px', minWidth: 'initial'}} defaultValue="All" onChange={this.handleType} options={typeOptions}>
1399
+ </CapSelect>
1400
+ </div>
1401
+ }
1402
+ </div>
1403
+ </div>
1404
+ );
1405
+ const accountOptions = [];
1406
+ if ((this.state.channel.toUpperCase() === 'WECHAT' || this.state.channel.toUpperCase() === "MOBILEPUSH") && !_.isEmpty(this.props.Templates.weCrmAccounts)) {
1407
+ _.forEach(this.props.Templates.weCrmAccounts, (account) => {
1408
+ if ((this.state.channel.toUpperCase() === 'WECHAT' && account.configs && account.configs.is_wecrm_enabled) || this.state.channel.toUpperCase() === 'MOBILEPUSH') {
1409
+ if (this.props.location.query.type === 'embedded' && (!this.props.location.query.module || (this.props.location.query.module && this.props.location.query.module !== 'library'))) {
1410
+ if (this.props.location.query.source_account_id && account.sourceAccountIdentifier === this.props.location.query.source_account_id) {
1411
+ accountOptions.push(
1412
+ <Option key={this.state.channel.toUpperCase() === "MOBILEPUSH" ? account.id : account.uuid} value={account.name}>{account.name}</Option>
1413
+ );
1414
+ } else if (this.props.location.query.module && (this.state.channel.toUpperCase() === "WECHAT" || this.state.channel.toUpperCase() === "MOBILEPUSH")) {
1415
+ accountOptions.push(
1416
+ <Option key={this.state.channel.toUpperCase() === "MOBILEPUSH" ? account.id : account.uuid} value={account.name}>{account.name}</Option>
1417
+ );
1418
+ }
1419
+ } else {
1420
+ accountOptions.push(
1421
+ <Option key={this.state.channel.toUpperCase() === "MOBILEPUSH" ? account.id : account.uuid} value={account.name}>{account.name}</Option>
1422
+ );
1423
+ }
1424
+ }
1425
+ });
1426
+ }
1427
+ let templateText = this.state.channel.toUpperCase() === 'WECHAT' ? this.props.intl.formatMessage(messages.selectWechatHeader) : this.props.intl.formatMessage(messages.selectSmsHeader);
1428
+
1429
+ let titleText = this.state.channel.toUpperCase() === 'SMS' ? this.props.intl.formatMessage(messages.smsChannelTemplatesHeader) : this.props.intl.formatMessage(messages.wechatChannelTemplatesHeader);
1430
+ if (this.state.channel.toUpperCase() === "MOBILEPUSH") {
1431
+ templateText = this.props.intl.formatMessage(messages.mobilePushChannelTemplatesHeader);
1432
+ titleText = this.props.intl.formatMessage(messages.mobilePushChannel);
1433
+ } else if (this.state.channel.toUpperCase() === "EMAIL") {
1434
+ templateText = this.props.intl.formatMessage(messages.emailChannelTemplatesHeader);
1435
+ titleText = this.props.intl.formatMessage(messages.emailChannel);
1436
+ } else if (this.state.channel.toUpperCase() === "EBILL") {
1437
+ templateText = this.props.intl.formatMessage(messages.ebillChannelTemplatesHeader);
1438
+ titleText = this.props.intl.formatMessage(messages.ebillChannel);
1439
+ } else if (this.state.channel.toUpperCase() === "LINE") {
1440
+ templateText = this.props.intl.formatMessage(messages.lineChannelTemplatesHeader);
1441
+ titleText = this.props.intl.formatMessage(messages.lineChannel);
1442
+ }
1443
+ const pageHeader = (
1444
+ <div>
1445
+ {(this.props.location.query.type !== 'embedded') ? `${pageHeaderText}` : templateText}
1446
+ {(this.isEnabledInLibraryModule("showAccountSelection") || (((this.state.channel.toUpperCase() === 'WECHAT' || this.state.channel.toUpperCase() === "MOBILEPUSH") && (this.props.location.query.type !== 'embedded') && !_.isEmpty(this.props.Templates.weCrmAccounts)))) &&
1447
+ <Select className="selectAccount" onSelect={this.onAccountSelect} value={this.props.Templates.selectedWeChatAccount ? this.props.Templates.selectedWeChatAccount.name : undefined} placeholder={this.props.intl.formatMessage(messages.selectAccount)}>
1448
+ {accountOptions}
1449
+ </Select>}
1450
+ </div>
1451
+ );
1452
+ const pageHeaderDvs = (
1453
+ <div>
1454
+ {(this.props.location.query.type === 'embedded' && moduleName === 'dvs') ? `${templateText}` : pageHeaderText}
1455
+ {((this.state.channel.toUpperCase() === 'WECHAT' || this.state.channel.toUpperCase() === "MOBILEPUSH") && (this.props.location.query.type === 'embedded') && !_.isEmpty(this.props.Templates.weCrmAccounts)) &&
1456
+ <Select className="selectAccount" onSelect={this.onAccountSelect} value={this.props.Templates.selectedWeChatAccount ? this.props.Templates.selectedWeChatAccount.name : undefined} placeholder={this.props.intl.formatMessage(messages.selectAccount)}>
1457
+ {accountOptions}
1458
+ </Select>}
1459
+ </div>
1460
+ );
1461
+ let actionButton = '';
1462
+ if (this.props.location.query.type !== 'embedded') {
1463
+ if (this.state.channel.toUpperCase() === 'WECHAT') {
1464
+ const createPushMenu = (
1465
+ <Menu onClick={this.menuOnClickEvent}>
1466
+ <MenuItem key="map_template">
1467
+ {this.props.intl.formatMessage(messages.mapTemplate)}
1468
+ </MenuItem>
1469
+ <MenuItem key="richmedia_template">
1470
+ {this.props.intl.formatMessage(messages.weChatRichmediaTemplate)}
1471
+ </MenuItem>
1472
+ </Menu>
1473
+ );
1474
+ actionButton = (<Dropdown disabled={_.isEmpty(this.props.Templates.selectedWeChatAccount)} overlay={createPushMenu} trigger={['click']}>
1475
+ <CapButton style={{paddingLeft: '24px', paddingRight: '4px'}}>
1476
+ <div style={{display: 'inline-flex'}}>
1477
+ <p style={{ lineHeight: '28px'}}>{this.props.intl.formatMessage(messages.newTemplate)}</p>
1478
+ <p style={{ height: '28px'}}>
1479
+ <i style={{ color: '#fff', paddingTop: '2px', margin: '0', paddingRight: '8px'}} className="material-icons">arrow_drop_down</i>
1480
+ </p>
1481
+ </div>
1482
+ </CapButton>
1483
+ </Dropdown>);
1484
+ } else if (this.state.channel.toUpperCase() === 'EMAIL' || this.state.channel.toUpperCase() === 'EBILL') {
1485
+ const menuItems = [];
1486
+ menuItems.push(<MenuItem key={'uploadFile'}>{this.props.intl.formatMessage(messages.uploadFile)}</MenuItem>);
1487
+ menuItems.push(<MenuItem key={'useEditor'}>{this.props.intl.formatMessage(messages.useEditor)}</MenuItem>);
1488
+ const menu = (
1489
+ <Menu onClick={this.handleMenuAction}>
1490
+ {menuItems}
1491
+ </Menu>
1492
+ );
1493
+ actionButton = (
1494
+ <Dropdown overlay={menu} trigger={["click"]}>
1495
+ <CapButton style={{paddingLeft: '24px', paddingRight: '4px'}}>
1496
+ <div style={{display: 'inline-flex'}}>
1497
+ <p style={{ lineHeight: '32px', paddingRight: '12px' }}>{this.props.intl.formatMessage(messages.newTemplate)}</p>
1498
+ <p style={{ height: '32px' }}>
1499
+ <i style={{ color: '#fff', lineHeight: '32px', margin: '0'}} className="material-icons">arrow_drop_down</i>
1500
+ </p>
1501
+ </div>
1502
+ </CapButton>
1503
+ </Dropdown>
1504
+ );
1505
+ } else if (this.props.route.name.toLowerCase() === "mobilepush") {
1506
+ const createPushMenu = (
1507
+ <Menu onClick={this.createTemplate}>
1508
+ <MenuItem key="text">
1509
+ {this.props.intl.formatMessage(messages.textTemplate)}
1510
+ </MenuItem>
1511
+ <MenuItem key="image">
1512
+ {this.props.intl.formatMessage(messages.imageTemplate)}
1513
+ </MenuItem>
1514
+ </Menu>
1515
+ );
1516
+ actionButton = (<Dropdown disabled={_.isEmpty(this.props.Templates.selectedWeChatAccount)} overlay={createPushMenu} trigger={['click']}>
1517
+ <CapButton style={{paddingLeft: '24px', paddingRight: '4px'}}>
1518
+ <div style={{display: 'inline-flex'}}>
1519
+ <p style={{ lineHeight: '28px'}}>{this.props.intl.formatMessage(messages.newTemplate)}</p>
1520
+ <p style={{ height: '28px'}}>
1521
+ <i style={{ color: '#fff', paddingTop: '2px', margin: '0', paddingRight: '8px'}} className="material-icons">arrow_drop_down</i>
1522
+ </p>
1523
+ </div>
1524
+ </CapButton>
1525
+ </Dropdown>);
1526
+ } else if (this.props.route.name.toLowerCase() === "line") {
1527
+ const lineMenu = (
1528
+ <Menu onClick={this.createTemplate}>
1529
+ <MenuItem key="text">
1530
+ {this.props.intl.formatMessage(messages.textTemplate)}
1531
+ </MenuItem>
1532
+ <MenuItem key="image">
1533
+ {this.props.intl.formatMessage(messages.imageTemplate)}
1534
+ </MenuItem>
1535
+ </Menu>
1536
+ );
1537
+ actionButton = (<Dropdown overlay={lineMenu} trigger={['click']}>
1538
+ <CapButton style={{paddingLeft: '24px', paddingRight: '4px'}}>
1539
+ <div style={{display: 'inline-flex'}}>
1540
+ <p style={{ lineHeight: '28px'}}>{this.props.intl.formatMessage(messages.newTemplate)}</p>
1541
+ <p style={{ height: '28px'}}>
1542
+ <i style={{ color: '#fff', paddingTop: '2px', margin: '0', paddingRight: '8px'}} className="material-icons">arrow_drop_down</i>
1543
+ </p>
1544
+ </div>
1545
+ </CapButton>
1546
+ </Dropdown>);
1547
+ } else {
1548
+ actionButton = (<CapButton onClick={this.createTemplate}>{this.state.channel.toUpperCase() === 'SMS' ? this.props.intl.formatMessage(messages.createSmsActionButton) : 'Create SMS'}</CapButton>);
1549
+ }
1550
+ }
1551
+
1552
+
1553
+ let previewHeader = this.props.intl.formatMessage(messages.preview);
1554
+ // const previewHeader = (this.state.channel.toLowerCase() === 'email' ? <h3>{this.props.intl.formatMessage(messages.emailPreview)}</h3> : <h3>{this.props.intl.formatMessage(messages.ebillPreview)}</h3>);
1555
+ if (this.state.channel.toLowerCase() === 'email' || this.state.channel.toLowerCase() === 'ebill') {
1556
+ if (this.state.previewTemplate && this.state.previewTemplate.name !== '') {
1557
+ previewHeader = this.state.previewTemplate.name;
1558
+ }
1559
+ }
1560
+
1561
+ const cmsTemplateSelectionContent = (
1562
+ <CardGrid
1563
+ className={""}
1564
+ listItem={this.populateTemplatesList(this.props.Templates.cmsTemplates, false, true)}
1565
+ // filterContent={filterContent}
1566
+ onHoverItem={this.handleOnHoverItem}
1567
+ onItemClick={this.handleEdmDefaultTemplateSelection}
1568
+ colNumber={2}
1569
+ >
1570
+ </CardGrid>
1571
+ );
1572
+
1573
+ let htmlPreviewContent = "";
1574
+ if (this.state.channel.toLowerCase() === 'ebill') {
1575
+ htmlPreviewContent = this.state.previewTemplate && this.state.previewTemplate.versions && this.state.previewTemplate.versions.base && this.state.previewTemplate.versions.base['ebill-editor'];
1576
+ } else if (this.state.channel.toLowerCase() === 'email') {
1577
+ 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'];
1578
+ }
1579
+
1580
+ const templateList = this.populateTemplatesList(this.props.TemplatesList, true);
1581
+
1582
+ const isSearch = this.props.Templates.isSearch;
1583
+ return (
1584
+ <div>
1585
+ <Spin
1586
+ tip={(this.props.Templates.sendingFile && (this.state.channel.toLowerCase() === 'email' || this.state.channel.toLowerCase() === 'ebill')) ? this.props.intl.formatMessage(messages.uploadingFile) : this.props.intl.formatMessage(messages.gettingAllTemplates)}
1587
+ spinning={this.isLoading()}
1588
+ >
1589
+ <input type="file" id="filename" style={{ display: 'none'}} accept=".zip, .html, .htm" onChange={(event) => this.handleFileUpload(event, {files: event.target.files})} />
1590
+ <Row>
1591
+ <Col>
1592
+ {this.props.location.query.type !== "embedded" &&
1593
+ <Breadcrumb>
1594
+ <BreadcrumbItem>{this.props.intl.formatMessage(messages.campaigns)}</BreadcrumbItem>
1595
+ <BreadcrumbItem>{this.props.intl.formatMessage(messages.creatives)}</BreadcrumbItem>
1596
+ <BreadcrumbItem>{this.props.intl.formatMessage(messages[this.state.channel]) }</BreadcrumbItem>
1597
+ </Breadcrumb>
1598
+ }
1599
+ </Col>
1600
+ </Row>
1601
+ <Row className="template-header-container">
1602
+ <div className="template-header">{(this.props.location.query.type === 'embedded' && moduleName === 'dvs') ? pageHeaderDvs : pageHeader}</div>
1603
+ {actionButton}
1604
+ </Row>
1605
+ <Row>
1606
+ <Helmet
1607
+ title={titleText}
1608
+ meta={[
1609
+ { name: 'description', content: this.props.intl.formatMessage(messages.descriptionTemplates) },
1610
+ ]}
1611
+ />
1612
+ {((templateList && templateList.length > 0) || isSearch) && <Pagination onPageChange={() => { this.getAllTemplates({getNextPage: true}); }} paginationSelector="pagination-container">
1613
+ <CardGrid
1614
+ className={this.state.channel.toLowerCase() === "mobilepush" ? "mobilepush-templates" : ""}
1615
+ listItem={templateList}
1616
+ filterContent={filterContent}
1617
+ onHoverItem={this.handleOnHoverItem}
1618
+ onItemClick={this.handleOnItemClick}
1619
+ enablePagination
1620
+ >
1621
+ </CardGrid>
1622
+ </Pagination>}
1623
+ {(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'}}>
1624
+ <span style={{ fontFamily: 'open-sans', fontSize: '24px', color: '#B5B5B5'}}>{this.props.intl.formatMessage(messages.noAccountMessage)}</span>
1625
+ </div>}
1626
+ {(((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'}}>
1627
+ <span style={{ fontFamily: 'open-sans', fontSize: '24px', color: '#B5B5B5'}}>{this.props.intl.formatMessage(messages.noTemplatesMessage)}</span>
1628
+ </div>}
1629
+ </Row>
1630
+ <Row>
1631
+ {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' ?
1632
+ <WechatRichmediaTemplatePreview
1633
+ show={this.state.previewOpen}
1634
+ closeSlideBox={this.togglePreview}
1635
+ header={this.state.previewTemplate.name}
1636
+ width={30}
1637
+ showSlidebox
1638
+ const type={this.props.location && this.props.location.query.type ? this.props.location.query.type : ''}
1639
+ content={this.state.previewTemplate.versions.base.mediaList}
1640
+ onEditClick={this.handleEditClick}
1641
+ showEdit
1642
+ templateId={this.state.previewTemplate._id}
1643
+ path={`/wechat/richmedia/edit/${this.state.previewTemplate._id}`}
1644
+ />
1645
+ :
1646
+ <PreviewSideBar
1647
+ showPreview={this.state.previewOpen}
1648
+ templateData={this.state.previewTemplate}
1649
+ channel={this.state.channel}
1650
+ handleClose={this.togglePreview}
1651
+ onEditClick={this.handleEditClick}
1652
+ embedded={this.props.location.query.type === 'embedded'}
1653
+ onDuplicateClick={this.duplicateTemplate}
1654
+ location={this.props.location}
1655
+ >
1656
+ </PreviewSideBar>
1657
+ }
1658
+ {(this.state.channel.toLowerCase() === 'ebill' || this.state.channel.toLowerCase() === 'email') && htmlPreviewContent && <EmailPreview
1659
+ header={previewHeader}
1660
+ content={htmlPreviewContent}
1661
+ show={this.state.showHtmlPreview}
1662
+ device={this.state.device}
1663
+ handleClose={this.toggleEmailPreview}
1664
+ changePreviewDevice={this.changePreviewDevice}
1665
+ lastModified={this.state.previewTemplate ? this.state.previewTemplate.updatedAt : ''}
1666
+ updatedByName={commonUtil.getUserNameById(parseInt(this.state.previewTemplate.updatedBy, 10), commonUtil.getMergedUserList(this.props.Templates.userList))}
1667
+ />}
1668
+ <SlideBox
1669
+ header={(<h3>{this.props.intl.formatMessage(messages.layoutSelection)}</h3>)}
1670
+ width={60}
1671
+ content={cmsTemplateSelectionContent}
1672
+ show={this.state.showEdmEmailTemplates}
1673
+ handleClose={this.toggleEdmEmailTemplateSelection}
1674
+ loadingText={this.props.intl.formatMessage(messages.loadingEDMTemplates)}
1675
+ isLoading={this.props.Templates.getCmsTemplatesInProgress}
1676
+ />
1677
+ {this.renderDeleteConfirmationModal()}
1678
+ </Row>
1679
+ </Spin>
1680
+ </div>
1681
+ );
1682
+ }
1683
+ }
1684
+
1685
+ Templates.propTypes = {
1686
+ actions: PropTypes.object.isRequired,
1687
+ smsActions: PropTypes.object,
1688
+ mobilepushActions: PropTypes.object,
1689
+ smsEditActions: PropTypes.object,
1690
+ ebillActions: PropTypes.object,
1691
+ emailActions: PropTypes.object,
1692
+ TemplatesList: PropTypes.array,
1693
+ Templates: PropTypes.object,
1694
+ route: PropTypes.object,
1695
+ router: PropTypes.object,
1696
+ Create: PropTypes.object,
1697
+ location: PropTypes.object,
1698
+ globalActions: PropTypes.object,
1699
+ intl: intlShape.isRequired,
1700
+ Global: PropTypes.object,
1701
+ createNew: PropTypes.func,
1702
+ onSelectTemplate: PropTypes.func,
1703
+ lineActions: PropTypes.object,
1704
+ };
1705
+
1706
+ const mapStateToProps = createStructuredSelector({
1707
+ Templates: makeSelectTemplates(),
1708
+ TemplatesList: makeSelectTemplatesResponse(),
1709
+ Create: makeSelectCreateSms(),
1710
+ CreateMobilePush: makeSelectCreateMobilePush(),
1711
+ CreateEbill: makeSelectCreateEbill(),
1712
+ Edit: makeSelectEdit(),
1713
+ EmailCreate: makeSelectCreateEmail(),
1714
+ Global: makeSelectAuthenticated(),
1715
+ Line: makeSelectLine(),
1716
+ });
1717
+
1718
+ function mapDispatchToProps(dispatch) {
1719
+ return {
1720
+ actions: bindActionCreators(actions, dispatch),
1721
+ smsActions: bindActionCreators(smsActions, dispatch),
1722
+ mobilepushActions: bindActionCreators(mobilepushActions, dispatch),
1723
+ smsEditActions: bindActionCreators(smsEditActions, dispatch),
1724
+ ebillActions: bindActionCreators(ebillActions, dispatch),
1725
+ emailActions: bindActionCreators(emailActions, dispatch),
1726
+ globalActions: bindActionCreators(globalActions, dispatch),
1727
+ lineActions: bindActionCreators(lineActions, dispatch),
1728
+ };
1729
+ }
1730
+
1731
+ const withSaga = injectSaga({ key: 'templates', saga: templateSaga });
1732
+ const withCreateSmsSaga = injectSaga({ key: 'create', saga: createSmsSaga });
1733
+ const withEditSmsSaga = injectSaga({ key: 'edit', saga: editSmsSaga });
1734
+ const withEmailSaga = injectSaga({ key: 'email', saga: emailSaga });
1735
+ const withEbillSaga = injectSaga({ key: 'ebill', saga: ebillSaga });
1736
+ const withMpushSaga = injectSaga({ key: 'mobileCreate', saga: duplicateMPushSaga });
1737
+ const withLineCreateSaga = injectSaga({ key: 'line', saga: lineCreateSaga });
1738
+ const withReducer = injectReducer({ key: 'templates', reducer });
1739
+ const withMPushCreateReducer = injectReducer({ key: 'mobileCreate', reducer: mobilePushCreateReducer });
1740
+ const withLineCreateReducer = injectReducer({ key: 'lineTemplates', reducer: lineCreateReducer});
1741
+ const withConnect = connect(mapStateToProps, mapDispatchToProps);
1742
+
1743
+ export default compose(
1744
+ UserIsAuthenticated,
1745
+ withSaga,
1746
+ withCreateSmsSaga,
1747
+ withEditSmsSaga,
1748
+ withEmailSaga,
1749
+ withMpushSaga,
1750
+ withEbillSaga,
1751
+ withLineCreateSaga,
1752
+ withReducer,
1753
+ withMPushCreateReducer,
1754
+ withLineCreateReducer,
1755
+ withConnect,
1756
+ )(injectIntl(Templates));