@capillarytech/creatives-library 8.0.252 → 8.0.254
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/assets/Android.png +0 -0
- package/assets/iOS.png +0 -0
- package/constants/unified.js +1 -2
- package/initialReducer.js +0 -2
- package/package.json +1 -1
- package/services/api.js +0 -10
- package/services/tests/api.test.js +0 -34
- package/utils/common.js +0 -5
- package/utils/commonUtils.js +5 -28
- package/utils/tests/commonUtil.test.js +0 -224
- package/utils/transformTemplateConfig.js +10 -0
- package/v2Components/CapDeviceContent/index.js +56 -61
- package/v2Components/CapTagList/index.js +1 -6
- package/v2Components/CapTagListWithInput/index.js +1 -5
- package/v2Components/CapTagListWithInput/messages.js +1 -1
- package/v2Components/CapWhatsappCTA/tests/index.test.js +0 -5
- package/v2Components/ErrorInfoNote/index.js +72 -455
- package/v2Components/ErrorInfoNote/messages.js +6 -36
- package/v2Components/ErrorInfoNote/style.scss +4 -280
- package/v2Components/FormBuilder/tests/index.test.js +4 -13
- package/v2Components/HtmlEditor/HTMLEditor.js +94 -547
- package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +133 -1358
- package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +16 -27
- package/v2Components/HtmlEditor/_htmlEditor.scss +45 -108
- package/v2Components/HtmlEditor/_index.lazy.scss +1 -1
- package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +101 -22
- package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +140 -146
- package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +1 -2
- package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
- package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +0 -9
- package/v2Components/HtmlEditor/components/EditorToolbar/index.js +1 -1
- package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +0 -22
- package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +7 -4
- package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +45 -35
- package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +3 -1
- package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
- package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +6 -7
- package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +6 -3
- package/v2Components/HtmlEditor/components/PreviewPane/index.js +34 -24
- package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +152 -0
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +31 -49
- package/v2Components/HtmlEditor/components/ValidationPanel/_validationPanel.scss +34 -50
- package/v2Components/HtmlEditor/components/ValidationPanel/index.js +41 -70
- package/v2Components/HtmlEditor/constants.js +20 -42
- package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +16 -373
- package/v2Components/HtmlEditor/hooks/useEditorContent.js +2 -5
- package/v2Components/HtmlEditor/hooks/useInAppContent.js +146 -88
- package/v2Components/HtmlEditor/hooks/useValidation.js +53 -189
- package/v2Components/HtmlEditor/index.js +1 -1
- package/v2Components/HtmlEditor/messages.js +85 -95
- package/v2Components/HtmlEditor/utils/__tests__/htmlValidator.enhanced.test.js +45 -94
- package/v2Components/HtmlEditor/utils/__tests__/validationAdapter.test.js +0 -134
- package/v2Components/HtmlEditor/utils/contentSanitizer.js +41 -40
- package/v2Components/HtmlEditor/utils/htmlValidator.js +72 -71
- package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +102 -134
- package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +25 -23
- package/v2Components/HtmlEditor/utils/validationAdapter.js +41 -66
- package/v2Components/MobilePushPreviewV2/index.js +7 -32
- package/v2Components/TemplatePreview/_templatePreview.scss +24 -55
- package/v2Components/TemplatePreview/index.js +32 -47
- package/v2Components/TemplatePreview/messages.js +0 -4
- package/v2Components/TestAndPreviewSlidebox/_testAndPreviewSlidebox.scss +0 -1
- package/v2Containers/BeeEditor/index.js +90 -172
- package/v2Containers/CreativesContainer/SlideBoxContent.js +51 -128
- package/v2Containers/CreativesContainer/SlideBoxFooter.js +13 -163
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +1 -2
- package/v2Containers/CreativesContainer/constants.js +0 -1
- package/v2Containers/CreativesContainer/index.js +46 -239
- package/v2Containers/CreativesContainer/messages.js +0 -8
- package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +2 -11
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +50 -38
- package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +0 -106
- package/v2Containers/Email/actions.js +0 -7
- package/v2Containers/Email/constants.js +1 -5
- package/v2Containers/Email/index.js +32 -241
- package/v2Containers/Email/messages.js +0 -32
- package/v2Containers/Email/reducer.js +1 -12
- package/v2Containers/Email/sagas.js +7 -61
- package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -2
- package/v2Containers/Email/tests/reducer.test.js +0 -46
- package/v2Containers/Email/tests/sagas.test.js +29 -320
- package/v2Containers/EmailWrapper/components/EmailWrapperView.js +19 -207
- package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +74 -40
- package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +67 -2
- package/v2Containers/EmailWrapper/constants.js +0 -2
- package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +77 -629
- package/v2Containers/EmailWrapper/index.js +23 -103
- package/v2Containers/EmailWrapper/messages.js +1 -61
- package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +214 -0
- package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +77 -594
- package/v2Containers/InApp/actions.js +0 -7
- package/v2Containers/InApp/constants.js +4 -20
- package/v2Containers/InApp/index.js +359 -802
- package/v2Containers/InApp/index.scss +3 -4
- package/v2Containers/InApp/messages.js +3 -7
- package/v2Containers/InApp/reducer.js +3 -21
- package/v2Containers/InApp/sagas.js +9 -29
- package/v2Containers/InApp/selectors.js +5 -25
- package/v2Containers/InApp/tests/index.test.js +50 -154
- package/v2Containers/InApp/tests/reducer.test.js +0 -34
- package/v2Containers/InApp/tests/sagas.test.js +9 -61
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +0 -3
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +0 -2
- package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +0 -2
- package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +0 -9
- package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +0 -12
- package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +0 -4
- package/v2Containers/TagList/index.js +19 -62
- package/v2Containers/Templates/_templates.scss +1 -60
- package/v2Containers/Templates/index.js +4 -89
- package/v2Containers/Templates/messages.js +0 -4
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +0 -34
- package/v2Components/HtmlEditor/__tests__/HTMLEditor.apiErrors.test.js +0 -874
- package/v2Components/HtmlEditor/components/ValidationPanel/constants.js +0 -6
- package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +0 -254
- package/v2Components/HtmlEditor/components/ValidationTabs/index.js +0 -364
- package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +0 -51
- package/v2Components/HtmlEditor/hooks/__tests__/useValidation.apiErrors.test.js +0 -795
- package/v2Components/HtmlEditor/utils/validationConstants.js +0 -40
- package/v2Containers/BeePopupEditor/_beePopupEditor.scss +0 -14
- package/v2Containers/BeePopupEditor/constants.js +0 -10
- package/v2Containers/BeePopupEditor/index.js +0 -194
- package/v2Containers/BeePopupEditor/tests/index.test.js +0 -627
- package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +0 -1285
- package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +0 -1870
- package/v2Containers/EmailWrapper/components/__tests__/EmailWrapperView.test.js +0 -520
- package/v2Containers/EmailWrapper/tests/useEmailWrapper.edgeCases.test.js +0 -643
- package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +0 -376
- package/v2Containers/InApp/__tests__/sagas.test.js +0 -363
- package/v2Containers/InApp/tests/selectors.test.js +0 -612
- package/v2Containers/InAppWrapper/components/InAppWrapperView.js +0 -151
- package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +0 -267
- package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +0 -23
- package/v2Containers/InAppWrapper/constants.js +0 -16
- package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +0 -473
- package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +0 -198
- package/v2Containers/InAppWrapper/index.js +0 -148
- package/v2Containers/InAppWrapper/messages.js +0 -49
- package/v2Containers/InappAdvance/index.js +0 -1099
- package/v2Containers/InappAdvance/index.scss +0 -10
- package/v2Containers/InappAdvance/tests/index.test.js +0 -448
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Validation Constants
|
|
3
|
-
*
|
|
4
|
-
* Shared constants for validation issue categorization across HTML Editor components
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
// Issue sources for categorizing validation errors
|
|
8
|
-
export const ISSUE_SOURCES = {
|
|
9
|
-
HTMLHINT: 'htmlhint',
|
|
10
|
-
CSS_VALIDATOR: 'css-validator',
|
|
11
|
-
CUSTOM: 'custom',
|
|
12
|
-
SECURITY: 'security',
|
|
13
|
-
LIQUID: 'liquid-validator',
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
// Label issue patterns - syntax errors related to tags
|
|
17
|
-
// These patterns identify tag syntax errors (open/close tags, attributes, brackets)
|
|
18
|
-
export const LABEL_ISSUE_PATTERNS = [
|
|
19
|
-
'tag must be paired',
|
|
20
|
-
'open tag match failed',
|
|
21
|
-
'closed tag match failed',
|
|
22
|
-
'unclosed',
|
|
23
|
-
'missing required',
|
|
24
|
-
'tag-pair',
|
|
25
|
-
'attr-value-not-empty',
|
|
26
|
-
'attr-no-duplication',
|
|
27
|
-
'tag-self-close',
|
|
28
|
-
'spec-char-escape',
|
|
29
|
-
'tagname-lowercase',
|
|
30
|
-
'attr-lowercase',
|
|
31
|
-
'src-not-empty',
|
|
32
|
-
'alt-require',
|
|
33
|
-
];
|
|
34
|
-
|
|
35
|
-
// Tab keys for error categorization
|
|
36
|
-
export const ERROR_TAB_KEYS = {
|
|
37
|
-
HTML: 'html',
|
|
38
|
-
LABEL: 'label',
|
|
39
|
-
LIQUID: 'liquid',
|
|
40
|
-
};
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export const BEE_LAYOUT_OPTIONS = {
|
|
2
|
-
POPUP: "classic-center",
|
|
3
|
-
HEADER: "bar-top",
|
|
4
|
-
FOOTER: "bar-bottom",
|
|
5
|
-
FULLSCREEN: "classic-center",
|
|
6
|
-
};
|
|
7
|
-
export const MOBILE = "mobile";
|
|
8
|
-
export const UNSUBSCRIBE = 'unsubscribe';
|
|
9
|
-
export const ANDROID = 'ANDROID';
|
|
10
|
-
export const IOS = 'IOS';
|
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
import React, { useEffect, useRef, useState } from 'react';
|
|
2
|
-
import PropTypes from 'prop-types';
|
|
3
|
-
import { injectIntl } from 'react-intl';
|
|
4
|
-
import { connect } from 'react-redux';
|
|
5
|
-
// import { bindActionCreators } from 'redux';
|
|
6
|
-
import { createStructuredSelector } from 'reselect';
|
|
7
|
-
import CapRow from '@capillarytech/cap-ui-library/CapRow';
|
|
8
|
-
import { UserIsAuthenticated } from '../../utils/authWrapper';
|
|
9
|
-
import TagList from '../TagList';
|
|
10
|
-
import {
|
|
11
|
-
ANDROID, BEE_LAYOUT_OPTIONS, MOBILE, UNSUBSCRIBE,
|
|
12
|
-
} from './constants';
|
|
13
|
-
import emptyAndroidSvg from '../../assets/Android.png';
|
|
14
|
-
import emptyIosSvg from '../../assets/iOS.png';
|
|
15
|
-
import './_beePopupEditor.scss';
|
|
16
|
-
function BeePopupEditor(props) {
|
|
17
|
-
const {
|
|
18
|
-
uid,
|
|
19
|
-
id,
|
|
20
|
-
tokenData,
|
|
21
|
-
saveBeeInstance,
|
|
22
|
-
saveBeeData,
|
|
23
|
-
saveBeeHtmlValue,
|
|
24
|
-
beeJson,
|
|
25
|
-
templateLayoutType,
|
|
26
|
-
moduleFilterEnabled,
|
|
27
|
-
label,
|
|
28
|
-
location,
|
|
29
|
-
injectedTags,
|
|
30
|
-
className,
|
|
31
|
-
userLocale,
|
|
32
|
-
selectedOfferDetails,
|
|
33
|
-
tags,
|
|
34
|
-
onContextChange,
|
|
35
|
-
device,
|
|
36
|
-
} = props;
|
|
37
|
-
|
|
38
|
-
let beePluginInstance = null;
|
|
39
|
-
let intervalTimer;
|
|
40
|
-
const savedCallback = useRef();
|
|
41
|
-
const beeInstanceRef = useRef(null);
|
|
42
|
-
const isInitializedRef = useRef(false);
|
|
43
|
-
|
|
44
|
-
const [visibleTaglist, setVisibleTaglist] = useState(false);
|
|
45
|
-
const [selectedTag, setSelectedTag] = useState({});
|
|
46
|
-
const filteredTags = (tags || []).filter((obj) => obj.definition.value !== UNSUBSCRIBE);
|
|
47
|
-
|
|
48
|
-
useEffect(() => {
|
|
49
|
-
// Only recreate BEE editor when layout type changes, not when content (beeJson) changes
|
|
50
|
-
// If beeJson is in dependencies, editor reloads on every keystroke!
|
|
51
|
-
const beeConfig = {
|
|
52
|
-
uid,
|
|
53
|
-
trackChanges: true,
|
|
54
|
-
container: 'bee-plugin-container',
|
|
55
|
-
workspace: {
|
|
56
|
-
popup: {
|
|
57
|
-
backgroundImageMobile: device === ANDROID ? emptyAndroidSvg : emptyIosSvg,
|
|
58
|
-
layout: BEE_LAYOUT_OPTIONS[templateLayoutType],
|
|
59
|
-
customStyles: {
|
|
60
|
-
container: {
|
|
61
|
-
width: "90%",
|
|
62
|
-
margin: "1.5rem",
|
|
63
|
-
},
|
|
64
|
-
},
|
|
65
|
-
},
|
|
66
|
-
stage: MOBILE,
|
|
67
|
-
hideStageToggle: true,
|
|
68
|
-
},
|
|
69
|
-
contentDialog: {
|
|
70
|
-
mergeTags: {
|
|
71
|
-
label: 'Add Label',
|
|
72
|
-
handler: async (resolve, reject) => {
|
|
73
|
-
// this will open tag modal
|
|
74
|
-
await setVisibleTaglist(true);
|
|
75
|
-
// until tag modal will not open promise will not execute
|
|
76
|
-
// once tag modal is opened it will start 2 sec interval to wait use has selected any tag or cancel the tag selection
|
|
77
|
-
const promise = new Promise((resolveP) => {
|
|
78
|
-
intervalTimer = setInterval(() => {
|
|
79
|
-
// this will execute, if user cancel the tag selection
|
|
80
|
-
if ((savedCallback.current || {}).close === true) {
|
|
81
|
-
reject();
|
|
82
|
-
clearInterval(intervalTimer);
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
// this block is checking use has selected any tag or not
|
|
86
|
-
if (Object.keys(savedCallback.current || {}).length > 0) {
|
|
87
|
-
resolveP(savedCallback.current);
|
|
88
|
-
setSelectedTag({});
|
|
89
|
-
clearInterval(intervalTimer);
|
|
90
|
-
}
|
|
91
|
-
}, 2000);
|
|
92
|
-
});
|
|
93
|
-
// once prmise will resolve , pass the resolve data to handler to show tags in bee edior
|
|
94
|
-
const result = await promise;
|
|
95
|
-
resolve(result);
|
|
96
|
-
},
|
|
97
|
-
},
|
|
98
|
-
},
|
|
99
|
-
onChange: (jsonFile, htmlFile) => {
|
|
100
|
-
saveBeeData(jsonFile, htmlFile, device);
|
|
101
|
-
},
|
|
102
|
-
onSave: (jsonFile, htmlFile) => {
|
|
103
|
-
// onSave provides the actual HTML value, use it to update beeHtml.value
|
|
104
|
-
if (saveBeeHtmlValue && htmlFile) {
|
|
105
|
-
saveBeeHtmlValue(htmlFile, device);
|
|
106
|
-
}
|
|
107
|
-
// Also call saveBeeData to update JSON
|
|
108
|
-
saveBeeData(jsonFile, htmlFile, device);
|
|
109
|
-
},
|
|
110
|
-
};
|
|
111
|
-
window.BeePlugin.create(tokenData, beeConfig, (instance) => {
|
|
112
|
-
beePluginInstance = instance;
|
|
113
|
-
beeInstanceRef.current = instance;
|
|
114
|
-
// Check if beeJson is already an object (happens when layout type changes)
|
|
115
|
-
const parseJson = typeof beeJson === 'string' ? JSON.parse(beeJson) : beeJson;
|
|
116
|
-
beePluginInstance.start(parseJson);
|
|
117
|
-
saveBeeInstance(beePluginInstance, device);
|
|
118
|
-
isInitializedRef.current = true;
|
|
119
|
-
});
|
|
120
|
-
return () => {
|
|
121
|
-
clearInterval(intervalTimer);
|
|
122
|
-
// Reset initialization flag when component unmounts or layout changes
|
|
123
|
-
isInitializedRef.current = false;
|
|
124
|
-
};
|
|
125
|
-
// IMPORTANT: Only include templateLayoutType, NOT beeJson
|
|
126
|
-
// beeJson changes on every keystroke and would cause editor to reload constantly
|
|
127
|
-
}, [templateLayoutType]);
|
|
128
|
-
|
|
129
|
-
useEffect(() => {
|
|
130
|
-
savedCallback.current = Object?.keys(selectedTag)?.length > 0 && selectedTag;
|
|
131
|
-
}, [selectedTag]);
|
|
132
|
-
|
|
133
|
-
const onTagSelect = (result) => {
|
|
134
|
-
const msg = {
|
|
135
|
-
name: result,
|
|
136
|
-
value: `{{${result}}}`,
|
|
137
|
-
};
|
|
138
|
-
setSelectedTag(msg);
|
|
139
|
-
setVisibleTaglist(false);
|
|
140
|
-
};
|
|
141
|
-
|
|
142
|
-
const onCancelTagList = () => {
|
|
143
|
-
setVisibleTaglist(false);
|
|
144
|
-
setSelectedTag({ close: true });
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
return (
|
|
148
|
-
<CapRow>
|
|
149
|
-
<div id="bee-plugin-container" className="bee-popup-editor__container"></div>
|
|
150
|
-
<TagList
|
|
151
|
-
moduleFilterEnabled={moduleFilterEnabled}
|
|
152
|
-
label={label}
|
|
153
|
-
onTagSelect={onTagSelect}
|
|
154
|
-
location={location}
|
|
155
|
-
tags={filteredTags}
|
|
156
|
-
injectedTags={injectedTags}
|
|
157
|
-
className={className}
|
|
158
|
-
id={id}
|
|
159
|
-
userLocale={userLocale}
|
|
160
|
-
selectedOfferDetails={selectedOfferDetails}
|
|
161
|
-
visibleTaglist={visibleTaglist}
|
|
162
|
-
hidePopover
|
|
163
|
-
modalProps={{
|
|
164
|
-
onCancel: onCancelTagList,
|
|
165
|
-
className: "bee-editor-tag-list bee-editor-tag-list--positioned",
|
|
166
|
-
}}
|
|
167
|
-
onContextChange={onContextChange}
|
|
168
|
-
/>
|
|
169
|
-
</CapRow>
|
|
170
|
-
);
|
|
171
|
-
}
|
|
172
|
-
BeePopupEditor.propTypes = {
|
|
173
|
-
saveBeeData: PropTypes.func.isRequired,
|
|
174
|
-
saveBeeInstance: PropTypes.func.isRequired,
|
|
175
|
-
beeJson: PropTypes.object.isRequired,
|
|
176
|
-
tokenData: PropTypes.object.isRequired,
|
|
177
|
-
uid: PropTypes.string.isRequired,
|
|
178
|
-
templateLayoutType: PropTypes.string.isRequired,
|
|
179
|
-
id: PropTypes.string.isRequired,
|
|
180
|
-
moduleFilterEnabled: PropTypes.bool.isRequired,
|
|
181
|
-
label: PropTypes.string.isRequired,
|
|
182
|
-
location: PropTypes.object.isRequired,
|
|
183
|
-
injectedTags: PropTypes.array.isRequired,
|
|
184
|
-
className: PropTypes.string.isRequired,
|
|
185
|
-
userLocale: PropTypes.string.isRequired,
|
|
186
|
-
selectedOfferDetails: PropTypes.object.isRequired,
|
|
187
|
-
tags: PropTypes.array.isRequired,
|
|
188
|
-
onContextChange: PropTypes.func.isRequired,
|
|
189
|
-
device: PropTypes.string.isRequired,
|
|
190
|
-
};
|
|
191
|
-
const mapStateToProps = () => createStructuredSelector({});
|
|
192
|
-
|
|
193
|
-
function mapDispatchToProps() { }
|
|
194
|
-
export default UserIsAuthenticated(connect(mapStateToProps, mapDispatchToProps)(injectIntl(BeePopupEditor)));
|