@griddo/ax 1.69.8 → 1.72.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 (160) hide show
  1. package/config/jest/componentsMock.js +0 -26
  2. package/package.json +4 -3
  3. package/src/Style/index.tsx +1 -1
  4. package/src/__tests__/components/ElementsTooltip/ElementsTooltip.test.tsx +97 -0
  5. package/src/__tests__/components/EmptyState/EmptyState.test.tsx +78 -0
  6. package/src/__tests__/components/FieldContainer/FieldContainer.test.tsx +82 -0
  7. package/src/__tests__/components/Fields/AnalyticsField/AnalyticsField.test.tsx +1 -1
  8. package/src/__tests__/components/Fields/AnalyticsField/PageAnalytics/PageAnalytics.test.tsx +1 -15
  9. package/src/__tests__/components/Fields/AnalyticsField/StructuredDataAnalytics/StructuredDataAnalytics.test.tsx +1 -16
  10. package/src/__tests__/components/Fields/ArrayFieldGroup/ArrayFieldGroup.test.tsx +8 -17
  11. package/src/__tests__/components/Fields/AsyncCheckGroup/AsyncCheckGroup.test.tsx +4 -16
  12. package/src/__tests__/components/Fields/AsyncSelect/AsyncSelect.test.tsx +2 -20
  13. package/src/__tests__/components/Fields/CheckField/CheckField.test.tsx +6 -6
  14. package/src/__tests__/components/Fields/CheckGroup/CheckGroup.test.tsx +15 -15
  15. package/src/__tests__/components/Fields/ColorPicker/ColorPicker.test.tsx +7 -16
  16. package/src/__tests__/components/Fields/ComponentArray/ComponentArray.test.tsx +2 -23
  17. package/src/__tests__/components/Fields/ComponentArray/MixableComponentArray/MixableComponentArray.test.tsx +11 -31
  18. package/src/__tests__/components/Fields/ComponentArray/MixableComponentArray/PasteModuleButton/PasteModuleButton.test.tsx +15 -21
  19. package/src/__tests__/components/Fields/ComponentArray/SameComponentArray/SameComponentArray.test.tsx +6 -25
  20. package/src/__tests__/components/Fields/ComponentContainer/ComponentContainer.test.tsx +559 -0
  21. package/src/__tests__/components/Fields/ConditionalField/ConditionalField.test.tsx +1 -1
  22. package/src/__tests__/components/Fields/DateField/DateField.test.tsx +1 -1
  23. package/src/__tests__/components/Fields/FieldGroup/FieldGroup.test.tsx +1 -1
  24. package/src/__tests__/components/Fields/FieldsDivider/FieldsDivider.test.tsx +1 -1
  25. package/src/__tests__/components/Fields/FileField/FileField.test.tsx +3 -3
  26. package/src/__tests__/components/Fields/HeadingField/HeadingField.test.tsx +6 -6
  27. package/src/__tests__/components/Fields/HiddenField/HiddenField.test.tsx +2 -8
  28. package/src/__tests__/components/Fields/ImageField/ImageField.test.tsx +471 -0
  29. package/src/__tests__/components/Fields/MultiCheckSelect/MultiCheckSelect.test.tsx +2 -16
  30. package/src/__tests__/components/Fields/MultiCheckSelectGroup/MultiCheckSelectGroup.test.tsx +2 -2
  31. package/src/__tests__/components/Fields/NoteField/NoteField.test.tsx +2 -7
  32. package/src/__tests__/components/Fields/NumberField/NumberField.test.tsx +2 -15
  33. package/src/__tests__/components/Fields/RadioField/RadioField.test.tsx +2 -12
  34. package/src/__tests__/components/Fields/ReferenceField/ReferenceField.test.tsx +171 -19
  35. package/src/__tests__/components/Fields/RichText/RichText.test.tsx +2 -13
  36. package/src/__tests__/components/Fields/Select/Select.test.tsx +3 -23
  37. package/src/__tests__/components/Fields/SliderField/SliderField.test.tsx +2 -15
  38. package/src/__tests__/components/Fields/TagField/TagField.test.tsx +4 -4
  39. package/src/__tests__/components/Fields/TextArea/TextArea.test.tsx +1 -1
  40. package/src/__tests__/components/Fields/TextField/TextField.test.tsx +6 -6
  41. package/src/__tests__/components/Fields/TimeField/HourInput/HourInput.test.tsx +142 -0
  42. package/src/__tests__/components/Fields/TimeField/TimeField.test.tsx +100 -0
  43. package/src/__tests__/components/Fields/ToggleField/ToggleField.test.tsx +2 -10
  44. package/src/__tests__/components/Fields/Tooltip/Tooltip.test.tsx +152 -0
  45. package/src/__tests__/components/Fields/UniqueCheck/UniqueCheck.test.tsx +3 -3
  46. package/src/__tests__/components/Fields/UrlField/UrlField.test.tsx +4 -4
  47. package/src/__tests__/components/Fields/VisualUniqueSelection/ImageSelection/ImageSelection.test.tsx +2 -14
  48. package/src/__tests__/components/Fields/VisualUniqueSelection/ScrollableSelection/ScrollableSelection.test.tsx +6 -20
  49. package/src/__tests__/components/Fields/VisualUniqueSelection/VisualUniqueSelection.test.tsx +3 -29
  50. package/src/__tests__/components/Fields/Wysiwyg/Wysiwyg.test.tsx +1 -1
  51. package/src/__tests__/components/FieldsBehavior/FieldsBehavior.test.tsx +149 -0
  52. package/src/__tests__/components/TableFilters/CategoryFilter/CategoryFilter.test.tsx +241 -0
  53. package/src/__tests__/components/TableFilters/CustomizeFilters/CustomizeFilters.test.tsx +131 -0
  54. package/src/__tests__/components/TableFilters/DateFilter/DateFilter.test.tsx +148 -0
  55. package/src/__tests__/components/TableFilters/LiveFilter/LiveFilter.test.tsx +265 -0
  56. package/src/__tests__/components/TableFilters/NameFilter/NameFilter.test.tsx +197 -0
  57. package/src/__tests__/components/TableFilters/SiteFilter/SiteFilter.test.tsx +317 -0
  58. package/src/__tests__/components/TableFilters/StatusFilter/StatusFilter.test.tsx +197 -0
  59. package/src/__tests__/components/TableFilters/TranslationsFilter/TranslationsFilter.test.tsx +157 -0
  60. package/src/__tests__/components/TableFilters/TypeFilter/TypeFilter.test.tsx +164 -0
  61. package/src/__tests__/components/TableList/TableList.test.tsx +119 -0
  62. package/src/__tests__/components/Tabs/Tabs.test.tsx +205 -0
  63. package/src/__tests__/components/Tag/Tag.test.tsx +140 -0
  64. package/src/__tests__/components/Toast/Toast.test.tsx +102 -0
  65. package/src/api/navigation.tsx +1 -1
  66. package/src/components/Browser/index.tsx +1 -1
  67. package/src/components/Button/index.tsx +3 -3
  68. package/src/components/ConfigPanel/NavigationForm/Field/index.tsx +14 -3
  69. package/src/components/ElementsTooltip/index.tsx +10 -9
  70. package/src/components/EmptyState/index.tsx +2 -2
  71. package/src/components/FieldContainer/index.tsx +3 -3
  72. package/src/components/Fields/ArrayFieldGroup/index.tsx +1 -1
  73. package/src/components/Fields/AsyncCheckGroup/index.tsx +1 -1
  74. package/src/components/Fields/AsyncSelect/index.tsx +1 -1
  75. package/src/components/Fields/CheckField/index.tsx +3 -3
  76. package/src/components/Fields/CheckGroup/index.tsx +2 -2
  77. package/src/components/Fields/ComponentContainer/index.tsx +7 -6
  78. package/src/components/Fields/ComponentContainer/style.tsx +2 -2
  79. package/src/components/Fields/HeadingField/index.tsx +1 -1
  80. package/src/components/Fields/HiddenField/index.tsx +1 -1
  81. package/src/components/Fields/ImageField/index.tsx +10 -5
  82. package/src/components/Fields/MultiCheckSelect/index.tsx +3 -3
  83. package/src/components/Fields/NumberField/index.tsx +2 -1
  84. package/src/components/Fields/ReferenceField/ItemList/Item/index.tsx +5 -7
  85. package/src/components/Fields/ReferenceField/ItemList/Item/style.tsx +2 -2
  86. package/src/components/Fields/ReferenceField/ItemList/index.tsx +1 -1
  87. package/src/components/Fields/RichText/index.tsx +10 -6
  88. package/src/components/Fields/Select/index.tsx +2 -2
  89. package/src/components/Fields/SliderField/index.tsx +1 -1
  90. package/src/components/Fields/TextField/index.tsx +2 -7
  91. package/src/components/Fields/TimeField/HourInput/index.tsx +103 -0
  92. package/src/components/Fields/TimeField/HourInput/style.tsx +19 -0
  93. package/src/components/Fields/TimeField/HourInput/utils.tsx +35 -0
  94. package/src/components/Fields/TimeField/index.tsx +57 -0
  95. package/src/components/Fields/TimeField/style.tsx +37 -0
  96. package/src/components/Fields/index.tsx +2 -0
  97. package/src/components/FieldsBehavior/index.tsx +1 -1
  98. package/src/components/FloatingMenu/index.tsx +2 -2
  99. package/src/components/Gallery/GalleryFilters/Type/index.tsx +50 -0
  100. package/src/components/Gallery/GalleryFilters/Type/style.tsx +39 -0
  101. package/src/components/Gallery/GalleryPanel/DetailPanel/index.tsx +2 -1
  102. package/src/components/Gallery/GalleryPanel/GalleryDragAndDrop/style.tsx +3 -3
  103. package/src/components/Gallery/hooks.tsx +10 -4
  104. package/src/components/Gallery/index.tsx +2 -0
  105. package/src/components/Icon/index.tsx +1 -1
  106. package/src/components/IconAction/index.tsx +1 -1
  107. package/src/components/Lists/index.tsx +1 -1
  108. package/src/components/Loading/index.tsx +1 -1
  109. package/src/components/Pagination/index.tsx +1 -1
  110. package/src/components/SideModal/SideModalOption/index.tsx +4 -2
  111. package/src/components/SideModal/index.tsx +1 -1
  112. package/src/components/TableFilters/CategoryFilter/index.tsx +2 -2
  113. package/src/components/TableFilters/CategoryFilter/style.tsx +1 -10
  114. package/src/components/TableFilters/CustomizeFilters/index.tsx +2 -3
  115. package/src/components/TableFilters/DateFilter/index.tsx +4 -4
  116. package/src/components/TableFilters/LiveFilter/index.tsx +1 -1
  117. package/src/components/TableFilters/LiveFilter/style.tsx +2 -10
  118. package/src/components/TableFilters/NameFilter/index.tsx +4 -4
  119. package/src/components/TableFilters/SiteFilter/index.tsx +16 -13
  120. package/src/components/TableFilters/SiteFilter/style.tsx +1 -10
  121. package/src/components/TableFilters/StatusFilter/index.tsx +3 -3
  122. package/src/components/TableFilters/TranslationsFilter/index.tsx +4 -7
  123. package/src/components/TableFilters/TranslationsFilter/style.tsx +1 -10
  124. package/src/components/TableFilters/TypeFilter/index.tsx +2 -2
  125. package/src/components/TableFilters/TypeFilter/style.tsx +1 -10
  126. package/src/components/TableList/index.tsx +6 -6
  127. package/src/components/TableList/style.tsx +1 -1
  128. package/src/components/Tabs/index.tsx +19 -7
  129. package/src/components/Tag/index.tsx +6 -6
  130. package/src/components/Toast/index.tsx +4 -4
  131. package/src/components/Tooltip/index.tsx +5 -3
  132. package/src/components/index.tsx +2 -0
  133. package/src/containers/Navigation/Defaults/actions.tsx +10 -5
  134. package/src/containers/Navigation/Defaults/utils.tsx +13 -4
  135. package/src/containers/Sites/actions.tsx +7 -0
  136. package/src/containers/Sites/constants.tsx +1 -0
  137. package/src/containers/Sites/interfaces.tsx +6 -0
  138. package/src/containers/Sites/reducer.tsx +4 -0
  139. package/src/containers/StructuredData/actions.tsx +21 -8
  140. package/src/containers/StructuredData/constants.tsx +2 -0
  141. package/src/containers/StructuredData/interfaces.tsx +7 -1
  142. package/src/containers/StructuredData/reducer.tsx +5 -1
  143. package/src/helpers/fields.tsx +2 -2
  144. package/src/helpers/index.tsx +3 -0
  145. package/src/helpers/parseTheme.js +456 -0
  146. package/src/helpers/schemas.tsx +2 -2
  147. package/src/hooks/forms.tsx +2 -1
  148. package/src/modules/App/Routing/NavMenu/index.tsx +9 -1
  149. package/src/modules/Content/BulkHeader/TableHeader/index.tsx +1 -1
  150. package/src/modules/Content/hooks.tsx +19 -12
  151. package/src/modules/Content/index.tsx +23 -14
  152. package/src/modules/Navigation/Defaults/DefaultsEditor/Editor/DefaultsBrowser/index.tsx +3 -0
  153. package/src/modules/Navigation/Defaults/DefaultsEditor/Editor/index.tsx +3 -1
  154. package/src/modules/Navigation/Defaults/DefaultsEditor/index.tsx +16 -18
  155. package/src/modules/Navigation/Defaults/DefaultsEditor/utils.tsx +37 -0
  156. package/src/modules/StructuredData/Form/ConnectedField/index.tsx +3 -2
  157. package/src/modules/StructuredData/Form/index.tsx +22 -17
  158. package/src/modules/StructuredData/StructuredDataList/hooks.tsx +30 -20
  159. package/src/modules/StructuredData/StructuredDataList/index.tsx +24 -14
  160. package/src/types/index.tsx +8 -7
@@ -4,7 +4,7 @@ import { Icon, FloatingMenu, ListTitle, ListItem } from "@ax/components";
4
4
 
5
5
  import * as S from "./style";
6
6
 
7
- const DateFilter = (props: IStatusFilterProps): JSX.Element => {
7
+ const DateFilter = (props: IDateFilterProps): JSX.Element => {
8
8
  const { sortItems, sortedState } = props;
9
9
  const { isAscending, sortedByDate } = sortedState;
10
10
  const sortByModifiedDate = (isAscending: boolean) => sortItems("date", isAscending);
@@ -16,13 +16,13 @@ const DateFilter = (props: IStatusFilterProps): JSX.Element => {
16
16
  isAscending ? <Icon name="FullArrowUp" size="16" /> : <Icon name="FullArrowDown" size="16" />;
17
17
 
18
18
  const Header = () => (
19
- <S.Date isActive={sortedByDate}>
19
+ <S.Date isActive={sortedByDate} data-testid="date-filter">
20
20
  Date
21
21
  <S.IconsWrapper>
22
22
  {sortedByDate ? (
23
23
  <SortedStateArrow />
24
24
  ) : (
25
- <S.InteractiveArrow>
25
+ <S.InteractiveArrow data-testid="date-filter-interactive-arrow">
26
26
  <Icon name="DownArrow" size="16" />
27
27
  </S.InteractiveArrow>
28
28
  )}
@@ -43,7 +43,7 @@ const DateFilter = (props: IStatusFilterProps): JSX.Element => {
43
43
  );
44
44
  };
45
45
 
46
- interface IStatusFilterProps {
46
+ export interface IDateFilterProps {
47
47
  sortedState: any;
48
48
  sortItems(orderPointer: string, isAscendent: boolean): any;
49
49
  }
@@ -104,7 +104,7 @@ const LiveFilter = (props: ILiveFilterProps): JSX.Element => {
104
104
  );
105
105
  };
106
106
 
107
- interface ILiveFilterProps {
107
+ export interface ILiveFilterProps {
108
108
  filterItems(pointer: string, filter: string): void;
109
109
  value: string;
110
110
  isStructuredData?: boolean;
@@ -19,15 +19,6 @@ const IconsWrapper = styled.div`
19
19
  }
20
20
  `;
21
21
 
22
- const InteractiveArrow = styled.div`
23
- display: flex;
24
- svg {
25
- path {
26
- fill: ${(p) => p.theme.color.interactive01};
27
- }
28
- }
29
- `;
30
-
31
22
  const ChecksWrapper = styled.div`
32
23
  padding: ${(p) => p.theme.spacing.xs} ${(p) => p.theme.spacing.s} 0;
33
24
  `;
@@ -35,4 +26,5 @@ const ChecksWrapper = styled.div`
35
26
  const MenuWrapper = styled.div`
36
27
  position: relative;
37
28
  `;
38
- export { LiveOptions, IconsWrapper, InteractiveArrow, ChecksWrapper, MenuWrapper };
29
+
30
+ export { LiveOptions, IconsWrapper, ChecksWrapper, MenuWrapper };
@@ -20,13 +20,13 @@ const NameFilter = (props: INameFilterProps): JSX.Element => {
20
20
  const title = urlSorting ? "Name & URL" : "Name";
21
21
 
22
22
  const Header = () => (
23
- <S.NameHeader isActive={isActive}>
23
+ <S.NameHeader isActive={isActive} data-testid="name-filter-header">
24
24
  {title}
25
25
  <S.IconsWrapper>
26
26
  {isActive ? (
27
27
  <SortedStateArrow />
28
28
  ) : (
29
- <S.InteractiveArrow>
29
+ <S.InteractiveArrow data-testid="name-filter-interactive-arrow">
30
30
  <Icon name="DownArrow" size="16" />
31
31
  </S.InteractiveArrow>
32
32
  )}
@@ -46,7 +46,7 @@ const NameFilter = (props: INameFilterProps): JSX.Element => {
46
46
  {urlSorting && (
47
47
  <>
48
48
  <ListTitle>URL Sorting</ListTitle>
49
- <ListItem isSelected={sortedByURL} onClick={sortAscendingURL}>
49
+ <ListItem isSelected={sortedByURL} onClick={sortAscendingURL} >
50
50
  Ascendent
51
51
  </ListItem>
52
52
  </>
@@ -55,7 +55,7 @@ const NameFilter = (props: INameFilterProps): JSX.Element => {
55
55
  );
56
56
  };
57
57
 
58
- interface INameFilterProps {
58
+ export interface INameFilterProps {
59
59
  sortedState: any;
60
60
  sortItems(orderPointer: string, isAscendent: boolean): void;
61
61
  urlSorting?: boolean;
@@ -48,18 +48,21 @@ const SiteFilter = (props: ISiteFilterProps): JSX.Element => {
48
48
  };
49
49
 
50
50
  useEffect(() => {
51
- getSelectSites().then((items) => {
52
- items &&
53
- items.forEach((item: { value: string; label: string }) => {
54
- const newFilter = {
55
- name: item.value,
56
- value: item.value,
57
- title: item.label,
58
- };
59
- filters.push(newFilter);
60
- });
61
- setOptions(filters);
62
- });
51
+ getSelectSites()
52
+ .then((items) => {
53
+ items &&
54
+ items.forEach((item: { value: string; label: string }) => {
55
+ const newFilter = {
56
+ name: item.value,
57
+ value: item.value,
58
+ title: item.label,
59
+ };
60
+ filters.push(newFilter);
61
+ });
62
+
63
+ setOptions(filters);
64
+ })
65
+ .catch((apiError) => console.log(apiError));
63
66
  // eslint-disable-next-line react-hooks/exhaustive-deps
64
67
  }, []);
65
68
 
@@ -93,7 +96,7 @@ const SiteFilter = (props: ISiteFilterProps): JSX.Element => {
93
96
  );
94
97
  };
95
98
 
96
- interface ISiteFilterProps {
99
+ export interface ISiteFilterProps {
97
100
  filterItems(pointer: string, filter: string): void;
98
101
  value: any;
99
102
  pointer: string;
@@ -19,19 +19,10 @@ const IconsWrapper = styled.div`
19
19
  }
20
20
  `;
21
21
 
22
- const InteractiveArrow = styled.div`
23
- display: flex;
24
- svg {
25
- path {
26
- fill: ${(p) => p.theme.color.interactive01};
27
- }
28
- }
29
- `;
30
-
31
22
  const ChecksWrapper = styled.div`
32
23
  padding: ${(p) => p.theme.spacing.xs} ${(p) => p.theme.spacing.s};
33
24
  height: calc(${(p) => p.theme.spacing.xl} * 3.5);
34
25
  overflow-y: scroll;
35
26
  `;
36
27
 
37
- export { Site, IconsWrapper, InteractiveArrow, ChecksWrapper };
28
+ export { Site, IconsWrapper, ChecksWrapper };
@@ -17,13 +17,13 @@ const StatusFilter = (props: IStatusFilterProps) => {
17
17
  isAscending ? <Icon name="FullArrowUp" size="16" /> : <Icon name="FullArrowDown" size="16" />;
18
18
 
19
19
  const Header = () => (
20
- <S.Status isActive={sortedByDate}>
20
+ <S.Status isActive={sortedByDate} data-testid="status-filter-header">
21
21
  Status
22
22
  <S.IconsWrapper>
23
23
  {sortedByDate ? (
24
24
  <SortedStateArrow />
25
25
  ) : (
26
- <S.InteractiveArrow>
26
+ <S.InteractiveArrow data-testid="status-filter-interactive-arrow">
27
27
  <Icon name="DownArrow" size="16" />
28
28
  </S.InteractiveArrow>
29
29
  )}
@@ -44,7 +44,7 @@ const StatusFilter = (props: IStatusFilterProps) => {
44
44
  );
45
45
  };
46
46
 
47
- interface IStatusFilterProps {
47
+ export interface IStatusFilterProps {
48
48
  sortedState: any;
49
49
  sortItems(orderPointer: string, isAscendent: boolean): any;
50
50
  isStructuredData?: boolean;
@@ -28,9 +28,6 @@ const TranslationsFilter = (props: ITranslationsFilterProps): JSX.Element => {
28
28
  const [selectedValue, setSelectedValue] = useState([...initialState]);
29
29
 
30
30
  const setQuery = (selection: any) => {
31
- if (!selection.length) {
32
- selection = [selectAllOption];
33
- }
34
31
  setSelectedValue(selection);
35
32
  const queryFilters = selection.join("&");
36
33
  const pointer = "translated";
@@ -40,9 +37,9 @@ const TranslationsFilter = (props: ITranslationsFilterProps): JSX.Element => {
40
37
  const isActive = !areEquals(selectedValue, selectAllOption);
41
38
 
42
39
  const Header = () => (
43
- <S.Translations isActive={isActive}>
40
+ <S.Translations isActive={isActive} data-testid="translation-filter-header">
44
41
  Trans.
45
- <S.IconsWrapper>
42
+ <S.IconsWrapper data-testid="translation-filter-icons-wrapper">
46
43
  {isActive ? <Icon name="Filter" size="16" /> : <Icon name="DownArrow" size="16" />}
47
44
  </S.IconsWrapper>
48
45
  </S.Translations>
@@ -51,14 +48,14 @@ const TranslationsFilter = (props: ITranslationsFilterProps): JSX.Element => {
51
48
  return (
52
49
  <FloatingMenu Button={Header} position="left" closeOnSelect={true} isCheckGroup={true}>
53
50
  <ListTitle>Filter by translations</ListTitle>
54
- <S.ChecksWrapper>
51
+ <S.ChecksWrapper data-testid="translation-filter-checks-wrapper">
55
52
  <CheckGroup options={filters} value={selectedValue} onChange={setQuery} multipleSelection={false} />
56
53
  </S.ChecksWrapper>
57
54
  </FloatingMenu>
58
55
  );
59
56
  };
60
57
 
61
- interface ITranslationsFilterProps {
58
+ export interface ITranslationsFilterProps {
62
59
  filterItems(pointer: string, filter: string): void;
63
60
  value: string;
64
61
  }
@@ -19,17 +19,8 @@ const IconsWrapper = styled.div`
19
19
  }
20
20
  `;
21
21
 
22
- const InteractiveArrow = styled.div`
23
- display: flex;
24
- svg {
25
- path {
26
- fill: ${(p) => p.theme.color.interactive01};
27
- }
28
- }
29
- `;
30
-
31
22
  const ChecksWrapper = styled.div`
32
23
  padding: ${(p) => p.theme.spacing.xs} ${(p) => p.theme.spacing.s};
33
24
  `;
34
25
 
35
- export { Translations, IconsWrapper, InteractiveArrow, ChecksWrapper };
26
+ export { Translations, IconsWrapper, ChecksWrapper };
@@ -37,7 +37,7 @@ const TypeFilter = (props: ITypeFilterProps): JSX.Element => {
37
37
 
38
38
  return (
39
39
  <FloatingMenu Button={Header} position="left" closeOnSelect={true} isCheckGroup={true}>
40
- <ListTitle>Filter by type</ListTitle>
40
+ <ListTitle data-testid="type-filter-title">Filter by type</ListTitle>
41
41
  <S.ChecksWrapper>
42
42
  <CheckGroup
43
43
  options={filters}
@@ -57,7 +57,7 @@ interface IFilter {
57
57
  title: string;
58
58
  }
59
59
 
60
- interface ITypeFilterProps {
60
+ export interface ITypeFilterProps {
61
61
  filterItems(pointer: string, filter: string): void;
62
62
  filters: IFilter[];
63
63
  pointer: string;
@@ -19,17 +19,8 @@ const IconsWrapper = styled.div`
19
19
  }
20
20
  `;
21
21
 
22
- const InteractiveArrow = styled.div`
23
- display: flex;
24
- svg {
25
- path {
26
- fill: ${(p) => p.theme.color.interactive01};
27
- }
28
- }
29
- `;
30
-
31
22
  const ChecksWrapper = styled.div`
32
23
  padding: ${(p) => p.theme.spacing.xs} ${(p) => p.theme.spacing.s};
33
24
  `;
34
25
 
35
- export { Types, IconsWrapper, InteractiveArrow, ChecksWrapper };
26
+ export { Types, IconsWrapper, ChecksWrapper };
@@ -5,7 +5,7 @@ import { Loading, Pagination } from "@ax/components";
5
5
 
6
6
  import * as S from "./style";
7
7
 
8
- const TableList = (props: IPagesProps): JSX.Element => {
8
+ const TableList = (props: ITableListProps): JSX.Element => {
9
9
  const { tableHeader, children, pagination, isLoading, onScroll, hasFixedHeader, tableRef } = props;
10
10
 
11
11
  const { totalItems, setPage, itemsPerPage, currPage } = pagination;
@@ -13,11 +13,11 @@ const TableList = (props: IPagesProps): JSX.Element => {
13
13
  const showPagination = totalItems > itemsPerPage;
14
14
 
15
15
  return (
16
- <S.TableList onScroll={onScroll} ref={tableRef}>
17
- <S.Table hasFixedHeader={hasFixedHeader}>
16
+ <S.TableList onScroll={onScroll} ref={tableRef} data-testid="table-list">
17
+ <S.Table>
18
18
  <>
19
- <S.TableHeader hasFixedHeader={hasFixedHeader}>{tableHeader}</S.TableHeader>
20
- {isLoading ? <Loading /> : <S.TableBody>{children}</S.TableBody>}
19
+ <S.TableHeader hasFixedHeader={hasFixedHeader} data-testid="table-list-header">{tableHeader}</S.TableHeader>
20
+ {isLoading ? <Loading /> : <S.TableBody data-testid="table-body">{children}</S.TableBody>}
21
21
  </>
22
22
  </S.Table>
23
23
  <S.PaginationWrapper>
@@ -33,7 +33,7 @@ const mapStateToProps = (state: IRootState) => ({
33
33
  isLoading: state.app.isLoading,
34
34
  });
35
35
 
36
- interface IPagesProps {
36
+ export interface ITableListProps {
37
37
  tableHeader: JSX.Element | JSX.Element[];
38
38
  children: JSX.Element | JSX.Element[];
39
39
  pagination: {
@@ -6,7 +6,7 @@ const TableList = styled.div`
6
6
  overflow: auto;
7
7
  `;
8
8
 
9
- const Table = styled.div<{hasFixedHeader?: boolean}>`
9
+ const Table = styled.div`
10
10
  width: 100%;
11
11
  min-height: calc(100% - ${(p) => p.theme.spacing.l} - ${(p) => p.theme.spacing.m});
12
12
  padding-bottom: ${(p) => p.theme.spacing.m};
@@ -12,11 +12,17 @@ const Tabs = (props: ITabsProps): JSX.Element => {
12
12
 
13
13
  if (tabs) {
14
14
  return (
15
- <S.TabsRow isInAppBar={isInAppBar} noMargins={noMargins}>
15
+ <S.TabsRow isInAppBar={isInAppBar} noMargins={noMargins} data-testid="tabs-row">
16
16
  {tabs.map((tab: any) => {
17
17
  const handleClick = () => setSelectedTab(tab);
18
18
  return (
19
- <S.TabItem isInAppBar={isInAppBar} key={tab} active={tab === active} onClick={handleClick}>
19
+ <S.TabItem
20
+ isInAppBar={isInAppBar}
21
+ key={tab}
22
+ active={tab === active}
23
+ onClick={handleClick}
24
+ data-testid="tab"
25
+ >
20
26
  {tab}
21
27
  </S.TabItem>
22
28
  );
@@ -27,11 +33,17 @@ const Tabs = (props: ITabsProps): JSX.Element => {
27
33
 
28
34
  if (icons) {
29
35
  return (
30
- <S.TabsRow icons={true} isInAppBar={isInAppBar}>
36
+ <S.TabsRow icons={true} isInAppBar={isInAppBar} data-testid="icons-tabs-row">
31
37
  {icons.map((tab: ITabIcon) => {
32
38
  const handleClick = () => setSelectedTab(tab.name);
33
39
  return (
34
- <S.TabItem key={tab.name} active={tab.name === active} onClick={handleClick} inversed={inversed}>
40
+ <S.TabItem
41
+ key={tab.name}
42
+ active={tab.name === active}
43
+ onClick={handleClick}
44
+ inversed={inversed}
45
+ data-testid="icon-tab"
46
+ >
35
47
  <S.TabIcon>
36
48
  <Tooltip content={tab.text} bottom>
37
49
  <Icon name={tab.name} />
@@ -44,10 +56,10 @@ const Tabs = (props: ITabsProps): JSX.Element => {
44
56
  );
45
57
  }
46
58
 
47
- return <S.TabsRow />;
59
+ return <S.TabsRow data-testid="empty-tabs-row"/>;
48
60
  };
49
61
 
50
- interface ITabsProps {
62
+ export interface ITabsProps {
51
63
  tabs?: any[];
52
64
  icons?: ITabIcon[];
53
65
  isInAppBar?: boolean;
@@ -57,7 +69,7 @@ interface ITabsProps {
57
69
  inversed?: boolean;
58
70
  }
59
71
 
60
- interface ITabIcon {
72
+ export interface ITabIcon {
61
73
  name: string;
62
74
  text: string;
63
75
  }
@@ -13,7 +13,7 @@ const Tag = (props: ITagProps): JSX.Element => {
13
13
  };
14
14
 
15
15
  const deleteIcon = onDeleteAction ? (
16
- <S.IconWrapper onClick={handleClick} data-testid="tagComponent">
16
+ <S.IconWrapper onClick={handleClick} data-testid="delete-icon-wrapper">
17
17
  <Icon name="close" size="16" />
18
18
  </S.IconWrapper>
19
19
  ) : null;
@@ -21,18 +21,18 @@ const Tag = (props: ITagProps): JSX.Element => {
21
21
  switch (type) {
22
22
  case "status":
23
23
  return (
24
- <S.TagStatus>
24
+ <S.TagStatus data-testid="tag-status">
25
25
  <S.Bullet color={color} />
26
26
  {text}
27
27
  </S.TagStatus>
28
28
  );
29
29
  case "square":
30
- return <S.TagSquare color={color}>{text}</S.TagSquare>;
30
+ return <S.TagSquare color={color} data-testid="tag-square">{text}</S.TagSquare>;
31
31
  default:
32
32
  return (
33
- <S.TagFixed color={color}>
33
+ <S.TagFixed color={color} data-testid="tag-fixed">
34
34
  <S.TagText>
35
- <S.Title>{text}</S.Title>
35
+ <S.Title data-testid="tag-fixed-title">{text}</S.Title>
36
36
  {deleteIcon}
37
37
  </S.TagText>
38
38
  </S.TagFixed>
@@ -40,7 +40,7 @@ const Tag = (props: ITagProps): JSX.Element => {
40
40
  }
41
41
  };
42
42
 
43
- interface ITagProps {
43
+ export interface ITagProps {
44
44
  type?: "status" | "fixed" | "interactive" | "square" | undefined;
45
45
  text: string;
46
46
  color?: string;
@@ -5,7 +5,7 @@ import { Button, IconAction } from "@ax/components";
5
5
 
6
6
  import * as S from "./style";
7
7
 
8
- const Toast = (props: IProps) => {
8
+ const Toast = (props: IToastProps) => {
9
9
  const { action, message, setIsVisible } = props;
10
10
  const toast = useRef<any>(null);
11
11
 
@@ -24,8 +24,8 @@ const Toast = (props: IProps) => {
24
24
  }, []);
25
25
 
26
26
  return createPortal(
27
- <S.Wrapper ref={toast}>
28
- <S.Text data-testid="toastMessage">{message}</S.Text>
27
+ <S.Wrapper ref={toast} data-testid="toast-wrapper">
28
+ <S.Text data-testid="toast-message">{message}</S.Text>
29
29
  <S.Buttons>
30
30
  {action &&
31
31
  <Button type="button" buttonStyle="lineInverse" onClick={action}>
@@ -39,7 +39,7 @@ const Toast = (props: IProps) => {
39
39
  );
40
40
  };
41
41
 
42
- interface IProps {
42
+ export interface IToastProps {
43
43
  action?: () => void;
44
44
  message: string;
45
45
  setIsVisible: (visibility: boolean) => void;
@@ -3,7 +3,7 @@ import { useHandleClickOutside } from "@ax/hooks";
3
3
 
4
4
  import * as S from "./style";
5
5
 
6
- const Tooltip = (props: IProps): JSX.Element => {
6
+ const Tooltip = (props: ITooltipProps): JSX.Element => {
7
7
  const { content, children, hideOnClick = true, bottom, left } = props;
8
8
 
9
9
  const initialState: IState = {
@@ -64,6 +64,7 @@ const Tooltip = (props: IProps): JSX.Element => {
64
64
  useEffect(() => {
65
65
  if (active && tipRef.current) {
66
66
  const clientRect = tipRef.current.getBoundingClientRect();
67
+
67
68
  const { left, right } = clientRect;
68
69
  const windowSize = window.innerWidth;
69
70
  if (left < 0) {
@@ -78,9 +79,10 @@ const Tooltip = (props: IProps): JSX.Element => {
78
79
  if (!content) return children;
79
80
 
80
81
  return (
81
- <S.Tooltip data-testid="tooltipComponent" onMouseEnter={showTip} onMouseLeave={hideTip} onMouseDown={handleClick}>
82
+ <S.Tooltip data-testid="tooltip-component" onMouseEnter={showTip} onMouseLeave={hideTip} onMouseDown={handleClick}>
82
83
  <div ref={childrenRef}>{children}</div>
83
84
  <S.Tip
85
+ data-testid="tip-component"
84
86
  active={active}
85
87
  childrenWidth={childrenWidth}
86
88
  bottom={bottom}
@@ -101,7 +103,7 @@ interface IState {
101
103
  fixOutOfBounds: number;
102
104
  }
103
105
 
104
- interface IProps {
106
+ export interface ITooltipProps {
105
107
  content: string | boolean | undefined;
106
108
  children: any;
107
109
  hideOnClick?: boolean;
@@ -23,6 +23,7 @@ import {
23
23
  Select,
24
24
  TextArea,
25
25
  TextField,
26
+ TimeField,
26
27
  ToggleField,
27
28
  UniqueCheck,
28
29
  UrlField,
@@ -117,6 +118,7 @@ export {
117
118
  Select,
118
119
  TextArea,
119
120
  TextField,
121
+ TimeField,
120
122
  ToggleField,
121
123
  UniqueCheck,
122
124
  UrlField,
@@ -24,7 +24,7 @@ import {
24
24
 
25
25
  import { appActions } from "@ax/containers/App";
26
26
 
27
- import { getStateValues } from "./utils";
27
+ import { getFormData, getStateValues } from "./utils";
28
28
 
29
29
  import {
30
30
  SET_EDITOR_CONTENT,
@@ -221,7 +221,7 @@ function getNavigationByType(type: string): (dispatch: Dispatch, getState: any)
221
221
  };
222
222
  }
223
223
 
224
- function createNavigation(): (dispatch: Dispatch, getState: any) => Promise<boolean> {
224
+ function createNavigation(image: File | null): (dispatch: Dispatch, getState: any) => Promise<boolean> {
225
225
  return async (dispatch, getState) => {
226
226
  try {
227
227
  const {
@@ -237,6 +237,8 @@ function createNavigation(): (dispatch: Dispatch, getState: any) => Promise<bool
237
237
  const navigationValues = { ...editorContent, site: currentSiteInfo.id, language: lang.id };
238
238
  const cleanValues = removeEditorIds(navigationValues);
239
239
 
240
+ const form = getFormData(cleanValues, image);
241
+
240
242
  const successAction = async (response: any) => {
241
243
  const updatedContent = { ...editorContent, ...response };
242
244
  generateContent(updatedContent, dispatch, getState);
@@ -248,7 +250,7 @@ function createNavigation(): (dispatch: Dispatch, getState: any) => Promise<bool
248
250
  handleError: (response: any) => appActions.handleError(response)(dispatch),
249
251
  };
250
252
 
251
- const callback = async () => navigation.createNavigation(cleanValues);
253
+ const callback = async () => navigation.createNavigation(form);
252
254
 
253
255
  return await handleRequest(callback, responseActions, [appActions.setIsSaving])(dispatch);
254
256
  } catch (e) {
@@ -261,7 +263,8 @@ function createNavigation(): (dispatch: Dispatch, getState: any) => Promise<bool
261
263
  function updateNavigation(
262
264
  navID: number,
263
265
  data: any,
264
- fromEditor?: boolean
266
+ fromEditor?: boolean,
267
+ image?: File | null
265
268
  ): (dispatch: Dispatch, getState: any) => Promise<boolean> {
266
269
  return async (dispatch, getState) => {
267
270
  try {
@@ -272,6 +275,8 @@ function updateNavigation(
272
275
 
273
276
  const cleanValues = removeEditorIds(data);
274
277
 
278
+ const form = getFormData(cleanValues, image);
279
+
275
280
  const successAction = async (response: any) => {
276
281
  if (fromEditor) {
277
282
  generateContent(response, dispatch, getState);
@@ -284,7 +289,7 @@ function updateNavigation(
284
289
  handleError: (response: any) => appActions.handleError(response)(dispatch),
285
290
  };
286
291
 
287
- const callback = async () => navigation.updateNavigation(navID, cleanValues);
292
+ const callback = async () => navigation.updateNavigation(navID, form);
288
293
 
289
294
  return await handleRequest(callback, responseActions, [appActions.setIsSaving])(dispatch);
290
295
  } catch (e) {
@@ -1,4 +1,4 @@
1
- export const getStateValues = (getState: any) => {
1
+ const getStateValues = (getState: any) => {
2
2
  const {
3
3
  sites: { currentSiteInfo },
4
4
  navigation: {
@@ -10,9 +10,9 @@ export const getStateValues = (getState: any) => {
10
10
  footer,
11
11
  isNewTranslation,
12
12
  currentDefaultsContent,
13
- selectedContent
13
+ selectedContent,
14
14
  },
15
- app: { isSaving, isLoading }
15
+ app: { isSaving, isLoading },
16
16
  } = getState();
17
17
  const section = editorContent && editorContent[0];
18
18
  const { modules } = !!section && section;
@@ -31,6 +31,15 @@ export const getStateValues = (getState: any) => {
31
31
  isLoading,
32
32
  section,
33
33
  modules,
34
- selectedContent
34
+ selectedContent,
35
35
  };
36
36
  };
37
+
38
+ const getFormData = (values: any, image?: File | null): FormData => {
39
+ const form = new FormData();
40
+ form.append("navigation", JSON.stringify(values));
41
+ image && form.append("file", image);
42
+ return form;
43
+ };
44
+
45
+ export { getStateValues, getFormData };
@@ -10,6 +10,7 @@ import {
10
10
  SET_SAVED_SITE_INFO,
11
11
  DEFAULT_PARAMS,
12
12
  SET_CURRENT_SITE_ERROR_PAGES,
13
+ SET_CONTENT_FILTERS,
13
14
  } from "./constants";
14
15
  import {
15
16
  ISetSitesAction,
@@ -21,6 +22,7 @@ import {
21
22
  ISetCurrentSiteLanguagesAction,
22
23
  ISetSavedSiteInfoAction,
23
24
  ISetCurrentSiteErrorPages,
25
+ ISetContentFilters,
24
26
  } from "./interfaces";
25
27
 
26
28
  import { ISite, IGetSitePagesParams, ISettingsForm, IGetGlobalPagesParams, IPage } from "@ax/types";
@@ -77,6 +79,10 @@ function setCurrentSiteErrorPages(currentSiteErrorPages: number[]): ISetCurrentS
77
79
  return { type: SET_CURRENT_SITE_ERROR_PAGES, payload: { currentSiteErrorPages } };
78
80
  }
79
81
 
82
+ function setContentFilters(contentFilters: Record<string, string> | null): ISetContentFilters {
83
+ return { type: SET_CONTENT_FILTERS, payload: { contentFilters } };
84
+ }
85
+
80
86
  // TODO: hay que controlar que cuando da error la API borrar los sites ya guardados y sacar el error (ver los siguientes FIXME)
81
87
  function getSites(): (dispatch: Dispatch) => Promise<void> {
82
88
  return async (dispatch) => {
@@ -507,4 +513,5 @@ export {
507
513
  removeUsersBulk,
508
514
  setCurrentSiteErrorPages,
509
515
  resetCurrentSiteErrorPages,
516
+ setContentFilters,
510
517
  };
@@ -10,6 +10,7 @@ export const SET_CURRENT_SITE_LANGUAGES: string | null = `${NAME}/SET_CURRENT_SI
10
10
  export const SET_INITIAL_VALUES = `${NAME}/SET_INITIAL_VALUES`;
11
11
  export const SET_SAVED_SITE_INFO = `${NAME}/SET_SAVED_SITE_INFO`;
12
12
  export const SET_CURRENT_SITE_ERROR_PAGES = `${NAME}/SET_CURRENT_SITE_ERROR_PAGES`;
13
+ export const SET_CONTENT_FILTERS = `${NAME}/SET_CONTENT_FILTERS`;
13
14
 
14
15
  export const ITEMS_PER_PAGE = 50;
15
16