@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
|
@@ -249,7 +249,7 @@ describe("onChange events", () => {
|
|
|
249
249
|
await act(async () => {
|
|
250
250
|
fireEvent.click(radioFieldInputs[5]);
|
|
251
251
|
|
|
252
|
-
const buttonDefault = screen.getByTestId("
|
|
252
|
+
const buttonDefault = screen.getByTestId("button-default");
|
|
253
253
|
fireEvent.click(buttonDefault);
|
|
254
254
|
});
|
|
255
255
|
|
|
@@ -297,7 +297,7 @@ describe("onChange events", () => {
|
|
|
297
297
|
|
|
298
298
|
await act(async () => {
|
|
299
299
|
fireEvent.click(manualPanelItem[4]);
|
|
300
|
-
fireEvent.click(screen.getByTestId("
|
|
300
|
+
fireEvent.click(screen.getByTestId("button-default"));
|
|
301
301
|
});
|
|
302
302
|
|
|
303
303
|
await act(async () => {
|
|
@@ -351,7 +351,7 @@ describe("onChange events", () => {
|
|
|
351
351
|
await act(async () => {
|
|
352
352
|
fireEvent.click(manualPanelItem[0]);
|
|
353
353
|
fireEvent.click(manualPanelItem[6]);
|
|
354
|
-
fireEvent.click(screen.getByTestId("
|
|
354
|
+
fireEvent.click(screen.getByTestId("button-default"));
|
|
355
355
|
});
|
|
356
356
|
|
|
357
357
|
await act(async () => {
|
|
@@ -413,7 +413,7 @@ describe("onChange events", () => {
|
|
|
413
413
|
rerender(Component);
|
|
414
414
|
});
|
|
415
415
|
|
|
416
|
-
let tagComponent = screen.getAllByTestId("
|
|
416
|
+
let tagComponent = screen.getAllByTestId("delete-icon-wrapper");
|
|
417
417
|
|
|
418
418
|
expect(tagComponent.length).toBe(2);
|
|
419
419
|
|
|
@@ -425,7 +425,7 @@ describe("onChange events", () => {
|
|
|
425
425
|
rerender(Component);
|
|
426
426
|
});
|
|
427
427
|
|
|
428
|
-
tagComponent = screen.getAllByTestId("
|
|
428
|
+
tagComponent = screen.getAllByTestId("delete-icon-wrapper");
|
|
429
429
|
|
|
430
430
|
expect(tagComponent.length).toBe(1);
|
|
431
431
|
});
|
|
@@ -453,38 +453,100 @@ describe("onChange events", () => {
|
|
|
453
453
|
rerender(Component);
|
|
454
454
|
});
|
|
455
455
|
|
|
456
|
-
|
|
456
|
+
const referenceFieldItems = screen.getAllByTestId("reference-field-item");
|
|
457
|
+
expect(referenceFieldItems[0]).toHaveTextContent("Article 02");
|
|
458
|
+
|
|
459
|
+
const droppable = screen.getByTestId("droppable");
|
|
460
|
+
expect(droppable).toBeTruthy();
|
|
461
|
+
|
|
462
|
+
fireEvent.dragStart(referenceFieldItems[0]);
|
|
463
|
+
fireEvent.dragEnter(droppable);
|
|
464
|
+
fireEvent.dragOver(droppable);
|
|
465
|
+
fireEvent.drop(droppable);
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
test("should render the drag handle if list length is greater than two", async () => {
|
|
469
|
+
defaultProps.source = ["ARTICLES"];
|
|
470
|
+
defaultProps.value = {
|
|
471
|
+
mode: "manual",
|
|
472
|
+
fixed: [4492, 4493],
|
|
473
|
+
};
|
|
474
|
+
const initialState = { ...initialStore, ...defaultProps };
|
|
475
|
+
const onChange = jest.fn();
|
|
476
|
+
|
|
477
|
+
mockApiCalls();
|
|
478
|
+
|
|
479
|
+
const Component = (
|
|
480
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
481
|
+
<ReferenceField {...initialState} onChange={onChange} />
|
|
482
|
+
</ThemeProvider>
|
|
483
|
+
);
|
|
484
|
+
|
|
485
|
+
const { rerender } = render(Component, { store });
|
|
457
486
|
|
|
458
487
|
await act(async () => {
|
|
459
|
-
|
|
488
|
+
rerender(Component);
|
|
460
489
|
});
|
|
461
490
|
|
|
491
|
+
const referenceFieldItems = screen.getAllByTestId("reference-field-item");
|
|
492
|
+
expect(referenceFieldItems.length).toBe(2);
|
|
493
|
+
const handleWrappers = screen.getAllByTestId("handle-wrapper");
|
|
494
|
+
expect(handleWrappers.length).toEqual(2);
|
|
495
|
+
});
|
|
496
|
+
|
|
497
|
+
test("should delete items", async () => {
|
|
498
|
+
defaultProps.source = ["ARTICLES"];
|
|
499
|
+
defaultProps.value = {
|
|
500
|
+
mode: "manual",
|
|
501
|
+
fixed: [4492, 4493],
|
|
502
|
+
};
|
|
503
|
+
const initialState = { ...initialStore, ...defaultProps };
|
|
504
|
+
const onChange = jest.fn();
|
|
505
|
+
|
|
506
|
+
mockApiCalls();
|
|
507
|
+
|
|
508
|
+
const Component = (
|
|
509
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
510
|
+
<ReferenceField {...initialState} onChange={onChange} />
|
|
511
|
+
</ThemeProvider>
|
|
512
|
+
);
|
|
513
|
+
|
|
514
|
+
const { rerender } = render(Component, { store });
|
|
515
|
+
|
|
462
516
|
await act(async () => {
|
|
463
517
|
rerender(Component);
|
|
464
518
|
});
|
|
465
|
-
|
|
466
519
|
let referenceFieldItems = screen.getAllByTestId("reference-field-item");
|
|
467
|
-
expect(referenceFieldItems
|
|
520
|
+
expect(referenceFieldItems.length).toBe(2);
|
|
468
521
|
|
|
469
|
-
iconActionComponents = screen.getAllByTestId("iconActionComponent");
|
|
522
|
+
const iconActionComponents = screen.getAllByTestId("iconActionComponent");
|
|
470
523
|
|
|
471
524
|
await act(async () => {
|
|
472
|
-
fireEvent.click(iconActionComponents[
|
|
525
|
+
fireEvent.click(iconActionComponents[2]);
|
|
473
526
|
});
|
|
474
527
|
|
|
475
528
|
await act(async () => {
|
|
476
529
|
rerender(Component);
|
|
477
530
|
});
|
|
478
531
|
|
|
532
|
+
const actionMenuItem = screen.getByTestId("action-menu-item");
|
|
533
|
+
await act(async () => {
|
|
534
|
+
fireEvent.click(actionMenuItem);
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
// await act(async () => {
|
|
538
|
+
// rerender(Component);
|
|
539
|
+
// });
|
|
540
|
+
|
|
479
541
|
referenceFieldItems = screen.getAllByTestId("reference-field-item");
|
|
480
542
|
expect(referenceFieldItems[0]).toHaveTextContent("Article 02");
|
|
481
543
|
});*/
|
|
482
544
|
|
|
483
|
-
test("should
|
|
545
|
+
test("should hide the drag handle if list length is lower than two", async () => {
|
|
484
546
|
defaultProps.source = ["ARTICLES"];
|
|
485
547
|
defaultProps.value = {
|
|
486
548
|
mode: "manual",
|
|
487
|
-
fixed: [
|
|
549
|
+
fixed: [],
|
|
488
550
|
};
|
|
489
551
|
const initialState = { ...initialStore, ...defaultProps };
|
|
490
552
|
const onChange = jest.fn();
|
|
@@ -528,5 +590,7 @@ describe("onChange events", () => {
|
|
|
528
590
|
|
|
529
591
|
referenceFieldItems = screen.getAllByTestId("reference-field-item");
|
|
530
592
|
expect(referenceFieldItems.length).toBe(1);
|
|
593
|
+
const handleWrappers = screen.getAllByTestId("handle-wrapper");
|
|
594
|
+
expect(handleWrappers[0].hidden).toBe(true);
|
|
531
595
|
});
|
|
532
596
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import RichText from "@ax/components/Fields/RichText";
|
|
2
|
+
import RichText, { IRichTextProps } from "@ax/components/Fields/RichText";
|
|
3
3
|
import { ThemeProvider } from "styled-components";
|
|
4
4
|
import { parseTheme } from "@griddo/core";
|
|
5
5
|
import globalTheme from "@ax/themes/theme.json";
|
|
@@ -39,14 +39,3 @@ describe("RichText component rendering", () => {
|
|
|
39
39
|
expect(richTextContent).toBeTruthy();
|
|
40
40
|
});
|
|
41
41
|
});
|
|
42
|
-
|
|
43
|
-
interface IRichTextProps {
|
|
44
|
-
editorID: number;
|
|
45
|
-
value: string;
|
|
46
|
-
error?: boolean;
|
|
47
|
-
placeholder?: string;
|
|
48
|
-
disabled?: boolean;
|
|
49
|
-
onChange: (value: string) => void;
|
|
50
|
-
handleValidation?: (value: string) => void;
|
|
51
|
-
html: boolean;
|
|
52
|
-
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import Select from "@ax/components/Fields/Select";
|
|
2
|
+
import Select, { ISelectProps } from "@ax/components/Fields/Select";
|
|
3
3
|
import { ThemeProvider } from "styled-components";
|
|
4
4
|
import { parseTheme } from "@griddo/core";
|
|
5
5
|
import globalTheme from "@ax/themes/theme.json";
|
|
@@ -53,23 +53,3 @@ describe("Select component rendering", () => {
|
|
|
53
53
|
expect(errors.length).toBe(1);
|
|
54
54
|
});
|
|
55
55
|
});
|
|
56
|
-
|
|
57
|
-
interface ISelectProps {
|
|
58
|
-
name: string;
|
|
59
|
-
value: string;
|
|
60
|
-
options: IOptionProps[];
|
|
61
|
-
error?: boolean;
|
|
62
|
-
disabled?: boolean;
|
|
63
|
-
defaultValue?: IOptionProps;
|
|
64
|
-
placeholder?: string;
|
|
65
|
-
isMulti?: boolean;
|
|
66
|
-
type?: string;
|
|
67
|
-
mandatory?: boolean;
|
|
68
|
-
alignRight?: boolean;
|
|
69
|
-
onChange: (value: string) => void;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
interface IOptionProps {
|
|
73
|
-
value: string;
|
|
74
|
-
label: string;
|
|
75
|
-
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import SliderField from "@ax/components/Fields/SliderField";
|
|
2
|
+
import SliderField, { ITextFieldProps } from "@ax/components/Fields/SliderField";
|
|
3
3
|
import { ThemeProvider } from "styled-components";
|
|
4
4
|
import { parseTheme } from "@griddo/core";
|
|
5
5
|
import globalTheme from "@ax/themes/theme.json";
|
|
@@ -67,16 +67,3 @@ describe("Select component events trigger", () => {
|
|
|
67
67
|
expect(onChangeMock).toBeCalledWith(20);
|
|
68
68
|
});
|
|
69
69
|
});
|
|
70
|
-
|
|
71
|
-
interface ITextFieldProps {
|
|
72
|
-
title: string;
|
|
73
|
-
value: number;
|
|
74
|
-
defaultValue?: number;
|
|
75
|
-
min: number;
|
|
76
|
-
max: number;
|
|
77
|
-
step: number;
|
|
78
|
-
prefix?: string;
|
|
79
|
-
suffix?: string;
|
|
80
|
-
helptext?: string;
|
|
81
|
-
onChange: (value: number) => void;
|
|
82
|
-
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React from "react";
|
|
2
2
|
import TagField from "@ax/components/Fields/TagField";
|
|
3
3
|
import { ThemeProvider } from "styled-components";
|
|
4
4
|
import { parseTheme } from "@griddo/core";
|
|
@@ -47,7 +47,7 @@ describe("TagField component", () => {
|
|
|
47
47
|
const tagFieldInput = screen.getByTestId("tagFieldInput");
|
|
48
48
|
expect(tagFieldInput).toBeTruthy();
|
|
49
49
|
|
|
50
|
-
const tagRendered = within(tagFieldWrapper).getAllByTestId("
|
|
50
|
+
const tagRendered = within(tagFieldWrapper).getAllByTestId("delete-icon-wrapper");
|
|
51
51
|
expect(tagRendered).toHaveLength(2);
|
|
52
52
|
|
|
53
53
|
const tagComponent = screen.getByTestId("tagFieldWrapper");
|
|
@@ -116,7 +116,7 @@ describe("TagField events", () => {
|
|
|
116
116
|
);
|
|
117
117
|
|
|
118
118
|
const tagFieldWrapper = screen.getByTestId("tagFieldWrapper");
|
|
119
|
-
const tagRendered = within(tagFieldWrapper).getAllByTestId("
|
|
119
|
+
const tagRendered = within(tagFieldWrapper).getAllByTestId("delete-icon-wrapper");
|
|
120
120
|
expect(tagRendered).toHaveLength(2);
|
|
121
121
|
fireEvent.click(tagRendered[0], 0);
|
|
122
122
|
expect(onChange).toBeCalledTimes(1);
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { render, screen, cleanup, fireEvent } from "@testing-library/react";
|
|
3
|
+
import { mock } from "jest-mock-extended";
|
|
4
|
+
import { ThemeProvider } from "styled-components";
|
|
5
|
+
import { parseTheme } from "@griddo/core";
|
|
6
|
+
import globalTheme from "@ax/themes/theme.json";
|
|
7
|
+
import HourInput from "@ax/components/Fields/TimeField/HourInput";
|
|
8
|
+
import { act, Simulate } from "react-dom/test-utils";
|
|
9
|
+
|
|
10
|
+
afterEach(cleanup);
|
|
11
|
+
|
|
12
|
+
const defaultProps = mock<IHourInputProps>();
|
|
13
|
+
|
|
14
|
+
describe("HourInput component rendering", () => {
|
|
15
|
+
it("should render the component", () => {
|
|
16
|
+
render(
|
|
17
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
18
|
+
<HourInput {...defaultProps} />
|
|
19
|
+
</ThemeProvider>
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
const hourInputField = screen.getByTestId("time-field-input");
|
|
23
|
+
expect(hourInputField).toBeTruthy();
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("should render component as disabled", () => {
|
|
27
|
+
defaultProps.disabled = true;
|
|
28
|
+
|
|
29
|
+
render(
|
|
30
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
31
|
+
<HourInput {...defaultProps} />
|
|
32
|
+
</ThemeProvider>
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
const hourInputField = screen.getByTestId<HTMLInputElement>("time-field-input");
|
|
36
|
+
expect(hourInputField.disabled).toEqual(true);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
describe("onChange events", () => {
|
|
41
|
+
it("should call onChange on change with valid time", () => {
|
|
42
|
+
const onChangeMock = defaultProps.onChange as jest.MockedFunction<(value: string) => void>;
|
|
43
|
+
defaultProps.value = "12:30";
|
|
44
|
+
defaultProps.disabled = false;
|
|
45
|
+
|
|
46
|
+
render(
|
|
47
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
48
|
+
<HourInput {...defaultProps} />
|
|
49
|
+
</ThemeProvider>
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
const input = screen.getByTestId("time-field-input");
|
|
53
|
+
act(() => {
|
|
54
|
+
fireEvent.change(input, { target: { value: "12:30" } });
|
|
55
|
+
Simulate.change(input);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
expect(onChangeMock).toHaveBeenCalledWith("12:30");
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("should call onChange on change with 24 hours time", () => {
|
|
62
|
+
const onChangeMock = defaultProps.onChange as jest.MockedFunction<(value: string) => void>;
|
|
63
|
+
defaultProps.value = "12:00";
|
|
64
|
+
|
|
65
|
+
render(
|
|
66
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
67
|
+
<HourInput {...defaultProps} />
|
|
68
|
+
</ThemeProvider>
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
const input = screen.getByTestId("time-field-input");
|
|
72
|
+
act(() => {
|
|
73
|
+
fireEvent.change(input, { target: { value: "23:30" } });
|
|
74
|
+
Simulate.change(input);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
expect(onChangeMock).toHaveBeenCalledWith("12:30");
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("should call onChange on change with 24 hours time", () => {
|
|
81
|
+
const onChangeMock = defaultProps.onChange as jest.MockedFunction<(value: string) => void>;
|
|
82
|
+
defaultProps.value = "12:00";
|
|
83
|
+
|
|
84
|
+
render(
|
|
85
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
86
|
+
<HourInput {...defaultProps} />
|
|
87
|
+
</ThemeProvider>
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
const input = screen.getByTestId("time-field-input");
|
|
91
|
+
act(() => {
|
|
92
|
+
fireEvent.change(input, { target: { value: "23:30" } });
|
|
93
|
+
Simulate.change(input);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
expect(onChangeMock).toHaveBeenCalledWith("12:30");
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("should call onChange on change with more than 12 hours", () => {
|
|
100
|
+
const onChangeMock = defaultProps.onChange as jest.MockedFunction<(value: string) => void>;
|
|
101
|
+
defaultProps.value = "12:00";
|
|
102
|
+
|
|
103
|
+
render(
|
|
104
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
105
|
+
<HourInput {...defaultProps} />
|
|
106
|
+
</ThemeProvider>
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
const input = screen.getByTestId("time-field-input");
|
|
110
|
+
act(() => {
|
|
111
|
+
fireEvent.change(input, { target: { value: "13:30" } });
|
|
112
|
+
Simulate.change(input);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
expect(onChangeMock).toHaveBeenCalledWith("12:30");
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it("should call onChange on change with more than 59 minutes", () => {
|
|
119
|
+
const onChangeMock = defaultProps.onChange as jest.MockedFunction<(value: string) => void>;
|
|
120
|
+
defaultProps.value = "12:30";
|
|
121
|
+
|
|
122
|
+
render(
|
|
123
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
124
|
+
<HourInput {...defaultProps} />
|
|
125
|
+
</ThemeProvider>
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
const input = screen.getByTestId("time-field-input");
|
|
129
|
+
act(() => {
|
|
130
|
+
fireEvent.change(input, { target: { value: "10:72" } });
|
|
131
|
+
Simulate.change(input);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
expect(onChangeMock).toHaveBeenCalledWith("10:30");
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
interface IHourInputProps {
|
|
139
|
+
value: string;
|
|
140
|
+
onChange: (value: string) => void;
|
|
141
|
+
disabled?: boolean;
|
|
142
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { render, screen, cleanup, fireEvent } from "@testing-library/react";
|
|
3
|
+
import { mock } from "jest-mock-extended";
|
|
4
|
+
import { ThemeProvider } from "styled-components";
|
|
5
|
+
import { parseTheme } from "@griddo/core";
|
|
6
|
+
import globalTheme from "@ax/themes/theme.json";
|
|
7
|
+
import { TimeField } from "@ax/components";
|
|
8
|
+
|
|
9
|
+
afterEach(cleanup);
|
|
10
|
+
|
|
11
|
+
const defaultProps = mock<ITimeFieldProps>();
|
|
12
|
+
|
|
13
|
+
describe("TimeField component rendering", () => {
|
|
14
|
+
it("should render the component", () => {
|
|
15
|
+
render(
|
|
16
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
17
|
+
<TimeField {...defaultProps} />
|
|
18
|
+
</ThemeProvider>
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
const timeFieldWrapper = screen.getByTestId("time-field-wrapper");
|
|
22
|
+
expect(timeFieldWrapper).toBeTruthy();
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("should render component as disabled", () => {
|
|
26
|
+
defaultProps.disabled = true;
|
|
27
|
+
|
|
28
|
+
render(
|
|
29
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
30
|
+
<TimeField {...defaultProps} />
|
|
31
|
+
</ThemeProvider>
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
const timeFieldWrapper = screen.getByTestId<HTMLInputElement>("time-field-wrapper");
|
|
35
|
+
expect(timeFieldWrapper).toBeTruthy();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("should render component with error", () => {
|
|
39
|
+
defaultProps.error = true;
|
|
40
|
+
|
|
41
|
+
render(
|
|
42
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
43
|
+
<TimeField {...defaultProps} />
|
|
44
|
+
</ThemeProvider>
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
const timeFieldWrapper = screen.getByTestId<HTMLInputElement>("time-field-wrapper");
|
|
48
|
+
expect(timeFieldWrapper).toBeTruthy();
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("should render the component input", () => {
|
|
52
|
+
render(
|
|
53
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
54
|
+
<TimeField {...defaultProps} />
|
|
55
|
+
</ThemeProvider>
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
const timeFieldWInput = screen.getByTestId("time-field-input");
|
|
59
|
+
expect(timeFieldWInput).toBeTruthy();
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
describe("onChange events", () => {
|
|
64
|
+
it("should call onChange on change", () => {
|
|
65
|
+
const onChangeMock = defaultProps.onChange as jest.MockedFunction<(value: string) => void>;
|
|
66
|
+
defaultProps.value = "12:30 am";
|
|
67
|
+
|
|
68
|
+
render(
|
|
69
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
70
|
+
<TimeField {...defaultProps} />
|
|
71
|
+
</ThemeProvider>
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
const input = screen.getByTestId("time-field-input");
|
|
75
|
+
fireEvent.change(input, { target: { value: "12:30 am" } });
|
|
76
|
+
expect(onChangeMock).toHaveBeenCalledWith("12:30 am");
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it("should call onChange on change with no value", () => {
|
|
80
|
+
const onChangeMock = defaultProps.onChange as jest.MockedFunction<(value: string) => void>;
|
|
81
|
+
defaultProps.value = undefined;
|
|
82
|
+
|
|
83
|
+
render(
|
|
84
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
85
|
+
<TimeField {...defaultProps} />
|
|
86
|
+
</ThemeProvider>
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
const input = screen.getByTestId("time-field-input");
|
|
90
|
+
fireEvent.change(input, { target: { value: "00:00 am" } });
|
|
91
|
+
expect(onChangeMock).toHaveBeenCalledWith("00:00 am");
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
interface ITimeFieldProps {
|
|
96
|
+
value?: string;
|
|
97
|
+
onChange: (value: string) => void;
|
|
98
|
+
error?: boolean;
|
|
99
|
+
disabled?: boolean;
|
|
100
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import ToggleField from "@ax/components/Fields/ToggleField";
|
|
2
|
+
import ToggleField, { IToggleFieldProps } from "@ax/components/Fields/ToggleField";
|
|
3
3
|
import { ThemeProvider } from "styled-components";
|
|
4
4
|
import { parseTheme } from "@griddo/core";
|
|
5
5
|
import globalTheme from "@ax/themes/theme.json";
|
|
@@ -90,11 +90,3 @@ describe("onClick events", () => {
|
|
|
90
90
|
expect(defaultProps.onChange).not.toHaveBeenCalled();
|
|
91
91
|
});
|
|
92
92
|
});
|
|
93
|
-
|
|
94
|
-
interface IToggleFieldProps {
|
|
95
|
-
name: string;
|
|
96
|
-
value: any;
|
|
97
|
-
checked?: boolean;
|
|
98
|
-
disabled?: boolean;
|
|
99
|
-
onChange?: (value: boolean) => void;
|
|
100
|
-
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
import { ThemeProvider } from "styled-components";
|
|
4
|
+
import { render, screen, cleanup, fireEvent, act } from "@testing-library/react";
|
|
5
|
+
import "@testing-library/jest-dom";
|
|
6
|
+
import { mock } from "jest-mock-extended";
|
|
7
|
+
|
|
8
|
+
import { parseTheme } from "@griddo/core";
|
|
9
|
+
|
|
10
|
+
import Tooltip, { ITooltipProps } from "@ax/components/Tooltip";
|
|
11
|
+
import { Icon } from "@ax/components";
|
|
12
|
+
import globalTheme from "@ax/themes/theme.json";
|
|
13
|
+
|
|
14
|
+
afterEach(cleanup);
|
|
15
|
+
|
|
16
|
+
const defaultProps = mock<ITooltipProps>();
|
|
17
|
+
|
|
18
|
+
describe("Tooltip component rendering", () => {
|
|
19
|
+
it("should render the component", () => {
|
|
20
|
+
defaultProps.content = "content";
|
|
21
|
+
render(
|
|
22
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
23
|
+
<Tooltip {...defaultProps} />
|
|
24
|
+
</ThemeProvider>
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
const tooltipComponent = screen.getByTestId("tooltip-component");
|
|
28
|
+
const tipComponent = screen.getByTestId("tipComponent");
|
|
29
|
+
|
|
30
|
+
expect(tooltipComponent).toBeTruthy();
|
|
31
|
+
expect(tipComponent).toBeTruthy();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("should not render the component", () => {
|
|
35
|
+
defaultProps.content = undefined;
|
|
36
|
+
render(
|
|
37
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
38
|
+
<Tooltip {...defaultProps} />
|
|
39
|
+
</ThemeProvider>
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
const tooltipComponent = screen.queryByTestId("tooltip-component");
|
|
43
|
+
expect(tooltipComponent).not.toBeTruthy();
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe("Tooltip events triggering", () => {
|
|
48
|
+
it("should render the component and Tip Component is still visible when doing click", () => {
|
|
49
|
+
jest.useFakeTimers();
|
|
50
|
+
defaultProps.content = "content";
|
|
51
|
+
defaultProps.children = <Icon name="modified" size="16px" />;
|
|
52
|
+
|
|
53
|
+
const { rerender } = render(
|
|
54
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
55
|
+
<Tooltip {...defaultProps} />
|
|
56
|
+
</ThemeProvider>
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
const tooltipComponent = screen.getByTestId("tooltip-component");
|
|
60
|
+
const tipComponent = screen.queryByText("content");
|
|
61
|
+
|
|
62
|
+
defaultProps.hideOnClick = false;
|
|
63
|
+
rerender(
|
|
64
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
65
|
+
<Tooltip {...defaultProps} />
|
|
66
|
+
</ThemeProvider>
|
|
67
|
+
);
|
|
68
|
+
expect(tipComponent).not.toBeVisible();
|
|
69
|
+
|
|
70
|
+
act(() => {
|
|
71
|
+
// over the tooltip
|
|
72
|
+
fireEvent.mouseEnter(tooltipComponent);
|
|
73
|
+
|
|
74
|
+
rerender(
|
|
75
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
76
|
+
<Tooltip {...defaultProps} />
|
|
77
|
+
</ThemeProvider>
|
|
78
|
+
);
|
|
79
|
+
jest.runAllTimers();
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
expect(tipComponent).toBeVisible();
|
|
83
|
+
|
|
84
|
+
act(() => {
|
|
85
|
+
// click and change the clicked value
|
|
86
|
+
fireEvent.mouseDown(tooltipComponent);
|
|
87
|
+
|
|
88
|
+
rerender(
|
|
89
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
90
|
+
<Tooltip {...defaultProps} />
|
|
91
|
+
</ThemeProvider>
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
jest.runAllTimers();
|
|
95
|
+
});
|
|
96
|
+
expect(tipComponent).toBeVisible();
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("should render the component and change visibility of Tip Component when click", () => {
|
|
100
|
+
jest.useFakeTimers();
|
|
101
|
+
defaultProps.content = "content";
|
|
102
|
+
defaultProps.children = <Icon name="modified" size="16px" />;
|
|
103
|
+
|
|
104
|
+
const { rerender } = render(
|
|
105
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
106
|
+
<Tooltip {...defaultProps} />
|
|
107
|
+
</ThemeProvider>
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
const tooltipComponent = screen.getByTestId("tooltip-component");
|
|
111
|
+
const tipComponent = screen.queryByText("content");
|
|
112
|
+
|
|
113
|
+
defaultProps.hideOnClick = true;
|
|
114
|
+
rerender(
|
|
115
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
116
|
+
<Tooltip {...defaultProps} />
|
|
117
|
+
</ThemeProvider>
|
|
118
|
+
);
|
|
119
|
+
expect(tipComponent).not.toBeVisible();
|
|
120
|
+
|
|
121
|
+
act(() => {
|
|
122
|
+
// over the tooltip
|
|
123
|
+
fireEvent.mouseEnter(tooltipComponent);
|
|
124
|
+
|
|
125
|
+
rerender(
|
|
126
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
127
|
+
<Tooltip {...defaultProps} />
|
|
128
|
+
</ThemeProvider>
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
jest.runAllTimers();
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
expect(tipComponent).toBeVisible();
|
|
135
|
+
|
|
136
|
+
act(() => {
|
|
137
|
+
fireEvent.mouseDown(tooltipComponent);
|
|
138
|
+
|
|
139
|
+
rerender(
|
|
140
|
+
<ThemeProvider theme={parseTheme(globalTheme)}>
|
|
141
|
+
<Tooltip {...defaultProps} />
|
|
142
|
+
</ThemeProvider>
|
|
143
|
+
);
|
|
144
|
+
});
|
|
145
|
+
fireEvent.mouseEnter(tooltipComponent);
|
|
146
|
+
fireEvent.mouseDown(document);
|
|
147
|
+
|
|
148
|
+
expect(tooltipComponent).toBeTruthy();
|
|
149
|
+
expect(tipComponent).not.toBeVisible();
|
|
150
|
+
});
|
|
151
|
+
});
|