@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
@@ -0,0 +1,54 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import CapInput from '@capillarytech/cap-ui-library/CapInput';
4
+ import CapRow from '@capillarytech/cap-ui-library/CapRow';
5
+ import CapDivider from '@capillarytech/cap-ui-library/CapDivider';
6
+
7
+ /**
8
+ * TemplateNameSection component - Template name input (shown only in full mode)
9
+ */
10
+ export const TemplateNameSection = ({
11
+ isFullMode,
12
+ value,
13
+ error,
14
+ onChange,
15
+ formatMessage,
16
+ messages,
17
+ }) => {
18
+ if (!isFullMode) return null;
19
+
20
+ return (
21
+ <>
22
+ <CapRow className="input-group creative-name-container">
23
+ <CapInput
24
+ id="webpush-template-name-input"
25
+ className="webpush-template-name-input"
26
+ label={formatMessage(messages.creativeName)}
27
+ placeholder={formatMessage(messages.creativeNamePlaceholder)}
28
+ value={value}
29
+ onChange={onChange}
30
+ size="default"
31
+ status={error ? 'error' : ''}
32
+ help={error ? formatMessage(messages.emptyTemplateErrorMessage) : ''}
33
+ />
34
+ </CapRow>
35
+ <CapDivider />
36
+ </>
37
+ );
38
+ };
39
+
40
+ TemplateNameSection.propTypes = {
41
+ isFullMode: PropTypes.bool.isRequired,
42
+ value: PropTypes.string.isRequired,
43
+ error: PropTypes.bool,
44
+ onChange: PropTypes.func.isRequired,
45
+ formatMessage: PropTypes.func.isRequired,
46
+ messages: PropTypes.object.isRequired,
47
+ };
48
+
49
+ TemplateNameSection.defaultProps = {
50
+ error: false,
51
+ };
52
+
53
+ export default TemplateNameSection;
54
+
@@ -0,0 +1,143 @@
1
+ import React from 'react';
2
+ import { mountWithIntl, shallowWithIntl } from '../../../../helpers/intl-enzym-test-helpers';
3
+ import TemplateNameSection from './TemplateNameSection';
4
+ import CapInput from '@capillarytech/cap-ui-library/CapInput';
5
+ import CapRow from '@capillarytech/cap-ui-library/CapRow';
6
+ import CapDivider from '@capillarytech/cap-ui-library/CapDivider';
7
+
8
+ describe('TemplateNameSection', () => {
9
+ const mockFormatMessage = jest.fn((message) => message.defaultMessage || message);
10
+ const mockOnChange = jest.fn();
11
+
12
+ const mockMessages = {
13
+ creativeName: {
14
+ defaultMessage: 'Creative Name',
15
+ },
16
+ creativeNamePlaceholder: {
17
+ defaultMessage: 'Enter creative name',
18
+ },
19
+ emptyTemplateErrorMessage: {
20
+ defaultMessage: 'Template name is required',
21
+ },
22
+ };
23
+
24
+ const defaultProps = {
25
+ isFullMode: true,
26
+ value: 'Test Template',
27
+ error: false,
28
+ onChange: mockOnChange,
29
+ formatMessage: mockFormatMessage,
30
+ messages: mockMessages,
31
+ };
32
+
33
+ beforeEach(() => {
34
+ jest.clearAllMocks();
35
+ });
36
+
37
+ describe('Rendering in Full Mode', () => {
38
+ it('should render correctly with default props', () => {
39
+ const wrapper = shallowWithIntl(<TemplateNameSection {...defaultProps} />);
40
+ expect(wrapper).toMatchSnapshot();
41
+ });
42
+
43
+ it('should render when isFullMode is true', () => {
44
+ const wrapper = mountWithIntl(<TemplateNameSection {...defaultProps} isFullMode={true} />);
45
+ expect(wrapper.find(CapInput).exists()).toBe(true);
46
+ });
47
+
48
+ it('should render CapInput with correct props', () => {
49
+ const wrapper = mountWithIntl(<TemplateNameSection {...defaultProps} />);
50
+ const input = wrapper.find(CapInput);
51
+ expect(input.prop('id')).toBe('webpush-template-name-input');
52
+ expect(input.prop('className')).toBe('webpush-template-name-input');
53
+ expect(input.prop('value')).toBe('Test Template');
54
+ expect(input.prop('size')).toBe('default');
55
+ });
56
+
57
+ it('should render label correctly', () => {
58
+ const wrapper = mountWithIntl(<TemplateNameSection {...defaultProps} />);
59
+ const input = wrapper.find(CapInput);
60
+ expect(input.exists()).toBe(true);
61
+ expect(mockFormatMessage).toHaveBeenCalledWith(mockMessages.creativeName);
62
+ });
63
+
64
+ it('should render placeholder correctly', () => {
65
+ const wrapper = mountWithIntl(<TemplateNameSection {...defaultProps} />);
66
+ const input = wrapper.find(CapInput);
67
+ expect(input.exists()).toBe(true);
68
+ expect(mockFormatMessage).toHaveBeenCalledWith(mockMessages.creativeNamePlaceholder);
69
+ });
70
+
71
+ it('should render error status when error is true', () => {
72
+ const wrapper = mountWithIntl(<TemplateNameSection {...defaultProps} error={true} />);
73
+ const input = wrapper.find(CapInput);
74
+ expect(input.exists()).toBe(true);
75
+ expect(mockFormatMessage).toHaveBeenCalledWith(mockMessages.emptyTemplateErrorMessage);
76
+ });
77
+
78
+ it('should not render error status when error is false', () => {
79
+ const wrapper = mountWithIntl(<TemplateNameSection {...defaultProps} error={false} />);
80
+ const input = wrapper.find(CapInput);
81
+ expect(input.exists()).toBe(true);
82
+ });
83
+
84
+ it('should render Divider', () => {
85
+ const wrapper = mountWithIntl(<TemplateNameSection {...defaultProps} />);
86
+ expect(wrapper.find(CapDivider).exists()).toBe(true);
87
+ });
88
+
89
+ it('should call onChange when input value changes', () => {
90
+ const wrapper = mountWithIntl(<TemplateNameSection {...defaultProps} />);
91
+ const input = wrapper.find(CapInput);
92
+ const event = { target: { value: 'New Template Name' } };
93
+ input.prop('onChange')(event);
94
+ expect(mockOnChange).toHaveBeenCalledWith(event);
95
+ });
96
+ });
97
+
98
+ describe('Not Rendering in Non-Full Mode', () => {
99
+ it('should not render when isFullMode is false', () => {
100
+ const wrapper = mountWithIntl(<TemplateNameSection {...defaultProps} isFullMode={false} />);
101
+ expect(wrapper.find(CapInput).exists()).toBe(false);
102
+ expect(wrapper.find(CapDivider).exists()).toBe(false);
103
+ });
104
+
105
+ it('should return null when isFullMode is false', () => {
106
+ const wrapper = shallowWithIntl(<TemplateNameSection {...defaultProps} isFullMode={false} />);
107
+ expect(wrapper.type()).toBe(null);
108
+ });
109
+ });
110
+
111
+ describe('Error Handling', () => {
112
+ it('should show error message when error is true', () => {
113
+ const wrapper = mountWithIntl(<TemplateNameSection {...defaultProps} error={true} />);
114
+ const input = wrapper.find(CapInput);
115
+ expect(input.exists()).toBe(true);
116
+ expect(mockFormatMessage).toHaveBeenCalledWith(mockMessages.emptyTemplateErrorMessage);
117
+ });
118
+
119
+ it('should not show error message when error is false', () => {
120
+ const wrapper = mountWithIntl(<TemplateNameSection {...defaultProps} error={false} />);
121
+ const input = wrapper.find(CapInput);
122
+ expect(input.exists()).toBe(true);
123
+ });
124
+ });
125
+
126
+ describe('Default Props', () => {
127
+ it('should use default error value when not provided', () => {
128
+ const wrapper = mountWithIntl(
129
+ <TemplateNameSection
130
+ isFullMode={true}
131
+ value="Test"
132
+ onChange={mockOnChange}
133
+ formatMessage={mockFormatMessage}
134
+ messages={mockMessages}
135
+ />
136
+ );
137
+ const input = wrapper.find(CapInput);
138
+ expect(input.prop('status')).toBe('');
139
+ expect(input.prop('help')).toBe('');
140
+ });
141
+ });
142
+ });
143
+
@@ -0,0 +1,86 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`ButtonsLinksSection Rendering should render correctly with default props 1`] = `
4
+ <Fragment>
5
+ <CapRow
6
+ className="creatives-webpush-buttons-links"
7
+ >
8
+ <CapHeading
9
+ className="webpush-buttons-links"
10
+ type="h4"
11
+ >
12
+ <FormattedMessage
13
+ defaultMessage="Buttons and Links"
14
+ id="app.webpush.buttonsAndLinks"
15
+ values={Object {}}
16
+ />
17
+ </CapHeading>
18
+ <CapHeading
19
+ className="webpush-on-click-behaviour"
20
+ type="h5"
21
+ >
22
+ <FormattedMessage
23
+ defaultMessage="On-click Behaviour"
24
+ id="app.webpush.onClickBehaviour"
25
+ values={Object {}}
26
+ />
27
+ </CapHeading>
28
+ <CapRadioGroup
29
+ errorMessage=""
30
+ onChange={[MockFunction]}
31
+ options={
32
+ Array [
33
+ Object {
34
+ "label": "Open Site",
35
+ "value": "OPEN_SITE",
36
+ },
37
+ Object {
38
+ "label": "Redirect to URL",
39
+ "value": "REDIRECT_TO_URL",
40
+ },
41
+ ]
42
+ }
43
+ value="OPEN_SITE"
44
+ />
45
+ </CapRow>
46
+ <CapRow
47
+ className="creatives-webpush-buttons-section"
48
+ >
49
+ <CapHeading
50
+ className="webpush-buttons-section-heading"
51
+ type="h5"
52
+ >
53
+ <FormattedMessage
54
+ defaultMessage="Buttons"
55
+ id="app.webpush.buttons"
56
+ values={Object {}}
57
+ />
58
+
59
+ <span
60
+ className="optional-text"
61
+ >
62
+ <FormattedMessage
63
+ defaultMessage="(Optional)"
64
+ id="app.webpush.optional"
65
+ values={Object {}}
66
+ />
67
+ </span>
68
+ </CapHeading>
69
+ <MockButtonList
70
+ buttons={Array []}
71
+ disableSecondaryButton={false}
72
+ disabled={false}
73
+ inlineFormIndex={null}
74
+ isInlineFormVisible={false}
75
+ onAddPrimary={[MockFunction]}
76
+ onAddSecondary={[MockFunction]}
77
+ onDelete={[MockFunction]}
78
+ onEdit={[MockFunction]}
79
+ onReorder={[MockFunction]}
80
+ renderInlineForm={null}
81
+ showAddPrimary={false}
82
+ showAddSecondary={false}
83
+ />
84
+ </CapRow>
85
+ </Fragment>
86
+ `;
@@ -0,0 +1,16 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`FormActions Rendering should render correctly with default props 1`] = `
4
+ <Fragment>
5
+ <CapRow
6
+ className="creatives-webpush-actions"
7
+ >
8
+ <CapButton
9
+ disabled={false}
10
+ isAddBtn={false}
11
+ onClick={[MockFunction]}
12
+ type="primary"
13
+ />
14
+ </CapRow>
15
+ </Fragment>
16
+ `;
@@ -0,0 +1,41 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`MediaSection Rendering should render correctly with default props 1`] = `
4
+ <Fragment>
5
+ <CapRow
6
+ className="creatives-webpush-media"
7
+ >
8
+ <CapHeading
9
+ className="webpush-media-type"
10
+ type="h4"
11
+ >
12
+ <FormattedMessage
13
+ defaultMessage="Media Type"
14
+ id="app.webpush.mediaType"
15
+ values={Object {}}
16
+ />
17
+ </CapHeading>
18
+ <_Class
19
+ className="margin-t-4"
20
+ disabled={false}
21
+ labelPosition="top"
22
+ onChange={[MockFunction]}
23
+ options={
24
+ Array [
25
+ Object {
26
+ "label": "None",
27
+ "value": "NONE",
28
+ },
29
+ Object {
30
+ "label": "Image",
31
+ "value": "IMAGE",
32
+ },
33
+ ]
34
+ }
35
+ value="NONE"
36
+ width="100%"
37
+ />
38
+ </CapRow>
39
+ <CapDivider />
40
+ </Fragment>
41
+ `;
@@ -0,0 +1,54 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`MessageSection Rendering should render correctly with default props 1`] = `
4
+ <Fragment>
5
+ <CapRow
6
+ className="creatives-webpush-message"
7
+ >
8
+ <CapRow
9
+ className="tooltip-add-label-container webpush-message-taglist"
10
+ />
11
+ <CapHeading
12
+ className="webpush-message"
13
+ type="h4"
14
+ >
15
+ <FormattedMessage
16
+ defaultMessage="Message"
17
+ id="app.webpush.message"
18
+ values={Object {}}
19
+ />
20
+ </CapHeading>
21
+ <InjectIntl(Wrapper)
22
+ onChange={[MockFunction]}
23
+ textAreaRef={null}
24
+ value="Test Message"
25
+ >
26
+ <_Class
27
+ autosize={
28
+ Object {
29
+ "maxRows": 5,
30
+ "minRows": 3,
31
+ }
32
+ }
33
+ errorMessage=""
34
+ id="webpush-message-input"
35
+ isRequired={true}
36
+ labelPosition="top"
37
+ onChange={[MockFunction]}
38
+ setInputRef={[MockFunction]}
39
+ size="default"
40
+ value="Test Message"
41
+ />
42
+ </InjectIntl(Wrapper)>
43
+ <CapLabel
44
+ className="webpush-character-count"
45
+ type="label2"
46
+ >
47
+ <span />
48
+ </CapLabel>
49
+ </CapRow>
50
+ <CapDivider
51
+ className="webpush-message-divider"
52
+ />
53
+ </Fragment>
54
+ `;
@@ -0,0 +1,37 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`NotificationTitleSection Rendering should render correctly with default props 1`] = `
4
+ <CapRow
5
+ className="creatives-webpush-title"
6
+ >
7
+ <CapRow
8
+ className="tooltip-add-label-container webpush-title-taglist"
9
+ />
10
+ <CapHeading
11
+ className="webpush-title"
12
+ type="h4"
13
+ >
14
+ <FormattedMessage
15
+ defaultMessage="Notification Title"
16
+ id="app.webpush.notificationTitle"
17
+ values={Object {}}
18
+ />
19
+ </CapHeading>
20
+ <_Class
21
+ errorMessage=""
22
+ id="webpush-notification-title-input"
23
+ isRequired={true}
24
+ labelPosition="top"
25
+ maxLength={65}
26
+ onChange={[MockFunction]}
27
+ size="default"
28
+ value="Test Title"
29
+ />
30
+ <CapLabel
31
+ className="webpush-character-count"
32
+ type="label2"
33
+ >
34
+ <span />
35
+ </CapLabel>
36
+ </CapRow>
37
+ `;
@@ -0,0 +1,21 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`TemplateNameSection Rendering in Full Mode should render correctly with default props 1`] = `
4
+ <Fragment>
5
+ <CapRow
6
+ className="input-group creative-name-container"
7
+ >
8
+ <_Class
9
+ className="webpush-template-name-input"
10
+ help=""
11
+ id="webpush-template-name-input"
12
+ labelPosition="top"
13
+ onChange={[MockFunction]}
14
+ size="default"
15
+ status=""
16
+ value="Test Template"
17
+ />
18
+ </CapRow>
19
+ <CapDivider />
20
+ </Fragment>
21
+ `;
@@ -0,0 +1,246 @@
1
+ @import '~@capillarytech/cap-ui-library/styles/_variables';
2
+
3
+ // Button components styles for Web Push Create
4
+
5
+ .webpush-button-form {
6
+ border: 0.063rem solid $CAP_G07;
7
+ border-radius: $CAP_SPACE_08;
8
+ padding: $CAP_SPACE_20;
9
+ margin-bottom: $CAP_SPACE_16;
10
+
11
+ .button-form-row {
12
+ margin-bottom: $CAP_SPACE_16;
13
+
14
+ &:last-child {
15
+ margin-bottom: 0;
16
+ }
17
+ }
18
+
19
+ .button-form-heading {
20
+ margin-bottom: $CAP_SPACE_08;
21
+ font-weight: 600;
22
+ }
23
+
24
+ .button-form-field {
25
+ position: relative;
26
+ }
27
+
28
+ .button-character-count-suffix {
29
+ font-size: $FONT_SIZE_S;
30
+ color: $FONT_COLOR_03;
31
+ display: inline-flex;
32
+ align-items: center;
33
+ }
34
+
35
+ .button-form-actions {
36
+ display: flex;
37
+ gap: $CAP_SPACE_12;
38
+ margin-top: $CAP_SPACE_20;
39
+
40
+ .button-form-save {
41
+ background-color: map-get($CAP_PRIMARY, base);
42
+ border-color: map-get($CAP_PRIMARY, base);
43
+
44
+ &:hover:not(:disabled) {
45
+ background-color: map-get($CAP_PRIMARY, hover);
46
+ border-color: map-get($CAP_PRIMARY, hover);
47
+ }
48
+
49
+ &:disabled {
50
+ opacity: 0.5;
51
+ cursor: not-allowed;
52
+ }
53
+ }
54
+
55
+ .button-form-cancel {
56
+ background-color: $CAP_G12;
57
+ border-color: $CAP_COLOR_16;
58
+ color: $FONT_COLOR_01;
59
+
60
+ &:hover {
61
+ background-color: $CAP_COLOR_16;
62
+ border-color: $CAP_G06;
63
+ }
64
+ }
65
+ }
66
+ }
67
+
68
+ .webpush-button-list {
69
+ .button-list-add-button {
70
+ margin-top: $CAP_SPACE_12;
71
+ }
72
+ }
73
+
74
+ .button-add-controls {
75
+ display: flex;
76
+ gap: $CAP_SPACE_12;
77
+ flex-wrap: wrap;
78
+ margin-top: $CAP_SPACE_16;
79
+ }
80
+
81
+ // High specificity selectors to override Cap UI library styles
82
+ // Target both CapButton and Ant Design button classes that may be on the same element
83
+ .button-add-controls button.button-add-trigger,
84
+ .button-add-controls .button-add-trigger.cap-button,
85
+ .button-add-controls .button-add-trigger.ant-btn,
86
+ .button-add-controls .button-add-trigger.cap-button-flat,
87
+ .button-add-controls .button-add-trigger.ant-btn-flat,
88
+ .webpush-button-list button.button-add-trigger,
89
+ .webpush-button-list .button-add-trigger.cap-button,
90
+ .webpush-button-list .button-add-trigger.ant-btn,
91
+ .webpush-button-list .button-add-trigger.cap-button-flat,
92
+ .webpush-button-list .button-add-trigger.ant-btn-flat {
93
+ border: none;
94
+ background: transparent;
95
+ color: map-get($CAP_SECONDARY, base);
96
+ font-weight: $FONT_WEIGHT_MEDIUM;
97
+ border-radius: $CAP_SPACE_08;
98
+ padding: $CAP_SPACE_08 $CAP_SPACE_16;
99
+ display: inline-flex;
100
+ align-items: center;
101
+ gap: $CAP_SPACE_08;
102
+
103
+ &:hover:not(:disabled) {
104
+ background: $CAP_G09;
105
+ }
106
+
107
+ &:disabled {
108
+ color: $CAP_G05;
109
+ cursor: not-allowed;
110
+ background: transparent;
111
+ }
112
+ }
113
+
114
+ .button-inline-form {
115
+ margin-bottom: $CAP_SPACE_12;
116
+ }
117
+
118
+ .webpush-button-item {
119
+ border: 0.063rem solid $CAP_G07;
120
+ border-radius: 0.571rem;
121
+ padding: 0.7rem 0.857rem;
122
+ margin-bottom: 0.857rem;
123
+ background: $CAP_WHITE;
124
+ transition: all 0.2s ease;
125
+ cursor: move;
126
+
127
+ &:hover {
128
+ border-color: map-get($CAP_SECONDARY, base);
129
+ box-shadow: 0 0.142rem 0.571rem $CAP_BLACK_ALPHA08;
130
+ }
131
+
132
+ &[draggable="true"] {
133
+ cursor: move;
134
+ }
135
+
136
+ .button-item-content {
137
+ align-items: center;
138
+ }
139
+
140
+ .button-item-drag-handle {
141
+ display: flex;
142
+ align-items: center;
143
+ justify-content: center;
144
+ cursor: move;
145
+ padding-right: $CAP_SPACE_08;
146
+
147
+ .drag-icon {
148
+ font-size: 1rem;
149
+ color: $FONT_COLOR_01;
150
+ font-weight: 700;
151
+ transform: rotate(90deg);
152
+ display: inline-block;
153
+ }
154
+ }
155
+
156
+ .button-item-icon {
157
+ display: flex;
158
+ align-items: center;
159
+ justify-content: flex-start;
160
+ padding-right: $CAP_SPACE_08;
161
+
162
+ .link-icon {
163
+ font-size: $FONT_SIZE_L;
164
+ color: $FONT_COLOR_01;
165
+ }
166
+ }
167
+
168
+ .button-item-info {
169
+ display: flex;
170
+ align-items: center;
171
+ padding-right: $CAP_SPACE_12;
172
+
173
+ .button-item-text-row {
174
+ display: flex;
175
+ align-items: center;
176
+ width: 100%;
177
+
178
+ .button-item-text {
179
+ font-size: 0.813rem;
180
+ font-weight: $FONT_WEIGHT_MEDIUM;
181
+ color: $FONT_COLOR_01;
182
+ overflow: hidden;
183
+ text-overflow: ellipsis;
184
+ white-space: nowrap;
185
+ max-width: 100%;
186
+ }
187
+ }
188
+ }
189
+
190
+ .button-item-actions {
191
+ display: flex;
192
+ align-items: center;
193
+ justify-content: flex-end;
194
+ gap: $CAP_SPACE_12;
195
+
196
+ .button-item-url {
197
+ font-size: $FONT_SIZE_S;
198
+ color: $FONT_COLOR_03;
199
+ overflow: hidden;
200
+ text-overflow: ellipsis;
201
+ white-space: nowrap;
202
+ max-width: 12.857rem;
203
+ flex-shrink: 1;
204
+ margin-right: $CAP_SPACE_12;
205
+ }
206
+
207
+ .action-icons {
208
+ display: flex;
209
+ align-items: center;
210
+ gap: $CAP_SPACE_12;
211
+ flex-shrink: 0;
212
+
213
+ .action-icon {
214
+ font-size: $FONT_SIZE_L;
215
+ color: $FONT_COLOR_01;
216
+ cursor: pointer;
217
+ transition: color 0.2s ease;
218
+
219
+ &:hover {
220
+ color: map-get($CAP_SECONDARY, base);
221
+ }
222
+
223
+ &.delete-icon:hover {
224
+ color: $CAP_RED;
225
+ }
226
+ }
227
+ }
228
+ }
229
+
230
+ &.disabled {
231
+ opacity: 0.6;
232
+ cursor: not-allowed;
233
+ pointer-events: none;
234
+ }
235
+ }
236
+
237
+ .creatives-webpush-buttons-section {
238
+ margin-top: $CAP_SPACE_20;
239
+ margin-bottom: $CAP_SPACE_24;
240
+
241
+ .webpush-buttons-section-heading {
242
+ margin-bottom: $CAP_SPACE_16;
243
+ font-weight: 600;
244
+ }
245
+ }
246
+