strapi-plugin-navigation 2.0.11 → 2.1.0-beta.1

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 (268) hide show
  1. package/README.md +254 -41
  2. package/admin/src/components/Alert/styles.d.ts +2 -0
  3. package/admin/src/components/Alert/styles.js +14 -0
  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 +34 -53
  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 +169 -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/useNavigationConfig.d.ts +10 -0
  39. package/admin/src/hooks/useNavigationConfig.js +52 -56
  40. package/admin/src/index.d.ts +14 -0
  41. package/admin/src/index.js +92 -76
  42. package/admin/src/pages/App/index.d.ts +3 -0
  43. package/admin/src/pages/App/index.js +43 -31
  44. package/admin/src/pages/DataManagerProvider/actions.d.ts +19 -0
  45. package/admin/src/pages/DataManagerProvider/actions.js +22 -26
  46. package/admin/src/pages/DataManagerProvider/index.d.ts +12 -0
  47. package/admin/src/pages/DataManagerProvider/index.js +280 -300
  48. package/admin/src/pages/DataManagerProvider/init.d.ts +3 -0
  49. package/admin/src/pages/DataManagerProvider/init.js +5 -3
  50. package/admin/src/pages/DataManagerProvider/reducer.d.ts +19 -0
  51. package/admin/src/pages/DataManagerProvider/reducer.js +119 -121
  52. package/admin/src/pages/SettingsPage/components/DisableI18nModal/index.d.ts +24 -0
  53. package/admin/src/pages/SettingsPage/components/DisableI18nModal/index.js +88 -0
  54. package/admin/src/pages/SettingsPage/index.d.ts +3 -0
  55. package/admin/src/pages/SettingsPage/index.js +242 -317
  56. package/admin/src/pages/SettingsPage/utils/functions.d.ts +5 -0
  57. package/admin/src/pages/SettingsPage/utils/functions.js +3 -8
  58. package/admin/src/pages/View/components/I18nCopyNavigationItems/index.d.ts +20 -0
  59. package/admin/src/pages/View/components/I18nCopyNavigationItems/index.js +60 -0
  60. package/admin/src/pages/View/components/NavigationContentHeader/index.d.ts +6 -0
  61. package/admin/src/pages/View/components/NavigationContentHeader/index.js +13 -17
  62. package/admin/src/pages/View/components/NavigationHeader/index.d.ts +12 -0
  63. package/admin/src/pages/View/components/NavigationHeader/index.js +74 -65
  64. package/admin/src/pages/View/components/NavigationHeader/styles.d.ts +2 -0
  65. package/admin/src/pages/View/components/NavigationHeader/styles.js +10 -5
  66. package/admin/src/pages/View/components/NavigationItemForm/index.d.ts +51 -0
  67. package/admin/src/pages/View/components/NavigationItemForm/index.js +322 -454
  68. package/admin/src/pages/View/components/NavigationItemForm/utils/form.d.ts +45 -0
  69. package/admin/src/pages/View/components/NavigationItemForm/utils/form.js +81 -52
  70. package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupFooter.d.ts +23 -0
  71. package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupFooter.js +24 -34
  72. package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupHeader.d.ts +4 -0
  73. package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupHeader.js +16 -16
  74. package/admin/src/pages/View/components/NavigationItemPopup/index.d.ts +27 -0
  75. package/admin/src/pages/View/components/NavigationItemPopup/index.js +59 -108
  76. package/admin/src/pages/View/index.d.ts +4 -0
  77. package/admin/src/pages/View/index.js +229 -304
  78. package/admin/src/pages/View/utils/enums.d.ts +9 -0
  79. package/admin/src/pages/View/utils/enums.js +11 -8
  80. package/admin/src/pages/View/utils/form.d.ts +2 -0
  81. package/admin/src/pages/View/utils/form.js +15 -12
  82. package/admin/src/pages/View/utils/index.d.ts +2 -0
  83. package/admin/src/pages/View/utils/index.js +11 -3
  84. package/admin/src/pages/View/utils/parsers.d.ts +44 -0
  85. package/admin/src/pages/View/utils/parsers.js +231 -277
  86. package/admin/src/permissions.d.ts +12 -0
  87. package/admin/src/permissions.js +11 -7
  88. package/admin/src/pluginId.d.ts +3 -0
  89. package/admin/src/pluginId.js +2 -2
  90. package/admin/src/translations/en.json +126 -102
  91. package/admin/src/translations/fr.json +44 -44
  92. package/admin/src/translations/index.d.ts +12 -0
  93. package/admin/src/translations/index.js +17 -11
  94. package/admin/src/utils/api.d.ts +8 -0
  95. package/admin/src/utils/api.js +54 -50
  96. package/admin/src/utils/getTrad.d.ts +3 -0
  97. package/admin/src/utils/getTrad.js +9 -5
  98. package/admin/src/utils/index.d.ts +5 -0
  99. package/admin/src/utils/index.js +21 -15
  100. package/package.json +19 -17
  101. package/permissions.d.ts +9 -0
  102. package/permissions.js +5 -4
  103. package/server/bootstrap/index.d.ts +4 -0
  104. package/server/bootstrap/index.js +41 -0
  105. package/server/config/index.d.ts +5 -0
  106. package/server/config/index.js +33 -9
  107. package/server/config/setupStrategy.d.ts +3 -0
  108. package/server/config/setupStrategy.js +38 -0
  109. package/server/content-types/audience/index.d.ts +27 -0
  110. package/server/content-types/audience/index.js +9 -8
  111. package/server/content-types/audience/schema.d.ts +25 -0
  112. package/server/content-types/audience/schema.js +26 -0
  113. package/server/content-types/index.d.ts +255 -0
  114. package/server/content-types/index.js +15 -12
  115. package/server/content-types/navigation/index.d.ts +64 -0
  116. package/server/content-types/navigation/index.js +11 -8
  117. package/server/content-types/navigation/lifecycle.d.ts +9 -0
  118. package/server/content-types/navigation/lifecycle.js +8 -12
  119. package/server/content-types/navigation/schema.d.ts +55 -0
  120. package/server/content-types/navigation/schema.js +56 -0
  121. package/server/content-types/navigation-item/index.d.ts +112 -0
  122. package/server/content-types/navigation-item/index.js +11 -8
  123. package/server/content-types/navigation-item/lifecycle.d.ts +16 -0
  124. package/server/content-types/navigation-item/lifecycle.js +28 -32
  125. package/server/content-types/navigation-item/schema.d.ts +97 -0
  126. package/server/content-types/navigation-item/schema.js +102 -0
  127. package/server/content-types/navigations-items-related/index.d.ts +56 -0
  128. package/server/content-types/navigations-items-related/index.js +11 -8
  129. package/server/content-types/navigations-items-related/lifecycle.d.ts +8 -0
  130. package/server/content-types/navigations-items-related/lifecycle.js +20 -17
  131. package/server/content-types/navigations-items-related/schema.d.ts +49 -0
  132. package/server/content-types/navigations-items-related/schema.js +50 -0
  133. package/server/controllers/admin.d.ts +4 -0
  134. package/server/controllers/admin.js +77 -0
  135. package/server/controllers/client.d.ts +4 -0
  136. package/server/controllers/client.js +34 -0
  137. package/server/controllers/index.d.ts +4 -0
  138. package/server/controllers/index.js +12 -6
  139. package/server/destroy.d.ts +3 -0
  140. package/server/destroy.js +5 -0
  141. package/server/graphql/config.d.ts +4 -0
  142. package/server/graphql/config.js +28 -0
  143. package/server/graphql/index.d.ts +2 -0
  144. package/server/graphql/index.js +18 -22
  145. package/server/graphql/queries/index.d.ts +3 -0
  146. package/server/graphql/queries/index.js +15 -15
  147. package/server/graphql/queries/render-navigation-child.d.ts +15 -0
  148. package/server/graphql/queries/render-navigation-child.js +24 -15
  149. package/server/graphql/queries/render-navigation.d.ts +23 -0
  150. package/server/graphql/queries/render-navigation.js +29 -15
  151. package/server/graphql/resolvers-config.d.ts +10 -0
  152. package/server/graphql/resolvers-config.js +5 -3
  153. package/server/graphql/setupStrategy.d.ts +3 -0
  154. package/server/graphql/setupStrategy.js +15 -0
  155. package/server/graphql/types/content-types-name-fields.d.ts +6 -0
  156. package/server/graphql/types/content-types-name-fields.js +13 -9
  157. package/server/graphql/types/content-types.d.ts +5 -0
  158. package/server/graphql/types/content-types.js +17 -15
  159. package/server/graphql/types/create-navigation-item.d.ts +5 -0
  160. package/server/graphql/types/create-navigation-item.js +18 -16
  161. package/server/graphql/types/create-navigation-related.d.ts +5 -0
  162. package/server/graphql/types/create-navigation-related.js +9 -7
  163. package/server/graphql/types/create-navigation.d.ts +5 -0
  164. package/server/graphql/types/create-navigation.js +8 -6
  165. package/server/graphql/types/index.d.ts +3 -0
  166. package/server/graphql/types/index.js +15 -13
  167. package/server/graphql/types/navigation-config.d.ts +5 -0
  168. package/server/graphql/types/navigation-config.js +10 -8
  169. package/server/graphql/types/navigation-details.d.ts +5 -0
  170. package/server/graphql/types/navigation-details.js +11 -9
  171. package/server/graphql/types/navigation-item-related-data.d.ts +5 -0
  172. package/server/graphql/types/navigation-item-related-data.js +9 -0
  173. package/server/graphql/types/navigation-item-related.d.ts +7 -0
  174. package/server/graphql/types/navigation-item-related.js +25 -0
  175. package/server/graphql/types/navigation-item.d.ts +5 -0
  176. package/server/graphql/types/navigation-item.js +28 -29
  177. package/server/graphql/types/navigation-render-type.d.ts +5 -0
  178. package/server/graphql/types/navigation-render-type.js +7 -4
  179. package/server/graphql/types/navigation.d.ts +5 -0
  180. package/server/graphql/types/navigation.js +10 -8
  181. package/server/i18n/constant.d.ts +2 -0
  182. package/server/i18n/constant.js +5 -0
  183. package/server/i18n/errors.d.ts +7 -0
  184. package/server/i18n/errors.js +14 -0
  185. package/server/i18n/graphQLEnhancers.d.ts +10 -0
  186. package/server/i18n/graphQLEnhancers.js +9 -0
  187. package/server/i18n/index.d.ts +8 -0
  188. package/server/i18n/index.js +23 -0
  189. package/server/i18n/navigationSetupStrategy.d.ts +3 -0
  190. package/server/i18n/navigationSetupStrategy.js +119 -0
  191. package/server/i18n/serviceEnhancers.d.ts +12 -0
  192. package/server/i18n/serviceEnhancers.js +117 -0
  193. package/server/i18n/types.d.ts +54 -0
  194. package/server/i18n/types.js +3 -0
  195. package/server/i18n/utils.d.ts +12 -0
  196. package/server/i18n/utils.js +29 -0
  197. package/server/index.d.ts +273 -0
  198. package/server/index.js +26 -0
  199. package/server/navigation/index.d.ts +2 -0
  200. package/server/navigation/index.js +18 -0
  201. package/server/navigation/setupStrategy.d.ts +3 -0
  202. package/server/navigation/setupStrategy.js +37 -0
  203. package/server/register/index.d.ts +3 -0
  204. package/server/register/index.js +4 -0
  205. package/server/routes/admin.d.ts +4 -0
  206. package/server/routes/admin.js +72 -61
  207. package/server/routes/client.d.ts +4 -0
  208. package/server/routes/client.js +25 -21
  209. package/server/routes/index.d.ts +6 -0
  210. package/server/routes/index.js +13 -4
  211. package/server/services/admin.d.ts +5 -0
  212. package/server/services/admin.js +183 -0
  213. package/server/services/client.d.ts +5 -0
  214. package/server/services/client.js +249 -0
  215. package/server/services/common.d.ts +5 -0
  216. package/server/services/common.js +313 -0
  217. package/server/services/index.d.ts +7 -0
  218. package/server/services/index.js +14 -6
  219. package/server/utils/constant.d.ts +27 -0
  220. package/server/utils/constant.js +24 -0
  221. package/server/utils/functions.d.ts +138 -0
  222. package/server/utils/functions.js +224 -0
  223. package/server/utils/index.d.ts +3 -0
  224. package/server/utils/index.js +19 -0
  225. package/strapi-admin.d.ts +3 -0
  226. package/strapi-admin.js +8 -1
  227. package/strapi-server.d.ts +273 -0
  228. package/strapi-server.js +6 -17
  229. package/tsconfig.tsbuildinfo +1 -0
  230. package/types/bootstrap.d.ts +13 -0
  231. package/types/bootstrap.js +3 -0
  232. package/types/config.d.ts +21 -0
  233. package/types/config.js +3 -0
  234. package/types/contentTypes.d.ts +85 -0
  235. package/types/contentTypes.js +3 -0
  236. package/types/controllers.d.ts +35 -0
  237. package/types/controllers.js +5 -0
  238. package/types/graphQL.d.ts +3 -0
  239. package/types/graphQL.js +3 -0
  240. package/types/i18n.d.ts +9 -0
  241. package/types/i18n.js +3 -0
  242. package/types/index.d.ts +9 -0
  243. package/types/index.js +25 -0
  244. package/types/services.d.ts +68 -0
  245. package/types/services.js +3 -0
  246. package/types/utils.d.ts +58 -0
  247. package/types/utils.js +26 -0
  248. package/utils/InvalidParamNavigationError.d.ts +4 -0
  249. package/utils/InvalidParamNavigationError.js +11 -0
  250. package/utils/NavigationError.d.ts +5 -0
  251. package/utils/NavigationError.js +7 -7
  252. package/__mocks__/pages.settings.json +0 -25
  253. package/__mocks__/strapi.js +0 -207
  254. package/jest.config.js +0 -14
  255. package/server/bootstrap.js +0 -52
  256. package/server/config.js +0 -9
  257. package/server/content-types/audience/lifecycle.js +0 -8
  258. package/server/content-types/audience/schema.json +0 -23
  259. package/server/content-types/navigation/schema.json +0 -45
  260. package/server/content-types/navigation-item/schema.json +0 -99
  261. package/server/content-types/navigations-items-related/schema.json +0 -47
  262. package/server/controllers/navigation.js +0 -105
  263. package/server/graphql/types/navigation-related.js +0 -25
  264. package/server/services/__tests__/functions.test.js +0 -48
  265. package/server/services/__tests__/navigation.test.js +0 -91
  266. package/server/services/navigation.js +0 -788
  267. package/server/services/utils/constant.js +0 -21
  268. package/server/services/utils/functions.js +0 -226
@@ -0,0 +1,313 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const lodash_1 = require("lodash");
7
+ const pluralize_1 = __importDefault(require("pluralize"));
8
+ const utils_1 = require("@strapi/utils");
9
+ const config_1 = require("../config");
10
+ const i18n_1 = require("../i18n");
11
+ const utils_2 = require("../utils");
12
+ const commonService = ({ strapi }) => ({
13
+ analyzeBranch(items = [], masterEntity = null, parentItem = null, prevOperations = {}) {
14
+ const commonService = (0, utils_2.getPluginService)('common');
15
+ const { toCreate, toRemove, toUpdate } = items
16
+ .reduce((acc, _) => {
17
+ const branchName = commonService.getBranchName(_);
18
+ if (branchName) {
19
+ return { ...acc, [branchName]: [...acc[branchName], _] };
20
+ }
21
+ return acc;
22
+ }, { toRemove: [], toCreate: [], toUpdate: [] });
23
+ const operations = {
24
+ create: prevOperations.create || !!toCreate.length,
25
+ update: prevOperations.update || !!toUpdate.length,
26
+ remove: prevOperations.remove || !!toRemove.length,
27
+ };
28
+ return (0, utils_2.checkDuplicatePath)(parentItem || masterEntity, toCreate.concat(toUpdate))
29
+ .then(() => Promise.all([
30
+ commonService.createBranch(toCreate, masterEntity, parentItem, operations),
31
+ commonService.removeBranch(toRemove, operations),
32
+ commonService.updateBranch(toUpdate, masterEntity, parentItem, operations),
33
+ ]));
34
+ },
35
+ async configContentTypes(viaSettingsPage = false) {
36
+ const commonService = (0, utils_2.getPluginService)('common');
37
+ const pluginStore = await commonService.getPluginStore();
38
+ const config = await pluginStore.get({ key: 'config' });
39
+ const eligibleContentTypes = await Promise.all(config.contentTypes
40
+ .filter(contentType => !!strapi.contentTypes[contentType] && (0, utils_2.isContentTypeEligible)(contentType))
41
+ .map(async (key) => {
42
+ const item = strapi.contentTypes[key];
43
+ const { kind, options, uid } = item;
44
+ const { draftAndPublish } = options;
45
+ const isSingleType = kind === utils_2.KIND_TYPES.SINGLE;
46
+ const isSingleTypeWithPublishFlow = isSingleType && draftAndPublish;
47
+ const returnType = (available) => ({
48
+ key,
49
+ available,
50
+ });
51
+ if (isSingleType) {
52
+ if (isSingleTypeWithPublishFlow) {
53
+ const itemsCountOrBypass = isSingleTypeWithPublishFlow ?
54
+ await strapi.query(uid).count({
55
+ where: {
56
+ published_at: { $notNull: true },
57
+ },
58
+ }) :
59
+ true;
60
+ return returnType(itemsCountOrBypass !== 0);
61
+ }
62
+ const isAvailable = await strapi.query(uid).count({});
63
+ return isAvailable === 1 ?
64
+ returnType(true) :
65
+ (viaSettingsPage ? returnType(false) : undefined);
66
+ }
67
+ return returnType(true);
68
+ }));
69
+ return eligibleContentTypes
70
+ .filter(key => key)
71
+ .map((value) => {
72
+ if (value === undefined)
73
+ return;
74
+ const { key, available } = value;
75
+ const item = strapi.contentTypes[key];
76
+ const relatedField = (item.associations || []).find((_) => _.model === 'navigationitem');
77
+ const { uid, options, info, collectionName, modelName, apiName, plugin, kind, pluginOptions } = item;
78
+ const { visible = true } = pluginOptions['content-manager'] || {};
79
+ const { name, description } = info;
80
+ const { hidden, templateName, draftAndPublish } = options;
81
+ const findRouteConfig = (0, lodash_1.find)((0, lodash_1.get)(strapi.api, `[${modelName}].config.routes`, []), route => route.handler.includes('.find'));
82
+ const findRoutePath = findRouteConfig && findRouteConfig.path.split('/')[1];
83
+ const apiPath = findRoutePath && (findRoutePath !== apiName) ? findRoutePath : apiName || modelName;
84
+ const isSingle = kind === utils_2.KIND_TYPES.SINGLE;
85
+ const endpoint = isSingle ? apiPath : (0, pluralize_1.default)(apiPath);
86
+ const relationName = (0, utils_2.singularize)(modelName);
87
+ const relationNameParts = typeof uid === 'string' ? (0, lodash_1.last)((uid).split('.')).split('-') : [];
88
+ const contentTypeName = relationNameParts.length > 1 ? relationNameParts.reduce((prev, curr) => `${prev}${(0, lodash_1.upperFirst)(curr)}`, '') : (0, lodash_1.upperFirst)(modelName);
89
+ const labelSingular = name ||
90
+ ((0, lodash_1.upperFirst)(relationNameParts.length > 1 ? relationNameParts.join(' ') : relationName));
91
+ return {
92
+ uid,
93
+ name: relationName,
94
+ draftAndPublish,
95
+ isSingle,
96
+ description,
97
+ collectionName,
98
+ contentTypeName,
99
+ label: isSingle ? labelSingular : (0, pluralize_1.default)(name || labelSingular),
100
+ relatedField: relatedField ? relatedField.alias : undefined,
101
+ labelSingular: (0, utils_2.singularize)(labelSingular),
102
+ endpoint,
103
+ plugin,
104
+ available: available && !hidden,
105
+ visible,
106
+ templateName,
107
+ };
108
+ })
109
+ .filter((item) => viaSettingsPage || (item && item.available));
110
+ },
111
+ async createBranch(items, masterEntity, parentItem, operations) {
112
+ const commonService = (0, utils_2.getPluginService)('common');
113
+ const { itemModel } = (0, utils_2.extractMeta)(strapi.plugins);
114
+ return await Promise.all(items.map(async (item) => {
115
+ operations.create = true;
116
+ const { parent, master, related, ...params } = item;
117
+ const relatedItems = await this.getIdsRelated(related, master);
118
+ const data = {
119
+ ...params,
120
+ related: relatedItems,
121
+ master: masterEntity,
122
+ parent: parentItem ? { ...parentItem, _id: parentItem.id } : null,
123
+ };
124
+ const navigationItem = await strapi
125
+ .query(itemModel.uid)
126
+ .create({ data, populate: ['related'] });
127
+ return !(0, lodash_1.isEmpty)(item.items)
128
+ ? commonService.createBranch(item.items, masterEntity, navigationItem, operations)
129
+ : operations;
130
+ }));
131
+ },
132
+ getBranchName(item) {
133
+ const hasId = !(0, lodash_1.isNil)(item.id);
134
+ const toRemove = item.removed;
135
+ if (hasId && !toRemove) {
136
+ return 'toUpdate';
137
+ }
138
+ if (hasId && toRemove) {
139
+ return 'toRemove';
140
+ }
141
+ if (!hasId && !toRemove) {
142
+ return 'toCreate';
143
+ }
144
+ },
145
+ async getContentTypeItems(uid, query) {
146
+ const commonService = (0, utils_2.getPluginService)('common');
147
+ const pluginStore = await commonService.getPluginStore();
148
+ const config = await pluginStore.get({ key: 'config' });
149
+ const where = await (0, i18n_1.addI18nWhereClause)({
150
+ strapi,
151
+ previousWhere: {},
152
+ query,
153
+ modelUid: uid,
154
+ });
155
+ try {
156
+ const contentTypeItems = await strapi.query(uid).findMany({
157
+ populate: config.contentTypesPopulate[uid] || [],
158
+ where,
159
+ });
160
+ return contentTypeItems;
161
+ }
162
+ catch (err) {
163
+ return [];
164
+ }
165
+ },
166
+ async getIdsRelated(relatedItems, master) {
167
+ if (relatedItems) {
168
+ return (await Promise.all(relatedItems.map(async (relatedItem) => {
169
+ try {
170
+ const model = strapi.query("plugin::navigation.navigations-items-related");
171
+ const entity = await model.findOne({
172
+ where: {
173
+ related_id: relatedItem.refId,
174
+ related_type: relatedItem.ref,
175
+ field: relatedItem.field,
176
+ master,
177
+ },
178
+ });
179
+ if (!entity) {
180
+ const newEntity = {
181
+ master,
182
+ order: 1,
183
+ field: relatedItem.field,
184
+ related_id: relatedItem.refId,
185
+ related_type: relatedItem.ref,
186
+ };
187
+ return model.create({ data: newEntity }).then(({ id }) => id);
188
+ }
189
+ return entity.id;
190
+ }
191
+ catch (e) {
192
+ console.error(e);
193
+ }
194
+ }))).reduce((acc, id) => (id ? acc.concat([id]) : acc), []);
195
+ }
196
+ },
197
+ async getPluginStore() {
198
+ return await strapi.store({ type: 'plugin', name: 'navigation' });
199
+ },
200
+ async getRelatedItems(entityItems) {
201
+ const commonService = (0, utils_2.getPluginService)('common');
202
+ const pluginStore = await commonService.getPluginStore();
203
+ const config = await pluginStore.get({ key: 'config' });
204
+ const relatedTypes = new Set(entityItems.flatMap((item) => (0, lodash_1.get)(item.related, 'related_type', '')));
205
+ const groupedItems = Array.from(relatedTypes).filter((relatedType) => relatedType).reduce((acc, relatedType) => Object.assign(acc, {
206
+ [relatedType]: [
207
+ ...(acc[relatedType] || []),
208
+ ...entityItems
209
+ .filter((item => (0, lodash_1.get)(item.related, 'related_type') === relatedType))
210
+ .flatMap((item) => Object.assign(item.related, { navigationItemId: item.id })),
211
+ ],
212
+ }), {});
213
+ const data = new Map((await Promise.all(Object.entries(groupedItems)
214
+ .map(async ([model, related]) => {
215
+ const relationData = await strapi
216
+ .query(model)
217
+ .findMany({
218
+ where: {
219
+ id: { $in: (0, lodash_1.map)(related, 'related_id') },
220
+ },
221
+ populate: config.contentTypesPopulate[model] || []
222
+ });
223
+ return relationData
224
+ .flatMap(_ => Object.assign(_, {
225
+ __contentType: model,
226
+ navigationItemId: related.find(({ related_id }) => related_id === _.id.toString())?.navigationItemId,
227
+ }));
228
+ })))
229
+ .flat(1)
230
+ .map(_ => [_.navigationItemId, _]));
231
+ return entityItems
232
+ .map(({ related, ...item }) => {
233
+ const relatedData = data.get(item.id);
234
+ if (relatedData) {
235
+ return Object.assign(item, { related: relatedData });
236
+ }
237
+ return { ...item, related: null };
238
+ });
239
+ },
240
+ removeBranch(items = [], operations = {}) {
241
+ const commonService = (0, utils_2.getPluginService)('common');
242
+ const { itemModel } = (0, utils_2.extractMeta)(strapi.plugins);
243
+ return Promise.all(items
244
+ .filter(item => item.id)
245
+ .map(async (item) => {
246
+ operations.remove = true;
247
+ const { id, related, master } = item;
248
+ await Promise.all([
249
+ strapi
250
+ .query(itemModel.uid)
251
+ .delete({ where: { id } }),
252
+ this.removeRelated(related, master),
253
+ ]);
254
+ return !(0, lodash_1.isEmpty)(item.items)
255
+ ? commonService.removeBranch(item.items, operations)
256
+ : operations;
257
+ }));
258
+ },
259
+ removeRelated(relatedItems, master) {
260
+ return Promise.all((relatedItems || []).map(relatedItem => {
261
+ const model = strapi.query('plugin::navigation.navigations-items-related');
262
+ const entityToRemove = {
263
+ master,
264
+ field: relatedItem.field,
265
+ related_id: relatedItem.refId,
266
+ related_type: relatedItem.ref,
267
+ };
268
+ return model.delete({ where: entityToRemove });
269
+ }));
270
+ },
271
+ setDefaultConfig() {
272
+ return (0, config_1.configSetupStrategy)({ strapi });
273
+ },
274
+ async updateBranch(toUpdate, masterEntity, parentItem, operations) {
275
+ const commonService = (0, utils_2.getPluginService)('common');
276
+ const { itemModel } = (0, utils_2.extractMeta)(strapi.plugins);
277
+ const databaseModel = strapi.query(itemModel.uid);
278
+ return Promise.all(toUpdate.map(async (item) => {
279
+ operations.update = true;
280
+ const { id, updated, parent, master, related, items, ...params } = item;
281
+ let currentItem;
282
+ if (updated) {
283
+ const relatedItems = await this.getIdsRelated(related, master);
284
+ currentItem = await databaseModel
285
+ .update({
286
+ where: { id },
287
+ data: {
288
+ ...params,
289
+ related: relatedItems,
290
+ master: masterEntity,
291
+ parent: parentItem ? { ...parentItem, _id: parentItem.id } : null,
292
+ },
293
+ });
294
+ }
295
+ else {
296
+ currentItem = item;
297
+ }
298
+ return !(0, lodash_1.isEmpty)(items)
299
+ ? commonService.analyzeBranch(items, masterEntity, currentItem, operations)
300
+ : operations;
301
+ }));
302
+ },
303
+ async emitEvent(uid, event, entity) {
304
+ const model = strapi.getModel(uid);
305
+ const sanitizedEntity = await utils_1.sanitize.sanitizers.defaultSanitizeOutput(model, entity);
306
+ strapi.webhookRunner.eventHub.emit(event, {
307
+ model: model.modelName,
308
+ entry: sanitizedEntity,
309
+ });
310
+ }
311
+ });
312
+ exports.default = commonService;
313
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1,7 @@
1
+ declare const navigationService: {
2
+ common: (context: import("strapi-typed").StrapiContext) => import("../../types").ICommonService;
3
+ admin: (context: import("strapi-typed").StrapiContext) => import("../../types").IAdminService;
4
+ client: (context: import("strapi-typed").StrapiContext) => import("../../types").IClientService;
5
+ };
6
+ export default navigationService;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -1,7 +1,15 @@
1
- "use strict"
2
-
3
- const navigation = require("./navigation");
4
-
5
- module.exports = {
6
- navigation
1
+ 'use strict';
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
4
  };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const common_1 = __importDefault(require("./common"));
7
+ const admin_1 = __importDefault(require("./admin"));
8
+ const client_1 = __importDefault(require("./client"));
9
+ const navigationService = {
10
+ common: common_1.default,
11
+ admin: admin_1.default,
12
+ client: client_1.default,
13
+ };
14
+ exports.default = navigationService;
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,27 @@
1
+ export declare const TEMPLATE_DEFAULT: "Generic";
2
+ export declare const MODEL_TYPES: {
3
+ readonly CONTENT_TYPE: "contentType";
4
+ };
5
+ export declare const KIND_TYPES: {
6
+ readonly SINGLE: "singleType";
7
+ readonly COLLECTION: "collectionType";
8
+ };
9
+ export declare const ALLOWED_CONTENT_TYPES: readonly ["api::", "plugin::"];
10
+ export declare const RESTRICTED_CONTENT_TYPES: readonly ["plugin::users-permissions", "plugin::i18n.locale", "plugin::navigation"];
11
+ export declare const EXCLUDED_CONTENT_TYPES: string[];
12
+ export declare const CONTENT_TYPES_NAME_FIELDS_DEFAULTS: string[];
13
+ export declare const ADDITIONAL_FIELDS: {
14
+ AUDIENCE: string;
15
+ };
16
+ export declare const DEFAULT_POPULATE: "localizations"[];
17
+ export declare const DEFAULT_NAVIGATION_ITEM: {
18
+ readonly name: "Main navigation";
19
+ readonly slug: "main-navigation";
20
+ readonly visible: true;
21
+ };
22
+ export declare const RENDER_TYPES: Readonly<{
23
+ FLAT: "FLAT";
24
+ TREE: "TREE";
25
+ RFR: "RFR";
26
+ }>;
27
+ //# sourceMappingURL=constant.d.ts.map
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RENDER_TYPES = exports.DEFAULT_NAVIGATION_ITEM = exports.DEFAULT_POPULATE = exports.ADDITIONAL_FIELDS = exports.CONTENT_TYPES_NAME_FIELDS_DEFAULTS = exports.EXCLUDED_CONTENT_TYPES = exports.RESTRICTED_CONTENT_TYPES = exports.ALLOWED_CONTENT_TYPES = exports.KIND_TYPES = exports.MODEL_TYPES = exports.TEMPLATE_DEFAULT = void 0;
4
+ const i18n_1 = require("../i18n");
5
+ exports.TEMPLATE_DEFAULT = 'Generic';
6
+ exports.MODEL_TYPES = { CONTENT_TYPE: 'contentType' };
7
+ exports.KIND_TYPES = { SINGLE: 'singleType', COLLECTION: 'collectionType' };
8
+ exports.ALLOWED_CONTENT_TYPES = ['api::', 'plugin::'];
9
+ exports.RESTRICTED_CONTENT_TYPES = ['plugin::users-permissions', 'plugin::i18n.locale', 'plugin::navigation'];
10
+ exports.EXCLUDED_CONTENT_TYPES = ['strapi::'];
11
+ exports.CONTENT_TYPES_NAME_FIELDS_DEFAULTS = ['title', 'subject', 'name'];
12
+ exports.ADDITIONAL_FIELDS = { AUDIENCE: 'audience' };
13
+ exports.DEFAULT_POPULATE = [...i18n_1.I18N_DEFAULT_POPULATE];
14
+ exports.DEFAULT_NAVIGATION_ITEM = {
15
+ name: "Main navigation",
16
+ slug: "main-navigation",
17
+ visible: true,
18
+ };
19
+ exports.RENDER_TYPES = {
20
+ FLAT: 'FLAT',
21
+ TREE: 'TREE',
22
+ RFR: 'RFR'
23
+ };
24
+ //# sourceMappingURL=constant.js.map
@@ -0,0 +1,138 @@
1
+ import { Id, IStrapi, Primitive, StrapiContentType, StrapiPlugin, StringMap } from "strapi-typed";
2
+ import { AuditLogContext, AuditLogParams, ContentTypeEntity, NavigationActions, NavigationItem, NavigationItemEntity, NavigationService, NavigationServiceName, NestedPath, NestedStructure, PluginConfigNameFields, ToBeFixed } from "../../types";
3
+ import { NavigationError } from '../../utils/NavigationError';
4
+ export declare const getPluginService: <T extends NavigationService>(name: NavigationServiceName) => T;
5
+ export declare const errorHandler: (ctx: ToBeFixed) => (error: NavigationError | string) => any;
6
+ export declare const parseParams: <TParams extends StringMap<string> = StringMap<string>, TResult extends StringMap<Primitive> = StringMap<Primitive>>(params: TParams) => TResult;
7
+ export declare const templateNameFactory: (items: import("strapi-typed").TypeResult<{
8
+ path: string | null;
9
+ title: string;
10
+ type: import("../../types").NavigationItemType;
11
+ collapsed: boolean;
12
+ menuAttached: boolean;
13
+ order: number;
14
+ uiRouterKey: string;
15
+ } & {
16
+ createdAt: string;
17
+ updatedAt: string;
18
+ } & {
19
+ id: number;
20
+ parent: import("strapi-typed").TypeResult<{
21
+ path: string | null;
22
+ title: string;
23
+ type: import("../../types").NavigationItemType;
24
+ collapsed: boolean;
25
+ menuAttached: boolean;
26
+ order: number;
27
+ uiRouterKey: string;
28
+ } & {
29
+ createdAt: string;
30
+ updatedAt: string;
31
+ } & {
32
+ id: number;
33
+ parent: import("strapi-typed").TypeResult<{
34
+ path: string | null;
35
+ title: string;
36
+ type: import("../../types").NavigationItemType;
37
+ collapsed: boolean;
38
+ menuAttached: boolean;
39
+ order: number;
40
+ uiRouterKey: string;
41
+ } & {
42
+ createdAt: string;
43
+ updatedAt: string;
44
+ } & any> | null;
45
+ master: import("../../types").Navigation;
46
+ audience: import("../../types").Audience[];
47
+ externalPath: string | null;
48
+ related: import("../../types").NavigationItemRelated | null;
49
+ }> | null;
50
+ master: import("../../types").Navigation;
51
+ audience: import("../../types").Audience[];
52
+ externalPath: string | null;
53
+ related: ContentTypeEntity | ContentTypeEntity[] | null;
54
+ }>[] | undefined, strapi: IStrapi, contentTypes?: StrapiContentType<ToBeFixed>[]) => Promise<(contentType: ToBeFixed, id: Id) => any>;
55
+ export declare const getTemplateComponentFromTemplate: (strapi: IStrapi, template?: ToBeFixed[]) => any;
56
+ export declare const prepareAuditLog: (actions: NavigationActions[]) => string;
57
+ export declare const sendAuditLog: (auditLogInstance: AuditLogContext, event: string, data: AuditLogParams) => void;
58
+ export declare const composeItemTitle: (item: NavigationItemEntity<ContentTypeEntity[] | ContentTypeEntity>, fields?: PluginConfigNameFields, contentTypes?: StrapiContentType<ToBeFixed>[]) => string | undefined;
59
+ export declare const extractItemRelationTitle: (relatedItem: ContentTypeEntity, fields?: PluginConfigNameFields, contentTypes?: StrapiContentType<ToBeFixed>[]) => unknown;
60
+ export declare const filterOutUnpublished: (item: NavigationItemEntity<ContentTypeEntity | ContentTypeEntity[]>) => unknown;
61
+ export declare const checkDuplicatePath: (parentItem: ToBeFixed | null, checkData: NavigationItem[]) => Promise<void>;
62
+ export declare const singularize: (value?: string) => string;
63
+ export declare const extractMeta: (plugins: {
64
+ [uid: string]: StrapiPlugin;
65
+ }) => {
66
+ masterModel: any;
67
+ itemModel: any;
68
+ relatedModel: any;
69
+ audienceModel: any;
70
+ plugin: StrapiPlugin;
71
+ pluginName: string;
72
+ };
73
+ export declare const buildNestedStructure: (entities: NavigationItemEntity<ContentTypeEntity>[], id?: Id | null, field?: keyof NavigationItemEntity) => NestedStructure<NavigationItemEntity<ContentTypeEntity>>[];
74
+ export declare const buildNestedPaths: <T extends Pick<import("strapi-typed").TypeResult<{
75
+ path: string | null;
76
+ title: string;
77
+ type: import("../../types").NavigationItemType;
78
+ collapsed: boolean;
79
+ menuAttached: boolean;
80
+ order: number;
81
+ uiRouterKey: string;
82
+ } & {
83
+ createdAt: string;
84
+ updatedAt: string;
85
+ } & {
86
+ id: number;
87
+ parent: import("strapi-typed").TypeResult<{
88
+ path: string | null;
89
+ title: string;
90
+ type: import("../../types").NavigationItemType;
91
+ collapsed: boolean;
92
+ menuAttached: boolean;
93
+ order: number;
94
+ uiRouterKey: string;
95
+ } & {
96
+ createdAt: string;
97
+ updatedAt: string;
98
+ } & any> | null;
99
+ master: import("../../types").Navigation;
100
+ audience: import("../../types").Audience[];
101
+ externalPath: string | null;
102
+ related: import("../../types").NavigationItemRelated | null;
103
+ }>, "id" | "path" | "parent">>(items: T[], id?: Id | null, parentPath?: string | null) => NestedPath[];
104
+ export declare const filterByPath: <T extends Pick<import("strapi-typed").TypeResult<{
105
+ path: string | null;
106
+ title: string;
107
+ type: import("../../types").NavigationItemType;
108
+ collapsed: boolean;
109
+ menuAttached: boolean;
110
+ order: number;
111
+ uiRouterKey: string;
112
+ } & {
113
+ createdAt: string;
114
+ updatedAt: string;
115
+ } & {
116
+ id: number;
117
+ parent: import("strapi-typed").TypeResult<{
118
+ path: string | null;
119
+ title: string;
120
+ type: import("../../types").NavigationItemType;
121
+ collapsed: boolean;
122
+ menuAttached: boolean;
123
+ order: number;
124
+ uiRouterKey: string;
125
+ } & {
126
+ createdAt: string;
127
+ updatedAt: string;
128
+ } & any> | null;
129
+ master: import("../../types").Navigation;
130
+ audience: import("../../types").Audience[];
131
+ externalPath: string | null;
132
+ related: import("../../types").NavigationItemRelated | null;
133
+ }>, "id" | "path" | "parent">>(items: T[], path: string | null) => {
134
+ root?: NestedPath | undefined;
135
+ items: T[];
136
+ };
137
+ export declare const isContentTypeEligible: (uid?: string) => boolean | "";
138
+ //# sourceMappingURL=functions.d.ts.map