@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
@@ -1,12 +1,13 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { useReducer, useState, useRef, useEffect } from "react";
3
- import { Box, Accordion, Field, SingleSelect, SingleSelectOption, MultiSelect, MultiSelectOption } from "@strapi/design-system";
3
+ import { Box, Accordion, Field, SingleSelect, SingleSelectOption, MultiSelect, MultiSelectOption, Typography, Link } from "@strapi/design-system";
4
4
  import { useNotification } from "@strapi/strapi/admin";
5
- import { g as getTranslation, T as Tooltip, b as usePluginConfig, c as useAllContentTypes, t as transformToUrl } from "./index-DMpiX4hP.mjs";
5
+ import { g as getTranslation, T as Tooltip, b as usePluginConfig, c as useAllContentTypes, P as PLUGIN_NAME, e as PLUGIN_VERSION, t as transformToUrl } from "./index-Dt-mlR1F.mjs";
6
6
  import { useIntl } from "react-intl";
7
7
  import "@strapi/icons/symbols";
8
8
  import { F as FullLoader } from "./FullLoader-CrPED_dY.mjs";
9
- import { P as PageWrapper } from "./PageWrapper-oLhcg9BA.mjs";
9
+ import { P as PageWrapper, C as ContentBox, S as SettingTitle } from "./SettingTitle-BaaQ_99D.mjs";
10
+ import { ExternalLink } from "@strapi/icons";
10
11
  function ContentTypeAccordion({
11
12
  contentType,
12
13
  contentTypeSettings,
@@ -181,6 +182,10 @@ const Settings = () => {
181
182
  PageWrapper,
182
183
  {
183
184
  isSaving,
185
+ subtitle: formatMessage({
186
+ id: getTranslation("loading"),
187
+ defaultMessage: "Loading..."
188
+ }),
184
189
  disabledCondition: true,
185
190
  children: /* @__PURE__ */ jsx(FullLoader, { height: 200 })
186
191
  }
@@ -191,57 +196,93 @@ const Settings = () => {
191
196
  {
192
197
  save,
193
198
  isSaving,
199
+ subtitle: formatMessage({
200
+ id: getTranslation("settings.page.general.subtitle"),
201
+ defaultMessage: "Configure general settings"
202
+ }),
194
203
  disabledCondition: JSON.stringify(config) === JSON.stringify(initialConfig.current),
195
204
  children: [
196
- /* @__PURE__ */ jsxs(
197
- Field.Root,
198
- {
199
- name: "selectedContentTypes",
200
- hint: formatMessage({
201
- id: getTranslation("settings.page.enabledContentTypes.hint"),
202
- defaultMessage: "Select the content types for which you want to enable URL aliases"
203
- }),
204
- children: [
205
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
206
- id: getTranslation("settings.page.enabledContentTypes"),
207
- defaultMessage: "Enabled Content Types"
208
- }) }),
209
- /* @__PURE__ */ jsx(
210
- MultiSelect,
211
- {
212
- placeholder: formatMessage({
213
- id: getTranslation("settings.page.enabledContentTypes.placeholder"),
214
- defaultMessage: "Select content types..."
215
- }),
216
- onClear: () => dispatch({ type: "SET_SELECTED_CONTENT_TYPES", payload: [] }),
217
- value: [...config?.selectedContentTypes.map((ct) => ct.uid) || []],
218
- onChange: (value) => dispatch({
219
- type: "SET_SELECTED_CONTENT_TYPES",
220
- payload: value.map((v) => ({
221
- uid: v,
222
- default: "",
223
- pattern: ""
224
- }))
225
- }),
226
- withTags: true,
227
- children: allContentTypes && allContentTypes.map(
228
- (item) => /* @__PURE__ */ jsx(MultiSelectOption, { value: item.uid, children: item.info.displayName }, item.uid)
229
- )
230
- }
231
- ),
232
- /* @__PURE__ */ jsx(Field.Hint, {})
233
- ]
234
- }
235
- ),
236
- config?.selectedContentTypes && config.selectedContentTypes.length > 0 && /* @__PURE__ */ jsx(Box, { paddingTop: 4, children: /* @__PURE__ */ jsxs(Field.Root, { name: "selectedContentTypesAccordion", children: [
237
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
238
- id: getTranslation("settings.page.contentTypeSettings"),
239
- defaultMessage: "Content Type settings"
240
- }) }),
241
- /* @__PURE__ */ jsx(Accordion.Root, { children: config.selectedContentTypes?.map((contentTypeSettings) => {
242
- const ct = allContentTypes?.find((item) => item.uid === contentTypeSettings.uid);
243
- return /* @__PURE__ */ jsx(ContentTypeAccordion, { contentType: ct, contentTypeSettings, dispatch }, contentTypeSettings.uid);
244
- }) })
205
+ /* @__PURE__ */ jsxs(ContentBox, { title: formatMessage({
206
+ id: getTranslation("settings.page.general.contentTypes"),
207
+ defaultMessage: "Content Types"
208
+ }), children: [
209
+ /* @__PURE__ */ jsxs(
210
+ Field.Root,
211
+ {
212
+ name: "selectedContentTypes",
213
+ hint: formatMessage({
214
+ id: getTranslation("settings.page.enabledContentTypes.hint"),
215
+ defaultMessage: "Select the content types for which you want to enable URL aliases"
216
+ }),
217
+ children: [
218
+ /* @__PURE__ */ jsx(Field.Label, { children: /* @__PURE__ */ jsx(SettingTitle, { children: formatMessage({
219
+ id: getTranslation("settings.page.enabledContentTypes"),
220
+ defaultMessage: "Enabled Content Types"
221
+ }) }) }),
222
+ /* @__PURE__ */ jsx(
223
+ MultiSelect,
224
+ {
225
+ placeholder: formatMessage({
226
+ id: getTranslation("settings.page.enabledContentTypes.placeholder"),
227
+ defaultMessage: "Select content types..."
228
+ }),
229
+ onClear: () => dispatch({ type: "SET_SELECTED_CONTENT_TYPES", payload: [] }),
230
+ value: [...config?.selectedContentTypes.map((ct) => ct.uid) || []],
231
+ onChange: (value) => dispatch({
232
+ type: "SET_SELECTED_CONTENT_TYPES",
233
+ payload: value.map((v) => ({
234
+ uid: v,
235
+ default: "",
236
+ pattern: ""
237
+ }))
238
+ }),
239
+ withTags: true,
240
+ children: allContentTypes && allContentTypes.map(
241
+ (item) => /* @__PURE__ */ jsx(MultiSelectOption, { value: item.uid, children: item.info.displayName }, item.uid)
242
+ )
243
+ }
244
+ ),
245
+ /* @__PURE__ */ jsx(Field.Hint, {})
246
+ ]
247
+ }
248
+ ),
249
+ config?.selectedContentTypes && config.selectedContentTypes.length > 0 && /* @__PURE__ */ jsx(Box, { paddingTop: 4, children: /* @__PURE__ */ jsxs(Field.Root, { name: "selectedContentTypesAccordion", children: [
250
+ /* @__PURE__ */ jsx(Field.Label, { children: /* @__PURE__ */ jsx(SettingTitle, { children: formatMessage({
251
+ id: getTranslation("settings.page.contentTypeSettings"),
252
+ defaultMessage: "Content Type settings"
253
+ }) }) }),
254
+ /* @__PURE__ */ jsx(Accordion.Root, { children: config.selectedContentTypes?.map((contentTypeSettings) => {
255
+ const ct = allContentTypes?.find((item) => item.uid === contentTypeSettings.uid);
256
+ return /* @__PURE__ */ jsx(ContentTypeAccordion, { contentType: ct, contentTypeSettings, dispatch }, contentTypeSettings.uid);
257
+ }) })
258
+ ] }) })
259
+ ] }),
260
+ /* @__PURE__ */ jsx(ContentBox, { title: formatMessage({
261
+ id: getTranslation("settings.page.general.details"),
262
+ defaultMessage: "Details"
263
+ }), children: /* @__PURE__ */ jsxs(Field.Root, { name: "selectedContentTypesAccordion", children: [
264
+ /* @__PURE__ */ jsx(Field.Label, { children: /* @__PURE__ */ jsxs(SettingTitle, { children: [
265
+ PLUGIN_NAME,
266
+ " ",
267
+ formatMessage({
268
+ id: getTranslation("version"),
269
+ defaultMessage: "Version"
270
+ })
271
+ ] }) }),
272
+ /* @__PURE__ */ jsxs(Typography, { children: [
273
+ "v",
274
+ PLUGIN_VERSION,
275
+ /* @__PURE__ */ jsx(
276
+ Link,
277
+ {
278
+ href: `https://github.com/mattisvensson/strapi-plugin-webatlas/releases/tag/v${PLUGIN_VERSION}`,
279
+ target: "_blank",
280
+ rel: "noopener noreferrer",
281
+ style: { marginLeft: 4 },
282
+ children: /* @__PURE__ */ jsx(ExternalLink, {})
283
+ }
284
+ )
285
+ ] })
245
286
  ] }) })
246
287
  ]
247
288
  }
@@ -250,4 +291,4 @@ const Settings = () => {
250
291
  export {
251
292
  Settings as default
252
293
  };
253
- //# sourceMappingURL=index-DJBXRNlE.mjs.map
294
+ //# sourceMappingURL=index-QFbHwlyj.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-QFbHwlyj.mjs","sources":["../../admin/src/pages/Settings/General/ContentTypeAccordion.tsx","../../admin/src/pages/Settings/General/index.tsx"],"sourcesContent":["import { SingleSelect, SingleSelectOption } from '@strapi/design-system';\nimport Tooltip from '../../../components/Tooltip'\nimport { Box, Accordion, Field } from '@strapi/design-system';\nimport { getTranslation } from '../../../utils';\nimport { useIntl } from 'react-intl';\nimport type { ContentType, ConfigContentType } from '../../../../../types';\n\nexport default function ContentTypeAccordion({ \n contentType,\n contentTypeSettings,\n dispatch\n}: { \n contentType: ContentType | undefined, \n contentTypeSettings: ConfigContentType, \n dispatch: React.Dispatch<any>\n}) {\n \n const { formatMessage } = useIntl();\n\n if (!contentType) return null\n\n return (\n <Box\n borderColor={!contentTypeSettings.default && 'danger500'}\n key={contentType.uid}\n >\n <Accordion.Item key={contentType.uid} value={contentType.uid} size=\"S\">\n <Accordion.Header>\n <Accordion.Trigger>\n {contentType?.info.displayName}\n </Accordion.Trigger>\n </Accordion.Header>\n <Accordion.Content>\n <Box padding={3}>\n <Field.Root\n name=\"selectedContentTypes\"\n hint={formatMessage({\n id: getTranslation('settings.page.defaultField.hint'),\n defaultMessage: 'The selected field from the content type will be used to generate the URL alias. Use a field that is unique and descriptive, such as a \"title\" or \"name\".',\n })}\n error={!contentTypeSettings.default && formatMessage({\n id: getTranslation('settings.page.defaultField.error'),\n defaultMessage: 'Please select a default field',\n })}\n required\n >\n <Field.Label>\n {formatMessage({\n id: getTranslation('settings.page.defaultField'),\n defaultMessage: 'Default URL Alias field',\n })}\n </Field.Label>\n <SingleSelect\n name={`defaultField-${contentType.uid}`}\n onClear={() => dispatch({ type: 'SET_DEFAULT_FIELD', payload: { ctUid: contentType.uid, field: '' } })}\n value={contentTypeSettings?.default || ''}\n onChange={(value: string) => dispatch({ type: 'SET_DEFAULT_FIELD', payload: { ctUid: contentType.uid, field: value } })}\n >\n {Object.entries(contentType.attributes).map(([key], index) => {\n if (\n key === 'id' || \n key === 'documentId' ||\n key === 'createdAt' || \n key === 'updatedAt' || \n key === 'createdBy' || \n key === 'updatedBy' ||\n key === 'webatlas_path' ||\n key === 'webatlas_override'\n ) return null\n return <SingleSelectOption key={index} value={key}>{key}</SingleSelectOption>\n })}\n </SingleSelect>\n <Field.Hint/>\n </Field.Root>\n <Box paddingTop={4}>\n <Field.Root\n name=\"urlAliasPattern\"\n hint={formatMessage({\n id: getTranslation('settings.page.urlAliasPattern.hint'),\n defaultMessage: 'The pattern to prepend to the generated URL alias. For example, if you enter \"blog\" and the value of default field is \"My First Post\", the generated URL alias will be \"blog/my-first-post\". Leave empty for no prefix.',\n })}\n >\n <Field.Label>\n {formatMessage({\n id: getTranslation('settings.page.urlAliasPattern'),\n defaultMessage: 'URL Alias Pattern',\n })}\n <Tooltip description={formatMessage({\n id: getTranslation('settings.page.urlAliasPattern.tooltip'),\n defaultMessage: 'Leading and trailing slashes will be removed. Spaces will be replaced with hyphens. Special characters will be encoded.',\n })} />\n </Field.Label>\n <Field.Input\n value={contentTypeSettings.pattern}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => dispatch({ type: 'SET_PATTERN', payload: { ctUid: contentType.uid, pattern: e.target.value } })}\n disabled={!contentTypeSettings.default}\n type=\"text\"\n placeholder={formatMessage({\n id: getTranslation('settings.page.urlAliasPattern.placeholder'),\n defaultMessage: 'e.g. blog',\n })}\n />\n <Field.Hint />\n </Field.Root>\n </Box>\n </Box>\n </Accordion.Content>\n </Accordion.Item>\n </Box>\n \n )\n}","/*\n *\n * Settings\n * This file contains the general settings page for the Webatlas plugin.\n * It allows users to configure which content types are enabled for URL aliases and navigations,\n * as well as setting default fields and the URL alias patterns for each content type. \n *\n*/\n\nimport { useEffect, useState, useReducer, useRef } from 'react';\nimport { Box, Accordion, Field } from '@strapi/design-system';\nimport { useNotification } from '@strapi/strapi/admin'\nimport { MultiSelect, MultiSelectOption } from '@strapi/design-system';\nimport usePluginConfig from '../../../hooks/usePluginConfig';\nimport type { ContentType, ConfigContentType, PluginConfig } from '../../../../../types';\nimport transformToUrl from '../../../../../utils/transformToUrl';\nimport useAllContentTypes from '../../../hooks/useAllContentTypes';\nimport { getTranslation } from '../../../utils';\nimport { useIntl } from 'react-intl';\nimport { FullLoader } from '../../../components/UI';\nimport { PageWrapper, ContentBox, SettingTitle } from '..';\nimport ContentTypeAccordion from './ContentTypeAccordion';\nimport { PLUGIN_VERSION, PLUGIN_NAME } from '../../../../../pluginId';\nimport { Typography } from '@strapi/design-system';\nimport { Link } from '@strapi/design-system';\nimport { ExternalLink } from '@strapi/icons';\n\ntype Action =\n | { type: 'SET_SELECTED_CONTENT_TYPES'; payload: ConfigContentType[] }\n | { type: 'SET_DEFAULT_FIELD'; payload: { ctUid: string; field: string } }\n | { type: 'SET_PATTERN'; payload: { ctUid: string; pattern: string } }\n | { type: 'SET_CONFIG'; payload: PluginConfig }\n\nfunction reducer(newConfig: PluginConfig | null, action: Action): PluginConfig | null {\n let updatedContentTypes\n\n switch (action.type) {\n case 'SET_SELECTED_CONTENT_TYPES':\n if (!newConfig) return null;\n updatedContentTypes = action.payload.map(ct => {\n return newConfig?.selectedContentTypes.find((cta: ConfigContentType) => cta.uid === ct.uid) || ct\n })\n return { ...newConfig, selectedContentTypes: updatedContentTypes || [] };\n case 'SET_DEFAULT_FIELD':\n if (!newConfig) return null;\n updatedContentTypes = newConfig?.selectedContentTypes.map(ct =>\n ct.uid === action.payload.ctUid ? { ...ct, default: action.payload.field } : ct\n );\n return { ...newConfig, selectedContentTypes: updatedContentTypes || [] };\n case 'SET_PATTERN':\n if (!newConfig) return null;\n updatedContentTypes = newConfig?.selectedContentTypes.map(ct =>\n ct.uid === action.payload.ctUid ? { ...ct, pattern: transformToUrl(action.payload.pattern) } : ct\n );\n return { ...newConfig, selectedContentTypes: updatedContentTypes || [] };\n case 'SET_CONFIG':\n return action.payload;\n default:\n throw new Error();\n }\n}\n\nconst Settings = () => {\n const { config: fetchedConfig, setConfig, loading, fetchError } = usePluginConfig();\n const [config, dispatch] = useReducer(reducer, fetchedConfig);\n const { contentTypes: allContentTypesData } = useAllContentTypes();\n const allContentTypes = allContentTypesData?.filter((ct: ContentType) => ct.pluginOptions?.webatlas?.active === true);\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const [isSaving, setIsSaving] = useState(false);\n const initialConfig = useRef<PluginConfig | null>(fetchedConfig);\n\n useEffect(() => {\n initialConfig.current = fetchedConfig;\n\n if (fetchedConfig)\n dispatch({ type: 'SET_CONFIG', payload: fetchedConfig });\n }, [fetchedConfig]);\n \n useEffect(() => {\n if (fetchError) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslation('notification.error'),\n defaultMessage: 'An error occurred',\n }) + ': ' + fetchError,\n });\n }\n }, [fetchError, toggleNotification, formatMessage]);\n\n async function save() {\n if (\n !config \n || config.selectedContentTypes.find((cta: ConfigContentType) => !cta.default) !== undefined\n ) return\n\n setIsSaving(true);\n try {\n await setConfig({selectedContentTypes: config.selectedContentTypes })\n initialConfig.current = config;\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTranslation('notification.settings.saved'),\n defaultMessage: 'Settings saved successfully',\n }),\n });\n setIsSaving(false);\n } catch (err) {\n setIsSaving(false);\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslation('notification.error'),\n defaultMessage: 'An error occurred',\n }) + ': ' + err,\n });\n console.error(err);\n }\n }\n\n if (loading) {\n return <PageWrapper\n isSaving={isSaving}\n subtitle={formatMessage({\n id: getTranslation('loading'),\n defaultMessage: 'Loading...',\n })}\n disabledCondition={true}\n >\n <FullLoader height={200} />\n </PageWrapper>\n }\n\n return (\n <PageWrapper\n save={save}\n isSaving={isSaving}\n subtitle={formatMessage({\n id: getTranslation('settings.page.general.subtitle'),\n defaultMessage: 'Configure general settings',\n })}\n disabledCondition={JSON.stringify(config) === JSON.stringify(initialConfig.current)}\n >\n <ContentBox title={formatMessage({\n id: getTranslation('settings.page.general.contentTypes'),\n defaultMessage: 'Content Types',\n })}>\n <Field.Root\n name=\"selectedContentTypes\"\n hint={formatMessage({\n id: getTranslation('settings.page.enabledContentTypes.hint'),\n defaultMessage: 'Select the content types for which you want to enable URL aliases',\n })}\n >\n <Field.Label>\n <SettingTitle>\n {formatMessage({\n id: getTranslation('settings.page.enabledContentTypes'),\n defaultMessage: 'Enabled Content Types',\n })}\n </SettingTitle>\n </Field.Label>\n <MultiSelect\n placeholder={formatMessage({\n id: getTranslation('settings.page.enabledContentTypes.placeholder'),\n defaultMessage: 'Select content types...',\n })}\n onClear={() => dispatch({ type: 'SET_SELECTED_CONTENT_TYPES', payload: [] })}\n value={[...config?.selectedContentTypes.map((ct: ConfigContentType) => ct.uid) || []]}\n onChange={(value: string[]) =>\n dispatch({\n type: 'SET_SELECTED_CONTENT_TYPES',\n payload: value.map(v => ({\n uid: v,\n default: '',\n pattern: '',\n })),\n })\n }\n withTags\n >\n {allContentTypes && allContentTypes.map(item => \n <MultiSelectOption key={item.uid} value={item.uid}>{item.info.displayName}</MultiSelectOption>\n )}\n </MultiSelect>\n <Field.Hint/>\n </Field.Root>\n {config?.selectedContentTypes && config.selectedContentTypes.length > 0 && \n <Box paddingTop={4}>\n <Field.Root name=\"selectedContentTypesAccordion\">\n <Field.Label>\n <SettingTitle>\n {formatMessage({\n id: getTranslation('settings.page.contentTypeSettings'),\n defaultMessage: 'Content Type settings',\n })}\n </SettingTitle> \n </Field.Label>\n <Accordion.Root>\n {config.selectedContentTypes?.map((contentTypeSettings: ConfigContentType) => {\n const ct: ContentType | undefined = allContentTypes?.find((item) => item.uid === contentTypeSettings.uid)\n return <ContentTypeAccordion key={contentTypeSettings.uid} contentType={ct} contentTypeSettings={contentTypeSettings} dispatch={dispatch} />\n })}\n </Accordion.Root>\n </Field.Root>\n </Box>\n }\n </ContentBox>\n <ContentBox title={formatMessage({\n id: getTranslation('settings.page.general.details'),\n defaultMessage: 'Details',\n })}>\n <Field.Root name=\"selectedContentTypesAccordion\">\n <Field.Label>\n <SettingTitle>\n { PLUGIN_NAME }{' '}\n {formatMessage({\n id: getTranslation('version'),\n defaultMessage: 'Version',\n })}\n </SettingTitle>\n </Field.Label>\n <Typography>\n v{PLUGIN_VERSION}\n <Link\n href={`https://github.com/mattisvensson/strapi-plugin-webatlas/releases/tag/v${PLUGIN_VERSION}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ marginLeft: 4 }}>\n <ExternalLink />\n </Link>\n </Typography>\n </Field.Root>\n </ContentBox>\n </PageWrapper>\n );\n};\n\nexport default Settings;\n"],"names":[],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { useReducer, useState, useRef, useEffect } from "react";
3
- import { Box, Accordion, Field, SingleSelect, SingleSelectOption, MultiSelect, MultiSelectOption } from "@strapi/design-system";
3
+ import { Box, Accordion, Field, SingleSelect, SingleSelectOption, MultiSelect, MultiSelectOption, Typography, Link } from "@strapi/design-system";
4
4
  import { useNotification } from "@strapi/strapi/admin";
5
- import { g as getTranslation, T as Tooltip, b as usePluginConfig, c as useAllContentTypes, t as transformToUrl } from "./index-CTA8agp7.mjs";
5
+ import { g as getTranslation, T as Tooltip, b as usePluginConfig, c as useAllContentTypes, P as PLUGIN_NAME, e as PLUGIN_VERSION, t as transformToUrl } from "./index-D2Meknib.mjs";
6
6
  import { useIntl } from "react-intl";
7
7
  import "@strapi/icons/symbols";
8
8
  import { F as FullLoader } from "./FullLoader-CrPED_dY.mjs";
9
- import { P as PageWrapper } from "./PageWrapper-BvOY7VCN.mjs";
9
+ import { P as PageWrapper, C as ContentBox, S as SettingTitle } from "./SettingTitle-IwvX4Kb5.mjs";
10
+ import { ExternalLink } from "@strapi/icons";
10
11
  function ContentTypeAccordion({
11
12
  contentType,
12
13
  contentTypeSettings,
@@ -181,6 +182,10 @@ const Settings = () => {
181
182
  PageWrapper,
182
183
  {
183
184
  isSaving,
185
+ subtitle: formatMessage({
186
+ id: getTranslation("loading"),
187
+ defaultMessage: "Loading..."
188
+ }),
184
189
  disabledCondition: true,
185
190
  children: /* @__PURE__ */ jsx(FullLoader, { height: 200 })
186
191
  }
@@ -191,57 +196,93 @@ const Settings = () => {
191
196
  {
192
197
  save,
193
198
  isSaving,
199
+ subtitle: formatMessage({
200
+ id: getTranslation("settings.page.general.subtitle"),
201
+ defaultMessage: "Configure general settings"
202
+ }),
194
203
  disabledCondition: JSON.stringify(config) === JSON.stringify(initialConfig.current),
195
204
  children: [
196
- /* @__PURE__ */ jsxs(
197
- Field.Root,
198
- {
199
- name: "selectedContentTypes",
200
- hint: formatMessage({
201
- id: getTranslation("settings.page.enabledContentTypes.hint"),
202
- defaultMessage: "Select the content types for which you want to enable URL aliases"
203
- }),
204
- children: [
205
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
206
- id: getTranslation("settings.page.enabledContentTypes"),
207
- defaultMessage: "Enabled Content Types"
208
- }) }),
209
- /* @__PURE__ */ jsx(
210
- MultiSelect,
211
- {
212
- placeholder: formatMessage({
213
- id: getTranslation("settings.page.enabledContentTypes.placeholder"),
214
- defaultMessage: "Select content types..."
215
- }),
216
- onClear: () => dispatch({ type: "SET_SELECTED_CONTENT_TYPES", payload: [] }),
217
- value: [...config?.selectedContentTypes.map((ct) => ct.uid) || []],
218
- onChange: (value) => dispatch({
219
- type: "SET_SELECTED_CONTENT_TYPES",
220
- payload: value.map((v) => ({
221
- uid: v,
222
- default: "",
223
- pattern: ""
224
- }))
225
- }),
226
- withTags: true,
227
- children: allContentTypes && allContentTypes.map(
228
- (item) => /* @__PURE__ */ jsx(MultiSelectOption, { value: item.uid, children: item.info.displayName }, item.uid)
229
- )
230
- }
231
- ),
232
- /* @__PURE__ */ jsx(Field.Hint, {})
233
- ]
234
- }
235
- ),
236
- config?.selectedContentTypes && config.selectedContentTypes.length > 0 && /* @__PURE__ */ jsx(Box, { paddingTop: 4, children: /* @__PURE__ */ jsxs(Field.Root, { name: "selectedContentTypesAccordion", children: [
237
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
238
- id: getTranslation("settings.page.contentTypeSettings"),
239
- defaultMessage: "Content Type settings"
240
- }) }),
241
- /* @__PURE__ */ jsx(Accordion.Root, { children: config.selectedContentTypes?.map((contentTypeSettings) => {
242
- const ct = allContentTypes?.find((item) => item.uid === contentTypeSettings.uid);
243
- return /* @__PURE__ */ jsx(ContentTypeAccordion, { contentType: ct, contentTypeSettings, dispatch }, contentTypeSettings.uid);
244
- }) })
205
+ /* @__PURE__ */ jsxs(ContentBox, { title: formatMessage({
206
+ id: getTranslation("settings.page.general.contentTypes"),
207
+ defaultMessage: "Content Types"
208
+ }), children: [
209
+ /* @__PURE__ */ jsxs(
210
+ Field.Root,
211
+ {
212
+ name: "selectedContentTypes",
213
+ hint: formatMessage({
214
+ id: getTranslation("settings.page.enabledContentTypes.hint"),
215
+ defaultMessage: "Select the content types for which you want to enable URL aliases"
216
+ }),
217
+ children: [
218
+ /* @__PURE__ */ jsx(Field.Label, { children: /* @__PURE__ */ jsx(SettingTitle, { children: formatMessage({
219
+ id: getTranslation("settings.page.enabledContentTypes"),
220
+ defaultMessage: "Enabled Content Types"
221
+ }) }) }),
222
+ /* @__PURE__ */ jsx(
223
+ MultiSelect,
224
+ {
225
+ placeholder: formatMessage({
226
+ id: getTranslation("settings.page.enabledContentTypes.placeholder"),
227
+ defaultMessage: "Select content types..."
228
+ }),
229
+ onClear: () => dispatch({ type: "SET_SELECTED_CONTENT_TYPES", payload: [] }),
230
+ value: [...config?.selectedContentTypes.map((ct) => ct.uid) || []],
231
+ onChange: (value) => dispatch({
232
+ type: "SET_SELECTED_CONTENT_TYPES",
233
+ payload: value.map((v) => ({
234
+ uid: v,
235
+ default: "",
236
+ pattern: ""
237
+ }))
238
+ }),
239
+ withTags: true,
240
+ children: allContentTypes && allContentTypes.map(
241
+ (item) => /* @__PURE__ */ jsx(MultiSelectOption, { value: item.uid, children: item.info.displayName }, item.uid)
242
+ )
243
+ }
244
+ ),
245
+ /* @__PURE__ */ jsx(Field.Hint, {})
246
+ ]
247
+ }
248
+ ),
249
+ config?.selectedContentTypes && config.selectedContentTypes.length > 0 && /* @__PURE__ */ jsx(Box, { paddingTop: 4, children: /* @__PURE__ */ jsxs(Field.Root, { name: "selectedContentTypesAccordion", children: [
250
+ /* @__PURE__ */ jsx(Field.Label, { children: /* @__PURE__ */ jsx(SettingTitle, { children: formatMessage({
251
+ id: getTranslation("settings.page.contentTypeSettings"),
252
+ defaultMessage: "Content Type settings"
253
+ }) }) }),
254
+ /* @__PURE__ */ jsx(Accordion.Root, { children: config.selectedContentTypes?.map((contentTypeSettings) => {
255
+ const ct = allContentTypes?.find((item) => item.uid === contentTypeSettings.uid);
256
+ return /* @__PURE__ */ jsx(ContentTypeAccordion, { contentType: ct, contentTypeSettings, dispatch }, contentTypeSettings.uid);
257
+ }) })
258
+ ] }) })
259
+ ] }),
260
+ /* @__PURE__ */ jsx(ContentBox, { title: formatMessage({
261
+ id: getTranslation("settings.page.general.details"),
262
+ defaultMessage: "Details"
263
+ }), children: /* @__PURE__ */ jsxs(Field.Root, { name: "selectedContentTypesAccordion", children: [
264
+ /* @__PURE__ */ jsx(Field.Label, { children: /* @__PURE__ */ jsxs(SettingTitle, { children: [
265
+ PLUGIN_NAME,
266
+ " ",
267
+ formatMessage({
268
+ id: getTranslation("version"),
269
+ defaultMessage: "Version"
270
+ })
271
+ ] }) }),
272
+ /* @__PURE__ */ jsxs(Typography, { children: [
273
+ "v",
274
+ PLUGIN_VERSION,
275
+ /* @__PURE__ */ jsx(
276
+ Link,
277
+ {
278
+ href: `https://github.com/mattisvensson/strapi-plugin-webatlas/releases/tag/v${PLUGIN_VERSION}`,
279
+ target: "_blank",
280
+ rel: "noopener noreferrer",
281
+ style: { marginLeft: 4 },
282
+ children: /* @__PURE__ */ jsx(ExternalLink, {})
283
+ }
284
+ )
285
+ ] })
245
286
  ] }) })
246
287
  ]
247
288
  }
@@ -5,7 +5,7 @@ import { Box, Typography, Dialog, Button, Modal, Flex, SingleSelect, SingleSelec
5
5
  import { useState, useEffect, createContext, useRef, useContext, useReducer, useCallback, useMemo, forwardRef } from "react";
6
6
  import { createPortal } from "react-dom";
7
7
  import { useIntl } from "react-intl";
8
- import { u as useApi, g as getTranslation, d as debounce, a as duplicateCheck, t as transformToUrl, U as URLInfo, b as usePluginConfig } from "./index-CTA8agp7.mjs";
8
+ import { u as useApi, g as getTranslation, d as debounce, a as duplicateCheck, t as transformToUrl, U as URLInfo, b as usePluginConfig } from "./index-D2Meknib.mjs";
9
9
  import { useFetchClient, useNotification, Page, Layouts } from "@strapi/strapi/admin";
10
10
  import { C as Center, F as FullLoader } from "./FullLoader-CrPED_dY.mjs";
11
11
  import { EmptyDocuments } from "@strapi/icons/symbols";
@@ -10601,7 +10601,7 @@ function getProjection(items, activeId, overId, dragOffset, maxDepthValue) {
10601
10601
  }
10602
10602
  function getMaxDepth({ previousItem, maxDepthValue }) {
10603
10603
  if (previousItem && typeof previousItem.depth === "number") {
10604
- return Math.min(previousItem.depth + 1, maxDepthValue - 1);
10604
+ return Math.min(previousItem.depth + 1, maxDepthValue);
10605
10605
  }
10606
10606
  return 0;
10607
10607
  }
@@ -10620,7 +10620,18 @@ function RouteIcon({ type, color = "neutral800" }) {
10620
10620
  return /* @__PURE__ */ jsx(Box, { width: "16px", height: "16px" });
10621
10621
  }
10622
10622
  }
10623
- const RouteItem = forwardRef(({ item, setParentId, setActionItem, setNavigationItems, ghost, depth, style, wrapperRef, handleProps }, ref) => {
10623
+ const RouteItem = forwardRef(({
10624
+ item,
10625
+ setParentId,
10626
+ setActionItem,
10627
+ setNavigationItems,
10628
+ ghost,
10629
+ depth,
10630
+ maxDepth,
10631
+ style,
10632
+ wrapperRef,
10633
+ handleProps
10634
+ }, ref) => {
10624
10635
  if (!item || !item.route) return null;
10625
10636
  const { setModalType } = useContext(ModalContext);
10626
10637
  const { formatMessage } = useIntl();
@@ -10745,7 +10756,7 @@ const RouteItem = forwardRef(({ item, setParentId, setActionItem, setNavigationI
10745
10756
  id: getTranslation("edit"),
10746
10757
  defaultMessage: "Edit"
10747
10758
  }) }),
10748
- /* @__PURE__ */ jsx(MenuItem, { onClick: () => handleAddChildren(), children: formatMessage({
10759
+ depth !== void 0 && depth < maxDepth && /* @__PURE__ */ jsx(MenuItem, { onClick: () => handleAddChildren(), children: formatMessage({
10749
10760
  id: getTranslation("navigation.page.navItem.addChildren"),
10750
10761
  defaultMessage: "Add children"
10751
10762
  }) }),
@@ -12043,6 +12054,7 @@ const Navigation = () => {
12043
12054
  onClick: () => saveNavigation(),
12044
12055
  loading: isSavingNavigation,
12045
12056
  variant: "primary",
12057
+ startIcon: /* @__PURE__ */ jsx(Check, {}),
12046
12058
  disabled: JSON.stringify(navigationItems) === JSON.stringify(initialNavigationItemsRef.current),
12047
12059
  children: formatMessage({
12048
12060
  id: getTranslation("save"),
@@ -12062,7 +12074,7 @@ const Navigation = () => {
12062
12074
  onDragCancel: () => handleDragCancel(),
12063
12075
  measuring,
12064
12076
  children: /* @__PURE__ */ jsxs(SortableContext, { items: navigationItems, strategy: verticalListSortingStrategy, children: [
12065
- navigationItems.map((item, index) => /* @__PURE__ */ jsx(
12077
+ navigationItems.map((item, index) => config?.navigation.maxDepth && /* @__PURE__ */ jsx(
12066
12078
  SortableRouteItem,
12067
12079
  {
12068
12080
  item,
@@ -12070,18 +12082,20 @@ const Navigation = () => {
12070
12082
  setActionItem,
12071
12083
  setNavigationItems,
12072
12084
  indentationWidth,
12073
- depth: item.id === activeId && projected ? projected.depth : item.depth
12085
+ depth: item.id === activeId && projected ? projected.depth : item.depth,
12086
+ maxDepth: config.navigation.maxDepth
12074
12087
  },
12075
12088
  item.documentId || index
12076
12089
  )),
12077
12090
  createPortal(
12078
- /* @__PURE__ */ jsx(DragOverlay, { children: activeId && activeItem ? /* @__PURE__ */ jsx(
12091
+ /* @__PURE__ */ jsx(DragOverlay, { children: activeId && activeItem ? config?.navigation.maxDepth && /* @__PURE__ */ jsx(
12079
12092
  SortableRouteItem,
12080
12093
  {
12081
12094
  item: activeItem,
12082
12095
  setParentId,
12083
12096
  setActionItem,
12084
- setNavigationItems
12097
+ setNavigationItems,
12098
+ maxDepth: config.navigation.maxDepth
12085
12099
  }
12086
12100
  ) : null }),
12087
12101
  document.body
@@ -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-CTA8agp7.mjs";
5
+ import { g as getTranslation, u as useApi, d as debounce } from "./index-D2Meknib.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";
@@ -166,6 +166,7 @@ const pluginPkg = {
166
166
  };
167
167
  const PLUGIN_ID = pluginPkg.strapi.name.replace(/^(@[^-,.][\w,-]+\/|strapi-)plugin-/i, "") || "webatlas";
168
168
  const PLUGIN_NAME = pluginPkg.strapi.displayName;
169
+ const PLUGIN_VERSION = pluginPkg.version;
169
170
  const Initializer = ({ setPlugin }) => {
170
171
  const ref = React.useRef(setPlugin);
171
172
  React.useEffect(() => {
@@ -3849,7 +3850,7 @@ const Alias = ({ config }) => {
3849
3850
  }
3850
3851
  }
3851
3852
  if (!initialLoadComplete) return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral600", children: formatMessage({
3852
- id: getTranslation("components.CMEditViewAside.loading"),
3853
+ id: getTranslation("loading"),
3853
3854
  defaultMessage: "Loading..."
3854
3855
  }) });
3855
3856
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -4031,7 +4032,7 @@ const CMEditViewAside = () => {
4031
4032
  });
4032
4033
  }, []);
4033
4034
  if (isLoading || !config) return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral600", children: formatMessage({
4034
- id: getTranslation("components.CMEditViewAside.loading"),
4035
+ id: getTranslation("loading"),
4035
4036
  defaultMessage: "Loading..."
4036
4037
  }) });
4037
4038
  if (!isAllowedContentType) return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { textColor: "neutral600", children: [
@@ -4081,7 +4082,7 @@ const index = {
4081
4082
  defaultMessage: "Routes"
4082
4083
  },
4083
4084
  Component: async () => {
4084
- const component = await Promise.resolve().then(() => require("./index--oj1eNcM.js"));
4085
+ const component = await Promise.resolve().then(() => require("./index-B1dEY-gs.js"));
4085
4086
  return { default: component.default };
4086
4087
  },
4087
4088
  permissions: [
@@ -4100,7 +4101,7 @@ const index = {
4100
4101
  defaultMessage: "Navigation"
4101
4102
  },
4102
4103
  Component: async () => {
4103
- const component = await Promise.resolve().then(() => require("./index-YzPuPn68.js"));
4104
+ const component = await Promise.resolve().then(() => require("./index-BFuwbmZy.js"));
4104
4105
  return { default: component.default };
4105
4106
  },
4106
4107
  permissions: [
@@ -4129,7 +4130,7 @@ const index = {
4129
4130
  Component: async () => {
4130
4131
  return await Promise.resolve().then(() => require(
4131
4132
  /* webpackChunkName: "webatlas-settings-general-page" */
4132
- "./index-CtFERXkl.js"
4133
+ "./index-B1mbYb2_.js"
4133
4134
  ));
4134
4135
  },
4135
4136
  permissions: [
@@ -4153,7 +4154,7 @@ const index = {
4153
4154
  Component: async () => {
4154
4155
  return await Promise.resolve().then(() => require(
4155
4156
  /* webpackChunkName: "webatlas-settings-navigation-page" */
4156
- "./index-BCPgfhBx.js"
4157
+ "./index-2lVgPz4a.js"
4157
4158
  ));
4158
4159
  },
4159
4160
  permissions: [
@@ -4182,7 +4183,7 @@ const index = {
4182
4183
  return Promise.all(
4183
4184
  locales.map(async (locale) => {
4184
4185
  try {
4185
- const { default: data } = await __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => Promise.resolve().then(() => require("./de-CDBoUBzw.js")), "./translations/en.json": () => Promise.resolve().then(() => require("./en-DfvURaup.js")) }), `./translations/${locale}.json`, 3);
4186
+ const { default: data } = await __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => Promise.resolve().then(() => require("./de-DlQxM8Tg.js")), "./translations/en.json": () => Promise.resolve().then(() => require("./en-DrhxIwOr.js")) }), `./translations/${locale}.json`, 3);
4186
4187
  return { data, locale };
4187
4188
  } catch {
4188
4189
  return { data: {}, locale };
@@ -4192,6 +4193,7 @@ const index = {
4192
4193
  }
4193
4194
  };
4194
4195
  exports.PLUGIN_NAME = PLUGIN_NAME;
4196
+ exports.PLUGIN_VERSION = PLUGIN_VERSION;
4195
4197
  exports.Tooltip = Tooltip;
4196
4198
  exports.URLInfo = URLInfo;
4197
4199
  exports.debounce = debounce;
@@ -4202,4 +4204,3 @@ exports.transformToUrl = transformToUrl;
4202
4204
  exports.useAllContentTypes = useAllContentTypes;
4203
4205
  exports.useApi = useApi;
4204
4206
  exports.usePluginConfig = usePluginConfig;
4205
- //# sourceMappingURL=index-CbW6k4FH.js.map
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- const index = require("../_chunks/index-CbW6k4FH.js");
2
+ const index = require("../_chunks/index-DOMrViWi.js");
3
3
  require("react/jsx-runtime");
4
4
  module.exports = index.index;
5
5
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- import { i } from "../_chunks/index-DMpiX4hP.mjs";
1
+ import { i } from "../_chunks/index-Dt-mlR1F.mjs";
2
2
  import "react/jsx-runtime";
3
3
  export {
4
4
  i as default
@@ -7,6 +7,7 @@ export interface RouteItemProps {
7
7
  setNavigationItems: React.Dispatch<React.SetStateAction<NestedNavItem[] | undefined>>;
8
8
  ghost?: boolean;
9
9
  depth?: number;
10
+ maxDepth: number;
10
11
  style?: React.CSSProperties;
11
12
  wrapperRef?(node: HTMLLIElement): void;
12
13
  handleProps?: any;
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ export default function ContentBox({ title, children }: {
3
+ title: string;
4
+ children: React.ReactNode;
5
+ }): import("react/jsx-runtime").JSX.Element;
@@ -1,7 +1,8 @@
1
1
  /// <reference types="react" />
2
- export default function PageWrapper({ save, isSaving, disabledCondition, children }: {
2
+ export default function PageWrapper({ save, isSaving, disabledCondition, subtitle, children }: {
3
3
  save?: () => void;
4
4
  isSaving: boolean;
5
5
  disabledCondition: boolean;
6
+ subtitle: string;
6
7
  children: React.ReactNode;
7
8
  }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ export default function SettingTitle({ children }: {
3
+ children: React.ReactNode;
4
+ }): import("react/jsx-runtime").JSX.Element;