@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.
- package/config/jest/componentsMock.js +0 -26
- package/package.json +4 -3
- package/src/Style/index.tsx +1 -1
- package/src/__tests__/components/ElementsTooltip/ElementsTooltip.test.tsx +97 -0
- package/src/__tests__/components/EmptyState/EmptyState.test.tsx +78 -0
- package/src/__tests__/components/FieldContainer/FieldContainer.test.tsx +82 -0
- package/src/__tests__/components/Fields/AnalyticsField/AnalyticsField.test.tsx +1 -1
- package/src/__tests__/components/Fields/AnalyticsField/PageAnalytics/PageAnalytics.test.tsx +1 -15
- package/src/__tests__/components/Fields/AnalyticsField/StructuredDataAnalytics/StructuredDataAnalytics.test.tsx +1 -16
- package/src/__tests__/components/Fields/ArrayFieldGroup/ArrayFieldGroup.test.tsx +8 -17
- package/src/__tests__/components/Fields/AsyncCheckGroup/AsyncCheckGroup.test.tsx +4 -16
- package/src/__tests__/components/Fields/AsyncSelect/AsyncSelect.test.tsx +2 -20
- package/src/__tests__/components/Fields/CheckField/CheckField.test.tsx +6 -6
- package/src/__tests__/components/Fields/CheckGroup/CheckGroup.test.tsx +15 -15
- package/src/__tests__/components/Fields/ColorPicker/ColorPicker.test.tsx +7 -16
- package/src/__tests__/components/Fields/ComponentArray/ComponentArray.test.tsx +2 -23
- package/src/__tests__/components/Fields/ComponentArray/MixableComponentArray/MixableComponentArray.test.tsx +11 -31
- package/src/__tests__/components/Fields/ComponentArray/MixableComponentArray/PasteModuleButton/PasteModuleButton.test.tsx +15 -21
- package/src/__tests__/components/Fields/ComponentArray/SameComponentArray/SameComponentArray.test.tsx +6 -25
- package/src/__tests__/components/Fields/ComponentContainer/ComponentContainer.test.tsx +559 -0
- package/src/__tests__/components/Fields/ConditionalField/ConditionalField.test.tsx +1 -1
- package/src/__tests__/components/Fields/DateField/DateField.test.tsx +1 -1
- package/src/__tests__/components/Fields/FieldGroup/FieldGroup.test.tsx +1 -1
- package/src/__tests__/components/Fields/FieldsDivider/FieldsDivider.test.tsx +1 -1
- package/src/__tests__/components/Fields/FileField/FileField.test.tsx +3 -3
- package/src/__tests__/components/Fields/HeadingField/HeadingField.test.tsx +6 -6
- package/src/__tests__/components/Fields/HiddenField/HiddenField.test.tsx +2 -8
- package/src/__tests__/components/Fields/ImageField/ImageField.test.tsx +471 -0
- package/src/__tests__/components/Fields/MultiCheckSelect/MultiCheckSelect.test.tsx +2 -16
- package/src/__tests__/components/Fields/MultiCheckSelectGroup/MultiCheckSelectGroup.test.tsx +2 -2
- package/src/__tests__/components/Fields/NoteField/NoteField.test.tsx +2 -7
- package/src/__tests__/components/Fields/NumberField/NumberField.test.tsx +2 -15
- package/src/__tests__/components/Fields/RadioField/RadioField.test.tsx +2 -12
- package/src/__tests__/components/Fields/ReferenceField/ReferenceField.test.tsx +171 -19
- package/src/__tests__/components/Fields/RichText/RichText.test.tsx +2 -13
- package/src/__tests__/components/Fields/Select/Select.test.tsx +3 -23
- package/src/__tests__/components/Fields/SliderField/SliderField.test.tsx +2 -15
- package/src/__tests__/components/Fields/TagField/TagField.test.tsx +4 -4
- package/src/__tests__/components/Fields/TextArea/TextArea.test.tsx +1 -1
- package/src/__tests__/components/Fields/TextField/TextField.test.tsx +6 -6
- 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 +2 -10
- package/src/__tests__/components/Fields/Tooltip/Tooltip.test.tsx +152 -0
- package/src/__tests__/components/Fields/UniqueCheck/UniqueCheck.test.tsx +3 -3
- package/src/__tests__/components/Fields/UrlField/UrlField.test.tsx +4 -4
- package/src/__tests__/components/Fields/VisualUniqueSelection/ImageSelection/ImageSelection.test.tsx +2 -14
- package/src/__tests__/components/Fields/VisualUniqueSelection/ScrollableSelection/ScrollableSelection.test.tsx +6 -20
- package/src/__tests__/components/Fields/VisualUniqueSelection/VisualUniqueSelection.test.tsx +3 -29
- package/src/__tests__/components/Fields/Wysiwyg/Wysiwyg.test.tsx +1 -1
- package/src/__tests__/components/FieldsBehavior/FieldsBehavior.test.tsx +149 -0
- package/src/__tests__/components/TableFilters/CategoryFilter/CategoryFilter.test.tsx +241 -0
- package/src/__tests__/components/TableFilters/CustomizeFilters/CustomizeFilters.test.tsx +131 -0
- package/src/__tests__/components/TableFilters/DateFilter/DateFilter.test.tsx +148 -0
- package/src/__tests__/components/TableFilters/LiveFilter/LiveFilter.test.tsx +265 -0
- package/src/__tests__/components/TableFilters/NameFilter/NameFilter.test.tsx +197 -0
- package/src/__tests__/components/TableFilters/SiteFilter/SiteFilter.test.tsx +317 -0
- package/src/__tests__/components/TableFilters/StatusFilter/StatusFilter.test.tsx +197 -0
- package/src/__tests__/components/TableFilters/TranslationsFilter/TranslationsFilter.test.tsx +157 -0
- package/src/__tests__/components/TableFilters/TypeFilter/TypeFilter.test.tsx +164 -0
- package/src/__tests__/components/TableList/TableList.test.tsx +119 -0
- package/src/__tests__/components/Tabs/Tabs.test.tsx +205 -0
- package/src/__tests__/components/Tag/Tag.test.tsx +140 -0
- package/src/__tests__/components/Toast/Toast.test.tsx +102 -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/FieldContainer/index.tsx +3 -3
- 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/CheckField/index.tsx +3 -3
- package/src/components/Fields/CheckGroup/index.tsx +2 -2
- package/src/components/Fields/ComponentContainer/index.tsx +7 -6
- package/src/components/Fields/ComponentContainer/style.tsx +2 -2
- package/src/components/Fields/HeadingField/index.tsx +1 -1
- 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 +2 -2
- package/src/components/Fields/SliderField/index.tsx +1 -1
- package/src/components/Fields/TextField/index.tsx +2 -7
- 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/FieldsBehavior/index.tsx +1 -1
- package/src/components/FloatingMenu/index.tsx +2 -2
- 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/IconAction/index.tsx +1 -1
- package/src/components/Lists/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/TableFilters/CategoryFilter/index.tsx +2 -2
- package/src/components/TableFilters/CategoryFilter/style.tsx +1 -10
- package/src/components/TableFilters/CustomizeFilters/index.tsx +2 -3
- package/src/components/TableFilters/DateFilter/index.tsx +4 -4
- package/src/components/TableFilters/LiveFilter/index.tsx +1 -1
- package/src/components/TableFilters/LiveFilter/style.tsx +2 -10
- package/src/components/TableFilters/NameFilter/index.tsx +4 -4
- package/src/components/TableFilters/SiteFilter/index.tsx +16 -13
- package/src/components/TableFilters/SiteFilter/style.tsx +1 -10
- package/src/components/TableFilters/StatusFilter/index.tsx +3 -3
- package/src/components/TableFilters/TranslationsFilter/index.tsx +4 -7
- package/src/components/TableFilters/TranslationsFilter/style.tsx +1 -10
- package/src/components/TableFilters/TypeFilter/index.tsx +2 -2
- package/src/components/TableFilters/TypeFilter/style.tsx +1 -10
- 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/index.tsx +3 -0
- package/src/helpers/parseTheme.js +456 -0
- 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
|
@@ -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:
|
|
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
|
|
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
|
-
|
|
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()
|
|
52
|
-
items
|
|
53
|
-
items
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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="
|
|
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:
|
|
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="
|
|
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
|
|
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:
|
|
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="
|
|
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
|
|
106
|
+
export interface ITooltipProps {
|
|
105
107
|
content: string | boolean | undefined;
|
|
106
108
|
children: any;
|
|
107
109
|
hideOnClick?: boolean;
|
package/src/components/index.tsx
CHANGED
|
@@ -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(
|
|
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,
|
|
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
|
-
|
|
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
|
|