strapi-plugin-navigation 1.1.0 → 2.0.0-beta.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 (128) hide show
  1. package/README.md +7 -5
  2. package/admin/src/components/EmptyView/index.js +7 -16
  3. package/admin/src/components/Item/ItemCardBadge/index.js +8 -0
  4. package/admin/src/components/Item/ItemCardHeader/Wrapper.js +21 -0
  5. package/admin/src/components/Item/ItemCardHeader/index.js +59 -0
  6. package/admin/src/components/Item/Wrapper.js +39 -0
  7. package/admin/src/components/Item/index.js +76 -124
  8. package/admin/src/components/NavigationItemList/Wrapper.js +22 -0
  9. package/admin/src/components/NavigationItemList/index.js +54 -0
  10. package/admin/src/components/PluginIcon/index.js +6 -0
  11. package/admin/src/index.js +49 -45
  12. package/admin/src/pages/App/index.js +31 -0
  13. package/admin/src/{containers → pages}/DataManagerProvider/actions.js +0 -0
  14. package/admin/src/{containers → pages}/DataManagerProvider/index.js +81 -85
  15. package/admin/src/{containers → pages}/DataManagerProvider/init.js +0 -0
  16. package/admin/src/{containers → pages}/DataManagerProvider/reducer.js +0 -0
  17. package/admin/src/pages/View/components/NavigationContentHeader/index.js +18 -0
  18. package/admin/src/pages/View/components/NavigationHeader/index.js +60 -0
  19. package/admin/src/pages/View/components/NavigationItemForm/index.js +403 -0
  20. package/admin/src/{containers → pages}/View/components/NavigationItemForm/utils/form.js +2 -2
  21. package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupFooter.js +40 -0
  22. package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupHeader.js +20 -0
  23. package/admin/src/{containers → pages}/View/components/NavigationItemPopup/index.js +16 -16
  24. package/admin/src/pages/View/index.js +209 -0
  25. package/admin/src/{containers → pages}/View/utils/enums.js +0 -0
  26. package/admin/src/{containers → pages}/View/utils/form.js +1 -1
  27. package/admin/src/{containers → pages}/View/utils/index.js +0 -0
  28. package/admin/src/{containers → pages}/View/utils/parsers.js +13 -12
  29. package/admin/src/pluginId.js +3 -2
  30. package/admin/src/translations/en.json +47 -38
  31. package/admin/src/translations/fr.json +7 -1
  32. package/admin/src/utils/getTrad.js +2 -2
  33. package/package.json +14 -6
  34. package/server/bootstrap.js +41 -0
  35. package/server/config.js +8 -0
  36. package/server/content-types/audience/index.js +9 -0
  37. package/{models/audience.js → server/content-types/audience/lifecycle.js} +0 -0
  38. package/{models/audience.settings.json → server/content-types/audience/schema.json} +4 -2
  39. package/server/content-types/index.js +13 -0
  40. package/server/content-types/navigation/index.js +9 -0
  41. package/{models/navigation.js → server/content-types/navigation/lifecycle.js} +0 -0
  42. package/server/content-types/navigation/schema.js +45 -0
  43. package/server/content-types/navigation-item/index.js +9 -0
  44. package/{models/navigationItem.js → server/content-types/navigation-item/lifecycle.js} +0 -0
  45. package/{models/navigationItem.settings.json → server/content-types/navigation-item/schema.json} +16 -12
  46. package/server/content-types/navigations-items-related/index.js +9 -0
  47. package/{models/navigations_items_related.js → server/content-types/navigations-items-related/lifecycle.js} +0 -0
  48. package/{models/navigations_items_related.settings.json → server/content-types/navigations-items-related/schema.json} +4 -2
  49. package/server/controllers/index.js +7 -0
  50. package/{controllers → server/controllers}/navigation.js +7 -39
  51. package/server/routes/admin.js +38 -0
  52. package/server/routes/index.js +3 -0
  53. package/{services → server/services}/__tests__/navigation.test.js +0 -0
  54. package/server/services/index.js +7 -0
  55. package/server/services/navigation.js +463 -0
  56. package/{services → server/services}/utils/constant.js +3 -1
  57. package/server/services/utils/functions.js +103 -0
  58. package/strapi-admin.js +1 -0
  59. package/strapi-server.js +18 -0
  60. package/__mocks__/helpers/another-plugin/blog-post.settings.json +0 -31
  61. package/__mocks__/helpers/another-plugin/pages.settings.json +0 -28
  62. package/__mocks__/helpers/blog-post.settings.json +0 -31
  63. package/__mocks__/helpers/home-page.settings.json +0 -4
  64. package/__mocks__/helpers/my-homepage.settings.json +0 -27
  65. package/__mocks__/helpers/pages.settings.json +0 -27
  66. package/__mocks__/helpers/strapi.js +0 -101
  67. package/admin/src/assets/images/icon-cross-blue.svg +0 -1
  68. package/admin/src/assets/images/icon_remove.svg +0 -19
  69. package/admin/src/components/Container/index.js +0 -7
  70. package/admin/src/components/Input/index.js +0 -41
  71. package/admin/src/components/Item/CardItem.js +0 -46
  72. package/admin/src/components/Item/CardItemLevelAdd.js +0 -41
  73. package/admin/src/components/Item/CardItemLevelWrapper.js +0 -27
  74. package/admin/src/components/Item/CardItemPath.js +0 -9
  75. package/admin/src/components/Item/CardItemRestore.js +0 -19
  76. package/admin/src/components/Item/CardItemTitle.js +0 -5
  77. package/admin/src/components/Item/CardWrapper.js +0 -78
  78. package/admin/src/components/ItemFooter/CardItemError.js +0 -11
  79. package/admin/src/components/ItemFooter/CardItemRelation.js +0 -18
  80. package/admin/src/components/ItemFooter/CardItemRelationStatus.js +0 -17
  81. package/admin/src/components/ItemFooter/CardItemType.js +0 -18
  82. package/admin/src/components/ItemFooter/Wrapper.js +0 -26
  83. package/admin/src/components/ItemFooter/index.js +0 -66
  84. package/admin/src/components/ItemOrdering/CardOrderingButton.js +0 -24
  85. package/admin/src/components/ItemOrdering/Wrapper.js +0 -24
  86. package/admin/src/components/ItemOrdering/index.js +0 -36
  87. package/admin/src/components/List/Container.js +0 -34
  88. package/admin/src/components/List/ListLevelRoot.js +0 -18
  89. package/admin/src/components/List/index.js +0 -81
  90. package/admin/src/components/Option/OptionButton.js +0 -18
  91. package/admin/src/components/Option/OptionSet.js +0 -14
  92. package/admin/src/components/Option/Wrapper.js +0 -15
  93. package/admin/src/components/Option/index.js +0 -47
  94. package/admin/src/components/Search/index.js +0 -86
  95. package/admin/src/components/Select/ClearIndicator.js +0 -15
  96. package/admin/src/components/Select/DropdownIndicator.js +0 -39
  97. package/admin/src/components/Select/ErrorMessage.js +0 -10
  98. package/admin/src/components/Select/IndicatorSeparator.js +0 -3
  99. package/admin/src/components/Select/MultiValueContainer.js +0 -43
  100. package/admin/src/components/Select/StyledOption.js +0 -11
  101. package/admin/src/components/Select/index.js +0 -68
  102. package/admin/src/components/Select/utils/styles.js +0 -92
  103. package/admin/src/containers/App/Wrapper.js +0 -14
  104. package/admin/src/containers/App/index.js +0 -34
  105. package/admin/src/containers/DetailsView/Wrapper.js +0 -21
  106. package/admin/src/containers/DetailsView/index.js +0 -111
  107. package/admin/src/containers/Initializer/index.js +0 -26
  108. package/admin/src/containers/ListView/Footer.js +0 -56
  109. package/admin/src/containers/ListView/components.js +0 -138
  110. package/admin/src/containers/ListView/index.js +0 -54
  111. package/admin/src/containers/View/FadedWrapper.js +0 -51
  112. package/admin/src/containers/View/HeaderForm.js +0 -9
  113. package/admin/src/containers/View/HeaderFormCell.js +0 -25
  114. package/admin/src/containers/View/Wrapper.js +0 -17
  115. package/admin/src/containers/View/components/NavigationItemForm/ModalFooter.js +0 -45
  116. package/admin/src/containers/View/components/NavigationItemForm/index.js +0 -427
  117. package/admin/src/containers/View/components/NavigationItemPopup/MediumPopup.js +0 -6
  118. package/admin/src/containers/View/index.js +0 -240
  119. package/admin/src/lifecycles.js +0 -3
  120. package/admin/src/permissions.js +0 -14
  121. package/config/functions/bootstrap.js +0 -138
  122. package/config/routes.json +0 -60
  123. package/config/schema.graphql.js +0 -205
  124. package/examples/audit-log-integrations.js.md +0 -38
  125. package/models/navigation.settings.json +0 -43
  126. package/public/assets/preview.png +0 -0
  127. package/services/navigation.js +0 -730
  128. package/services/utils/functions.js +0 -186
@@ -1,12 +1,15 @@
1
1
  import React, { memo, useEffect, useReducer, useRef } from "react";
2
+ import { useLocation, useRouteMatch } from "react-router-dom";
3
+ import { useIntl } from 'react-intl';
2
4
  import PropTypes from "prop-types";
3
5
  import { get, find, first, isEmpty } from "lodash";
4
6
  import {
5
7
  request,
6
8
  LoadingIndicatorPage,
7
- useGlobalContext,
8
- } from "strapi-helper-plugin";
9
- import { useLocation, useRouteMatch } from "react-router-dom";
9
+ useNotification,
10
+ useAppInfos,
11
+ useStrapiApp,
12
+ } from "@strapi/helper-plugin";
10
13
  import DataManagerContext from "../../contexts/DataManagerContext";
11
14
  import getTrad from "../../utils/getTrad";
12
15
  import pluginId from "../../pluginId";
@@ -30,16 +33,13 @@ import {
30
33
  SUBMIT_NAVIGATION_ERROR,
31
34
  } from './actions';
32
35
  import { prepareItemToViewPayload } from '../View/utils/parsers';
33
- import { getTradId } from "../../translations";
34
36
 
35
37
  const DataManagerProvider = ({ children }) => {
36
38
  const [reducerState, dispatch] = useReducer(reducer, initialState, init);
37
- const {
38
- autoReload,
39
- emitEvent,
40
- currentEnvironment,
41
- formatMessage,
42
- } = useGlobalContext();
39
+ const toggleNotification = useNotification();
40
+ const { autoReload } = useAppInfos();
41
+ const { formatMessage } = useIntl();
42
+
43
43
  const {
44
44
  items,
45
45
  config,
@@ -56,7 +56,8 @@ const DataManagerProvider = ({ children }) => {
56
56
  error
57
57
  } = reducerState.toJS();
58
58
  const { pathname } = useLocation();
59
-
59
+ const { getPlugin } = useStrapiApp();
60
+ const { apis } = getPlugin(pluginId);
60
61
  const formatMessageRef = useRef();
61
62
  formatMessageRef.current = formatMessage;
62
63
 
@@ -64,8 +65,7 @@ const DataManagerProvider = ({ children }) => {
64
65
  getLayoutSettingRef.current = (settingName) =>
65
66
  get({}, ["settings", settingName], "");
66
67
 
67
- const isInDevelopmentMode =
68
- currentEnvironment === "development" && autoReload;
68
+ const isInDevelopmentMode = autoReload;
69
69
 
70
70
  const abortController = new AbortController();
71
71
  const { signal } = abortController;
@@ -95,9 +95,11 @@ const DataManagerProvider = ({ children }) => {
95
95
  });
96
96
  }
97
97
  } catch (err) {
98
- // please don't do this, because js stringify a error and that error is not readable in dev tool
99
- console.error(err);
100
- strapi.notification.error("notification.error");
98
+ console.error({ err });
99
+ toggleNotification({
100
+ type: 'error',
101
+ message: { id: 'notification.error' },
102
+ });
101
103
  }
102
104
  };
103
105
 
@@ -110,7 +112,6 @@ const DataManagerProvider = ({ children }) => {
110
112
  method: "GET",
111
113
  signal,
112
114
  });
113
-
114
115
  dispatch({
115
116
  type: GET_CONFIG_SUCCEEDED,
116
117
  config,
@@ -134,7 +135,10 @@ const DataManagerProvider = ({ children }) => {
134
135
  }
135
136
  } catch (err) {
136
137
  console.error({ err });
137
- strapi.notification.error("notification.error");
138
+ toggleNotification({
139
+ type: 'error',
140
+ message: { id: 'notification.error' },
141
+ });
138
142
  }
139
143
  };
140
144
 
@@ -152,40 +156,37 @@ const DataManagerProvider = ({ children }) => {
152
156
  }, [isLoading, pathname]);
153
157
 
154
158
  useEffect(() => {
155
- if (currentEnvironment === "development" && !autoReload) {
156
- strapi.notification.info(
157
- formatMessageRef.current({
158
- id: getTrad("notification.info.autoreaload-disable"),
159
- }),
160
- );
159
+ if (!autoReload) {
160
+ toggleNotification({
161
+ type: 'info',
162
+ message: { id: getTrad('notification.info.autoreaload-disable') },
163
+ });
161
164
  }
162
- }, [autoReload, currentEnvironment]);
165
+ }, [autoReload]);
163
166
 
164
- const getContentTypeItems = async ({type, query}, plugin = "") => {
167
+ const getContentTypeItems = async ({ modelUID, query }, plugin = "") => {
165
168
  dispatch({
166
169
  type: GET_CONTENT_TYPE_ITEMS,
167
170
  });
168
- const url = plugin ? `/${plugin}/${type}` : `/${type}`;
169
-
171
+ const url =`/navigation/content-type-items/${modelUID}`;
170
172
  const queryParams = new URLSearchParams();
171
173
  queryParams.append('_publicationState', 'preview');
172
174
  if (query) {
173
175
  queryParams.append('_q', query);
174
176
  }
175
-
177
+
176
178
  const contentTypeItems = await request(`${url}?${queryParams.toString()}`, {
177
179
  method: "GET",
178
180
  signal,
179
181
  });
180
182
 
181
- const fetchedContentType = find(config.contentTypes, ct => ct.endpoint === type);
182
-
183
+ const fetchedContentType = find(config.contentTypes, ct => ct.uid === modelUID);
183
184
  const isArray = Array.isArray(contentTypeItems);
184
185
  dispatch({
185
186
  type: GET_CONTENT_TYPE_ITEMS_SUCCEEDED,
186
187
  contentTypeItems: (isArray ? contentTypeItems : [contentTypeItems]).map(item => ({
187
188
  ...item,
188
- __collectionName: get(fetchedContentType, 'collectionName', type),
189
+ __collectionUid: get(fetchedContentType, 'collectionUid', modelUID),
189
190
  })),
190
191
  });
191
192
  };
@@ -195,86 +196,81 @@ const DataManagerProvider = ({ children }) => {
195
196
  };
196
197
 
197
198
  const handleChangeNavigationPopupVisibility = (visible) => {
198
- emitEvent("willChangeNavigationPopupVisibility");
199
199
  dispatch({
200
200
  type: CHANGE_NAVIGATION_POPUP_VISIBILITY,
201
201
  navigationPopupOpened: visible,
202
202
  });
203
- emitEvent("didChangeNavigationPopupVisibility");
204
- emitEvent(`navigationPopup${visible ? "Visible" : "Hidden"}`);
205
203
  };
206
204
 
207
205
  const handleChangeNavigationItemPopupVisibility = (visible) => {
208
- emitEvent("willChangeNavigationItemPopupVisibility");
209
206
  dispatch({
210
207
  type: CHANGE_NAVIGATION_ITEM_POPUP_VISIBILITY,
211
208
  navigationItemPopupOpened: visible,
212
209
  });
213
- emitEvent("didChangeNavigationItemPopupVisibility");
214
- emitEvent(`navigationItemPopup${visible ? "Visible" : "Hidden"}`);
215
210
  };
216
211
 
217
212
  const handleChangeNavigationData = (payload, forceClosePopups) => {
218
- emitEvent("willChangeNavigationData");
219
213
  dispatch({
220
214
  type: CHANGE_NAVIGATION_DATA,
221
215
  changedActiveItem: payload,
222
216
  forceClosePopups,
223
217
  });
224
- emitEvent("didChangeNavigationData");
225
218
  };
226
219
 
227
220
  const handleResetNavigationData = () => {
228
- emitEvent("willResetNavigationChanges");
229
- dispatch({
221
+ dispatch({
230
222
  type: RESET_NAVIGATION_DATA,
231
223
  activeItem,
232
224
  });
233
- emitEvent("didResetNavigationChanges");
234
225
  };
235
226
 
236
227
  const handleSubmitNavigation = async (formatMessage, payload = {}) => {
237
- try {
238
- emitEvent("willSubmitNavigation");
239
- dispatch({
240
- type: SUBMIT_NAVIGATION,
241
- });
242
-
243
- const nagivationId = payload.id ? `/${payload.id}` : "";
244
- const method = payload.id ? "PUT" : "POST";
245
- const navigation = await request(`/${pluginId}${nagivationId}`, {
246
- method,
247
- signal,
248
- body: payload,
249
- });
250
-
251
- dispatch({
252
- type: SUBMIT_NAVIGATION_SUCCEEDED,
253
- navigation: {
254
- ...navigation,
255
- items: prepareItemToViewPayload(navigation.items, null, config),
256
- },
257
- });
258
- emitEvent("didSubmitNavigation");
259
-
260
- strapi.notification.success(getTradId('notification.navigation.submit'));
261
- } catch (err) {
262
- dispatch({
263
- type: SUBMIT_NAVIGATION_ERROR,
264
- error: err.response.payload.data
265
- });
266
- console.error({ err: err.response });
267
- emitEvent('didNotSubmitNavigation');
268
- if (err.response.payload.data && err.response.payload.data.errorTitles) {
269
- return strapi.notification.error(
270
- formatMessage(
271
- getTrad('notification.navigation.error'),
272
- { ...err.response.payload.data, errorTitles: err.response.payload.data.errorTitles.join(' and ') },
273
- ),
274
- );
275
- }
276
- strapi.notification.error('notification.error');
277
- }
228
+ try {
229
+ dispatch({
230
+ type: SUBMIT_NAVIGATION,
231
+ });
232
+
233
+ const nagivationId = payload.id ? `/${payload.id}` : "";
234
+ const method = payload.id ? "PUT" : "POST";
235
+ const navigation = await request(`/${pluginId}${nagivationId}`, {
236
+ method,
237
+ signal,
238
+ body: payload,
239
+ });
240
+ dispatch({
241
+ type: SUBMIT_NAVIGATION_SUCCEEDED,
242
+ navigation: {
243
+ ...navigation,
244
+ items: prepareItemToViewPayload(navigation.items, null, config),
245
+ },
246
+ });
247
+ toggleNotification({
248
+ type: 'success',
249
+ message: { id: getTrad('notification.navigation.submit') },
250
+ });
251
+ } catch (err) {
252
+ dispatch({
253
+ type: SUBMIT_NAVIGATION_ERROR,
254
+ error: err.response.payload.data
255
+ });
256
+ console.error({ err: err.response });
257
+
258
+ if (err.response.payload.data && err.response.payload.data.errorTitles) {
259
+ return toggleNotification({
260
+ type: 'error',
261
+ message: {
262
+ id: formatMessage(
263
+ getTrad('notification.navigation.error'),
264
+ { ...err.response.payload.data, errorTitles: err.response.payload.data.errorTitles.join(' and ') },
265
+ )
266
+ },
267
+ });
268
+ }
269
+ toggleNotification({
270
+ type: 'error',
271
+ message: { id: getTrad('notification.error') },
272
+ });
273
+ }
278
274
  };
279
275
 
280
276
  return (
@@ -313,4 +309,4 @@ DataManagerProvider.propTypes = {
313
309
  children: PropTypes.node.isRequired,
314
310
  };
315
311
 
316
- export default memo(DataManagerProvider);
312
+ export default memo(DataManagerProvider);
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+
3
+ import { Flex } from '@strapi/design-system/Flex';
4
+
5
+ const NavigationContentHeader = ({ startActions, endActions }) => {
6
+ return (
7
+ <Flex justifyContent="space-between" width="100%">
8
+ <Flex alignItems="space-between">
9
+ {startActions}
10
+ </Flex>
11
+ <Flex alignItems="space-between">
12
+ {endActions}
13
+ </Flex>
14
+ </Flex>
15
+ );
16
+ }
17
+
18
+ export default NavigationContentHeader;
@@ -0,0 +1,60 @@
1
+ import React from 'react';
2
+ import { useIntl } from 'react-intl';
3
+ import { HeaderLayout } from '@strapi/design-system/Layout';
4
+ import { Stack } from '@strapi/design-system/Stack';
5
+ import { Button } from '@strapi/design-system/Button';
6
+ import { IconButton } from '@strapi/design-system/IconButton';
7
+ import Check from '@strapi/icons/Check';
8
+ import More from '@strapi/icons/More';
9
+ import Plus from '@strapi/icons/Plus';
10
+ import styled from 'styled-components';
11
+ import { getTrad } from '../../../../translations';
12
+ import { transformToRESTPayload } from '../../utils/parsers';
13
+ const MoreButton = styled(IconButton)`
14
+ margin: ${({ theme }) => `0 ${theme.spaces[2]}`};
15
+ padding: ${({ theme }) => theme.spaces[2]};
16
+
17
+ svg {
18
+ width: ${18 / 16}rem;
19
+ height: ${18 / 16}rem;
20
+ }
21
+ `;
22
+
23
+ const NavigationHeader = ({
24
+ structureHasErrors,
25
+ handleSave,
26
+ }) => {
27
+ const { formatMessage } = useIntl();
28
+
29
+ return (
30
+ <HeaderLayout
31
+ primaryAction={
32
+ <Stack horizontal size={2}>
33
+ <Button
34
+ onClick={handleSave}
35
+ startIcon={<Check />}
36
+ disabled={structureHasErrors}
37
+ type="submit"
38
+ >
39
+ {formatMessage(getTrad('submit.cta.save'))}
40
+ </Button>
41
+ <MoreButton
42
+ id="more"
43
+ label="More"
44
+ icon={<More />}
45
+ />
46
+ </Stack>
47
+ }
48
+ title={formatMessage({
49
+ id: getTrad('header.title'),
50
+ defaultMessage: 'UI Navigation',
51
+ })}
52
+ subtitle={formatMessage({
53
+ id: getTrad('header.description'),
54
+ defaultMessage: 'Define your portal navigation',
55
+ })}
56
+ />
57
+ );
58
+ };
59
+
60
+ export default NavigationHeader;