@capillarytech/creatives-library 8.0.242-alpha.1 → 8.0.242-alpha.11
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/config/app.js +1 -1
- package/constants/unified.js +2 -2
- package/initialReducer.js +0 -2
- package/package.json +1 -1
- package/services/api.js +5 -10
- package/services/tests/api.test.js +0 -18
- package/translations/en.json +4 -3
- package/utils/common.js +6 -5
- package/utils/commonUtils.js +1 -14
- package/utils/imageUrlUpload.js +141 -0
- package/utils/tests/commonUtil.test.js +0 -224
- package/utils/transformTemplateConfig.js +10 -0
- package/v2Components/CapDeviceContent/index.js +56 -61
- package/v2Components/CapImageUpload/constants.js +2 -0
- package/v2Components/CapImageUpload/index.js +65 -16
- package/v2Components/CapImageUpload/index.scss +4 -1
- package/v2Components/CapImageUpload/messages.js +5 -1
- package/v2Components/CapImageUrlUpload/constants.js +26 -0
- package/v2Components/CapImageUrlUpload/index.js +365 -0
- package/v2Components/CapImageUrlUpload/index.scss +35 -0
- package/v2Components/CapImageUrlUpload/messages.js +47 -0
- 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 -412
- package/v2Components/ErrorInfoNote/messages.js +0 -22
- package/v2Components/ErrorInfoNote/style.scss +2 -279
- package/v2Components/HtmlEditor/HTMLEditor.js +89 -210
- package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +133 -1132
- package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +12 -17
- package/v2Components/HtmlEditor/_htmlEditor.scss +23 -8
- package/v2Components/HtmlEditor/_index.lazy.scss +1 -1
- package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +101 -13
- package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +139 -148
- package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +1 -2
- package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
- package/v2Components/HtmlEditor/components/EditorToolbar/index.js +1 -1
- package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +0 -1
- 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 +11 -10
- package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +62 -87
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +31 -49
- package/v2Components/HtmlEditor/constants.js +20 -29
- 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/index.js +1 -1
- package/v2Components/HtmlEditor/messages.js +85 -95
- package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +101 -99
- package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +25 -23
- package/v2Components/HtmlEditor/utils/validationAdapter.js +41 -34
- package/v2Components/MobilePushPreviewV2/index.js +7 -32
- package/v2Components/TemplatePreview/_templatePreview.scss +24 -44
- package/v2Components/TemplatePreview/index.js +32 -47
- package/v2Components/TemplatePreview/messages.js +0 -4
- package/v2Components/TestAndPreviewSlidebox/index.js +25 -31
- package/v2Containers/App/constants.js +5 -0
- package/v2Containers/BeeEditor/index.js +80 -82
- package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +4 -3
- package/v2Containers/CreativesContainer/SlideBoxContent.js +118 -148
- package/v2Containers/CreativesContainer/SlideBoxFooter.js +3 -9
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
- package/v2Containers/CreativesContainer/constants.js +2 -1
- package/v2Containers/CreativesContainer/index.js +41 -173
- package/v2Containers/CreativesContainer/messages.js +4 -4
- package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +210 -0
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +354 -38
- package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +0 -36
- package/v2Containers/Email/actions.js +0 -7
- package/v2Containers/Email/constants.js +1 -5
- package/v2Containers/Email/index.js +0 -13
- package/v2Containers/Email/messages.js +0 -32
- package/v2Containers/Email/reducer.js +1 -12
- package/v2Containers/Email/sagas.js +6 -41
- package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -2
- package/v2Containers/EmailWrapper/components/EmailWrapperView.js +7 -193
- 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 +67 -436
- package/v2Containers/EmailWrapper/index.js +23 -99
- package/v2Containers/EmailWrapper/messages.js +1 -61
- package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +1 -26
- package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +77 -111
- package/v2Containers/InApp/actions.js +0 -7
- package/v2Containers/InApp/constants.js +4 -20
- package/v2Containers/InApp/index.js +357 -800
- 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 +12 -12
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +8 -8
- package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +100 -77
- package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +72 -63
- package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +184 -150
- package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +16 -12
- package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +32 -28
- package/v2Containers/TagList/index.js +1 -67
- package/v2Containers/Templates/ChannelTypeIllustration.js +13 -1
- package/v2Containers/Templates/_templates.scss +202 -56
- package/v2Containers/Templates/actions.js +2 -1
- package/v2Containers/Templates/constants.js +1 -0
- package/v2Containers/Templates/index.js +278 -128
- package/v2Containers/Templates/messages.js +24 -4
- package/v2Containers/Templates/reducer.js +2 -0
- package/v2Containers/Templates/tests/index.test.js +10 -0
- package/v2Containers/TemplatesV2/index.js +8 -1
- package/v2Containers/TemplatesV2/messages.js +4 -0
- package/v2Containers/WebPush/Create/components/BrandIconSection.js +108 -0
- package/v2Containers/WebPush/Create/components/ButtonForm.js +172 -0
- package/v2Containers/WebPush/Create/components/ButtonItem.js +101 -0
- package/v2Containers/WebPush/Create/components/ButtonList.js +145 -0
- package/v2Containers/WebPush/Create/components/ButtonsLinksSection.js +164 -0
- package/v2Containers/WebPush/Create/components/ButtonsLinksSection.test.js +463 -0
- package/v2Containers/WebPush/Create/components/FormActions.js +54 -0
- package/v2Containers/WebPush/Create/components/FormActions.test.js +163 -0
- package/v2Containers/WebPush/Create/components/MediaSection.js +142 -0
- package/v2Containers/WebPush/Create/components/MediaSection.test.js +341 -0
- package/v2Containers/WebPush/Create/components/MessageSection.js +103 -0
- package/v2Containers/WebPush/Create/components/MessageSection.test.js +268 -0
- package/v2Containers/WebPush/Create/components/NotificationTitleSection.js +87 -0
- package/v2Containers/WebPush/Create/components/NotificationTitleSection.test.js +210 -0
- package/v2Containers/WebPush/Create/components/TemplateNameSection.js +54 -0
- package/v2Containers/WebPush/Create/components/TemplateNameSection.test.js +143 -0
- package/v2Containers/WebPush/Create/components/__snapshots__/ButtonsLinksSection.test.js.snap +86 -0
- package/v2Containers/WebPush/Create/components/__snapshots__/FormActions.test.js.snap +16 -0
- package/v2Containers/WebPush/Create/components/__snapshots__/MediaSection.test.js.snap +41 -0
- package/v2Containers/WebPush/Create/components/__snapshots__/MessageSection.test.js.snap +54 -0
- package/v2Containers/WebPush/Create/components/__snapshots__/NotificationTitleSection.test.js.snap +37 -0
- package/v2Containers/WebPush/Create/components/__snapshots__/TemplateNameSection.test.js.snap +21 -0
- package/v2Containers/WebPush/Create/components/_buttons.scss +246 -0
- package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +554 -0
- package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +607 -0
- package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +633 -0
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +666 -0
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +74 -0
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +78 -0
- package/v2Containers/WebPush/Create/hooks/useButtonManagement.js +138 -0
- package/v2Containers/WebPush/Create/hooks/useButtonManagement.test.js +406 -0
- package/v2Containers/WebPush/Create/hooks/useCharacterCount.js +30 -0
- package/v2Containers/WebPush/Create/hooks/useCharacterCount.test.js +151 -0
- package/v2Containers/WebPush/Create/hooks/useImageUpload.js +104 -0
- package/v2Containers/WebPush/Create/hooks/useImageUpload.test.js +538 -0
- package/v2Containers/WebPush/Create/hooks/useTagManagement.js +122 -0
- package/v2Containers/WebPush/Create/hooks/useTagManagement.test.js +633 -0
- package/v2Containers/WebPush/Create/index.js +1056 -0
- package/v2Containers/WebPush/Create/index.scss +134 -0
- package/v2Containers/WebPush/Create/messages.js +203 -0
- package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +228 -0
- package/v2Containers/WebPush/Create/preview/NotificationContainer.js +294 -0
- package/v2Containers/WebPush/Create/preview/PreviewContent.js +90 -0
- package/v2Containers/WebPush/Create/preview/PreviewControls.js +305 -0
- package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +23 -0
- package/v2Containers/WebPush/Create/preview/WebPushPreview.js +150 -0
- package/v2Containers/WebPush/Create/preview/assets/Light.svg +53 -0
- package/v2Containers/WebPush/Create/preview/assets/Top.svg +5 -0
- package/v2Containers/WebPush/Create/preview/assets/android-arrow-down.svg +9 -0
- package/v2Containers/WebPush/Create/preview/assets/android-arrow-up.svg +9 -0
- package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
- package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
- package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +106 -0
- package/v2Containers/WebPush/Create/preview/assets/iOS.svg +26 -0
- package/v2Containers/WebPush/Create/preview/assets/macos-arrow-down-icon.svg +9 -0
- package/v2Containers/WebPush/Create/preview/assets/macos-triple-dot-icon.svg +9 -0
- package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +18 -0
- package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +29 -0
- package/v2Containers/WebPush/Create/preview/assets/windows-close-icon.svg +9 -0
- package/v2Containers/WebPush/Create/preview/assets/windows-triple-dot-icon.svg +9 -0
- package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +47 -0
- package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +141 -0
- package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +45 -0
- package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +68 -0
- package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +61 -0
- package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +99 -0
- package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +733 -0
- package/v2Containers/WebPush/Create/preview/components/tests/WindowsChromeExpanded.test.js +571 -0
- package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +81 -0
- package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/WindowsChromeExpanded.test.js.snap +81 -0
- package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +50 -0
- package/v2Containers/WebPush/Create/preview/constants.js +637 -0
- package/v2Containers/WebPush/Create/preview/notification-container.scss +79 -0
- package/v2Containers/WebPush/Create/preview/preview.scss +351 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +370 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +12 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +12 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +12 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +47 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +11 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +11 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +11 -0
- package/v2Containers/WebPush/Create/preview/styles/_base.scss +207 -0
- package/v2Containers/WebPush/Create/preview/styles/_ios.scss +153 -0
- package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +107 -0
- package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +101 -0
- package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +229 -0
- package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +909 -0
- package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +1081 -0
- package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +723 -0
- package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +943 -0
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +131 -0
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +112 -0
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +144 -0
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +129 -0
- package/v2Containers/WebPush/Create/utils/payloadBuilder.js +94 -0
- package/v2Containers/WebPush/Create/utils/payloadBuilder.test.js +390 -0
- package/v2Containers/WebPush/Create/utils/previewUtils.js +89 -0
- package/v2Containers/WebPush/Create/utils/urlValidation.js +115 -0
- package/v2Containers/WebPush/Create/utils/urlValidation.test.js +449 -0
- package/v2Containers/WebPush/Create/utils/validation.js +75 -0
- package/v2Containers/WebPush/Create/utils/validation.test.js +283 -0
- package/v2Containers/WebPush/actions.js +60 -0
- package/v2Containers/WebPush/constants.js +128 -0
- package/v2Containers/WebPush/index.js +2 -0
- package/v2Containers/WebPush/reducer.js +104 -0
- package/v2Containers/WebPush/sagas.js +119 -0
- package/v2Containers/WebPush/selectors.js +65 -0
- package/v2Containers/WebPush/tests/reducer.test.js +863 -0
- package/v2Containers/WebPush/tests/sagas.test.js +566 -0
- package/v2Containers/WebPush/tests/selectors.test.js +843 -0
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +528 -431
- package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +0 -254
- package/v2Components/HtmlEditor/components/ValidationTabs/index.js +0 -362
- package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +0 -51
- package/v2Containers/BeePopupEditor/constants.js +0 -10
- package/v2Containers/BeePopupEditor/index.js +0 -193
- package/v2Containers/BeePopupEditor/tests/index.test.js +0 -627
- package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +0 -1045
- 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 -162
- package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +0 -267
- package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +0 -9
- 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
|
@@ -7,99 +7,91 @@
|
|
|
7
7
|
import React from 'react';
|
|
8
8
|
import { render, screen } from '@testing-library/react';
|
|
9
9
|
import '@testing-library/jest-dom';
|
|
10
|
-
import { IntlProvider } from 'react-intl';
|
|
11
10
|
import ValidationErrorDisplay from '../index';
|
|
12
11
|
|
|
13
|
-
//
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
12
|
+
// Mock ErrorInfoNote component
|
|
13
|
+
jest.mock('../../../../ErrorInfoNote', () => {
|
|
14
|
+
return function MockErrorInfoNote({ errorMessages }) {
|
|
15
|
+
const liquidErrors = errorMessages?.LIQUID_ERROR_MSG || [];
|
|
16
|
+
const standardErrors = errorMessages?.STANDARD_ERROR_MSG || [];
|
|
17
|
+
const hasErrors = liquidErrors.length > 0 || standardErrors.length > 0;
|
|
18
|
+
|
|
19
|
+
if (!hasErrors) return null;
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<div data-testid="error-info-note">
|
|
23
|
+
{liquidErrors.map((msg, index) => (
|
|
24
|
+
<div key={`liquid-${index}`} data-testid="error-message">
|
|
25
|
+
{msg}
|
|
26
|
+
</div>
|
|
27
|
+
))}
|
|
28
|
+
{standardErrors.map((msg, index) => (
|
|
29
|
+
<div key={`standard-${index}`} data-testid="error-message">
|
|
30
|
+
{msg}
|
|
31
|
+
</div>
|
|
32
|
+
))}
|
|
33
|
+
</div>
|
|
34
|
+
);
|
|
35
|
+
};
|
|
36
|
+
});
|
|
22
37
|
|
|
23
38
|
describe('ValidationErrorDisplay', () => {
|
|
24
39
|
it('renders standard errors when validation has issues', () => {
|
|
25
40
|
const mockValidation = {
|
|
26
41
|
getAllIssues: () => [
|
|
27
|
-
{
|
|
28
|
-
|
|
29
|
-
},
|
|
30
|
-
{ message: 'Invalid attribute', severity: 'error', line: 7 },
|
|
42
|
+
{ message: 'Missing closing tag', severity: 'error', line: 5, column: 10 },
|
|
43
|
+
{ message: 'Invalid attribute', severity: 'error', line: 7 }
|
|
31
44
|
],
|
|
32
45
|
isClean: () => false,
|
|
33
|
-
isValidating: false
|
|
46
|
+
isValidating: false
|
|
34
47
|
};
|
|
35
48
|
|
|
36
|
-
|
|
37
|
-
<TestWrapper>
|
|
38
|
-
<ValidationErrorDisplay validation={mockValidation} />
|
|
39
|
-
</TestWrapper>
|
|
40
|
-
);
|
|
49
|
+
render(<ValidationErrorDisplay validation={mockValidation} />);
|
|
41
50
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
expect(
|
|
46
|
-
|
|
47
|
-
expect(screen.getByText('Missing closing tag')).toBeInTheDocument();
|
|
48
|
-
expect(screen.getByText('Invalid attribute')).toBeInTheDocument();
|
|
51
|
+
expect(screen.getByTestId('error-info-note')).toBeInTheDocument();
|
|
52
|
+
const errorMessages = screen.getAllByTestId('error-message');
|
|
53
|
+
expect(errorMessages).toHaveLength(2);
|
|
54
|
+
expect(errorMessages[0]).toHaveTextContent('Missing closing tag Line 5, Char 10.');
|
|
55
|
+
expect(errorMessages[1]).toHaveTextContent('Invalid attribute Line 7.');
|
|
49
56
|
});
|
|
50
57
|
|
|
51
58
|
it('renders liquid errors separately', () => {
|
|
52
59
|
const mockValidation = {
|
|
53
60
|
getAllIssues: () => [
|
|
54
|
-
{
|
|
55
|
-
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
message: 'HTML error', severity: 'error', source: 'htmlhint', line: 10,
|
|
59
|
-
},
|
|
61
|
+
{ message: 'Invalid liquid syntax', severity: 'error', source: 'liquid-validator', line: 3 },
|
|
62
|
+
{ message: 'HTML error', severity: 'error', source: 'htmlhint', line: 10 }
|
|
60
63
|
],
|
|
61
64
|
isClean: () => false,
|
|
62
|
-
isValidating: false
|
|
65
|
+
isValidating: false
|
|
63
66
|
};
|
|
64
67
|
|
|
65
|
-
|
|
66
|
-
<TestWrapper>
|
|
67
|
-
<ValidationErrorDisplay validation={mockValidation} />
|
|
68
|
-
</TestWrapper>
|
|
69
|
-
);
|
|
68
|
+
render(<ValidationErrorDisplay validation={mockValidation} />);
|
|
70
69
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
expect(
|
|
70
|
+
expect(screen.getByTestId('error-info-note')).toBeInTheDocument();
|
|
71
|
+
const errorMessages = screen.getAllByTestId('error-message');
|
|
72
|
+
expect(errorMessages).toHaveLength(2);
|
|
73
|
+
// First should be liquid error, second should be standard error
|
|
74
|
+
expect(errorMessages[0]).toHaveTextContent('Invalid liquid syntax Line 3.');
|
|
75
|
+
expect(errorMessages[1]).toHaveTextContent('HTML error Line 10.');
|
|
76
76
|
});
|
|
77
77
|
|
|
78
78
|
it('does not render when validation has no errors', () => {
|
|
79
79
|
const mockValidation = {
|
|
80
80
|
getAllIssues: () => [],
|
|
81
81
|
isClean: () => true,
|
|
82
|
-
isValidating: false
|
|
82
|
+
isValidating: false
|
|
83
83
|
};
|
|
84
84
|
|
|
85
|
-
const { container } = render(
|
|
86
|
-
<TestWrapper>
|
|
87
|
-
<ValidationErrorDisplay validation={mockValidation} />
|
|
88
|
-
</TestWrapper>
|
|
89
|
-
);
|
|
85
|
+
const { container } = render(<ValidationErrorDisplay validation={mockValidation} />);
|
|
90
86
|
|
|
91
|
-
expect(
|
|
87
|
+
expect(screen.queryByTestId('error-info-note')).not.toBeInTheDocument();
|
|
92
88
|
expect(container.firstChild).toBeNull();
|
|
93
89
|
});
|
|
94
90
|
|
|
95
91
|
it('does not render when validation is null', () => {
|
|
96
|
-
const { container } = render(
|
|
97
|
-
<TestWrapper>
|
|
98
|
-
<ValidationErrorDisplay validation={null} />
|
|
99
|
-
</TestWrapper>
|
|
100
|
-
);
|
|
92
|
+
const { container } = render(<ValidationErrorDisplay validation={null} />);
|
|
101
93
|
|
|
102
|
-
expect(
|
|
94
|
+
expect(screen.queryByTestId('error-info-note')).not.toBeInTheDocument();
|
|
103
95
|
expect(container.firstChild).toBeNull();
|
|
104
96
|
});
|
|
105
97
|
|
|
@@ -107,16 +99,12 @@ describe('ValidationErrorDisplay', () => {
|
|
|
107
99
|
const mockValidation = {
|
|
108
100
|
getAllIssues: () => [],
|
|
109
101
|
isClean: () => false,
|
|
110
|
-
isValidating: true
|
|
102
|
+
isValidating: true
|
|
111
103
|
};
|
|
112
104
|
|
|
113
|
-
const { container } = render(
|
|
114
|
-
<TestWrapper>
|
|
115
|
-
<ValidationErrorDisplay validation={mockValidation} />
|
|
116
|
-
</TestWrapper>
|
|
117
|
-
);
|
|
105
|
+
const { container } = render(<ValidationErrorDisplay validation={mockValidation} />);
|
|
118
106
|
|
|
119
|
-
expect(
|
|
107
|
+
expect(screen.queryByTestId('error-info-note')).not.toBeInTheDocument();
|
|
120
108
|
expect(container.firstChild).toBeNull();
|
|
121
109
|
});
|
|
122
110
|
|
|
@@ -124,13 +112,11 @@ describe('ValidationErrorDisplay', () => {
|
|
|
124
112
|
const mockValidation = {
|
|
125
113
|
getAllIssues: () => [{ message: 'Error', severity: 'error' }],
|
|
126
114
|
isClean: () => false,
|
|
127
|
-
isValidating: false
|
|
115
|
+
isValidating: false
|
|
128
116
|
};
|
|
129
117
|
|
|
130
118
|
const { container } = render(
|
|
131
|
-
<
|
|
132
|
-
<ValidationErrorDisplay validation={mockValidation} className="custom-class" />
|
|
133
|
-
</TestWrapper>
|
|
119
|
+
<ValidationErrorDisplay validation={mockValidation} className="custom-class" />
|
|
134
120
|
);
|
|
135
121
|
|
|
136
122
|
const wrapper = container.querySelector('.validation-error-display');
|
|
@@ -141,37 +127,26 @@ describe('ValidationErrorDisplay', () => {
|
|
|
141
127
|
const mockValidation = {
|
|
142
128
|
getAllIssues: () => [{ message: 'Mobile error', severity: 'error' }],
|
|
143
129
|
isClean: () => false,
|
|
144
|
-
isValidating: false
|
|
130
|
+
isValidating: false
|
|
145
131
|
};
|
|
146
132
|
|
|
147
|
-
|
|
148
|
-
<TestWrapper>
|
|
149
|
-
<ValidationErrorDisplay validation={mockValidation} variant="inapp" />
|
|
150
|
-
</TestWrapper>
|
|
151
|
-
);
|
|
133
|
+
render(<ValidationErrorDisplay validation={mockValidation} variant="inapp" />);
|
|
152
134
|
|
|
153
|
-
expect(
|
|
154
|
-
expect(screen.
|
|
135
|
+
expect(screen.getByTestId('error-info-note')).toBeInTheDocument();
|
|
136
|
+
expect(screen.getByTestId('error-message')).toHaveTextContent('Mobile error');
|
|
155
137
|
});
|
|
156
138
|
|
|
157
139
|
it('includes rule information in error messages when available', () => {
|
|
158
140
|
const mockValidation = {
|
|
159
141
|
getAllIssues: () => [
|
|
160
|
-
{
|
|
161
|
-
message: 'Alt attribute required', severity: 'error', rule: 'alt-require', line: 5,
|
|
162
|
-
},
|
|
142
|
+
{ message: 'Alt attribute required', severity: 'error', rule: 'alt-require', line: 5 }
|
|
163
143
|
],
|
|
164
144
|
isClean: () => false,
|
|
165
|
-
isValidating: false
|
|
145
|
+
isValidating: false
|
|
166
146
|
};
|
|
167
147
|
|
|
168
|
-
render(
|
|
169
|
-
<TestWrapper>
|
|
170
|
-
<ValidationErrorDisplay validation={mockValidation} />
|
|
171
|
-
</TestWrapper>
|
|
172
|
-
);
|
|
148
|
+
render(<ValidationErrorDisplay validation={mockValidation} />);
|
|
173
149
|
|
|
174
|
-
|
|
175
|
-
expect(screen.getByText('Alt attribute required')).toBeInTheDocument();
|
|
150
|
+
expect(screen.getByTestId('error-message')).toHaveTextContent('Alt attribute required Line 5. • alt-require');
|
|
176
151
|
});
|
|
177
152
|
});
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ValidationErrorDisplay - HTML Editor validation
|
|
2
|
+
* ValidationErrorDisplay - HTML Editor validation using ErrorInfoNote
|
|
3
3
|
*
|
|
4
|
-
* This component
|
|
5
|
-
*
|
|
4
|
+
* This component integrates the existing ErrorInfoNote component with the HTML Editor's
|
|
5
|
+
* validation system, providing a consistent error display that matches the Figma design.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import React
|
|
8
|
+
import React from 'react';
|
|
9
9
|
import PropTypes from 'prop-types';
|
|
10
10
|
|
|
11
|
-
import
|
|
12
|
-
import
|
|
11
|
+
import CapRow from '@capillarytech/cap-ui-library/CapRow';
|
|
12
|
+
import ErrorInfoNote from '../../../ErrorInfoNote';
|
|
13
|
+
|
|
14
|
+
import { transformValidationToErrorInfo, hasValidationErrors } from '../../utils/validationAdapter';
|
|
15
|
+
import { HTML_EDITOR_VARIANTS } from '../../constants';
|
|
13
16
|
|
|
14
17
|
// Styles
|
|
15
18
|
import './_validationErrorDisplay.scss';
|
|
@@ -17,72 +20,51 @@ import './_validationErrorDisplay.scss';
|
|
|
17
20
|
/**
|
|
18
21
|
* ValidationErrorDisplay Component
|
|
19
22
|
*
|
|
20
|
-
* Displays validation errors using the
|
|
23
|
+
* Displays validation errors using the existing ErrorInfoNote component
|
|
21
24
|
*/
|
|
22
25
|
const ValidationErrorDisplay = ({
|
|
23
26
|
validation,
|
|
27
|
+
variant = HTML_EDITOR_VARIANTS.EMAIL,
|
|
24
28
|
onErrorClick,
|
|
25
|
-
|
|
26
|
-
isLiquidEnabled = false,
|
|
27
|
-
className = '',
|
|
29
|
+
className = ''
|
|
28
30
|
}) => {
|
|
29
|
-
//
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
// Handle close - dismiss temporarily
|
|
33
|
-
const handleClose = () => {
|
|
34
|
-
setIsDismissed(true);
|
|
35
|
-
if (onClose) {
|
|
36
|
-
onClose();
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
// Reset dismissed state when validation changes (new errors appear)
|
|
41
|
-
React.useEffect(() => {
|
|
42
|
-
if (hasValidationErrors(validation)) {
|
|
43
|
-
setIsDismissed(false);
|
|
44
|
-
}
|
|
45
|
-
}, [validation]);
|
|
46
|
-
|
|
47
|
-
// Don't render if no validation, no errors, or dismissed
|
|
48
|
-
if (!hasValidationErrors(validation) || isDismissed) {
|
|
31
|
+
// Don't render if no validation or no errors
|
|
32
|
+
if (!hasValidationErrors(validation)) {
|
|
49
33
|
return null;
|
|
50
34
|
}
|
|
51
35
|
|
|
36
|
+
// Transform validation data to ErrorInfoNote format
|
|
37
|
+
const errorData = transformValidationToErrorInfo(validation, variant);
|
|
38
|
+
const { errorMessages } = errorData || {};
|
|
39
|
+
|
|
40
|
+
// Handle error click if provided
|
|
41
|
+
const handleErrorClick = (error) => {
|
|
42
|
+
onErrorClick?.(error);
|
|
43
|
+
};
|
|
44
|
+
|
|
52
45
|
return (
|
|
53
|
-
<
|
|
46
|
+
<CapRow
|
|
54
47
|
className={`validation-error-display ${className}`}
|
|
55
48
|
role="alert"
|
|
56
49
|
aria-live="polite"
|
|
57
50
|
aria-label="Validation errors"
|
|
58
51
|
>
|
|
59
|
-
<
|
|
60
|
-
|
|
61
|
-
onErrorClick={
|
|
62
|
-
onClose={handleClose}
|
|
63
|
-
isLiquidEnabled={isLiquidEnabled}
|
|
52
|
+
<ErrorInfoNote
|
|
53
|
+
errorMessages={errorMessages}
|
|
54
|
+
onErrorClick={handleErrorClick}
|
|
64
55
|
/>
|
|
65
|
-
</
|
|
56
|
+
</CapRow>
|
|
66
57
|
);
|
|
67
58
|
};
|
|
68
59
|
|
|
69
60
|
ValidationErrorDisplay.propTypes = {
|
|
70
61
|
validation: PropTypes.shape({
|
|
71
62
|
isValidating: PropTypes.bool,
|
|
72
|
-
getAllIssues: PropTypes.func
|
|
63
|
+
getAllIssues: PropTypes.func
|
|
73
64
|
}),
|
|
65
|
+
variant: PropTypes.oneOf(Object.values(HTML_EDITOR_VARIANTS)),
|
|
74
66
|
onErrorClick: PropTypes.func,
|
|
75
|
-
|
|
76
|
-
isLiquidEnabled: PropTypes.bool,
|
|
77
|
-
className: PropTypes.string,
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
ValidationErrorDisplay.defaultProps = {
|
|
81
|
-
validation: null,
|
|
82
|
-
onErrorClick: null,
|
|
83
|
-
onClose: null,
|
|
84
|
-
isLiquidEnabled: false,
|
|
85
|
-
className: '',
|
|
67
|
+
className: PropTypes.string
|
|
86
68
|
};
|
|
87
69
|
|
|
88
70
|
export default ValidationErrorDisplay;
|
|
@@ -7,26 +7,26 @@
|
|
|
7
7
|
// HTML Editor Variants
|
|
8
8
|
export const HTML_EDITOR_VARIANTS = {
|
|
9
9
|
EMAIL: 'email',
|
|
10
|
-
INAPP: 'inapp'
|
|
10
|
+
INAPP: 'inapp'
|
|
11
11
|
};
|
|
12
12
|
|
|
13
13
|
// Device Types (for InApp variant)
|
|
14
14
|
export const DEVICE_TYPES = {
|
|
15
15
|
ANDROID: 'android',
|
|
16
|
-
IOS: 'ios'
|
|
16
|
+
IOS: 'ios'
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
// Editor languages
|
|
20
20
|
export const EDITOR_LANGUAGES = {
|
|
21
21
|
HTML: 'html',
|
|
22
22
|
CSS: 'css',
|
|
23
|
-
JAVASCRIPT: 'javascript'
|
|
23
|
+
JAVASCRIPT: 'javascript'
|
|
24
24
|
};
|
|
25
25
|
|
|
26
26
|
// Preview modes
|
|
27
27
|
export const PREVIEW_MODES = {
|
|
28
28
|
DESKTOP: 'desktop',
|
|
29
|
-
MOBILE: 'mobile'
|
|
29
|
+
MOBILE: 'mobile'
|
|
30
30
|
};
|
|
31
31
|
|
|
32
32
|
// Device specifications for mobile preview
|
|
@@ -38,7 +38,7 @@ export const DEVICE_PRESETS = {
|
|
|
38
38
|
devicePixelRatio: 2.75,
|
|
39
39
|
userAgent: 'Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36',
|
|
40
40
|
platform: 'android',
|
|
41
|
-
model: 'Pixel 7'
|
|
41
|
+
model: 'Pixel 7'
|
|
42
42
|
},
|
|
43
43
|
IPHONE: {
|
|
44
44
|
key: 'iphone',
|
|
@@ -47,15 +47,15 @@ export const DEVICE_PRESETS = {
|
|
|
47
47
|
devicePixelRatio: 3,
|
|
48
48
|
userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)',
|
|
49
49
|
platform: 'ios',
|
|
50
|
-
model: 'iPhone 15'
|
|
51
|
-
}
|
|
50
|
+
model: 'iPhone 15'
|
|
51
|
+
}
|
|
52
52
|
};
|
|
53
53
|
|
|
54
54
|
// Validation severity levels
|
|
55
55
|
export const VALIDATION_SEVERITY = {
|
|
56
56
|
ERROR: 'error',
|
|
57
57
|
WARNING: 'warning',
|
|
58
|
-
INFO: 'info'
|
|
58
|
+
INFO: 'info'
|
|
59
59
|
};
|
|
60
60
|
|
|
61
61
|
// Validation types
|
|
@@ -63,14 +63,14 @@ export const VALIDATION_TYPES = {
|
|
|
63
63
|
HTML: 'html',
|
|
64
64
|
CSS: 'css',
|
|
65
65
|
JAVASCRIPT: 'javascript',
|
|
66
|
-
SECURITY: 'security'
|
|
66
|
+
SECURITY: 'security'
|
|
67
67
|
};
|
|
68
68
|
|
|
69
69
|
// Error types for preview
|
|
70
70
|
export const PREVIEW_ERROR_TYPES = {
|
|
71
71
|
RUNTIME: 'runtime',
|
|
72
72
|
RENDER: 'render',
|
|
73
|
-
SECURITY: 'security'
|
|
73
|
+
SECURITY: 'security'
|
|
74
74
|
};
|
|
75
75
|
|
|
76
76
|
// Performance thresholds
|
|
@@ -79,7 +79,7 @@ export const PERFORMANCE = {
|
|
|
79
79
|
VALIDATION_DEBOUNCE: 500, // ms
|
|
80
80
|
AUTO_SAVE_INTERVAL: 30000, // ms
|
|
81
81
|
MAX_CONTENT_LENGTH: 100000, // characters
|
|
82
|
-
PERFORMANCE_WARNING_THRESHOLD: 50000
|
|
82
|
+
PERFORMANCE_WARNING_THRESHOLD: 50000 // characters
|
|
83
83
|
};
|
|
84
84
|
|
|
85
85
|
// Layout constraints
|
|
@@ -89,7 +89,7 @@ export const LAYOUT = {
|
|
|
89
89
|
DEFAULT_SPLIT_SIZES: [50, 50], // [left, right] percentages
|
|
90
90
|
GUTTER_SIZE: 8, // pixels
|
|
91
91
|
MOBILE_BREAKPOINT: 768, // pixels
|
|
92
|
-
MOBILE_WIDTH_DEFAULT: 375
|
|
92
|
+
MOBILE_WIDTH_DEFAULT: 375 // pixels
|
|
93
93
|
};
|
|
94
94
|
|
|
95
95
|
|
|
@@ -105,7 +105,7 @@ export const CODEMIRROR_CONFIG = {
|
|
|
105
105
|
FOLD_GUTTER: true,
|
|
106
106
|
SEARCH_ENABLED: true,
|
|
107
107
|
AUTOCOMPLETE_ENABLED: true,
|
|
108
|
-
LINT_ENABLED: true
|
|
108
|
+
LINT_ENABLED: true
|
|
109
109
|
};
|
|
110
110
|
|
|
111
111
|
// HTML validation rules (HTMLHint)
|
|
@@ -126,7 +126,7 @@ export const HTML_VALIDATION_RULES = {
|
|
|
126
126
|
'inline-style-disabled': false,
|
|
127
127
|
'inline-script-disabled': false,
|
|
128
128
|
'space-tab-mixed-disabled': 'space',
|
|
129
|
-
'spec-char-escape': true
|
|
129
|
+
'spec-char-escape': true
|
|
130
130
|
};
|
|
131
131
|
|
|
132
132
|
// CSS validation rules
|
|
@@ -137,7 +137,7 @@ export const CSS_VALIDATION_RULES = {
|
|
|
137
137
|
'declaration-colon-space-after': 'always',
|
|
138
138
|
'declaration-colon-space-before': 'never',
|
|
139
139
|
'block-closing-brace-newline-after': 'always',
|
|
140
|
-
'block-opening-brace-space-before': 'always'
|
|
140
|
+
'block-opening-brace-space-before': 'always'
|
|
141
141
|
};
|
|
142
142
|
|
|
143
143
|
// JavaScript validation rules (ESLint-style)
|
|
@@ -148,7 +148,7 @@ export const JS_VALIDATION_RULES = {
|
|
|
148
148
|
'no-console': 'warn',
|
|
149
149
|
'semi': ['error', 'always'],
|
|
150
150
|
'quotes': ['error', 'single'],
|
|
151
|
-
'indent': ['error', 2]
|
|
151
|
+
'indent': ['error', 2]
|
|
152
152
|
};
|
|
153
153
|
|
|
154
154
|
// Keyboard shortcuts
|
|
@@ -163,7 +163,7 @@ export const KEYBOARD_SHORTCUTS = {
|
|
|
163
163
|
FIND: 'Ctrl+F',
|
|
164
164
|
FIND_MAC: 'Cmd+F',
|
|
165
165
|
REPLACE: 'Ctrl+H',
|
|
166
|
-
REPLACE_MAC: 'Cmd+Option+F'
|
|
166
|
+
REPLACE_MAC: 'Cmd+Option+F'
|
|
167
167
|
};
|
|
168
168
|
|
|
169
169
|
// Feature flags
|
|
@@ -176,7 +176,7 @@ export const FEATURES = {
|
|
|
176
176
|
KEYBOARD_SHORTCUTS: true,
|
|
177
177
|
ERROR_RECOVERY: true,
|
|
178
178
|
PERFORMANCE_MONITORING: true,
|
|
179
|
-
ACCESSIBILITY_FEATURES: true
|
|
179
|
+
ACCESSIBILITY_FEATURES: true
|
|
180
180
|
};
|
|
181
181
|
|
|
182
182
|
// Animation durations (ms)
|
|
@@ -186,7 +186,7 @@ export const ANIMATIONS = {
|
|
|
186
186
|
SLOW: 500,
|
|
187
187
|
PANEL_RESIZE: 200,
|
|
188
188
|
FADE_IN: 300,
|
|
189
|
-
SLIDE_IN: 250
|
|
189
|
+
SLIDE_IN: 250
|
|
190
190
|
};
|
|
191
191
|
|
|
192
192
|
// Z-index layers
|
|
@@ -195,7 +195,7 @@ export const Z_INDEX = {
|
|
|
195
195
|
OVERLAY: 1000,
|
|
196
196
|
MODAL: 1050,
|
|
197
197
|
FULLSCREEN: 9999,
|
|
198
|
-
TOOLTIP: 10000
|
|
198
|
+
TOOLTIP: 10000
|
|
199
199
|
};
|
|
200
200
|
|
|
201
201
|
// Default HTML content template
|
|
@@ -239,12 +239,3 @@ export const DEFAULT_HTML_CONTENT = `<!DOCTYPE html>
|
|
|
239
239
|
</script>
|
|
240
240
|
</body>
|
|
241
241
|
</html>`;
|
|
242
|
-
|
|
243
|
-
// Constants for tag API calls
|
|
244
|
-
export const TAG = 'TAG';
|
|
245
|
-
export const EMBEDDED = 'embedded';
|
|
246
|
-
export const DEFAULT = 'default';
|
|
247
|
-
export const FULL = 'full';
|
|
248
|
-
export const ALL = 'all';
|
|
249
|
-
export const SMS = 'SMS';
|
|
250
|
-
export const EMAIL = 'EMAIL';
|