@capillarytech/creatives-library 2.0.82 → 2.0.83
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.
- package/components/CapTagList/index.js +24 -21
- package/components/CardGrid/index.js +10 -16
- package/components/Ckeditor/index.js +1 -2
- package/components/CustomPopOver/index.js +1 -1
- package/components/EmailPreview/index.js +2 -3
- package/components/FormBuilder/_formBuilder.scss +15 -8
- package/components/FormBuilder/index.js +194 -260
- package/components/Header/index.js +1 -4
- package/components/PreviewSideBar/_previewsidebar.scss +1 -1
- package/components/PreviewSideBar/index.js +5 -3
- package/components/TemplatePreview/WechatRichmediaTemplatePreview/index.js +3 -2
- package/components/TemplatePreview/_templatePreview.scss +1 -1
- package/components/TemplatePreview/index.js +47 -47
- package/components/TemplatePreview/messages.js +1 -9
- package/containers/Assets/Gallery/index.js +1 -1
- package/containers/Email/index.js +1 -1
- package/containers/Login/components/LoginForm/index.js +1 -1
- package/containers/Templates/index.js +1 -1
- package/containers/WeChat/RichmediaTemplates/Create/index.js +1 -1
- package/package.json +2 -1
- package/v2Components/BreadCrumbs/index.js +65 -0
- package/v2Components/BreadCrumbs/messages.js +13 -0
- package/v2Components/BreadCrumbs/tests/index.test.js +10 -0
- package/v2Components/CallTaskPreview/_callTaskPreview.scss +17 -0
- package/v2Components/CallTaskPreview/images/Footer.png +0 -0
- package/v2Components/CallTaskPreview/images/Header.png +0 -0
- package/v2Components/CallTaskPreview/index.js +37 -0
- package/v2Components/CallTaskPreview/messages.js +13 -0
- package/v2Components/CallTaskPreview/tests/index.test.js +15 -0
- package/v2Components/CapTagList/index.js +232 -0
- package/v2Components/CapTagList/messages.js +25 -0
- package/v2Components/CapTagList/tests/index.test.js +10 -0
- package/v2Components/Card/_customCard.scss +27 -0
- package/v2Components/Card/index.js +78 -0
- package/{containers/WeChat → v2Components/Card}/tests/index.test.js +2 -2
- package/v2Components/CardGrid/index.js +77 -0
- package/v2Components/CardGrid/tests/index.test.js +10 -0
- package/v2Components/Ckeditor/index.js +234 -0
- package/v2Components/Ckeditor/messages.js +13 -0
- package/v2Components/Ckeditor/tests/index.test.js +10 -0
- package/v2Components/CmsTemplatesComponent/index.js +33 -0
- package/v2Components/CmsTemplatesComponent/messages.js +17 -0
- package/v2Components/CmsTemplatesComponent/tests/index.test.js +10 -0
- package/v2Components/Component/index.js +29 -0
- package/v2Components/Component/tests/index.test.js +10 -0
- package/v2Components/CustomPopOver/index.js +82 -0
- package/v2Components/CustomPopOver/messages.js +13 -0
- package/v2Components/CustomPopOver/tests/index.test.js +10 -0
- package/v2Components/DateFilter/index.js +349 -0
- package/v2Components/DateFilter/messages.js +17 -0
- package/v2Components/DateFilter/tests/index.test.js +15 -0
- package/v2Components/DateRange/index.js +113 -0
- package/v2Components/DateRange/messages.js +13 -0
- package/v2Components/DateRange/tests/index.test.js +10 -0
- package/v2Components/Edmeditor/index.js +65 -0
- package/v2Components/Edmeditor/messages.js +13 -0
- package/v2Components/Edmeditor/tests/index.test.js +10 -0
- package/v2Components/EmailMobilePreview/index.js +129 -0
- package/v2Components/EmailMobilePreview/index.scss +55 -0
- package/v2Components/EmailPreview/_emailPreview.scss +119 -0
- package/v2Components/EmailPreview/index.js +106 -0
- package/v2Components/EmailPreview/messages.js +17 -0
- package/v2Components/EmailPreview/tests/index.test.js +10 -0
- package/v2Components/EmailPreviewV2/_emailPreviewV2.scss +69 -0
- package/v2Components/EmailPreviewV2/index.js +132 -0
- package/v2Components/EmailPreviewV2/messages.js +41 -0
- package/v2Components/EmailPreviewV2/tests/index.test.js +10 -0
- package/v2Components/Footer/index.js +27 -0
- package/v2Components/Footer/messages.js +13 -0
- package/v2Components/Footer/tests/index.test.js +10 -0
- package/v2Components/FormBuilder/_formBuilder.scss +78 -0
- package/v2Components/FormBuilder/index.js +3309 -0
- package/v2Components/FormBuilder/messages.js +13 -0
- package/v2Components/FormBuilder/tests/index.test.js +10 -0
- package/v2Components/Header/index.js +46 -0
- package/v2Components/Header/messages.js +25 -0
- package/v2Components/Header/tests/index.test.js +10 -0
- package/v2Components/ImagePreview/_imagePreview.scss +63 -0
- package/v2Components/ImagePreview/index.js +52 -0
- package/v2Components/ImagePreview/messages.js +13 -0
- package/v2Components/ImagePreview/tests/index.test.js +10 -0
- package/v2Components/MobilePushPreviewV2/index.js +120 -0
- package/v2Components/MobilePushPreviewV2/messages.js +13 -0
- package/v2Components/MobilePushPreviewV2/tests/index.test.js +10 -0
- package/v2Components/NewCallTask/_newCallTask.scss +9 -0
- package/v2Components/NewCallTask/index.js +152 -0
- package/v2Components/NewCallTask/messages.js +29 -0
- package/v2Components/NewCallTask/tests/index.test.js +10 -0
- package/v2Components/PageHeader/_pageHeader.scss +22 -0
- package/v2Components/PageHeader/index.js +37 -0
- package/v2Components/PageHeader/messages.js +13 -0
- package/v2Components/PageHeader/tests/index.test.js +10 -0
- package/v2Components/Pagination/_pagination.scss +5 -0
- package/v2Components/Pagination/index.js +49 -0
- package/v2Components/Pagination/tests/index.test.js +10 -0
- package/v2Components/PreviewSideBar/_previewsidebar.scss +28 -0
- package/v2Components/PreviewSideBar/index.js +150 -0
- package/v2Components/PreviewSideBar/messages.js +33 -0
- package/v2Components/PreviewSideBar/tests/index.test.js +10 -0
- package/v2Components/Sidebar/_sidebar.scss +115 -0
- package/v2Components/Sidebar/index.js +208 -0
- package/v2Components/Sidebar/messages.js +21 -0
- package/v2Components/Sidebar/tests/index.test.js +10 -0
- package/v2Components/SlideBox/_slideBox.scss +63 -0
- package/v2Components/SlideBox/index.js +48 -0
- package/v2Components/SlideBox/tests/index.test.js +103 -0
- package/v2Components/SmsEditor/index.js +55 -0
- package/v2Components/SmsEditor/tests/index.test.js +10 -0
- package/v2Components/SmsTest/index.js +115 -0
- package/v2Components/SmsTest/messages.js +13 -0
- package/v2Components/SmsTest/tests/index.test.js +10 -0
- package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/_wechatRichmediaTemplatePrev.scss +42 -0
- package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/index.js +139 -0
- package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/messages.js +21 -0
- package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/tests/index.test.js +10 -0
- package/v2Components/TemplatePreview/_templatePreview.scss +352 -0
- package/v2Components/TemplatePreview/assets/images/WECHAT_5x.png +0 -0
- package/v2Components/TemplatePreview/assets/images/androidPushMessage.svg +45 -0
- package/v2Components/TemplatePreview/assets/images/iPhonePushMessage.svg +135 -0
- package/v2Components/TemplatePreview/assets/images/mobile.svg +24 -0
- package/v2Components/TemplatePreview/assets/images/sms-body.png +0 -0
- package/v2Components/TemplatePreview/assets/images/sms-icon.png +0 -0
- package/v2Components/TemplatePreview/assets/images/sms_mobile.png +0 -0
- package/v2Components/TemplatePreview/assets/images/user-icon.svg +19 -0
- package/v2Components/TemplatePreview/assets/images/wechat-mobile.svg +78 -0
- package/v2Components/TemplatePreview/index.js +175 -0
- package/v2Components/TemplatePreview/messages.js +37 -0
- package/v2Components/TemplatePreview/tests/index.test.js +10 -0
- package/v2Components/Toastr/index.js +60 -0
- package/v2Components/Toastr/messages.js +13 -0
- package/v2Components/Toastr/tests/index.test.js +10 -0
- package/v2Components/ToastrMessage/index.js +110 -0
- package/v2Components/ToastrMessage/messages.js +13 -0
- package/v2Components/ToastrMessage/tests/index.test.js +10 -0
- package/v2Components/TopBar/_topbar.scss +46 -0
- package/v2Components/TopBar/assets/images/capillary_logo.png +0 -0
- package/v2Components/TopBar/index.js +113 -0
- package/v2Components/TopBar/messages.js +29 -0
- package/v2Components/TopBar/tests/index.test.js +10 -0
- package/v2Containers/Assets/Gallery/index.js +1 -1
- package/v2Containers/CallTask/index.js +1 -1
- package/v2Containers/Cap/index.js +2 -2
- package/v2Containers/CreativesContainer/SlideBoxContent.js +3 -3
- package/v2Containers/CreativesContainer/index.js +1 -0
- package/v2Containers/Dashboard/index.js +2 -2
- package/v2Containers/Ebill/index.js +2 -2
- package/v2Containers/Email/index.js +4 -4
- package/v2Containers/EmailWrapper/index.js +1 -1
- package/v2Containers/Line/Create/index.js +1 -1
- package/v2Containers/Line/Edit/index.js +1 -1
- package/v2Containers/Login/index.js +1 -1
- package/v2Containers/MobilePush/Create/index.js +1 -1
- package/v2Containers/MobilePush/Edit/index.js +1 -1
- package/v2Containers/Sms/Create/index.js +1 -1
- package/v2Containers/Sms/Edit/index.js +1 -1
- package/v2Containers/TagList/index.js +1 -1
- package/v2Containers/Templates/index.js +4 -4
- package/v2Containers/TestPage/index.js +1 -1
- package/v2Containers/WeChat/MapTemplates/index.js +3 -3
- package/v2Containers/WeChat/RichmediaTemplates/Create/index.js +3 -3
- package/containers/WeChat/_wechat.scss +0 -8
- package/containers/WeChat/actions.js +0 -46
- package/containers/WeChat/constants.js +0 -28
- package/containers/WeChat/index.js +0 -1617
- package/containers/WeChat/messages.js +0 -73
- package/containers/WeChat/reducer.js +0 -74
- package/containers/WeChat/sagas.js +0 -86
- package/containers/WeChat/selectors.js +0 -25
- package/containers/WeChat/tests/actions.test.js +0 -18
- package/containers/WeChat/tests/reducer.test.js +0 -9
- package/containers/WeChat/tests/sagas.test.js +0 -15
- 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,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,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
|
+
}
|
|
Binary file
|
|
@@ -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} /> {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
|
+
});
|
|
@@ -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 '../../../
|
|
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 '../../
|
|
23
|
+
import NewCallTask from '../../v2Components/NewCallTask';
|
|
24
24
|
import messages from './messages';
|
|
25
25
|
import './_callTask.scss';
|
|
26
26
|
|