@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
@@ -1,402 +1,21 @@
1
- import React, { useState, useMemo } from 'react';
2
- import PropTypes from 'prop-types';
3
- import CapRow from '@capillarytech/cap-ui-library/CapRow';
4
- import CapButton from '@capillarytech/cap-ui-library/CapButton';
5
- import CapIcon from '@capillarytech/cap-ui-library/CapIcon';
6
- import CapLabel from '@capillarytech/cap-ui-library/CapLabel';
7
- import CapTab from '@capillarytech/cap-ui-library/CapTab';
8
- import CapTooltip from '@capillarytech/cap-ui-library/CapTooltip';
1
+ import React from "react";
2
+ import PropTypes from "prop-types";
3
+ import CapRow from "@capillarytech/cap-ui-library/CapRow";
4
+ import CapButton from "@capillarytech/cap-ui-library/CapButton";
5
+ import CapIcon from "@capillarytech/cap-ui-library/CapIcon";
6
+ import CapLabel from "@capillarytech/cap-ui-library/CapLabel";
7
+ import CapList from "@capillarytech/cap-ui-library/CapList";
9
8
  import {
10
9
  FormattedMessage,
10
+ FormattedNumber,
11
11
  injectIntl,
12
- } from 'react-intl';
13
- import './style.scss';
14
- import messages from './messages';
15
- import { processErrors } from './utils';
16
- import ErrorTypeRenderer from './ErrorTypeRenderer';
17
- import { ANDROID, GENERIC, IOS } from '../../v2Containers/CreativesContainer/constants';
12
+ } from "react-intl";
13
+ import "./style.scss";
14
+ import messages from "./messages";
15
+ import { processErrors } from "./utils";
16
+ import ErrorTypeRenderer from "./ErrorTypeRenderer";
17
+ import { ANDROID, GENERIC, IOS } from "../../v2Containers/CreativesContainer/constants";
18
18
 
19
- // Label issue patterns - syntax errors related to tags
20
- const LABEL_ISSUE_PATTERNS = [
21
- 'tag must be paired',
22
- 'open tag match failed',
23
- 'closed tag match failed',
24
- 'unclosed',
25
- 'missing required',
26
- 'tag-pair',
27
- 'attr-value-not-empty',
28
- 'attr-no-duplication',
29
- 'tag-self-close',
30
- 'spec-char-escape',
31
- '</html>',
32
- '<html>',
33
- '</div>',
34
- '<div>',
35
- '{{',
36
- '}}',
37
- ];
38
-
39
- /**
40
- * Categorize error messages into HTML, Label, and Liquid categories
41
- */
42
- const categorizeErrorMessages = (standardErrors, liquidErrors) => {
43
- const htmlIssues = [];
44
- const labelIssues = [];
45
- const liquidIssues = [];
46
-
47
- // Process standard errors
48
- (standardErrors || []).forEach((error, index) => {
49
- const errorLower = (error || '').toLowerCase();
50
-
51
- // Check if it's a Label (tag syntax) issue
52
- const isLabelIssue = LABEL_ISSUE_PATTERNS.some(
53
- (pattern) => errorLower.includes(pattern.toLowerCase()),
54
- );
55
-
56
- if (isLabelIssue) {
57
- labelIssues.push({
58
- message: error,
59
- severity: 'error',
60
- index,
61
- source: 'label',
62
- });
63
- } else {
64
- htmlIssues.push({
65
- message: error,
66
- severity: 'error',
67
- index,
68
- source: 'html',
69
- });
70
- }
71
- });
72
-
73
- // Process liquid errors
74
- (liquidErrors || []).forEach((error, index) => {
75
- liquidIssues.push({
76
- message: error,
77
- severity: 'error',
78
- index,
79
- source: 'liquid',
80
- });
81
- });
82
-
83
- return { htmlIssues, labelIssues, liquidIssues };
84
- };
85
-
86
- /**
87
- * Get icon based on severity
88
- */
89
- const getSeverityIcon = (severity) => {
90
- if (severity === 'warning') {
91
- return <CapIcon type="alert-warning" className="error-info-note__icon error-info-note__icon--warning" />;
92
- }
93
- return <CapIcon type="warning-circle" className="error-info-note__icon error-info-note__icon--error" />;
94
- };
95
-
96
- /**
97
- * Tab content component
98
- */
99
- const TabContent = ({ issues, onErrorClick, intl }) => {
100
- if (!issues || issues.length === 0) {
101
- return null;
102
- }
103
-
104
- const handleNavigateClick = (issue, e) => {
105
- e.stopPropagation();
106
- if (onErrorClick) {
107
- onErrorClick(issue);
108
- }
109
- };
110
-
111
- return (
112
- <div className="error-info-note__content">
113
- {issues.map((issue, index) => {
114
- const { severity, message } = issue;
115
- const key = `${message}-${index}`;
116
-
117
- // Parse line and char from message if present (format: "... Line X, Char Y.")
118
- const lineMatch = message.match(/Line\s+(\d+)/i);
119
- const charMatch = message.match(/Char\s+(\d+)/i);
120
- const line = lineMatch ? parseInt(lineMatch[1], 10) : null;
121
- const char = charMatch ? parseInt(charMatch[1], 10) : null;
122
-
123
- // Extract rule from message (format: "... • rule-name")
124
- const ruleMatch = message.match(/•\s*([a-z-]+)$/i);
125
- const rule = ruleMatch ? ruleMatch[1] : null;
126
-
127
- // Clean message (remove line/char and rule parts for display)
128
- let displayMessage = message;
129
- if (lineMatch) {
130
- displayMessage = displayMessage.replace(/Line\s+\d+,?\s*/gi, '');
131
- }
132
- if (charMatch) {
133
- displayMessage = displayMessage.replace(/Char\s+\d+\.?\s*/gi, '');
134
- }
135
- if (ruleMatch) {
136
- displayMessage = displayMessage.replace(/•\s*[a-z-]+$/i, '');
137
- }
138
- displayMessage = displayMessage.trim();
139
-
140
- return (
141
- <div
142
- key={key}
143
- className={`error-info-note__item error-info-note__item--${severity || 'error'}`}
144
- >
145
- <div className="error-info-note__item-icon">
146
- {getSeverityIcon(severity)}
147
- </div>
148
- <div className="error-info-note__item-content">
149
- <span className="error-info-note__item-message">
150
- {displayMessage}
151
- </span>
152
- {line && (
153
- <span className="error-info-note__item-location">
154
- Line
155
- {' '}
156
- {line}
157
- {char ? `, Char ${char}` : ''}
158
- .
159
- </span>
160
- )}
161
- {rule && (
162
- <span className="error-info-note__item-rule">
163
-
164
- {' '}
165
- {rule}
166
- </span>
167
- )}
168
- </div>
169
- {onErrorClick && (
170
- <CapTooltip title={intl?.formatMessage ? intl.formatMessage({ id: 'errorInfoNote.navigateToError', defaultMessage: 'Go to error location' }) : 'Go to error location'}>
171
- <button
172
- type="button"
173
- className="error-info-note__item-navigate"
174
- onClick={(e) => handleNavigateClick({ ...issue, line, column: char }, e)}
175
- aria-label="Go to error location"
176
- >
177
- <CapIcon type="redirection" />
178
- </button>
179
- </CapTooltip>
180
- )}
181
- </div>
182
- );
183
- })}
184
- </div>
185
- );
186
- };
187
-
188
- TabContent.propTypes = {
189
- issues: PropTypes.array,
190
- onErrorClick: PropTypes.func,
191
- intl: PropTypes.object,
192
- };
193
-
194
- TabContent.defaultProps = {
195
- issues: [],
196
- onErrorClick: null,
197
- intl: null,
198
- };
199
-
200
- /**
201
- * ErrorInfoNote Component with Tabbed Interface
202
- */
203
- export const ErrorInfoNote = (props) => {
204
- const {
205
- errorMessages,
206
- onErrorClick,
207
- onClose,
208
- isLiquidEnabled = true,
209
- intl,
210
- } = props;
211
-
212
- const [isDismissed, setIsDismissed] = useState(false);
213
- const [activeKey, setActiveKey] = useState(null);
214
-
215
- const {
216
- LIQUID_ERROR_MSG: rawLiquidErrors = [],
217
- STANDARD_ERROR_MSG: rawStandardErrors = [],
218
- } = errorMessages || {};
219
-
220
- // Detect if platform-specific (ANDROID/IOS) or GENERIC
221
- const isObject = typeof rawStandardErrors === 'object' && rawStandardErrors !== null;
222
- const isNotArray = !Array.isArray(rawLiquidErrors);
223
- const hasPlatformKeys = isObject && isNotArray && [ANDROID, IOS, GENERIC].some((key) => key in rawLiquidErrors);
224
-
225
- // For platform-specific errors, use the legacy renderer
226
- if (hasPlatformKeys) {
227
- const androidErrors = {
228
- STANDARD: processErrors(rawStandardErrors, 'standard', ANDROID, messages),
229
- LIQUID: processErrors(rawLiquidErrors, 'liquid', ANDROID, messages),
230
- };
231
- const iosErrors = {
232
- STANDARD: processErrors(rawStandardErrors, 'standard', IOS, messages),
233
- LIQUID: processErrors(rawLiquidErrors, 'liquid', IOS, messages),
234
- };
235
- return (
236
- <ErrorTypeRenderer
237
- genericErrors={null}
238
- androidErrors={androidErrors}
239
- iosErrors={iosErrors}
240
- ErrorSectionComponent={ErrorSection}
241
- />
242
- );
243
- }
244
-
245
- // Categorize errors for tabbed interface
246
- const { htmlIssues, labelIssues, liquidIssues } = useMemo(() => categorizeErrorMessages(
247
- Array.isArray(rawStandardErrors) ? rawStandardErrors : [],
248
- Array.isArray(rawLiquidErrors) ? rawLiquidErrors : [],
249
- ), [rawStandardErrors, rawLiquidErrors]);
250
-
251
- // Calculate counts
252
- const htmlCount = htmlIssues.length;
253
- const labelCount = labelIssues.length;
254
- const liquidCount = liquidIssues.length;
255
- const totalCount = htmlCount + labelCount + (isLiquidEnabled ? liquidCount : 0);
256
-
257
- // Set default active key
258
- useMemo(() => {
259
- if (!activeKey) {
260
- if (htmlCount > 0) {
261
- setActiveKey('html');
262
- } else if (labelCount > 0) {
263
- setActiveKey('label');
264
- } else if (liquidCount > 0 && isLiquidEnabled) {
265
- setActiveKey('liquid');
266
- }
267
- }
268
- }, [htmlCount, labelCount, liquidCount, isLiquidEnabled, activeKey]);
269
-
270
- // Handle close
271
- const handleClose = () => {
272
- setIsDismissed(true);
273
- if (onClose) {
274
- onClose();
275
- }
276
- };
277
-
278
- // Handle liquid documentation click
279
- const handleLiquidDocClick = () => {
280
- window.open(
281
- 'https://docs.capillarytech.com/docs/liquid-language-in-messages',
282
- '_blank',
283
- );
284
- };
285
-
286
- // Don't render if no issues or dismissed
287
- if (totalCount === 0 || isDismissed) {
288
- return null;
289
- }
290
-
291
- // Build tab panes (CapTab uses 'panes' with 'tab' and 'content' properties)
292
- const tabPanes = [];
293
-
294
- if (htmlCount > 0) {
295
- tabPanes.push({
296
- key: 'html',
297
- tab: (
298
- <span className="error-info-note__tab-label">
299
- <FormattedMessage {...messages.htmlIssues} />
300
- <span className="error-info-note__tab-count">
301
- (
302
- {htmlCount}
303
- )
304
- </span>
305
- </span>
306
- ),
307
- content: (
308
- <TabContent
309
- issues={htmlIssues}
310
- onErrorClick={onErrorClick}
311
- intl={intl}
312
- />
313
- ),
314
- });
315
- }
316
-
317
- if (labelCount > 0) {
318
- tabPanes.push({
319
- key: 'label',
320
- tab: (
321
- <span className="error-info-note__tab-label">
322
- <FormattedMessage {...messages.labelIssues} />
323
- <span className="error-info-note__tab-count">
324
- (
325
- {labelCount}
326
- )
327
- </span>
328
- </span>
329
- ),
330
- content: (
331
- <TabContent
332
- issues={labelIssues}
333
- onErrorClick={onErrorClick}
334
- intl={intl}
335
- />
336
- ),
337
- });
338
- }
339
-
340
- if (isLiquidEnabled && liquidCount > 0) {
341
- tabPanes.push({
342
- key: 'liquid',
343
- tab: (
344
- <span className="error-info-note__tab-label">
345
- <FormattedMessage {...messages.liquidIssues} />
346
- <span className="error-info-note__tab-count">
347
- (
348
- {liquidCount}
349
- )
350
- </span>
351
- </span>
352
- ),
353
- content: (
354
- <TabContent
355
- issues={liquidIssues}
356
- onErrorClick={onErrorClick}
357
- intl={intl}
358
- />
359
- ),
360
- });
361
- }
362
-
363
- return (
364
- <div className="error-container error-container--tabs">
365
- <CapRow className="error-info-note__header">
366
- <CapTab
367
- activeKey={activeKey || (tabPanes[0]?.key)}
368
- onChange={setActiveKey}
369
- panes={tabPanes}
370
- className="error-info-note__tabs"
371
- />
372
- <CapRow className="error-info-note__actions">
373
- {activeKey === 'liquid' && isLiquidEnabled && (
374
- <CapButton
375
- type="flat"
376
- className="error-info-note__liquid-doc"
377
- onClick={handleLiquidDocClick}
378
- >
379
- <FormattedMessage {...messages.liquidDoc} />
380
- <CapIcon size="s" type="launch" />
381
- </CapButton>
382
- )}
383
- <CapTooltip title={intl?.formatMessage ? intl.formatMessage({ id: 'errorInfoNote.closePanel', defaultMessage: 'Close validation panel' }) : 'Close validation panel'}>
384
- <button
385
- type="button"
386
- className="error-info-note__close"
387
- onClick={handleClose}
388
- aria-label="Close validation panel"
389
- >
390
- <CapIcon type="close" />
391
- </button>
392
- </CapTooltip>
393
- </CapRow>
394
- </CapRow>
395
- </div>
396
- );
397
- };
398
-
399
- // Legacy ErrorSection component for platform-specific errors (backwards compatibility)
400
19
  const ErrorSection = ({
401
20
  title,
402
21
  errors,
@@ -407,7 +26,7 @@ const ErrorSection = ({
407
26
  {title && (
408
27
  <CapRow
409
28
  className={`error-header ${
410
- !liquidError ? 'standard-error-header' : ''
29
+ !liquidError ? "standard-error-header" : ""
411
30
  }`}
412
31
  >
413
32
  <>
@@ -419,7 +38,8 @@ const ErrorSection = ({
419
38
  <CapButton
420
39
  type="flat"
421
40
  className="add-btn"
422
- onClick={() => window.open('https://docs.capillarytech.com/docs/liquid-language-in-messages', '_blank')}
41
+ onClick={() => window.open("https://docs.capillarytech.com/docs/liquid-language-in-messages", "_blank")
42
+ }
423
43
  >
424
44
  <FormattedMessage {...messages.liquidDoc} />
425
45
  <CapIcon size="s" type="launch" />
@@ -433,15 +53,21 @@ const ErrorSection = ({
433
53
  <CapLabel type="label2">{platformLabel}</CapLabel>
434
54
  </CapRow>
435
55
  )}
436
- <div className="error-list-legacy">
437
- {(errors || []).map((error) => (
438
- <div key={`${error}`} className="error-list-legacy__item">
56
+ <CapList
57
+ className="error-list"
58
+ size="small"
59
+ dataSource={errors}
60
+ renderItem={(error, index) => (
61
+ <CapList.Item>
439
62
  <CapLabel type="label2" className="cap-list-v2-error-item">
63
+ <CapLabel type="label2">
64
+ <FormattedNumber value={index + 1} />.
65
+ </CapLabel>
440
66
  <CapLabel type="label2">{error}</CapLabel>
441
67
  </CapLabel>
442
- </div>
443
- ))}
444
- </div>
68
+ </CapList.Item>
69
+ )}
70
+ />
445
71
  </>
446
72
  );
447
73
 
@@ -458,15 +84,54 @@ ErrorSection.defaultProps = {
458
84
  platformLabel: null,
459
85
  };
460
86
 
87
+ export const ErrorInfoNote = (props) => {
88
+ const { errorMessages } = props;
89
+
90
+ const {
91
+ LIQUID_ERROR_MSG: rawLiquidErrors = [],
92
+ STANDARD_ERROR_MSG: rawStandardErrors = [],
93
+ } = errorMessages || {};
94
+
95
+ // Detect if platform-specific (ANDROID/IOS) or GENERIC
96
+ const isObject = typeof rawStandardErrors === 'object' && rawStandardErrors !== null;
97
+ const isNotArray = !Array.isArray(rawLiquidErrors);
98
+ const hasPlatformKeys = isObject && isNotArray && [ANDROID, IOS, GENERIC].some((key) => key in rawLiquidErrors);
99
+
100
+ if (hasPlatformKeys) {
101
+ // Platform-specific
102
+ const androidErrors = {
103
+ STANDARD: processErrors(rawStandardErrors, 'standard', ANDROID, messages),
104
+ LIQUID: processErrors(rawLiquidErrors, 'liquid', ANDROID, messages),
105
+ };
106
+ const iosErrors = {
107
+ STANDARD: processErrors(rawStandardErrors, 'standard', IOS, messages),
108
+ LIQUID: processErrors(rawLiquidErrors, 'liquid', IOS, messages),
109
+ };
110
+ return (
111
+ <ErrorTypeRenderer
112
+ genericErrors={null}
113
+ androidErrors={androidErrors}
114
+ iosErrors={iosErrors}
115
+ ErrorSectionComponent={ErrorSection}
116
+ />
117
+ );
118
+ }
119
+ // GENERIC (not platform-specific)
120
+ const genericStandard = processErrors(rawStandardErrors, 'standard', null, messages);
121
+ const genericLiquid = processErrors(rawLiquidErrors, 'liquid', null, messages);
122
+ return (
123
+ <ErrorTypeRenderer
124
+ genericErrors={{ standard: genericStandard, liquid: genericLiquid }}
125
+ ErrorSectionComponent={ErrorSection}
126
+ />
127
+ );
128
+ };
129
+
461
130
  ErrorInfoNote.defaultProps = {
462
131
  errorMessages: {
463
132
  LIQUID_ERROR_MSG: [],
464
133
  STANDARD_ERROR_MSG: [],
465
134
  },
466
- onErrorClick: null,
467
- onClose: null,
468
- isLiquidEnabled: true,
469
- intl: null,
470
135
  };
471
136
 
472
137
  ErrorInfoNote.propTypes = {
@@ -488,10 +153,5 @@ ErrorInfoNote.propTypes = {
488
153
  }),
489
154
  ]),
490
155
  }),
491
- onErrorClick: PropTypes.func,
492
- onClose: PropTypes.func,
493
- isLiquidEnabled: PropTypes.bool,
494
- intl: PropTypes.object,
495
156
  };
496
-
497
157
  export default injectIntl(ErrorInfoNote);
@@ -6,28 +6,6 @@
6
6
  import { defineMessages } from "react-intl";
7
7
  const scope = "creatives.componentsV2.ErrorInfoNote";
8
8
  export default defineMessages({
9
- // Tab labels for new tabbed interface
10
- htmlIssues: {
11
- id: `${scope}.htmlIssues`,
12
- defaultMessage: "HTML issues",
13
- },
14
- labelIssues: {
15
- id: `${scope}.labelIssues`,
16
- defaultMessage: "Label issues",
17
- },
18
- liquidIssues: {
19
- id: `${scope}.liquidIssues`,
20
- defaultMessage: "Liquid issues",
21
- },
22
- navigateToError: {
23
- id: `${scope}.navigateToError`,
24
- defaultMessage: "Go to error location",
25
- },
26
- closePanel: {
27
- id: `${scope}.closePanel`,
28
- defaultMessage: "Close validation panel",
29
- },
30
- // Legacy messages (kept for backwards compatibility)
31
9
  dynamicErrorHeader: {
32
10
  id: `${scope}.dynamicErrorHeader`,
33
11
  defaultMessage: