@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.
Files changed (109) hide show
  1. package/config/jest/componentsMock.js +0 -26
  2. package/package.json +4 -3
  3. package/src/__tests__/components/ElementsTooltip/ElementsTooltip.test.tsx +97 -0
  4. package/src/__tests__/components/EmptyState/EmptyState.test.tsx +78 -0
  5. package/src/__tests__/components/Fields/AnalyticsField/PageAnalytics/PageAnalytics.test.tsx +0 -14
  6. package/src/__tests__/components/Fields/AnalyticsField/StructuredDataAnalytics/StructuredDataAnalytics.test.tsx +0 -15
  7. package/src/__tests__/components/Fields/ArrayFieldGroup/ArrayFieldGroup.test.tsx +6 -15
  8. package/src/__tests__/components/Fields/AsyncCheckGroup/AsyncCheckGroup.test.tsx +1 -13
  9. package/src/__tests__/components/Fields/AsyncSelect/AsyncSelect.test.tsx +1 -19
  10. package/src/__tests__/components/Fields/ColorPicker/ColorPicker.test.tsx +1 -10
  11. package/src/__tests__/components/Fields/ComponentArray/ComponentArray.test.tsx +1 -22
  12. package/src/__tests__/components/Fields/ComponentArray/MixableComponentArray/MixableComponentArray.test.tsx +4 -24
  13. package/src/__tests__/components/Fields/ComponentArray/MixableComponentArray/PasteModuleButton/PasteModuleButton.test.tsx +6 -12
  14. package/src/__tests__/components/Fields/ComponentArray/SameComponentArray/SameComponentArray.test.tsx +1 -20
  15. package/src/__tests__/components/Fields/ComponentContainer/ComponentContainer.test.tsx +559 -0
  16. package/src/__tests__/components/Fields/HiddenField/HiddenField.test.tsx +1 -7
  17. package/src/__tests__/components/Fields/ImageField/ImageField.test.tsx +471 -0
  18. package/src/__tests__/components/Fields/MultiCheckSelect/MultiCheckSelect.test.tsx +1 -15
  19. package/src/__tests__/components/Fields/NoteField/NoteField.test.tsx +1 -6
  20. package/src/__tests__/components/Fields/NumberField/NumberField.test.tsx +1 -14
  21. package/src/__tests__/components/Fields/RadioField/RadioField.test.tsx +1 -11
  22. package/src/__tests__/components/Fields/ReferenceField/ReferenceField.test.tsx +77 -13
  23. package/src/__tests__/components/Fields/RichText/RichText.test.tsx +1 -12
  24. package/src/__tests__/components/Fields/Select/Select.test.tsx +1 -21
  25. package/src/__tests__/components/Fields/SliderField/SliderField.test.tsx +1 -14
  26. package/src/__tests__/components/Fields/TagField/TagField.test.tsx +3 -3
  27. package/src/__tests__/components/Fields/TimeField/HourInput/HourInput.test.tsx +142 -0
  28. package/src/__tests__/components/Fields/TimeField/TimeField.test.tsx +100 -0
  29. package/src/__tests__/components/Fields/ToggleField/ToggleField.test.tsx +1 -9
  30. package/src/__tests__/components/Fields/Tooltip/Tooltip.test.tsx +151 -0
  31. package/src/__tests__/components/Fields/VisualUniqueSelection/ImageSelection/ImageSelection.test.tsx +1 -13
  32. package/src/__tests__/components/Fields/VisualUniqueSelection/ScrollableSelection/ScrollableSelection.test.tsx +3 -17
  33. package/src/__tests__/components/Fields/VisualUniqueSelection/VisualUniqueSelection.test.tsx +2 -28
  34. package/src/__tests__/components/TableList/TableList.test.tsx +119 -0
  35. package/src/__tests__/components/Tabs/Tabs.test.tsx +202 -0
  36. package/src/__tests__/components/Tag/Tag.test.tsx +138 -0
  37. package/src/__tests__/components/Toast/Toast.test.tsx +100 -0
  38. package/src/api/navigation.tsx +1 -1
  39. package/src/components/Browser/index.tsx +1 -1
  40. package/src/components/Button/index.tsx +3 -3
  41. package/src/components/ConfigPanel/NavigationForm/Field/index.tsx +14 -3
  42. package/src/components/ElementsTooltip/index.tsx +10 -9
  43. package/src/components/EmptyState/index.tsx +2 -2
  44. package/src/components/Fields/ArrayFieldGroup/index.tsx +1 -1
  45. package/src/components/Fields/AsyncCheckGroup/index.tsx +1 -1
  46. package/src/components/Fields/AsyncSelect/index.tsx +1 -1
  47. package/src/components/Fields/ComponentContainer/index.tsx +7 -6
  48. package/src/components/Fields/ComponentContainer/style.tsx +2 -2
  49. package/src/components/Fields/HiddenField/index.tsx +1 -1
  50. package/src/components/Fields/ImageField/index.tsx +10 -5
  51. package/src/components/Fields/MultiCheckSelect/index.tsx +3 -3
  52. package/src/components/Fields/NumberField/index.tsx +2 -1
  53. package/src/components/Fields/ReferenceField/ItemList/Item/index.tsx +5 -7
  54. package/src/components/Fields/ReferenceField/ItemList/Item/style.tsx +2 -2
  55. package/src/components/Fields/ReferenceField/ItemList/index.tsx +1 -1
  56. package/src/components/Fields/RichText/index.tsx +10 -6
  57. package/src/components/Fields/Select/index.tsx +1 -1
  58. package/src/components/Fields/SliderField/index.tsx +1 -1
  59. package/src/components/Fields/TimeField/HourInput/index.tsx +103 -0
  60. package/src/components/Fields/TimeField/HourInput/style.tsx +19 -0
  61. package/src/components/Fields/TimeField/HourInput/utils.tsx +35 -0
  62. package/src/components/Fields/TimeField/index.tsx +57 -0
  63. package/src/components/Fields/TimeField/style.tsx +37 -0
  64. package/src/components/Fields/index.tsx +2 -0
  65. package/src/components/FloatingMenu/index.tsx +1 -1
  66. package/src/components/Gallery/GalleryFilters/Type/index.tsx +50 -0
  67. package/src/components/Gallery/GalleryFilters/Type/style.tsx +39 -0
  68. package/src/components/Gallery/GalleryPanel/DetailPanel/index.tsx +2 -1
  69. package/src/components/Gallery/GalleryPanel/GalleryDragAndDrop/style.tsx +3 -3
  70. package/src/components/Gallery/hooks.tsx +10 -4
  71. package/src/components/Gallery/index.tsx +2 -0
  72. package/src/components/Icon/index.tsx +1 -1
  73. package/src/components/Loading/index.tsx +1 -1
  74. package/src/components/Pagination/index.tsx +1 -1
  75. package/src/components/SideModal/SideModalOption/index.tsx +4 -2
  76. package/src/components/SideModal/index.tsx +1 -1
  77. package/src/components/TableList/index.tsx +6 -6
  78. package/src/components/TableList/style.tsx +1 -1
  79. package/src/components/Tabs/index.tsx +19 -7
  80. package/src/components/Tag/index.tsx +6 -6
  81. package/src/components/Toast/index.tsx +4 -4
  82. package/src/components/Tooltip/index.tsx +5 -3
  83. package/src/components/index.tsx +2 -0
  84. package/src/containers/Navigation/Defaults/actions.tsx +10 -5
  85. package/src/containers/Navigation/Defaults/utils.tsx +13 -4
  86. package/src/containers/Sites/actions.tsx +7 -0
  87. package/src/containers/Sites/constants.tsx +1 -0
  88. package/src/containers/Sites/interfaces.tsx +6 -0
  89. package/src/containers/Sites/reducer.tsx +4 -0
  90. package/src/containers/StructuredData/actions.tsx +21 -8
  91. package/src/containers/StructuredData/constants.tsx +2 -0
  92. package/src/containers/StructuredData/interfaces.tsx +7 -1
  93. package/src/containers/StructuredData/reducer.tsx +5 -1
  94. package/src/helpers/fields.tsx +2 -2
  95. package/src/helpers/schemas.tsx +2 -2
  96. package/src/hooks/forms.tsx +2 -1
  97. package/src/modules/App/Routing/NavMenu/index.tsx +9 -1
  98. package/src/modules/Content/BulkHeader/TableHeader/index.tsx +1 -1
  99. package/src/modules/Content/hooks.tsx +19 -12
  100. package/src/modules/Content/index.tsx +23 -14
  101. package/src/modules/Navigation/Defaults/DefaultsEditor/Editor/DefaultsBrowser/index.tsx +3 -0
  102. package/src/modules/Navigation/Defaults/DefaultsEditor/Editor/index.tsx +3 -1
  103. package/src/modules/Navigation/Defaults/DefaultsEditor/index.tsx +16 -18
  104. package/src/modules/Navigation/Defaults/DefaultsEditor/utils.tsx +37 -0
  105. package/src/modules/StructuredData/Form/ConnectedField/index.tsx +3 -2
  106. package/src/modules/StructuredData/Form/index.tsx +22 -17
  107. package/src/modules/StructuredData/StructuredDataList/hooks.tsx +30 -20
  108. package/src/modules/StructuredData/StructuredDataList/index.tsx +24 -14
  109. 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("buttonDefault");
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("buttonDefault"));
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("buttonDefault"));
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("tagComponent");
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("tagComponent");
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
- let iconActionComponents = screen.getAllByTestId("iconActionComponent");
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
- fireEvent.click(iconActionComponents[1]);
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[0]).toHaveTextContent("Article 03");
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[3]);
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 delete items", async () => {
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: [4492, 4493],
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 * as React from "react";
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("tagComponent");
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("tagComponent");
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
+ });