@capillarytech/creatives-library 2.0.82 → 2.0.84

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 (177) hide show
  1. package/assets/android-message-gui-2.svg +55 -0
  2. package/components/CapTagList/index.js +24 -21
  3. package/components/CardGrid/index.js +10 -16
  4. package/components/Ckeditor/index.js +1 -2
  5. package/components/CustomPopOver/index.js +1 -1
  6. package/components/EmailPreview/index.js +2 -3
  7. package/components/FormBuilder/_formBuilder.scss +15 -8
  8. package/components/FormBuilder/index.js +194 -260
  9. package/components/Header/index.js +1 -4
  10. package/components/PreviewSideBar/_previewsidebar.scss +1 -1
  11. package/components/PreviewSideBar/index.js +5 -3
  12. package/components/SmsPreviewV2/_smsPreviewV2.scss +353 -0
  13. package/components/SmsPreviewV2/index.js +69 -0
  14. package/components/SmsPreviewV2/messages.js +13 -0
  15. package/components/SmsPreviewV2/tests/index.test.js +10 -0
  16. package/components/TemplatePreview/WechatRichmediaTemplatePreview/index.js +3 -2
  17. package/components/TemplatePreview/_templatePreview.scss +1 -1
  18. package/components/TemplatePreview/index.js +47 -47
  19. package/components/TemplatePreview/messages.js +1 -9
  20. package/containers/Assets/Gallery/index.js +1 -1
  21. package/containers/Email/index.js +1 -1
  22. package/containers/Login/components/LoginForm/index.js +1 -1
  23. package/containers/Templates/index.js +1 -1
  24. package/containers/WeChat/RichmediaTemplates/Create/index.js +1 -1
  25. package/package.json +2 -1
  26. package/v2Components/BreadCrumbs/index.js +65 -0
  27. package/v2Components/BreadCrumbs/messages.js +13 -0
  28. package/v2Components/BreadCrumbs/tests/index.test.js +10 -0
  29. package/v2Components/CallTaskPreview/_callTaskPreview.scss +17 -0
  30. package/v2Components/CallTaskPreview/images/Footer.png +0 -0
  31. package/v2Components/CallTaskPreview/images/Header.png +0 -0
  32. package/v2Components/CallTaskPreview/index.js +37 -0
  33. package/v2Components/CallTaskPreview/messages.js +13 -0
  34. package/v2Components/CallTaskPreview/tests/index.test.js +15 -0
  35. package/v2Components/CapTagList/index.js +232 -0
  36. package/v2Components/CapTagList/messages.js +25 -0
  37. package/v2Components/CapTagList/tests/index.test.js +10 -0
  38. package/v2Components/Card/_customCard.scss +27 -0
  39. package/v2Components/Card/index.js +78 -0
  40. package/{containers/WeChat → v2Components/Card}/tests/index.test.js +2 -2
  41. package/v2Components/CardGrid/index.js +77 -0
  42. package/v2Components/CardGrid/tests/index.test.js +10 -0
  43. package/v2Components/Ckeditor/index.js +234 -0
  44. package/v2Components/Ckeditor/messages.js +13 -0
  45. package/v2Components/Ckeditor/tests/index.test.js +10 -0
  46. package/v2Components/CmsTemplatesComponent/index.js +33 -0
  47. package/v2Components/CmsTemplatesComponent/messages.js +17 -0
  48. package/v2Components/CmsTemplatesComponent/tests/index.test.js +10 -0
  49. package/v2Components/Component/index.js +29 -0
  50. package/v2Components/Component/tests/index.test.js +10 -0
  51. package/v2Components/CustomPopOver/index.js +82 -0
  52. package/v2Components/CustomPopOver/messages.js +13 -0
  53. package/v2Components/CustomPopOver/tests/index.test.js +10 -0
  54. package/v2Components/DateFilter/index.js +349 -0
  55. package/v2Components/DateFilter/messages.js +17 -0
  56. package/v2Components/DateFilter/tests/index.test.js +15 -0
  57. package/v2Components/DateRange/index.js +113 -0
  58. package/v2Components/DateRange/messages.js +13 -0
  59. package/v2Components/DateRange/tests/index.test.js +10 -0
  60. package/v2Components/Edmeditor/index.js +65 -0
  61. package/v2Components/Edmeditor/messages.js +13 -0
  62. package/v2Components/Edmeditor/tests/index.test.js +10 -0
  63. package/v2Components/EmailMobilePreview/index.js +129 -0
  64. package/v2Components/EmailMobilePreview/index.scss +55 -0
  65. package/v2Components/EmailPreview/_emailPreview.scss +119 -0
  66. package/v2Components/EmailPreview/index.js +106 -0
  67. package/v2Components/EmailPreview/messages.js +17 -0
  68. package/v2Components/EmailPreview/tests/index.test.js +10 -0
  69. package/v2Components/EmailPreviewV2/_emailPreviewV2.scss +69 -0
  70. package/v2Components/EmailPreviewV2/index.js +132 -0
  71. package/v2Components/EmailPreviewV2/messages.js +41 -0
  72. package/v2Components/EmailPreviewV2/tests/index.test.js +10 -0
  73. package/v2Components/Footer/index.js +27 -0
  74. package/v2Components/Footer/messages.js +13 -0
  75. package/v2Components/Footer/tests/index.test.js +10 -0
  76. package/v2Components/FormBuilder/_formBuilder.scss +78 -0
  77. package/v2Components/FormBuilder/index.js +3309 -0
  78. package/v2Components/FormBuilder/messages.js +13 -0
  79. package/v2Components/FormBuilder/tests/index.test.js +10 -0
  80. package/v2Components/Header/index.js +46 -0
  81. package/v2Components/Header/messages.js +25 -0
  82. package/v2Components/Header/tests/index.test.js +10 -0
  83. package/v2Components/ImagePreview/_imagePreview.scss +63 -0
  84. package/v2Components/ImagePreview/index.js +52 -0
  85. package/v2Components/ImagePreview/messages.js +13 -0
  86. package/v2Components/ImagePreview/tests/index.test.js +10 -0
  87. package/v2Components/MobilePushPreviewV2/index.js +120 -0
  88. package/v2Components/MobilePushPreviewV2/messages.js +13 -0
  89. package/v2Components/MobilePushPreviewV2/tests/index.test.js +10 -0
  90. package/v2Components/NewCallTask/_newCallTask.scss +9 -0
  91. package/v2Components/NewCallTask/index.js +152 -0
  92. package/v2Components/NewCallTask/messages.js +29 -0
  93. package/v2Components/NewCallTask/tests/index.test.js +10 -0
  94. package/v2Components/PageHeader/_pageHeader.scss +22 -0
  95. package/v2Components/PageHeader/index.js +37 -0
  96. package/v2Components/PageHeader/messages.js +13 -0
  97. package/v2Components/PageHeader/tests/index.test.js +10 -0
  98. package/v2Components/Pagination/_pagination.scss +5 -0
  99. package/v2Components/Pagination/index.js +49 -0
  100. package/v2Components/Pagination/tests/index.test.js +10 -0
  101. package/v2Components/PreviewSideBar/_previewsidebar.scss +28 -0
  102. package/v2Components/PreviewSideBar/index.js +150 -0
  103. package/v2Components/PreviewSideBar/messages.js +33 -0
  104. package/v2Components/PreviewSideBar/tests/index.test.js +10 -0
  105. package/v2Components/Sidebar/_sidebar.scss +115 -0
  106. package/v2Components/Sidebar/index.js +208 -0
  107. package/v2Components/Sidebar/messages.js +21 -0
  108. package/v2Components/Sidebar/tests/index.test.js +10 -0
  109. package/v2Components/SlideBox/_slideBox.scss +63 -0
  110. package/v2Components/SlideBox/index.js +48 -0
  111. package/v2Components/SlideBox/tests/index.test.js +103 -0
  112. package/v2Components/SmsEditor/index.js +55 -0
  113. package/v2Components/SmsEditor/tests/index.test.js +10 -0
  114. package/v2Components/SmsTest/index.js +115 -0
  115. package/v2Components/SmsTest/messages.js +13 -0
  116. package/v2Components/SmsTest/tests/index.test.js +10 -0
  117. package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/_wechatRichmediaTemplatePrev.scss +42 -0
  118. package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/index.js +139 -0
  119. package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/messages.js +21 -0
  120. package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/tests/index.test.js +10 -0
  121. package/v2Components/TemplatePreview/_templatePreview.scss +352 -0
  122. package/v2Components/TemplatePreview/assets/images/WECHAT_5x.png +0 -0
  123. package/v2Components/TemplatePreview/assets/images/androidPushMessage.svg +45 -0
  124. package/v2Components/TemplatePreview/assets/images/iPhonePushMessage.svg +135 -0
  125. package/v2Components/TemplatePreview/assets/images/mobile.svg +24 -0
  126. package/v2Components/TemplatePreview/assets/images/sms-body.png +0 -0
  127. package/v2Components/TemplatePreview/assets/images/sms-icon.png +0 -0
  128. package/v2Components/TemplatePreview/assets/images/sms_mobile.png +0 -0
  129. package/v2Components/TemplatePreview/assets/images/user-icon.svg +19 -0
  130. package/v2Components/TemplatePreview/assets/images/wechat-mobile.svg +78 -0
  131. package/v2Components/TemplatePreview/index.js +175 -0
  132. package/v2Components/TemplatePreview/messages.js +37 -0
  133. package/v2Components/TemplatePreview/tests/index.test.js +10 -0
  134. package/v2Components/Toastr/index.js +60 -0
  135. package/v2Components/Toastr/messages.js +13 -0
  136. package/v2Components/Toastr/tests/index.test.js +10 -0
  137. package/v2Components/ToastrMessage/index.js +110 -0
  138. package/v2Components/ToastrMessage/messages.js +13 -0
  139. package/v2Components/ToastrMessage/tests/index.test.js +10 -0
  140. package/v2Components/TopBar/_topbar.scss +46 -0
  141. package/v2Components/TopBar/assets/images/capillary_logo.png +0 -0
  142. package/v2Components/TopBar/index.js +113 -0
  143. package/v2Components/TopBar/messages.js +29 -0
  144. package/v2Components/TopBar/tests/index.test.js +10 -0
  145. package/v2Containers/Assets/Gallery/index.js +1 -1
  146. package/v2Containers/CallTask/index.js +1 -1
  147. package/v2Containers/Cap/index.js +2 -2
  148. package/v2Containers/CreativesContainer/SlideBoxContent.js +3 -3
  149. package/v2Containers/CreativesContainer/index.js +1 -0
  150. package/v2Containers/Dashboard/index.js +2 -2
  151. package/v2Containers/Ebill/index.js +2 -2
  152. package/v2Containers/Email/index.js +4 -4
  153. package/v2Containers/EmailWrapper/index.js +1 -1
  154. package/v2Containers/Line/Create/index.js +1 -1
  155. package/v2Containers/Line/Edit/index.js +1 -1
  156. package/v2Containers/Login/index.js +1 -1
  157. package/v2Containers/MobilePush/Create/index.js +1 -1
  158. package/v2Containers/MobilePush/Edit/index.js +1 -1
  159. package/v2Containers/Sms/Create/index.js +1 -1
  160. package/v2Containers/Sms/Edit/index.js +1 -1
  161. package/v2Containers/TagList/index.js +1 -1
  162. package/v2Containers/Templates/index.js +4 -4
  163. package/v2Containers/TestPage/index.js +1 -1
  164. package/v2Containers/WeChat/MapTemplates/index.js +3 -3
  165. package/v2Containers/WeChat/RichmediaTemplates/Create/index.js +3 -3
  166. package/containers/WeChat/_wechat.scss +0 -8
  167. package/containers/WeChat/actions.js +0 -46
  168. package/containers/WeChat/constants.js +0 -28
  169. package/containers/WeChat/index.js +0 -1617
  170. package/containers/WeChat/messages.js +0 -73
  171. package/containers/WeChat/reducer.js +0 -74
  172. package/containers/WeChat/sagas.js +0 -86
  173. package/containers/WeChat/selectors.js +0 -25
  174. package/containers/WeChat/tests/actions.test.js +0 -18
  175. package/containers/WeChat/tests/reducer.test.js +0 -9
  176. package/containers/WeChat/tests/sagas.test.js +0 -15
  177. package/containers/WeChat/tests/selectors.test.js +0 -10
@@ -0,0 +1,175 @@
1
+ /**
2
+ *
3
+ * TemplatePreview
4
+ *
5
+ */
6
+
7
+ import PropTypes from 'prop-types';
8
+
9
+ import React from 'react';
10
+ import _ from 'lodash';
11
+ import { injectIntl, FormattedMessage} from 'react-intl';
12
+ // import styled from 'styled-components';
13
+ import {CapColumn, CapRow, CapHeading} from '@capillarytech/cap-ui-library';
14
+ import './_templatePreview.scss';
15
+ import {updateCharCount} from '../../utils/smsCharCountV2';
16
+ import messages from './messages';
17
+ const smsIcon = require('./assets/images/user-icon.svg');
18
+ const wechatBody = require('./assets/images/WECHAT_5x.png');
19
+ const smsBody = require('./assets/images/mobile.svg');
20
+ const androidPushMessagePhone = require('./assets/images/androidPushMessage.svg');
21
+ const iPhonePushMessagePhone = require('./assets/images/iPhonePushMessage.svg');
22
+
23
+ class TemplatePreview extends React.Component { // eslint-disable-line react/prefer-stateless-function
24
+ render() {
25
+ let content = channel && channel.toLowerCase() === 'sms' ? [this.props.content] : this.props.content;
26
+ const channel = this.props.channel;
27
+ let smsDetails = {};
28
+ // let smsText = '';
29
+ if (this.props.content && this.props.charCounterEnabled) {
30
+ smsDetails = updateCharCount(this.props.content, this.props.unicodeEnabled);
31
+ content = [];
32
+ for (let i = 0, limit = 0; i < smsDetails.parts; i += 1, limit += smsDetails.chars_sms) {
33
+ content.push(smsDetails.char_list.slice(limit, smsDetails.chars_sms * (i + 1)));
34
+ }
35
+ if (document.getElementById("msg_count") && this.props.showCount) {
36
+ document.getElementById("msg_count").val = smsDetails.parts;
37
+ }
38
+ //smsText = this.props.intl.formatMessage(messages.previewGenerationMessage);
39
+ //console.log('message text', smsText);
40
+ }
41
+ const type = this.props.location && this.props.location.query.type ? this.props.location.query.type : '';
42
+ let iosActions = [];
43
+ if (channel.toLowerCase() === "mobilepush") {
44
+ iosActions = _.map(content.actions, (action) => {
45
+ if (action.label) {
46
+ return (<div className="actions" key={`action-${action.label}`}>
47
+ <span className="action">{action.label.toUpperCase()}</span>
48
+ </div>);
49
+ }
50
+ return undefined;
51
+ });
52
+ }
53
+ return (
54
+ <CapRow>
55
+ {this.props.showCount && <CapColumn span={16}>
56
+ {channel && channel.toLowerCase() === 'sms' && <CapHeading type="h3">
57
+ <FormattedMessage {...messages.charactersTotal} values={{smsCount: smsDetails.parts, charCount: smsDetails.chars_used}}/>
58
+ {smsDetails.unicode &&
59
+ <FormattedMessage {...messages.smsFormatType}/>
60
+ }
61
+ </CapHeading>}
62
+ </CapColumn>}
63
+ <CapColumn span={this.props.showCount ? 8 : 24}>
64
+ <div className={`preview-container ${type === 'embedded' ? 'embedded-preview' : ''}`}>
65
+ { channel && channel.toLowerCase() === 'sms' &&
66
+ <div className="shell align-center" id="sms-preview">
67
+ <img className="preview-image sms" src={smsBody} alt="Preview is being generated"/>
68
+ <div className="msgContainer sms">
69
+ <img className="sms-icon" src={smsIcon} alt="Sms icon" />
70
+ <div className={"message-pop sms"}>
71
+ {content && content.length && content.map((msg, index) =>
72
+ <CapColumn key={`"message-pop-content-${index}`} className="message-pop-item align-left" style={{ background: '#3F51B5', color: '#ffffff'}}>
73
+ {msg}
74
+ </CapColumn>)
75
+ }
76
+ </div>
77
+ </div>
78
+ </div>
79
+ }
80
+ {channel && channel.toLowerCase() === 'wechat' ?
81
+ ( <div className="shell align-center" id="sms-preview">
82
+ <img className="preview-image" src={channel.toLowerCase() === 'wechat' ? wechatBody : smsBody} alt="Preview is being generated"/>
83
+ <div className="msgContainer">
84
+ {this.props.channel.toLowerCase() === 'wechat' ? <div className="sms-icon" style={{ width: '25px', height: '25px', background: '#2E89DF' }}></div> : <img className="sms-icon" src={smsIcon} alt="Sms icon" />}
85
+ <div className="message-pop align-left" style={{ background: `${this.props.channel.toLowerCase() === 'wechat' ? '#ffffff' : '#3F51B5'}`, color: `${this.props.channel.toLowerCase() === 'wechat' ? '#333333' : '#ffffff'}`}}>{content}
86
+ </div>
87
+ </div>
88
+ </div>
89
+ ) : ''
90
+ }
91
+ { channel && (channel.toLowerCase() === 'mobilepush') &&
92
+ (<div className="shell align-center" id="mobilepush-preview">
93
+ <img className="preview-image" src={this.props.device === "android" ? androidPushMessagePhone : iPhonePushMessagePhone} alt="Preview is being generated"/>
94
+ {(!!content.header || !!content.bodyText || !!content.bodyImage) &&
95
+ <div className={`${this.props.device}-push-message-Container`}>
96
+ {this.props.device === "android" ?
97
+ <div className="message-pop align-left">
98
+ <div className="app-name">
99
+ <span className="app-icon"></span> {content.appName ? content.appName : "App name"}
100
+ </div>
101
+ <div className="title">
102
+ {content.header}
103
+ </div>
104
+ <div className="body-text">
105
+ {content.bodyText}
106
+ </div>
107
+ {content.bodyImage && <div className="body-image">
108
+ <img src={content.bodyImage} alt={content.bodyText} />
109
+ </div>}
110
+ {content.actions.filter((action) => action.label).length &&
111
+ <div className="actions">
112
+ {_.map(content.actions, (action) => !!action.label &&
113
+ <span className="action" key={`action-${action.label}`}>{action.label && action.label.toUpperCase()}</span>)}
114
+ </div>
115
+ }
116
+ </div>
117
+ :
118
+ <div className="message-pop align-left">
119
+ <div className="app-name">
120
+ <span className="app-icon"></span>{content.appName ? content.appName : "App name"} <i className="material-icons">close</i>
121
+ </div>
122
+ {content.bodyImage && <div className="body-image">
123
+ <img src={content.bodyImage} alt={content.bodyText}/>
124
+ </div>}
125
+ <div className="title">
126
+ {content.header}
127
+ </div>
128
+ <div className="body-text">
129
+ {content.bodyText}
130
+ </div>
131
+ {content.actions.filter((action) => action.label).length && iosActions}
132
+ </div>
133
+ }
134
+ </div>
135
+ }
136
+ </div>
137
+ )
138
+ }
139
+ {
140
+ channel && channel.toLowerCase() === 'line' ? (
141
+ <div className="shell align-center" id="sms-preview">
142
+ <img className="preview-image" src={wechatBody} alt="Preview is being generated"/>
143
+ <div className="msgContainer">
144
+ <div className="sms-icon" style={{ width: '25px', height: '25px', background: '#2E89DF' }}></div>
145
+ <div className="message-pop align-left" style={{ background: '#ffffff', color: '#333333' }}>
146
+ { (content && content.bodyImage) ? <img src={content.bodyImage} alt="ddd" style={{maxWidth: '100%'}}/> : '' }
147
+ { (content && content.bodyText) ? content.bodyText : ''}
148
+ </div>
149
+ </div>
150
+ { (content && content.bodyText) ? <p style={{fontSize: 16, fontWeight: "bold"}}>Chars Count: {content.bodyText.length} / (1600)</p> : '' }
151
+ </div>
152
+ ) : ''
153
+ }
154
+
155
+ </div>
156
+
157
+ </CapColumn>
158
+ </CapRow>
159
+ );
160
+ }
161
+ }
162
+ TemplatePreview.propTypes = {
163
+ content: PropTypes.oneOfType([
164
+ PropTypes.object,
165
+ PropTypes.string,
166
+ ]),
167
+ channel: PropTypes.string,
168
+ charCounterEnabled: PropTypes.bool,
169
+ location: PropTypes.object,
170
+ device: PropTypes.string,
171
+ unicodeEnabled: PropTypes.bool,
172
+ showCount: PropTypes.bool,
173
+ };
174
+
175
+ export default (injectIntl(TemplatePreview));
@@ -0,0 +1,37 @@
1
+ /*
2
+ * TemplatePreview Messages
3
+ *
4
+ * This contains all the text for the TemplatePreview component.
5
+ */
6
+ import { defineMessages } from 'react-intl';
7
+
8
+ export default defineMessages({
9
+ previewGenerationMessage: {
10
+ id: 'app.components.TemplatePreview.previewGenerationMessage',
11
+ defaultMessage: "Preview is being generated",
12
+ },
13
+ sms: {
14
+ id: 'app.components.TemplatePreview.sms',
15
+ defaultMessage: "SMS",
16
+ },
17
+ charactersPerSms: {
18
+ id: 'app.components.TemplatePreview.charactersPerSms',
19
+ defaultMessage: "SMS Chars",
20
+ },
21
+ charactersTotal: {
22
+ id: 'app.components.TemplatePreview.charactersTotal',
23
+ defaultMessage: "{smsCount} SMS ({charCount} characters)",
24
+ },
25
+ smsFormatType: {
26
+ id: 'app.components.TemplatePreview.smsFormatType',
27
+ defaultMessage: 'Message has unicode characters',
28
+ },
29
+ lastModified: {
30
+ id: 'app.components.PreviewSideBar.lastModified',
31
+ defaultMessage: 'Last Modified On',
32
+ },
33
+ uploadedBy: {
34
+ id: 'app.components.PreviewSideBar.uploadedBy',
35
+ defaultMessage: 'Last Modified By',
36
+ },
37
+ });
@@ -0,0 +1,10 @@
1
+ // import React from 'react';
2
+ // import { shallow } from 'enzyme';
3
+
4
+ // import TemplatePreview from '../index';
5
+
6
+ describe('<TemplatePreview />', () => {
7
+ it('Expect to have unit tests specified', () => {
8
+ expect(true).toEqual(false);
9
+ });
10
+ });
@@ -0,0 +1,60 @@
1
+ import PropTypes from 'prop-types';
2
+ import React from 'react';
3
+ import styled from 'styled-components';
4
+ import { messagePositionConfig } from '../../config/toastr';
5
+ import ToastrMessage from '../ToastrMessage';
6
+
7
+ // import { FormattedMessage } from 'react-intl';
8
+ // import messages from './messages';
9
+
10
+ const StyledMessageContainer = styled.div`
11
+ position: fixed;
12
+ width: 320px;
13
+ transition: all .2s ease-out;
14
+ font-family: open-sans,sans-serif;
15
+ margin-top: 64px;
16
+ margin-right: 32px;
17
+ z-index: 10005;
18
+ `;
19
+
20
+ class Toastr extends React.Component { // eslint-disable-line react/prefer-stateless-function
21
+ constructor(prop) {
22
+ super(prop);
23
+ this.state = {
24
+ percentCompleted: 0,
25
+ percCompleted: {},
26
+ };
27
+ this.percCompleted = 0;
28
+ this.currentTime = 0;
29
+ this.closeMessagePopup = this.closeMessagePopup.bind(this);
30
+ }
31
+
32
+ closeMessagePopup(messageIndex) {
33
+ this.props.handleRemoveMessage(messageIndex);
34
+ }
35
+
36
+ render() {
37
+ return (
38
+ <StyledMessageContainer style={{ ...messagePositionConfig[this.props.position] }}>
39
+ {this.props.messagesList.map((message) => {
40
+ console.log('Messages', message);
41
+ return <ToastrMessage key={message.messageId} timeout={this.props.timeout} messageId={message.messageId} title={message.title} text={message.text} type={message.type} handleMessageClose={this.closeMessagePopup} hideProgressBar={message.hideProgressBar} />;
42
+ })}
43
+ </StyledMessageContainer>
44
+ );
45
+ }
46
+ }
47
+
48
+ Toastr.propTypes = {
49
+ messagesList: PropTypes.array.isRequired,
50
+ timeout: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]),
51
+ position: PropTypes.string,
52
+ handleRemoveMessage: PropTypes.func,
53
+ };
54
+
55
+ Toastr.defaultProps = {
56
+ type: 'info',
57
+ timeout: '4',
58
+ position: 'bottom right',
59
+ };
60
+ export default Toastr;
@@ -0,0 +1,13 @@
1
+ /*
2
+ * Toastr Messages
3
+ *
4
+ * This contains all the text for the Toastr component.
5
+ */
6
+ import { defineMessages } from 'react-intl';
7
+
8
+ export default defineMessages({
9
+ header: {
10
+ id: 'app.components.Toastr.header',
11
+ defaultMessage: 'This is the Toastr component !',
12
+ },
13
+ });
@@ -0,0 +1,10 @@
1
+ // import React from 'react';
2
+ // import { shallow } from 'enzyme';
3
+
4
+ // import Toastr from '../index';
5
+
6
+ // describe('<Toastr />', () => {
7
+ // it('Expect to have unit tests specified', () => {
8
+ // expect(true).toEqual(false);
9
+ // });
10
+ // });
@@ -0,0 +1,110 @@
1
+ /**
2
+ *
3
+ * ToastrMessage
4
+ *
5
+ */
6
+
7
+ import PropTypes from 'prop-types';
8
+
9
+ import React from 'react';
10
+ import { Progress } from 'semantic-ui-react';
11
+ import styled from 'styled-components';
12
+ import { messageTypeConfig } from '../../config/toastr';
13
+
14
+ const StyledMessageWrapper = styled.div`
15
+ background: #f9f9fa;
16
+ transition: all .2s fade-out;
17
+ -webkit-box-shadow: 2px 2px 10px -1px rgba(0,0,0,0.39);
18
+ -moz-box-shadow: 2px 2px 10px -1px rgba(0,0,0,0.39);
19
+ box-shadow: 2px 2px 10px -1px rgba(0,0,0,0.39);
20
+ border-radius: 5px;
21
+ `;
22
+ const StyleIcon = styled.i`
23
+ float: right;
24
+ cursor: pointer;
25
+ fontSize: 16px;
26
+ `;
27
+ const MessageContent = styled.div`
28
+ padding-left: 14px;
29
+ `;
30
+
31
+ const MessageHeader = styled.div`
32
+ padding-left: 14px;
33
+ font-weight: bold;
34
+ font-family: proxima-nova,sans-serif;
35
+ `;
36
+
37
+ const StyledMessageType = styled.div `
38
+ position: absolute;
39
+ width: 10px;
40
+ height: 100%;
41
+ border-top-left-radius: 5px;
42
+ border-bottom-left-radius: 5px;
43
+ `;
44
+
45
+ class ToastrMessage extends React.Component { // eslint-disable-line react/prefer-stateless-function
46
+ constructor(prop) {
47
+ super(prop);
48
+ this.state = { percent: 0 };
49
+ this.intervalId = null;
50
+ this.closeMessagePopup = this.closeMessagePopup.bind(this);
51
+ }
52
+
53
+ componentDidMount() {
54
+ const distance = 100 / ((this.props.timeout - 500) / 100);
55
+ if (this.props.timeout && this.props.timeout > 500) {
56
+ this.intervalId = setInterval(() => {
57
+ const percent = this.state.percent + distance;
58
+ this.setState({ percent: percent < 100 ? percent : 100 });
59
+ }, 100);
60
+ }
61
+ }
62
+
63
+ componentDidUpdate() {
64
+ if (this.state.percent >= 100 && this.intervalId) {
65
+ this.props.handleMessageClose(this.props.messageId);
66
+ clearTimeout(this.intervalId);
67
+ }
68
+ }
69
+
70
+ componentWillUnmount() {
71
+ if (this.intervalId) {
72
+ clearTimeout(this.intervalId);
73
+ }
74
+ }
75
+
76
+ closeMessagePopup(messageIndex) {
77
+ this.props.handleMessageClose(messageIndex);
78
+ }
79
+
80
+
81
+ render() {
82
+ return (
83
+ <StyledMessageWrapper key={this.props.messageId}>
84
+ <StyledMessageType style={{ ...messageTypeConfig[this.props.type] }} />
85
+ <div style={{ padding: `${16}px` }}>
86
+ <MessageHeader>
87
+ { this.props.title ? <span style={{ fontSize: `${20}px` }}>{this.props.title}</span> : '' }
88
+ <StyleIcon className="material-icons" onClick={() => this.closeMessagePopup(this.props.messageId)}>close</StyleIcon>
89
+ </MessageHeader>
90
+ <MessageContent>
91
+ {this.props.text}
92
+ </MessageContent>
93
+ </div>
94
+ {(this.props.timeout > 0 && !this.props.hideProgressBar) ? <Progress style={{ transition: `${0.4}s linear` }} percent={this.state.percent} attached="bottom" /> : ''}
95
+ </StyledMessageWrapper>
96
+ );
97
+ }
98
+ }
99
+
100
+ ToastrMessage.propTypes = {
101
+ messageId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
102
+ timeout: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]),
103
+ title: PropTypes.string,
104
+ text: PropTypes.string,
105
+ type: PropTypes.string,
106
+ handleMessageClose: PropTypes.func,
107
+ hideProgressBar: PropTypes.bool,
108
+ };
109
+
110
+ export default ToastrMessage;
@@ -0,0 +1,13 @@
1
+ /*
2
+ * ToastrMessage Messages
3
+ *
4
+ * This contains all the text for the ToastrMessage component.
5
+ */
6
+ import { defineMessages } from 'react-intl';
7
+
8
+ export default defineMessages({
9
+ header: {
10
+ id: 'app.components.ToastrMessage.header',
11
+ defaultMessage: 'This is the ToastrMessage component !',
12
+ },
13
+ });
@@ -0,0 +1,10 @@
1
+ // import React from 'react';
2
+ // import { shallow } from 'enzyme';
3
+
4
+ // import ToastrMessage from '../index';
5
+
6
+ // describe('<ToastrMessage />', () => {
7
+ // it('Expect to have unit tests specified', () => {
8
+ // expect(true).toEqual(false);
9
+ // });
10
+ // });
@@ -0,0 +1,46 @@
1
+ .ui.navbar.menu {
2
+ height: 40px !important;
3
+ }
4
+ .ui.menu.navbar .item>img.logo{
5
+ height: 27px !important;
6
+ padding-left: 0!important;
7
+ margin: 0 auto;
8
+ max-width: 200px;
9
+ }
10
+ .ui.menu.navbar .ui.selection.dropdown{
11
+ height: 40px !important;
12
+ }
13
+
14
+ .ui.menu .ui.dropdown .menu>.selected.item {
15
+ background: #151821;
16
+ }
17
+ .org-list-drp-dwn .menu > .item{
18
+ height: 40px !important;
19
+ }
20
+ .ui.menu.navbar .ui.dropdown .menu>.item{
21
+ height: 40px !important;
22
+ }
23
+
24
+ .ui.search.selection.dropdown>input.search{
25
+ padding-left: 12px !important;
26
+ padding-top: 8px !important;
27
+ padding-bottom: 8px !important;
28
+ }
29
+
30
+ .ui.menu:not(.vertical) .right.item, .ui.menu:not(.vertical) .right.menu {
31
+ padding-right: 4px;
32
+ }
33
+
34
+ .ui.menu .item {
35
+ padding-left: 12px !important;
36
+ padding-right: 12px !important;
37
+ }
38
+
39
+ .ui.secondary.vertical.menu>.item {
40
+ margin-bottom: 0 !important;
41
+ padding: 8px 16px !important;
42
+ }
43
+
44
+ .ui.menu.navbar .item.dropdownItem {
45
+ padding: 0px !important;
46
+ }
@@ -0,0 +1,113 @@
1
+ import PropTypes from 'prop-types';
2
+ import React from 'react';
3
+ // import styled from 'styled-components';
4
+
5
+ import { Menu, Image, Dropdown, Popup } from 'semantic-ui-react';
6
+ import { FormattedMessage } from 'react-intl';
7
+ import { Link } from 'react-router';
8
+
9
+ import { loadItem } from 'services/localStorageApi';
10
+ import messages from './messages';
11
+ import './_topbar.scss';
12
+
13
+ const logo = require('./assets/images/capillary_logo.png');
14
+
15
+ class TopBar extends React.Component { // eslint-disable-line react/prefer-stateless-function
16
+ constructor(props) {
17
+ super(props);
18
+ this.state = {
19
+ activeItem: '',
20
+ orgList: [],
21
+ selectedOrg: loadItem('orgID'),
22
+ };
23
+ this.handleItemClick = this.handleItemClick.bind(this);
24
+ this.logout = this.logout.bind(this);
25
+ this.handleOrgChange = this.handleOrgChange.bind(this);
26
+ }
27
+
28
+ componentDidUpdate(prevProps) {
29
+ if (prevProps.orgID !== this.props.orgID) {
30
+ this.props.navigateToDashboard();
31
+ }
32
+ }
33
+
34
+ handleOrgChange(data) {
35
+ const orgId = data.value;
36
+ if (this.state.selectedOrg !== orgId) {
37
+ this.props.changeOrg(orgId);
38
+ this.setState({ selectedOrg: orgId });
39
+ }
40
+ }
41
+
42
+ handleItemClick(e) {
43
+ this.setState({ activeItem: e.target.id });
44
+ }
45
+
46
+ logout(e) {
47
+ e.preventDefault();
48
+ this.props.logout();
49
+ }
50
+
51
+ render() {
52
+ const proxyOrgList = this.props.proxyOrgList;
53
+ const defaultOrgName = this.props.orgName;
54
+ const selectedOrg = loadItem('orgID');
55
+ return (
56
+ <Menu className="navbar" key="navbar">
57
+
58
+ <Menu.Item key="logo" as={Link} to="/" name="logo" className="logo-container" onClick={this.handleItemClick}>
59
+ <Image className="logo" src={logo} alt="Capillary Technologies" />
60
+ </Menu.Item>
61
+
62
+ { proxyOrgList.length > 1 ?
63
+ <Menu.Item className="dropdownItem" key="orgSelection">
64
+ <FormattedMessage {...messages.dropdownMessage}>
65
+ {(message) => <Dropdown
66
+ placeholder={message}
67
+ className="org-list-drp-dwn"
68
+ defaultValue={selectedOrg}
69
+ search
70
+ options={proxyOrgList}
71
+ selection
72
+ onChange={(event, data) => this.handleOrgChange(data)}
73
+ />}
74
+ </FormattedMessage>
75
+ </Menu.Item> :
76
+ <Menu.Item key="default-org">
77
+ {defaultOrgName}
78
+ </Menu.Item>
79
+ }
80
+
81
+ <Menu.Menu position="right">
82
+ <Menu.Item key="first-name">
83
+ <FormattedMessage {...messages.hi} />&nbsp;{this.props.userName}!
84
+ </Menu.Item>
85
+ <Menu.Item key="user-details">
86
+ <Popup
87
+ trigger={<i className="material-icons">person</i>}
88
+ content={< div className="ui secondary vertical menu">
89
+ <a href="" className="item hide"><FormattedMessage {...messages.profile} /><i className="user icon" /></a>
90
+ <a href="" className="item hide"><FormattedMessage {...messages.settings} /> <i className="settings icon" /></a>
91
+ <a href="" className="item" onClick={this.logout}><FormattedMessage {...messages.logout} />
92
+ <i className="sign out icon" /></a> </div >}
93
+ on="click" position="bottom right" offset={7}
94
+ />
95
+ </Menu.Item>
96
+ </Menu.Menu>
97
+ </Menu>
98
+
99
+ );
100
+ }
101
+ }
102
+
103
+ TopBar.propTypes = {
104
+ userName: PropTypes.string,
105
+ proxyOrgList: PropTypes.array,
106
+ orgName: PropTypes.string,
107
+ orgID: PropTypes.number,
108
+ navigateToDashboard: PropTypes.func,
109
+ changeOrg: PropTypes.func,
110
+ logout: PropTypes.func,
111
+ };
112
+
113
+ export default TopBar;
@@ -0,0 +1,29 @@
1
+ /*
2
+ * TopBar Messages
3
+ *
4
+ * This contains all the text for the TopBar component.
5
+ */
6
+ import { defineMessages } from 'react-intl';
7
+
8
+ export default defineMessages({
9
+ profile: {
10
+ id: 'reon.components.TopBar.profile',
11
+ defaultMessage: 'Profile',
12
+ },
13
+ settings: {
14
+ id: 'reon.components.TopBar.settings',
15
+ defaultMessage: 'Settings',
16
+ },
17
+ logout: {
18
+ id: 'reon.components.TopBar.logout',
19
+ defaultMessage: 'Logout',
20
+ },
21
+ dropdownMessage: {
22
+ id: 'reon.components.TopBar.brand.dropdown',
23
+ defaultMessage: 'Select Brand',
24
+ },
25
+ hi: {
26
+ id: 'app.components.TopBar.brand.dropdown',
27
+ defaultMessage: 'Hi',
28
+ },
29
+ });
@@ -0,0 +1,10 @@
1
+ // import React from 'react';
2
+ // import { shallow } from 'enzyme';
3
+
4
+ // import TopBar from '../index';
5
+
6
+ // describe('<TopBar />', () => {
7
+ // it('Expect to have unit tests specified', () => {
8
+ // expect(true).toEqual(false);
9
+ // });
10
+ // });
@@ -22,7 +22,7 @@ import { UserIsAuthenticated } from '../../../utils/authWrapper';
22
22
  import * as globalActions from '../../Cap/actions';
23
23
  import {getMessageObject} from '../../../utils/messageUtils';
24
24
  import * as commonUtil from '../../../utils/common';
25
- import Pagination from '../../../components/Pagination';
25
+ import Pagination from '../../../v2Components/Pagination';
26
26
 
27
27
  import './_gallery.scss';
28
28
  const {CapCustomCardList} = CapCustomCard;
@@ -20,7 +20,7 @@ import { makeSelectMetaEntities, isLoadingMetaEntities } from '../Cap/selectors'
20
20
  import * as globalActions from '../../containers/Cap/actions';
21
21
  import * as actions from "./actions";
22
22
  import makeSelectCallTask from './selectors';
23
- import NewCallTask from '../../components/NewCallTask';
23
+ import NewCallTask from '../../v2Components/NewCallTask';
24
24
  import messages from './messages';
25
25
  import './_callTask.scss';
26
26