@griddo/ax 1.63.5 → 1.64.2
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/griddo-config/cx-polyfills/builder.ssr.js +6 -0
- package/config/griddo-config/cx-polyfills/componentsBundle.js +4 -0
- package/config/{griddo-config.js → griddo-config/index.js} +36 -15
- package/config/griddo-config/ssrHelpers.js +47 -0
- package/config/jest/componentsMock.js +29 -0
- package/config/jest/fileMock.js +1 -0
- package/config/jest/setup.js +5 -0
- package/config/jest/styleMock.js +1 -0
- package/config/jest/test-utils.js +17 -0
- package/config/paths.js +36 -5
- package/config/webpack.config.js +1 -1
- package/config/webpackDevServer.config.js +4 -1
- package/config/webpackSchemas.config.js +4 -1
- package/package.json +33 -59
- package/scripts/build.js +9 -2
- package/src/__mocks__/reducers/analyticsState.tsx +14 -0
- package/src/__mocks__/reducers/pageEditor.tsx +30 -0
- package/src/api/sites.tsx +28 -6
- package/src/api/structuredData.tsx +1 -1
- package/src/api/users.tsx +5 -4
- package/src/components/ActionMenu/style.tsx +2 -0
- package/src/components/Browser/index.tsx +9 -5
- package/src/{modules/Content/PageItem/atoms.tsx → components/CategoryCell/index.tsx} +4 -6
- package/src/components/CategoryCell/style.tsx +11 -0
- package/src/components/Fields/AnalyticsField/PageAnalytics/index.tsx +19 -19
- package/src/components/Fields/AnalyticsField/StructuredDataAnalytics/atoms.tsx +26 -16
- package/src/components/Fields/AnalyticsField/StructuredDataAnalytics/index.tsx +8 -13
- package/src/components/Fields/AnalyticsField/index.test.tsx +100 -0
- package/src/components/Fields/AnalyticsField/index.tsx +9 -2
- package/src/components/Fields/AnalyticsField/utils.tsx +2 -2
- package/src/components/Fields/ArrayFieldGroup/ArrayFieldItem/style.tsx +2 -1
- package/src/components/Fields/CheckField/index.test.tsx +95 -0
- package/src/components/Fields/CheckField/index.tsx +9 -3
- package/src/components/Fields/CheckField/style.tsx +32 -24
- package/src/components/Fields/CheckGroup/index.test.tsx +274 -0
- package/src/components/Fields/CheckGroup/index.tsx +2 -1
- package/src/components/Fields/FileField/FileDragAndDrop/style.tsx +3 -2
- package/src/components/Fields/FileField/style.tsx +2 -1
- package/src/components/Fields/MultiCheckSelect/style.tsx +18 -18
- package/src/components/Fields/NoteField/style.tsx +9 -9
- package/src/components/Fields/ReferenceField/AutoPanel/AutoItem/index.tsx +1 -1
- package/src/components/Fields/Select/style.tsx +41 -37
- package/src/components/Fields/TagField/index.test.tsx +136 -0
- package/src/components/Fields/TagField/index.tsx +8 -12
- package/src/components/Fields/TextArea/index.test.tsx +69 -0
- package/src/components/Fields/TextArea/index.tsx +4 -13
- package/src/components/Fields/TextArea/style.tsx +2 -2
- package/src/components/Fields/TextField/index.test.tsx +144 -0
- package/src/components/Fields/TextField/index.tsx +23 -19
- package/src/components/Fields/TextField/style.tsx +16 -7
- package/src/components/Fields/UniqueCheck/index.test.tsx +43 -0
- package/src/components/Fields/UrlField/utils.tsx +8 -6
- package/src/components/FieldsBehavior/index.tsx +0 -2
- package/src/components/FieldsBehavior/style.tsx +21 -21
- package/src/components/Gallery/GalleryFilters/Orientation/style.tsx +2 -1
- package/src/components/Gallery/GalleryFilters/SortBy/style.tsx +2 -1
- package/src/components/Icon/index.tsx +12 -10
- package/src/components/IconAction/index.tsx +7 -1
- package/src/components/IconAction/style.tsx +10 -10
- package/src/components/SearchField/index.tsx +11 -8
- package/src/components/SearchField/style.tsx +21 -12
- package/src/components/TableFilters/CategoryFilter/index.tsx +1 -1
- package/src/components/TableFilters/CategoryFilter/style.tsx +2 -1
- package/src/components/TableFilters/DateFilter/style.tsx +2 -1
- package/src/components/TableFilters/LiveFilter/index.tsx +2 -2
- package/src/components/TableFilters/LiveFilter/style.tsx +2 -1
- package/src/components/TableFilters/NameFilter/style.tsx +2 -1
- package/src/components/TableFilters/SiteFilter/index.tsx +38 -24
- package/src/components/TableFilters/SiteFilter/style.tsx +2 -1
- package/src/components/TableFilters/StatusFilter/style.tsx +2 -1
- package/src/components/TableFilters/TranslationsFilter/style.tsx +2 -1
- package/src/components/TableFilters/TypeFilter/style.tsx +2 -1
- package/src/components/Tag/index.tsx +9 -7
- package/src/components/Tag/style.tsx +20 -8
- package/src/components/index.tsx +4 -2
- package/src/containers/App/reducer.tsx +0 -2
- package/src/containers/PageEditor/actions.tsx +2 -2
- package/src/containers/Sites/actions.tsx +30 -19
- package/src/containers/Users/actions.tsx +10 -2
- package/src/containers/Users/reducer.tsx +3 -1
- package/src/helpers/fields.tsx +2 -4
- package/src/helpers/index.tsx +3 -0
- package/src/helpers/themes.tsx +9 -0
- package/src/modules/Analytics/GroupPanel/utils.tsx +3 -3
- package/src/modules/App/Routing/NavMenu/index.tsx +13 -12
- package/src/modules/Content/PageItem/index.tsx +31 -9
- package/src/modules/Content/PageItem/style.tsx +0 -7
- package/src/modules/Content/atoms.tsx +78 -0
- package/src/modules/Content/index.tsx +104 -33
- package/src/modules/Content/style.tsx +10 -7
- package/src/modules/GlobalEditor/PageBrowser/index.tsx +0 -4
- package/src/modules/GlobalEditor/index.tsx +3 -3
- package/src/modules/Navigation/Defaults/DefaultsEditor/Editor/DefaultsBrowser/index.tsx +0 -4
- package/src/modules/PageEditor/PageBrowser/index.tsx +0 -4
- package/src/modules/PageEditor/atoms.tsx +74 -0
- package/src/modules/PageEditor/index.tsx +30 -9
- package/src/modules/PageEditor/style.tsx +4 -0
- package/src/modules/PublicPreview/index.tsx +3 -5
- package/src/modules/Settings/ContentTypes/DataPacks/Config/Form/TemplateConfig/TemplateEditor/Editor/TemplateBrowser/index.tsx +0 -4
- package/src/modules/Settings/ContentTypes/DataPacks/Config/Form/TemplateConfig/TemplateEditor/Editor/index.tsx +2 -3
- package/src/modules/Settings/ContentTypes/DataPacks/Config/Form/index.tsx +1 -1
- package/src/modules/Settings/Globals/index.tsx +3 -3
- package/src/modules/StructuredData/Form/index.tsx +2 -4
- package/src/modules/StructuredData/StructuredDataList/BulkHeader/TableHeader/index.tsx +22 -18
- package/src/modules/StructuredData/StructuredDataList/GlobalPageItem/atoms.tsx +3 -24
- package/src/modules/StructuredData/StructuredDataList/GlobalPageItem/index.tsx +2 -2
- package/src/modules/StructuredData/StructuredDataList/GlobalPageItem/style.tsx +0 -7
- package/src/modules/StructuredData/StructuredDataList/OptionTable/index.tsx +2 -4
- package/src/modules/StructuredData/StructuredDataList/StructuredDataItem/index.tsx +46 -14
- package/src/modules/StructuredData/StructuredDataList/hooks.tsx +21 -9
- package/src/modules/StructuredData/StructuredDataList/index.tsx +48 -20
- package/src/modules/Users/Profile/index.tsx +12 -7
- package/src/modules/Users/UserCreate/SiteItem/index.tsx +44 -0
- package/src/modules/Users/UserCreate/SiteItem/style.tsx +30 -0
- package/src/modules/Users/UserCreate/index.tsx +120 -10
- package/src/modules/Users/UserCreate/style.tsx +54 -1
- package/src/modules/Users/UserEdit/index.tsx +53 -15
- package/src/modules/Users/UserForm/index.tsx +152 -5
- package/src/modules/Users/UserForm/style.tsx +40 -2
- package/src/modules/Users/UserList/BulkHeader/TableHeader/index.tsx +40 -2
- package/src/modules/Users/UserList/BulkHeader/TableHeader/style.tsx +0 -1
- package/src/modules/Users/UserList/BulkHeader/index.tsx +10 -1
- package/src/modules/Users/UserList/UserItem/index.tsx +70 -15
- package/src/modules/Users/UserList/hooks.tsx +58 -1
- package/src/modules/Users/UserList/index.tsx +80 -34
- package/src/modules/Users/index.tsx +18 -11
- package/src/routes/site.tsx +8 -0
- package/src/types/index.tsx +7 -0
- package/tsconfig.json +2 -0
- package/scripts/test.js +0 -45
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { useState } from "react";
|
|
2
|
+
import { IUsersQueryValues } from "@ax/types";
|
|
2
3
|
|
|
3
4
|
const useSortedListStatus = () => {
|
|
4
5
|
const sortedInitialState: {isAscending: boolean; sortedByName: boolean; sortedByDateCreated: boolean;} = {
|
|
@@ -15,4 +16,60 @@ const useSortedListStatus = () => {
|
|
|
15
16
|
};
|
|
16
17
|
};
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
const useFilterQuery = (): IUseFilterQuery => {
|
|
20
|
+
const initialQueryValues = {
|
|
21
|
+
order: "",
|
|
22
|
+
filterSites: "noFilter",
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const [query, setQuery] = useState(initialQueryValues);
|
|
26
|
+
|
|
27
|
+
const setFilterQuery = (filterValues: IUsersQueryValues) => {
|
|
28
|
+
const { order, filterSites } = filterValues;
|
|
29
|
+
let filterQuery = "";
|
|
30
|
+
|
|
31
|
+
const currentQuery = (pointer: string, values: string) => {
|
|
32
|
+
return filterQuery ? filterQuery.concat(`&${pointer}=${values}`) : `?${pointer}=${values}`;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const isNotInitialValue = (pointer: keyof IUsersQueryValues ) => {
|
|
36
|
+
return filterValues[pointer] && initialQueryValues[pointer] !== filterValues[pointer];
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
if (isNotInitialValue("order")) filterQuery = currentQuery("order", order);
|
|
40
|
+
if (isNotInitialValue("filterSites")) filterQuery = currentQuery("filterSites", filterSites);
|
|
41
|
+
|
|
42
|
+
return filterQuery;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const setFiltersSelection = (pointer: string, filter: string, isAscendent?: boolean) => {
|
|
46
|
+
const { order, filterSites } = query;
|
|
47
|
+
const orderMethod = isAscendent ? "asc" : "desc";
|
|
48
|
+
const filterValues = {
|
|
49
|
+
order: pointer === "order" ? `${filter}-${orderMethod}` : order,
|
|
50
|
+
filterSites: pointer === "filterSites" ? filter : filterSites,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
setQuery(filterValues);
|
|
54
|
+
|
|
55
|
+
return filterValues;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const resetFilterQuery = () => setQuery(initialQueryValues);
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
setFiltersSelection,
|
|
62
|
+
setFilterQuery,
|
|
63
|
+
resetFilterQuery,
|
|
64
|
+
filterValues: query,
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
interface IUseFilterQuery {
|
|
69
|
+
setFiltersSelection(pointer: string, filter: string, isAscendent?: boolean): IUsersQueryValues;
|
|
70
|
+
setFilterQuery(filterValues: IUsersQueryValues): string;
|
|
71
|
+
resetFilterQuery(): void;
|
|
72
|
+
filterValues: IUsersQueryValues;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export { useSortedListStatus, useFilterQuery };
|
|
@@ -1,21 +1,35 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { useEffect, useRef, useState } from "react";
|
|
2
2
|
import { connect } from "react-redux";
|
|
3
3
|
|
|
4
|
-
import { IRootState, IUser } from "@ax/types";
|
|
4
|
+
import { IRootState, IUser, ISite } from "@ax/types";
|
|
5
5
|
import { useBulkSelection, useModal } from "@ax/hooks";
|
|
6
6
|
import { appActions } from "@ax/containers/App";
|
|
7
7
|
import { usersActions } from "@ax/containers/Users";
|
|
8
|
+
import { sitesActions } from "@ax/containers/Sites";
|
|
9
|
+
|
|
8
10
|
import { MainWrapper, TableList, ErrorToast, EmptyState, Modal, Nav } from "@ax/components";
|
|
9
11
|
|
|
10
12
|
import BulkHeader from "./BulkHeader";
|
|
11
13
|
import UserItem from "./UserItem";
|
|
12
|
-
import { useSortedListStatus } from "./hooks";
|
|
14
|
+
import { useFilterQuery, useSortedListStatus } from "./hooks";
|
|
13
15
|
import { getSortedListStatus } from "./utils";
|
|
14
16
|
|
|
15
17
|
import * as S from "./style";
|
|
16
18
|
|
|
17
19
|
const UserList = (props: IProps): JSX.Element => {
|
|
18
|
-
const {
|
|
20
|
+
const {
|
|
21
|
+
currentSiteInfo,
|
|
22
|
+
users,
|
|
23
|
+
getUsers,
|
|
24
|
+
navItems,
|
|
25
|
+
currentNavItem,
|
|
26
|
+
setHistoryPush,
|
|
27
|
+
getUser,
|
|
28
|
+
resetUserData,
|
|
29
|
+
sites,
|
|
30
|
+
deleteUser,
|
|
31
|
+
removeUsersBulk,
|
|
32
|
+
} = props;
|
|
19
33
|
|
|
20
34
|
const itemsPerPage = 50;
|
|
21
35
|
const firstPage = 1;
|
|
@@ -23,13 +37,25 @@ const UserList = (props: IProps): JSX.Element => {
|
|
|
23
37
|
const [page, setPage] = useState(1);
|
|
24
38
|
const [isScrolling, setIsScrolling] = useState(false);
|
|
25
39
|
const [searchQuery, setSearchQuery] = useState<string>("");
|
|
40
|
+
const [currentFilterQuery, setCurrentFilterQuery] = useState("");
|
|
41
|
+
|
|
26
42
|
const { sortedListStatus, setSortedListStatus } = useSortedListStatus();
|
|
43
|
+
const { setFiltersSelection, setFilterQuery, filterValues } = useFilterQuery();
|
|
44
|
+
|
|
27
45
|
const tableRef = useRef<HTMLDivElement>(null);
|
|
28
46
|
const wrapperRef = useRef<HTMLDivElement>(null);
|
|
47
|
+
const isSiteView = !!currentSiteInfo;
|
|
29
48
|
|
|
30
49
|
const { isOpen, toggleModal } = useModal();
|
|
50
|
+
const filteredUsers = isSiteView
|
|
51
|
+
? users.filter((user: IUser) => {
|
|
52
|
+
const { id } = currentSiteInfo;
|
|
53
|
+
const { sites } = user;
|
|
54
|
+
return sites.includes(parseInt(id)) || sites.includes("all");
|
|
55
|
+
})
|
|
56
|
+
: users;
|
|
31
57
|
|
|
32
|
-
const usersIds =
|
|
58
|
+
const usersIds = filteredUsers.map((user: any) => user.id);
|
|
33
59
|
|
|
34
60
|
const {
|
|
35
61
|
resetBulkSelection,
|
|
@@ -41,23 +67,11 @@ const UserList = (props: IProps): JSX.Element => {
|
|
|
41
67
|
selectedItems,
|
|
42
68
|
} = useBulkSelection(usersIds);
|
|
43
69
|
|
|
44
|
-
const { sortedByName, sortedByDateCreated, isAscending } = sortedListStatus;
|
|
45
|
-
const order = `${sortedByName ? "name" : ""}${sortedByDateCreated ? "dateCreated" : ""}-${
|
|
46
|
-
isAscending ? "asc" : "desc"
|
|
47
|
-
}`;
|
|
48
|
-
|
|
49
|
-
const getParams = useCallback(() => {
|
|
50
|
-
const params = {
|
|
51
|
-
query: searchQuery,
|
|
52
|
-
order,
|
|
53
|
-
};
|
|
54
|
-
return params;
|
|
55
|
-
}, [searchQuery, order]);
|
|
56
|
-
|
|
57
70
|
useEffect(() => {
|
|
58
|
-
|
|
71
|
+
const query = searchQuery ? (currentFilterQuery ? `&query=${searchQuery}` : `?query=${searchQuery}`) : "";
|
|
72
|
+
getUsers({ filterQuery: currentFilterQuery, query });
|
|
59
73
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
60
|
-
}, [
|
|
74
|
+
}, [currentFilterQuery, searchQuery]);
|
|
61
75
|
|
|
62
76
|
useEffect(() => {
|
|
63
77
|
if (wrapperRef.current) {
|
|
@@ -70,11 +84,6 @@ const UserList = (props: IProps): JSX.Element => {
|
|
|
70
84
|
setHistoryPush(path);
|
|
71
85
|
};
|
|
72
86
|
|
|
73
|
-
const bulkDelete = () => {
|
|
74
|
-
deleteUser(selectedItems.all);
|
|
75
|
-
toggleModal();
|
|
76
|
-
};
|
|
77
|
-
|
|
78
87
|
const unselectAllItems = () => resetBulkSelection();
|
|
79
88
|
|
|
80
89
|
const selectItems = () => (checkState.isAllSelected ? unselectAllItems() : handleSelectAll());
|
|
@@ -83,12 +92,12 @@ const UserList = (props: IProps): JSX.Element => {
|
|
|
83
92
|
|
|
84
93
|
const onScroll = (e: any) => setIsScrolling(e.target.scrollTop > 0);
|
|
85
94
|
|
|
86
|
-
const totalItems =
|
|
95
|
+
const totalItems = filteredUsers.length;
|
|
87
96
|
|
|
88
97
|
const firstPageUser = (page - 1) * itemsPerPage;
|
|
89
|
-
const pageUsers =
|
|
90
|
-
const isEmpty =
|
|
91
|
-
|
|
98
|
+
const pageUsers = filteredUsers.slice(firstPageUser, firstPageUser + itemsPerPage);
|
|
99
|
+
const isEmpty = filteredUsers && filteredUsers.length === 0;
|
|
100
|
+
const BASE_URL = isSiteView ? "/sites/users" : "/users";
|
|
92
101
|
const pagination = {
|
|
93
102
|
setPage,
|
|
94
103
|
itemsPerPage,
|
|
@@ -96,25 +105,47 @@ const UserList = (props: IProps): JSX.Element => {
|
|
|
96
105
|
currPage: page,
|
|
97
106
|
};
|
|
98
107
|
|
|
108
|
+
const bulkDelete = () => {
|
|
109
|
+
if (isSiteView) {
|
|
110
|
+
const siteId = currentSiteInfo.id;
|
|
111
|
+
removeUsersBulk(siteId, selectedItems.all);
|
|
112
|
+
} else {
|
|
113
|
+
deleteUser(selectedItems.all);
|
|
114
|
+
}
|
|
115
|
+
toggleModal();
|
|
116
|
+
};
|
|
117
|
+
|
|
99
118
|
const rightButtonProps = {
|
|
100
119
|
label: "New",
|
|
101
|
-
action: () => setHistoryPush(
|
|
120
|
+
action: () => setHistoryPush(`${BASE_URL}/new`),
|
|
102
121
|
};
|
|
103
122
|
|
|
104
123
|
const sortItems = async (orderPointer: string, isAscending: boolean) => {
|
|
105
124
|
setPage(firstPage);
|
|
106
125
|
const sortedState = getSortedListStatus(orderPointer, isAscending);
|
|
107
126
|
setSortedListStatus(sortedState);
|
|
127
|
+
const filtersSelection = setFiltersSelection("order", orderPointer, isAscending);
|
|
128
|
+
const filterQuery = setFilterQuery(filtersSelection);
|
|
129
|
+
setCurrentFilterQuery(filterQuery);
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
const filterItems = async (filterPointer: string, filtersSelected: string) => {
|
|
133
|
+
setPage(firstPage);
|
|
134
|
+
const filtersSelection = setFiltersSelection(filterPointer, filtersSelected);
|
|
135
|
+
const filterQuery = setFilterQuery(filtersSelection);
|
|
136
|
+
setCurrentFilterQuery(filterQuery);
|
|
108
137
|
};
|
|
109
138
|
|
|
110
139
|
const handleClick = (id: number) => async () => {
|
|
111
140
|
resetUserData();
|
|
112
141
|
await getUser(id);
|
|
113
|
-
setHistoryPush(
|
|
142
|
+
setHistoryPush(`${BASE_URL}/edit`);
|
|
114
143
|
};
|
|
115
144
|
|
|
116
145
|
const TableHeader = (
|
|
117
146
|
<BulkHeader
|
|
147
|
+
isSiteView={isSiteView}
|
|
148
|
+
filterValues={filterValues}
|
|
118
149
|
showBulk={areItemsSelected(usersIds)}
|
|
119
150
|
bulkDelete={toggleModal}
|
|
120
151
|
selectAllItems={handleSelectAll}
|
|
@@ -123,11 +154,12 @@ const UserList = (props: IProps): JSX.Element => {
|
|
|
123
154
|
checkState={checkState}
|
|
124
155
|
isScrolling={isScrolling}
|
|
125
156
|
sortItems={sortItems}
|
|
157
|
+
filterItems={filterItems}
|
|
126
158
|
sortedListStatus={sortedListStatus}
|
|
127
159
|
/>
|
|
128
160
|
);
|
|
129
161
|
|
|
130
|
-
const mainDeleteAction = { title: "Delete Users", onClick: bulkDelete };
|
|
162
|
+
const mainDeleteAction = { title: isSiteView ? "Remove from this site" : "Delete Users", onClick: bulkDelete };
|
|
131
163
|
const secondaryDeleteAction = { title: "Cancel", onClick: toggleModal };
|
|
132
164
|
|
|
133
165
|
return (
|
|
@@ -153,8 +185,11 @@ const UserList = (props: IProps): JSX.Element => {
|
|
|
153
185
|
const isItemSelected = isSelected(user.id);
|
|
154
186
|
return (
|
|
155
187
|
<UserItem
|
|
188
|
+
siteId={currentSiteInfo?.id}
|
|
189
|
+
isSiteView={isSiteView}
|
|
156
190
|
key={user.id}
|
|
157
191
|
user={user}
|
|
192
|
+
sites={sites}
|
|
158
193
|
isSelected={isItemSelected}
|
|
159
194
|
onChange={addToBulkSelection}
|
|
160
195
|
handleClick={handleClick(user.id)}
|
|
@@ -168,13 +203,18 @@ const UserList = (props: IProps): JSX.Element => {
|
|
|
168
203
|
<Modal
|
|
169
204
|
isOpen={isOpen}
|
|
170
205
|
hide={toggleModal}
|
|
171
|
-
title="Delete Users?"
|
|
206
|
+
title={isSiteView ? "Remove users from this site?" : "Delete Users?"}
|
|
172
207
|
secondaryAction={secondaryDeleteAction}
|
|
173
208
|
mainAction={mainDeleteAction}
|
|
174
209
|
>
|
|
175
210
|
{isOpen ? (
|
|
176
211
|
<S.ModalContent>
|
|
177
|
-
<p>
|
|
212
|
+
<p>
|
|
213
|
+
{isSiteView
|
|
214
|
+
? "Are you sure you want to remove these users from this site? If you remove them, these users will no longer have access to this site but they will still be able to log in. This action cannot be undone."
|
|
215
|
+
: "Are you sure you want to delete these users? If you delete them, they no longer be able to log in."}
|
|
216
|
+
</p>
|
|
217
|
+
|
|
178
218
|
<p>
|
|
179
219
|
This action <strong>cannot be undone</strong>.
|
|
180
220
|
</p>
|
|
@@ -187,6 +227,8 @@ const UserList = (props: IProps): JSX.Element => {
|
|
|
187
227
|
|
|
188
228
|
const mapStateToProps = (state: IRootState) => ({
|
|
189
229
|
users: state.users.users,
|
|
230
|
+
currentSiteInfo: state.sites.currentSiteInfo,
|
|
231
|
+
sites: state.sites.sites,
|
|
190
232
|
});
|
|
191
233
|
|
|
192
234
|
const mapDispatchToProps = {
|
|
@@ -195,6 +237,7 @@ const mapDispatchToProps = {
|
|
|
195
237
|
resetUserData: usersActions.resetUserData,
|
|
196
238
|
setHistoryPush: appActions.setHistoryPush,
|
|
197
239
|
deleteUser: usersActions.deleteUser,
|
|
240
|
+
removeUsersBulk: sitesActions.removeUsersBulk,
|
|
198
241
|
};
|
|
199
242
|
|
|
200
243
|
interface IDispatchProps {
|
|
@@ -203,12 +246,15 @@ interface IDispatchProps {
|
|
|
203
246
|
resetUserData(): void;
|
|
204
247
|
setHistoryPush(route: string): void;
|
|
205
248
|
deleteUser(id: number[]): Promise<boolean>;
|
|
249
|
+
removeUsersBulk(siteId: number, users: number[]): void;
|
|
206
250
|
}
|
|
207
251
|
|
|
208
252
|
interface IUserListProps {
|
|
209
253
|
navItems: any[];
|
|
210
254
|
currentNavItem: any;
|
|
211
255
|
users: IUser[];
|
|
256
|
+
currentSiteInfo: any;
|
|
257
|
+
sites: ISite[];
|
|
212
258
|
}
|
|
213
259
|
|
|
214
260
|
type IProps = IUserListProps & IDispatchProps;
|
|
@@ -7,21 +7,28 @@ const navItems = [
|
|
|
7
7
|
{
|
|
8
8
|
title: "Users",
|
|
9
9
|
path: "/users",
|
|
10
|
-
component: List
|
|
11
|
-
}
|
|
10
|
+
component: List,
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
title: "Users",
|
|
14
|
+
path: "/sites/users",
|
|
15
|
+
component: List,
|
|
16
|
+
},
|
|
12
17
|
];
|
|
13
18
|
|
|
14
|
-
const Users = (): JSX.Element => {
|
|
19
|
+
const Users = (props: any): JSX.Element => {
|
|
20
|
+
const { pathname } = props.location;
|
|
21
|
+
const currentNavItems = navItems.filter((item) => item.path === pathname);
|
|
22
|
+
|
|
15
23
|
return (
|
|
16
24
|
<Switch>
|
|
17
|
-
{
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
)}
|
|
25
|
+
{currentNavItems.map((item, index) => (
|
|
26
|
+
<Route exact path={item.path} key={index}>
|
|
27
|
+
{React.createElement(item.component, { navItems: currentNavItems, currentNavItem: item }, null)}
|
|
28
|
+
</Route>
|
|
29
|
+
))}
|
|
23
30
|
</Switch>
|
|
24
|
-
)
|
|
31
|
+
);
|
|
25
32
|
};
|
|
26
33
|
|
|
27
|
-
export default Users;
|
|
34
|
+
export default Users;
|
package/src/routes/site.tsx
CHANGED
|
@@ -9,6 +9,10 @@ import CategoriesList from "./../modules/Categories/CategoriesList";
|
|
|
9
9
|
import StructuredData from "./../modules/StructuredData";
|
|
10
10
|
import SeoAnalyticsSettings from "./../modules/Settings/SeoAnalyticsSettings";
|
|
11
11
|
import TemplateEditor from "../modules/Settings/ContentTypes/DataPacks/Config/Form/TemplateConfig/TemplateEditor";
|
|
12
|
+
import Users from "./../modules/Users";
|
|
13
|
+
import UserCreate from "./../modules/Users/UserCreate";
|
|
14
|
+
import UserEdit from "./../modules/Users/UserEdit";
|
|
15
|
+
import Profile from "./../modules/Users/Profile";
|
|
12
16
|
|
|
13
17
|
const BASE_PATH = "/sites";
|
|
14
18
|
|
|
@@ -36,6 +40,7 @@ export default [
|
|
|
36
40
|
icon: "",
|
|
37
41
|
name: "New StructuredData",
|
|
38
42
|
},
|
|
43
|
+
{ path: `${BASE_PATH}/profile`, component: Profile, name: "Profile", showInNav: false, icon: "User" },
|
|
39
44
|
{
|
|
40
45
|
path: `${BASE_PATH}/navigations`,
|
|
41
46
|
component: null,
|
|
@@ -52,6 +57,9 @@ export default [
|
|
|
52
57
|
},
|
|
53
58
|
],
|
|
54
59
|
},
|
|
60
|
+
{ path: `${BASE_PATH}/users`, component: Users, name: "Users", showInNav: true, icon: "Users" },
|
|
61
|
+
{ path: `${BASE_PATH}/users/new`, component: UserCreate, name: "New User", showInNav: false },
|
|
62
|
+
{ path: `${BASE_PATH}/users/edit`, component: UserEdit, name: "New User", showInNav: false },
|
|
55
63
|
{
|
|
56
64
|
path: `${BASE_PATH}/navigations/editor`,
|
|
57
65
|
component: DefaultsEditor,
|
package/src/types/index.tsx
CHANGED
|
@@ -535,6 +535,7 @@ export interface IUser {
|
|
|
535
535
|
enabled?: boolean;
|
|
536
536
|
timezone?: string;
|
|
537
537
|
status?: string;
|
|
538
|
+
sites?: any;
|
|
538
539
|
}
|
|
539
540
|
|
|
540
541
|
export interface ISelectOption {
|
|
@@ -605,6 +606,12 @@ export interface IStructuredDataQueryValues {
|
|
|
605
606
|
order: string;
|
|
606
607
|
filterSites: string;
|
|
607
608
|
categories: string;
|
|
609
|
+
related: string;
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
export interface IUsersQueryValues {
|
|
613
|
+
order: string;
|
|
614
|
+
filterSites: string;
|
|
608
615
|
}
|
|
609
616
|
|
|
610
617
|
export interface IDataPackConfigImportCategory {
|
package/tsconfig.json
CHANGED
package/scripts/test.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
// Do this as the first thing so that any code reading it knows the right env.
|
|
2
|
-
process.env.BABEL_ENV = "test";
|
|
3
|
-
process.env.NODE_ENV = "test";
|
|
4
|
-
process.env.PUBLIC_URL = "";
|
|
5
|
-
|
|
6
|
-
// Makes the script crash on unhandled rejections instead of silently
|
|
7
|
-
// ignoring them. In the future, promise rejections that are not handled will
|
|
8
|
-
// terminate the Node.js process with a non-zero exit code.
|
|
9
|
-
process.on("unhandledRejection", (err) => {
|
|
10
|
-
throw err;
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
// Ensure environment variables are read.
|
|
14
|
-
require("../config/env");
|
|
15
|
-
|
|
16
|
-
const jest = require("jest");
|
|
17
|
-
const execSync = require("child_process").execSync;
|
|
18
|
-
let argv = process.argv.slice(2);
|
|
19
|
-
|
|
20
|
-
function isInGitRepository() {
|
|
21
|
-
try {
|
|
22
|
-
execSync("git rev-parse --is-inside-work-tree", { stdio: "ignore" });
|
|
23
|
-
return true;
|
|
24
|
-
} catch (e) {
|
|
25
|
-
return false;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function isInMercurialRepository() {
|
|
30
|
-
try {
|
|
31
|
-
execSync("hg --cwd . root", { stdio: "ignore" });
|
|
32
|
-
return true;
|
|
33
|
-
} catch (e) {
|
|
34
|
-
return false;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Watch unless on CI or explicitly running all tests
|
|
39
|
-
if (!process.env.CI && argv.indexOf("--watchAll") === -1 && argv.indexOf("--watchAll=false") === -1) {
|
|
40
|
-
// https://github.com/facebook/create-react-app/issues/5210
|
|
41
|
-
const hasSourceControl = isInGitRepository() || isInMercurialRepository();
|
|
42
|
-
argv.push(hasSourceControl ? "--watch" : "--watchAll");
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
jest.run(argv);
|