@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.
Files changed (255) hide show
  1. package/assets/Android.png +0 -0
  2. package/assets/iOS.png +0 -0
  3. package/config/app.js +1 -1
  4. package/constants/unified.js +2 -2
  5. package/initialReducer.js +0 -2
  6. package/package.json +1 -1
  7. package/services/api.js +5 -10
  8. package/services/tests/api.test.js +0 -18
  9. package/translations/en.json +4 -3
  10. package/utils/common.js +6 -5
  11. package/utils/commonUtils.js +1 -14
  12. package/utils/imageUrlUpload.js +141 -0
  13. package/utils/tests/commonUtil.test.js +0 -224
  14. package/utils/transformTemplateConfig.js +10 -0
  15. package/v2Components/CapDeviceContent/index.js +56 -61
  16. package/v2Components/CapImageUpload/constants.js +2 -0
  17. package/v2Components/CapImageUpload/index.js +65 -16
  18. package/v2Components/CapImageUpload/index.scss +4 -1
  19. package/v2Components/CapImageUpload/messages.js +5 -1
  20. package/v2Components/CapImageUrlUpload/constants.js +26 -0
  21. package/v2Components/CapImageUrlUpload/index.js +365 -0
  22. package/v2Components/CapImageUrlUpload/index.scss +35 -0
  23. package/v2Components/CapImageUrlUpload/messages.js +47 -0
  24. package/v2Components/CapTagList/index.js +1 -6
  25. package/v2Components/CapTagListWithInput/index.js +1 -5
  26. package/v2Components/CapTagListWithInput/messages.js +1 -1
  27. package/v2Components/CapWhatsappCTA/tests/index.test.js +0 -5
  28. package/v2Components/ErrorInfoNote/index.js +72 -412
  29. package/v2Components/ErrorInfoNote/messages.js +0 -22
  30. package/v2Components/ErrorInfoNote/style.scss +2 -279
  31. package/v2Components/HtmlEditor/HTMLEditor.js +89 -210
  32. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +133 -1132
  33. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +12 -17
  34. package/v2Components/HtmlEditor/_htmlEditor.scss +23 -8
  35. package/v2Components/HtmlEditor/_index.lazy.scss +1 -1
  36. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +101 -13
  37. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +139 -148
  38. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +1 -2
  39. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
  40. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +1 -1
  41. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +0 -1
  42. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +7 -4
  43. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +45 -35
  44. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +3 -1
  45. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  46. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +6 -7
  47. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +6 -3
  48. package/v2Components/HtmlEditor/components/PreviewPane/index.js +11 -10
  49. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  50. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +62 -87
  51. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +31 -49
  52. package/v2Components/HtmlEditor/constants.js +20 -29
  53. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +16 -373
  54. package/v2Components/HtmlEditor/hooks/useEditorContent.js +2 -5
  55. package/v2Components/HtmlEditor/hooks/useInAppContent.js +146 -88
  56. package/v2Components/HtmlEditor/index.js +1 -1
  57. package/v2Components/HtmlEditor/messages.js +85 -95
  58. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +101 -99
  59. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +25 -23
  60. package/v2Components/HtmlEditor/utils/validationAdapter.js +41 -34
  61. package/v2Components/MobilePushPreviewV2/index.js +7 -32
  62. package/v2Components/TemplatePreview/_templatePreview.scss +24 -44
  63. package/v2Components/TemplatePreview/index.js +32 -47
  64. package/v2Components/TemplatePreview/messages.js +0 -4
  65. package/v2Components/TestAndPreviewSlidebox/index.js +25 -31
  66. package/v2Containers/App/constants.js +5 -0
  67. package/v2Containers/BeeEditor/index.js +80 -82
  68. package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +4 -3
  69. package/v2Containers/CreativesContainer/SlideBoxContent.js +118 -148
  70. package/v2Containers/CreativesContainer/SlideBoxFooter.js +3 -9
  71. package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
  72. package/v2Containers/CreativesContainer/constants.js +2 -1
  73. package/v2Containers/CreativesContainer/index.js +41 -173
  74. package/v2Containers/CreativesContainer/messages.js +4 -4
  75. package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +210 -0
  76. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +354 -38
  77. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +0 -36
  78. package/v2Containers/Email/actions.js +0 -7
  79. package/v2Containers/Email/constants.js +1 -5
  80. package/v2Containers/Email/index.js +0 -13
  81. package/v2Containers/Email/messages.js +0 -32
  82. package/v2Containers/Email/reducer.js +1 -12
  83. package/v2Containers/Email/sagas.js +6 -41
  84. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -2
  85. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +7 -193
  86. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +74 -40
  87. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +67 -2
  88. package/v2Containers/EmailWrapper/constants.js +0 -2
  89. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +67 -436
  90. package/v2Containers/EmailWrapper/index.js +23 -99
  91. package/v2Containers/EmailWrapper/messages.js +1 -61
  92. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +1 -26
  93. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +77 -111
  94. package/v2Containers/InApp/actions.js +0 -7
  95. package/v2Containers/InApp/constants.js +4 -20
  96. package/v2Containers/InApp/index.js +357 -800
  97. package/v2Containers/InApp/index.scss +3 -4
  98. package/v2Containers/InApp/messages.js +3 -7
  99. package/v2Containers/InApp/reducer.js +3 -21
  100. package/v2Containers/InApp/sagas.js +9 -29
  101. package/v2Containers/InApp/selectors.js +5 -25
  102. package/v2Containers/InApp/tests/index.test.js +50 -154
  103. package/v2Containers/InApp/tests/reducer.test.js +0 -34
  104. package/v2Containers/InApp/tests/sagas.test.js +9 -61
  105. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +12 -12
  106. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +8 -8
  107. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +100 -77
  108. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +72 -63
  109. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +184 -150
  110. package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +16 -12
  111. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +32 -28
  112. package/v2Containers/TagList/index.js +1 -67
  113. package/v2Containers/Templates/ChannelTypeIllustration.js +13 -1
  114. package/v2Containers/Templates/_templates.scss +202 -56
  115. package/v2Containers/Templates/actions.js +2 -1
  116. package/v2Containers/Templates/constants.js +1 -0
  117. package/v2Containers/Templates/index.js +278 -128
  118. package/v2Containers/Templates/messages.js +24 -4
  119. package/v2Containers/Templates/reducer.js +2 -0
  120. package/v2Containers/Templates/tests/index.test.js +10 -0
  121. package/v2Containers/TemplatesV2/index.js +8 -1
  122. package/v2Containers/TemplatesV2/messages.js +4 -0
  123. package/v2Containers/WebPush/Create/components/BrandIconSection.js +108 -0
  124. package/v2Containers/WebPush/Create/components/ButtonForm.js +172 -0
  125. package/v2Containers/WebPush/Create/components/ButtonItem.js +101 -0
  126. package/v2Containers/WebPush/Create/components/ButtonList.js +145 -0
  127. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.js +164 -0
  128. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.test.js +463 -0
  129. package/v2Containers/WebPush/Create/components/FormActions.js +54 -0
  130. package/v2Containers/WebPush/Create/components/FormActions.test.js +163 -0
  131. package/v2Containers/WebPush/Create/components/MediaSection.js +142 -0
  132. package/v2Containers/WebPush/Create/components/MediaSection.test.js +341 -0
  133. package/v2Containers/WebPush/Create/components/MessageSection.js +103 -0
  134. package/v2Containers/WebPush/Create/components/MessageSection.test.js +268 -0
  135. package/v2Containers/WebPush/Create/components/NotificationTitleSection.js +87 -0
  136. package/v2Containers/WebPush/Create/components/NotificationTitleSection.test.js +210 -0
  137. package/v2Containers/WebPush/Create/components/TemplateNameSection.js +54 -0
  138. package/v2Containers/WebPush/Create/components/TemplateNameSection.test.js +143 -0
  139. package/v2Containers/WebPush/Create/components/__snapshots__/ButtonsLinksSection.test.js.snap +86 -0
  140. package/v2Containers/WebPush/Create/components/__snapshots__/FormActions.test.js.snap +16 -0
  141. package/v2Containers/WebPush/Create/components/__snapshots__/MediaSection.test.js.snap +41 -0
  142. package/v2Containers/WebPush/Create/components/__snapshots__/MessageSection.test.js.snap +54 -0
  143. package/v2Containers/WebPush/Create/components/__snapshots__/NotificationTitleSection.test.js.snap +37 -0
  144. package/v2Containers/WebPush/Create/components/__snapshots__/TemplateNameSection.test.js.snap +21 -0
  145. package/v2Containers/WebPush/Create/components/_buttons.scss +246 -0
  146. package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +554 -0
  147. package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +607 -0
  148. package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +633 -0
  149. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +666 -0
  150. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +74 -0
  151. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +78 -0
  152. package/v2Containers/WebPush/Create/hooks/useButtonManagement.js +138 -0
  153. package/v2Containers/WebPush/Create/hooks/useButtonManagement.test.js +406 -0
  154. package/v2Containers/WebPush/Create/hooks/useCharacterCount.js +30 -0
  155. package/v2Containers/WebPush/Create/hooks/useCharacterCount.test.js +151 -0
  156. package/v2Containers/WebPush/Create/hooks/useImageUpload.js +104 -0
  157. package/v2Containers/WebPush/Create/hooks/useImageUpload.test.js +538 -0
  158. package/v2Containers/WebPush/Create/hooks/useTagManagement.js +122 -0
  159. package/v2Containers/WebPush/Create/hooks/useTagManagement.test.js +633 -0
  160. package/v2Containers/WebPush/Create/index.js +1056 -0
  161. package/v2Containers/WebPush/Create/index.scss +134 -0
  162. package/v2Containers/WebPush/Create/messages.js +203 -0
  163. package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +228 -0
  164. package/v2Containers/WebPush/Create/preview/NotificationContainer.js +294 -0
  165. package/v2Containers/WebPush/Create/preview/PreviewContent.js +90 -0
  166. package/v2Containers/WebPush/Create/preview/PreviewControls.js +305 -0
  167. package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +23 -0
  168. package/v2Containers/WebPush/Create/preview/WebPushPreview.js +150 -0
  169. package/v2Containers/WebPush/Create/preview/assets/Light.svg +53 -0
  170. package/v2Containers/WebPush/Create/preview/assets/Top.svg +5 -0
  171. package/v2Containers/WebPush/Create/preview/assets/android-arrow-down.svg +9 -0
  172. package/v2Containers/WebPush/Create/preview/assets/android-arrow-up.svg +9 -0
  173. package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
  174. package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
  175. package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +106 -0
  176. package/v2Containers/WebPush/Create/preview/assets/iOS.svg +26 -0
  177. package/v2Containers/WebPush/Create/preview/assets/macos-arrow-down-icon.svg +9 -0
  178. package/v2Containers/WebPush/Create/preview/assets/macos-triple-dot-icon.svg +9 -0
  179. package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +18 -0
  180. package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +29 -0
  181. package/v2Containers/WebPush/Create/preview/assets/windows-close-icon.svg +9 -0
  182. package/v2Containers/WebPush/Create/preview/assets/windows-triple-dot-icon.svg +9 -0
  183. package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +47 -0
  184. package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +141 -0
  185. package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +45 -0
  186. package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +68 -0
  187. package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +61 -0
  188. package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +99 -0
  189. package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +733 -0
  190. package/v2Containers/WebPush/Create/preview/components/tests/WindowsChromeExpanded.test.js +571 -0
  191. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +81 -0
  192. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/WindowsChromeExpanded.test.js.snap +81 -0
  193. package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +50 -0
  194. package/v2Containers/WebPush/Create/preview/constants.js +637 -0
  195. package/v2Containers/WebPush/Create/preview/notification-container.scss +79 -0
  196. package/v2Containers/WebPush/Create/preview/preview.scss +351 -0
  197. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +370 -0
  198. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +12 -0
  199. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +12 -0
  200. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +12 -0
  201. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +47 -0
  202. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +11 -0
  203. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +11 -0
  204. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +11 -0
  205. package/v2Containers/WebPush/Create/preview/styles/_base.scss +207 -0
  206. package/v2Containers/WebPush/Create/preview/styles/_ios.scss +153 -0
  207. package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +107 -0
  208. package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +101 -0
  209. package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +229 -0
  210. package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +909 -0
  211. package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +1081 -0
  212. package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +723 -0
  213. package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +943 -0
  214. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +131 -0
  215. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +112 -0
  216. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +144 -0
  217. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +129 -0
  218. package/v2Containers/WebPush/Create/utils/payloadBuilder.js +94 -0
  219. package/v2Containers/WebPush/Create/utils/payloadBuilder.test.js +390 -0
  220. package/v2Containers/WebPush/Create/utils/previewUtils.js +89 -0
  221. package/v2Containers/WebPush/Create/utils/urlValidation.js +115 -0
  222. package/v2Containers/WebPush/Create/utils/urlValidation.test.js +449 -0
  223. package/v2Containers/WebPush/Create/utils/validation.js +75 -0
  224. package/v2Containers/WebPush/Create/utils/validation.test.js +283 -0
  225. package/v2Containers/WebPush/actions.js +60 -0
  226. package/v2Containers/WebPush/constants.js +128 -0
  227. package/v2Containers/WebPush/index.js +2 -0
  228. package/v2Containers/WebPush/reducer.js +104 -0
  229. package/v2Containers/WebPush/sagas.js +119 -0
  230. package/v2Containers/WebPush/selectors.js +65 -0
  231. package/v2Containers/WebPush/tests/reducer.test.js +863 -0
  232. package/v2Containers/WebPush/tests/sagas.test.js +566 -0
  233. package/v2Containers/WebPush/tests/selectors.test.js +843 -0
  234. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +528 -431
  235. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +0 -254
  236. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +0 -362
  237. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +0 -51
  238. package/v2Containers/BeePopupEditor/constants.js +0 -10
  239. package/v2Containers/BeePopupEditor/index.js +0 -193
  240. package/v2Containers/BeePopupEditor/tests/index.test.js +0 -627
  241. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +0 -1045
  242. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +0 -376
  243. package/v2Containers/InApp/__tests__/sagas.test.js +0 -363
  244. package/v2Containers/InApp/tests/selectors.test.js +0 -612
  245. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +0 -162
  246. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +0 -267
  247. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +0 -9
  248. package/v2Containers/InAppWrapper/constants.js +0 -16
  249. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +0 -473
  250. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +0 -198
  251. package/v2Containers/InAppWrapper/index.js +0 -148
  252. package/v2Containers/InAppWrapper/messages.js +0 -49
  253. package/v2Containers/InappAdvance/index.js +0 -1099
  254. package/v2Containers/InappAdvance/index.scss +0 -10
  255. 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
- // Test wrapper with IntlProvider
14
- const TestWrapper = ({ children }) => (
15
- <IntlProvider locale="en" messages={{}}>
16
- {children}
17
- </IntlProvider>
18
- );
19
-
20
- // Note: ValidationErrorDisplay uses ValidationTabs, not ErrorInfoNote
21
- // The tests should check for the actual rendered structure
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
- message: 'Missing closing tag', severity: 'error', line: 5, column: 10,
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
- const { container } = render(
37
- <TestWrapper>
38
- <ValidationErrorDisplay validation={mockValidation} />
39
- </TestWrapper>
40
- );
49
+ render(<ValidationErrorDisplay validation={mockValidation} />);
41
50
 
42
- // Check for validation-error-display wrapper
43
- expect(container.querySelector('.validation-error-display')).toBeInTheDocument();
44
- // Check for validation-tabs component
45
- expect(container.querySelector('.validation-tabs')).toBeInTheDocument();
46
- // Check that error messages are rendered
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
- message: 'Invalid liquid syntax', severity: 'error', source: 'liquid-validator', line: 3,
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
- const { container } = render(
66
- <TestWrapper>
67
- <ValidationErrorDisplay validation={mockValidation} />
68
- </TestWrapper>
69
- );
68
+ render(<ValidationErrorDisplay validation={mockValidation} />);
70
69
 
71
- // Check for validation-error-display wrapper
72
- expect(container.querySelector('.validation-error-display')).toBeInTheDocument();
73
- // Check that both errors are rendered
74
- expect(screen.getByText('Invalid liquid syntax')).toBeInTheDocument();
75
- expect(screen.getByText('HTML error')).toBeInTheDocument();
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(container.querySelector('.validation-error-display')).not.toBeInTheDocument();
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(container.querySelector('.validation-error-display')).not.toBeInTheDocument();
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(container.querySelector('.validation-error-display')).not.toBeInTheDocument();
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
- <TestWrapper>
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
- const { container } = render(
148
- <TestWrapper>
149
- <ValidationErrorDisplay validation={mockValidation} variant="inapp" />
150
- </TestWrapper>
151
- );
133
+ render(<ValidationErrorDisplay validation={mockValidation} variant="inapp" />);
152
134
 
153
- expect(container.querySelector('.validation-error-display')).toBeInTheDocument();
154
- expect(screen.getByText('Mobile error')).toBeInTheDocument();
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
- // Check that the error message is rendered (rule info may be in tooltip or separate element)
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 display
2
+ * ValidationErrorDisplay - HTML Editor validation using ErrorInfoNote
3
3
  *
4
- * This component displays validation errors using the new ValidationTabs component
5
- * with tabbed interface for HTML, Label, and Liquid issues.
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, { useState } from 'react';
8
+ import React from 'react';
9
9
  import PropTypes from 'prop-types';
10
10
 
11
- import { hasValidationErrors } from '../../utils/validationAdapter';
12
- import ValidationTabs from '../ValidationTabs';
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 ValidationTabs component
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
- onClose,
26
- isLiquidEnabled = false,
27
- className = '',
29
+ className = ''
28
30
  }) => {
29
- // Track if panel is dismissed
30
- const [isDismissed, setIsDismissed] = useState(false);
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
- <div
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
- <ValidationTabs
60
- validation={validation}
61
- onErrorClick={onErrorClick}
62
- onClose={handleClose}
63
- isLiquidEnabled={isLiquidEnabled}
52
+ <ErrorInfoNote
53
+ errorMessages={errorMessages}
54
+ onErrorClick={handleErrorClick}
64
55
  />
65
- </div>
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
- onClose: PropTypes.func,
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, // characters
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, // pixels
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';