strapi-plugin-navigation 2.0.13 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/README.md +105 -27
  2. package/admin/src/components/Alert/styles.d.ts +2 -0
  3. package/admin/src/components/Alert/styles.js +10 -4
  4. package/admin/src/components/CollapseButton/index.d.ts +7 -0
  5. package/admin/src/components/CollapseButton/index.js +21 -22
  6. package/admin/src/components/ConfirmationDialog/index.d.ts +28 -0
  7. package/admin/src/components/ConfirmationDialog/index.js +32 -54
  8. package/admin/src/components/EmptyView/index.d.ts +3 -0
  9. package/admin/src/components/EmptyView/index.js +9 -7
  10. package/admin/src/components/Item/ItemCardBadge/index.d.ts +3 -0
  11. package/admin/src/components/Item/ItemCardBadge/index.js +11 -7
  12. package/admin/src/components/Item/ItemCardHeader/Wrapper.d.ts +3 -0
  13. package/admin/src/components/Item/ItemCardHeader/Wrapper.js +10 -6
  14. package/admin/src/components/Item/ItemCardHeader/index.d.ts +12 -0
  15. package/admin/src/components/Item/ItemCardHeader/index.js +33 -52
  16. package/admin/src/components/Item/ItemCardRemovedOverlay/index.d.ts +2 -0
  17. package/admin/src/components/Item/ItemCardRemovedOverlay/index.js +10 -4
  18. package/admin/src/components/Item/Wrapper.d.ts +3 -0
  19. package/admin/src/components/Item/Wrapper.js +10 -6
  20. package/admin/src/components/Item/index.d.ts +31 -0
  21. package/admin/src/components/Item/index.js +163 -242
  22. package/admin/src/components/NavigationItemList/Wrapper.d.ts +3 -0
  23. package/admin/src/components/NavigationItemList/Wrapper.js +9 -5
  24. package/admin/src/components/NavigationItemList/index.d.ts +35 -0
  25. package/admin/src/components/NavigationItemList/index.js +28 -66
  26. package/admin/src/components/RestartAlert/index.d.ts +3 -0
  27. package/admin/src/components/RestartAlert/index.js +10 -5
  28. package/admin/src/components/Search/index.d.ts +6 -0
  29. package/admin/src/components/Search/index.js +57 -46
  30. package/admin/src/components/icons/navigation.d.ts +6 -0
  31. package/admin/src/components/icons/navigation.js +11 -13
  32. package/admin/src/contexts/DataManagerContext.d.ts +3 -0
  33. package/admin/src/contexts/DataManagerContext.js +6 -5
  34. package/admin/src/hooks/useAllContentTypes.d.ts +6 -0
  35. package/admin/src/hooks/useAllContentTypes.js +10 -11
  36. package/admin/src/hooks/useDataManager.d.ts +3 -0
  37. package/admin/src/hooks/useDataManager.js +10 -6
  38. package/admin/src/hooks/useI18nCopyNavigationItemsModal.d.ts +9 -0
  39. package/admin/src/hooks/useI18nCopyNavigationItemsModal.js +51 -0
  40. package/admin/src/hooks/useNavigationConfig.d.ts +10 -0
  41. package/admin/src/hooks/useNavigationConfig.js +52 -56
  42. package/admin/src/hooks/useNavigationManager.d.ts +7 -0
  43. package/admin/src/hooks/useNavigationManager.js +41 -0
  44. package/admin/src/index.d.ts +14 -0
  45. package/admin/src/index.js +92 -76
  46. package/admin/src/pages/App/index.d.ts +3 -0
  47. package/admin/src/pages/App/index.js +43 -31
  48. package/admin/src/pages/DataManagerProvider/actions.d.ts +19 -0
  49. package/admin/src/pages/DataManagerProvider/actions.js +22 -26
  50. package/admin/src/pages/DataManagerProvider/index.d.ts +12 -0
  51. package/admin/src/pages/DataManagerProvider/index.js +316 -298
  52. package/admin/src/pages/DataManagerProvider/init.d.ts +3 -0
  53. package/admin/src/pages/DataManagerProvider/init.js +5 -3
  54. package/admin/src/pages/DataManagerProvider/reducer.d.ts +19 -0
  55. package/admin/src/pages/DataManagerProvider/reducer.js +119 -121
  56. package/admin/src/pages/SettingsPage/components/DisableI18nModal/index.d.ts +24 -0
  57. package/admin/src/pages/SettingsPage/components/DisableI18nModal/index.js +88 -0
  58. package/admin/src/pages/SettingsPage/index.d.ts +3 -0
  59. package/admin/src/pages/SettingsPage/index.js +242 -335
  60. package/admin/src/pages/SettingsPage/utils/functions.d.ts +5 -0
  61. package/admin/src/pages/SettingsPage/utils/functions.js +3 -8
  62. package/admin/src/pages/View/components/I18nCopyNavigationItems/index.d.ts +14 -0
  63. package/admin/src/pages/View/components/I18nCopyNavigationItems/index.js +15 -0
  64. package/admin/src/pages/View/components/NavigationContentHeader/index.d.ts +6 -0
  65. package/admin/src/pages/View/components/NavigationContentHeader/index.js +13 -17
  66. package/admin/src/pages/View/components/NavigationHeader/index.d.ts +12 -0
  67. package/admin/src/pages/View/components/NavigationHeader/index.js +79 -65
  68. package/admin/src/pages/View/components/NavigationHeader/styles.d.ts +2 -0
  69. package/admin/src/pages/View/components/NavigationHeader/styles.js +10 -5
  70. package/admin/src/pages/View/components/NavigationItemForm/index.d.ts +57 -0
  71. package/admin/src/pages/View/components/NavigationItemForm/index.js +416 -453
  72. package/admin/src/pages/View/components/NavigationItemForm/utils/form.d.ts +45 -0
  73. package/admin/src/pages/View/components/NavigationItemForm/utils/form.js +84 -52
  74. package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupFooter.d.ts +23 -0
  75. package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupFooter.js +24 -34
  76. package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupHeader.d.ts +4 -0
  77. package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupHeader.js +16 -16
  78. package/admin/src/pages/View/components/NavigationItemPopup/index.d.ts +30 -0
  79. package/admin/src/pages/View/components/NavigationItemPopup/index.js +85 -108
  80. package/admin/src/pages/View/components/NavigationManager/Create/index.d.ts +9 -0
  81. package/admin/src/pages/View/components/NavigationManager/Create/index.js +57 -0
  82. package/admin/src/pages/View/components/NavigationManager/Delete/index.d.ts +8 -0
  83. package/admin/src/pages/View/components/NavigationManager/Delete/index.js +28 -0
  84. package/admin/src/pages/View/components/NavigationManager/Edit/index.d.ts +8 -0
  85. package/admin/src/pages/View/components/NavigationManager/Edit/index.js +54 -0
  86. package/admin/src/pages/View/components/NavigationManager/Error/index.d.ts +8 -0
  87. package/admin/src/pages/View/components/NavigationManager/Error/index.js +53 -0
  88. package/admin/src/pages/View/components/NavigationManager/Form/index.d.ts +19 -0
  89. package/admin/src/pages/View/components/NavigationManager/Form/index.js +98 -0
  90. package/admin/src/pages/View/components/NavigationManager/List/index.d.ts +8 -0
  91. package/admin/src/pages/View/components/NavigationManager/List/index.js +138 -0
  92. package/admin/src/pages/View/components/NavigationManager/index.d.ts +10 -0
  93. package/admin/src/pages/View/components/NavigationManager/index.js +189 -0
  94. package/admin/src/pages/View/components/NavigationManager/types.d.ts +53 -0
  95. package/admin/src/pages/View/components/NavigationManager/types.js +3 -0
  96. package/admin/src/pages/View/index.d.ts +4 -0
  97. package/admin/src/pages/View/index.js +231 -304
  98. package/admin/src/pages/View/utils/enums.d.ts +9 -0
  99. package/admin/src/pages/View/utils/enums.js +11 -8
  100. package/admin/src/pages/View/utils/form.d.ts +2 -0
  101. package/admin/src/pages/View/utils/form.js +15 -12
  102. package/admin/src/pages/View/utils/index.d.ts +2 -0
  103. package/admin/src/pages/View/utils/index.js +11 -3
  104. package/admin/src/pages/View/utils/parsers.d.ts +49 -0
  105. package/admin/src/pages/View/utils/parsers.js +239 -278
  106. package/admin/src/permissions.d.ts +12 -0
  107. package/admin/src/permissions.js +11 -7
  108. package/admin/src/pluginId.d.ts +3 -0
  109. package/admin/src/pluginId.js +2 -2
  110. package/admin/src/translations/en.json +157 -104
  111. package/admin/src/translations/fr.json +44 -44
  112. package/admin/src/translations/index.d.ts +12 -0
  113. package/admin/src/translations/index.js +17 -11
  114. package/admin/src/utils/api.d.ts +8 -0
  115. package/admin/src/utils/api.js +54 -50
  116. package/admin/src/utils/getTrad.d.ts +3 -0
  117. package/admin/src/utils/getTrad.js +9 -5
  118. package/admin/src/utils/index.d.ts +18 -0
  119. package/admin/src/utils/index.js +36 -15
  120. package/package.json +20 -19
  121. package/permissions.d.ts +9 -0
  122. package/permissions.js +5 -4
  123. package/server/bootstrap/index.d.ts +4 -0
  124. package/server/bootstrap/index.js +41 -0
  125. package/server/config/index.d.ts +5 -0
  126. package/server/config/index.js +33 -9
  127. package/server/config/setupStrategy.d.ts +3 -0
  128. package/server/config/setupStrategy.js +38 -0
  129. package/server/content-types/audience/index.d.ts +27 -0
  130. package/server/content-types/audience/index.js +9 -8
  131. package/server/content-types/audience/schema.d.ts +25 -0
  132. package/server/content-types/audience/schema.js +26 -0
  133. package/server/content-types/index.d.ts +255 -0
  134. package/server/content-types/index.js +15 -12
  135. package/server/content-types/navigation/index.d.ts +64 -0
  136. package/server/content-types/navigation/index.js +11 -8
  137. package/server/content-types/navigation/lifecycle.d.ts +9 -0
  138. package/server/content-types/navigation/lifecycle.js +8 -12
  139. package/server/content-types/navigation/schema.d.ts +55 -0
  140. package/server/content-types/navigation/schema.js +56 -0
  141. package/server/content-types/navigation-item/index.d.ts +112 -0
  142. package/server/content-types/navigation-item/index.js +11 -8
  143. package/server/content-types/navigation-item/lifecycle.d.ts +16 -0
  144. package/server/content-types/navigation-item/lifecycle.js +28 -32
  145. package/server/content-types/navigation-item/schema.d.ts +97 -0
  146. package/server/content-types/navigation-item/schema.js +102 -0
  147. package/server/content-types/navigations-items-related/index.d.ts +56 -0
  148. package/server/content-types/navigations-items-related/index.js +11 -8
  149. package/server/content-types/navigations-items-related/lifecycle.d.ts +8 -0
  150. package/server/content-types/navigations-items-related/lifecycle.js +20 -17
  151. package/server/content-types/navigations-items-related/schema.d.ts +49 -0
  152. package/server/content-types/navigations-items-related/schema.js +50 -0
  153. package/server/controllers/admin.d.ts +4 -0
  154. package/server/controllers/admin.js +130 -0
  155. package/server/controllers/client.d.ts +4 -0
  156. package/server/controllers/client.js +57 -0
  157. package/server/controllers/index.d.ts +4 -0
  158. package/server/controllers/index.js +12 -6
  159. package/server/destroy.d.ts +3 -0
  160. package/server/destroy.js +5 -0
  161. package/server/graphql/config.d.ts +4 -0
  162. package/server/graphql/config.js +28 -0
  163. package/server/graphql/index.d.ts +2 -0
  164. package/server/graphql/index.js +18 -22
  165. package/server/graphql/queries/index.d.ts +3 -0
  166. package/server/graphql/queries/index.js +15 -15
  167. package/server/graphql/queries/render-navigation-child.d.ts +15 -0
  168. package/server/graphql/queries/render-navigation-child.js +24 -15
  169. package/server/graphql/queries/render-navigation.d.ts +21 -0
  170. package/server/graphql/queries/render-navigation.js +31 -15
  171. package/server/graphql/resolvers-config.d.ts +10 -0
  172. package/server/graphql/resolvers-config.js +5 -3
  173. package/server/graphql/setupStrategy.d.ts +3 -0
  174. package/server/graphql/setupStrategy.js +15 -0
  175. package/server/graphql/types/content-types-name-fields.d.ts +6 -0
  176. package/server/graphql/types/content-types-name-fields.js +13 -9
  177. package/server/graphql/types/content-types.d.ts +5 -0
  178. package/server/graphql/types/content-types.js +17 -15
  179. package/server/graphql/types/create-navigation-item.d.ts +5 -0
  180. package/server/graphql/types/create-navigation-item.js +18 -16
  181. package/server/graphql/types/create-navigation-related.d.ts +5 -0
  182. package/server/graphql/types/create-navigation-related.js +9 -7
  183. package/server/graphql/types/create-navigation.d.ts +5 -0
  184. package/server/graphql/types/create-navigation.js +8 -6
  185. package/server/graphql/types/index.d.ts +3 -0
  186. package/server/graphql/types/index.js +15 -13
  187. package/server/graphql/types/navigation-config.d.ts +5 -0
  188. package/server/graphql/types/navigation-config.js +10 -8
  189. package/server/graphql/types/navigation-details.d.ts +5 -0
  190. package/server/graphql/types/navigation-details.js +11 -9
  191. package/server/graphql/types/navigation-item-related-data.d.ts +5 -0
  192. package/server/graphql/types/navigation-item-related-data.js +9 -0
  193. package/server/graphql/types/navigation-item-related.d.ts +7 -0
  194. package/server/graphql/types/navigation-item-related.js +25 -0
  195. package/server/graphql/types/navigation-item.d.ts +5 -0
  196. package/server/graphql/types/navigation-item.js +28 -29
  197. package/server/graphql/types/navigation-render-type.d.ts +5 -0
  198. package/server/graphql/types/navigation-render-type.js +7 -4
  199. package/server/graphql/types/navigation.d.ts +5 -0
  200. package/server/graphql/types/navigation.js +10 -8
  201. package/server/i18n/constant.d.ts +2 -0
  202. package/server/i18n/constant.js +5 -0
  203. package/server/i18n/errors.d.ts +7 -0
  204. package/server/i18n/errors.js +14 -0
  205. package/server/i18n/graphQLEnhancers.d.ts +10 -0
  206. package/server/i18n/graphQLEnhancers.js +10 -0
  207. package/server/i18n/index.d.ts +8 -0
  208. package/server/i18n/index.js +23 -0
  209. package/server/i18n/navigationSetupStrategy.d.ts +3 -0
  210. package/server/i18n/navigationSetupStrategy.js +119 -0
  211. package/server/i18n/serviceEnhancers.d.ts +13 -0
  212. package/server/i18n/serviceEnhancers.js +156 -0
  213. package/server/i18n/types.d.ts +60 -0
  214. package/server/i18n/types.js +3 -0
  215. package/server/i18n/utils.d.ts +12 -0
  216. package/server/i18n/utils.js +29 -0
  217. package/server/index.d.ts +273 -0
  218. package/server/index.js +26 -0
  219. package/server/navigation/index.d.ts +2 -0
  220. package/server/navigation/index.js +18 -0
  221. package/server/navigation/setupStrategy.d.ts +3 -0
  222. package/server/navigation/setupStrategy.js +39 -0
  223. package/server/register/index.d.ts +3 -0
  224. package/server/register/index.js +4 -0
  225. package/server/routes/admin.d.ts +4 -0
  226. package/server/routes/admin.js +82 -61
  227. package/server/routes/client.d.ts +4 -0
  228. package/server/routes/client.js +25 -21
  229. package/server/routes/index.d.ts +6 -0
  230. package/server/routes/index.js +13 -4
  231. package/server/services/admin.d.ts +5 -0
  232. package/server/services/admin.js +238 -0
  233. package/server/services/client.d.ts +5 -0
  234. package/server/services/client.js +249 -0
  235. package/server/services/common.d.ts +5 -0
  236. package/server/services/common.js +313 -0
  237. package/server/services/index.d.ts +7 -0
  238. package/server/services/index.js +14 -6
  239. package/server/utils/constant.d.ts +27 -0
  240. package/server/utils/constant.js +24 -0
  241. package/server/utils/functions.d.ts +139 -0
  242. package/server/utils/functions.js +226 -0
  243. package/server/utils/index.d.ts +3 -0
  244. package/server/utils/index.js +19 -0
  245. package/strapi-admin.d.ts +3 -0
  246. package/strapi-admin.js +8 -1
  247. package/strapi-server.d.ts +273 -0
  248. package/strapi-server.js +6 -17
  249. package/tsconfig.tsbuildinfo +1 -0
  250. package/types/bootstrap.d.ts +13 -0
  251. package/types/bootstrap.js +3 -0
  252. package/types/config.d.ts +21 -0
  253. package/types/config.js +3 -0
  254. package/types/contentTypes.d.ts +85 -0
  255. package/types/contentTypes.js +3 -0
  256. package/types/controllers.d.ts +48 -0
  257. package/types/controllers.js +5 -0
  258. package/types/graphQL.d.ts +3 -0
  259. package/types/graphQL.js +3 -0
  260. package/types/i18n.d.ts +9 -0
  261. package/types/i18n.js +3 -0
  262. package/types/index.d.ts +9 -0
  263. package/types/index.js +25 -0
  264. package/types/services.d.ts +74 -0
  265. package/types/services.js +3 -0
  266. package/types/utils.d.ts +62 -0
  267. package/types/utils.js +27 -0
  268. package/utils/InvalidParamNavigationError.d.ts +4 -0
  269. package/utils/InvalidParamNavigationError.js +8 -0
  270. package/utils/NavigationError.d.ts +5 -0
  271. package/utils/NavigationError.js +7 -7
  272. package/__mocks__/pages.settings.json +0 -25
  273. package/__mocks__/strapi.js +0 -207
  274. package/jest.config.js +0 -14
  275. package/server/bootstrap.js +0 -52
  276. package/server/config.js +0 -9
  277. package/server/content-types/audience/lifecycle.js +0 -8
  278. package/server/content-types/audience/schema.json +0 -23
  279. package/server/content-types/navigation/schema.json +0 -45
  280. package/server/content-types/navigation-item/schema.json +0 -99
  281. package/server/content-types/navigations-items-related/schema.json +0 -47
  282. package/server/controllers/navigation.js +0 -105
  283. package/server/graphql/types/navigation-related.js +0 -25
  284. package/server/services/__tests__/functions.test.js +0 -48
  285. package/server/services/__tests__/navigation.test.js +0 -91
  286. package/server/services/navigation.js +0 -791
  287. package/server/services/utils/constant.js +0 -21
  288. package/server/services/utils/functions.js +0 -226
@@ -1,471 +1,434 @@
1
- import React, { useEffect, useMemo, useState, useCallback } from 'react';
2
- import { debounce, find, get, first, isEmpty, isEqual, isNil, isString } from 'lodash';
3
- import PropTypes from 'prop-types';
4
- import { Formik } from 'formik'
5
- import slugify from 'slugify';
6
-
7
- // Design System
8
- import { ModalBody } from '@strapi/design-system/ModalLayout';
9
- import { Select, Option } from '@strapi/design-system/Select';
10
- import { Grid, GridItem } from '@strapi/design-system/Grid';
11
- import { Form, GenericInput } from '@strapi/helper-plugin';
12
-
13
- import { NavigationItemPopupFooter } from '../NavigationItemPopup/NavigationItemPopupFooter';
14
- import { navigationItemAdditionalFields, navigationItemType } from '../../utils/enums';
15
- import { extractRelatedItemLabel } from '../../utils/parsers';
16
- import { form as formDefinition } from './utils/form';
17
- import { checkFormValidity } from '../../utils/form';
18
- import { getTradId } from '../../../../translations';
19
- import { getMessage } from '../../../../utils';
20
-
21
- const NavigationItemForm = ({
22
- isLoading,
23
- inputsPrefix,
24
- data = {},
25
- contentTypes = [],
26
- contentTypeEntities = [],
27
- usedContentTypeEntities = [],
28
- availableAudience = [],
29
- additionalFields = [],
30
- contentTypesNameFields = {},
31
- onSubmit,
32
- onCancel,
33
- getContentTypeEntities,
34
- usedContentTypesData,
35
- appendLabelPublicationStatus = () => '',
36
- }) => {
37
- const [hasBeenInitialized, setInitializedState] = useState(false);
38
- const [hasChanged, setChangedState] = useState(false);
39
- const [contentTypeSearchQuery, setContentTypeSearchQuery] = useState(undefined);
40
- const [contentTypeSearchInputValue, setContentTypeSearchInputValue] = useState(undefined);
41
- const [form, setFormState] = useState({});
42
- const [formErrors, setFormErrorsState] = useState({});
43
- const { relatedType } = form;
44
-
45
- const relatedFieldName = `${inputsPrefix}related`;
46
-
47
- if (!hasBeenInitialized && !isEmpty(data)) {
48
- setInitializedState(true);
49
- setFormState({
50
- ...data,
51
- type: data.type || navigationItemType.INTERNAL,
52
- related: data.related?.value,
53
- relatedType: data.relatedType?.value,
54
- audience: data.audience?.map(item => item.id),
55
- });
56
- }
57
-
58
- const audience = get(form, `${inputsPrefix}audience`, []);
59
- const audienceOptions = availableAudience.map((item) => ({
60
- value: get(item, 'id', " "),
61
- label: get(item, 'name', " "),
62
- }));
63
-
64
- const generatePreviewPath = () => {
65
- if (!isExternal) {
66
- const value = `${data.levelPath !== '/' ? `${data.levelPath}` : ''}/${form.path !== '/' ? form.path || '' : ''}`;
67
- return {
68
- id: getTradId('popup.item.form.type.external.description'),
69
- defaultMessage: '',
70
- values: { value }
71
- }
72
- }
73
- return null;
74
- };
75
-
76
- const sanitizePayload = (payload = {}) => {
77
- const { onItemClick, onItemLevelAddClick, related, relatedType, menuAttached, type, ...purePayload } = payload;
78
- const relatedId = related;
79
- const singleRelatedItem = isSingleSelected ? first(contentTypeEntities) : undefined;
80
- const relatedCollectionType = relatedType;
81
- const title = payload.title;
82
-
83
- return {
84
- ...purePayload,
85
- title,
86
- type,
87
- menuAttached: isNil(menuAttached) ? false : menuAttached,
88
- path: type !== navigationItemType.EXTERNAL ? purePayload.path : undefined,
89
- externalPath: type === navigationItemType.EXTERNAL ? purePayload.externalPath : undefined,
90
- related: type === navigationItemType.INTERNAL ? relatedId : undefined,
91
- relatedType: type === navigationItemType.INTERNAL ? relatedCollectionType : undefined,
92
- isSingle: isSingleSelected,
93
- singleRelatedItem,
94
- uiRouterKey: generateUiRouterKey(title, relatedId, relatedCollectionType),
95
- };
96
- };
97
-
98
- const handleSubmit = async e => {
99
- if (e) {
100
- e.preventDefault();
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
101
7
  }
102
-
103
- const payload = sanitizePayload(form);
104
- const errors = await checkFormValidity(payload, formDefinition.schema(isSingleSelected));
105
- if (!errors || isEmpty(errors)) {
106
- return onSubmit(payload);
107
- } else {
108
- setFormErrorsState(errors);
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const react_1 = __importStar(require("react"));
30
+ const lodash_1 = require("lodash");
31
+ const prop_types_1 = __importDefault(require("prop-types"));
32
+ const formik_1 = require("formik");
33
+ const slugify_1 = __importDefault(require("slugify"));
34
+ const ModalLayout_1 = require("@strapi/design-system/ModalLayout");
35
+ const Select_1 = require("@strapi/design-system/Select");
36
+ const Grid_1 = require("@strapi/design-system/Grid");
37
+ const helper_plugin_1 = require("@strapi/helper-plugin");
38
+ const Button_1 = require("@strapi/design-system/Button");
39
+ const NavigationItemPopupFooter_1 = require("../NavigationItemPopup/NavigationItemPopupFooter");
40
+ const enums_1 = require("../../utils/enums");
41
+ const parsers_1 = require("../../utils/parsers");
42
+ const form_1 = require("./utils/form");
43
+ const form_2 = require("../../utils/form");
44
+ const translations_1 = require("../../../../translations");
45
+ const utils_1 = require("../../../../utils");
46
+ const appendLabelPublicationStatusFallback = () => '';
47
+ const NavigationItemForm = ({ config, availableLocale, isLoading: isPreloading, inputsPrefix, data = {}, contentTypes = [], contentTypeEntities = [], usedContentTypeEntities = [], availableAudience = [], additionalFields = [], contentTypesNameFields = {}, onSubmit, onCancel, getContentTypeEntities, usedContentTypesData, appendLabelPublicationStatus = appendLabelPublicationStatusFallback, locale, readNavigationItemFromLocale, }) => {
48
+ const [isLoading, setIsLoading] = (0, react_1.useState)(isPreloading);
49
+ const [hasBeenInitialized, setInitializedState] = (0, react_1.useState)(false);
50
+ const [hasChanged, setChangedState] = (0, react_1.useState)(false);
51
+ const [contentTypeSearchQuery, setContentTypeSearchQuery] = (0, react_1.useState)(undefined);
52
+ const [contentTypeSearchInputValue, setContentTypeSearchInputValue] = (0, react_1.useState)(undefined);
53
+ const [form, setFormState] = (0, react_1.useState)({});
54
+ const [formErrors, setFormErrorsState] = (0, react_1.useState)({});
55
+ const { relatedType } = form;
56
+ const isI18nBootstrapAvailable = !!(config.i18nEnabled && availableLocale && availableLocale.length);
57
+ const availableLocaleOptions = (0, react_1.useMemo)(() => availableLocale.map((locale) => ({
58
+ value: locale,
59
+ label: locale,
60
+ metadatas: {
61
+ intlLabel: {
62
+ id: `i18n.locale.${locale}`,
63
+ defaultMessage: locale,
64
+ }
65
+ },
66
+ })), [availableLocale]);
67
+ const relatedFieldName = `${inputsPrefix}related`;
68
+ if (!hasBeenInitialized && !(0, lodash_1.isEmpty)(data)) {
69
+ setInitializedState(true);
70
+ setFormState({
71
+ ...data,
72
+ type: data.type || enums_1.navigationItemType.INTERNAL,
73
+ related: data.related?.value,
74
+ relatedType: data.relatedType?.value,
75
+ audience: data.audience?.map(item => item.id),
76
+ });
109
77
  }
110
- };
111
-
112
- const onAudienceChange = (value) => {
113
- onChange({ target: { name: `${inputsPrefix}audience`, value } });
114
- }
115
-
116
- const onChange = ({ target: { name, value } }) => {
117
- setFormState(prevState => ({
118
- ...prevState,
119
- updated: true,
120
- [name]: value,
78
+ const audience = (0, lodash_1.get)(form, `${inputsPrefix}audience`, []);
79
+ const audienceOptions = availableAudience.map((item) => ({
80
+ value: (0, lodash_1.get)(item, 'id', " "),
81
+ label: (0, lodash_1.get)(item, 'name', " "),
121
82
  }));
122
- if (!hasChanged) {
123
- setChangedState(true);
124
- }
125
- };
126
-
127
- const generateUiRouterKey = (title, related, relatedType) => {
128
- if (title) {
129
- return isString(title) && !isEmpty(title) ? slugify(title).toLowerCase() : undefined;
130
- } else if (related) {
131
- const relationTitle = extractRelatedItemLabel({
132
- ...contentTypeEntities.find(_ => _.id === related),
133
- __collectionUid: relatedType
134
- }, contentTypesNameFields, { contentTypes });
135
- return isString(relationTitle) && !isEmpty(relationTitle) ? slugify(relationTitle).toLowerCase() : undefined;
136
- }
137
- return undefined;
138
- };
139
-
140
- const initialRelatedTypeSelected = data?.relatedType?.value;
141
- const relatedTypeSelectValue = form.relatedType;
142
- const relatedSelectValue = form.related;
143
-
144
- const isSingleSelected = useMemo(
145
- () => relatedTypeSelectValue ? contentTypes.find(_ => _.uid === relatedTypeSelectValue)?.isSingle || false : false,
146
- [relatedTypeSelectValue, contentTypes],
147
- );
148
-
149
- const navigationItemTypeOptions = Object.keys(navigationItemType).map(key => {
150
- const value = navigationItemType[key].toLowerCase();
151
- return {
152
- key,
153
- value: navigationItemType[key],
154
- metadatas: {
155
- intlLabel: {
156
- id: getTradId(`popup.item.form.type.${value}.label`),
157
- defaultMessage: getTradId(`popup.item.form.type.${value}.label`),
83
+ const generatePreviewPath = () => {
84
+ if (!isExternal) {
85
+ const value = `${data.levelPath !== '/' ? `${data.levelPath}` : ''}/${form.path !== '/' ? form.path || '' : ''}`;
86
+ return {
87
+ id: (0, translations_1.getTradId)('popup.item.form.type.external.description'),
88
+ defaultMessage: '',
89
+ values: { value }
90
+ };
158
91
  }
159
- }
160
- }
161
- });
162
-
163
- const relatedSelectOptions = contentTypeEntities
164
- .filter((item) => {
165
- const usedContentTypeEntitiesOfSameType = usedContentTypeEntities
166
- .filter(uctItem => relatedTypeSelectValue === uctItem.__collectionUid);
167
- return !find(usedContentTypeEntitiesOfSameType, uctItem => (item.id === uctItem.id && uctItem.id !== form.related));
92
+ return null;
93
+ };
94
+ const getDefaultTitle = (0, react_1.useCallback)((related, relatedType, isSingleSelected) => {
95
+ if (isSingleSelected) {
96
+ return contentTypes.find(_ => _.uid === relatedType)?.label;
97
+ }
98
+ else {
99
+ return (0, parsers_1.extractRelatedItemLabel)({
100
+ ...contentTypeEntities.find(_ => _.id === related),
101
+ __collectionUid: relatedType
102
+ }, contentTypesNameFields, { contentTypes });
103
+ }
104
+ }, [contentTypeEntities, contentTypesNameFields, contentTypes]);
105
+ const sanitizePayload = (payload = {}) => {
106
+ const { onItemClick, onItemLevelAddClick, related, relatedType, menuAttached, type, ...purePayload } = payload;
107
+ const relatedId = related;
108
+ const singleRelatedItem = isSingleSelected ? (0, lodash_1.first)(contentTypeEntities) : undefined;
109
+ const relatedCollectionType = relatedType;
110
+ const title = !!payload.title?.trim()
111
+ ? payload.title
112
+ : getDefaultTitle(related, relatedType, isSingleSelected);
113
+ return {
114
+ ...purePayload,
115
+ title,
116
+ type,
117
+ menuAttached: (0, lodash_1.isNil)(menuAttached) ? false : menuAttached,
118
+ path: type !== enums_1.navigationItemType.EXTERNAL ? purePayload.path : undefined,
119
+ externalPath: type === enums_1.navigationItemType.EXTERNAL ? purePayload.externalPath : undefined,
120
+ related: type === enums_1.navigationItemType.INTERNAL ? relatedId : undefined,
121
+ relatedType: type === enums_1.navigationItemType.INTERNAL ? relatedCollectionType : undefined,
122
+ isSingle: isSingleSelected,
123
+ singleRelatedItem,
124
+ uiRouterKey: generateUiRouterKey(title, relatedId, relatedCollectionType),
125
+ };
126
+ };
127
+ const handleSubmit = async (e) => {
128
+ if (e) {
129
+ e.preventDefault();
130
+ }
131
+ const payload = sanitizePayload(form);
132
+ const errors = await (0, form_2.checkFormValidity)(payload, form_1.form.schema(isSingleSelected));
133
+ if (!errors || (0, lodash_1.isEmpty)(errors)) {
134
+ return onSubmit(payload);
135
+ }
136
+ else {
137
+ setFormErrorsState(errors);
138
+ }
139
+ };
140
+ const onAudienceChange = (value) => {
141
+ onChange({ target: { name: `${inputsPrefix}audience`, value } });
142
+ };
143
+ const onChange = ({ target: { name, value } }) => {
144
+ setFormState(prevState => ({
145
+ ...prevState,
146
+ updated: true,
147
+ [name]: value,
148
+ }));
149
+ if (!hasChanged) {
150
+ setChangedState(true);
151
+ }
152
+ };
153
+ const generateUiRouterKey = (title, related, relatedType) => {
154
+ if (title) {
155
+ return (0, lodash_1.isString)(title) && !(0, lodash_1.isEmpty)(title) ? (0, slugify_1.default)(title).toLowerCase() : undefined;
156
+ }
157
+ else if (related) {
158
+ const relationTitle = (0, parsers_1.extractRelatedItemLabel)({
159
+ ...contentTypeEntities.find(_ => _.id === related),
160
+ __collectionUid: relatedType
161
+ }, contentTypesNameFields, { contentTypes });
162
+ return (0, lodash_1.isString)(relationTitle) && !(0, lodash_1.isEmpty)(relationTitle) ? (0, slugify_1.default)(relationTitle).toLowerCase() : undefined;
163
+ }
164
+ return undefined;
165
+ };
166
+ const initialRelatedTypeSelected = data?.relatedType?.value;
167
+ const relatedTypeSelectValue = form.relatedType;
168
+ const relatedSelectValue = form.related;
169
+ const isSingleSelected = (0, react_1.useMemo)(() => relatedTypeSelectValue ? contentTypes.find(_ => _.uid === relatedTypeSelectValue)?.isSingle || false : false, [relatedTypeSelectValue, contentTypes]);
170
+ const navigationItemTypeOptions = Object.keys(enums_1.navigationItemType).map(key => {
171
+ const value = enums_1.navigationItemType[key].toLowerCase();
172
+ return {
173
+ key,
174
+ value: enums_1.navigationItemType[key],
175
+ metadatas: {
176
+ intlLabel: {
177
+ id: (0, translations_1.getTradId)(`popup.item.form.type.${value}.label`),
178
+ defaultMessage: (0, translations_1.getTradId)(`popup.item.form.type.${value}.label`),
179
+ }
180
+ }
181
+ };
182
+ });
183
+ const relatedSelectOptions = contentTypeEntities
184
+ .filter((item) => {
185
+ const usedContentTypeEntitiesOfSameType = usedContentTypeEntities
186
+ .filter(uctItem => relatedTypeSelectValue === uctItem.__collectionUid);
187
+ return !(0, lodash_1.find)(usedContentTypeEntitiesOfSameType, uctItem => (item.id === uctItem.id && uctItem.id !== form.related));
168
188
  })
169
- .map((item) => {
170
- const label = appendLabelPublicationStatus(
171
- extractRelatedItemLabel({
172
- ...item,
173
- __collectionUid: get(relatedTypeSelectValue, 'value', relatedTypeSelectValue),
174
- }, contentTypesNameFields, { contentTypes }),
175
- item
176
- );
177
- return ({
178
- key: get(item, 'id'),
179
- metadatas: {
180
- intlLabel: {
181
- id: label || `${item.__collectionUid} ${item.id}`,
182
- defaultMessage: label || `${item.__collectionUid} ${item.id}`,
183
- }
184
- },
185
- value: item.id,
186
- label: label,
187
- })
189
+ .map((item) => {
190
+ const label = appendLabelPublicationStatus((0, parsers_1.extractRelatedItemLabel)({
191
+ ...item,
192
+ __collectionUid: (0, lodash_1.get)(relatedTypeSelectValue, 'value', relatedTypeSelectValue),
193
+ }, contentTypesNameFields, { contentTypes }), item);
194
+ return ({
195
+ key: (0, lodash_1.get)(item, 'id'),
196
+ metadatas: {
197
+ intlLabel: {
198
+ id: label || `${item.__collectionUid} ${item.id}`,
199
+ defaultMessage: label || `${item.__collectionUid} ${item.id}`,
200
+ }
201
+ },
202
+ value: item.id,
203
+ label: label,
204
+ });
188
205
  });
189
-
190
- const isExternal = form.type === navigationItemType.EXTERNAL;
191
- const pathSourceName = isExternal ? 'externalPath' : 'path';
192
-
193
- const submitDisabled =
194
- (form.type === navigationItemType.INTERNAL && !isSingleSelected && isNil(get(form, `${inputsPrefix}related`))) ||
195
- (form.type === navigationItemType.WRAPPER && isNil(get(form, `${inputsPrefix}title`)));
196
-
197
- const debouncedSearch = useCallback(
198
- debounce(nextValue => setContentTypeSearchQuery(nextValue), 500),
199
- [],
200
- );
201
-
202
- const debounceContentTypeSearchQuery = value => {
203
- setContentTypeSearchInputValue(value);
204
- debouncedSearch(value);
205
- };
206
-
207
- const onChangeRelatedType = ({ target: { name, value } }) => {
208
- const relatedTypeBeingReverted = data.relatedType && (data.relatedType.value === get(value, 'value', value));
209
- setContentTypeSearchQuery(undefined);
210
- setContentTypeSearchInputValue(undefined);
211
- setFormState(prevState => ({
212
- ...prevState,
213
- updated: true,
214
- related: relatedTypeBeingReverted ? data.related?.value : undefined,
215
- [name]: value,
216
- }));
217
- if (!hasChanged) {
218
- setChangedState(true);
219
- }
220
- };
221
-
222
- const relatedTypeSelectOptions = useMemo(
223
- () => contentTypes
224
- .filter((contentType) => {
206
+ const isExternal = form.type === enums_1.navigationItemType.EXTERNAL;
207
+ const pathSourceName = isExternal ? 'externalPath' : 'path';
208
+ const submitDisabled = (form.type === enums_1.navigationItemType.INTERNAL && !isSingleSelected && (0, lodash_1.isNil)((0, lodash_1.get)(form, `${inputsPrefix}related`))) ||
209
+ (form.type === enums_1.navigationItemType.WRAPPER && (0, lodash_1.isNil)((0, lodash_1.get)(form, `${inputsPrefix}title`)));
210
+ const debouncedSearch = (0, react_1.useCallback)((0, lodash_1.debounce)(nextValue => setContentTypeSearchQuery(nextValue), 500), []);
211
+ const debounceContentTypeSearchQuery = value => {
212
+ setContentTypeSearchInputValue(value);
213
+ debouncedSearch(value);
214
+ };
215
+ const onChangeRelatedType = ({ target: { name, value } }) => {
216
+ const relatedTypeBeingReverted = data.relatedType && (data.relatedType.value === (0, lodash_1.get)(value, 'value', value));
217
+ setContentTypeSearchQuery(undefined);
218
+ setContentTypeSearchInputValue(undefined);
219
+ setFormState(prevState => ({
220
+ ...prevState,
221
+ updated: true,
222
+ related: relatedTypeBeingReverted ? data.related?.value : undefined,
223
+ [name]: value,
224
+ }));
225
+ if (!hasChanged) {
226
+ setChangedState(true);
227
+ }
228
+ };
229
+ const relatedTypeSelectOptions = (0, react_1.useMemo)(() => contentTypes
230
+ .filter((contentType) => {
225
231
  if (contentType.isSingle) {
226
- if (relatedTypeSelectValue && [relatedTypeSelectValue, initialRelatedTypeSelected].includes(contentType.uid)) {
227
- return true;
228
- }
229
- return !usedContentTypesData.some((_) => _.__collectionUid === contentType.uid && _.__collectionUid !== form.relatedType);
232
+ if (relatedTypeSelectValue && [relatedTypeSelectValue, initialRelatedTypeSelected].includes(contentType.uid)) {
233
+ return true;
234
+ }
235
+ return !usedContentTypesData.some((_) => _.__collectionUid === contentType.uid && _.__collectionUid !== form.relatedType);
230
236
  }
231
237
  return true;
232
- })
233
- .map((item) => ({
234
- key: get(item, 'uid'),
238
+ })
239
+ .map((item) => ({
240
+ key: (0, lodash_1.get)(item, 'uid'),
235
241
  metadatas: {
236
- intlLabel: {
237
- id: get(item, 'label', get(item, 'name')),
238
- defaultMessage: get(item, 'label', get(item, 'name')),
239
- }
242
+ intlLabel: {
243
+ id: (0, lodash_1.get)(item, 'label', (0, lodash_1.get)(item, 'name')),
244
+ defaultMessage: (0, lodash_1.get)(item, 'label', (0, lodash_1.get)(item, 'name')),
245
+ }
240
246
  },
241
- value: get(item, 'uid'),
242
- label: get(item, 'label', get(item, 'name')),
243
- })),
244
- [contentTypes, usedContentTypesData, relatedTypeSelectValue],
245
- );
246
-
247
- const thereAreNoMoreContentTypes = isEmpty(relatedSelectOptions) && !contentTypeSearchQuery;
248
-
249
- useEffect(
250
- () => {
251
- const value = get(relatedSelectOptions, '0');
252
- if (isSingleSelected && relatedSelectOptions.length === 1 && !isEqual(value, relatedSelectValue)) {
253
- onChange({ target: { name: relatedFieldName, value } });
254
- }
255
- },
256
- [isSingleSelected, relatedSelectOptions],
257
- );
258
-
259
- useEffect(() => {
260
- const value = relatedType;
261
- const fetchContentTypeEntities = async () => {
262
- if (value) {
263
- const item = find(
264
- contentTypes,
265
- (_) => _.uid === value,
266
- );
267
- if (item) {
268
- await getContentTypeEntities({
269
- modelUID: item.uid,
270
- query: contentTypeSearchQuery,
271
- }, item.plugin);
247
+ value: (0, lodash_1.get)(item, 'uid'),
248
+ label: (0, lodash_1.get)(item, 'label', (0, lodash_1.get)(item, 'name')),
249
+ })), [contentTypes, usedContentTypesData, relatedTypeSelectValue]);
250
+ const thereAreNoMoreContentTypes = (0, lodash_1.isEmpty)(relatedSelectOptions) && !contentTypeSearchQuery;
251
+ (0, react_1.useEffect)(() => {
252
+ const value = (0, lodash_1.get)(relatedSelectOptions, '0');
253
+ if (isSingleSelected && relatedSelectOptions.length === 1 && !(0, lodash_1.isEqual)(value, relatedSelectValue)) {
254
+ onChange({ target: { name: relatedFieldName, value } });
255
+ }
256
+ }, [isSingleSelected, relatedSelectOptions]);
257
+ (0, react_1.useEffect)(() => {
258
+ const value = relatedType;
259
+ if (value) {
260
+ const item = (0, lodash_1.find)(contentTypes, (_) => _.uid === value);
261
+ if (item) {
262
+ getContentTypeEntities({
263
+ modelUID: item.uid,
264
+ query: contentTypeSearchQuery,
265
+ locale,
266
+ }, item.plugin);
267
+ }
272
268
  }
273
- }
269
+ }, [relatedType, contentTypeSearchQuery]);
270
+ const resetCopyItemFormErrors = () => {
271
+ setFormErrorsState((prevState) => ({
272
+ ...prevState,
273
+ [itemLocaleCopyField]: null,
274
+ }));
274
275
  };
275
- fetchContentTypeEntities();
276
- }, [relatedType, contentTypeSearchQuery]);
277
- return (
278
- <>
279
- <Formik>
280
- <Form>
281
- <ModalBody>
282
- <Grid gap={5}>
283
- <GridItem key={`${inputsPrefix}title`} col={12}>
284
- <GenericInput
285
- autoFocused={true}
286
- intlLabel={{
287
- id: getTradId('popup.item.form.title.label'),
288
- defaultMessage: 'Title',
289
- }}
290
- name={`${inputsPrefix}title`}
291
- placeholder={{
292
- id: "e.g. Blog",
293
- defaultMessage: 'e.g. Blog',
294
- }}
295
- description={{
296
- id: getTradId('popup.item.form.title.placeholder'),
297
- defaultMessage: 'e.g. Blog',
298
- }}
299
- type='text'
300
- error={get(formErrors, `${inputsPrefix}title.id`)}
301
- onChange={onChange}
302
- value={get(form, `${inputsPrefix}title`, '')}
303
- />
304
- </GridItem>
305
- <GridItem key={`${inputsPrefix}type`} col={4} lg={12}>
306
- <GenericInput
307
- intlLabel={{
308
- id: getTradId('popup.item.form.type.label'),
309
- defaultMessage: 'Internal link',
310
- }}
311
- name={`${inputsPrefix}type`}
312
- options={navigationItemTypeOptions}
313
- type='select'
314
- error={get(formErrors, `${inputsPrefix}type.id`)}
315
- onChange={onChange}
316
- value={get(form, `${inputsPrefix}type`, '')}
317
- />
318
- </GridItem>
319
- <GridItem key={`${inputsPrefix}menuAttached`} col={4} lg={12}>
320
- <GenericInput
321
- intlLabel={{
322
- id: getTradId('popup.item.form.menuAttached.label'),
323
- defaultMessage: 'MenuAttached',
324
- }}
325
- name={`${inputsPrefix}menuAttached`}
326
- type='bool'
327
- error={get(formErrors, `${inputsPrefix}menuAttached.id`)}
328
- onChange={onChange}
329
- value={get(form, `${inputsPrefix}menuAttached`, '')}
330
- disabled={!(data.isMenuAllowedLevel && data.parentAttachedToMenu)}
331
- />
332
- </GridItem>
333
- <GridItem key={`${inputsPrefix}path`} col={12}>
334
- <GenericInput
335
- intlLabel={{
336
- id: getTradId(`popup.item.form.${pathSourceName}.label`),
337
- defaultMessage: 'Path',
338
- }}
339
- name={`${inputsPrefix}${pathSourceName}`}
340
- placeholder={{
341
- id: getTradId(`popup.item.form.${pathSourceName}.placeholder`),
342
- defaultMessage: 'e.g. Blog',
343
- }}
344
- type='text'
345
- error={get(formErrors, `${inputsPrefix}${pathSourceName}.id`)}
346
- onChange={onChange}
347
- value={get(form, `${inputsPrefix}${pathSourceName}`, '')}
348
- description={generatePreviewPath()}
349
- />
350
- </GridItem>
351
- {get(form, `${inputsPrefix}type`) === navigationItemType.INTERNAL && (
352
- <>
353
- <GridItem col={6} lg={12}>
354
- <GenericInput
355
- type="select"
356
- intlLabel={{
357
- id: getTradId('popup.item.form.relatedType.label'),
358
- defaultMessage: 'Related Type'
359
- }}
360
- placeholder={{
361
- id: getTradId('popup.item.form.relatedType.placeholder'),
362
- defaultMessage: 'Related Type'
363
- }}
364
- name={`${inputsPrefix}relatedType`}
365
- error={get(formErrors, `${inputsPrefix}relatedType.id`)}
366
- onChange={onChangeRelatedType}
367
- options={relatedTypeSelectOptions}
368
- value={relatedTypeSelectValue}
369
- disabled={isLoading || isEmpty(relatedTypeSelectOptions)}
370
- description={
371
- !isLoading && isEmpty(relatedTypeSelectOptions)
372
- ? {
373
- id: getTradId('popup.item.form.relatedType.empty'),
374
- defaultMessage: 'There are no more content types',
375
- }
376
- : undefined
377
- }
378
- />
379
- </GridItem>
380
- {relatedTypeSelectValue && !isSingleSelected && (
381
- <GridItem col={6} lg={12}>
382
- <GenericInput
383
- type="select"
384
- intlLabel={{
385
- id: getTradId('popup.item.form.related.label'),
386
- defaultMessage: 'Related'
387
- }}
388
- placeholder={{
389
- id: getTradId('popup.item.form.related.label'),
390
- defaultMessage: 'Related'
391
- }}
392
- name={relatedFieldName}
393
- error={get(formErrors, `${relatedFieldName}.id`)}
394
- onChange={onChange}
395
- onInputChange={debounceContentTypeSearchQuery}
396
- inputValue={contentTypeSearchInputValue}
397
- options={relatedSelectOptions}
398
- value={relatedSelectValue}
399
- disabled={isLoading || thereAreNoMoreContentTypes}
400
- description={
401
- !isLoading && thereAreNoMoreContentTypes
402
- ? {
403
- id: getTradId('popup.item.form.related.empty'),
404
- defaultMessage: 'There are no more entities',
405
- values: { contentTypeName: relatedTypeSelectValue },
406
- }
407
- : undefined
408
- }
409
- />
410
- </GridItem>
411
- )}
412
- </>
413
- )}
414
-
415
- {additionalFields.includes(navigationItemAdditionalFields.AUDIENCE) && (
416
- <GridItem key={`${inputsPrefix}audience`} col={6} lg={12}>
417
- <Select
418
- id={`${inputsPrefix}audience`}
419
- placeholder={getMessage('popup.item.form.audience.placeholder')}
420
- label={getMessage('popup.item.form.audience.label')}
421
- onChange={onAudienceChange}
422
- value={audience}
423
- hint={
424
- !isLoading && isEmpty(audienceOptions)
425
- ? getMessage('popup.item.form.audience.empty', 'There are no more audiences')
426
- : undefined
427
- }
428
- multi
429
- withTags
430
- disabled={isEmpty(audienceOptions)}
431
- >
432
- {audienceOptions.map(({ value, label }) => <Option key={value} value={value}>{label}</Option>)}
433
- </Select>
434
- </GridItem>
435
- )}
436
- </Grid>
437
- </ModalBody>
438
- </Form>
439
- </Formik>
440
- <NavigationItemPopupFooter handleSubmit={handleSubmit} handleCancel={onCancel} submitDisabled={submitDisabled} />
441
- </>
442
- );
276
+ const itemLocaleCopyField = `${inputsPrefix}i18n.locale`;
277
+ const itemLocaleCopyValue = form[itemLocaleCopyField];
278
+ const onCopyFromLocale = (0, react_1.useCallback)(async (event) => {
279
+ event.preventDefault();
280
+ event.stopPropagation();
281
+ setIsLoading(true);
282
+ resetCopyItemFormErrors();
283
+ try {
284
+ const result = await readNavigationItemFromLocale({
285
+ locale: itemLocaleCopyValue,
286
+ structureId: data.structureId
287
+ });
288
+ if (result.type === utils_1.ResourceState.RESOLVED) {
289
+ const { value: { related, ...rest } } = result;
290
+ setFormState((prevState) => ({
291
+ ...prevState,
292
+ ...rest,
293
+ }));
294
+ if (related) {
295
+ const relatedType = relatedTypeSelectOptions
296
+ .find(({ value }) => value === related.__contentType)?.value;
297
+ setFormState((prevState) => ({
298
+ ...prevState,
299
+ relatedType,
300
+ [relatedFieldName]: related.id,
301
+ }));
302
+ }
303
+ }
304
+ if (result.type === utils_1.ResourceState.ERROR) {
305
+ setFormErrorsState((prevState) => ({
306
+ ...prevState,
307
+ [itemLocaleCopyField]: (0, utils_1.getMessage)(result.errors[0]),
308
+ }));
309
+ }
310
+ }
311
+ catch (error) {
312
+ setFormErrorsState((prevState) => ({
313
+ ...prevState,
314
+ [itemLocaleCopyField]: (0, utils_1.getMessage)('popup.item.form.i18n.locale.error.generic'),
315
+ }));
316
+ }
317
+ setIsLoading(false);
318
+ }, [setIsLoading, setFormState, setFormErrorsState]);
319
+ const onChangeLocaleCopy = (0, react_1.useCallback)(({ target: { value } }) => {
320
+ resetCopyItemFormErrors();
321
+ onChange({ target: { name: itemLocaleCopyField, value } });
322
+ }, [onChange, itemLocaleCopyField]);
323
+ const itemCopyProps = (0, react_1.useMemo)(() => ({
324
+ intlLabel: {
325
+ id: (0, translations_1.getTradId)('popup.item.form.i18n.locale.label'),
326
+ defaultMessage: 'Copy details from'
327
+ },
328
+ placeholder: {
329
+ id: (0, translations_1.getTradId)('popup.item.form.i18n.locale.placeholder'),
330
+ defaultMessage: 'locale'
331
+ },
332
+ }), [translations_1.getTradId]);
333
+ return (react_1.default.createElement(react_1.default.Fragment, null,
334
+ react_1.default.createElement(formik_1.Formik, null,
335
+ react_1.default.createElement(helper_plugin_1.Form, null,
336
+ react_1.default.createElement(ModalLayout_1.ModalBody, null,
337
+ react_1.default.createElement(Grid_1.Grid, { gap: 5 },
338
+ react_1.default.createElement(Grid_1.GridItem, { key: `${inputsPrefix}title`, col: 12 },
339
+ react_1.default.createElement(helper_plugin_1.GenericInput, { autoFocused: true, intlLabel: {
340
+ id: (0, translations_1.getTradId)('popup.item.form.title.label'),
341
+ defaultMessage: 'Title',
342
+ }, name: `${inputsPrefix}title`, placeholder: {
343
+ id: "e.g. Blog",
344
+ defaultMessage: 'e.g. Blog',
345
+ }, description: {
346
+ id: (0, translations_1.getTradId)('popup.item.form.title.placeholder'),
347
+ defaultMessage: 'e.g. Blog',
348
+ }, type: 'text', error: (0, lodash_1.get)(formErrors, `${inputsPrefix}title.id`), onChange: onChange, value: (0, lodash_1.get)(form, `${inputsPrefix}title`, '') })),
349
+ react_1.default.createElement(Grid_1.GridItem, { key: `${inputsPrefix}type`, col: 4, lg: 12 },
350
+ react_1.default.createElement(helper_plugin_1.GenericInput, { intlLabel: {
351
+ id: (0, translations_1.getTradId)('popup.item.form.type.label'),
352
+ defaultMessage: 'Internal link',
353
+ }, name: `${inputsPrefix}type`, options: navigationItemTypeOptions, type: 'select', error: (0, lodash_1.get)(formErrors, `${inputsPrefix}type.id`), onChange: onChange, value: (0, lodash_1.get)(form, `${inputsPrefix}type`, '') })),
354
+ react_1.default.createElement(Grid_1.GridItem, { key: `${inputsPrefix}menuAttached`, col: 4, lg: 12 },
355
+ react_1.default.createElement(helper_plugin_1.GenericInput, { intlLabel: {
356
+ id: (0, translations_1.getTradId)('popup.item.form.menuAttached.label'),
357
+ defaultMessage: 'MenuAttached',
358
+ }, name: `${inputsPrefix}menuAttached`, type: 'bool', error: (0, lodash_1.get)(formErrors, `${inputsPrefix}menuAttached.id`), onChange: onChange, value: (0, lodash_1.get)(form, `${inputsPrefix}menuAttached`, ''), disabled: !(data.isMenuAllowedLevel && data.parentAttachedToMenu) })),
359
+ react_1.default.createElement(Grid_1.GridItem, { key: `${inputsPrefix}path`, col: 12 },
360
+ react_1.default.createElement(helper_plugin_1.GenericInput, { intlLabel: {
361
+ id: (0, translations_1.getTradId)(`popup.item.form.${pathSourceName}.label`),
362
+ defaultMessage: 'Path',
363
+ }, name: `${inputsPrefix}${pathSourceName}`, placeholder: {
364
+ id: (0, translations_1.getTradId)(`popup.item.form.${pathSourceName}.placeholder`),
365
+ defaultMessage: 'e.g. Blog',
366
+ }, type: 'text', error: (0, lodash_1.get)(formErrors, `${inputsPrefix}${pathSourceName}.id`), onChange: onChange, value: (0, lodash_1.get)(form, `${inputsPrefix}${pathSourceName}`, ''), description: generatePreviewPath() })),
367
+ (0, lodash_1.get)(form, `${inputsPrefix}type`) === enums_1.navigationItemType.INTERNAL && (react_1.default.createElement(react_1.default.Fragment, null,
368
+ react_1.default.createElement(Grid_1.GridItem, { col: 6, lg: 12 },
369
+ react_1.default.createElement(helper_plugin_1.GenericInput, { type: "select", intlLabel: {
370
+ id: (0, translations_1.getTradId)('popup.item.form.relatedType.label'),
371
+ defaultMessage: 'Related Type'
372
+ }, placeholder: {
373
+ id: (0, translations_1.getTradId)('popup.item.form.relatedType.placeholder'),
374
+ defaultMessage: 'Related Type'
375
+ }, name: `${inputsPrefix}relatedType`, error: (0, lodash_1.get)(formErrors, `${inputsPrefix}relatedType.id`), onChange: onChangeRelatedType, options: relatedTypeSelectOptions, value: relatedTypeSelectValue, disabled: isLoading || (0, lodash_1.isEmpty)(relatedTypeSelectOptions), description: !isLoading && (0, lodash_1.isEmpty)(relatedTypeSelectOptions)
376
+ ? {
377
+ id: (0, translations_1.getTradId)('popup.item.form.relatedType.empty'),
378
+ defaultMessage: 'There are no more content types',
379
+ }
380
+ : undefined })),
381
+ relatedTypeSelectValue && !isSingleSelected && (react_1.default.createElement(Grid_1.GridItem, { col: 6, lg: 12 },
382
+ react_1.default.createElement(helper_plugin_1.GenericInput, { type: "select", intlLabel: {
383
+ id: (0, translations_1.getTradId)('popup.item.form.related.label'),
384
+ defaultMessage: 'Related'
385
+ }, placeholder: {
386
+ id: (0, translations_1.getTradId)('popup.item.form.related.label'),
387
+ defaultMessage: 'Related'
388
+ }, name: relatedFieldName, error: (0, lodash_1.get)(formErrors, `${relatedFieldName}.id`), onChange: onChange, onInputChange: debounceContentTypeSearchQuery, inputValue: contentTypeSearchInputValue, options: relatedSelectOptions, value: relatedSelectValue, disabled: isLoading || thereAreNoMoreContentTypes, description: !isLoading && thereAreNoMoreContentTypes
389
+ ? {
390
+ id: (0, translations_1.getTradId)('popup.item.form.related.empty'),
391
+ defaultMessage: 'There are no more entities',
392
+ values: { contentTypeName: relatedTypeSelectValue },
393
+ }
394
+ : undefined }))))),
395
+ additionalFields.includes(enums_1.navigationItemAdditionalFields.AUDIENCE) && (react_1.default.createElement(Grid_1.GridItem, { key: `${inputsPrefix}audience`, col: 6, lg: 12 },
396
+ react_1.default.createElement(Select_1.Select, { id: `${inputsPrefix}audience`, placeholder: (0, utils_1.getMessage)('popup.item.form.audience.placeholder'), label: (0, utils_1.getMessage)('popup.item.form.audience.label'), onChange: onAudienceChange, value: audience, hint: !isLoading && (0, lodash_1.isEmpty)(audienceOptions)
397
+ ? (0, utils_1.getMessage)('popup.item.form.audience.empty', 'There are no more audiences')
398
+ : undefined, multi: true, withTags: true, disabled: (0, lodash_1.isEmpty)(audienceOptions) }, audienceOptions.map(({ value, label }) => react_1.default.createElement(Select_1.Option, { key: value, value: value }, label)))))),
399
+ isI18nBootstrapAvailable ? (react_1.default.createElement(Grid_1.Grid, { gap: 5, paddingTop: 5 },
400
+ react_1.default.createElement(Grid_1.GridItem, { col: 6, lg: 12 },
401
+ react_1.default.createElement(helper_plugin_1.GenericInput, { ...itemCopyProps, type: "select", name: itemLocaleCopyField, error: (0, lodash_1.get)(formErrors, itemLocaleCopyField), onChange: onChangeLocaleCopy, options: availableLocaleOptions, value: itemLocaleCopyValue, disabled: isLoading })),
402
+ react_1.default.createElement(Grid_1.GridItem, { col: 6, lg: 12, paddingTop: 6 },
403
+ react_1.default.createElement(Button_1.Button, { variant: "tertiary", onClick: onCopyFromLocale, disabled: isLoading || !itemLocaleCopyValue }, (0, utils_1.getMessage)('popup.item.form.i18n.locale.button'))))) : null))),
404
+ react_1.default.createElement(NavigationItemPopupFooter_1.NavigationItemPopupFooter, { handleSubmit: handleSubmit, handleCancel: onCancel, submitDisabled: submitDisabled })));
443
405
  };
444
-
445
406
  NavigationItemForm.defaultProps = {
446
- fieldsToDisable: [],
447
- formErrors: {},
448
- inputsPrefix: '',
449
- onSubmit: (e) => e.preventDefault(),
450
- requestError: null,
407
+ fieldsToDisable: [],
408
+ formErrors: {},
409
+ inputsPrefix: '',
410
+ onSubmit: (e) => e.preventDefault(),
411
+ requestError: null,
451
412
  };
452
-
453
413
  NavigationItemForm.propTypes = {
454
- isLoading: PropTypes.bool,
455
- fieldsToDisable: PropTypes.array,
456
- formErrors: PropTypes.object.isRequired,
457
- inputsPrefix: PropTypes.string,
458
- data: PropTypes.object.isRequired,
459
- onSubmit: PropTypes.func,
460
- requestError: PropTypes.object,
461
- contentTypes: PropTypes.array,
462
- contentTypeEntities: PropTypes.array,
463
- usedContentTypeEntities: PropTypes.array,
464
- availableAudience: PropTypes.array,
465
- additionalFields: PropTypes.array,
466
- getContentTypeEntities: PropTypes.func.isRequired,
467
- appendLabelPublicationStatus: PropTypes.func,
468
- onCancel: PropTypes.func,
414
+ config: prop_types_1.default.object.isRequired,
415
+ availableLocale: prop_types_1.default.arrayOf(prop_types_1.default.string),
416
+ isLoading: prop_types_1.default.bool,
417
+ fieldsToDisable: prop_types_1.default.array,
418
+ formErrors: prop_types_1.default.object.isRequired,
419
+ inputsPrefix: prop_types_1.default.string,
420
+ data: prop_types_1.default.object.isRequired,
421
+ onSubmit: prop_types_1.default.func,
422
+ requestError: prop_types_1.default.object,
423
+ contentTypes: prop_types_1.default.array,
424
+ contentTypeEntities: prop_types_1.default.array,
425
+ usedContentTypeEntities: prop_types_1.default.array,
426
+ availableAudience: prop_types_1.default.array,
427
+ additionalFields: prop_types_1.default.array,
428
+ getContentTypeEntities: prop_types_1.default.func.isRequired,
429
+ appendLabelPublicationStatus: prop_types_1.default.func,
430
+ onCancel: prop_types_1.default.func,
431
+ readNavigationItemFromLocale: prop_types_1.default.func.isRequired,
469
432
  };
470
-
471
- export default NavigationItemForm;
433
+ exports.default = NavigationItemForm;
434
+ //# sourceMappingURL=index.js.map