@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.
Files changed (130) hide show
  1. package/config/griddo-config/cx-polyfills/builder.ssr.js +6 -0
  2. package/config/griddo-config/cx-polyfills/componentsBundle.js +4 -0
  3. package/config/{griddo-config.js → griddo-config/index.js} +36 -15
  4. package/config/griddo-config/ssrHelpers.js +47 -0
  5. package/config/jest/componentsMock.js +29 -0
  6. package/config/jest/fileMock.js +1 -0
  7. package/config/jest/setup.js +5 -0
  8. package/config/jest/styleMock.js +1 -0
  9. package/config/jest/test-utils.js +17 -0
  10. package/config/paths.js +36 -5
  11. package/config/webpack.config.js +1 -1
  12. package/config/webpackDevServer.config.js +4 -1
  13. package/config/webpackSchemas.config.js +4 -1
  14. package/package.json +33 -59
  15. package/scripts/build.js +9 -2
  16. package/src/__mocks__/reducers/analyticsState.tsx +14 -0
  17. package/src/__mocks__/reducers/pageEditor.tsx +30 -0
  18. package/src/api/sites.tsx +28 -6
  19. package/src/api/structuredData.tsx +1 -1
  20. package/src/api/users.tsx +5 -4
  21. package/src/components/ActionMenu/style.tsx +2 -0
  22. package/src/components/Browser/index.tsx +9 -5
  23. package/src/{modules/Content/PageItem/atoms.tsx → components/CategoryCell/index.tsx} +4 -6
  24. package/src/components/CategoryCell/style.tsx +11 -0
  25. package/src/components/Fields/AnalyticsField/PageAnalytics/index.tsx +19 -19
  26. package/src/components/Fields/AnalyticsField/StructuredDataAnalytics/atoms.tsx +26 -16
  27. package/src/components/Fields/AnalyticsField/StructuredDataAnalytics/index.tsx +8 -13
  28. package/src/components/Fields/AnalyticsField/index.test.tsx +100 -0
  29. package/src/components/Fields/AnalyticsField/index.tsx +9 -2
  30. package/src/components/Fields/AnalyticsField/utils.tsx +2 -2
  31. package/src/components/Fields/ArrayFieldGroup/ArrayFieldItem/style.tsx +2 -1
  32. package/src/components/Fields/CheckField/index.test.tsx +95 -0
  33. package/src/components/Fields/CheckField/index.tsx +9 -3
  34. package/src/components/Fields/CheckField/style.tsx +32 -24
  35. package/src/components/Fields/CheckGroup/index.test.tsx +274 -0
  36. package/src/components/Fields/CheckGroup/index.tsx +2 -1
  37. package/src/components/Fields/FileField/FileDragAndDrop/style.tsx +3 -2
  38. package/src/components/Fields/FileField/style.tsx +2 -1
  39. package/src/components/Fields/MultiCheckSelect/style.tsx +18 -18
  40. package/src/components/Fields/NoteField/style.tsx +9 -9
  41. package/src/components/Fields/ReferenceField/AutoPanel/AutoItem/index.tsx +1 -1
  42. package/src/components/Fields/Select/style.tsx +41 -37
  43. package/src/components/Fields/TagField/index.test.tsx +136 -0
  44. package/src/components/Fields/TagField/index.tsx +8 -12
  45. package/src/components/Fields/TextArea/index.test.tsx +69 -0
  46. package/src/components/Fields/TextArea/index.tsx +4 -13
  47. package/src/components/Fields/TextArea/style.tsx +2 -2
  48. package/src/components/Fields/TextField/index.test.tsx +144 -0
  49. package/src/components/Fields/TextField/index.tsx +23 -19
  50. package/src/components/Fields/TextField/style.tsx +16 -7
  51. package/src/components/Fields/UniqueCheck/index.test.tsx +43 -0
  52. package/src/components/Fields/UrlField/utils.tsx +8 -6
  53. package/src/components/FieldsBehavior/index.tsx +0 -2
  54. package/src/components/FieldsBehavior/style.tsx +21 -21
  55. package/src/components/Gallery/GalleryFilters/Orientation/style.tsx +2 -1
  56. package/src/components/Gallery/GalleryFilters/SortBy/style.tsx +2 -1
  57. package/src/components/Icon/index.tsx +12 -10
  58. package/src/components/IconAction/index.tsx +7 -1
  59. package/src/components/IconAction/style.tsx +10 -10
  60. package/src/components/SearchField/index.tsx +11 -8
  61. package/src/components/SearchField/style.tsx +21 -12
  62. package/src/components/TableFilters/CategoryFilter/index.tsx +1 -1
  63. package/src/components/TableFilters/CategoryFilter/style.tsx +2 -1
  64. package/src/components/TableFilters/DateFilter/style.tsx +2 -1
  65. package/src/components/TableFilters/LiveFilter/index.tsx +2 -2
  66. package/src/components/TableFilters/LiveFilter/style.tsx +2 -1
  67. package/src/components/TableFilters/NameFilter/style.tsx +2 -1
  68. package/src/components/TableFilters/SiteFilter/index.tsx +38 -24
  69. package/src/components/TableFilters/SiteFilter/style.tsx +2 -1
  70. package/src/components/TableFilters/StatusFilter/style.tsx +2 -1
  71. package/src/components/TableFilters/TranslationsFilter/style.tsx +2 -1
  72. package/src/components/TableFilters/TypeFilter/style.tsx +2 -1
  73. package/src/components/Tag/index.tsx +9 -7
  74. package/src/components/Tag/style.tsx +20 -8
  75. package/src/components/index.tsx +4 -2
  76. package/src/containers/App/reducer.tsx +0 -2
  77. package/src/containers/PageEditor/actions.tsx +2 -2
  78. package/src/containers/Sites/actions.tsx +30 -19
  79. package/src/containers/Users/actions.tsx +10 -2
  80. package/src/containers/Users/reducer.tsx +3 -1
  81. package/src/helpers/fields.tsx +2 -4
  82. package/src/helpers/index.tsx +3 -0
  83. package/src/helpers/themes.tsx +9 -0
  84. package/src/modules/Analytics/GroupPanel/utils.tsx +3 -3
  85. package/src/modules/App/Routing/NavMenu/index.tsx +13 -12
  86. package/src/modules/Content/PageItem/index.tsx +31 -9
  87. package/src/modules/Content/PageItem/style.tsx +0 -7
  88. package/src/modules/Content/atoms.tsx +78 -0
  89. package/src/modules/Content/index.tsx +104 -33
  90. package/src/modules/Content/style.tsx +10 -7
  91. package/src/modules/GlobalEditor/PageBrowser/index.tsx +0 -4
  92. package/src/modules/GlobalEditor/index.tsx +3 -3
  93. package/src/modules/Navigation/Defaults/DefaultsEditor/Editor/DefaultsBrowser/index.tsx +0 -4
  94. package/src/modules/PageEditor/PageBrowser/index.tsx +0 -4
  95. package/src/modules/PageEditor/atoms.tsx +74 -0
  96. package/src/modules/PageEditor/index.tsx +30 -9
  97. package/src/modules/PageEditor/style.tsx +4 -0
  98. package/src/modules/PublicPreview/index.tsx +3 -5
  99. package/src/modules/Settings/ContentTypes/DataPacks/Config/Form/TemplateConfig/TemplateEditor/Editor/TemplateBrowser/index.tsx +0 -4
  100. package/src/modules/Settings/ContentTypes/DataPacks/Config/Form/TemplateConfig/TemplateEditor/Editor/index.tsx +2 -3
  101. package/src/modules/Settings/ContentTypes/DataPacks/Config/Form/index.tsx +1 -1
  102. package/src/modules/Settings/Globals/index.tsx +3 -3
  103. package/src/modules/StructuredData/Form/index.tsx +2 -4
  104. package/src/modules/StructuredData/StructuredDataList/BulkHeader/TableHeader/index.tsx +22 -18
  105. package/src/modules/StructuredData/StructuredDataList/GlobalPageItem/atoms.tsx +3 -24
  106. package/src/modules/StructuredData/StructuredDataList/GlobalPageItem/index.tsx +2 -2
  107. package/src/modules/StructuredData/StructuredDataList/GlobalPageItem/style.tsx +0 -7
  108. package/src/modules/StructuredData/StructuredDataList/OptionTable/index.tsx +2 -4
  109. package/src/modules/StructuredData/StructuredDataList/StructuredDataItem/index.tsx +46 -14
  110. package/src/modules/StructuredData/StructuredDataList/hooks.tsx +21 -9
  111. package/src/modules/StructuredData/StructuredDataList/index.tsx +48 -20
  112. package/src/modules/Users/Profile/index.tsx +12 -7
  113. package/src/modules/Users/UserCreate/SiteItem/index.tsx +44 -0
  114. package/src/modules/Users/UserCreate/SiteItem/style.tsx +30 -0
  115. package/src/modules/Users/UserCreate/index.tsx +120 -10
  116. package/src/modules/Users/UserCreate/style.tsx +54 -1
  117. package/src/modules/Users/UserEdit/index.tsx +53 -15
  118. package/src/modules/Users/UserForm/index.tsx +152 -5
  119. package/src/modules/Users/UserForm/style.tsx +40 -2
  120. package/src/modules/Users/UserList/BulkHeader/TableHeader/index.tsx +40 -2
  121. package/src/modules/Users/UserList/BulkHeader/TableHeader/style.tsx +0 -1
  122. package/src/modules/Users/UserList/BulkHeader/index.tsx +10 -1
  123. package/src/modules/Users/UserList/UserItem/index.tsx +70 -15
  124. package/src/modules/Users/UserList/hooks.tsx +58 -1
  125. package/src/modules/Users/UserList/index.tsx +80 -34
  126. package/src/modules/Users/index.tsx +18 -11
  127. package/src/routes/site.tsx +8 -0
  128. package/src/types/index.tsx +7 -0
  129. package/tsconfig.json +2 -0
  130. 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
- export { useSortedListStatus };
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, { useCallback, useEffect, useRef, useState } from "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 { users, getUsers, navItems, currentNavItem, setHistoryPush, getUser, resetUserData, deleteUser } = props;
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 = users && users.map((user: any) => user.id);
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
- getUsers(getParams());
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
- }, [getParams]);
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 = users.length;
95
+ const totalItems = filteredUsers.length;
87
96
 
88
97
  const firstPageUser = (page - 1) * itemsPerPage;
89
- const pageUsers = users.slice(firstPageUser, firstPageUser + itemsPerPage);
90
- const isEmpty = users && users.length === 0;
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("/users/new"),
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(`/users/edit`);
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>Are you sure you want to delete these users? If you delete them, they no longer be able to log in.</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
- {navItems.map((item, index) => (
18
- <Route exact path={item.path} key={index}>
19
- {React.createElement(item.component, {navItems, currentNavItem: item}, null)}
20
- </Route>
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;
@@ -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,
@@ -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
@@ -21,12 +21,14 @@
21
21
  "noEmit": true,
22
22
  "jsx": "react",
23
23
  "types": [
24
+ "jest",
24
25
  "react",
25
26
  "reflect-metadata",
26
27
  "node",
27
28
  "webpack-env",
28
29
  "react/next",
29
30
  "react-dom/next",
31
+ "@testing-library/jest-dom",
30
32
  ],
31
33
  },
32
34
  "include": [
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);