@capillarytech/creatives-library 8.0.242-alpha.10 → 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 (256) 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 +91 -220
  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 +45 -107
  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/_editorToolbar.scss +0 -9
  41. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +1 -1
  42. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +0 -22
  43. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +7 -4
  44. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +45 -35
  45. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +3 -1
  46. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  47. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +6 -7
  48. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +6 -3
  49. package/v2Components/HtmlEditor/components/PreviewPane/index.js +11 -10
  50. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  51. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +72 -70
  52. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +31 -49
  53. package/v2Components/HtmlEditor/constants.js +20 -29
  54. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +16 -373
  55. package/v2Components/HtmlEditor/hooks/useEditorContent.js +2 -5
  56. package/v2Components/HtmlEditor/hooks/useInAppContent.js +146 -88
  57. package/v2Components/HtmlEditor/index.js +1 -1
  58. package/v2Components/HtmlEditor/messages.js +85 -95
  59. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +101 -99
  60. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +25 -23
  61. package/v2Components/HtmlEditor/utils/validationAdapter.js +41 -34
  62. package/v2Components/MobilePushPreviewV2/index.js +7 -32
  63. package/v2Components/TemplatePreview/_templatePreview.scss +24 -44
  64. package/v2Components/TemplatePreview/index.js +32 -47
  65. package/v2Components/TemplatePreview/messages.js +0 -4
  66. package/v2Components/TestAndPreviewSlidebox/index.js +25 -31
  67. package/v2Containers/App/constants.js +5 -0
  68. package/v2Containers/BeeEditor/index.js +80 -82
  69. package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +4 -3
  70. package/v2Containers/CreativesContainer/SlideBoxContent.js +118 -148
  71. package/v2Containers/CreativesContainer/SlideBoxFooter.js +3 -9
  72. package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
  73. package/v2Containers/CreativesContainer/constants.js +2 -1
  74. package/v2Containers/CreativesContainer/index.js +41 -173
  75. package/v2Containers/CreativesContainer/messages.js +4 -4
  76. package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +210 -0
  77. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +354 -38
  78. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +0 -36
  79. package/v2Containers/Email/actions.js +0 -7
  80. package/v2Containers/Email/constants.js +1 -5
  81. package/v2Containers/Email/index.js +0 -13
  82. package/v2Containers/Email/messages.js +0 -32
  83. package/v2Containers/Email/reducer.js +1 -12
  84. package/v2Containers/Email/sagas.js +6 -41
  85. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -2
  86. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +7 -193
  87. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +74 -40
  88. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +67 -2
  89. package/v2Containers/EmailWrapper/constants.js +0 -2
  90. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +67 -436
  91. package/v2Containers/EmailWrapper/index.js +23 -99
  92. package/v2Containers/EmailWrapper/messages.js +1 -61
  93. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +214 -0
  94. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +77 -111
  95. package/v2Containers/InApp/actions.js +0 -7
  96. package/v2Containers/InApp/constants.js +4 -20
  97. package/v2Containers/InApp/index.js +357 -801
  98. package/v2Containers/InApp/index.scss +3 -4
  99. package/v2Containers/InApp/messages.js +3 -7
  100. package/v2Containers/InApp/reducer.js +3 -21
  101. package/v2Containers/InApp/sagas.js +9 -29
  102. package/v2Containers/InApp/selectors.js +5 -25
  103. package/v2Containers/InApp/tests/index.test.js +50 -154
  104. package/v2Containers/InApp/tests/reducer.test.js +0 -34
  105. package/v2Containers/InApp/tests/sagas.test.js +9 -61
  106. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +12 -12
  107. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +8 -8
  108. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +100 -77
  109. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +72 -63
  110. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +184 -150
  111. package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +16 -12
  112. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +32 -28
  113. package/v2Containers/TagList/index.js +1 -67
  114. package/v2Containers/Templates/ChannelTypeIllustration.js +13 -1
  115. package/v2Containers/Templates/_templates.scss +202 -56
  116. package/v2Containers/Templates/actions.js +2 -1
  117. package/v2Containers/Templates/constants.js +1 -0
  118. package/v2Containers/Templates/index.js +278 -128
  119. package/v2Containers/Templates/messages.js +24 -4
  120. package/v2Containers/Templates/reducer.js +2 -0
  121. package/v2Containers/Templates/tests/index.test.js +10 -0
  122. package/v2Containers/TemplatesV2/index.js +8 -1
  123. package/v2Containers/TemplatesV2/messages.js +4 -0
  124. package/v2Containers/WebPush/Create/components/BrandIconSection.js +108 -0
  125. package/v2Containers/WebPush/Create/components/ButtonForm.js +172 -0
  126. package/v2Containers/WebPush/Create/components/ButtonItem.js +101 -0
  127. package/v2Containers/WebPush/Create/components/ButtonList.js +145 -0
  128. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.js +164 -0
  129. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.test.js +463 -0
  130. package/v2Containers/WebPush/Create/components/FormActions.js +54 -0
  131. package/v2Containers/WebPush/Create/components/FormActions.test.js +163 -0
  132. package/v2Containers/WebPush/Create/components/MediaSection.js +142 -0
  133. package/v2Containers/WebPush/Create/components/MediaSection.test.js +341 -0
  134. package/v2Containers/WebPush/Create/components/MessageSection.js +103 -0
  135. package/v2Containers/WebPush/Create/components/MessageSection.test.js +268 -0
  136. package/v2Containers/WebPush/Create/components/NotificationTitleSection.js +87 -0
  137. package/v2Containers/WebPush/Create/components/NotificationTitleSection.test.js +210 -0
  138. package/v2Containers/WebPush/Create/components/TemplateNameSection.js +54 -0
  139. package/v2Containers/WebPush/Create/components/TemplateNameSection.test.js +143 -0
  140. package/v2Containers/WebPush/Create/components/__snapshots__/ButtonsLinksSection.test.js.snap +86 -0
  141. package/v2Containers/WebPush/Create/components/__snapshots__/FormActions.test.js.snap +16 -0
  142. package/v2Containers/WebPush/Create/components/__snapshots__/MediaSection.test.js.snap +41 -0
  143. package/v2Containers/WebPush/Create/components/__snapshots__/MessageSection.test.js.snap +54 -0
  144. package/v2Containers/WebPush/Create/components/__snapshots__/NotificationTitleSection.test.js.snap +37 -0
  145. package/v2Containers/WebPush/Create/components/__snapshots__/TemplateNameSection.test.js.snap +21 -0
  146. package/v2Containers/WebPush/Create/components/_buttons.scss +246 -0
  147. package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +554 -0
  148. package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +607 -0
  149. package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +633 -0
  150. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +666 -0
  151. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +74 -0
  152. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +78 -0
  153. package/v2Containers/WebPush/Create/hooks/useButtonManagement.js +138 -0
  154. package/v2Containers/WebPush/Create/hooks/useButtonManagement.test.js +406 -0
  155. package/v2Containers/WebPush/Create/hooks/useCharacterCount.js +30 -0
  156. package/v2Containers/WebPush/Create/hooks/useCharacterCount.test.js +151 -0
  157. package/v2Containers/WebPush/Create/hooks/useImageUpload.js +104 -0
  158. package/v2Containers/WebPush/Create/hooks/useImageUpload.test.js +538 -0
  159. package/v2Containers/WebPush/Create/hooks/useTagManagement.js +122 -0
  160. package/v2Containers/WebPush/Create/hooks/useTagManagement.test.js +633 -0
  161. package/v2Containers/WebPush/Create/index.js +1056 -0
  162. package/v2Containers/WebPush/Create/index.scss +134 -0
  163. package/v2Containers/WebPush/Create/messages.js +203 -0
  164. package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +228 -0
  165. package/v2Containers/WebPush/Create/preview/NotificationContainer.js +294 -0
  166. package/v2Containers/WebPush/Create/preview/PreviewContent.js +90 -0
  167. package/v2Containers/WebPush/Create/preview/PreviewControls.js +305 -0
  168. package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +23 -0
  169. package/v2Containers/WebPush/Create/preview/WebPushPreview.js +150 -0
  170. package/v2Containers/WebPush/Create/preview/assets/Light.svg +53 -0
  171. package/v2Containers/WebPush/Create/preview/assets/Top.svg +5 -0
  172. package/v2Containers/WebPush/Create/preview/assets/android-arrow-down.svg +9 -0
  173. package/v2Containers/WebPush/Create/preview/assets/android-arrow-up.svg +9 -0
  174. package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
  175. package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
  176. package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +106 -0
  177. package/v2Containers/WebPush/Create/preview/assets/iOS.svg +26 -0
  178. package/v2Containers/WebPush/Create/preview/assets/macos-arrow-down-icon.svg +9 -0
  179. package/v2Containers/WebPush/Create/preview/assets/macos-triple-dot-icon.svg +9 -0
  180. package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +18 -0
  181. package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +29 -0
  182. package/v2Containers/WebPush/Create/preview/assets/windows-close-icon.svg +9 -0
  183. package/v2Containers/WebPush/Create/preview/assets/windows-triple-dot-icon.svg +9 -0
  184. package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +47 -0
  185. package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +141 -0
  186. package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +45 -0
  187. package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +68 -0
  188. package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +61 -0
  189. package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +99 -0
  190. package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +733 -0
  191. package/v2Containers/WebPush/Create/preview/components/tests/WindowsChromeExpanded.test.js +571 -0
  192. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +81 -0
  193. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/WindowsChromeExpanded.test.js.snap +81 -0
  194. package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +50 -0
  195. package/v2Containers/WebPush/Create/preview/constants.js +637 -0
  196. package/v2Containers/WebPush/Create/preview/notification-container.scss +79 -0
  197. package/v2Containers/WebPush/Create/preview/preview.scss +351 -0
  198. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +370 -0
  199. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +12 -0
  200. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +12 -0
  201. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +12 -0
  202. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +47 -0
  203. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +11 -0
  204. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +11 -0
  205. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +11 -0
  206. package/v2Containers/WebPush/Create/preview/styles/_base.scss +207 -0
  207. package/v2Containers/WebPush/Create/preview/styles/_ios.scss +153 -0
  208. package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +107 -0
  209. package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +101 -0
  210. package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +229 -0
  211. package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +909 -0
  212. package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +1081 -0
  213. package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +723 -0
  214. package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +943 -0
  215. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +131 -0
  216. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +112 -0
  217. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +144 -0
  218. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +129 -0
  219. package/v2Containers/WebPush/Create/utils/payloadBuilder.js +94 -0
  220. package/v2Containers/WebPush/Create/utils/payloadBuilder.test.js +390 -0
  221. package/v2Containers/WebPush/Create/utils/previewUtils.js +89 -0
  222. package/v2Containers/WebPush/Create/utils/urlValidation.js +115 -0
  223. package/v2Containers/WebPush/Create/utils/urlValidation.test.js +449 -0
  224. package/v2Containers/WebPush/Create/utils/validation.js +75 -0
  225. package/v2Containers/WebPush/Create/utils/validation.test.js +283 -0
  226. package/v2Containers/WebPush/actions.js +60 -0
  227. package/v2Containers/WebPush/constants.js +128 -0
  228. package/v2Containers/WebPush/index.js +2 -0
  229. package/v2Containers/WebPush/reducer.js +104 -0
  230. package/v2Containers/WebPush/sagas.js +119 -0
  231. package/v2Containers/WebPush/selectors.js +65 -0
  232. package/v2Containers/WebPush/tests/reducer.test.js +863 -0
  233. package/v2Containers/WebPush/tests/sagas.test.js +566 -0
  234. package/v2Containers/WebPush/tests/selectors.test.js +843 -0
  235. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +528 -431
  236. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +0 -254
  237. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +0 -362
  238. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +0 -51
  239. package/v2Containers/BeePopupEditor/constants.js +0 -10
  240. package/v2Containers/BeePopupEditor/index.js +0 -193
  241. package/v2Containers/BeePopupEditor/tests/index.test.js +0 -627
  242. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +0 -1046
  243. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +0 -376
  244. package/v2Containers/InApp/__tests__/sagas.test.js +0 -363
  245. package/v2Containers/InApp/tests/selectors.test.js +0 -612
  246. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +0 -162
  247. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +0 -267
  248. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +0 -9
  249. package/v2Containers/InAppWrapper/constants.js +0 -16
  250. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +0 -473
  251. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +0 -198
  252. package/v2Containers/InAppWrapper/index.js +0 -148
  253. package/v2Containers/InAppWrapper/messages.js +0 -49
  254. package/v2Containers/InappAdvance/index.js +0 -1099
  255. package/v2Containers/InappAdvance/index.scss +0 -10
  256. package/v2Containers/InappAdvance/tests/index.test.js +0 -448
@@ -7,72 +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.');
56
+ });
57
+
58
+ it('renders liquid errors separately', () => {
59
+ const mockValidation = {
60
+ getAllIssues: () => [
61
+ { message: 'Invalid liquid syntax', severity: 'error', source: 'liquid-validator', line: 3 },
62
+ { message: 'HTML error', severity: 'error', source: 'htmlhint', line: 10 }
63
+ ],
64
+ isClean: () => false,
65
+ isValidating: false
66
+ };
67
+
68
+ render(<ValidationErrorDisplay validation={mockValidation} />);
69
+
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.');
49
76
  });
50
77
 
51
78
  it('does not render when validation has no errors', () => {
52
79
  const mockValidation = {
53
80
  getAllIssues: () => [],
54
81
  isClean: () => true,
55
- isValidating: false,
82
+ isValidating: false
56
83
  };
57
84
 
58
- const { container } = render(
59
- <TestWrapper>
60
- <ValidationErrorDisplay validation={mockValidation} />
61
- </TestWrapper>
62
- );
85
+ const { container } = render(<ValidationErrorDisplay validation={mockValidation} />);
63
86
 
64
- expect(container.querySelector('.validation-error-display')).not.toBeInTheDocument();
87
+ expect(screen.queryByTestId('error-info-note')).not.toBeInTheDocument();
65
88
  expect(container.firstChild).toBeNull();
66
89
  });
67
90
 
68
91
  it('does not render when validation is null', () => {
69
- const { container } = render(
70
- <TestWrapper>
71
- <ValidationErrorDisplay validation={null} />
72
- </TestWrapper>
73
- );
92
+ const { container } = render(<ValidationErrorDisplay validation={null} />);
74
93
 
75
- expect(container.querySelector('.validation-error-display')).not.toBeInTheDocument();
94
+ expect(screen.queryByTestId('error-info-note')).not.toBeInTheDocument();
76
95
  expect(container.firstChild).toBeNull();
77
96
  });
78
97
 
@@ -80,16 +99,12 @@ describe('ValidationErrorDisplay', () => {
80
99
  const mockValidation = {
81
100
  getAllIssues: () => [],
82
101
  isClean: () => false,
83
- isValidating: true,
102
+ isValidating: true
84
103
  };
85
104
 
86
- const { container } = render(
87
- <TestWrapper>
88
- <ValidationErrorDisplay validation={mockValidation} />
89
- </TestWrapper>
90
- );
105
+ const { container } = render(<ValidationErrorDisplay validation={mockValidation} />);
91
106
 
92
- expect(container.querySelector('.validation-error-display')).not.toBeInTheDocument();
107
+ expect(screen.queryByTestId('error-info-note')).not.toBeInTheDocument();
93
108
  expect(container.firstChild).toBeNull();
94
109
  });
95
110
 
@@ -97,13 +112,11 @@ describe('ValidationErrorDisplay', () => {
97
112
  const mockValidation = {
98
113
  getAllIssues: () => [{ message: 'Error', severity: 'error' }],
99
114
  isClean: () => false,
100
- isValidating: false,
115
+ isValidating: false
101
116
  };
102
117
 
103
118
  const { container } = render(
104
- <TestWrapper>
105
- <ValidationErrorDisplay validation={mockValidation} className="custom-class" />
106
- </TestWrapper>
119
+ <ValidationErrorDisplay validation={mockValidation} className="custom-class" />
107
120
  );
108
121
 
109
122
  const wrapper = container.querySelector('.validation-error-display');
@@ -114,37 +127,26 @@ describe('ValidationErrorDisplay', () => {
114
127
  const mockValidation = {
115
128
  getAllIssues: () => [{ message: 'Mobile error', severity: 'error' }],
116
129
  isClean: () => false,
117
- isValidating: false,
130
+ isValidating: false
118
131
  };
119
132
 
120
- const { container } = render(
121
- <TestWrapper>
122
- <ValidationErrorDisplay validation={mockValidation} variant="inapp" />
123
- </TestWrapper>
124
- );
133
+ render(<ValidationErrorDisplay validation={mockValidation} variant="inapp" />);
125
134
 
126
- expect(container.querySelector('.validation-error-display')).toBeInTheDocument();
127
- expect(screen.getByText('Mobile error')).toBeInTheDocument();
135
+ expect(screen.getByTestId('error-info-note')).toBeInTheDocument();
136
+ expect(screen.getByTestId('error-message')).toHaveTextContent('Mobile error');
128
137
  });
129
138
 
130
139
  it('includes rule information in error messages when available', () => {
131
140
  const mockValidation = {
132
141
  getAllIssues: () => [
133
- {
134
- message: 'Alt attribute required', severity: 'error', rule: 'alt-require', line: 5,
135
- },
142
+ { message: 'Alt attribute required', severity: 'error', rule: 'alt-require', line: 5 }
136
143
  ],
137
144
  isClean: () => false,
138
- isValidating: false,
145
+ isValidating: false
139
146
  };
140
147
 
141
- render(
142
- <TestWrapper>
143
- <ValidationErrorDisplay validation={mockValidation} />
144
- </TestWrapper>
145
- );
148
+ render(<ValidationErrorDisplay validation={mockValidation} />);
146
149
 
147
- // Check that the error message is rendered (rule info may be in tooltip or separate element)
148
- expect(screen.getByText('Alt attribute required')).toBeInTheDocument();
150
+ expect(screen.getByTestId('error-message')).toHaveTextContent('Alt attribute required Line 5. alt-require');
149
151
  });
150
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';