@mattisvensson/strapi-plugin-webatlas 0.8.1 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/_chunks/SettingTitle-BaaQ_99D.mjs +69 -0
  2. package/dist/_chunks/SettingTitle-BaaQ_99D.mjs.map +1 -0
  3. package/dist/_chunks/SettingTitle-D5oNwpzC.js +67 -0
  4. package/dist/_chunks/SettingTitle-DDZxIqee.js +68 -0
  5. package/dist/_chunks/SettingTitle-DDZxIqee.js.map +1 -0
  6. package/dist/_chunks/SettingTitle-IwvX4Kb5.mjs +68 -0
  7. package/dist/_chunks/{de-Dt80IqMG.mjs → de-B9pq-AJZ.mjs} +10 -3
  8. package/dist/_chunks/{de-Dt80IqMG.mjs.map → de-B9pq-AJZ.mjs.map} +1 -1
  9. package/dist/_chunks/{de-CDBoUBzw.js → de-DlQxM8Tg.js} +10 -3
  10. package/dist/_chunks/{de-CDBoUBzw.js.map → de-DlQxM8Tg.js.map} +1 -1
  11. package/dist/_chunks/{en-BHxDiueo.mjs → en-Dmbcf7gp.mjs} +10 -3
  12. package/dist/_chunks/{en-BHxDiueo.mjs.map → en-Dmbcf7gp.mjs.map} +1 -1
  13. package/dist/_chunks/{en-DfvURaup.js → en-DrhxIwOr.js} +10 -3
  14. package/dist/_chunks/{en-DfvURaup.js.map → en-DrhxIwOr.js.map} +1 -1
  15. package/dist/_chunks/{index--oj1eNcM.js → index--XAogZgv.js} +2 -2
  16. package/dist/_chunks/{index--oj1eNcM.js.map → index--XAogZgv.js.map} +1 -1
  17. package/dist/_chunks/{index-BCPgfhBx.js → index-2lVgPz4a.js} +37 -33
  18. package/dist/_chunks/{index-BKdvSgDB.js → index-B1dEY-gs.js} +1 -1
  19. package/dist/_chunks/{index-DUgh4AJb.js → index-B1mbYb2_.js} +94 -53
  20. package/dist/_chunks/{index-CAged_xE.mjs → index-B2tjc_lG.mjs} +2 -2
  21. package/dist/_chunks/{index-CAged_xE.mjs.map → index-B2tjc_lG.mjs.map} +1 -1
  22. package/dist/_chunks/{index-YzPuPn68.js → index-BFuwbmZy.js} +22 -9
  23. package/dist/_chunks/{index-CTA8agp7.mjs → index-D2Meknib.mjs} +10 -8
  24. package/dist/_chunks/{index-D29zBs5w.mjs → index-D2SIGcj3.mjs} +23 -9
  25. package/dist/_chunks/{index-D29zBs5w.mjs.map → index-D2SIGcj3.mjs.map} +1 -1
  26. package/dist/_chunks/{index-D72CZ5b7.js → index-DH0mFrgH.js} +38 -32
  27. package/dist/_chunks/index-DH0mFrgH.js.map +1 -0
  28. package/dist/_chunks/{index-DTPDMxs_.js → index-DKtlnMlv.js} +23 -8
  29. package/dist/_chunks/{index-YzPuPn68.js.map → index-DKtlnMlv.js.map} +1 -1
  30. package/dist/_chunks/{index-Dxn0NT06.js → index-DOMrViWi.js} +11 -8
  31. package/dist/_chunks/index-DOMrViWi.js.map +1 -0
  32. package/dist/_chunks/{index-BBn1ZvsE.mjs → index-DXRtXlZW.mjs} +36 -30
  33. package/dist/_chunks/index-DXRtXlZW.mjs.map +1 -0
  34. package/dist/_chunks/{index-CtFERXkl.js → index-Df365kgY.js} +95 -54
  35. package/dist/_chunks/index-Df365kgY.js.map +1 -0
  36. package/dist/_chunks/{index-CHRBu9Xy.mjs → index-Dm_GIRd4.mjs} +35 -31
  37. package/dist/_chunks/{index-DMpiX4hP.mjs → index-Dt-mlR1F.mjs} +11 -9
  38. package/dist/_chunks/index-Dt-mlR1F.mjs.map +1 -0
  39. package/dist/_chunks/{index-DJBXRNlE.mjs → index-QFbHwlyj.mjs} +94 -53
  40. package/dist/_chunks/index-QFbHwlyj.mjs.map +1 -0
  41. package/dist/_chunks/{index-Nx4IRYIK.mjs → index-QU9SZ_H9.mjs} +93 -52
  42. package/dist/_chunks/{index-CUlRMqGG.mjs → index-_49Fvwqq.mjs} +22 -8
  43. package/dist/_chunks/{index-Rfm9O167.mjs → index-aAKsnALd.mjs} +1 -1
  44. package/dist/_chunks/{index-CbW6k4FH.js → index-g8wz2qoC.js} +9 -8
  45. package/dist/admin/index.js +1 -1
  46. package/dist/admin/index.mjs +1 -1
  47. package/dist/admin/src/pages/Navigation/RouteItem.d.ts +1 -0
  48. package/dist/admin/src/pages/Settings/ContentBox.d.ts +5 -0
  49. package/dist/admin/src/pages/Settings/PageWrapper.d.ts +2 -1
  50. package/dist/admin/src/pages/Settings/SettingTitle.d.ts +4 -0
  51. package/dist/admin/src/pages/Settings/index.d.ts +4 -0
  52. package/dist/pluginId.d.ts +2 -1
  53. package/dist/server/index.js +61 -52
  54. package/dist/server/index.js.map +1 -1
  55. package/dist/server/index.mjs +61 -52
  56. package/dist/server/index.mjs.map +1 -1
  57. package/dist/server/src/utils/index.d.ts +6 -0
  58. package/dist/server/src/utils/navItemHandler.d.ts +1 -1
  59. package/dist/server/src/utils/reduceDepthOfOrphanedItems.d.ts +2 -0
  60. package/package.json +1 -1
  61. package/dist/_chunks/PageWrapper-Bp9vGwpG.js +0 -54
  62. package/dist/_chunks/PageWrapper-BvOY7VCN.mjs +0 -55
  63. package/dist/_chunks/PageWrapper-BzDrMm2d.js +0 -55
  64. package/dist/_chunks/PageWrapper-BzDrMm2d.js.map +0 -1
  65. package/dist/_chunks/PageWrapper-oLhcg9BA.mjs +0 -56
  66. package/dist/_chunks/PageWrapper-oLhcg9BA.mjs.map +0 -1
  67. package/dist/_chunks/index-BCPgfhBx.js.map +0 -1
  68. package/dist/_chunks/index-CHRBu9Xy.mjs.map +0 -1
  69. package/dist/_chunks/index-CbW6k4FH.js.map +0 -1
  70. package/dist/_chunks/index-CtFERXkl.js.map +0 -1
  71. package/dist/_chunks/index-DJBXRNlE.mjs.map +0 -1
  72. package/dist/_chunks/index-DMpiX4hP.mjs.map +0 -1
  73. package/dist/admin/src/components/modals/fields/Visibility.d.ts +0 -5
  74. package/dist/admin/src/components/modals/fields/index.d.ts +0 -2
@@ -4,11 +4,11 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  const React = require("react");
5
5
  const designSystem = require("@strapi/design-system");
6
6
  const admin = require("@strapi/strapi/admin");
7
- const index = require("./index-CbW6k4FH.js");
7
+ const index = require("./index-g8wz2qoC.js");
8
8
  const reactIntl = require("react-intl");
9
9
  require("@strapi/icons/symbols");
10
10
  const FullLoader = require("./FullLoader-Cmsf8xS6.js");
11
- const PageWrapper = require("./PageWrapper-BzDrMm2d.js");
11
+ const SettingTitle = require("./SettingTitle-D5oNwpzC.js");
12
12
  function reducer(newConfig, action) {
13
13
  switch (action.type) {
14
14
  case "SET_MAX_DEPTH":
@@ -75,50 +75,54 @@ const Settings = () => {
75
75
  }
76
76
  if (loading) {
77
77
  return /* @__PURE__ */ jsxRuntime.jsx(
78
- PageWrapper.PageWrapper,
78
+ SettingTitle.PageWrapper,
79
79
  {
80
80
  isSaving,
81
+ subtitle: formatMessage({
82
+ id: index.getTranslation("loading"),
83
+ defaultMessage: "Loading..."
84
+ }),
81
85
  disabledCondition: true,
82
86
  children: /* @__PURE__ */ jsxRuntime.jsx(FullLoader.FullLoader, { height: 200 })
83
87
  }
84
88
  );
85
89
  }
86
90
  return /* @__PURE__ */ jsxRuntime.jsx(
87
- PageWrapper.PageWrapper,
91
+ SettingTitle.PageWrapper,
88
92
  {
89
93
  save,
90
94
  isSaving,
95
+ subtitle: formatMessage({
96
+ id: index.getTranslation("settings.page.navigation.subtitle"),
97
+ defaultMessage: "Configure navigation settings"
98
+ }),
91
99
  disabledCondition: JSON.stringify(config) === JSON.stringify(initialConfig.current),
92
- children: /* @__PURE__ */ jsxRuntime.jsxs(
93
- designSystem.Field.Root,
94
- {
95
- name: "maxNavDepth",
96
- children: [
97
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
98
- id: index.getTranslation("settings.page.maxNavDepth.label"),
99
- defaultMessage: "Max depth of navigation tree"
100
- }) }),
101
- /* @__PURE__ */ jsxRuntime.jsx(
102
- designSystem.Field.Input,
103
- {
104
- id: "maxNavDepth",
105
- type: "number",
106
- min: 1,
107
- step: 1,
108
- value: config?.navigation?.maxDepth !== void 0 ? config.navigation.maxDepth : "",
109
- onChange: (e) => dispatch({ type: "SET_MAX_DEPTH", payload: Number(e.target.value) }),
110
- onBlur: (e) => {
111
- if (e.target.value === "") return;
112
- dispatch({ type: "SET_MAX_DEPTH", payload: Number(e.target.value) });
113
- }
114
- }
115
- ),
116
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Hint, {})
117
- ]
118
- }
119
- )
100
+ children: /* @__PURE__ */ jsxRuntime.jsx(SettingTitle.ContentBox, { title: formatMessage({
101
+ id: index.getTranslation("settings.page.navigation.navigation"),
102
+ defaultMessage: "Navigation"
103
+ }), children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { name: "maxNavDepth", children: [
104
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: /* @__PURE__ */ jsxRuntime.jsx(SettingTitle.SettingTitle, { children: formatMessage({
105
+ id: index.getTranslation("settings.page.navigation.maxNavDepth.label"),
106
+ defaultMessage: "Max depth of navigation tree"
107
+ }) }) }),
108
+ /* @__PURE__ */ jsxRuntime.jsx(
109
+ designSystem.Field.Input,
110
+ {
111
+ id: "maxNavDepth",
112
+ type: "number",
113
+ min: 0,
114
+ step: 1,
115
+ value: config?.navigation?.maxDepth !== void 0 ? config.navigation.maxDepth + 1 : "",
116
+ onChange: (e) => dispatch({ type: "SET_MAX_DEPTH", payload: Number(e.target.value) - 1 }),
117
+ onBlur: (e) => {
118
+ if (e.target.value === "") return;
119
+ dispatch({ type: "SET_MAX_DEPTH", payload: Number(e.target.value) - 1 });
120
+ }
121
+ }
122
+ ),
123
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Hint, {})
124
+ ] }) })
120
125
  }
121
126
  );
122
127
  };
123
128
  exports.default = Settings;
124
- //# sourceMappingURL=index-BCPgfhBx.js.map
@@ -4,7 +4,7 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  const React = require("react");
5
5
  const designSystem = require("@strapi/design-system");
6
6
  const icons = require("@strapi/icons");
7
- const index = require("./index-Dxn0NT06.js");
7
+ const index = require("./index-g8wz2qoC.js");
8
8
  const admin = require("@strapi/strapi/admin");
9
9
  require("@strapi/icons/symbols");
10
10
  const FullLoader = require("./FullLoader-Cmsf8xS6.js");
@@ -4,11 +4,12 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  const React = require("react");
5
5
  const designSystem = require("@strapi/design-system");
6
6
  const admin = require("@strapi/strapi/admin");
7
- const index = require("./index-Dxn0NT06.js");
7
+ const index = require("./index-g8wz2qoC.js");
8
8
  const reactIntl = require("react-intl");
9
9
  require("@strapi/icons/symbols");
10
10
  const FullLoader = require("./FullLoader-Cmsf8xS6.js");
11
- const PageWrapper = require("./PageWrapper-Bp9vGwpG.js");
11
+ const SettingTitle = require("./SettingTitle-D5oNwpzC.js");
12
+ const icons = require("@strapi/icons");
12
13
  function ContentTypeAccordion({
13
14
  contentType,
14
15
  contentTypeSettings,
@@ -180,70 +181,110 @@ const Settings = () => {
180
181
  }
181
182
  if (loading) {
182
183
  return /* @__PURE__ */ jsxRuntime.jsx(
183
- PageWrapper.PageWrapper,
184
+ SettingTitle.PageWrapper,
184
185
  {
185
186
  isSaving,
187
+ subtitle: formatMessage({
188
+ id: index.getTranslation("loading"),
189
+ defaultMessage: "Loading..."
190
+ }),
186
191
  disabledCondition: true,
187
192
  children: /* @__PURE__ */ jsxRuntime.jsx(FullLoader.FullLoader, { height: 200 })
188
193
  }
189
194
  );
190
195
  }
191
196
  return /* @__PURE__ */ jsxRuntime.jsxs(
192
- PageWrapper.PageWrapper,
197
+ SettingTitle.PageWrapper,
193
198
  {
194
199
  save,
195
200
  isSaving,
201
+ subtitle: formatMessage({
202
+ id: index.getTranslation("settings.page.general.subtitle"),
203
+ defaultMessage: "Configure general settings"
204
+ }),
196
205
  disabledCondition: JSON.stringify(config) === JSON.stringify(initialConfig.current),
197
206
  children: [
198
- /* @__PURE__ */ jsxRuntime.jsxs(
199
- designSystem.Field.Root,
200
- {
201
- name: "selectedContentTypes",
202
- hint: formatMessage({
203
- id: index.getTranslation("settings.page.enabledContentTypes.hint"),
204
- defaultMessage: "Select the content types for which you want to enable URL aliases"
205
- }),
206
- children: [
207
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
208
- id: index.getTranslation("settings.page.enabledContentTypes"),
209
- defaultMessage: "Enabled Content Types"
210
- }) }),
211
- /* @__PURE__ */ jsxRuntime.jsx(
212
- designSystem.MultiSelect,
213
- {
214
- placeholder: formatMessage({
215
- id: index.getTranslation("settings.page.enabledContentTypes.placeholder"),
216
- defaultMessage: "Select content types..."
217
- }),
218
- onClear: () => dispatch({ type: "SET_SELECTED_CONTENT_TYPES", payload: [] }),
219
- value: [...config?.selectedContentTypes.map((ct) => ct.uid) || []],
220
- onChange: (value) => dispatch({
221
- type: "SET_SELECTED_CONTENT_TYPES",
222
- payload: value.map((v) => ({
223
- uid: v,
224
- default: "",
225
- pattern: ""
226
- }))
227
- }),
228
- withTags: true,
229
- children: allContentTypes && allContentTypes.map(
230
- (item) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MultiSelectOption, { value: item.uid, children: item.info.displayName }, item.uid)
231
- )
232
- }
233
- ),
234
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Hint, {})
235
- ]
236
- }
237
- ),
238
- config?.selectedContentTypes && config.selectedContentTypes.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingTop: 4, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { name: "selectedContentTypesAccordion", children: [
239
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
240
- id: index.getTranslation("settings.page.contentTypeSettings"),
241
- defaultMessage: "Content Type settings"
242
- }) }),
243
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Root, { children: config.selectedContentTypes?.map((contentTypeSettings) => {
244
- const ct = allContentTypes?.find((item) => item.uid === contentTypeSettings.uid);
245
- return /* @__PURE__ */ jsxRuntime.jsx(ContentTypeAccordion, { contentType: ct, contentTypeSettings, dispatch }, contentTypeSettings.uid);
246
- }) })
207
+ /* @__PURE__ */ jsxRuntime.jsxs(SettingTitle.ContentBox, { title: formatMessage({
208
+ id: index.getTranslation("settings.page.general.contentTypes"),
209
+ defaultMessage: "Content Types"
210
+ }), children: [
211
+ /* @__PURE__ */ jsxRuntime.jsxs(
212
+ designSystem.Field.Root,
213
+ {
214
+ name: "selectedContentTypes",
215
+ hint: formatMessage({
216
+ id: index.getTranslation("settings.page.enabledContentTypes.hint"),
217
+ defaultMessage: "Select the content types for which you want to enable URL aliases"
218
+ }),
219
+ children: [
220
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: /* @__PURE__ */ jsxRuntime.jsx(SettingTitle.SettingTitle, { children: formatMessage({
221
+ id: index.getTranslation("settings.page.enabledContentTypes"),
222
+ defaultMessage: "Enabled Content Types"
223
+ }) }) }),
224
+ /* @__PURE__ */ jsxRuntime.jsx(
225
+ designSystem.MultiSelect,
226
+ {
227
+ placeholder: formatMessage({
228
+ id: index.getTranslation("settings.page.enabledContentTypes.placeholder"),
229
+ defaultMessage: "Select content types..."
230
+ }),
231
+ onClear: () => dispatch({ type: "SET_SELECTED_CONTENT_TYPES", payload: [] }),
232
+ value: [...config?.selectedContentTypes.map((ct) => ct.uid) || []],
233
+ onChange: (value) => dispatch({
234
+ type: "SET_SELECTED_CONTENT_TYPES",
235
+ payload: value.map((v) => ({
236
+ uid: v,
237
+ default: "",
238
+ pattern: ""
239
+ }))
240
+ }),
241
+ withTags: true,
242
+ children: allContentTypes && allContentTypes.map(
243
+ (item) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.MultiSelectOption, { value: item.uid, children: item.info.displayName }, item.uid)
244
+ )
245
+ }
246
+ ),
247
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Hint, {})
248
+ ]
249
+ }
250
+ ),
251
+ config?.selectedContentTypes && config.selectedContentTypes.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingTop: 4, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { name: "selectedContentTypesAccordion", children: [
252
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: /* @__PURE__ */ jsxRuntime.jsx(SettingTitle.SettingTitle, { children: formatMessage({
253
+ id: index.getTranslation("settings.page.contentTypeSettings"),
254
+ defaultMessage: "Content Type settings"
255
+ }) }) }),
256
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Root, { children: config.selectedContentTypes?.map((contentTypeSettings) => {
257
+ const ct = allContentTypes?.find((item) => item.uid === contentTypeSettings.uid);
258
+ return /* @__PURE__ */ jsxRuntime.jsx(ContentTypeAccordion, { contentType: ct, contentTypeSettings, dispatch }, contentTypeSettings.uid);
259
+ }) })
260
+ ] }) })
261
+ ] }),
262
+ /* @__PURE__ */ jsxRuntime.jsx(SettingTitle.ContentBox, { title: formatMessage({
263
+ id: index.getTranslation("settings.page.general.details"),
264
+ defaultMessage: "Details"
265
+ }), children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { name: "selectedContentTypesAccordion", children: [
266
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: /* @__PURE__ */ jsxRuntime.jsxs(SettingTitle.SettingTitle, { children: [
267
+ index.PLUGIN_NAME,
268
+ " ",
269
+ formatMessage({
270
+ id: index.getTranslation("version"),
271
+ defaultMessage: "Version"
272
+ })
273
+ ] }) }),
274
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { children: [
275
+ "v",
276
+ index.PLUGIN_VERSION,
277
+ /* @__PURE__ */ jsxRuntime.jsx(
278
+ designSystem.Link,
279
+ {
280
+ href: `https://github.com/mattisvensson/strapi-plugin-webatlas/releases/tag/v${index.PLUGIN_VERSION}`,
281
+ target: "_blank",
282
+ rel: "noopener noreferrer",
283
+ style: { marginLeft: 4 },
284
+ children: /* @__PURE__ */ jsxRuntime.jsx(icons.ExternalLink, {})
285
+ }
286
+ )
287
+ ] })
247
288
  ] }) })
248
289
  ]
249
290
  }
@@ -2,7 +2,7 @@ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import { useState, useEffect, useMemo } from "react";
3
3
  import { Thead, Tr, Th, Typography, VisuallyHidden, Td, Flex, LinkButton, Grid, Box, Field, Table, Tbody, EmptyStateLayout } from "@strapi/design-system";
4
4
  import { ChevronDown, Pencil, Cross } from "@strapi/icons";
5
- import { g as getTranslation, u as useApi, d as debounce } from "./index-DMpiX4hP.mjs";
5
+ import { g as getTranslation, u as useApi, d as debounce } from "./index-Dt-mlR1F.mjs";
6
6
  import { Page, Layouts, useNotification } from "@strapi/strapi/admin";
7
7
  import "@strapi/icons/symbols";
8
8
  import { F as FullLoader } from "./FullLoader-CrPED_dY.mjs";
@@ -244,4 +244,4 @@ const Routes = () => {
244
244
  export {
245
245
  Routes as default
246
246
  };
247
- //# sourceMappingURL=index-CAged_xE.mjs.map
247
+ //# sourceMappingURL=index-B2tjc_lG.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-CAged_xE.mjs","sources":["../../admin/src/utils/getRouteType.ts","../../admin/src/pages/Routes/TableHeader.tsx","../../admin/src/pages/Routes/TableRow.tsx","../../admin/src/pages/Routes/PageWrapper.tsx","../../admin/src/pages/Routes/compareBy.ts","../../admin/src/pages/Routes/index.tsx"],"sourcesContent":["import type { Route } from \"../../../types\";\n\nexport default function getRouteType(route: Route): 'internal' | 'external' | 'wrapper' {\n if (route.wrapper) {\n return 'wrapper';\n } else if (!route.internal) {\n return 'external';\n } else {\n return 'internal';\n }\n}","import type { RouteSortKey } from '../../../../types';\nimport { Typography, Thead, Tr, Th, VisuallyHidden } from '@strapi/design-system';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\nimport { ChevronDown } from '@strapi/icons';\n\nexport default function TableHeader({\n sortKey,\n handleSort\n}: {\n sortKey: RouteSortKey,\n handleSort: (key: RouteSortKey) => void\n}) {\n const { formatMessage } = useIntl();\n\n return (\n <Thead>\n <Tr>\n <Th onClick={() => handleSort('title')} cursor=\"pointer\">\n <Typography variant=\"sigma\">\n {formatMessage({\n id: getTranslation('title'),\n defaultMessage: 'Title',\n })}\n </Typography>\n {sortKey === 'title' && <ChevronDown />}\n </Th>\n <Th onClick={() => handleSort('fullPath')} cursor=\"pointer\">\n <Typography variant=\"sigma\">\n {formatMessage({\n id: getTranslation('route'),\n defaultMessage: 'Route',\n })}\n </Typography>\n {sortKey === 'fullPath' && <ChevronDown />}\n </Th>\n <Th onClick={() => handleSort('type')} cursor=\"pointer\">\n <Typography variant=\"sigma\">\n {formatMessage({\n id: getTranslation('routes.page.column.type'),\n defaultMessage: 'Type',\n })}\n </Typography>\n {sortKey === 'type' && <ChevronDown />}\n </Th>\n <Th>\n <VisuallyHidden>\n {formatMessage({\n id: getTranslation('actions'),\n defaultMessage: 'Actions',\n })}\n </VisuallyHidden>\n </Th>\n </Tr>\n </Thead>\n )\n}","import type { Route } from '../../../../types';\nimport { Typography, Tr, Td, Flex, LinkButton } from '@strapi/design-system';\nimport { getTranslation, getRouteType } from '../../utils';\nimport { useIntl } from 'react-intl';\nimport { Pencil } from '@strapi/icons';\n\nexport default function TableRow({ route }: { route: Route }) {\n const { formatMessage } = useIntl();\n \n return (\n <Tr>\n <Td>\n <Typography textColor=\"neutral800\">{route.title}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">{route.fullPath}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">\n {formatMessage({\n id: getTranslation(`route.type.${getRouteType(route)}`),\n defaultMessage: '-',\n })}\n </Typography>\n </Td>\n <Td>\n <Flex gap={2} justifyContent=\"end\">\n {route.internal && \n <LinkButton\n variant=\"secondary\"\n startIcon={<Pencil />} \n href={`/admin/content-manager/collection-types/${route.relatedContentType}/${route.relatedDocumentId}`}\n >\n {formatMessage({\n id: getTranslation('edit'),\n defaultMessage: 'Edit',\n })}\n </LinkButton>\n }\n </Flex>\n </Td>\n </Tr>\n )\n}","import { Layouts, Page } from '@strapi/strapi/admin';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\n\nexport default function PageWrapper({ children }: { children: React.ReactNode }) {\n const { formatMessage } = useIntl();\n\n return (\n <Page.Main>\n <Layouts.Header\n title={formatMessage({\n id: getTranslation('routes.page.title'),\n defaultMessage: 'Routes',\n })}\n subtitle={formatMessage({\n id: getTranslation('routes.page.subtitle'),\n defaultMessage: 'Overview of all existing routes',\n })}\n />\n <Layouts.Content>\n <>\n {children}\n </>\n </Layouts.Content>\n </Page.Main>\n );\n}","import type { Route, RouteSortKey } from '../../../../types';\n\nexport default function compareBy(field: RouteSortKey, direction: 'asc' | 'desc') {\n if (!field) {\n return () => 0;\n }\n if (field === 'type') {\n return (a: Route, b: Route) => {\n const typeA = a.internal ? 'internal' : 'external';\n const typeB = b.internal ? 'internal' : 'external';\n return direction === 'asc'\n ? typeA.localeCompare(typeB)\n : typeB.localeCompare(typeA);\n };\n }\n return (a: Route, b: Route) => {\n const aValue = a[field];\n const bValue = b[field];\n if (typeof aValue === 'string' && typeof bValue === 'string') {\n return direction === 'asc'\n ? aValue.localeCompare(bValue)\n : bValue.localeCompare(aValue);\n }\n return 0;\n };\n}","/*\n *\n * Routes\n * This file contains the Routes page of the Webatlas plugin for Strapi.\n * It displays a table of all existing routes with their details and allows editing.\n *\n*/\n\nimport type { Route, RouteSortKey } from '../../../../types';\nimport { useState, useEffect } from 'react';\nimport { Table, Tbody, Box, Grid, Field, EmptyStateLayout, Tr, Td } from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { useApi } from '../../hooks';\nimport { FullLoader } from '../../components/UI';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\nimport TableHeader from './TableHeader';\nimport TableRow from './TableRow';\nimport { useNotification } from '@strapi/strapi/admin'\nimport PageWrapper from './PageWrapper';\nimport { useSearchParams } from 'react-router-dom';\nimport debounce from '../../utils/debounce';\nimport { useMemo } from 'react';\nimport compareBy from './compareBy';\n\nfunction SearchInput({\n searchQuery,\n handleSearchChange\n}: {\n searchQuery: string;\n handleSearchChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n}) {\n\n const { formatMessage } = useIntl();\n\n return (\n <Grid.Root style={{ marginBottom: '16px' }}>\n <Grid.Item col={4} s={12}>\n <Box width=\"100%\">\n <Field.Root>\n <Field.Input\n name=\"search\"\n placeholder={formatMessage({\n id: getTranslation('routes.page.searchPlaceholder'),\n defaultMessage: 'Search routes',\n })}\n value={searchQuery}\n onChange={handleSearchChange}\n endAction={\n searchQuery ? (\n <button\n type=\"button\"\n onClick={() => handleSearchChange({ target: { value: '' } } as React.ChangeEvent<HTMLInputElement>)}\n style={{ color: 'inherit', background: 'none', border: 'none', cursor: 'pointer' }}\n aria-label=\"Clear search\"\n >\n <Cross />\n </button>\n ) : null\n }\n />\n </Field.Root>\n </Box>\n </Grid.Item>\n </Grid.Root>\n );\n}\n\nfunction RouteTable({\n routes, \n sortKey, \n handleSort\n}: { \n routes: Route[], \n sortKey: RouteSortKey, \n handleSort: (key: RouteSortKey) => void\n}) {\n \n const { formatMessage } = useIntl();\n\n return (\n <Table colCount={4} rowCount={routes.length}>\n <TableHeader sortKey={sortKey} handleSort={handleSort} />\n <Tbody>\n {routes.length > 0 ? routes.map((route: Route) => (\n <TableRow key={route.id} route={route} />\n )) : \n <Tr>\n <Td colSpan={4}>\n <EmptyStateLayout \n content={\n formatMessage({\n id: getTranslation('routes.page.emptyRoutes'),\n defaultMessage: 'No routes found',\n })\n } \n shadow={false}\n />\n </Td>\n </Tr>\n }\n </Tbody>\n </Table>\n )\n}\n\nconst Routes = () => {\n const { getRoutes } = useApi();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n \n const [allRoutes, setAllRoutes] = useState<Route[]>([]);\n const [routes, setRoutes] = useState<Route[]>([]);\n const [loading, setLoading] = useState(true);\n const [searchParams, setSearchParams] = useSearchParams();\n const initialQuery = searchParams.get('search') || '';\n const [searchQuery, setSearchQuery] = useState(initialQuery);\n const [sortKey, setSortKey] = useState<RouteSortKey>(undefined);\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc');\n\n useEffect(() => {\n const query = searchQuery.toLowerCase()\n setRoutes(\n allRoutes.filter((route) =>\n JSON.stringify(route.id).toLowerCase().includes(query) ||\n route.title.toLowerCase().includes(query) ||\n route.fullPath.toLowerCase().includes(query) ||\n route.relatedDocumentId.toLowerCase().includes(query) ||\n route.relatedContentType.toLowerCase().includes(query)\n )\n )\n }, [searchQuery, allRoutes]);\n\n const debouncedSetSearchParams = useMemo(() =>\n debounce((value: string) => {\n value\n ? setSearchParams({ search: value })\n : setSearchParams({});\n }, 300),\n [setSearchParams]);\n\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setSearchQuery(value);\n debouncedSetSearchParams(value);\n }\n\n useEffect(() => {\n async function fetchRoutes() {\n try {\n const data = await getRoutes();\n setAllRoutes(data);\n setRoutes(data);\n } catch (err) {\n console.error('Failed to fetch routes:', err);\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslation('notification.routes.fetchFailed'),\n defaultMessage: 'Failed to fetch routes',\n }),\n });\n } finally {\n setLoading(false);\n }\n }\n fetchRoutes();\n }, [])\n\n const handleSort = (key: RouteSortKey) => {\n setSortDirection(prev => (prev === 'asc' ? 'desc' : 'asc'));\n setSortKey(key);\n };\n\n useEffect(() => {\n const sortedRoutes = sortKey\n ? [...routes].sort(compareBy(sortKey, sortDirection))\n : routes; \n setRoutes(sortedRoutes);\n }, [sortKey, sortDirection]);\n\n if (loading) {\n return <PageWrapper>\n <FullLoader />\n </PageWrapper>\n }\n\n return (\n <PageWrapper>\n <SearchInput\n handleSearchChange={handleSearchChange}\n searchQuery={searchQuery}\n />\n <RouteTable\n routes={routes} \n sortKey={sortKey}\n handleSort={handleSort}\n />\n </PageWrapper>\n );\n};\n\nexport default Routes;"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index-B2tjc_lG.mjs","sources":["../../admin/src/utils/getRouteType.ts","../../admin/src/pages/Routes/TableHeader.tsx","../../admin/src/pages/Routes/TableRow.tsx","../../admin/src/pages/Routes/PageWrapper.tsx","../../admin/src/pages/Routes/compareBy.ts","../../admin/src/pages/Routes/index.tsx"],"sourcesContent":["import type { Route } from \"../../../types\";\n\nexport default function getRouteType(route: Route): 'internal' | 'external' | 'wrapper' {\n if (route.wrapper) {\n return 'wrapper';\n } else if (!route.internal) {\n return 'external';\n } else {\n return 'internal';\n }\n}","import type { RouteSortKey } from '../../../../types';\nimport { Typography, Thead, Tr, Th, VisuallyHidden } from '@strapi/design-system';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\nimport { ChevronDown } from '@strapi/icons';\n\nexport default function TableHeader({\n sortKey,\n handleSort\n}: {\n sortKey: RouteSortKey,\n handleSort: (key: RouteSortKey) => void\n}) {\n const { formatMessage } = useIntl();\n\n return (\n <Thead>\n <Tr>\n <Th onClick={() => handleSort('title')} cursor=\"pointer\">\n <Typography variant=\"sigma\">\n {formatMessage({\n id: getTranslation('title'),\n defaultMessage: 'Title',\n })}\n </Typography>\n {sortKey === 'title' && <ChevronDown />}\n </Th>\n <Th onClick={() => handleSort('fullPath')} cursor=\"pointer\">\n <Typography variant=\"sigma\">\n {formatMessage({\n id: getTranslation('route'),\n defaultMessage: 'Route',\n })}\n </Typography>\n {sortKey === 'fullPath' && <ChevronDown />}\n </Th>\n <Th onClick={() => handleSort('type')} cursor=\"pointer\">\n <Typography variant=\"sigma\">\n {formatMessage({\n id: getTranslation('routes.page.column.type'),\n defaultMessage: 'Type',\n })}\n </Typography>\n {sortKey === 'type' && <ChevronDown />}\n </Th>\n <Th>\n <VisuallyHidden>\n {formatMessage({\n id: getTranslation('actions'),\n defaultMessage: 'Actions',\n })}\n </VisuallyHidden>\n </Th>\n </Tr>\n </Thead>\n )\n}","import type { Route } from '../../../../types';\nimport { Typography, Tr, Td, Flex, LinkButton } from '@strapi/design-system';\nimport { getTranslation, getRouteType } from '../../utils';\nimport { useIntl } from 'react-intl';\nimport { Pencil } from '@strapi/icons';\n\nexport default function TableRow({ route }: { route: Route }) {\n const { formatMessage } = useIntl();\n \n return (\n <Tr>\n <Td>\n <Typography textColor=\"neutral800\">{route.title}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">{route.fullPath}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">\n {formatMessage({\n id: getTranslation(`route.type.${getRouteType(route)}`),\n defaultMessage: '-',\n })}\n </Typography>\n </Td>\n <Td>\n <Flex gap={2} justifyContent=\"end\">\n {route.internal && \n <LinkButton\n variant=\"secondary\"\n startIcon={<Pencil />} \n href={`/admin/content-manager/collection-types/${route.relatedContentType}/${route.relatedDocumentId}`}\n >\n {formatMessage({\n id: getTranslation('edit'),\n defaultMessage: 'Edit',\n })}\n </LinkButton>\n }\n </Flex>\n </Td>\n </Tr>\n )\n}","import { Layouts, Page } from '@strapi/strapi/admin';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\n\nexport default function PageWrapper({ children }: { children: React.ReactNode }) {\n const { formatMessage } = useIntl();\n\n return (\n <Page.Main>\n <Layouts.Header\n title={formatMessage({\n id: getTranslation('routes.page.title'),\n defaultMessage: 'Routes',\n })}\n subtitle={formatMessage({\n id: getTranslation('routes.page.subtitle'),\n defaultMessage: 'Overview of all existing routes',\n })}\n />\n <Layouts.Content>\n <>\n {children}\n </>\n </Layouts.Content>\n </Page.Main>\n );\n}","import type { Route, RouteSortKey } from '../../../../types';\n\nexport default function compareBy(field: RouteSortKey, direction: 'asc' | 'desc') {\n if (!field) {\n return () => 0;\n }\n if (field === 'type') {\n return (a: Route, b: Route) => {\n const typeA = a.internal ? 'internal' : 'external';\n const typeB = b.internal ? 'internal' : 'external';\n return direction === 'asc'\n ? typeA.localeCompare(typeB)\n : typeB.localeCompare(typeA);\n };\n }\n return (a: Route, b: Route) => {\n const aValue = a[field];\n const bValue = b[field];\n if (typeof aValue === 'string' && typeof bValue === 'string') {\n return direction === 'asc'\n ? aValue.localeCompare(bValue)\n : bValue.localeCompare(aValue);\n }\n return 0;\n };\n}","/*\n *\n * Routes\n * This file contains the Routes page of the Webatlas plugin for Strapi.\n * It displays a table of all existing routes with their details and allows editing.\n *\n*/\n\nimport type { Route, RouteSortKey } from '../../../../types';\nimport { useState, useEffect } from 'react';\nimport { Table, Tbody, Box, Grid, Field, EmptyStateLayout, Tr, Td } from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { useApi } from '../../hooks';\nimport { FullLoader } from '../../components/UI';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\nimport TableHeader from './TableHeader';\nimport TableRow from './TableRow';\nimport { useNotification } from '@strapi/strapi/admin'\nimport PageWrapper from './PageWrapper';\nimport { useSearchParams } from 'react-router-dom';\nimport debounce from '../../utils/debounce';\nimport { useMemo } from 'react';\nimport compareBy from './compareBy';\n\nfunction SearchInput({\n searchQuery,\n handleSearchChange\n}: {\n searchQuery: string;\n handleSearchChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n}) {\n\n const { formatMessage } = useIntl();\n\n return (\n <Grid.Root style={{ marginBottom: '16px' }}>\n <Grid.Item col={4} s={12}>\n <Box width=\"100%\">\n <Field.Root>\n <Field.Input\n name=\"search\"\n placeholder={formatMessage({\n id: getTranslation('routes.page.searchPlaceholder'),\n defaultMessage: 'Search routes',\n })}\n value={searchQuery}\n onChange={handleSearchChange}\n endAction={\n searchQuery ? (\n <button\n type=\"button\"\n onClick={() => handleSearchChange({ target: { value: '' } } as React.ChangeEvent<HTMLInputElement>)}\n style={{ color: 'inherit', background: 'none', border: 'none', cursor: 'pointer' }}\n aria-label=\"Clear search\"\n >\n <Cross />\n </button>\n ) : null\n }\n />\n </Field.Root>\n </Box>\n </Grid.Item>\n </Grid.Root>\n );\n}\n\nfunction RouteTable({\n routes, \n sortKey, \n handleSort\n}: { \n routes: Route[], \n sortKey: RouteSortKey, \n handleSort: (key: RouteSortKey) => void\n}) {\n \n const { formatMessage } = useIntl();\n\n return (\n <Table colCount={4} rowCount={routes.length}>\n <TableHeader sortKey={sortKey} handleSort={handleSort} />\n <Tbody>\n {routes.length > 0 ? routes.map((route: Route) => (\n <TableRow key={route.id} route={route} />\n )) : \n <Tr>\n <Td colSpan={4}>\n <EmptyStateLayout \n content={\n formatMessage({\n id: getTranslation('routes.page.emptyRoutes'),\n defaultMessage: 'No routes found',\n })\n } \n shadow={false}\n />\n </Td>\n </Tr>\n }\n </Tbody>\n </Table>\n )\n}\n\nconst Routes = () => {\n const { getRoutes } = useApi();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n \n const [allRoutes, setAllRoutes] = useState<Route[]>([]);\n const [routes, setRoutes] = useState<Route[]>([]);\n const [loading, setLoading] = useState(true);\n const [searchParams, setSearchParams] = useSearchParams();\n const initialQuery = searchParams.get('search') || '';\n const [searchQuery, setSearchQuery] = useState(initialQuery);\n const [sortKey, setSortKey] = useState<RouteSortKey>(undefined);\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc');\n\n useEffect(() => {\n const query = searchQuery.toLowerCase()\n setRoutes(\n allRoutes.filter((route) =>\n JSON.stringify(route.id).toLowerCase().includes(query) ||\n route.title.toLowerCase().includes(query) ||\n route.fullPath.toLowerCase().includes(query) ||\n route.relatedDocumentId.toLowerCase().includes(query) ||\n route.relatedContentType.toLowerCase().includes(query)\n )\n )\n }, [searchQuery, allRoutes]);\n\n const debouncedSetSearchParams = useMemo(() =>\n debounce((value: string) => {\n value\n ? setSearchParams({ search: value })\n : setSearchParams({});\n }, 300),\n [setSearchParams]);\n\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setSearchQuery(value);\n debouncedSetSearchParams(value);\n }\n\n useEffect(() => {\n async function fetchRoutes() {\n try {\n const data = await getRoutes();\n setAllRoutes(data);\n setRoutes(data);\n } catch (err) {\n console.error('Failed to fetch routes:', err);\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslation('notification.routes.fetchFailed'),\n defaultMessage: 'Failed to fetch routes',\n }),\n });\n } finally {\n setLoading(false);\n }\n }\n fetchRoutes();\n }, [])\n\n const handleSort = (key: RouteSortKey) => {\n setSortDirection(prev => (prev === 'asc' ? 'desc' : 'asc'));\n setSortKey(key);\n };\n\n useEffect(() => {\n const sortedRoutes = sortKey\n ? [...routes].sort(compareBy(sortKey, sortDirection))\n : routes; \n setRoutes(sortedRoutes);\n }, [sortKey, sortDirection]);\n\n if (loading) {\n return <PageWrapper>\n <FullLoader />\n </PageWrapper>\n }\n\n return (\n <PageWrapper>\n <SearchInput\n handleSearchChange={handleSearchChange}\n searchQuery={searchQuery}\n />\n <RouteTable\n routes={routes} \n sortKey={sortKey}\n handleSort={handleSort}\n />\n </PageWrapper>\n );\n};\n\nexport default Routes;"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ const designSystem = require("@strapi/design-system");
7
7
  const React = require("react");
8
8
  const ReactDOM = require("react-dom");
9
9
  const reactIntl = require("react-intl");
10
- const index = require("./index-CbW6k4FH.js");
10
+ const index = require("./index-g8wz2qoC.js");
11
11
  const admin = require("@strapi/strapi/admin");
12
12
  const FullLoader = require("./FullLoader-Cmsf8xS6.js");
13
13
  const symbols = require("@strapi/icons/symbols");
@@ -10603,7 +10603,7 @@ function getProjection(items, activeId, overId, dragOffset, maxDepthValue) {
10603
10603
  }
10604
10604
  function getMaxDepth({ previousItem, maxDepthValue }) {
10605
10605
  if (previousItem && typeof previousItem.depth === "number") {
10606
- return Math.min(previousItem.depth + 1, maxDepthValue - 1);
10606
+ return Math.min(previousItem.depth + 1, maxDepthValue);
10607
10607
  }
10608
10608
  return 0;
10609
10609
  }
@@ -10622,7 +10622,18 @@ function RouteIcon({ type, color = "neutral800" }) {
10622
10622
  return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { width: "16px", height: "16px" });
10623
10623
  }
10624
10624
  }
10625
- const RouteItem = React.forwardRef(({ item, setParentId, setActionItem, setNavigationItems, ghost, depth, style, wrapperRef, handleProps }, ref) => {
10625
+ const RouteItem = React.forwardRef(({
10626
+ item,
10627
+ setParentId,
10628
+ setActionItem,
10629
+ setNavigationItems,
10630
+ ghost,
10631
+ depth,
10632
+ maxDepth,
10633
+ style,
10634
+ wrapperRef,
10635
+ handleProps
10636
+ }, ref) => {
10626
10637
  if (!item || !item.route) return null;
10627
10638
  const { setModalType } = React.useContext(ModalContext);
10628
10639
  const { formatMessage } = reactIntl.useIntl();
@@ -10747,7 +10758,7 @@ const RouteItem = React.forwardRef(({ item, setParentId, setActionItem, setNavig
10747
10758
  id: index.getTranslation("edit"),
10748
10759
  defaultMessage: "Edit"
10749
10760
  }) }),
10750
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onClick: () => handleAddChildren(), children: formatMessage({
10761
+ depth !== void 0 && depth < maxDepth && /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onClick: () => handleAddChildren(), children: formatMessage({
10751
10762
  id: index.getTranslation("navigation.page.navItem.addChildren"),
10752
10763
  defaultMessage: "Add children"
10753
10764
  }) }),
@@ -12045,6 +12056,7 @@ const Navigation = () => {
12045
12056
  onClick: () => saveNavigation(),
12046
12057
  loading: isSavingNavigation,
12047
12058
  variant: "primary",
12059
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.Check, {}),
12048
12060
  disabled: JSON.stringify(navigationItems) === JSON.stringify(initialNavigationItemsRef.current),
12049
12061
  children: formatMessage({
12050
12062
  id: index.getTranslation("save"),
@@ -12064,7 +12076,7 @@ const Navigation = () => {
12064
12076
  onDragCancel: () => handleDragCancel(),
12065
12077
  measuring,
12066
12078
  children: /* @__PURE__ */ jsxRuntime.jsxs(sortable.SortableContext, { items: navigationItems, strategy: sortable.verticalListSortingStrategy, children: [
12067
- navigationItems.map((item, index2) => /* @__PURE__ */ jsxRuntime.jsx(
12079
+ navigationItems.map((item, index2) => config?.navigation.maxDepth && /* @__PURE__ */ jsxRuntime.jsx(
12068
12080
  SortableRouteItem,
12069
12081
  {
12070
12082
  item,
@@ -12072,18 +12084,20 @@ const Navigation = () => {
12072
12084
  setActionItem,
12073
12085
  setNavigationItems,
12074
12086
  indentationWidth,
12075
- depth: item.id === activeId && projected ? projected.depth : item.depth
12087
+ depth: item.id === activeId && projected ? projected.depth : item.depth,
12088
+ maxDepth: config.navigation.maxDepth
12076
12089
  },
12077
12090
  item.documentId || index2
12078
12091
  )),
12079
12092
  ReactDOM.createPortal(
12080
- /* @__PURE__ */ jsxRuntime.jsx(core.DragOverlay, { children: activeId && activeItem ? /* @__PURE__ */ jsxRuntime.jsx(
12093
+ /* @__PURE__ */ jsxRuntime.jsx(core.DragOverlay, { children: activeId && activeItem ? config?.navigation.maxDepth && /* @__PURE__ */ jsxRuntime.jsx(
12081
12094
  SortableRouteItem,
12082
12095
  {
12083
12096
  item: activeItem,
12084
12097
  setParentId,
12085
12098
  setActionItem,
12086
- setNavigationItems
12099
+ setNavigationItems,
12100
+ maxDepth: config.navigation.maxDepth
12087
12101
  }
12088
12102
  ) : null }),
12089
12103
  document.body
@@ -12225,4 +12239,3 @@ const App = () => {
12225
12239
  ] });
12226
12240
  };
12227
12241
  exports.default = App;
12228
- //# sourceMappingURL=index-YzPuPn68.js.map
@@ -23,7 +23,7 @@ const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
23
23
  );
24
24
  });
25
25
  };
26
- const version = "0.8.0";
26
+ const version = "0.8.1";
27
27
  const keywords = [];
28
28
  const type = "commonjs";
29
29
  const exports = {
@@ -148,6 +148,7 @@ const pluginPkg = {
148
148
  };
149
149
  const PLUGIN_ID = pluginPkg.strapi.name.replace(/^(@[^-,.][\w,-]+\/|strapi-)plugin-/i, "") || "webatlas";
150
150
  const PLUGIN_NAME = pluginPkg.strapi.displayName;
151
+ const PLUGIN_VERSION = pluginPkg.version;
151
152
  const Initializer = ({ setPlugin }) => {
152
153
  const ref = useRef(setPlugin);
153
154
  useEffect(() => {
@@ -3831,7 +3832,7 @@ const Alias = ({ config }) => {
3831
3832
  }
3832
3833
  }
3833
3834
  if (!initialLoadComplete) return /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", children: formatMessage({
3834
- id: getTranslation("components.CMEditViewAside.loading"),
3835
+ id: getTranslation("loading"),
3835
3836
  defaultMessage: "Loading..."
3836
3837
  }) });
3837
3838
  return /* @__PURE__ */ jsx(
@@ -4013,7 +4014,7 @@ const CMEditViewAside = () => {
4013
4014
  });
4014
4015
  }, []);
4015
4016
  if (isLoading || !config) return /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", children: formatMessage({
4016
- id: getTranslation("components.CMEditViewAside.loading"),
4017
+ id: getTranslation("loading"),
4017
4018
  defaultMessage: "Loading..."
4018
4019
  }) });
4019
4020
  if (!isAllowedContentType) return /* @__PURE__ */ jsxs(Typography, { textColor: "neutral600", children: [
@@ -4063,7 +4064,7 @@ const index = {
4063
4064
  defaultMessage: "Routes"
4064
4065
  },
4065
4066
  Component: async () => {
4066
- const component = await import("./index-Rfm9O167.mjs");
4067
+ const component = await import("./index-aAKsnALd.mjs");
4067
4068
  return { default: component.default };
4068
4069
  },
4069
4070
  permissions: [
@@ -4082,7 +4083,7 @@ const index = {
4082
4083
  defaultMessage: "Navigation"
4083
4084
  },
4084
4085
  Component: async () => {
4085
- const component = await import("./index-CUlRMqGG.mjs");
4086
+ const component = await import("./index-_49Fvwqq.mjs");
4086
4087
  return { default: component.default };
4087
4088
  },
4088
4089
  permissions: [
@@ -4111,7 +4112,7 @@ const index = {
4111
4112
  Component: async () => {
4112
4113
  return await import(
4113
4114
  /* webpackChunkName: "webatlas-settings-general-page" */
4114
- "./index-Nx4IRYIK.mjs"
4115
+ "./index-QU9SZ_H9.mjs"
4115
4116
  );
4116
4117
  },
4117
4118
  permissions: [
@@ -4135,7 +4136,7 @@ const index = {
4135
4136
  Component: async () => {
4136
4137
  return await import(
4137
4138
  /* webpackChunkName: "webatlas-settings-navigation-page" */
4138
- "./index-BBn1ZvsE.mjs"
4139
+ "./index-Dm_GIRd4.mjs"
4139
4140
  );
4140
4141
  },
4141
4142
  permissions: [
@@ -4164,7 +4165,7 @@ const index = {
4164
4165
  return Promise.all(
4165
4166
  locales.map(async (locale) => {
4166
4167
  try {
4167
- const { default: data } = await __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => import("./de-Dt80IqMG.mjs"), "./translations/en.json": () => import("./en-BHxDiueo.mjs") }), `./translations/${locale}.json`, 3);
4168
+ const { default: data } = await __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => import("./de-B9pq-AJZ.mjs"), "./translations/en.json": () => import("./en-Dmbcf7gp.mjs") }), `./translations/${locale}.json`, 3);
4168
4169
  return { data, locale };
4169
4170
  } catch {
4170
4171
  return { data: {}, locale };
@@ -4181,6 +4182,7 @@ export {
4181
4182
  usePluginConfig as b,
4182
4183
  useAllContentTypes as c,
4183
4184
  debounce as d,
4185
+ PLUGIN_VERSION as e,
4184
4186
  getTranslation as g,
4185
4187
  index as i,
4186
4188
  transformToUrl as t,