@griddo/ax 1.67.10 → 1.68.2

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 (121) hide show
  1. package/config/jest/componentsMock.js +1528 -27
  2. package/package.json +2 -2
  3. package/src/__mocks__/reducers/app.tsx +10 -0
  4. package/src/__mocks__/reducers/sites.tsx +10 -0
  5. package/src/__tests__/{AnalyticsField.test.tsx → components/Fields/AnalyticsField/AnalyticsField.test.tsx} +5 -5
  6. package/src/__tests__/{PageAnalytics.test.tsx → components/Fields/AnalyticsField/PageAnalytics/PageAnalytics.test.tsx} +2 -2
  7. package/src/__tests__/{StructuredDataAnalytics.test.tsx → components/Fields/AnalyticsField/StructuredDataAnalytics/StructuredDataAnalytics.test.tsx} +2 -2
  8. package/src/__tests__/{ArrayFieldGroup.test.tsx → components/Fields/ArrayFieldGroup/ArrayFieldGroup.test.tsx} +2 -2
  9. package/src/__tests__/{AsyncCheckGroup.test.tsx → components/Fields/AsyncCheckGroup/AsyncCheckGroup.test.tsx} +2 -2
  10. package/src/__tests__/{AsyncSelect.test.tsx → components/Fields/AsyncSelect/AsyncSelect.test.tsx} +2 -2
  11. package/src/__tests__/{CheckField.test.tsx → components/Fields/CheckField/CheckField.test.tsx} +2 -2
  12. package/src/__tests__/{CheckGroup.test.tsx → components/Fields/CheckGroup/CheckGroup.test.tsx} +2 -2
  13. package/src/__tests__/components/Fields/ColorPicker/ColorPicker.test.tsx +195 -0
  14. package/src/__tests__/components/Fields/ComponentArray/ComponentArray.test.tsx +184 -0
  15. package/src/__tests__/components/Fields/ComponentArray/MixableComponentArray/MixableComponentArray.test.tsx +315 -0
  16. package/src/__tests__/components/Fields/ComponentArray/MixableComponentArray/PasteModuleButton/PasteModuleButton.test.tsx +95 -0
  17. package/src/__tests__/components/Fields/ComponentArray/SameComponentArray/SameComponentArray.test.tsx +225 -0
  18. package/src/__tests__/{FieldGroup.test.tsx → components/Fields/FieldGroup/FieldGroup.test.tsx} +2 -2
  19. package/src/__tests__/components/Fields/FieldsDivider/FieldsDivider.test.tsx +24 -0
  20. package/src/__tests__/components/Fields/FileField/FileField.test.tsx +135 -0
  21. package/src/__tests__/{HeadingField.test.tsx → components/Fields/HeadingField/HeadingField.test.tsx} +2 -2
  22. package/src/__tests__/components/Fields/HiddenField/HiddenField.test.tsx +76 -0
  23. package/src/__tests__/components/Fields/MultiCheckSelect/MultiCheckSelect.test.tsx +70 -0
  24. package/src/__tests__/components/Fields/NoteField/NoteField.test.tsx +67 -0
  25. package/src/__tests__/components/Fields/NumberField/NumberField.test.tsx +109 -0
  26. package/src/__tests__/components/Fields/RadioField/RadioField.test.tsx +106 -0
  27. package/src/__tests__/components/Fields/RichText/RichText.test.tsx +52 -0
  28. package/src/__tests__/components/Fields/Select/Select.test.tsx +75 -0
  29. package/src/__tests__/components/Fields/SliderField/SliderField.test.tsx +82 -0
  30. package/src/__tests__/{TagField.test.tsx → components/Fields/TagField/TagField.test.tsx} +2 -2
  31. package/src/__tests__/{TextArea.test.tsx → components/Fields/TextArea/TextArea.test.tsx} +2 -2
  32. package/src/__tests__/{TextField.test.tsx → components/Fields/TextField/TextField.test.tsx} +2 -2
  33. package/src/__tests__/components/Fields/ToggleField/ToggleField.test.tsx +100 -0
  34. package/src/__tests__/{UniqueCheck.test.tsx → components/Fields/UniqueCheck/UniqueCheck.test.tsx} +2 -2
  35. package/src/__tests__/components/Fields/UrlField/UrlField.test.tsx +446 -0
  36. package/src/__tests__/components/Fields/UrlField/mockedAxios.ts +2214 -0
  37. package/src/__tests__/components/Fields/VisualUniqueSelection/ImageSelection/ImageSelection.test.tsx +99 -0
  38. package/src/__tests__/components/Fields/VisualUniqueSelection/ScrollableSelection/ScrollableSelection.test.tsx +176 -0
  39. package/src/__tests__/components/Fields/VisualUniqueSelection/VisualUniqueSelection.test.tsx +78 -0
  40. package/src/components/ActionMenu/index.tsx +1 -0
  41. package/src/components/Browser/index.tsx +39 -47
  42. package/src/components/Browser/style.tsx +15 -15
  43. package/src/components/BrowserContent/index.tsx +78 -0
  44. package/src/components/ConfigPanel/Form/ConnectedField/NavConnectedField/index.tsx +3 -5
  45. package/src/components/ConfigPanel/Form/ConnectedField/PageConnectedField/index.tsx +2 -6
  46. package/src/components/ConfigPanel/Header/index.tsx +28 -11
  47. package/src/components/ConfigPanel/index.tsx +2 -2
  48. package/src/components/ErrorCenter/index.tsx +11 -4
  49. package/src/components/Fields/ArrayFieldGroup/index.tsx +4 -2
  50. package/src/components/Fields/ArrayFieldGroup/style.tsx +7 -0
  51. package/src/components/Fields/AsyncCheckGroup/index.tsx +1 -1
  52. package/src/components/Fields/CheckField/index.tsx +1 -1
  53. package/src/components/Fields/ColorPicker/Picker/index.tsx +9 -3
  54. package/src/components/Fields/ColorPicker/index.tsx +4 -9
  55. package/src/components/Fields/ComponentArray/MixableComponentArray/PasteModuleButton/index.tsx +2 -1
  56. package/src/components/Fields/ComponentArray/MixableComponentArray/index.tsx +27 -22
  57. package/src/components/Fields/ComponentArray/MixableComponentArray/style.tsx +3 -38
  58. package/src/components/Fields/ComponentArray/SameComponentArray/index.tsx +3 -2
  59. package/src/components/Fields/ComponentArray/SameComponentArray/style.tsx +1 -28
  60. package/src/components/Fields/ComponentArray/helpers.tsx +1 -1
  61. package/src/components/Fields/ComponentContainer/index.tsx +3 -1
  62. package/src/components/Fields/FileField/FileDragAndDrop/index.tsx +1 -1
  63. package/src/components/Fields/FileField/FileDragAndDrop/style.tsx +2 -3
  64. package/src/components/Fields/FileField/index.tsx +6 -6
  65. package/src/components/Fields/HiddenField/index.tsx +3 -3
  66. package/src/components/Fields/MultiCheckSelect/index.tsx +8 -27
  67. package/src/components/Fields/NoteField/index.tsx +3 -3
  68. package/src/components/Fields/NumberField/index.tsx +6 -3
  69. package/src/components/Fields/RadioField/index.tsx +10 -2
  70. package/src/components/Fields/ReferenceField/index.tsx +8 -1
  71. package/src/components/Fields/ReferenceField/style.tsx +5 -0
  72. package/src/components/Fields/RichText/index.tsx +1 -1
  73. package/src/components/Fields/SliderField/index.tsx +11 -7
  74. package/src/components/Fields/ToggleField/index.tsx +12 -3
  75. package/src/components/Fields/UrlField/PageFinder/SelectionListItem/index.tsx +1 -1
  76. package/src/components/Fields/UrlField/index.tsx +6 -4
  77. package/src/components/Fields/UrlField/style.tsx +4 -2
  78. package/src/components/Fields/VisualOption/index.tsx +10 -2
  79. package/src/components/Fields/VisualUniqueSelection/ImageSelection/index.tsx +2 -2
  80. package/src/components/Fields/VisualUniqueSelection/ScrollableSelection/index.tsx +4 -3
  81. package/src/components/Fields/VisualUniqueSelection/ScrollableSelection/style.tsx +1 -1
  82. package/src/components/Fields/VisualUniqueSelection/index.tsx +3 -3
  83. package/src/components/FieldsBehavior/index.tsx +4 -4
  84. package/src/components/FieldsBehavior/style.tsx +5 -12
  85. package/src/components/FloatingMenu/index.tsx +8 -4
  86. package/src/components/Loader/index.tsx +12 -8
  87. package/src/components/MainWrapper/AppBar/index.tsx +1 -0
  88. package/src/components/MainWrapper/index.tsx +1 -0
  89. package/src/components/Toast/index.tsx +1 -1
  90. package/src/components/Tooltip/index.tsx +1 -1
  91. package/src/components/index.tsx +2 -0
  92. package/src/containers/App/actions.tsx +3 -7
  93. package/src/containers/PageEditor/actions.tsx +36 -5
  94. package/src/forms/editor.tsx +35 -1
  95. package/src/forms/fields.tsx +6 -2
  96. package/src/forms/index.tsx +2 -0
  97. package/src/forms/validators.tsx +29 -8
  98. package/src/guards/error/index.tsx +1 -1
  99. package/src/helpers/containerEvaluations.tsx +32 -4
  100. package/src/helpers/index.tsx +2 -0
  101. package/src/helpers/structuredData.tsx +2 -2
  102. package/src/hooks/forms.tsx +1 -28
  103. package/src/hooks/index.tsx +1 -2
  104. package/src/modules/FramePreview/index.tsx +70 -36
  105. package/src/modules/FramePreview/style.tsx +3 -0
  106. package/src/modules/GlobalEditor/PageBrowser/index.tsx +2 -7
  107. package/src/modules/GlobalEditor/index.tsx +8 -6
  108. package/src/modules/GlobalEditor/style.tsx +1 -1
  109. package/src/modules/Navigation/Defaults/DefaultsEditor/Editor/DefaultsBrowser/index.tsx +0 -4
  110. package/src/modules/Navigation/Defaults/DefaultsEditor/index.tsx +3 -2
  111. package/src/modules/PageEditor/PageBrowser/index.tsx +1 -4
  112. package/src/modules/PageEditor/index.tsx +6 -6
  113. package/src/modules/PublicPreview/index.tsx +17 -34
  114. package/src/modules/PublicPreview/style.tsx +0 -2
  115. package/src/modules/Settings/ContentTypes/DataPacks/Config/Form/TemplateConfig/TemplateEditor/Editor/TemplateBrowser/index.tsx +0 -4
  116. package/src/modules/Sites/index.tsx +1 -1
  117. package/src/modules/StructuredData/Form/ConnectedField/index.tsx +1 -1
  118. package/src/modules/StructuredData/Form/index.tsx +3 -1
  119. package/src/modules/StructuredData/StructuredDataList/index.tsx +1 -0
  120. package/src/schemas/pages/GlobalPage.tsx +1 -0
  121. package/src/types/index.tsx +1 -0
@@ -0,0 +1,99 @@
1
+ import * as React from "react";
2
+ import ImageSelection from "@ax/components/Fields/VisualUniqueSelection/ImageSelection";
3
+ import { ThemeProvider } from "styled-components";
4
+ import { parseTheme } from "@griddo/core";
5
+ import globalTheme from "@ax/themes/theme.json";
6
+ import "@testing-library/jest-dom";
7
+ import { render, screen, cleanup, fireEvent } from "@testing-library/react";
8
+ import { mock } from "jest-mock-extended";
9
+
10
+ afterEach(cleanup);
11
+
12
+ const defaultProps = mock<IImageSelectionProps>();
13
+ defaultProps.theme = "default-theme";
14
+ defaultProps.columns = 2;
15
+ defaultProps.value = "value";
16
+ defaultProps.title = "title";
17
+ const onChangeMock = defaultProps.onChange as jest.MockedFunction<(value: string) => void>;
18
+ defaultProps.name = "name";
19
+ defaultProps.objKey = "element";
20
+
21
+ describe("VisualUniqueSelection component rendering", () => {
22
+ test("should render the component", () => {
23
+ defaultProps.options = [
24
+ {
25
+ theme: "default-theme",
26
+ options: [
27
+ {
28
+ value: "default",
29
+ img: "https://res.cloudinary.com/thesaurus-cms/image/upload/griddo-components/themes/primaryStyle",
30
+ },
31
+ {
32
+ value: "defaultAlt",
33
+ img: "https://res.cloudinary.com/thesaurus-cms/image/upload/griddo-components/themes/secondaryStyle",
34
+ },
35
+ ],
36
+ },
37
+ {
38
+ theme: "griddo-alt-theme",
39
+ options: [
40
+ {
41
+ value: "default",
42
+ img: "https://res.cloudinary.com/thesaurus-cms/image/upload/griddo-components/themes/primaryStyle",
43
+ },
44
+ {
45
+ value: "defaultAlt",
46
+ img: "https://res.cloudinary.com/thesaurus-cms/image/upload/griddo-components/themes/secondaryStyle",
47
+ },
48
+ ],
49
+ },
50
+ ];
51
+ render(
52
+ <ThemeProvider theme={parseTheme(globalTheme)}>
53
+ <ImageSelection {...defaultProps} />
54
+ </ThemeProvider>
55
+ );
56
+
57
+ expect(screen.getByTestId("imageSelectionComponent")).toBeTruthy();
58
+ });
59
+ });
60
+
61
+ describe("VisualUniqueSelection component events", () => {
62
+ test("should handle change", () => {
63
+ defaultProps.options = [
64
+ {
65
+ value: "primary",
66
+ img: "https://res.cloudinary.com/thesaurus-cms/image/upload/griddo-components/themes/primaryStyle",
67
+ },
68
+ {
69
+ value: "secondary",
70
+ img: "https://res.cloudinary.com/thesaurus-cms/image/upload/griddo-components/themes/secondaryStyle",
71
+ },
72
+ {
73
+ value: "link",
74
+ img: "https://res.cloudinary.com/thesaurus-cms/image/upload/griddo-components/themes/linkStyle",
75
+ },
76
+ ];
77
+ render(
78
+ <ThemeProvider theme={parseTheme(globalTheme)}>
79
+ <ImageSelection {...defaultProps} />
80
+ </ThemeProvider>
81
+ );
82
+
83
+ const radioButtons = screen.getAllByTestId<HTMLInputElement>("radioButtons");
84
+ fireEvent.click(radioButtons[0]);
85
+ expect(onChangeMock).toHaveBeenCalled();
86
+ });
87
+ });
88
+
89
+ interface IImageSelectionProps {
90
+ value: string;
91
+ title: string;
92
+ onChange: (value: string) => void;
93
+ options: any;
94
+ name: string;
95
+ objKey: string;
96
+ columns: number;
97
+ disabled?: boolean;
98
+ theme: string;
99
+ }
@@ -0,0 +1,176 @@
1
+ import * as React from "react";
2
+ import ScrollableSelection from "@ax/components/Fields/VisualUniqueSelection/ScrollableSelection";
3
+ import { ThemeProvider } from "styled-components";
4
+ import { parseTheme } from "@griddo/core";
5
+ import globalTheme from "@ax/themes/theme.json";
6
+ import "@testing-library/jest-dom";
7
+ import { render, screen, cleanup, fireEvent } from "@testing-library/react";
8
+ import { mock } from "jest-mock-extended";
9
+
10
+ afterEach(cleanup);
11
+
12
+ const defaultProps = mock<IScrollableSelectionProps>();
13
+ defaultProps.theme = "default-theme";
14
+ defaultProps.options = [
15
+ {
16
+ value: "primary",
17
+ img: "https://res.cloudinary.com/thesaurus-cms/image/upload/griddo-components/themes/primaryStyle",
18
+ },
19
+ {
20
+ value: "secondary",
21
+ img: "https://res.cloudinary.com/thesaurus-cms/image/upload/griddo-components/themes/secondaryStyle",
22
+ },
23
+ {
24
+ value: "link",
25
+ img: "https://res.cloudinary.com/thesaurus-cms/image/upload/griddo-components/themes/linkStyle",
26
+ },
27
+ ];
28
+ defaultProps.elementUniqueSelection = true;
29
+ defaultProps.columns = 2;
30
+ defaultProps.value = "value";
31
+ defaultProps.title = "title";
32
+ const onChangeMock = defaultProps.onChange as jest.MockedFunction<(value: string) => void>;
33
+ defaultProps.name = "name";
34
+ defaultProps.objKey = "element";
35
+ defaultProps.actions = {
36
+ replaceElementsInCollectionAction: jest.fn(),
37
+ };
38
+ defaultProps.selectedContent = {
39
+ component: "BasicContent",
40
+ title: {
41
+ content: "Title",
42
+ tag: "h1",
43
+ },
44
+ anchorID: "basic",
45
+ verticalSpacing: "medium",
46
+ layout: "L001",
47
+ theme: "default",
48
+ moduleOrder: null,
49
+ subtitle:
50
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi dignissim ut nibh eget porttitor. Nunc eleifend mollis arcu.",
51
+ content:
52
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi dignissim ut nibh eget porttitor. Nunc eleifend mollis arcu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi dignissim ut nibh eget porttitor. Nunc eleifend mollis arcu.",
53
+ primaryLink: {
54
+ component: "Link",
55
+ text: "Link 1",
56
+ style: "primary",
57
+ url: {
58
+ href: null,
59
+ linkTo: 3622,
60
+ linkToURL: "//cx.dev.griddo.io/pre-griddo/fer-site/#papapapa",
61
+ title: "New Page",
62
+ anchor: "papapapa",
63
+ },
64
+ editorID: 5,
65
+ parentEditorID: 4,
66
+ },
67
+ secondaryLink: {
68
+ component: "Link",
69
+ editorID: 6,
70
+ parentEditorID: 4,
71
+ },
72
+ additionalContent: {
73
+ image: {
74
+ component: "LinkableImage",
75
+ editorID: 7,
76
+ parentEditorID: 4,
77
+ title: "",
78
+ alt: "",
79
+ veil: 0,
80
+ file: {
81
+ id: 857,
82
+ name: ".png",
83
+ title: "",
84
+ description: "",
85
+ alt: "",
86
+ tags: [],
87
+ url: "https://images.dev.griddo.io/screenshot-2022-04-13-at-164915",
88
+ thumb: "https://images.dev.griddo.io/w/215/h/161/screenshot-2022-04-13-at-164915",
89
+ publicId: "thesaurus-dev/Screenshot_2022-04-13_at_16.49.15_927293bf-d163-402f-b216-4dc8656ea8c1",
90
+ damId: "screenshot-2022-04-13-at-164915",
91
+ published: "2022-04-18T08:52:48.334Z",
92
+ size: 1123589,
93
+ width: 1444,
94
+ height: 640,
95
+ orientation: "L",
96
+ site: "global",
97
+ },
98
+ },
99
+ video: {
100
+ component: "Video",
101
+ editorID: 8,
102
+ parentEditorID: 4,
103
+ },
104
+ },
105
+ editorID: 4,
106
+ parentEditorID: 3,
107
+ };
108
+
109
+ describe("ScrollableSelection component rendering", () => {
110
+ test("should render the component", () => {
111
+ render(
112
+ <ThemeProvider theme={parseTheme(globalTheme)}>
113
+ <ScrollableSelection {...defaultProps} />
114
+ </ThemeProvider>
115
+ );
116
+
117
+ expect(screen.getByTestId("scrollableSelectionComponent")).toBeTruthy();
118
+ });
119
+ });
120
+
121
+ describe("ScrollableSelection component events", () => {
122
+ test("should handle next and previous Page", () => {
123
+ render(
124
+ <ThemeProvider theme={parseTheme(globalTheme)}>
125
+ <ScrollableSelection {...defaultProps} />
126
+ </ThemeProvider>
127
+ );
128
+
129
+ const dots = screen.getAllByTestId("dotSelected");
130
+ expect((dots[0] as HTMLOptionElement).selected).toBeTruthy();
131
+ expect(screen.getByTestId("scrollableSelectionComponent")).toBeTruthy();
132
+ const nextButton = screen.getAllByTestId("iconActionComponent")[1];
133
+ const prevButton = screen.getAllByTestId("iconActionComponent")[0];
134
+ fireEvent.click(nextButton);
135
+ expect((dots[0] as HTMLOptionElement).selected).toBeFalsy();
136
+ expect((dots[1] as HTMLOptionElement).selected).toBeTruthy();
137
+ fireEvent.click(nextButton);
138
+ expect((dots[0] as HTMLOptionElement).selected).toBeTruthy();
139
+ expect((dots[1] as HTMLOptionElement).selected).toBeFalsy();
140
+ fireEvent.click(nextButton);
141
+ expect((dots[0] as HTMLOptionElement).selected).toBeFalsy();
142
+ expect((dots[1] as HTMLOptionElement).selected).toBeTruthy();
143
+ fireEvent.click(prevButton);
144
+ fireEvent.click(prevButton);
145
+ expect((dots[0] as HTMLOptionElement).selected).toBeTruthy();
146
+ expect((dots[1] as HTMLOptionElement).selected).toBeFalsy();
147
+ });
148
+
149
+ test("should handle selection", () => {
150
+ render(
151
+ <ThemeProvider theme={parseTheme(globalTheme)}>
152
+ <ScrollableSelection {...defaultProps} />
153
+ </ThemeProvider>
154
+ );
155
+
156
+ const radioButtons = screen.getAllByTestId<HTMLInputElement>("radioButtons");
157
+ fireEvent.click(radioButtons[0]);
158
+ expect(onChangeMock).toHaveBeenCalled();
159
+ });
160
+ });
161
+
162
+ interface IScrollableSelectionProps {
163
+ value: string;
164
+ title: string;
165
+ onChange: (value: string) => void;
166
+ options: any[];
167
+ name: string;
168
+ objKey: string;
169
+ columns: number;
170
+ disabled?: boolean;
171
+ actions: any;
172
+ selectedContent: any;
173
+ reference?: string;
174
+ theme: string;
175
+ elementUniqueSelection: boolean;
176
+ }
@@ -0,0 +1,78 @@
1
+ import * as React from "react";
2
+ import VisualUniqueSelection from "@ax/components/Fields/VisualUniqueSelection";
3
+ import { ThemeProvider } from "styled-components";
4
+ import { parseTheme } from "@griddo/core";
5
+ import globalTheme from "@ax/themes/theme.json";
6
+ import { render, screen, cleanup } from "@testing-library/react";
7
+ import { mock } from "jest-mock-extended";
8
+
9
+ afterEach(cleanup);
10
+
11
+ const defaultProps = mock<IImageSelectionProps & IScrollableSelectionProps>();
12
+ defaultProps.theme = "default-theme";
13
+ defaultProps.options = [
14
+ {
15
+ value: "primary",
16
+ img: "https://res.cloudinary.com/thesaurus-cms/image/upload/griddo-components/themes/primaryStyle",
17
+ },
18
+ {
19
+ value: "secondary",
20
+ img: "https://res.cloudinary.com/thesaurus-cms/image/upload/griddo-components/themes/secondaryStyle",
21
+ },
22
+ {
23
+ value: "link",
24
+ img: "https://res.cloudinary.com/thesaurus-cms/image/upload/griddo-components/themes/linkStyle",
25
+ },
26
+ ];
27
+
28
+ describe("VisualUniqueSelection component rendering", () => {
29
+ test("should render the component with ImageSelection", () => {
30
+ render(
31
+ <ThemeProvider theme={parseTheme(globalTheme)}>
32
+ <VisualUniqueSelection {...defaultProps} />
33
+ </ThemeProvider>
34
+ );
35
+ expect(screen.getByTestId("imageSelectionComponent")).toBeTruthy();
36
+ });
37
+
38
+ test("should render the component with ScrollableSelection", () => {
39
+ defaultProps.elementUniqueSelection = true;
40
+ defaultProps.columns = 2;
41
+
42
+ render(
43
+ <ThemeProvider theme={parseTheme(globalTheme)}>
44
+ <VisualUniqueSelection {...defaultProps} />
45
+ </ThemeProvider>
46
+ );
47
+
48
+ expect(screen.getByTestId("scrollableSelectionComponent")).toBeTruthy();
49
+ });
50
+ });
51
+
52
+ interface IImageSelectionProps {
53
+ value: string;
54
+ title: string;
55
+ onChange: (value: string) => void;
56
+ options: any;
57
+ name: string;
58
+ objKey: string;
59
+ columns: number;
60
+ disabled?: boolean;
61
+ theme: string;
62
+ elementUniqueSelection: boolean;
63
+ }
64
+
65
+ interface IScrollableSelectionProps {
66
+ value: string;
67
+ title: string;
68
+ onChange: (value: string) => void;
69
+ options: any[];
70
+ name: string;
71
+ objKey: string;
72
+ columns: number;
73
+ disabled?: boolean;
74
+ actions: any;
75
+ selectedContent: any;
76
+ reference?: string;
77
+ theme: string;
78
+ }
@@ -19,6 +19,7 @@ const ActionMenu = (props: IProps): JSX.Element => {
19
19
  onClick={item.action}
20
20
  disabled={item.disabled}
21
21
  className={item.color ? "original" : ""}
22
+ data-testid="action-menu-item"
22
23
  >
23
24
  <S.IconWrapper>
24
25
  <Icon name={item.icon} size="24" />
@@ -1,14 +1,12 @@
1
1
  import React, { useEffect, useState, useCallback } from "react";
2
2
 
3
- import * as components from "components";
4
- import { SiteProvider, builderSSR, ssrHelpers } from "components";
5
- import { Preview } from "@griddo/core";
6
3
  import { findByEditorID } from "@ax/forms";
7
4
  import { copyTextToClipboard } from "@ax/helpers";
8
5
  import { useToast } from "@ax/hooks";
9
6
  import Icon from "../Icon";
10
7
  import Tooltip from "../Tooltip";
11
8
  import Toast from "../Toast";
9
+ import BrowserContent from "../BrowserContent";
12
10
 
13
11
  import * as S from "./style";
14
12
 
@@ -27,30 +25,38 @@ const Browser = (props: IBrowserProps): JSX.Element => {
27
25
  siteID,
28
26
  isPreview,
29
27
  setSelectedContent,
28
+ showIframe,
30
29
  browserRef,
31
30
  } = props;
32
31
 
33
- const API_URL = process.env.REACT_APP_API_ENDPOINT;
34
- const PUBLIC_API_URL = process.env.REACT_APP_PUBLIC_API_ENDPOINT;
35
32
  const { id, entity } = content;
36
33
  const domain = window.location.origin;
37
- const urlPreview = `${domain}/editor/page-preview`;
34
+ const urlPreview = `${domain}/editor/page-preview?preview=${!!isPreview}&disabled=${!!disabled}`;
38
35
 
39
36
  const [resolution, setResolution] = useState("desktop");
40
37
  const { isVisible, toggleToast, setIsVisible } = useToast();
41
38
 
39
+ const onMessageReceivedFromIframe = useCallback(
40
+ (ev: MessageEvent<{ type: string; message: string }>) => {
41
+ if (typeof ev.data !== "object") return;
42
+ if (!ev.data.type) return;
43
+ if (ev.data.type !== "module-click") return;
44
+ if (!ev.data.message) return;
45
+ setSelectedContent(ev.data.message);
46
+ },
47
+ [setSelectedContent]
48
+ );
49
+
50
+ useEffect(() => {
51
+ window.addEventListener("message", onMessageReceivedFromIframe);
52
+ return () => window.removeEventListener("message", onMessageReceivedFromIframe);
53
+ }, [onMessageReceivedFromIframe]);
54
+
42
55
  useEffect(() => {
43
56
  localStorage.setItem("selectedID", "0");
44
57
  (window as any).browserRef = null;
45
58
  }, []);
46
59
 
47
- const useInstanceExternalAssets = useCallback(() => {
48
- if (builderSSR && builderSSR.onRenderBody) {
49
- builderSSR.onRenderBody(ssrHelpers);
50
- }
51
- }, []);
52
- useEffect(useInstanceExternalAssets, [useInstanceExternalAssets]);
53
-
54
60
  const selectEditorID = (
55
61
  selectedComponent: { editorID: number; component: any; type: string; parentEditorID: number },
56
62
  parentComponent: string | undefined | null,
@@ -59,14 +65,12 @@ const Browser = (props: IBrowserProps): JSX.Element => {
59
65
  const { element } = findByEditorID(content, selectedComponent.parentEditorID);
60
66
  element && e.stopPropagation();
61
67
 
62
- const parent = selectedComponent.component === "Page" ? null : "Page";
63
-
64
68
  const { editorID } = selectedComponent;
65
69
 
66
70
  const isNavigationModule = ["header", "footer"].includes(selectedComponent.type);
67
71
 
68
72
  if (!isPreview && (!disabled || isNavigationModule)) {
69
- setSelectedContent && setSelectedContent(editorID, parent);
73
+ setSelectedContent && setSelectedContent(editorID);
70
74
  }
71
75
  };
72
76
 
@@ -98,33 +102,6 @@ const Browser = (props: IBrowserProps): JSX.Element => {
98
102
  message: "URL Copied",
99
103
  };
100
104
 
101
- const Providers = (
102
- <SiteProvider
103
- cloudinaryCloudName={cloudinaryName}
104
- theme={theme}
105
- socials={socials}
106
- siteLangs={siteLangs}
107
- selectEditorID={selectEditorID}
108
- renderer="editor"
109
- apiUrl={API_URL}
110
- publicApiUrl={PUBLIC_API_URL}
111
- siteId={siteID}
112
- >
113
- <S.Wrapper ref={(ref: any) => ((window as any).browserRef = ref)}>
114
- <Preview
115
- isPage={isPage}
116
- apiUrl={API_URL}
117
- library={components}
118
- content={content}
119
- header={header}
120
- footer={footer}
121
- languageId={content.language}
122
- pageLanguages={content.pageLanguages}
123
- />
124
- </S.Wrapper>
125
- </SiteProvider>
126
- );
127
-
128
105
  return (
129
106
  <S.BrowserWrapper ref={browserRef}>
130
107
  <S.NavBar>
@@ -154,12 +131,27 @@ const Browser = (props: IBrowserProps): JSX.Element => {
154
131
  </S.NavActions>
155
132
  )}
156
133
  </S.NavBar>
157
- {isPreview ? (
134
+ {showIframe ? (
158
135
  <S.FrameWrapper>
159
- <iframe title="Preview" width={getWidth(resolution)} height="100%" src={urlPreview} allow-scripts />
136
+ <iframe title="Preview" width={getWidth(resolution)} height="100%" src={urlPreview} loading="lazy" />
160
137
  </S.FrameWrapper>
161
138
  ) : (
162
- <>{Providers}</>
139
+ <S.Wrapper ref={(ref: any) => ((window as any).browserRef = ref)}>
140
+ <BrowserContent
141
+ cloudinaryName={cloudinaryName}
142
+ theme={theme}
143
+ socials={socials}
144
+ siteLangs={siteLangs}
145
+ selectEditorID={selectEditorID}
146
+ siteID={siteID}
147
+ isPage={isPage}
148
+ content={content}
149
+ header={header}
150
+ footer={footer}
151
+ languageID={content.language}
152
+ pageLanguages={content.pageLanguages}
153
+ />
154
+ </S.Wrapper>
163
155
  )}
164
156
  {isVisible && <Toast {...toastProps} />}
165
157
  </S.BrowserWrapper>
@@ -170,7 +162,6 @@ interface IBrowserProps {
170
162
  content: any;
171
163
  header?: any;
172
164
  footer?: any;
173
- selectedEditorID: number;
174
165
  url: string;
175
166
  setSelectedContent?: any;
176
167
  isPage: boolean;
@@ -181,6 +172,7 @@ interface IBrowserProps {
181
172
  disabled?: boolean;
182
173
  siteID?: number;
183
174
  isPreview?: boolean;
175
+ showIframe?: boolean;
184
176
  browserRef?: any;
185
177
  }
186
178
 
@@ -6,20 +6,6 @@ const BrowserWrapper = styled.div`
6
6
  width: 100%;
7
7
  `;
8
8
 
9
- const Wrapper = styled.div`
10
- border-left: 1px solid ${(p) => p.theme.color.uiLine};
11
- border-right: 1px solid ${(p) => p.theme.color.uiLine};
12
- border-bottom: 1px solid ${(p) => p.theme.color.uiLine};
13
- overflow: auto;
14
- scroll-behavior: smooth;
15
- height: 100%;
16
- position: relative;
17
-
18
- .headroom {
19
- position: relative !important;
20
- }
21
- `;
22
-
23
9
  const NavBar = styled.div`
24
10
  display: flex;
25
11
  background-color: ${(p) => p.theme.color.uiBackground03};
@@ -66,4 +52,18 @@ const FrameWrapper = styled.div`
66
52
  height: 100%;
67
53
  `;
68
54
 
69
- export { BrowserWrapper, Wrapper, NavBar, NavUrl, NavActions, IconWrapper, FrameWrapper };
55
+ const Wrapper = styled.div`
56
+ border-left: 1px solid ${(p) => p.theme.color.uiLine};
57
+ border-right: 1px solid ${(p) => p.theme.color.uiLine};
58
+ border-bottom: 1px solid ${(p) => p.theme.color.uiLine};
59
+ overflow: auto;
60
+ scroll-behavior: smooth;
61
+ height: 100%;
62
+ position: relative;
63
+
64
+ .headroom {
65
+ position: relative !important;
66
+ }
67
+ `;
68
+
69
+ export { BrowserWrapper, NavBar, NavUrl, NavActions, IconWrapper, FrameWrapper, Wrapper };
@@ -0,0 +1,78 @@
1
+ import React, { useCallback, useEffect } from "react";
2
+ import * as components from "components";
3
+ import { builderSSR, ssrHelpers, SiteProvider } from "components";
4
+ import { Preview } from "@griddo/core";
5
+ import { ILanguage, ISocialState } from "@ax/types";
6
+
7
+ const BrowserContent = (props: IProps) => {
8
+ const {
9
+ content,
10
+ socials,
11
+ cloudinaryName,
12
+ siteLangs,
13
+ siteID,
14
+ theme,
15
+ isPage,
16
+ header,
17
+ footer,
18
+ languageID,
19
+ pageLanguages,
20
+ selectEditorID,
21
+ } = props;
22
+
23
+ const API_URL = process.env.REACT_APP_API_ENDPOINT;
24
+ const PUBLIC_API_URL = process.env.REACT_APP_PUBLIC_API_ENDPOINT;
25
+
26
+ const useInstanceExternalAssets = useCallback(() => {
27
+ if (builderSSR && builderSSR.onRenderBody) {
28
+ builderSSR.onRenderBody(ssrHelpers);
29
+ }
30
+ }, []);
31
+ useEffect(useInstanceExternalAssets, [useInstanceExternalAssets]);
32
+
33
+ return (
34
+ <SiteProvider
35
+ cloudinaryCloudName={cloudinaryName}
36
+ theme={theme}
37
+ socials={socials}
38
+ siteLangs={siteLangs}
39
+ selectEditorID={selectEditorID}
40
+ renderer="editor"
41
+ apiUrl={API_URL}
42
+ publicApiUrl={PUBLIC_API_URL}
43
+ siteId={siteID}
44
+ >
45
+ <Preview
46
+ isPage={isPage}
47
+ apiUrl={API_URL}
48
+ library={components}
49
+ content={content}
50
+ header={header}
51
+ footer={footer}
52
+ languageId={languageID}
53
+ pageLanguages={pageLanguages}
54
+ />
55
+ </SiteProvider>
56
+ );
57
+ };
58
+
59
+ interface IProps {
60
+ content: any;
61
+ socials: ISocialState;
62
+ cloudinaryName: string | null;
63
+ siteLangs: ILanguage[];
64
+ siteID?: number;
65
+ theme: string;
66
+ isPage: boolean;
67
+ header?: any;
68
+ footer?: any;
69
+ languageID: number;
70
+ pageLanguages: ILanguage[];
71
+ selectEditorID?(
72
+ selectedComponent: { editorID: number; component: any; type: string; parentEditorID: number },
73
+ parentComponent: string | undefined | null,
74
+ e: React.SyntheticEvent
75
+ ): void;
76
+ }
77
+
78
+ export default BrowserContent;
@@ -1,11 +1,11 @@
1
1
  import React from "react";
2
2
  import { connect } from "react-redux";
3
- import { useEqualValue } from "@ax/hooks";
4
3
 
5
4
  import { FieldContainer } from "@ax/components";
6
5
  import { navigationActions } from "@ax/containers/Navigation";
7
6
  import { getInnerFields } from "@ax/forms";
8
7
  import { IRootState } from "@ax/types";
8
+ import { areEqual } from "@ax/helpers";
9
9
 
10
10
  const NavConnectedField = (props: any) => {
11
11
  const {
@@ -89,10 +89,8 @@ const mapStateToProps = (state: IRootState) => ({
89
89
  menus: state.menu.savedMenus,
90
90
  });
91
91
 
92
- // eslint-disable-next-line react-hooks/rules-of-hooks
93
- const memoizedNavConnectedField = useEqualValue(NavConnectedField);
94
-
95
92
  const mapDispatchToProps = {
96
93
  updateEditorContent: navigationActions.updateEditorContent,
97
94
  };
98
- export default connect(mapStateToProps, mapDispatchToProps)(memoizedNavConnectedField);
95
+
96
+ export default connect(mapStateToProps, mapDispatchToProps)(React.memo(NavConnectedField, areEqual));
@@ -1,8 +1,7 @@
1
1
  import React, { useEffect } from "react";
2
2
  import { connect } from "react-redux";
3
3
 
4
- import { getTemplate, isModuleDisabled, slugify } from "@ax/helpers";
5
- import { useEqualValue } from "@ax/hooks";
4
+ import { getTemplate, isModuleDisabled, slugify, areEqual } from "@ax/helpers";
6
5
  import { IRootState } from "@ax/types";
7
6
 
8
7
  import TemplateManager from "./TemplateManager";
@@ -216,7 +215,4 @@ const mapDispatchToProps = {
216
215
  deleteError: pageEditorActions.deleteError,
217
216
  };
218
217
 
219
- // eslint-disable-next-line react-hooks/rules-of-hooks
220
- const memoizedPageConnectedField = useEqualValue(PageConnectedField);
221
-
222
- export default connect(mapStateToProps, mapDispatchToProps)(memoizedPageConnectedField);
218
+ export default connect(mapStateToProps, mapDispatchToProps)(React.memo(PageConnectedField, areEqual));