@griddo/ax 1.69.7 → 1.71.0
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.
- package/config/jest/componentsMock.js +0 -26
- package/package.json +4 -3
- package/src/__tests__/components/ElementsTooltip/ElementsTooltip.test.tsx +97 -0
- package/src/__tests__/components/EmptyState/EmptyState.test.tsx +78 -0
- package/src/__tests__/components/Fields/AnalyticsField/PageAnalytics/PageAnalytics.test.tsx +0 -14
- package/src/__tests__/components/Fields/AnalyticsField/StructuredDataAnalytics/StructuredDataAnalytics.test.tsx +0 -15
- package/src/__tests__/components/Fields/ArrayFieldGroup/ArrayFieldGroup.test.tsx +6 -15
- package/src/__tests__/components/Fields/AsyncCheckGroup/AsyncCheckGroup.test.tsx +1 -13
- package/src/__tests__/components/Fields/AsyncSelect/AsyncSelect.test.tsx +1 -19
- package/src/__tests__/components/Fields/ColorPicker/ColorPicker.test.tsx +1 -10
- package/src/__tests__/components/Fields/ComponentArray/ComponentArray.test.tsx +1 -22
- package/src/__tests__/components/Fields/ComponentArray/MixableComponentArray/MixableComponentArray.test.tsx +4 -24
- package/src/__tests__/components/Fields/ComponentArray/MixableComponentArray/PasteModuleButton/PasteModuleButton.test.tsx +6 -12
- package/src/__tests__/components/Fields/ComponentArray/SameComponentArray/SameComponentArray.test.tsx +1 -20
- package/src/__tests__/components/Fields/ComponentContainer/ComponentContainer.test.tsx +559 -0
- package/src/__tests__/components/Fields/HiddenField/HiddenField.test.tsx +1 -7
- package/src/__tests__/components/Fields/ImageField/ImageField.test.tsx +471 -0
- package/src/__tests__/components/Fields/MultiCheckSelect/MultiCheckSelect.test.tsx +1 -15
- package/src/__tests__/components/Fields/NoteField/NoteField.test.tsx +1 -6
- package/src/__tests__/components/Fields/NumberField/NumberField.test.tsx +1 -14
- package/src/__tests__/components/Fields/RadioField/RadioField.test.tsx +1 -11
- package/src/__tests__/components/Fields/ReferenceField/ReferenceField.test.tsx +77 -13
- package/src/__tests__/components/Fields/RichText/RichText.test.tsx +1 -12
- package/src/__tests__/components/Fields/Select/Select.test.tsx +1 -21
- package/src/__tests__/components/Fields/SliderField/SliderField.test.tsx +1 -14
- package/src/__tests__/components/Fields/TagField/TagField.test.tsx +3 -3
- package/src/__tests__/components/Fields/TimeField/HourInput/HourInput.test.tsx +142 -0
- package/src/__tests__/components/Fields/TimeField/TimeField.test.tsx +100 -0
- package/src/__tests__/components/Fields/ToggleField/ToggleField.test.tsx +1 -9
- package/src/__tests__/components/Fields/Tooltip/Tooltip.test.tsx +151 -0
- package/src/__tests__/components/Fields/VisualUniqueSelection/ImageSelection/ImageSelection.test.tsx +1 -13
- package/src/__tests__/components/Fields/VisualUniqueSelection/ScrollableSelection/ScrollableSelection.test.tsx +3 -17
- package/src/__tests__/components/Fields/VisualUniqueSelection/VisualUniqueSelection.test.tsx +2 -28
- package/src/__tests__/components/TableList/TableList.test.tsx +119 -0
- package/src/__tests__/components/Tabs/Tabs.test.tsx +202 -0
- package/src/__tests__/components/Tag/Tag.test.tsx +138 -0
- package/src/__tests__/components/Toast/Toast.test.tsx +100 -0
- package/src/api/navigation.tsx +1 -1
- package/src/components/Browser/index.tsx +1 -1
- package/src/components/Button/index.tsx +3 -3
- package/src/components/ConfigPanel/NavigationForm/Field/index.tsx +14 -3
- package/src/components/ElementsTooltip/index.tsx +10 -9
- package/src/components/EmptyState/index.tsx +2 -2
- package/src/components/Fields/ArrayFieldGroup/index.tsx +1 -1
- package/src/components/Fields/AsyncCheckGroup/index.tsx +1 -1
- package/src/components/Fields/AsyncSelect/index.tsx +1 -1
- package/src/components/Fields/ComponentContainer/index.tsx +7 -6
- package/src/components/Fields/ComponentContainer/style.tsx +2 -2
- package/src/components/Fields/HiddenField/index.tsx +1 -1
- package/src/components/Fields/ImageField/index.tsx +10 -5
- package/src/components/Fields/MultiCheckSelect/index.tsx +3 -3
- package/src/components/Fields/NumberField/index.tsx +2 -1
- package/src/components/Fields/ReferenceField/ItemList/Item/index.tsx +5 -7
- package/src/components/Fields/ReferenceField/ItemList/Item/style.tsx +2 -2
- package/src/components/Fields/ReferenceField/ItemList/index.tsx +1 -1
- package/src/components/Fields/RichText/index.tsx +10 -6
- package/src/components/Fields/Select/index.tsx +1 -1
- package/src/components/Fields/SliderField/index.tsx +1 -1
- package/src/components/Fields/TimeField/HourInput/index.tsx +103 -0
- package/src/components/Fields/TimeField/HourInput/style.tsx +19 -0
- package/src/components/Fields/TimeField/HourInput/utils.tsx +35 -0
- package/src/components/Fields/TimeField/index.tsx +57 -0
- package/src/components/Fields/TimeField/style.tsx +37 -0
- package/src/components/Fields/index.tsx +2 -0
- package/src/components/FloatingMenu/index.tsx +1 -1
- package/src/components/Gallery/GalleryFilters/Type/index.tsx +50 -0
- package/src/components/Gallery/GalleryFilters/Type/style.tsx +39 -0
- package/src/components/Gallery/GalleryPanel/DetailPanel/index.tsx +2 -1
- package/src/components/Gallery/GalleryPanel/GalleryDragAndDrop/style.tsx +3 -3
- package/src/components/Gallery/hooks.tsx +10 -4
- package/src/components/Gallery/index.tsx +2 -0
- package/src/components/Icon/index.tsx +1 -1
- package/src/components/Loading/index.tsx +1 -1
- package/src/components/Pagination/index.tsx +1 -1
- package/src/components/SideModal/SideModalOption/index.tsx +4 -2
- package/src/components/SideModal/index.tsx +1 -1
- package/src/components/TableList/index.tsx +6 -6
- package/src/components/TableList/style.tsx +1 -1
- package/src/components/Tabs/index.tsx +19 -7
- package/src/components/Tag/index.tsx +6 -6
- package/src/components/Toast/index.tsx +4 -4
- package/src/components/Tooltip/index.tsx +5 -3
- package/src/components/index.tsx +2 -0
- package/src/containers/Navigation/Defaults/actions.tsx +10 -5
- package/src/containers/Navigation/Defaults/utils.tsx +13 -4
- package/src/containers/Sites/actions.tsx +7 -0
- package/src/containers/Sites/constants.tsx +1 -0
- package/src/containers/Sites/interfaces.tsx +6 -0
- package/src/containers/Sites/reducer.tsx +4 -0
- package/src/containers/StructuredData/actions.tsx +21 -8
- package/src/containers/StructuredData/constants.tsx +2 -0
- package/src/containers/StructuredData/interfaces.tsx +7 -1
- package/src/containers/StructuredData/reducer.tsx +5 -1
- package/src/helpers/fields.tsx +2 -2
- package/src/helpers/schemas.tsx +2 -2
- package/src/hooks/forms.tsx +2 -1
- package/src/modules/App/Routing/NavMenu/index.tsx +9 -1
- package/src/modules/Content/BulkHeader/TableHeader/index.tsx +1 -1
- package/src/modules/Content/hooks.tsx +19 -12
- package/src/modules/Content/index.tsx +23 -14
- package/src/modules/Navigation/Defaults/DefaultsEditor/Editor/DefaultsBrowser/index.tsx +3 -0
- package/src/modules/Navigation/Defaults/DefaultsEditor/Editor/index.tsx +3 -1
- package/src/modules/Navigation/Defaults/DefaultsEditor/index.tsx +16 -18
- package/src/modules/Navigation/Defaults/DefaultsEditor/utils.tsx +37 -0
- package/src/modules/StructuredData/Form/ConnectedField/index.tsx +3 -2
- package/src/modules/StructuredData/Form/index.tsx +22 -17
- package/src/modules/StructuredData/StructuredDataList/hooks.tsx +30 -20
- package/src/modules/StructuredData/StructuredDataList/index.tsx +24 -14
- package/src/types/index.tsx +8 -7
package/src/__tests__/components/Fields/VisualUniqueSelection/ImageSelection/ImageSelection.test.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import ImageSelection from "@ax/components/Fields/VisualUniqueSelection/ImageSelection";
|
|
2
|
+
import ImageSelection, { IImageSelectionProps } from "@ax/components/Fields/VisualUniqueSelection/ImageSelection";
|
|
3
3
|
import { ThemeProvider } from "styled-components";
|
|
4
4
|
import { parseTheme } from "@griddo/core";
|
|
5
5
|
import globalTheme from "@ax/themes/theme.json";
|
|
@@ -85,15 +85,3 @@ describe("VisualUniqueSelection component events", () => {
|
|
|
85
85
|
expect(onChangeMock).toHaveBeenCalled();
|
|
86
86
|
});
|
|
87
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
|
-
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import ScrollableSelection
|
|
2
|
+
import ScrollableSelection, {
|
|
3
|
+
IScrollableSelectionProps,
|
|
4
|
+
} from "@ax/components/Fields/VisualUniqueSelection/ScrollableSelection";
|
|
3
5
|
import { ThemeProvider } from "styled-components";
|
|
4
6
|
import { parseTheme } from "@griddo/core";
|
|
5
7
|
import globalTheme from "@ax/themes/theme.json";
|
|
@@ -158,19 +160,3 @@ describe("ScrollableSelection component events", () => {
|
|
|
158
160
|
expect(onChangeMock).toHaveBeenCalled();
|
|
159
161
|
});
|
|
160
162
|
});
|
|
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
|
-
}
|
package/src/__tests__/components/Fields/VisualUniqueSelection/VisualUniqueSelection.test.tsx
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import VisualUniqueSelection from "@ax/components/Fields/VisualUniqueSelection";
|
|
3
|
+
import { IImageSelectionProps } from "@ax/components/Fields/VisualUniqueSelection/ImageSelection";
|
|
4
|
+
import { IScrollableSelectionProps } from "@ax/components/Fields/VisualUniqueSelection/ScrollableSelection";
|
|
3
5
|
import { ThemeProvider } from "styled-components";
|
|
4
6
|
import { parseTheme } from "@griddo/core";
|
|
5
7
|
import globalTheme from "@ax/themes/theme.json";
|
|
@@ -48,31 +50,3 @@ describe("VisualUniqueSelection component rendering", () => {
|
|
|
48
50
|
expect(screen.getByTestId("scrollableSelectionComponent")).toBeTruthy();
|
|
49
51
|
});
|
|
50
52
|
});
|
|
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
|
-
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { ThemeProvider } from "styled-components";
|
|
3
|
+
import { parseTheme } from "@griddo/core";
|
|
4
|
+
import { mock } from "jest-mock-extended";
|
|
5
|
+
import configureStore from "redux-mock-store";
|
|
6
|
+
|
|
7
|
+
import globalTheme from "@ax/themes/theme.json";
|
|
8
|
+
import TableList, { ITableListProps } from "@ax/components/TableList";
|
|
9
|
+
import { render, cleanup, screen } from "../../../../config/jest/test-utils";
|
|
10
|
+
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
cleanup();
|
|
13
|
+
jest.resetAllMocks();
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
const initialStore = {
|
|
17
|
+
app: {
|
|
18
|
+
isLoading: false,
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const mockStore = configureStore();
|
|
23
|
+
const defaultProps = mock<ITableListProps>();
|
|
24
|
+
const setPage = jest.fn();
|
|
25
|
+
|
|
26
|
+
const pagination = { currPage: 1, itemsPerPage: 50, setPage: setPage, totalItems: 3 };
|
|
27
|
+
|
|
28
|
+
describe("TableList", () => {
|
|
29
|
+
it("should render the component", async () => {
|
|
30
|
+
defaultProps.pagination = pagination;
|
|
31
|
+
const initialState = { ...initialStore, ...defaultProps };
|
|
32
|
+
const store = mockStore(initialStore);
|
|
33
|
+
|
|
34
|
+
render(
|
|
35
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
36
|
+
<TableList {...initialState} />
|
|
37
|
+
</ThemeProvider>,
|
|
38
|
+
{ store }
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
const tableList = screen.getByTestId("table-list");
|
|
42
|
+
|
|
43
|
+
expect(tableList).toBeTruthy();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("should have sticky style when header is fixed", async () => {
|
|
47
|
+
defaultProps.pagination = pagination;
|
|
48
|
+
defaultProps.hasFixedHeader = true;
|
|
49
|
+
const initialState = { ...initialStore, ...defaultProps };
|
|
50
|
+
const store = mockStore(initialStore);
|
|
51
|
+
|
|
52
|
+
render(
|
|
53
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
54
|
+
<TableList {...initialState} />
|
|
55
|
+
</ThemeProvider>,
|
|
56
|
+
{ store }
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
const tableListHeader = screen.getByTestId("table-list-header");
|
|
60
|
+
expect(tableListHeader).toBeTruthy();
|
|
61
|
+
const styles = getComputedStyle(tableListHeader);
|
|
62
|
+
expect(styles.position).toEqual("sticky");
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("should display loader if it's loading", async () => {
|
|
66
|
+
defaultProps.pagination = pagination;
|
|
67
|
+
defaultProps.hasFixedHeader = true;
|
|
68
|
+
const initialState = { ...initialStore, ...defaultProps };
|
|
69
|
+
const store = mockStore({ app: { isLoading: true } });
|
|
70
|
+
|
|
71
|
+
render(
|
|
72
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
73
|
+
<TableList {...initialState} />
|
|
74
|
+
</ThemeProvider>,
|
|
75
|
+
{ store }
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
const loader = screen.getByTestId("loading-wrapper");
|
|
79
|
+
const tableBody = screen.queryByTestId("table-body");
|
|
80
|
+
expect(loader).toBeTruthy();
|
|
81
|
+
expect(tableBody).toBeFalsy();
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it("should display table body if isLoading is false", async () => {
|
|
85
|
+
defaultProps.pagination = pagination;
|
|
86
|
+
defaultProps.hasFixedHeader = true;
|
|
87
|
+
const store = mockStore(initialStore);
|
|
88
|
+
const initialState = { ...initialStore, ...defaultProps };
|
|
89
|
+
|
|
90
|
+
render(
|
|
91
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
92
|
+
<TableList {...initialState} />
|
|
93
|
+
</ThemeProvider>,
|
|
94
|
+
{ store }
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
const loader = screen.queryByTestId("loading-wrapper");
|
|
98
|
+
const tableBody = screen.getByTestId("table-body");
|
|
99
|
+
expect(tableBody).toBeTruthy();
|
|
100
|
+
expect(loader).toBeFalsy();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it("should display paginator when totalItems is greater than itemsPerPage", async () => {
|
|
104
|
+
defaultProps.pagination = { currPage: 1, itemsPerPage: 50, setPage: setPage, totalItems: 60 }
|
|
105
|
+
defaultProps.hasFixedHeader = true;
|
|
106
|
+
const store = mockStore(initialStore);
|
|
107
|
+
const initialState = { ...initialStore, ...defaultProps };
|
|
108
|
+
|
|
109
|
+
render(
|
|
110
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
111
|
+
<TableList {...initialState} />
|
|
112
|
+
</ThemeProvider>,
|
|
113
|
+
{ store }
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
const pagination = screen.getByTestId("table-body");
|
|
117
|
+
expect(pagination).toBeTruthy();
|
|
118
|
+
});
|
|
119
|
+
});
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import Tabs, { ITabsProps } from "@ax/components/Tabs";
|
|
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, fireEvent } from "@testing-library/react";
|
|
7
|
+
import { mock } from "jest-mock-extended";
|
|
8
|
+
import "jest-styled-components";
|
|
9
|
+
|
|
10
|
+
afterEach(cleanup);
|
|
11
|
+
|
|
12
|
+
const defaultProps = mock<ITabsProps>();
|
|
13
|
+
|
|
14
|
+
describe("Tabs component rendering", () => {
|
|
15
|
+
it("should render tabs", () => {
|
|
16
|
+
defaultProps.tabs = ["tab1", "tab2"];
|
|
17
|
+
defaultProps.active = "tab1";
|
|
18
|
+
const setSelectedTabAction = jest.fn();
|
|
19
|
+
defaultProps.setSelectedTab = setSelectedTabAction;
|
|
20
|
+
|
|
21
|
+
render(
|
|
22
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
23
|
+
<Tabs {...defaultProps} />
|
|
24
|
+
</ThemeProvider>
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
const tabsRow = screen.getByTestId("tabs-row");
|
|
28
|
+
const tabs = screen.getAllByTestId("tab");
|
|
29
|
+
|
|
30
|
+
expect(tabsRow).toBeTruthy();
|
|
31
|
+
expect(tabs.length).toEqual(2);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("should render an empty tabs row when no tabs or icons", () => {
|
|
35
|
+
defaultProps.tabs = undefined;
|
|
36
|
+
defaultProps.icons = undefined;
|
|
37
|
+
defaultProps.active = "tab1";
|
|
38
|
+
const setSelectedTabAction = jest.fn();
|
|
39
|
+
defaultProps.setSelectedTab = setSelectedTabAction;
|
|
40
|
+
|
|
41
|
+
render(
|
|
42
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
43
|
+
<Tabs {...defaultProps} />
|
|
44
|
+
</ThemeProvider>
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
const emptyTabsRow = screen.getByTestId("empty-tabs-row");
|
|
48
|
+
|
|
49
|
+
expect(emptyTabsRow).toBeTruthy();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("should call set selected tab action on click", async () => {
|
|
53
|
+
defaultProps.tabs = ["tab1", "tab2"];
|
|
54
|
+
defaultProps.active = "tab1";
|
|
55
|
+
const setSelectedTabAction = jest.fn();
|
|
56
|
+
defaultProps.setSelectedTab = setSelectedTabAction;
|
|
57
|
+
|
|
58
|
+
render(
|
|
59
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
60
|
+
<Tabs {...defaultProps} />
|
|
61
|
+
</ThemeProvider>
|
|
62
|
+
);
|
|
63
|
+
const tabs = screen.getAllByTestId("tab");
|
|
64
|
+
fireEvent.click(tabs[1]);
|
|
65
|
+
expect(setSelectedTabAction).toBeCalled();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("should set tab as active on click", async () => {
|
|
69
|
+
defaultProps.tabs = ["tab1", "tab2"];
|
|
70
|
+
defaultProps.active = "tab1";
|
|
71
|
+
const setSelectedTabAction = jest.fn();
|
|
72
|
+
defaultProps.setSelectedTab = setSelectedTabAction;
|
|
73
|
+
|
|
74
|
+
render(
|
|
75
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
76
|
+
<Tabs {...defaultProps} />
|
|
77
|
+
</ThemeProvider>
|
|
78
|
+
);
|
|
79
|
+
const tabs = screen.getAllByTestId("tab");
|
|
80
|
+
fireEvent.click(tabs[1]);
|
|
81
|
+
expect(setSelectedTabAction).toBeCalled();
|
|
82
|
+
expect(tabs[0]).toHaveStyleRule("cursor", "initial");
|
|
83
|
+
expect(tabs[1]).toHaveStyleRule("cursor", "pointer");
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("should render tabs row with icons if icons available", async () => {
|
|
87
|
+
defaultProps.tabs = undefined;
|
|
88
|
+
defaultProps.icons = [
|
|
89
|
+
{ name: "edit", text: "Edit mode" },
|
|
90
|
+
{ name: "view", text: "Preview mode" },
|
|
91
|
+
];
|
|
92
|
+
|
|
93
|
+
render(
|
|
94
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
95
|
+
<Tabs {...defaultProps} />
|
|
96
|
+
</ThemeProvider>
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
const iconTabsRow = screen.getByTestId("icons-tabs-row");
|
|
100
|
+
expect(iconTabsRow).toBeTruthy();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it("should render tabs row with icons if icons available", async () => {
|
|
104
|
+
defaultProps.tabs = undefined;
|
|
105
|
+
defaultProps.icons = [
|
|
106
|
+
{ name: "edit", text: "Edit mode" },
|
|
107
|
+
{ name: "view", text: "Preview mode" },
|
|
108
|
+
];
|
|
109
|
+
|
|
110
|
+
render(
|
|
111
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
112
|
+
<Tabs {...defaultProps} />
|
|
113
|
+
</ThemeProvider>
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
const iconTabsRow = screen.getByTestId("icons-tabs-row");
|
|
117
|
+
const tabs = screen.getAllByTestId("icon-tab");
|
|
118
|
+
expect(iconTabsRow).toBeTruthy();
|
|
119
|
+
expect(tabs.length).toEqual(2);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it("should render tooltip with icon's text", async () => {
|
|
123
|
+
defaultProps.tabs = undefined;
|
|
124
|
+
defaultProps.icons = [
|
|
125
|
+
{ name: "edit", text: "Edit mode" },
|
|
126
|
+
{ name: "view", text: "Preview mode" },
|
|
127
|
+
];
|
|
128
|
+
|
|
129
|
+
render(
|
|
130
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
131
|
+
<Tabs {...defaultProps} />
|
|
132
|
+
</ThemeProvider>
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
const tooltips = screen.getAllByTestId("tooltip-component");
|
|
136
|
+
expect(tooltips[0]).toBeTruthy();
|
|
137
|
+
expect(tooltips[0].textContent).toBe("Edit mode");
|
|
138
|
+
expect(tooltips[1]).toBeTruthy();
|
|
139
|
+
expect(tooltips[1].textContent).toBe("Preview mode");
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it("should call set selected tab action on click icon tab", async () => {
|
|
143
|
+
defaultProps.icons = [
|
|
144
|
+
{ name: "edit", text: "Edit mode" },
|
|
145
|
+
{ name: "view", text: "Preview mode" },
|
|
146
|
+
];
|
|
147
|
+
defaultProps.active = "edit";
|
|
148
|
+
const setSelectedTabAction = jest.fn();
|
|
149
|
+
defaultProps.setSelectedTab = setSelectedTabAction;
|
|
150
|
+
|
|
151
|
+
render(
|
|
152
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
153
|
+
<Tabs {...defaultProps} />
|
|
154
|
+
</ThemeProvider>
|
|
155
|
+
);
|
|
156
|
+
const tabs = screen.getAllByTestId("icon-tab");
|
|
157
|
+
fireEvent.click(tabs[1]);
|
|
158
|
+
expect(setSelectedTabAction).toBeCalled();
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it("should set icon tab as active on click", async () => {
|
|
162
|
+
defaultProps.icons = [
|
|
163
|
+
{ name: "edit", text: "Edit mode" },
|
|
164
|
+
{ name: "view", text: "Preview mode" },
|
|
165
|
+
];
|
|
166
|
+
defaultProps.active = "edit";
|
|
167
|
+
const setSelectedTabAction = jest.fn();
|
|
168
|
+
defaultProps.setSelectedTab = setSelectedTabAction;
|
|
169
|
+
|
|
170
|
+
render(
|
|
171
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
172
|
+
<Tabs {...defaultProps} />
|
|
173
|
+
</ThemeProvider>
|
|
174
|
+
);
|
|
175
|
+
const tabs = screen.getAllByTestId("icon-tab");
|
|
176
|
+
fireEvent.click(tabs[1]);
|
|
177
|
+
expect(setSelectedTabAction).toBeCalled();
|
|
178
|
+
expect(tabs[0]).toHaveStyleRule("cursor", "initial");
|
|
179
|
+
expect(tabs[1]).toHaveStyleRule("cursor", "pointer");
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it("should not display icon if doesn't exist", async () => {
|
|
183
|
+
defaultProps.icons = [
|
|
184
|
+
{ name: "failed-icon", text: "Edit mode" },
|
|
185
|
+
{ name: "view", text: "Preview mode" },
|
|
186
|
+
];
|
|
187
|
+
defaultProps.active = "edit";
|
|
188
|
+
const setSelectedTabAction = jest.fn();
|
|
189
|
+
defaultProps.setSelectedTab = setSelectedTabAction;
|
|
190
|
+
|
|
191
|
+
render(
|
|
192
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
193
|
+
<Tabs {...defaultProps} />
|
|
194
|
+
</ThemeProvider>
|
|
195
|
+
);
|
|
196
|
+
const tooltips = screen.getAllByTestId("tooltip-component");
|
|
197
|
+
expect(tooltips[0]).toBeTruthy();
|
|
198
|
+
expect(tooltips[1]).toBeTruthy();
|
|
199
|
+
const tooltipIcons = screen.getAllByTestId("icon-component");
|
|
200
|
+
expect(tooltipIcons.length).toEqual(1);
|
|
201
|
+
});
|
|
202
|
+
});
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
|
|
3
|
+
import { ThemeProvider } from "styled-components";
|
|
4
|
+
import { mock } from "jest-mock-extended";
|
|
5
|
+
|
|
6
|
+
import { render, screen, cleanup, fireEvent } from "@testing-library/react";
|
|
7
|
+
import { parseTheme } from "@griddo/core";
|
|
8
|
+
|
|
9
|
+
import globalTheme from "@ax/themes/theme.json";
|
|
10
|
+
import Tag, { ITagProps } from "@ax/components/Tag";
|
|
11
|
+
|
|
12
|
+
afterEach(cleanup);
|
|
13
|
+
|
|
14
|
+
const defaultProps = mock<ITagProps>();
|
|
15
|
+
|
|
16
|
+
describe("Tag component rendering", () => {
|
|
17
|
+
it("should render status tag when type is defined as 'status'", () => {
|
|
18
|
+
defaultProps.type = "status";
|
|
19
|
+
defaultProps.text = "Modules";
|
|
20
|
+
|
|
21
|
+
render(
|
|
22
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
23
|
+
<Tag {...defaultProps} />
|
|
24
|
+
</ThemeProvider>
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
const tagStatus = screen.getByTestId("tag-status");
|
|
28
|
+
expect(tagStatus).toBeTruthy();
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("should render fixed tag when type is defined as 'fixed'", () => {
|
|
32
|
+
defaultProps.type = "fixed";
|
|
33
|
+
defaultProps.text = "Modules";
|
|
34
|
+
|
|
35
|
+
render(
|
|
36
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
37
|
+
<Tag {...defaultProps} />
|
|
38
|
+
</ThemeProvider>
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
const tagFixed = screen.getByTestId("tag-fixed");
|
|
42
|
+
expect(tagFixed).toBeTruthy();
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("should render square tag when type is defined as 'square'", () => {
|
|
46
|
+
defaultProps.type = "square";
|
|
47
|
+
defaultProps.text = "Modules";
|
|
48
|
+
|
|
49
|
+
render(
|
|
50
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
51
|
+
<Tag {...defaultProps} />
|
|
52
|
+
</ThemeProvider>
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
const tagSquare = screen.getByTestId("tag-square");
|
|
56
|
+
expect(tagSquare).toBeTruthy();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it("should render fixed tag when type is not defined", () => {
|
|
60
|
+
defaultProps.text = "Modules";
|
|
61
|
+
defaultProps.type = undefined;
|
|
62
|
+
|
|
63
|
+
render(
|
|
64
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
65
|
+
<Tag {...defaultProps} />
|
|
66
|
+
</ThemeProvider>
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
const tagFixed = screen.getByTestId("tag-fixed");
|
|
70
|
+
expect(tagFixed).toBeTruthy();
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("should render text", () => {
|
|
74
|
+
defaultProps.type = "fixed";
|
|
75
|
+
defaultProps.text = "Modules";
|
|
76
|
+
|
|
77
|
+
render(
|
|
78
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
79
|
+
<Tag {...defaultProps} />
|
|
80
|
+
</ThemeProvider>
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
const tagFixedTitle = screen.getByTestId("tag-fixed-title");
|
|
84
|
+
expect(tagFixedTitle).toBeTruthy();
|
|
85
|
+
expect(tagFixedTitle.textContent).toEqual("Modules");
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it("should render delete icon when onDeleteAction is defined", () => {
|
|
89
|
+
defaultProps.type = "fixed";
|
|
90
|
+
defaultProps.text = "Modules";
|
|
91
|
+
const deleteAction = jest.fn();
|
|
92
|
+
defaultProps.onDeleteAction = deleteAction;
|
|
93
|
+
|
|
94
|
+
render(
|
|
95
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
96
|
+
<Tag {...defaultProps} />
|
|
97
|
+
</ThemeProvider>
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
const deleteIconWrapper = screen.getByTestId("delete-icon-wrapper");
|
|
101
|
+
expect(deleteIconWrapper).toBeTruthy();
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it("should called deleteAction when click delete button", () => {
|
|
105
|
+
defaultProps.type = "fixed";
|
|
106
|
+
defaultProps.text = "Modules";
|
|
107
|
+
const deleteAction = jest.fn();
|
|
108
|
+
defaultProps.onDeleteAction = deleteAction;
|
|
109
|
+
|
|
110
|
+
render(
|
|
111
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
112
|
+
<Tag {...defaultProps} />
|
|
113
|
+
</ThemeProvider>
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
const deleteIconWrapper = screen.getByTestId("delete-icon-wrapper");
|
|
117
|
+
expect(deleteIconWrapper).toBeTruthy();
|
|
118
|
+
fireEvent.click(deleteIconWrapper);
|
|
119
|
+
expect(deleteAction).toBeCalled();
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it("should set background color when color is defined", () => {
|
|
123
|
+
defaultProps.type = "fixed";
|
|
124
|
+
defaultProps.text = "Modules";
|
|
125
|
+
defaultProps.color = "rgba(80, 87, 255, 0.16)";
|
|
126
|
+
|
|
127
|
+
render(
|
|
128
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
129
|
+
<Tag {...defaultProps} />
|
|
130
|
+
</ThemeProvider>
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
const tagFixed = screen.getByTestId("tag-fixed");
|
|
134
|
+
expect(tagFixed).toBeTruthy();
|
|
135
|
+
const styles = getComputedStyle(tagFixed);
|
|
136
|
+
expect(styles.backgroundColor).toEqual("rgba(80, 87, 255, 0.16)");
|
|
137
|
+
});
|
|
138
|
+
});
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
|
|
3
|
+
import { ThemeProvider } from "styled-components";
|
|
4
|
+
import { mock } from "jest-mock-extended";
|
|
5
|
+
import { render, screen, cleanup, fireEvent } from "@testing-library/react";
|
|
6
|
+
import { parseTheme } from "@griddo/core";
|
|
7
|
+
|
|
8
|
+
import Toast, { IToastProps } from "@ax/components/Toast";
|
|
9
|
+
import globalTheme from "@ax/themes/theme.json";
|
|
10
|
+
|
|
11
|
+
afterEach(cleanup);
|
|
12
|
+
|
|
13
|
+
const defaultProps = mock<IToastProps>();
|
|
14
|
+
|
|
15
|
+
describe("Toast component rendering", () => {
|
|
16
|
+
jest.useFakeTimers();
|
|
17
|
+
jest.spyOn(global, "setTimeout");
|
|
18
|
+
|
|
19
|
+
it("should render the component", () => {
|
|
20
|
+
defaultProps.message = "1 module copied to clipboard";
|
|
21
|
+
|
|
22
|
+
render(
|
|
23
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
24
|
+
<Toast {...defaultProps} />
|
|
25
|
+
</ThemeProvider>
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
const toastWrapper = screen.getByTestId("toast-wrapper");
|
|
29
|
+
expect(toastWrapper).toBeTruthy();
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("should render the component's message", () => {
|
|
33
|
+
defaultProps.message = "1 module copied to clipboard";
|
|
34
|
+
|
|
35
|
+
render(
|
|
36
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
37
|
+
<Toast {...defaultProps} />
|
|
38
|
+
</ThemeProvider>
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
const toastMessage = screen.getByTestId("toast-message");
|
|
42
|
+
expect(toastMessage.textContent).toEqual("1 module copied to clipboard");
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("should not render the undo button when no action", () => {
|
|
46
|
+
defaultProps.message = "1 module copied to clipboard";
|
|
47
|
+
|
|
48
|
+
render(
|
|
49
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
50
|
+
<Toast {...defaultProps} />
|
|
51
|
+
</ThemeProvider>
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
const button = screen.queryByTestId("button-line-inverse");
|
|
55
|
+
expect(button).toBeFalsy();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("should render the undo button when action", () => {
|
|
59
|
+
defaultProps.message = "1 module copied to clipboard";
|
|
60
|
+
defaultProps.action = jest.fn();
|
|
61
|
+
|
|
62
|
+
render(
|
|
63
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
64
|
+
<Toast {...defaultProps} />
|
|
65
|
+
</ThemeProvider>
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
const button = screen.getByTestId("button-line-inverse");
|
|
69
|
+
expect(button).toBeTruthy();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("should change visibility after 5000 ms", async () => {
|
|
73
|
+
defaultProps.message = "1 module copied to clipboard";
|
|
74
|
+
|
|
75
|
+
render(
|
|
76
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
77
|
+
<Toast {...defaultProps} />
|
|
78
|
+
</ThemeProvider>
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
expect(setTimeout).toHaveBeenCalled();
|
|
82
|
+
expect(setTimeout).toHaveBeenLastCalledWith(expect.any(Function), 5000);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("should contain closing animation class on click close button", async () => {
|
|
86
|
+
defaultProps.message = "1 module copied to clipboard";
|
|
87
|
+
|
|
88
|
+
render(
|
|
89
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
90
|
+
<Toast {...defaultProps} />
|
|
91
|
+
</ThemeProvider>
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
const toastWrapper = screen.getByTestId("toast-wrapper");
|
|
95
|
+
const closeButton = screen.getByTestId("iconActionComponent");
|
|
96
|
+
expect(closeButton).toBeTruthy();
|
|
97
|
+
fireEvent.click(closeButton);
|
|
98
|
+
expect(toastWrapper.classList.contains("close-animation")).toBeTruthy();
|
|
99
|
+
});
|
|
100
|
+
});
|
package/src/api/navigation.tsx
CHANGED
|
@@ -105,7 +105,7 @@ const updateNavigation = (navID: number, data: any) => {
|
|
|
105
105
|
|
|
106
106
|
SERVICES.UPDATE_NAVIGATION.dynamicUrl = `${host}${endpoint}${navID}`;
|
|
107
107
|
|
|
108
|
-
return sendRequest(SERVICES.UPDATE_NAVIGATION,
|
|
108
|
+
return sendRequest(SERVICES.UPDATE_NAVIGATION, data);
|
|
109
109
|
};
|
|
110
110
|
|
|
111
111
|
const deleteNavigation = (navID: number) => {
|
|
@@ -136,7 +136,7 @@ const Browser = (props: IBrowserProps): JSX.Element => {
|
|
|
136
136
|
<iframe title="Preview" width={getWidth(resolution)} height="100%" src={urlPreview} loading="lazy" />
|
|
137
137
|
</S.FrameWrapper>
|
|
138
138
|
) : (
|
|
139
|
-
<S.Wrapper ref={(ref: any) => ((window as any).browserRef = ref)}>
|
|
139
|
+
<S.Wrapper ref={(ref: any) => ((window as any).browserRef = ref)} className="browser-content">
|
|
140
140
|
<BrowserContent
|
|
141
141
|
cloudinaryName={cloudinaryName}
|
|
142
142
|
theme={theme}
|