@mattisvensson/strapi-plugin-webatlas 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/_chunks/{de-D8LMOTFI.js → de-CL1TIZPg.js} +2 -1
  2. package/dist/_chunks/{en-BdfmJUs8.js.map → de-CL1TIZPg.js.map} +1 -1
  3. package/dist/_chunks/{de-BkirTac9.mjs → de-CzVD4dbZ.mjs} +2 -1
  4. package/dist/_chunks/{de-BkirTac9.mjs.map → de-CzVD4dbZ.mjs.map} +1 -1
  5. package/dist/_chunks/{en-BdfmJUs8.js → en-Du-Ap60j.js} +2 -1
  6. package/dist/_chunks/{de-D8LMOTFI.js.map → en-Du-Ap60j.js.map} +1 -1
  7. package/dist/_chunks/{en-DYbDta3m.mjs → en-Nk6QcTdr.mjs} +2 -1
  8. package/dist/_chunks/{en-DYbDta3m.mjs.map → en-Nk6QcTdr.mjs.map} +1 -1
  9. package/dist/_chunks/{index-Ctq2vsD5.mjs → index-B5u3q4DO.mjs} +5 -5
  10. package/dist/_chunks/{index-Ciae_OgQ.js → index-Bxhu-TNT.js} +6 -6
  11. package/dist/_chunks/{index-Ciae_OgQ.js.map → index-Bxhu-TNT.js.map} +1 -1
  12. package/dist/_chunks/{index-CJtLrSxU.js → index-C1HfYOU_.js} +5 -5
  13. package/dist/_chunks/{index-CNfpGKSw.mjs → index-CDqKPoLF.mjs} +74 -36
  14. package/dist/_chunks/{index-C5ejmUpN.mjs.map → index-CDqKPoLF.mjs.map} +1 -1
  15. package/dist/_chunks/{index-BOvKFOKk.js → index-CcwGhk4b.js} +73 -36
  16. package/dist/_chunks/{index-BAN8PGGJ.js → index-Cw8m9qME.js} +2 -2
  17. package/dist/_chunks/{index-BAN8PGGJ.js.map → index-Cw8m9qME.js.map} +1 -1
  18. package/dist/_chunks/{index-DtFIVZxq.mjs → index-DKWn1eh9.mjs} +2 -2
  19. package/dist/_chunks/{index-DtFIVZxq.mjs.map → index-DKWn1eh9.mjs.map} +1 -1
  20. package/dist/_chunks/{index-LAGFB7iO.mjs → index-DLfJwkbe.mjs} +1 -1
  21. package/dist/_chunks/{index-CEt9P4TS.mjs → index-DShP5BtK.mjs} +2 -2
  22. package/dist/_chunks/{index-CEt9P4TS.mjs.map → index-DShP5BtK.mjs.map} +1 -1
  23. package/dist/_chunks/{index-BxnHHgGC.js → index-DWcVnOi0.js} +74 -37
  24. package/dist/_chunks/{index-BxnHHgGC.js.map → index-DWcVnOi0.js.map} +1 -1
  25. package/dist/_chunks/{index-DTz7wDR7.mjs → index-Dl3NwmwH.mjs} +1 -1
  26. package/dist/_chunks/{index-CuJP8Fy7.mjs → index-DohcUdej.mjs} +6 -6
  27. package/dist/_chunks/{index-CuJP8Fy7.mjs.map → index-DohcUdej.mjs.map} +1 -1
  28. package/dist/_chunks/{index-D4tWVnt1.js → index-Dryo1JuH.js} +2 -2
  29. package/dist/_chunks/{index-D4tWVnt1.js.map → index-Dryo1JuH.js.map} +1 -1
  30. package/dist/_chunks/{index-BfgRvDzx.js → index-Dy2LLMda.js} +1 -1
  31. package/dist/_chunks/{index-C5ejmUpN.mjs → index-Upva9LaE.mjs} +73 -37
  32. package/dist/_chunks/{index-CJNR2c7_.js → index-xhAxCOze.js} +1 -1
  33. package/dist/admin/index.js +1 -1
  34. package/dist/admin/index.mjs +1 -1
  35. package/dist/admin/src/pages/Navigation/RouteItem.d.ts +1 -0
  36. package/dist/admin/src/pages/Navigation/SortableRouteItem.d.ts +1 -1
  37. package/dist/server/index.js +1 -1
  38. package/dist/server/index.mjs +1 -1
  39. package/package.json +1 -1
@@ -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-CJtLrSxU.js");
10
+ const index = require("./index-C1HfYOU_.js");
11
11
  const admin = require("@strapi/strapi/admin");
12
12
  const FullLoader = require("./FullLoader-Cmsf8xS6.js");
13
13
  const EmptyBox = require("./EmptyBox-T8t29l25.js");
@@ -10570,11 +10570,10 @@ function getProjection(items, activeId, overId, dragOffset) {
10570
10570
  const activeItem = items[activeItemIndex];
10571
10571
  const newItems = sortable.arrayMove(items, activeItemIndex, overItemIndex);
10572
10572
  const previousItem = newItems[overItemIndex - 1];
10573
- const nextItem = newItems[overItemIndex + 1];
10574
10573
  const dragDepth = getDragDepth(dragOffset, indentationWidth);
10575
10574
  const projectedDepth = activeItem && typeof activeItem.depth === "number" ? activeItem.depth + dragDepth : 0;
10576
- const maxDepth = getMaxDepth({ previousItem });
10577
- const minDepth = getMinDepth({ nextItem });
10575
+ let maxDepth = getMaxDepth({ previousItem });
10576
+ let minDepth = 0;
10578
10577
  let depth = projectedDepth;
10579
10578
  if (projectedDepth >= maxDepth) {
10580
10579
  depth = maxDepth;
@@ -10589,12 +10588,6 @@ function getMaxDepth({ previousItem }) {
10589
10588
  }
10590
10589
  return 0;
10591
10590
  }
10592
- function getMinDepth({ nextItem }) {
10593
- if (nextItem && typeof nextItem.depth === "number") {
10594
- return nextItem.depth;
10595
- }
10596
- return 0;
10597
- }
10598
10591
  function getDragDepth(offset, indentationWidth2) {
10599
10592
  return Math.round(offset / indentationWidth2);
10600
10593
  }
@@ -10610,7 +10603,7 @@ function RouteIcon({ type, color = "neutral800" }) {
10610
10603
  return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { width: "16px", height: "16px" });
10611
10604
  }
10612
10605
  }
10613
- const RouteItem = React.forwardRef(({ item, setParentId, setActionItem, ghost, depth, style, wrapperRef, handleProps }, ref) => {
10606
+ const RouteItem = React.forwardRef(({ item, setParentId, setActionItem, setNavigationItems, ghost, depth, style, wrapperRef, handleProps }, ref) => {
10614
10607
  if (!item || !item.route) return null;
10615
10608
  const { setModalType } = React.useContext(ModalContext);
10616
10609
  const { formatMessage } = reactIntl.useIntl();
@@ -10662,6 +10655,17 @@ const RouteItem = React.forwardRef(({ item, setParentId, setActionItem, ghost, d
10662
10655
  setActionItem(item);
10663
10656
  setModalType("ItemDelete");
10664
10657
  };
10658
+ const handleRestore = () => {
10659
+ setNavigationItems(
10660
+ (navItems) => navItems?.map((navItem) => {
10661
+ if (navItem.documentId === item.documentId) {
10662
+ delete navItem.update;
10663
+ delete navItem.deleted;
10664
+ }
10665
+ return navItem;
10666
+ })
10667
+ );
10668
+ };
10665
10669
  const elStyle = {
10666
10670
  marginLeft: depth !== void 0 ? depth * 48 : 0,
10667
10671
  opacity: ghost || item.deleted ? 0.5 : 1,
@@ -10718,18 +10722,24 @@ const RouteItem = React.forwardRef(({ item, setParentId, setActionItem, ghost, d
10718
10722
  ] }),
10719
10723
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "row", gap: 4, children: [
10720
10724
  type === "internal" && item.status && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Status, { variant: itemStatusOptions[item.status].variant, size: "S", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontWeight: "bold", children: itemStatusOptions[item.status].status }) }),
10721
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.SimpleMenu, { label: "Notifications", tag: designSystem.IconButton, icon: /* @__PURE__ */ jsxRuntime.jsx(icons.More, {}), children: [
10722
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onClick: () => handleEdit(), children: formatMessage({
10723
- id: index.getTranslation("edit"),
10724
- defaultMessage: "Edit"
10725
- }) }),
10726
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onClick: () => handleAddChildren(), children: formatMessage({
10727
- id: index.getTranslation("navigation.page.navItem.addChildren"),
10728
- defaultMessage: "Add children"
10729
- }) }),
10730
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onClick: () => handleDelete(), children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "danger600", children: formatMessage({
10731
- id: index.getTranslation("delete"),
10732
- defaultMessage: "Delete"
10725
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.SimpleMenu, { label: "Item actions", tag: designSystem.IconButton, icon: /* @__PURE__ */ jsxRuntime.jsx(icons.More, {}), children: [
10726
+ !item.deleted && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
10727
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onClick: () => handleEdit(), children: formatMessage({
10728
+ id: index.getTranslation("edit"),
10729
+ defaultMessage: "Edit"
10730
+ }) }),
10731
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onClick: () => handleAddChildren(), children: formatMessage({
10732
+ id: index.getTranslation("navigation.page.navItem.addChildren"),
10733
+ defaultMessage: "Add children"
10734
+ }) }),
10735
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onClick: () => handleDelete(), children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "danger600", children: formatMessage({
10736
+ id: index.getTranslation("delete"),
10737
+ defaultMessage: "Delete"
10738
+ }) }) })
10739
+ ] }),
10740
+ (item.deleted || item.update) && /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onClick: () => handleRestore(), children: formatMessage({
10741
+ id: index.getTranslation("restore"),
10742
+ defaultMessage: "Restore"
10733
10743
  }) }) })
10734
10744
  ] })
10735
10745
  ] })
@@ -10739,7 +10749,7 @@ const RouteItem = React.forwardRef(({ item, setParentId, setActionItem, ghost, d
10739
10749
  }
10740
10750
  );
10741
10751
  });
10742
- function SortableRouteItem({ item, depth, ...props }) {
10752
+ function SortableRouteItem({ item, depth, setNavigationItems, ...props }) {
10743
10753
  if (!item) return null;
10744
10754
  const {
10745
10755
  isDragging,
@@ -10758,6 +10768,7 @@ function SortableRouteItem({ item, depth, ...props }) {
10758
10768
  {
10759
10769
  ref: setDraggableNodeRef,
10760
10770
  wrapperRef: setDroppableNodeRef,
10771
+ setNavigationItems,
10761
10772
  style,
10762
10773
  item,
10763
10774
  disableInteraction: isSorting,
@@ -10801,6 +10812,7 @@ function PageWrapper({ navigations, loading = false, children }) {
10801
10812
  id: index.getTranslation("navigation.page.selectNavigation"),
10802
10813
  defaultMessage: "Select Navigation"
10803
10814
  }),
10815
+ selected: true,
10804
10816
  onChange: (value) => {
10805
10817
  const navItem = navigations.find((nav) => nav.slug === value);
10806
10818
  navItem && navigate(`/plugins/webatlas/navigation/${navItem.documentId}`);
@@ -11802,6 +11814,7 @@ const Navigation = () => {
11802
11814
  const { getNavigation, updateNavigationItemStructure } = index.useApi();
11803
11815
  const [isSavingNavigation, setIsSavingNavigation] = React.useState(false);
11804
11816
  const [loading, setLoading] = React.useState(true);
11817
+ const cachedNavigations = React.useRef(null);
11805
11818
  const [projected, setProjected] = React.useState(null);
11806
11819
  const [activeItem, setActiveItem] = React.useState();
11807
11820
  const [activeId, setActiveId] = React.useState(null);
@@ -11845,11 +11858,10 @@ const Navigation = () => {
11845
11858
  }) + ": " + updatedNavigations[0]?.name
11846
11859
  });
11847
11860
  navigate(`/plugins/webatlas/navigation/${updatedNavigations[0]?.documentId}`);
11861
+ return;
11848
11862
  }
11849
- setNavigations(updatedNavigations);
11850
- setSelectedNavigation(selectedNav);
11851
- setNavigationItems(selectedNav?.items || []);
11852
- initialNavigationItemsRef.current = cloneDeep$1(selectedNav?.items) || null;
11863
+ cachedNavigations.current = updatedNavigations;
11864
+ switchNavigation(selectedNav, updatedNavigations);
11853
11865
  } catch (error) {
11854
11866
  console.error("Error fetching navigations: ", error);
11855
11867
  toggleNotification({
@@ -11861,16 +11873,30 @@ const Navigation = () => {
11861
11873
  });
11862
11874
  }
11863
11875
  }
11876
+ function switchNavigation(selectedNav, updatedNavigations) {
11877
+ setNavigations(updatedNavigations);
11878
+ setSelectedNavigation(selectedNav);
11879
+ setNavigationItems(selectedNav.items || []);
11880
+ initialNavigationItemsRef.current = cloneDeep$1(selectedNav.items) || null;
11881
+ }
11864
11882
  React.useEffect(() => {
11865
11883
  async function fetchNavigations() {
11866
11884
  if (!navigationId) {
11867
- const navigations2 = await getNavigation({ documentId: navigationId, variant: "namesOnly" });
11868
- navigations2 && navigate(`/plugins/webatlas/navigation/${navigations2[0]?.documentId}`);
11869
- } else {
11870
- setLoading(true);
11871
- await loadNavigations();
11885
+ const navs = await getNavigation({ variant: "namesOnly" });
11886
+ if (navs && navs.length > 0) {
11887
+ navigate(`/plugins/webatlas/navigation/${navs[0].documentId}`);
11888
+ }
11889
+ return;
11890
+ }
11891
+ if (cachedNavigations.current) {
11892
+ const selectedNav = cachedNavigations.current.find((nav) => nav.documentId === navigationId);
11893
+ selectedNav && switchNavigation(selectedNav, cachedNavigations.current);
11872
11894
  setLoading(false);
11895
+ return;
11873
11896
  }
11897
+ setLoading(true);
11898
+ await loadNavigations();
11899
+ setLoading(false);
11874
11900
  }
11875
11901
  fetchNavigations();
11876
11902
  }, [navigationId]);
@@ -11924,7 +11950,7 @@ const Navigation = () => {
11924
11950
  })
11925
11951
  });
11926
11952
  } finally {
11927
- loadNavigations();
11953
+ await loadNavigations();
11928
11954
  setIsSavingNavigation(false);
11929
11955
  }
11930
11956
  }
@@ -11953,7 +11979,16 @@ const Navigation = () => {
11953
11979
  const activeTreeItem = navigationItems[activeIndex];
11954
11980
  navigationItems[activeIndex] = { ...activeTreeItem, depth };
11955
11981
  const sortedItems = sortable.arrayMove(navigationItems, activeIndex, overIndex);
11956
- setNavigationItems(sortedItems);
11982
+ const fixedItems = [...sortedItems];
11983
+ fixedItems[0].depth = 0;
11984
+ for (let i = 1; i < fixedItems.length; i++) {
11985
+ const prev = fixedItems[i - 1].depth ?? 0;
11986
+ let curr = fixedItems[i].depth ?? 0;
11987
+ if (curr < 0) curr = 0;
11988
+ if (curr > prev + 1) curr = prev + 1;
11989
+ fixedItems[i].depth = curr;
11990
+ }
11991
+ setNavigationItems(fixedItems);
11957
11992
  }
11958
11993
  }
11959
11994
  function resetState() {
@@ -12012,6 +12047,7 @@ const Navigation = () => {
12012
12047
  item,
12013
12048
  setParentId,
12014
12049
  setActionItem,
12050
+ setNavigationItems,
12015
12051
  indentationWidth,
12016
12052
  depth: item.id === activeId && projected ? projected.depth : item.depth
12017
12053
  },
@@ -12023,7 +12059,8 @@ const Navigation = () => {
12023
12059
  {
12024
12060
  item: activeItem,
12025
12061
  setParentId,
12026
- setActionItem
12062
+ setActionItem,
12063
+ setNavigationItems
12027
12064
  }
12028
12065
  ) : null }),
12029
12066
  document.body
@@ -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 admin = require("@strapi/strapi/admin");
7
- const index = require("./index-Ciae_OgQ.js");
7
+ const index = require("./index-Bxhu-TNT.js");
8
8
  const reactIntl = require("react-intl");
9
9
  require("@strapi/icons/symbols");
10
10
  const FullLoader = require("./FullLoader-Cmsf8xS6.js");
@@ -279,4 +279,4 @@ const Settings = () => {
279
279
  ] });
280
280
  };
281
281
  exports.default = Settings;
282
- //# sourceMappingURL=index-BAN8PGGJ.js.map
282
+ //# sourceMappingURL=index-Cw8m9qME.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-BAN8PGGJ.js","sources":["../../admin/src/pages/Settings/PageWrapper.tsx","../../admin/src/pages/Settings/ContentTypeAccordion.tsx","../../admin/src/pages/Settings/index.tsx"],"sourcesContent":["import { Button, Box } from '@strapi/design-system';\nimport { Page, Layouts} from '@strapi/strapi/admin'\nimport { PLUGIN_NAME } from '../../../../pluginId';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\nimport type { ConfigContentType } from '../../../../types';\n\nexport default function PageWrapper({ \n settingsState, \n initialState, \n save, \n isSaving,\n children\n}: { \n settingsState?: any, \n initialState?: any, \n save?: () => void, \n isSaving?: boolean,\n children: React.ReactNode \n}) {\n\n const { formatMessage } = useIntl();\n \n return (\n <Page.Main>\n <Layouts.Header\n title={PLUGIN_NAME}\n subtitle={formatMessage({\n id: getTranslation('settings.page.subtitle'),\n defaultMessage: 'Settings',\n })}\n primaryAction={ settingsState && initialState && save &&\n <Button\n type=\"submit\"\n onClick={() => save()}\n loading={isSaving}\n disabled={\n JSON.stringify(settingsState) === JSON.stringify(initialState)\n || settingsState.selectedContentTypes.find((cta: ConfigContentType) => !cta.default) !== undefined\n || isSaving\n }\n >\n {formatMessage({\n id: getTranslation('save'),\n defaultMessage: 'Save',\n })}\n </Button>\n }\n />\n <Layouts.Content>\n <Box\n background='neutral0'\n borderColor=\"neutral150\"\n hasRadius\n paddingBottom={4}\n paddingLeft={4}\n paddingRight={4}\n paddingTop={6}\n shadow=\"tableShadow\"\n >\n {children}\n </Box>\n </Layouts.Content>\n </Page.Main>\n )\n}","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 settings page for the Webatlas plugin in Strapi.\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 } 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 from './PageWrapper';\nimport ContentTypeAccordion from './ContentTypeAccordion';\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\nfunction reducer(settingsState: PluginConfig, action: Action): PluginConfig {\n let updatedContentTypes\n switch (action.type) {\n case 'SET_SELECTED_CONTENT_TYPES':\n updatedContentTypes = action.payload.map(ct => {\n return settingsState.selectedContentTypes.find((cta: ConfigContentType) => cta.uid === ct.uid) || ct\n })\n return { ...settingsState, selectedContentTypes: updatedContentTypes };\n case 'SET_DEFAULT_FIELD':\n updatedContentTypes = settingsState.selectedContentTypes.map(ct =>\n ct.uid === action.payload.ctUid ? { ...ct, default: action.payload.field } : ct\n );\n return { ...settingsState, selectedContentTypes: updatedContentTypes };\n case 'SET_PATTERN':\n updatedContentTypes = settingsState.selectedContentTypes.map(ct =>\n ct.uid === action.payload.ctUid ? { ...ct, pattern: transformToUrl(action.payload.pattern) } : ct\n );\n return { ...settingsState, selectedContentTypes: updatedContentTypes };\n default:\n throw new Error();\n }\n}\n\nconst Settings = () => {\n const { config, setConfig, loading, fetchError } = usePluginConfig();\n const [settingsState, dispatch] = useReducer(reducer, config || { selectedContentTypes: [] });\n const { contentTypes: allContentTypesData } = useAllContentTypes();\n const allContentTypes = allContentTypesData?.filter((ct: ContentType) => ct.pluginOptions?.webatlas?.active === true);\n const [initialState, setInitialState] = useState(config || { selectedContentTypes: [] })\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const [isSaving, setIsSaving] = useState(false);\n\n useEffect(() => {\n setInitialState(config || { selectedContentTypes: [] })\n }, [config]);\n\n useEffect(() => {\n if (!config) return;\n dispatch({ type: 'SET_SELECTED_CONTENT_TYPES', payload: config.selectedContentTypes });\n }, [config]);\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 !settingsState \n || settingsState.selectedContentTypes.find((cta: ConfigContentType) => !cta.default) !== undefined\n ) return\n\n setIsSaving(true);\n try {\n await setConfig(settingsState)\n setInitialState(settingsState)\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 <FullLoader height={200} />\n </PageWrapper>\n }\n\n return (\n <PageWrapper settingsState={settingsState} initialState={initialState} save={save} isSaving={isSaving}>\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 {formatMessage({\n id: getTranslation('settings.page.enabledContentTypes'),\n defaultMessage: 'Enabled Content Types',\n })}\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={[...settingsState.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 {settingsState.selectedContentTypes && settingsState.selectedContentTypes.length > 0 && \n <Box paddingTop={4}>\n <Field.Root name=\"selectedContentTypesAccordion\">\n <Field.Label>\n {formatMessage({\n id: getTranslation('settings.page.contentTypeSettings'),\n defaultMessage: 'Content Type settings',\n })}\n </Field.Label>\n <Accordion.Root>\n {settingsState.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 </PageWrapper>\n );\n};\n\nexport default Settings;\n"],"names":["useIntl","jsxs","Page","jsx","Layouts","PLUGIN_NAME","getTranslation","Button","Box","Accordion","Field","SingleSelect","index","SingleSelectOption","Tooltip","transformToUrl","usePluginConfig","useReducer","useAllContentTypes","useState","useNotification","useEffect","FullLoader","MultiSelect","MultiSelectOption"],"mappings":"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"}
1
+ {"version":3,"file":"index-Cw8m9qME.js","sources":["../../admin/src/pages/Settings/PageWrapper.tsx","../../admin/src/pages/Settings/ContentTypeAccordion.tsx","../../admin/src/pages/Settings/index.tsx"],"sourcesContent":["import { Button, Box } from '@strapi/design-system';\nimport { Page, Layouts} from '@strapi/strapi/admin'\nimport { PLUGIN_NAME } from '../../../../pluginId';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\nimport type { ConfigContentType } from '../../../../types';\n\nexport default function PageWrapper({ \n settingsState, \n initialState, \n save, \n isSaving,\n children\n}: { \n settingsState?: any, \n initialState?: any, \n save?: () => void, \n isSaving?: boolean,\n children: React.ReactNode \n}) {\n\n const { formatMessage } = useIntl();\n \n return (\n <Page.Main>\n <Layouts.Header\n title={PLUGIN_NAME}\n subtitle={formatMessage({\n id: getTranslation('settings.page.subtitle'),\n defaultMessage: 'Settings',\n })}\n primaryAction={ settingsState && initialState && save &&\n <Button\n type=\"submit\"\n onClick={() => save()}\n loading={isSaving}\n disabled={\n JSON.stringify(settingsState) === JSON.stringify(initialState)\n || settingsState.selectedContentTypes.find((cta: ConfigContentType) => !cta.default) !== undefined\n || isSaving\n }\n >\n {formatMessage({\n id: getTranslation('save'),\n defaultMessage: 'Save',\n })}\n </Button>\n }\n />\n <Layouts.Content>\n <Box\n background='neutral0'\n borderColor=\"neutral150\"\n hasRadius\n paddingBottom={4}\n paddingLeft={4}\n paddingRight={4}\n paddingTop={6}\n shadow=\"tableShadow\"\n >\n {children}\n </Box>\n </Layouts.Content>\n </Page.Main>\n )\n}","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 settings page for the Webatlas plugin in Strapi.\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 } 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 from './PageWrapper';\nimport ContentTypeAccordion from './ContentTypeAccordion';\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\nfunction reducer(settingsState: PluginConfig, action: Action): PluginConfig {\n let updatedContentTypes\n switch (action.type) {\n case 'SET_SELECTED_CONTENT_TYPES':\n updatedContentTypes = action.payload.map(ct => {\n return settingsState.selectedContentTypes.find((cta: ConfigContentType) => cta.uid === ct.uid) || ct\n })\n return { ...settingsState, selectedContentTypes: updatedContentTypes };\n case 'SET_DEFAULT_FIELD':\n updatedContentTypes = settingsState.selectedContentTypes.map(ct =>\n ct.uid === action.payload.ctUid ? { ...ct, default: action.payload.field } : ct\n );\n return { ...settingsState, selectedContentTypes: updatedContentTypes };\n case 'SET_PATTERN':\n updatedContentTypes = settingsState.selectedContentTypes.map(ct =>\n ct.uid === action.payload.ctUid ? { ...ct, pattern: transformToUrl(action.payload.pattern) } : ct\n );\n return { ...settingsState, selectedContentTypes: updatedContentTypes };\n default:\n throw new Error();\n }\n}\n\nconst Settings = () => {\n const { config, setConfig, loading, fetchError } = usePluginConfig();\n const [settingsState, dispatch] = useReducer(reducer, config || { selectedContentTypes: [] });\n const { contentTypes: allContentTypesData } = useAllContentTypes();\n const allContentTypes = allContentTypesData?.filter((ct: ContentType) => ct.pluginOptions?.webatlas?.active === true);\n const [initialState, setInitialState] = useState(config || { selectedContentTypes: [] })\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const [isSaving, setIsSaving] = useState(false);\n\n useEffect(() => {\n setInitialState(config || { selectedContentTypes: [] })\n }, [config]);\n\n useEffect(() => {\n if (!config) return;\n dispatch({ type: 'SET_SELECTED_CONTENT_TYPES', payload: config.selectedContentTypes });\n }, [config]);\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 !settingsState \n || settingsState.selectedContentTypes.find((cta: ConfigContentType) => !cta.default) !== undefined\n ) return\n\n setIsSaving(true);\n try {\n await setConfig(settingsState)\n setInitialState(settingsState)\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 <FullLoader height={200} />\n </PageWrapper>\n }\n\n return (\n <PageWrapper settingsState={settingsState} initialState={initialState} save={save} isSaving={isSaving}>\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 {formatMessage({\n id: getTranslation('settings.page.enabledContentTypes'),\n defaultMessage: 'Enabled Content Types',\n })}\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={[...settingsState.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 {settingsState.selectedContentTypes && settingsState.selectedContentTypes.length > 0 && \n <Box paddingTop={4}>\n <Field.Root name=\"selectedContentTypesAccordion\">\n <Field.Label>\n {formatMessage({\n id: getTranslation('settings.page.contentTypeSettings'),\n defaultMessage: 'Content Type settings',\n })}\n </Field.Label>\n <Accordion.Root>\n {settingsState.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 </PageWrapper>\n );\n};\n\nexport default Settings;\n"],"names":["useIntl","jsxs","Page","jsx","Layouts","PLUGIN_NAME","getTranslation","Button","Box","Accordion","Field","SingleSelect","index","SingleSelectOption","Tooltip","transformToUrl","usePluginConfig","useReducer","useAllContentTypes","useState","useNotification","useEffect","FullLoader","MultiSelect","MultiSelectOption"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { useReducer, useState, useEffect } from "react";
3
3
  import { Button, Box, Accordion, Field, SingleSelect, SingleSelectOption, MultiSelect, MultiSelectOption } from "@strapi/design-system";
4
4
  import { Page, Layouts, useNotification } from "@strapi/strapi/admin";
5
- import { P as PLUGIN_NAME, g as getTranslation, T as Tooltip, b as usePluginConfig, c as useAllContentTypes, t as transformToUrl } from "./index-CuJP8Fy7.mjs";
5
+ import { P as PLUGIN_NAME, g as getTranslation, T as Tooltip, b as usePluginConfig, c as useAllContentTypes, t as transformToUrl } from "./index-DohcUdej.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";
@@ -279,4 +279,4 @@ const Settings = () => {
279
279
  export {
280
280
  Settings as default
281
281
  };
282
- //# sourceMappingURL=index-DtFIVZxq.mjs.map
282
+ //# sourceMappingURL=index-DKWn1eh9.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-DtFIVZxq.mjs","sources":["../../admin/src/pages/Settings/PageWrapper.tsx","../../admin/src/pages/Settings/ContentTypeAccordion.tsx","../../admin/src/pages/Settings/index.tsx"],"sourcesContent":["import { Button, Box } from '@strapi/design-system';\nimport { Page, Layouts} from '@strapi/strapi/admin'\nimport { PLUGIN_NAME } from '../../../../pluginId';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\nimport type { ConfigContentType } from '../../../../types';\n\nexport default function PageWrapper({ \n settingsState, \n initialState, \n save, \n isSaving,\n children\n}: { \n settingsState?: any, \n initialState?: any, \n save?: () => void, \n isSaving?: boolean,\n children: React.ReactNode \n}) {\n\n const { formatMessage } = useIntl();\n \n return (\n <Page.Main>\n <Layouts.Header\n title={PLUGIN_NAME}\n subtitle={formatMessage({\n id: getTranslation('settings.page.subtitle'),\n defaultMessage: 'Settings',\n })}\n primaryAction={ settingsState && initialState && save &&\n <Button\n type=\"submit\"\n onClick={() => save()}\n loading={isSaving}\n disabled={\n JSON.stringify(settingsState) === JSON.stringify(initialState)\n || settingsState.selectedContentTypes.find((cta: ConfigContentType) => !cta.default) !== undefined\n || isSaving\n }\n >\n {formatMessage({\n id: getTranslation('save'),\n defaultMessage: 'Save',\n })}\n </Button>\n }\n />\n <Layouts.Content>\n <Box\n background='neutral0'\n borderColor=\"neutral150\"\n hasRadius\n paddingBottom={4}\n paddingLeft={4}\n paddingRight={4}\n paddingTop={6}\n shadow=\"tableShadow\"\n >\n {children}\n </Box>\n </Layouts.Content>\n </Page.Main>\n )\n}","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 settings page for the Webatlas plugin in Strapi.\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 } 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 from './PageWrapper';\nimport ContentTypeAccordion from './ContentTypeAccordion';\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\nfunction reducer(settingsState: PluginConfig, action: Action): PluginConfig {\n let updatedContentTypes\n switch (action.type) {\n case 'SET_SELECTED_CONTENT_TYPES':\n updatedContentTypes = action.payload.map(ct => {\n return settingsState.selectedContentTypes.find((cta: ConfigContentType) => cta.uid === ct.uid) || ct\n })\n return { ...settingsState, selectedContentTypes: updatedContentTypes };\n case 'SET_DEFAULT_FIELD':\n updatedContentTypes = settingsState.selectedContentTypes.map(ct =>\n ct.uid === action.payload.ctUid ? { ...ct, default: action.payload.field } : ct\n );\n return { ...settingsState, selectedContentTypes: updatedContentTypes };\n case 'SET_PATTERN':\n updatedContentTypes = settingsState.selectedContentTypes.map(ct =>\n ct.uid === action.payload.ctUid ? { ...ct, pattern: transformToUrl(action.payload.pattern) } : ct\n );\n return { ...settingsState, selectedContentTypes: updatedContentTypes };\n default:\n throw new Error();\n }\n}\n\nconst Settings = () => {\n const { config, setConfig, loading, fetchError } = usePluginConfig();\n const [settingsState, dispatch] = useReducer(reducer, config || { selectedContentTypes: [] });\n const { contentTypes: allContentTypesData } = useAllContentTypes();\n const allContentTypes = allContentTypesData?.filter((ct: ContentType) => ct.pluginOptions?.webatlas?.active === true);\n const [initialState, setInitialState] = useState(config || { selectedContentTypes: [] })\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const [isSaving, setIsSaving] = useState(false);\n\n useEffect(() => {\n setInitialState(config || { selectedContentTypes: [] })\n }, [config]);\n\n useEffect(() => {\n if (!config) return;\n dispatch({ type: 'SET_SELECTED_CONTENT_TYPES', payload: config.selectedContentTypes });\n }, [config]);\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 !settingsState \n || settingsState.selectedContentTypes.find((cta: ConfigContentType) => !cta.default) !== undefined\n ) return\n\n setIsSaving(true);\n try {\n await setConfig(settingsState)\n setInitialState(settingsState)\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 <FullLoader height={200} />\n </PageWrapper>\n }\n\n return (\n <PageWrapper settingsState={settingsState} initialState={initialState} save={save} isSaving={isSaving}>\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 {formatMessage({\n id: getTranslation('settings.page.enabledContentTypes'),\n defaultMessage: 'Enabled Content Types',\n })}\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={[...settingsState.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 {settingsState.selectedContentTypes && settingsState.selectedContentTypes.length > 0 && \n <Box paddingTop={4}>\n <Field.Root name=\"selectedContentTypesAccordion\">\n <Field.Label>\n {formatMessage({\n id: getTranslation('settings.page.contentTypeSettings'),\n defaultMessage: 'Content Type settings',\n })}\n </Field.Label>\n <Accordion.Root>\n {settingsState.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 </PageWrapper>\n );\n};\n\nexport default Settings;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index-DKWn1eh9.mjs","sources":["../../admin/src/pages/Settings/PageWrapper.tsx","../../admin/src/pages/Settings/ContentTypeAccordion.tsx","../../admin/src/pages/Settings/index.tsx"],"sourcesContent":["import { Button, Box } from '@strapi/design-system';\nimport { Page, Layouts} from '@strapi/strapi/admin'\nimport { PLUGIN_NAME } from '../../../../pluginId';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\nimport type { ConfigContentType } from '../../../../types';\n\nexport default function PageWrapper({ \n settingsState, \n initialState, \n save, \n isSaving,\n children\n}: { \n settingsState?: any, \n initialState?: any, \n save?: () => void, \n isSaving?: boolean,\n children: React.ReactNode \n}) {\n\n const { formatMessage } = useIntl();\n \n return (\n <Page.Main>\n <Layouts.Header\n title={PLUGIN_NAME}\n subtitle={formatMessage({\n id: getTranslation('settings.page.subtitle'),\n defaultMessage: 'Settings',\n })}\n primaryAction={ settingsState && initialState && save &&\n <Button\n type=\"submit\"\n onClick={() => save()}\n loading={isSaving}\n disabled={\n JSON.stringify(settingsState) === JSON.stringify(initialState)\n || settingsState.selectedContentTypes.find((cta: ConfigContentType) => !cta.default) !== undefined\n || isSaving\n }\n >\n {formatMessage({\n id: getTranslation('save'),\n defaultMessage: 'Save',\n })}\n </Button>\n }\n />\n <Layouts.Content>\n <Box\n background='neutral0'\n borderColor=\"neutral150\"\n hasRadius\n paddingBottom={4}\n paddingLeft={4}\n paddingRight={4}\n paddingTop={6}\n shadow=\"tableShadow\"\n >\n {children}\n </Box>\n </Layouts.Content>\n </Page.Main>\n )\n}","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 settings page for the Webatlas plugin in Strapi.\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 } 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 from './PageWrapper';\nimport ContentTypeAccordion from './ContentTypeAccordion';\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\nfunction reducer(settingsState: PluginConfig, action: Action): PluginConfig {\n let updatedContentTypes\n switch (action.type) {\n case 'SET_SELECTED_CONTENT_TYPES':\n updatedContentTypes = action.payload.map(ct => {\n return settingsState.selectedContentTypes.find((cta: ConfigContentType) => cta.uid === ct.uid) || ct\n })\n return { ...settingsState, selectedContentTypes: updatedContentTypes };\n case 'SET_DEFAULT_FIELD':\n updatedContentTypes = settingsState.selectedContentTypes.map(ct =>\n ct.uid === action.payload.ctUid ? { ...ct, default: action.payload.field } : ct\n );\n return { ...settingsState, selectedContentTypes: updatedContentTypes };\n case 'SET_PATTERN':\n updatedContentTypes = settingsState.selectedContentTypes.map(ct =>\n ct.uid === action.payload.ctUid ? { ...ct, pattern: transformToUrl(action.payload.pattern) } : ct\n );\n return { ...settingsState, selectedContentTypes: updatedContentTypes };\n default:\n throw new Error();\n }\n}\n\nconst Settings = () => {\n const { config, setConfig, loading, fetchError } = usePluginConfig();\n const [settingsState, dispatch] = useReducer(reducer, config || { selectedContentTypes: [] });\n const { contentTypes: allContentTypesData } = useAllContentTypes();\n const allContentTypes = allContentTypesData?.filter((ct: ContentType) => ct.pluginOptions?.webatlas?.active === true);\n const [initialState, setInitialState] = useState(config || { selectedContentTypes: [] })\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const [isSaving, setIsSaving] = useState(false);\n\n useEffect(() => {\n setInitialState(config || { selectedContentTypes: [] })\n }, [config]);\n\n useEffect(() => {\n if (!config) return;\n dispatch({ type: 'SET_SELECTED_CONTENT_TYPES', payload: config.selectedContentTypes });\n }, [config]);\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 !settingsState \n || settingsState.selectedContentTypes.find((cta: ConfigContentType) => !cta.default) !== undefined\n ) return\n\n setIsSaving(true);\n try {\n await setConfig(settingsState)\n setInitialState(settingsState)\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 <FullLoader height={200} />\n </PageWrapper>\n }\n\n return (\n <PageWrapper settingsState={settingsState} initialState={initialState} save={save} isSaving={isSaving}>\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 {formatMessage({\n id: getTranslation('settings.page.enabledContentTypes'),\n defaultMessage: 'Enabled Content Types',\n })}\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={[...settingsState.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 {settingsState.selectedContentTypes && settingsState.selectedContentTypes.length > 0 && \n <Box paddingTop={4}>\n <Field.Root name=\"selectedContentTypesAccordion\">\n <Field.Label>\n {formatMessage({\n id: getTranslation('settings.page.contentTypeSettings'),\n defaultMessage: 'Content Type settings',\n })}\n </Field.Label>\n <Accordion.Root>\n {settingsState.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 </PageWrapper>\n );\n};\n\nexport default Settings;\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { useState, useEffect } from "react";
3
3
  import { Thead, Tr, Th, Typography, VisuallyHidden, Td, Flex, LinkButton, Box, Table, Tbody } from "@strapi/design-system";
4
- import { g as getTranslation, u as useApi } from "./index-Ctq2vsD5.mjs";
4
+ import { g as getTranslation, u as useApi } from "./index-B5u3q4DO.mjs";
5
5
  import { Page, Layouts, useNotification } from "@strapi/strapi/admin";
6
6
  import { F as FullLoader, C as Center } from "./FullLoader-CrPED_dY.mjs";
7
7
  import { E as EmptyBox } from "./EmptyBox-BM4IscSk.mjs";
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { useState, useEffect } from "react";
3
3
  import { Thead, Tr, Th, Typography, VisuallyHidden, Td, Flex, LinkButton, Box, Table, Tbody } from "@strapi/design-system";
4
- import { g as getTranslation, u as useApi } from "./index-CuJP8Fy7.mjs";
4
+ import { g as getTranslation, u as useApi } from "./index-DohcUdej.mjs";
5
5
  import { Page, Layouts, useNotification } from "@strapi/strapi/admin";
6
6
  import { F as FullLoader, C as Center } from "./FullLoader-CrPED_dY.mjs";
7
7
  import { E as EmptyBox } from "./EmptyBox-BM4IscSk.mjs";
@@ -124,4 +124,4 @@ const Routes = () => {
124
124
  export {
125
125
  Routes as default
126
126
  };
127
- //# sourceMappingURL=index-CEt9P4TS.mjs.map
127
+ //# sourceMappingURL=index-DShP5BtK.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-CEt9P4TS.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/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 { Typography, Thead, Tr, Th, VisuallyHidden } from '@strapi/design-system';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\n\nexport default function TableHeader() {\n const { formatMessage } = useIntl();\n\n return (\n <Thead>\n <Tr>\n <Th>\n <Typography variant=\"sigma\">ID</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">\n {formatMessage({\n id: getTranslation('title'),\n defaultMessage: 'Title',\n })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">\n {formatMessage({\n id: getTranslation('route'),\n defaultMessage: 'Route',\n })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">\n {formatMessage({\n id: getTranslation('routes.page.column.type'),\n defaultMessage: 'Type',\n })}\n </Typography>\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.id}</Typography>\n </Td>\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 { Box } from '@strapi/design-system';\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 <Box>\n {children}\n </Box>\n </Layouts.Content>\n </Page.Main>\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 } from '../../../../types';\nimport { useState, useEffect } from 'react';\nimport { Table, Tbody } from '@strapi/design-system';\nimport { useApi } from '../../hooks';\nimport { EmptyBox, Center, 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';\n\nconst Routes = () => {\n const { getRoutes } = useApi();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n \n const [routes, setRoutes] = useState<Route[]>([]);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n async function fetchRoutes() {\n try {\n const data = await getRoutes();\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 if (loading) {\n return <PageWrapper>\n <FullLoader />\n </PageWrapper>\n }\n\n if (routes.length === 0) {\n return <PageWrapper>\n <Center height={400}>\n <EmptyBox msg={formatMessage({\n id: getTranslation('routes.page.emptyRoutes'),\n defaultMessage: 'No routes found',\n })} />\n </Center>\n </PageWrapper>;\n }\n return (\n <PageWrapper>\n <Table colCount={4} rowCount={routes.length}>\n <TableHeader />\n <Tbody>\n {routes.map((route: Route) => (\n <TableRow key={route.id} route={route} />\n ))}\n </Tbody>\n </Table>\n </PageWrapper>\n );\n};\n\nexport default Routes;"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index-DShP5BtK.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/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 { Typography, Thead, Tr, Th, VisuallyHidden } from '@strapi/design-system';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\n\nexport default function TableHeader() {\n const { formatMessage } = useIntl();\n\n return (\n <Thead>\n <Tr>\n <Th>\n <Typography variant=\"sigma\">ID</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">\n {formatMessage({\n id: getTranslation('title'),\n defaultMessage: 'Title',\n })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">\n {formatMessage({\n id: getTranslation('route'),\n defaultMessage: 'Route',\n })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">\n {formatMessage({\n id: getTranslation('routes.page.column.type'),\n defaultMessage: 'Type',\n })}\n </Typography>\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.id}</Typography>\n </Td>\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 { Box } from '@strapi/design-system';\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 <Box>\n {children}\n </Box>\n </Layouts.Content>\n </Page.Main>\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 } from '../../../../types';\nimport { useState, useEffect } from 'react';\nimport { Table, Tbody } from '@strapi/design-system';\nimport { useApi } from '../../hooks';\nimport { EmptyBox, Center, 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';\n\nconst Routes = () => {\n const { getRoutes } = useApi();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n \n const [routes, setRoutes] = useState<Route[]>([]);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n async function fetchRoutes() {\n try {\n const data = await getRoutes();\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 if (loading) {\n return <PageWrapper>\n <FullLoader />\n </PageWrapper>\n }\n\n if (routes.length === 0) {\n return <PageWrapper>\n <Center height={400}>\n <EmptyBox msg={formatMessage({\n id: getTranslation('routes.page.emptyRoutes'),\n defaultMessage: 'No routes found',\n })} />\n </Center>\n </PageWrapper>;\n }\n return (\n <PageWrapper>\n <Table colCount={4} rowCount={routes.length}>\n <TableHeader />\n <Tbody>\n {routes.map((route: Route) => (\n <TableRow key={route.id} route={route} />\n ))}\n </Tbody>\n </Table>\n </PageWrapper>\n );\n};\n\nexport default Routes;"],"names":[],"mappings":"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"}