@capillarytech/creatives-library 3.4.5 → 3.4.7
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/TemplatePreview/assets/images/home-screen-android.svg +21 -0
- package/components/TemplatePreview/assets/images/home-screen-ios.svg +16 -0
- package/components/TemplatePreview/assets/images/sms-mobile-ios.svg +16 -0
- package/components/TemplatePreview/assets/images/sms_mobile_android.svg +22 -0
- package/components/TemplatePreview/assets/images/sms_mobile_ios.svg +16 -0
- package/components/TemplatePreview/assets/images/sms_mobile_new.svg +22 -0
- package/components/TemplatePreview/assets/images/wechat_mobile_android.svg +20 -0
- package/config/app.js +2 -0
- package/containers/Cap/messsages.js +63 -0
- package/containers/Sms/Create/messages.js +1 -1
- package/containers/Sms/Edit/messages.js +1 -1
- package/containers/WeChat/MapTemplates/messages.js +1 -1
- package/index.js +6 -0
- package/initialState.js +3 -0
- package/package.json +2 -1
- package/routes.js +6 -1
- package/services/api.js +25 -9
- package/translations/en.json +61 -5
- package/translations/zh.json +56 -0
- package/v2Components/Header/index.js +46 -0
- package/v2Components/Header/tests/index.test.js +10 -0
- package/v2Components/MarketingObjective/MarketingObjective.style.js +73 -0
- package/v2Components/MarketingObjective/index.js +107 -0
- package/v2Components/MarketingObjective/messages.js +23 -0
- package/v2Components/NavigationBar/index.js +5 -10
- package/v2Components/NavigationBar/messages.js +28 -0
- package/v2Components/TemplatePreview/assets/images/home-screen-android.svg +21 -0
- package/v2Components/TemplatePreview/assets/images/home-screen-ios.svg +16 -0
- package/v2Components/TemplatePreview/assets/images/sms_mobile_android.svg +22 -0
- package/v2Components/TemplatePreview/assets/images/wechat-home-screen-android.svg +21 -0
- package/v2Components/TemplatePreview/assets/images/wechat_mobile_android.svg +20 -0
- package/v2Containers/App/constants.js +30 -0
- package/v2Containers/Cap/index.js +5 -0
- package/v2Containers/CreativesContainer/SlideBoxContent.js +18 -0
- package/v2Containers/CreativesContainer/constants.js +1 -0
- package/v2Containers/CreativesContainer/index.js +10 -1
- package/v2Containers/Email/index.js +9 -1
- package/v2Containers/Email/messages.js +8 -0
- package/v2Containers/EmailWrapper/index.js +15 -1
- package/v2Containers/Facebook/Facebook.style.js +75 -0
- package/v2Containers/Facebook/actions.js +13 -0
- package/v2Containers/Facebook/constants.js +25 -0
- package/v2Containers/Facebook/index.js +358 -0
- package/v2Containers/Facebook/messages.js +167 -0
- package/v2Containers/Facebook/reducer.js +31 -0
- package/v2Containers/Facebook/sagas.js +41 -0
- package/v2Containers/Facebook/selectors.js +20 -0
- package/v2Containers/MobilePush/Create/index.js +8 -0
- package/v2Containers/MobilePush/Edit/index.js +8 -0
- package/v2Containers/Sms/Create/_smsCreate.scss +3 -0
- package/v2Containers/Sms/Create/index.js +6 -1
- package/v2Containers/Sms/Create/messages.js +2 -2
- package/v2Containers/Sms/Edit/index.js +6 -1
- package/v2Containers/Sms/Edit/messages.js +2 -2
- package/v2Containers/Templates/index.js +9 -3
- package/v2Containers/TemplatesV2/index.js +53 -22
- package/v2Containers/TemplatesV2/messages.js +4 -0
- package/v2Containers/WeChat/MapTemplates/index.js +9 -1
- package/v2Containers/WeChat/RichmediaTemplates/Create/index.js +9 -2
- package/v2Containers/WeChat/RichmediaTemplates/Create/messages.js +1 -1
|
@@ -72,7 +72,7 @@ export default defineMessages({
|
|
|
72
72
|
},
|
|
73
73
|
"Template content has unsupported/missing tags!": {
|
|
74
74
|
id: 'creatives.containersV2.Create.tagsErrorMessage',
|
|
75
|
-
defaultMessage: "Please
|
|
75
|
+
defaultMessage: '"Optout" label is mandatory. Please add "Optout" label to this message',
|
|
76
76
|
},
|
|
77
77
|
"Please input sms template content.": {
|
|
78
78
|
id: 'creatives.containersV2.Create.smsEditorPlaceholder',
|
|
@@ -122,7 +122,7 @@ export default defineMessages({
|
|
|
122
122
|
id: 'creatives.containersV2.Create.sms',
|
|
123
123
|
defaultMessage: 'SMS',
|
|
124
124
|
},
|
|
125
|
-
"characters"
|
|
125
|
+
"characters": {
|
|
126
126
|
id: 'creatives.containersV2.Create.characters',
|
|
127
127
|
defaultMessage: 'characters',
|
|
128
128
|
},
|
|
@@ -25,7 +25,8 @@ import * as creativesContainerActions from '../../CreativesContainer/actions';
|
|
|
25
25
|
// import callNativeEvent from '../../../utils/callNativeEvent';
|
|
26
26
|
import {showError} from '../commonMethods';
|
|
27
27
|
import withCreatives from '../../../hoc/withCreatives';
|
|
28
|
-
|
|
28
|
+
import { TRACK_EDIT_SMS } from '../../App/constants'
|
|
29
|
+
import { GA } from '@capillarytech/cap-ui-utils';
|
|
29
30
|
export class Edit extends React.Component { // eslint-disable-line react/prefer-stateless-function
|
|
30
31
|
constructor(props) {
|
|
31
32
|
super(props);
|
|
@@ -219,6 +220,10 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
|
|
|
219
220
|
this.setState({currentTab: data});
|
|
220
221
|
}
|
|
221
222
|
onUpdateTemplateComplete = (editResponse) => {
|
|
223
|
+
GA.timeTracker.stopTimer(TRACK_EDIT_SMS, {
|
|
224
|
+
category: 'Creatives',
|
|
225
|
+
action: 'Edit',
|
|
226
|
+
});
|
|
222
227
|
if (editResponse.templateId) {
|
|
223
228
|
this.resetSchema();
|
|
224
229
|
this.setState({
|
|
@@ -76,7 +76,7 @@ export default defineMessages({
|
|
|
76
76
|
},
|
|
77
77
|
"Template content has unsupported/missing tags!": {
|
|
78
78
|
id: 'creatives.containersV2.Edit.tagsErrorMessage',
|
|
79
|
-
defaultMessage: "Please
|
|
79
|
+
defaultMessage: '"Optout" label is mandatory. Please add "Optout" label to this message',
|
|
80
80
|
},
|
|
81
81
|
"Please input sms template content.": {
|
|
82
82
|
id: 'creatives.containersV2.Edit.smsEditorPlaceholder',
|
|
@@ -114,7 +114,7 @@ export default defineMessages({
|
|
|
114
114
|
id: 'creatives.containersV2.Edit.sms',
|
|
115
115
|
defaultMessage: 'SMS',
|
|
116
116
|
},
|
|
117
|
-
"characters"
|
|
117
|
+
"characters": {
|
|
118
118
|
id: 'creatives.containersV2.Edit.characters',
|
|
119
119
|
defaultMessage: 'characters',
|
|
120
120
|
},
|
|
@@ -50,13 +50,14 @@ import Pagination from '../../v2Components/Pagination';
|
|
|
50
50
|
import EmailPreview from '../../v2Components/EmailPreview';
|
|
51
51
|
import CreativesContainer from '../CreativesContainer';
|
|
52
52
|
import WechatRichmediaTemplatePreview from '../../v2Components/TemplatePreview/WechatRichmediaTemplatePreview';
|
|
53
|
+
import { CHANNEL_CREATE_TRACK_MAPPING, CHANNEL_EDIT_TRACK_MAPPING } from '../App/constants'
|
|
53
54
|
import { MOBILE_PUSH, WECHAT, SMS, EMAIL, EBILL, LINE } from '../CreativesContainer/constants';
|
|
54
55
|
import emailIllustration from '../Assets/images/emailIllustration.svg';
|
|
55
56
|
import smsIllustration from '../Assets/images/smsIllustration.svg';
|
|
56
57
|
import pushIllustration from '../Assets/images/pushIllustration.svg';
|
|
57
58
|
import { CAP_SPACE_16 } from '@capillarytech/cap-ui-library/styled/variables';
|
|
58
|
-
|
|
59
|
-
|
|
59
|
+
import { GA } from '@capillarytech/cap-ui-utils';
|
|
60
|
+
const { timeTracker } = GA;
|
|
60
61
|
const {CapCustomCardList} = CapCustomCard;
|
|
61
62
|
const InlineDiv = styled.div`
|
|
62
63
|
display: inline;
|
|
@@ -75,6 +76,8 @@ const WECHAT_FILTERS = {
|
|
|
75
76
|
RICHMEDIA: 'richmedia',
|
|
76
77
|
MAPTEMPLATES: 'maptemplate',
|
|
77
78
|
};
|
|
79
|
+
|
|
80
|
+
|
|
78
81
|
export class Templates extends React.Component { // eslint-disable-line react/prefer-stateless-function
|
|
79
82
|
constructor(props) {
|
|
80
83
|
super(props);
|
|
@@ -163,6 +166,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
163
166
|
}
|
|
164
167
|
|
|
165
168
|
componentDidMount() {
|
|
169
|
+
|
|
166
170
|
if (this.props.location.query.type === 'embedded' && this.isEnabledInLibraryModule("setLocale")) {
|
|
167
171
|
this.setLocale();
|
|
168
172
|
}
|
|
@@ -922,13 +926,14 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
922
926
|
break;
|
|
923
927
|
}
|
|
924
928
|
};
|
|
925
|
-
|
|
929
|
+
|
|
926
930
|
createTemplate(ev) {
|
|
927
931
|
const type = this.props.location.query.type;
|
|
928
932
|
const module = this.props.location.query.module ? this.props.location.query.module : 'default';
|
|
929
933
|
const channel = this.state.channel.toLowerCase();
|
|
930
934
|
//const keyType = ev.key && ev.key.toLowerCase() !== undefined ? ev.state.toLowerCase() : '';
|
|
931
935
|
let routeParams = {};
|
|
936
|
+
timeTracker.startTimer(CHANNEL_CREATE_TRACK_MAPPING[channel]);
|
|
932
937
|
if (this.isEnabledInLibraryModule("callCreateFromProps")) {
|
|
933
938
|
this.props.createNew();
|
|
934
939
|
} else if (ev.key && (ev.key.toLowerCase() === "text" || ev.key.toLowerCase() === "image")) {
|
|
@@ -1123,6 +1128,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1123
1128
|
};
|
|
1124
1129
|
|
|
1125
1130
|
handleEditClick(e, template, modeType, path) {
|
|
1131
|
+
timeTracker.startTimer(CHANNEL_EDIT_TRACK_MAPPING[this.state.channel.toLowerCase()]);
|
|
1126
1132
|
if (modeType && modeType !== undefined) {
|
|
1127
1133
|
this.setState({modeType});
|
|
1128
1134
|
}
|
|
@@ -21,6 +21,7 @@ import messages from './messages';
|
|
|
21
21
|
import * as actions from './actions';
|
|
22
22
|
import Templates from '../Templates';
|
|
23
23
|
import CallTask from '../CallTask';
|
|
24
|
+
import Facebook from '../Facebook';
|
|
24
25
|
import Gallery from '../Assets/Gallery';
|
|
25
26
|
import withStyles from '../../hoc/withStyles';
|
|
26
27
|
import styles, { CapTabStyle } from './TemplatesV2.style';
|
|
@@ -33,32 +34,44 @@ export class TemplatesV2 extends React.Component { // eslint-disable-line react/
|
|
|
33
34
|
constructor(props) {
|
|
34
35
|
super(props);
|
|
35
36
|
let defaultChannel = get(this, 'props.channel') || get(this, 'props.params.channel') || 'sms';
|
|
37
|
+
const {
|
|
38
|
+
intl,
|
|
39
|
+
channelsToHide = [],
|
|
40
|
+
channelsToDisable = [],
|
|
41
|
+
isFullMode,
|
|
42
|
+
onChannelChange,
|
|
43
|
+
} = props;
|
|
44
|
+
|
|
36
45
|
const defaultPanes = {
|
|
37
|
-
sms: {content: <div></div>, tab:
|
|
38
|
-
email: {content: <div></div>, tab:
|
|
39
|
-
weChat: {content: <div></div>, tab:
|
|
46
|
+
sms: {content: <div></div>, tab: intl.formatMessage(messages.sms), key: 'sms'},
|
|
47
|
+
email: {content: <div></div>, tab: intl.formatMessage(messages.email), key: 'email'},
|
|
48
|
+
weChat: {content: <div></div>, tab: intl.formatMessage(messages.wechat), key: 'wechat'},
|
|
40
49
|
//'wechat': {content: this.getTemplatesComponent('wechat'), tab: 'Wechat', key: 'wechat'},
|
|
41
|
-
mPush: {content: <div></div>, tab:
|
|
50
|
+
mPush: {content: <div></div>, tab: intl.formatMessage(messages.pushNotification), key: 'mobilepush'},
|
|
42
51
|
};
|
|
43
|
-
const channelsToHide = this.props.channelsToHide || [];
|
|
44
|
-
const channelsToDisable = this.props.channelsToDisable || [];
|
|
45
52
|
let filteredPanes = Object.keys(defaultPanes)
|
|
46
53
|
.filter((key) => !channelsToHide.includes(key)).reduce((obj = [], key) => {
|
|
47
54
|
obj.push(defaultPanes[key]);
|
|
48
55
|
return obj;
|
|
49
56
|
}, []);
|
|
50
57
|
|
|
51
|
-
if (
|
|
52
|
-
filteredPanes.push({content: <div></div>, tab:
|
|
53
|
-
} else
|
|
54
|
-
|
|
58
|
+
if (isFullMode ) {
|
|
59
|
+
filteredPanes.push({content: <div></div>, tab: intl.formatMessage(messages.gallery), key: 'assets'});
|
|
60
|
+
} else {
|
|
61
|
+
if (!channelsToHide.includes('callTask')) {
|
|
62
|
+
filteredPanes.push({content: <div></div>, tab: intl.formatMessage(messages.callTask), key: 'call_task'});
|
|
63
|
+
}
|
|
64
|
+
if (!channelsToHide.includes('facebook')) {
|
|
65
|
+
filteredPanes.push({content: <div></div>, tab: intl.formatMessage(messages.facebook), key: 'facebook'});
|
|
66
|
+
}
|
|
55
67
|
}
|
|
56
68
|
|
|
57
69
|
filteredPanes = filteredPanes.map( (pane) => {
|
|
58
70
|
if (channelsToDisable.includes(pane.key)) {
|
|
71
|
+
// eslint-disable-next-line no-param-reassign
|
|
59
72
|
pane.disabled = true;
|
|
60
73
|
}
|
|
61
|
-
|
|
74
|
+
return pane;
|
|
62
75
|
});
|
|
63
76
|
|
|
64
77
|
const channel = ['sms', 'email', 'mobilepush', 'call_task'];
|
|
@@ -78,7 +91,9 @@ export class TemplatesV2 extends React.Component { // eslint-disable-line react/
|
|
|
78
91
|
selectedChannel: defaultChannel,
|
|
79
92
|
panes,
|
|
80
93
|
};
|
|
81
|
-
!
|
|
94
|
+
if (!isFullMode) {
|
|
95
|
+
onChannelChange(defaultChannel);
|
|
96
|
+
}
|
|
82
97
|
}
|
|
83
98
|
componentWillReceiveProps(nextProps) {
|
|
84
99
|
if (this.props.channel !== nextProps.channel) {
|
|
@@ -122,6 +137,17 @@ export class TemplatesV2 extends React.Component { // eslint-disable-line react/
|
|
|
122
137
|
/>
|
|
123
138
|
);
|
|
124
139
|
|
|
140
|
+
getFacebookComponent = () => {
|
|
141
|
+
const { messageDetails, cap, onFacebookSubmit } = this.props;
|
|
142
|
+
return (
|
|
143
|
+
<Facebook
|
|
144
|
+
messageDetails={messageDetails}
|
|
145
|
+
cap={cap}
|
|
146
|
+
onFacebookSubmit={onFacebookSubmit}
|
|
147
|
+
/>
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
|
|
125
151
|
getTemplatesComponent(channel) {
|
|
126
152
|
// const templates = this.props.Templates[`${channel}Templates`];
|
|
127
153
|
let query = {};
|
|
@@ -134,6 +160,8 @@ export class TemplatesV2 extends React.Component { // eslint-disable-line react/
|
|
|
134
160
|
return this.getCallTaskComponent();
|
|
135
161
|
case 'assets':
|
|
136
162
|
return this.getGalleryComponent(location);
|
|
163
|
+
case 'facebook':
|
|
164
|
+
return this.getFacebookComponent();
|
|
137
165
|
default:
|
|
138
166
|
return (<Templates
|
|
139
167
|
key={channel}
|
|
@@ -182,16 +210,16 @@ export class TemplatesV2 extends React.Component { // eslint-disable-line react/
|
|
|
182
210
|
{ name: 'description', content: this.props.intl.formatMessage(messages.creativesDesc) },
|
|
183
211
|
]}
|
|
184
212
|
/>}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
213
|
+
<div className="component-wrapper">
|
|
214
|
+
{isFullMode && <CapHeader title={<FormattedMessage {...messages.creatives}/>} description={<FormattedMessage {...messages.creativesDesc}/>}/>}
|
|
215
|
+
<StyledCapTab
|
|
216
|
+
panes={this.state.panes}
|
|
217
|
+
onChange={this.channelChange}
|
|
218
|
+
activeKey={this.state.selectedChannel}
|
|
219
|
+
defaultActiveKey={this.state.selectedChannel}
|
|
220
|
+
isFullMode={isFullMode}
|
|
221
|
+
/>
|
|
222
|
+
</div>
|
|
195
223
|
</div>
|
|
196
224
|
|
|
197
225
|
);
|
|
@@ -213,6 +241,9 @@ TemplatesV2.propTypes = {
|
|
|
213
241
|
channelsToHide: PropTypes.array,
|
|
214
242
|
className: PropTypes.string.isRequired,
|
|
215
243
|
channelsToDisable: PropTypes.array,
|
|
244
|
+
onFacebookSubmit: PropTypes.func,
|
|
245
|
+
messageDetails: PropTypes.object,
|
|
246
|
+
cap: PropTypes.object,
|
|
216
247
|
};
|
|
217
248
|
|
|
218
249
|
TemplatesV2.defaultProps = {
|
|
@@ -42,6 +42,10 @@ export default defineMessages({
|
|
|
42
42
|
id: 'creatives.containersV2.TemplatesV2.callTask',
|
|
43
43
|
defaultMessage: 'Call Task',
|
|
44
44
|
},
|
|
45
|
+
facebook: {
|
|
46
|
+
id: 'creatives.containersV2.TemplatesV2.facebook',
|
|
47
|
+
defaultMessage: 'Facebook',
|
|
48
|
+
},
|
|
45
49
|
gallery: {
|
|
46
50
|
id: 'creatives.containersV2.TemplatesV2.gallery',
|
|
47
51
|
defaultMessage: 'Gallery',
|
|
@@ -29,6 +29,8 @@ import {getMessageObject} from '../../../utils/messageUtils';
|
|
|
29
29
|
import * as templateActions from '../../Templates/actions';
|
|
30
30
|
import './_mapTemplates.scss';
|
|
31
31
|
import withCreatives from '../../../hoc/withCreatives';
|
|
32
|
+
import { GA } from '@capillarytech/cap-ui-utils';
|
|
33
|
+
import { TRACK_CREATE_WECHAT, TRACK_EDIT_WECHAT } from '../../App/constants'
|
|
32
34
|
|
|
33
35
|
const SELECT_TEMPLATE_MODE = "selectTemplate";
|
|
34
36
|
const MAP_TEMPLATE_MODE = "mapTemplateMode";
|
|
@@ -955,8 +957,9 @@ export class MapTemplates extends React.Component { // eslint-disable-line react
|
|
|
955
957
|
saveFormData(formData) {
|
|
956
958
|
const obj = {};
|
|
957
959
|
let selectedWechatData = {};
|
|
960
|
+
const isEdit = this.state.isEdit;
|
|
958
961
|
const { getFormData } = this.props;
|
|
959
|
-
if (
|
|
962
|
+
if (isEdit) {
|
|
960
963
|
obj['_id'] = this.state.editTemplateData._id;
|
|
961
964
|
selectedWechatData = {
|
|
962
965
|
'template_id': this.state.editTemplateData.versions.base.template_id,
|
|
@@ -1010,6 +1013,11 @@ export class MapTemplates extends React.Component { // eslint-disable-line react
|
|
|
1010
1013
|
getFormData(this.getFormData(obj));
|
|
1011
1014
|
}, 0);
|
|
1012
1015
|
}
|
|
1016
|
+
GA.timeTracker.stopTimer(isEdit ? TRACK_EDIT_WECHAT : TRACK_CREATE_WECHAT, {
|
|
1017
|
+
category: 'Creatives',
|
|
1018
|
+
action: isEdit ? 'Edit' : 'Create',
|
|
1019
|
+
label : 'MapTemplates',
|
|
1020
|
+
});
|
|
1013
1021
|
console.log("Template created successfully", response, obj);
|
|
1014
1022
|
});
|
|
1015
1023
|
}
|
|
@@ -28,7 +28,8 @@ import WechatRichmediaTemplatePreview from '../../../../v2Components/TemplatePre
|
|
|
28
28
|
import noImage from '../../../../assets/noImage.png';
|
|
29
29
|
import Pagination from '../../../../v2Components/Pagination';
|
|
30
30
|
import { CAP_SPACE_08, CAP_SPACE_12, CAP_SPACE_20, CAP_SPACE_16 } from '@capillarytech/cap-ui-library/styled/variables';
|
|
31
|
-
|
|
31
|
+
import { GA } from '@capillarytech/cap-ui-utils';
|
|
32
|
+
import { TRACK_CREATE_WECHAT, TRACK_EDIT_WECHAT } from '../../../App/constants'
|
|
32
33
|
export class Create extends React.Component { // eslint-disable-line react/prefer-stateless-function
|
|
33
34
|
constructor(props) {
|
|
34
35
|
super(props);
|
|
@@ -544,7 +545,8 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
|
|
|
544
545
|
msgtype: "MPNEWS",
|
|
545
546
|
msgcontent: "RICH_MEDIA_WECHAT",
|
|
546
547
|
};
|
|
547
|
-
|
|
548
|
+
const isEdit = this.state.isEdit;
|
|
549
|
+
if (isEdit) {
|
|
548
550
|
saveObj._id = this.props.templateId;
|
|
549
551
|
saveObj.mediaId = this.props.mediaId;
|
|
550
552
|
saveObj.type = "WECHAT";
|
|
@@ -554,6 +556,11 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
|
|
|
554
556
|
// CapNotification.success({
|
|
555
557
|
// message: this.props.intl.formatMessage(messages.saveSuccess),
|
|
556
558
|
// });
|
|
559
|
+
GA.timeTracker.stopTimer(isEdit ? TRACK_EDIT_WECHAT : TRACK_CREATE_WECHAT, {
|
|
560
|
+
category: 'Creatives',
|
|
561
|
+
action: isEdit ? 'Edit' : 'Create',
|
|
562
|
+
label : 'RichMedia',
|
|
563
|
+
});
|
|
557
564
|
if (getFormData) {
|
|
558
565
|
getFormData(this.getFormData({
|
|
559
566
|
mediaId: response.mediaId,
|
|
@@ -200,7 +200,7 @@ export default defineMessages({
|
|
|
200
200
|
defaultMessage: 'Template with the same name exists. Please try another template name.',
|
|
201
201
|
},
|
|
202
202
|
'Template name already exists': {
|
|
203
|
-
id: 'creatives.containersV2.richMedia.
|
|
203
|
+
id: 'creatives.containersV2.richMedia.Create.templateNameAlreadyExists',
|
|
204
204
|
defaultMessage: 'Template name already exists',
|
|
205
205
|
},
|
|
206
206
|
'Template name cannot be blank!': {
|