@capillarytech/creatives-library 8.0.236-beta.0 → 8.0.237

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 (54) hide show
  1. package/config/app.js +1 -1
  2. package/constants/unified.js +0 -1
  3. package/package.json +1 -1
  4. package/services/api.js +0 -5
  5. package/utils/common.js +1 -6
  6. package/v2Components/CapTagList/index.js +1 -2
  7. package/v2Components/CapTagListWithInput/index.js +1 -5
  8. package/v2Components/CapTagListWithInput/messages.js +1 -1
  9. package/v2Components/ErrorInfoNote/style.scss +1 -1
  10. package/v2Components/HtmlEditor/HTMLEditor.js +14 -86
  11. package/v2Components/HtmlEditor/_htmlEditor.scss +4 -0
  12. package/v2Components/HtmlEditor/_index.lazy.scss +1 -1
  13. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +98 -11
  14. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +115 -174
  15. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  16. package/v2Components/HtmlEditor/hooks/useEditorContent.js +2 -5
  17. package/v2Components/TestAndPreviewSlidebox/index.js +25 -31
  18. package/v2Containers/CreativesContainer/SlideBoxContent.js +35 -83
  19. package/v2Containers/CreativesContainer/SlideBoxFooter.js +3 -9
  20. package/v2Containers/CreativesContainer/index.js +11 -83
  21. package/v2Containers/CreativesContainer/messages.js +0 -4
  22. package/v2Containers/Email/actions.js +0 -7
  23. package/v2Containers/Email/constants.js +1 -5
  24. package/v2Containers/Email/index.js +0 -13
  25. package/v2Containers/Email/messages.js +0 -32
  26. package/v2Containers/Email/reducer.js +1 -12
  27. package/v2Containers/Email/sagas.js +0 -17
  28. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +7 -193
  29. package/v2Containers/EmailWrapper/constants.js +0 -2
  30. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +67 -436
  31. package/v2Containers/EmailWrapper/index.js +23 -99
  32. package/v2Containers/EmailWrapper/messages.js +1 -61
  33. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +49 -49
  34. package/v2Containers/Rcs/index.js +5 -3
  35. package/v2Containers/Rcs/sagas.js +4 -4
  36. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +0 -16
  37. package/v2Containers/Rcs/tests/index.test.js +139 -2
  38. package/v2Containers/Rcs/tests/mockData.js +6 -3
  39. package/v2Containers/Rcs/tests/saga.test.js +88 -0
  40. package/v2Containers/TagList/index.js +0 -2
  41. package/v2Containers/Templates/actions.js +2 -6
  42. package/v2Containers/Templates/constants.js +1 -0
  43. package/v2Containers/Templates/index.js +66 -39
  44. package/v2Containers/Templates/messages.js +8 -0
  45. package/v2Containers/Templates/reducer.js +3 -3
  46. package/v2Containers/Templates/sagas.js +1 -1
  47. package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +8 -8
  48. package/v2Containers/Templates/tests/actions.test.js +36 -1
  49. package/v2Containers/Templates/tests/reducer.test.js +9 -2
  50. package/v2Containers/Templates/tests/sagas.test.js +262 -9
  51. package/HOW_BEE_EDITOR_WORKS.md +0 -375
  52. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +0 -1034
  53. package/v2Containers/EmailWrapper/tests/EmailHTMLEditor.test.js +0 -177
  54. package/v2Containers/EmailWrapper/tests/EmailHTMLEditorValidation.test.js +0 -90
@@ -1,177 +0,0 @@
1
- import React from 'react';
2
- import { render, fireEvent, screen, waitFor } from '@testing-library/react';
3
- import '@testing-library/jest-dom';
4
- import { IntlProvider } from 'react-intl';
5
- import EmailHTMLEditor from '../components/EmailHTMLEditor';
6
-
7
- // Mock dependencies
8
- jest.mock('../messages', () => ({
9
- create: { id: 'create', defaultMessage: 'Create' },
10
- update: { id: 'update', defaultMessage: 'Update' },
11
- previewAndTest: { id: 'previewAndTest', defaultMessage: 'Preview and Test' },
12
- required: { id: 'required', defaultMessage: 'Required' },
13
- subject: { id: 'subject', defaultMessage: 'Subject' },
14
- emailContent: { id: 'emailContent', defaultMessage: 'Email Content' },
15
- enterEmailSubject: { id: 'enterEmailSubject', defaultMessage: 'Enter Email Subject' },
16
- }));
17
- jest.mock('../../../v2Components/HtmlEditor', () => ({
18
- __esModule: true,
19
- default: ({ onContentChange, initialContent, onSave }) => (
20
- <div data-testid="html-editor">
21
- <textarea
22
- data-testid="html-editor-textarea"
23
- value={initialContent}
24
- onChange={(e) => onContentChange(e.target.value)}
25
- />
26
- <button data-testid="html-editor-save" onClick={onSave}>Save in Editor</button>
27
- </div>
28
- ),
29
- }));
30
-
31
- jest.mock('../../../v2Components/CapTagListWithInput', () => ({
32
- __esModule: true,
33
- default: ({ inputOnChange, inputValue, inputErrorMessage, onTagSelect }) => (
34
- <div data-testid="cap-tag-list-input">
35
- <input
36
- data-testid="subject-input"
37
- value={inputValue}
38
- onChange={inputOnChange}
39
- />
40
- {inputErrorMessage && <div data-testid="subject-error">{inputErrorMessage}</div>}
41
- <button data-testid="add-tag-btn" onClick={() => onTagSelect('FirstName')}>Add Tag</button>
42
- </div>
43
- ),
44
- }));
45
-
46
- jest.mock('@capillarytech/cap-ui-library/CapNotification', () => ({
47
- __esModule: true,
48
- default: ({ message, description }) => (
49
- <div data-testid="cap-notification">
50
- {message}
51
- {description}
52
- </div>
53
- ),
54
- }));
55
-
56
- jest.mock('@capillarytech/cap-ui-library/CapSpin', () => ({
57
- __esModule: true,
58
- default: ({ children, spinning }) => (
59
- <div data-testid="cap-spin" data-spinning={spinning}>
60
- {children}
61
- </div>
62
- ),
63
- }));
64
-
65
- jest.mock('@capillarytech/cap-ui-library/CapButton', () => ({
66
- __esModule: true,
67
- default: ({ children, onClick, type }) => (
68
- <button data-testid={`cap-button-${type}`} onClick={onClick}>
69
- {children}
70
- </button>
71
- ),
72
- }));
73
-
74
- describe('EmailHTMLEditor', () => {
75
- const mockOnSave = jest.fn();
76
- const mockOnPreview = jest.fn();
77
- const mockOnSubjectChange = jest.fn();
78
- const mockOnContentChange = jest.fn();
79
-
80
- const defaultProps = {
81
- intl: { formatMessage: ({ id, defaultMessage }) => defaultMessage || id },
82
- onSave: mockOnSave,
83
- onPreview: mockOnPreview,
84
- onSubjectChange: mockOnSubjectChange,
85
- onContentChange: mockOnContentChange,
86
- loadingTags: false,
87
- fetchingLiquidTags: false,
88
- createTemplateInProgress: false,
89
- fetchingCmsData: false,
90
- };
91
-
92
- const renderComponent = (props = {}) => {
93
- return render(
94
- <IntlProvider locale="en" messages={{}}>
95
- <EmailHTMLEditor {...defaultProps} {...props} />
96
- </IntlProvider>
97
- );
98
- };
99
-
100
- beforeEach(() => {
101
- jest.clearAllMocks();
102
- });
103
-
104
- it('renders correctly', () => {
105
- renderComponent();
106
- expect(screen.getByTestId('html-editor')).toBeInTheDocument();
107
- expect(screen.getByTestId('cap-tag-list-input')).toBeInTheDocument();
108
- expect(screen.getByTestId('cap-button-primary')).toHaveTextContent('Create');
109
- expect(screen.getByTestId('cap-button-secondary')).toHaveTextContent('Preview and Test');
110
- });
111
-
112
- it('renders Update button in edit mode', () => {
113
- renderComponent({ isEditMode: true });
114
- expect(screen.getByTestId('cap-button-primary')).toHaveTextContent('Update');
115
- });
116
-
117
- it('updates subject state on change', () => {
118
- renderComponent();
119
- const input = screen.getByTestId('subject-input');
120
- fireEvent.change(input, { target: { value: 'New Subject' } });
121
- expect(mockOnSubjectChange).toHaveBeenCalledWith('New Subject');
122
- expect(input.value).toBe('New Subject');
123
- });
124
-
125
- it('updates content state on change', () => {
126
- renderComponent();
127
- const textarea = screen.getByTestId('html-editor-textarea');
128
- fireEvent.change(textarea, { target: { value: '<p>New Content</p>' } });
129
- expect(mockOnContentChange).toHaveBeenCalledWith('<p>New Content</p>');
130
- });
131
-
132
- it('validates empty subject on save', () => {
133
- renderComponent();
134
- const saveBtn = screen.getByTestId('cap-button-primary');
135
- fireEvent.click(saveBtn);
136
-
137
- expect(mockOnSave).not.toHaveBeenCalled();
138
- // Expect internal error state to be set (mocked CapTagListWithInput displays it)
139
- // Note: The mock implementation displays inputErrorMessage prop.
140
- // EmailHTMLEditor passes `subjectError || internalSubjectError`.
141
- // We need to wait for state update if necessary, but fireEvent is synchronous for state updates in tests usually.
142
- expect(screen.getByTestId('subject-error')).toBeInTheDocument();
143
- });
144
-
145
- it('calls onSave with valid data', () => {
146
- renderComponent({ initialSubject: 'Valid Subject', initialContent: '<p>Valid Content</p>' });
147
- const saveBtn = screen.getByTestId('cap-button-primary');
148
- fireEvent.click(saveBtn);
149
-
150
- expect(mockOnSave).toHaveBeenCalledWith({
151
- subject: 'Valid Subject',
152
- content: '<p>Valid Content</p>',
153
- });
154
- });
155
-
156
- it('calls onPreview with valid data', () => {
157
- renderComponent({ initialSubject: 'Subject', initialContent: 'Content' });
158
- const previewBtn = screen.getByTestId('cap-button-secondary');
159
- fireEvent.click(previewBtn);
160
-
161
- expect(mockOnPreview).toHaveBeenCalledWith({
162
- subject: 'Subject',
163
- content: 'Content',
164
- });
165
- });
166
-
167
- it('handles tag insertion into subject', () => {
168
- renderComponent({ initialSubject: 'Hello ' });
169
- const addTagBtn = screen.getByTestId('add-tag-btn');
170
- fireEvent.click(addTagBtn);
171
-
172
- // Mock implementation appends tag
173
- // The component logic handles insertion at cursor or append
174
- // Here we just check if onSubjectChange was called with appended tag
175
- expect(mockOnSubjectChange).toHaveBeenCalledWith('Hello {{FirstName}}');
176
- });
177
- });
@@ -1,90 +0,0 @@
1
- import React from 'react';
2
- import { render, waitFor } from '@testing-library/react';
3
- import { IntlProvider } from 'react-intl';
4
- import EmailHTMLEditor from '../components/EmailHTMLEditor';
5
-
6
- // Mock dependencies
7
- jest.mock('../../../v2Components/HtmlEditor', () => () => <div data-testid="html-editor" />);
8
- jest.mock('../../../v2Components/CapTagListWithInput', () => () => <div data-testid="cap-tag-list" />);
9
- jest.mock('@capillarytech/cap-ui-library/CapSpin', () => ({ children }) => <div>{children}</div>);
10
- jest.mock('@capillarytech/cap-ui-library/CapRow', () => ({ children }) => <div>{children}</div>);
11
- jest.mock('@capillarytech/cap-ui-library/CapColumn', () => ({ children }) => <div>{children}</div>);
12
- jest.mock('@capillarytech/cap-ui-library/CapNotification', () => () => <div />);
13
- jest.mock('../../../utils/commonUtils', () => ({
14
- validateLiquidTemplateContent: jest.fn(),
15
- hasLiquidSupportFeature: jest.fn(() => true),
16
- }));
17
- jest.mock('../../../utils/common', () => ({
18
- hasLiquidSupportFeature: jest.fn(() => true),
19
- }));
20
-
21
- describe('EmailHTMLEditor Validation', () => {
22
- const mockOnValidationFail = jest.fn();
23
- const mockGetFormdata = jest.fn();
24
- const defaultProps = {
25
- intl: { formatMessage: ({ defaultMessage }) => defaultMessage },
26
- onValidationFail: mockOnValidationFail,
27
- isGetFormData: false,
28
- getFormdata: mockGetFormdata,
29
- location: {},
30
- Email: {},
31
- emailActions: {},
32
- currentOrgDetails: {},
33
- };
34
-
35
- beforeEach(() => {
36
- jest.clearAllMocks();
37
- });
38
-
39
- it('calls onValidationFail when subject is empty and save is triggered', async () => {
40
- const { rerender } = render(
41
- <IntlProvider locale="en">
42
- <EmailHTMLEditor {...defaultProps} />
43
- </IntlProvider>
44
- );
45
-
46
- // Trigger save by setting isGetFormData to true
47
- rerender(
48
- <IntlProvider locale="en">
49
- <EmailHTMLEditor {...defaultProps} isGetFormData={true} />
50
- </IntlProvider>
51
- );
52
-
53
- await waitFor(() => {
54
- expect(mockOnValidationFail).toHaveBeenCalled();
55
- });
56
- });
57
-
58
- it('calls onValidationFail when liquid validation fails', async () => {
59
- const mockGetLiquidTags = jest.fn();
60
- // Mock validateLiquidTemplateContent to trigger onError
61
- const { validateLiquidTemplateContent } = require('../../../utils/commonUtils');
62
- validateLiquidTemplateContent.mockImplementation(({ onError }) => {
63
- onError({ standardErrors: ['Error'], liquidErrors: [] });
64
- });
65
-
66
- const { rerender } = render(
67
- <IntlProvider locale="en">
68
- <EmailHTMLEditor
69
- {...defaultProps}
70
- getLiquidTags={mockGetLiquidTags}
71
- />
72
- </IntlProvider>
73
- );
74
-
75
- // Trigger save
76
- rerender(
77
- <IntlProvider locale="en">
78
- <EmailHTMLEditor
79
- {...defaultProps}
80
- getLiquidTags={mockGetLiquidTags}
81
- isGetFormData={true}
82
- />
83
- </IntlProvider>
84
- );
85
-
86
- await waitFor(() => {
87
- expect(mockOnValidationFail).toHaveBeenCalled();
88
- });
89
- });
90
- });