@mattisvensson/strapi-plugin-webatlas 0.6.1 → 0.7.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 (51) hide show
  1. package/README.md +9 -2
  2. package/dist/_chunks/{de-CL1TIZPg.js → de-BZc1BkzH.js} +4 -1
  3. package/dist/_chunks/{de-CL1TIZPg.js.map → de-BZc1BkzH.js.map} +1 -1
  4. package/dist/_chunks/{de-CzVD4dbZ.mjs → de-oxxH8hft.mjs} +4 -1
  5. package/dist/_chunks/{de-CzVD4dbZ.mjs.map → de-oxxH8hft.mjs.map} +1 -1
  6. package/dist/_chunks/{en-Du-Ap60j.js → en-Deg4n_IM.js} +4 -1
  7. package/dist/_chunks/{en-Du-Ap60j.js.map → en-Deg4n_IM.js.map} +1 -1
  8. package/dist/_chunks/{en-Nk6QcTdr.mjs → en-DqC5aDzA.mjs} +4 -1
  9. package/dist/_chunks/{en-Nk6QcTdr.mjs.map → en-DqC5aDzA.mjs.map} +1 -1
  10. package/dist/_chunks/{index-C2V-ZFHK.mjs → index-B6MYtu3A.mjs} +79 -53
  11. package/dist/_chunks/{index-DCCE7rxt.js.map → index-B6MYtu3A.mjs.map} +1 -1
  12. package/dist/_chunks/index-BEgpEtto.mjs +247 -0
  13. package/dist/_chunks/index-BEgpEtto.mjs.map +1 -0
  14. package/dist/_chunks/{index-BvqWnL1-.js → index-BOEv4jIJ.js} +6 -6
  15. package/dist/_chunks/{index-BvqWnL1-.js.map → index-BOEv4jIJ.js.map} +1 -1
  16. package/dist/_chunks/{index-DYKhGn15.mjs → index-BPhRQoGD.mjs} +2 -2
  17. package/dist/_chunks/{index-DYKhGn15.mjs.map → index-BPhRQoGD.mjs.map} +1 -1
  18. package/dist/_chunks/index-BdlPAWj6.mjs +246 -0
  19. package/dist/_chunks/index-Bg96TqDm.js +247 -0
  20. package/dist/_chunks/index-Bg96TqDm.js.map +1 -0
  21. package/dist/_chunks/{index-Bfu5AVqu.mjs → index-BgzZLDPv.mjs} +78 -52
  22. package/dist/_chunks/index-BoVX1KF8.js +246 -0
  23. package/dist/_chunks/{index-B5ji2Qhs.js → index-ByU38WNH.js} +5 -5
  24. package/dist/_chunks/{index-JVvkmiKE.mjs → index-CZ5qsGXH.mjs} +6 -6
  25. package/dist/_chunks/{index-JVvkmiKE.mjs.map → index-CZ5qsGXH.mjs.map} +1 -1
  26. package/dist/_chunks/{index-DesLqdi-.mjs → index-D3xDvB4d.mjs} +5 -5
  27. package/dist/_chunks/{index-BKds0CRq.mjs → index-DKdAgBbF.mjs} +1 -1
  28. package/dist/_chunks/{index-Cp_UPsle.js → index-D_QCV5Z5.js} +2 -2
  29. package/dist/_chunks/{index-Cp_UPsle.js.map → index-D_QCV5Z5.js.map} +1 -1
  30. package/dist/_chunks/{index-D2CkoDhN.js → index-UJ0LQ3Y3.js} +1 -1
  31. package/dist/_chunks/{index-BJHlAfrS.js → index-dSU20yZ4.js} +78 -52
  32. package/dist/_chunks/{index-DCCE7rxt.js → index-mObQ5NXj.js} +79 -53
  33. package/dist/_chunks/index-mObQ5NXj.js.map +1 -0
  34. package/dist/admin/index.js +1 -1
  35. package/dist/admin/index.mjs +1 -1
  36. package/dist/admin/src/pages/Routes/TableHeader.d.ts +5 -1
  37. package/dist/admin/src/pages/Routes/compareBy.d.ts +2 -0
  38. package/dist/server/index.js +1 -1
  39. package/dist/server/index.mjs +1 -1
  40. package/package.json +1 -1
  41. package/dist/_chunks/EmptyBox-BM4IscSk.mjs +0 -13
  42. package/dist/_chunks/EmptyBox-BM4IscSk.mjs.map +0 -1
  43. package/dist/_chunks/EmptyBox-T8t29l25.js +0 -12
  44. package/dist/_chunks/EmptyBox-T8t29l25.js.map +0 -1
  45. package/dist/_chunks/index-BEwslndX.js +0 -127
  46. package/dist/_chunks/index-BEwslndX.js.map +0 -1
  47. package/dist/_chunks/index-C-4C6ezO.mjs +0 -126
  48. package/dist/_chunks/index-C2V-ZFHK.mjs.map +0 -1
  49. package/dist/_chunks/index-DBVU2KOj.js +0 -126
  50. package/dist/_chunks/index-mUDowsKQ.mjs +0 -127
  51. package/dist/_chunks/index-mUDowsKQ.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-Bg96TqDm.js","sources":["../../admin/src/utils/getRouteType.ts","../../admin/src/pages/Routes/TableHeader.tsx","../../admin/src/pages/Routes/TableRow.tsx","../../admin/src/pages/Routes/PageWrapper.tsx","../../admin/src/pages/Routes/compareBy.ts","../../admin/src/pages/Routes/index.tsx"],"sourcesContent":["import type { Route } from \"../../../types\";\n\nexport default function getRouteType(route: Route): 'internal' | 'external' | 'wrapper' {\n if (route.wrapper) {\n return 'wrapper';\n } else if (!route.internal) {\n return 'external';\n } else {\n return 'internal';\n }\n}","import type { RouteSortKey } from '../../../../types';\nimport { Typography, Thead, Tr, Th, VisuallyHidden } from '@strapi/design-system';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\nimport { ChevronDown } from '@strapi/icons';\n\nexport default function TableHeader({\n sortKey,\n handleSort\n}: {\n sortKey: RouteSortKey,\n handleSort: (key: RouteSortKey) => void\n}) {\n const { formatMessage } = useIntl();\n\n return (\n <Thead>\n <Tr>\n <Th onClick={() => handleSort('title')} cursor=\"pointer\">\n <Typography variant=\"sigma\">\n {formatMessage({\n id: getTranslation('title'),\n defaultMessage: 'Title',\n })}\n </Typography>\n {sortKey === 'title' && <ChevronDown />}\n </Th>\n <Th onClick={() => handleSort('fullPath')} cursor=\"pointer\">\n <Typography variant=\"sigma\">\n {formatMessage({\n id: getTranslation('route'),\n defaultMessage: 'Route',\n })}\n </Typography>\n {sortKey === 'fullPath' && <ChevronDown />}\n </Th>\n <Th onClick={() => handleSort('type')} cursor=\"pointer\">\n <Typography variant=\"sigma\">\n {formatMessage({\n id: getTranslation('routes.page.column.type'),\n defaultMessage: 'Type',\n })}\n </Typography>\n {sortKey === 'type' && <ChevronDown />}\n </Th>\n <Th>\n <VisuallyHidden>\n {formatMessage({\n id: getTranslation('actions'),\n defaultMessage: 'Actions',\n })}\n </VisuallyHidden>\n </Th>\n </Tr>\n </Thead>\n )\n}","import type { Route } from '../../../../types';\nimport { Typography, Tr, Td, Flex, LinkButton } from '@strapi/design-system';\nimport { getTranslation, getRouteType } from '../../utils';\nimport { useIntl } from 'react-intl';\nimport { Pencil } from '@strapi/icons';\n\nexport default function TableRow({ route }: { route: Route }) {\n const { formatMessage } = useIntl();\n \n return (\n <Tr>\n <Td>\n <Typography textColor=\"neutral800\">{route.title}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">{route.fullPath}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">\n {formatMessage({\n id: getTranslation(`route.type.${getRouteType(route)}`),\n defaultMessage: '-',\n })}\n </Typography>\n </Td>\n <Td>\n <Flex gap={2} justifyContent=\"end\">\n {route.internal && \n <LinkButton\n variant=\"secondary\"\n startIcon={<Pencil />} \n href={`/admin/content-manager/collection-types/${route.relatedContentType}/${route.relatedDocumentId}`}\n >\n {formatMessage({\n id: getTranslation('edit'),\n defaultMessage: 'Edit',\n })}\n </LinkButton>\n }\n </Flex>\n </Td>\n </Tr>\n )\n}","import { Layouts, Page } from '@strapi/strapi/admin';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\n\nexport default function PageWrapper({ children }: { children: React.ReactNode }) {\n const { formatMessage } = useIntl();\n\n return (\n <Page.Main>\n <Layouts.Header\n title={formatMessage({\n id: getTranslation('routes.page.title'),\n defaultMessage: 'Routes',\n })}\n subtitle={formatMessage({\n id: getTranslation('routes.page.subtitle'),\n defaultMessage: 'Overview of all existing routes',\n })}\n />\n <Layouts.Content>\n <>\n {children}\n </>\n </Layouts.Content>\n </Page.Main>\n );\n}","import type { Route, RouteSortKey } from '../../../../types';\n\nexport default function compareBy(field: RouteSortKey, direction: 'asc' | 'desc') {\n if (!field) {\n return () => 0;\n }\n if (field === 'type') {\n return (a: Route, b: Route) => {\n const typeA = a.internal ? 'internal' : 'external';\n const typeB = b.internal ? 'internal' : 'external';\n return direction === 'asc'\n ? typeA.localeCompare(typeB)\n : typeB.localeCompare(typeA);\n };\n }\n return (a: Route, b: Route) => {\n const aValue = a[field];\n const bValue = b[field];\n if (typeof aValue === 'string' && typeof bValue === 'string') {\n return direction === 'asc'\n ? aValue.localeCompare(bValue)\n : bValue.localeCompare(aValue);\n }\n return 0;\n };\n}","/*\n *\n * Routes\n * This file contains the Routes page of the Webatlas plugin for Strapi.\n * It displays a table of all existing routes with their details and allows editing.\n *\n*/\n\nimport type { Route, RouteSortKey } from '../../../../types';\nimport { useState, useEffect } from 'react';\nimport { Table, Tbody, Box, Grid, Field, EmptyStateLayout, Tr, Td } from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { useApi } from '../../hooks';\nimport { FullLoader } from '../../components/UI';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\nimport TableHeader from './TableHeader';\nimport TableRow from './TableRow';\nimport { useNotification } from '@strapi/strapi/admin'\nimport PageWrapper from './PageWrapper';\nimport { useSearchParams } from 'react-router-dom';\nimport debounce from '../../utils/debounce';\nimport { useMemo } from 'react';\nimport compareBy from './compareBy';\n\nfunction SearchInput({\n searchQuery,\n handleSearchChange\n}: {\n searchQuery: string;\n handleSearchChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n}) {\n\n const { formatMessage } = useIntl();\n\n return (\n <Grid.Root style={{ marginBottom: '16px' }}>\n <Grid.Item col={4} s={12}>\n <Box width=\"100%\">\n <Field.Root>\n <Field.Input\n name=\"search\"\n placeholder={formatMessage({\n id: getTranslation('routes.page.searchPlaceholder'),\n defaultMessage: 'Search routes',\n })}\n value={searchQuery}\n onChange={handleSearchChange}\n endAction={\n searchQuery ? (\n <button\n type=\"button\"\n onClick={() => handleSearchChange({ target: { value: '' } } as React.ChangeEvent<HTMLInputElement>)}\n style={{ color: 'inherit', background: 'none', border: 'none', cursor: 'pointer' }}\n aria-label=\"Clear search\"\n >\n <Cross />\n </button>\n ) : null\n }\n />\n </Field.Root>\n </Box>\n </Grid.Item>\n </Grid.Root>\n );\n}\n\nfunction RouteTable({\n routes, \n sortKey, \n handleSort\n}: { \n routes: Route[], \n sortKey: RouteSortKey, \n handleSort: (key: RouteSortKey) => void\n}) {\n \n const { formatMessage } = useIntl();\n\n return (\n <Table colCount={4} rowCount={routes.length}>\n <TableHeader sortKey={sortKey} handleSort={handleSort} />\n <Tbody>\n {routes.length > 0 ? routes.map((route: Route) => (\n <TableRow key={route.id} route={route} />\n )) : \n <Tr>\n <Td colSpan={4}>\n <EmptyStateLayout \n content={\n formatMessage({\n id: getTranslation('routes.page.emptyRoutes'),\n defaultMessage: 'No routes found',\n })\n } \n shadow={false}\n />\n </Td>\n </Tr>\n }\n </Tbody>\n </Table>\n )\n}\n\nconst Routes = () => {\n const { getRoutes } = useApi();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n \n const [allRoutes, setAllRoutes] = useState<Route[]>([]);\n const [routes, setRoutes] = useState<Route[]>([]);\n const [loading, setLoading] = useState(true);\n const [searchParams, setSearchParams] = useSearchParams();\n const initialQuery = searchParams.get('search') || '';\n const [searchQuery, setSearchQuery] = useState(initialQuery);\n const [sortKey, setSortKey] = useState<RouteSortKey>(undefined);\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc');\n\n useEffect(() => {\n const query = searchQuery.toLowerCase()\n setRoutes(\n allRoutes.filter((route) =>\n JSON.stringify(route.id).toLowerCase().includes(query) ||\n route.title.toLowerCase().includes(query) ||\n route.fullPath.toLowerCase().includes(query) ||\n route.relatedDocumentId.toLowerCase().includes(query) ||\n route.relatedContentType.toLowerCase().includes(query)\n )\n )\n }, [searchQuery, allRoutes]);\n\n const debouncedSetSearchParams = useMemo(() =>\n debounce((value: string) => {\n value\n ? setSearchParams({ search: value })\n : setSearchParams({});\n }, 300),\n [setSearchParams]);\n\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setSearchQuery(value);\n debouncedSetSearchParams(value);\n }\n\n useEffect(() => {\n async function fetchRoutes() {\n try {\n const data = await getRoutes();\n setAllRoutes(data);\n setRoutes(data);\n } catch (err) {\n console.error('Failed to fetch routes:', err);\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslation('notification.routes.fetchFailed'),\n defaultMessage: 'Failed to fetch routes',\n }),\n });\n } finally {\n setLoading(false);\n }\n }\n fetchRoutes();\n }, [])\n\n const handleSort = (key: RouteSortKey) => {\n setSortDirection(prev => (prev === 'asc' ? 'desc' : 'asc'));\n setSortKey(key);\n };\n\n useEffect(() => {\n const sortedRoutes = sortKey\n ? [...routes].sort(compareBy(sortKey, sortDirection))\n : routes; \n setRoutes(sortedRoutes);\n }, [sortKey, sortDirection]);\n\n if (loading) {\n return <PageWrapper>\n <FullLoader />\n </PageWrapper>\n }\n\n return (\n <PageWrapper>\n <SearchInput\n handleSearchChange={handleSearchChange}\n searchQuery={searchQuery}\n />\n <RouteTable\n routes={routes} \n sortKey={sortKey}\n handleSort={handleSort}\n />\n </PageWrapper>\n );\n};\n\nexport default Routes;"],"names":["useIntl","jsx","Thead","jsxs","Tr","Th","Typography","getTranslation","ChevronDown","VisuallyHidden","Td","Flex","LinkButton","Pencil","Page","Layouts","Fragment","Grid","Box","Field","Cross","Table","Tbody","EmptyStateLayout","useApi","useNotification","useState","useSearchParams","useEffect","useMemo","debounce","FullLoader"],"mappings":"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"}
@@ -1,14 +1,14 @@
1
- import { jsx, jsxs, Fragment } from "react/jsx-runtime";
1
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
2
  import { useNavigate, useParams, Routes, Route } from "react-router-dom";
3
3
  import { Trash, Pencil, Check, Drag, More, Link, OneToMany, ExternalLink, Plus } from "@strapi/icons";
4
- import { Dialog, Typography, Button, Modal, Flex, SingleSelect, SingleSelectOption, Grid, Box, Field, Toggle, Divider, Status, SimpleMenu, IconButton, MenuItem } from "@strapi/design-system";
4
+ import { Box, Typography, Dialog, Button, Modal, Flex, SingleSelect, SingleSelectOption, Grid, Field, Toggle, Divider, Status, SimpleMenu, IconButton, MenuItem } from "@strapi/design-system";
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 } from "./index-DesLqdi-.mjs";
8
+ import { u as useApi, g as getTranslation, d as debounce, a as duplicateCheck, t as transformToUrl, U as URLInfo } from "./index-D3xDvB4d.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
- import { E as EmptyBox } from "./EmptyBox-BM4IscSk.mjs";
11
+ import { EmptyDocuments } from "@strapi/icons/symbols";
12
12
  import { MeasuringStrategy, DndContext, closestCenter, DragOverlay } from "@dnd-kit/core";
13
13
  import { arrayMove, useSortable, SortableContext, verticalListSortingStrategy } from "@dnd-kit/sortable";
14
14
  import { CSS } from "@dnd-kit/utilities";
@@ -81,6 +81,12 @@ function createTempNavItemObject({
81
81
  };
82
82
  return tempNavItem;
83
83
  }
84
+ function EmptyBox({ msg }) {
85
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
86
+ /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem", height: "6rem" }),
87
+ /* @__PURE__ */ jsx(Box, { padding: 4, children: /* @__PURE__ */ jsx(Typography, { variant: "beta", textColor: "neutral600", children: msg }) })
88
+ ] });
89
+ }
84
90
  const ModalContext = createContext({ modalType: "", setModalType: () => {
85
91
  } });
86
92
  const SelectedNavigationContext = createContext({ selectedNavigation: void 0, setSelectedNavigation: () => {
@@ -4629,6 +4635,7 @@ function ItemCreateComponent({
4629
4635
  onCreate
4630
4636
  }) {
4631
4637
  const [loading, setLoading] = useState(false);
4638
+ const [loadingRoute, setLoadingRoute] = useState(true);
4632
4639
  const { formatMessage } = useIntl();
4633
4640
  useEffect(() => {
4634
4641
  if (!entities) return;
@@ -4644,9 +4651,10 @@ function ItemCreateComponent({
4644
4651
  useEffect(() => {
4645
4652
  async function fetchRoute() {
4646
4653
  if (selectedContentType?.contentType && selectedEntity?.id) {
4654
+ setLoadingRoute(true);
4647
4655
  try {
4648
4656
  const route = await getRelatedRoute(selectedEntity.documentId);
4649
- if (!route) return;
4657
+ if (!route) throw new Error("No route found for the selected entity");
4650
4658
  dispatchPath({ type: "NO_URL_CHECK", payload: route.fullPath });
4651
4659
  dispatchPath({ type: "SET_UIDPATH", payload: route.uidPath });
4652
4660
  dispatchPath({ type: "SET_INITIALPATH", payload: route.fullPath });
@@ -4664,6 +4672,8 @@ function ItemCreateComponent({
4664
4672
  setEntityRoute(route);
4665
4673
  } catch (err) {
4666
4674
  console.log(err);
4675
+ } finally {
4676
+ setLoadingRoute(false);
4667
4677
  }
4668
4678
  }
4669
4679
  }
@@ -4690,6 +4700,68 @@ function ItemCreateComponent({
4690
4700
  setLoading(false);
4691
4701
  }
4692
4702
  };
4703
+ function ItemDetails() {
4704
+ if (loadingRoute) return /* @__PURE__ */ jsx(FullLoader, { height: 50 });
4705
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(Grid.Root, { gap: 4, children: [
4706
+ /* @__PURE__ */ jsx(Grid.Item, { col: 6, s: 12, alignItems: "baseline", children: /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(Field.Root, { children: [
4707
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
4708
+ id: getTranslation("modal.item.titleField.label"),
4709
+ defaultMessage: "Title"
4710
+ }) }),
4711
+ /* @__PURE__ */ jsx(
4712
+ Field.Input,
4713
+ {
4714
+ placeholder: formatMessage({
4715
+ id: getTranslation("modal.item.titleField.placeholder"),
4716
+ defaultMessage: "e.g. About us"
4717
+ }),
4718
+ name: "title",
4719
+ value: navItemState.title || "",
4720
+ onChange: (e) => dispatchItemState({ type: "SET_TITLE", payload: e.target.value }),
4721
+ required: true
4722
+ }
4723
+ )
4724
+ ] }) }) }),
4725
+ /* @__PURE__ */ jsx(Grid.Item, { col: 6, s: 12, children: /* @__PURE__ */ jsxs(Box, { width: "100%", children: [
4726
+ /* @__PURE__ */ jsxs(Field.Root, { children: [
4727
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
4728
+ id: getTranslation("modal.item.routeField.label"),
4729
+ defaultMessage: "Route"
4730
+ }) }),
4731
+ /* @__PURE__ */ jsx(
4732
+ Field.Input,
4733
+ {
4734
+ required: true,
4735
+ placeholder: formatMessage({
4736
+ id: getTranslation("modal.item.routeField.placeholder"),
4737
+ defaultMessage: "e.g. about/"
4738
+ }),
4739
+ name: "slug",
4740
+ value: path?.value || "",
4741
+ onChange: (e) => dispatchPath({ type: "NO_TRANSFORM_AND_CHECK", payload: e.target.value }),
4742
+ onBlur: (e) => {
4743
+ if (e.target.value === path.prevValue) return;
4744
+ dispatchPath({ type: "DEFAULT", payload: e.target.value });
4745
+ }
4746
+ }
4747
+ )
4748
+ ] }),
4749
+ /* @__PURE__ */ jsx(URLInfo, { validationState, replacement })
4750
+ ] }) })
4751
+ ] }) });
4752
+ }
4753
+ if (availableEntities && availableEntities.length === 0) {
4754
+ return /* @__PURE__ */ jsx(
4755
+ NavModal,
4756
+ {
4757
+ confirmText: formatMessage({ id: getTranslation("add"), defaultMessage: "Add" }),
4758
+ closeText: formatMessage({ id: getTranslation("cancel"), defaultMessage: "Cancel" }),
4759
+ titleText: formatMessage({ id: getTranslation("modal.internalItem.titleText.create"), defaultMessage: "Add new navigation item" }),
4760
+ footer: /* @__PURE__ */ jsx(Fragment, {}),
4761
+ children: /* @__PURE__ */ jsx(FullLoader, { height: 50 })
4762
+ }
4763
+ );
4764
+ }
4693
4765
  return /* @__PURE__ */ jsxs(
4694
4766
  NavModal,
4695
4767
  {
@@ -4760,53 +4832,7 @@ function ItemCreateComponent({
4760
4832
  ] }),
4761
4833
  selectedEntity && selectedContentType && /* @__PURE__ */ jsxs(Fragment, { children: [
4762
4834
  /* @__PURE__ */ jsx(Box, { paddingBottom: 6, paddingTop: 6, children: /* @__PURE__ */ jsx(Divider, {}) }),
4763
- /* @__PURE__ */ jsxs(Grid.Root, { gap: 4, paddingBottom: 6, children: [
4764
- /* @__PURE__ */ jsx(Grid.Item, { col: 6, s: 12, alignItems: "baseline", children: /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(Field.Root, { children: [
4765
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
4766
- id: getTranslation("modal.item.titleField.label"),
4767
- defaultMessage: "Title"
4768
- }) }),
4769
- /* @__PURE__ */ jsx(
4770
- Field.Input,
4771
- {
4772
- placeholder: formatMessage({
4773
- id: getTranslation("modal.item.titleField.placeholder"),
4774
- defaultMessage: "e.g. About us"
4775
- }),
4776
- name: "title",
4777
- value: navItemState.title || "",
4778
- onChange: (e) => dispatchItemState({ type: "SET_TITLE", payload: e.target.value }),
4779
- required: true
4780
- }
4781
- )
4782
- ] }) }) }),
4783
- /* @__PURE__ */ jsx(Grid.Item, { col: 6, s: 12, children: /* @__PURE__ */ jsxs(Box, { width: "100%", children: [
4784
- /* @__PURE__ */ jsxs(Field.Root, { children: [
4785
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
4786
- id: getTranslation("modal.item.routeField.label"),
4787
- defaultMessage: "Route"
4788
- }) }),
4789
- /* @__PURE__ */ jsx(
4790
- Field.Input,
4791
- {
4792
- required: true,
4793
- placeholder: formatMessage({
4794
- id: getTranslation("modal.item.routeField.placeholder"),
4795
- defaultMessage: "e.g. about/"
4796
- }),
4797
- name: "slug",
4798
- value: path?.value || "",
4799
- onChange: (e) => dispatchPath({ type: "NO_TRANSFORM_AND_CHECK", payload: e.target.value }),
4800
- onBlur: (e) => {
4801
- if (e.target.value === path.prevValue) return;
4802
- dispatchPath({ type: "DEFAULT", payload: e.target.value });
4803
- }
4804
- }
4805
- )
4806
- ] }),
4807
- /* @__PURE__ */ jsx(URLInfo, { validationState, replacement })
4808
- ] }) })
4809
- ] })
4835
+ /* @__PURE__ */ jsx(ItemDetails, {})
4810
4836
  ] })
4811
4837
  ]
4812
4838
  }
@@ -0,0 +1,246 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const React = require("react");
5
+ const designSystem = require("@strapi/design-system");
6
+ const icons = require("@strapi/icons");
7
+ const index = require("./index-ByU38WNH.js");
8
+ const admin = require("@strapi/strapi/admin");
9
+ require("@strapi/icons/symbols");
10
+ const FullLoader = require("./FullLoader-Cmsf8xS6.js");
11
+ const reactIntl = require("react-intl");
12
+ const reactRouterDom = require("react-router-dom");
13
+ function getRouteType(route) {
14
+ if (route.wrapper) {
15
+ return "wrapper";
16
+ } else if (!route.internal) {
17
+ return "external";
18
+ } else {
19
+ return "internal";
20
+ }
21
+ }
22
+ function TableHeader({
23
+ sortKey,
24
+ handleSort
25
+ }) {
26
+ const { formatMessage } = reactIntl.useIntl();
27
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Thead, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Tr, { children: [
28
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Th, { onClick: () => handleSort("title"), cursor: "pointer", children: [
29
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", children: formatMessage({
30
+ id: index.getTranslation("title"),
31
+ defaultMessage: "Title"
32
+ }) }),
33
+ sortKey === "title" && /* @__PURE__ */ jsxRuntime.jsx(icons.ChevronDown, {})
34
+ ] }),
35
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Th, { onClick: () => handleSort("fullPath"), cursor: "pointer", children: [
36
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", children: formatMessage({
37
+ id: index.getTranslation("route"),
38
+ defaultMessage: "Route"
39
+ }) }),
40
+ sortKey === "fullPath" && /* @__PURE__ */ jsxRuntime.jsx(icons.ChevronDown, {})
41
+ ] }),
42
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Th, { onClick: () => handleSort("type"), cursor: "pointer", children: [
43
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", children: formatMessage({
44
+ id: index.getTranslation("routes.page.column.type"),
45
+ defaultMessage: "Type"
46
+ }) }),
47
+ sortKey === "type" && /* @__PURE__ */ jsxRuntime.jsx(icons.ChevronDown, {})
48
+ ] }),
49
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Th, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { children: formatMessage({
50
+ id: index.getTranslation("actions"),
51
+ defaultMessage: "Actions"
52
+ }) }) })
53
+ ] }) });
54
+ }
55
+ function TableRow({ route }) {
56
+ const { formatMessage } = reactIntl.useIntl();
57
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Tr, { children: [
58
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: route.title }) }),
59
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: route.fullPath }) }),
60
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: formatMessage({
61
+ id: index.getTranslation(`route.type.${getRouteType(route)}`),
62
+ defaultMessage: "-"
63
+ }) }) }),
64
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { gap: 2, justifyContent: "end", children: route.internal && /* @__PURE__ */ jsxRuntime.jsx(
65
+ designSystem.LinkButton,
66
+ {
67
+ variant: "secondary",
68
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.Pencil, {}),
69
+ href: `/admin/content-manager/collection-types/${route.relatedContentType}/${route.relatedDocumentId}`,
70
+ children: formatMessage({
71
+ id: index.getTranslation("edit"),
72
+ defaultMessage: "Edit"
73
+ })
74
+ }
75
+ ) }) })
76
+ ] });
77
+ }
78
+ function PageWrapper({ children }) {
79
+ const { formatMessage } = reactIntl.useIntl();
80
+ return /* @__PURE__ */ jsxRuntime.jsxs(admin.Page.Main, { children: [
81
+ /* @__PURE__ */ jsxRuntime.jsx(
82
+ admin.Layouts.Header,
83
+ {
84
+ title: formatMessage({
85
+ id: index.getTranslation("routes.page.title"),
86
+ defaultMessage: "Routes"
87
+ }),
88
+ subtitle: formatMessage({
89
+ id: index.getTranslation("routes.page.subtitle"),
90
+ defaultMessage: "Overview of all existing routes"
91
+ })
92
+ }
93
+ ),
94
+ /* @__PURE__ */ jsxRuntime.jsx(admin.Layouts.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children }) })
95
+ ] });
96
+ }
97
+ function compareBy(field, direction) {
98
+ if (!field) {
99
+ return () => 0;
100
+ }
101
+ if (field === "type") {
102
+ return (a, b) => {
103
+ const typeA = a.internal ? "internal" : "external";
104
+ const typeB = b.internal ? "internal" : "external";
105
+ return direction === "asc" ? typeA.localeCompare(typeB) : typeB.localeCompare(typeA);
106
+ };
107
+ }
108
+ return (a, b) => {
109
+ const aValue = a[field];
110
+ const bValue = b[field];
111
+ if (typeof aValue === "string" && typeof bValue === "string") {
112
+ return direction === "asc" ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue);
113
+ }
114
+ return 0;
115
+ };
116
+ }
117
+ function SearchInput({
118
+ searchQuery,
119
+ handleSearchChange
120
+ }) {
121
+ const { formatMessage } = reactIntl.useIntl();
122
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Root, { style: { marginBottom: "16px" }, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: 4, s: 12, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { width: "100%", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Root, { children: /* @__PURE__ */ jsxRuntime.jsx(
123
+ designSystem.Field.Input,
124
+ {
125
+ name: "search",
126
+ placeholder: formatMessage({
127
+ id: index.getTranslation("routes.page.searchPlaceholder"),
128
+ defaultMessage: "Search routes"
129
+ }),
130
+ value: searchQuery,
131
+ onChange: handleSearchChange,
132
+ endAction: searchQuery ? /* @__PURE__ */ jsxRuntime.jsx(
133
+ "button",
134
+ {
135
+ type: "button",
136
+ onClick: () => handleSearchChange({ target: { value: "" } }),
137
+ style: { color: "inherit", background: "none", border: "none", cursor: "pointer" },
138
+ "aria-label": "Clear search",
139
+ children: /* @__PURE__ */ jsxRuntime.jsx(icons.Cross, {})
140
+ }
141
+ ) : null
142
+ }
143
+ ) }) }) }) });
144
+ }
145
+ function RouteTable({
146
+ routes,
147
+ sortKey,
148
+ handleSort
149
+ }) {
150
+ const { formatMessage } = reactIntl.useIntl();
151
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Table, { colCount: 4, rowCount: routes.length, children: [
152
+ /* @__PURE__ */ jsxRuntime.jsx(TableHeader, { sortKey, handleSort }),
153
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tbody, { children: routes.length > 0 ? routes.map((route) => /* @__PURE__ */ jsxRuntime.jsx(TableRow, { route }, route.id)) : /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tr, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { colSpan: 4, children: /* @__PURE__ */ jsxRuntime.jsx(
154
+ designSystem.EmptyStateLayout,
155
+ {
156
+ content: formatMessage({
157
+ id: index.getTranslation("routes.page.emptyRoutes"),
158
+ defaultMessage: "No routes found"
159
+ }),
160
+ shadow: false
161
+ }
162
+ ) }) }) })
163
+ ] });
164
+ }
165
+ const Routes = () => {
166
+ const { getRoutes } = index.useApi();
167
+ const { formatMessage } = reactIntl.useIntl();
168
+ const { toggleNotification } = admin.useNotification();
169
+ const [allRoutes, setAllRoutes] = React.useState([]);
170
+ const [routes, setRoutes] = React.useState([]);
171
+ const [loading, setLoading] = React.useState(true);
172
+ const [searchParams, setSearchParams] = reactRouterDom.useSearchParams();
173
+ const initialQuery = searchParams.get("search") || "";
174
+ const [searchQuery, setSearchQuery] = React.useState(initialQuery);
175
+ const [sortKey, setSortKey] = React.useState(void 0);
176
+ const [sortDirection, setSortDirection] = React.useState("asc");
177
+ React.useEffect(() => {
178
+ const query = searchQuery.toLowerCase();
179
+ setRoutes(
180
+ allRoutes.filter(
181
+ (route) => JSON.stringify(route.id).toLowerCase().includes(query) || route.title.toLowerCase().includes(query) || route.fullPath.toLowerCase().includes(query) || route.relatedDocumentId.toLowerCase().includes(query) || route.relatedContentType.toLowerCase().includes(query)
182
+ )
183
+ );
184
+ }, [searchQuery, allRoutes]);
185
+ const debouncedSetSearchParams = React.useMemo(
186
+ () => index.debounce((value) => {
187
+ value ? setSearchParams({ search: value }) : setSearchParams({});
188
+ }, 300),
189
+ [setSearchParams]
190
+ );
191
+ const handleSearchChange = (e) => {
192
+ const value = e.target.value;
193
+ setSearchQuery(value);
194
+ debouncedSetSearchParams(value);
195
+ };
196
+ React.useEffect(() => {
197
+ async function fetchRoutes() {
198
+ try {
199
+ const data = await getRoutes();
200
+ setAllRoutes(data);
201
+ setRoutes(data);
202
+ } catch (err) {
203
+ console.error("Failed to fetch routes:", err);
204
+ toggleNotification({
205
+ type: "danger",
206
+ message: formatMessage({
207
+ id: index.getTranslation("notification.routes.fetchFailed"),
208
+ defaultMessage: "Failed to fetch routes"
209
+ })
210
+ });
211
+ } finally {
212
+ setLoading(false);
213
+ }
214
+ }
215
+ fetchRoutes();
216
+ }, []);
217
+ const handleSort = (key) => {
218
+ setSortDirection((prev) => prev === "asc" ? "desc" : "asc");
219
+ setSortKey(key);
220
+ };
221
+ React.useEffect(() => {
222
+ const sortedRoutes = sortKey ? [...routes].sort(compareBy(sortKey, sortDirection)) : routes;
223
+ setRoutes(sortedRoutes);
224
+ }, [sortKey, sortDirection]);
225
+ if (loading) {
226
+ return /* @__PURE__ */ jsxRuntime.jsx(PageWrapper, { children: /* @__PURE__ */ jsxRuntime.jsx(FullLoader.FullLoader, {}) });
227
+ }
228
+ return /* @__PURE__ */ jsxRuntime.jsxs(PageWrapper, { children: [
229
+ /* @__PURE__ */ jsxRuntime.jsx(
230
+ SearchInput,
231
+ {
232
+ handleSearchChange,
233
+ searchQuery
234
+ }
235
+ ),
236
+ /* @__PURE__ */ jsxRuntime.jsx(
237
+ RouteTable,
238
+ {
239
+ routes,
240
+ sortKey,
241
+ handleSort
242
+ }
243
+ )
244
+ ] });
245
+ };
246
+ exports.default = Routes;
@@ -41,7 +41,7 @@ const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
41
41
  );
42
42
  });
43
43
  };
44
- const version = "0.6.0";
44
+ const version = "0.6.2";
45
45
  const keywords = [];
46
46
  const type = "commonjs";
47
47
  const exports$1 = {
@@ -4077,7 +4077,7 @@ const index = {
4077
4077
  defaultMessage: "Routes"
4078
4078
  },
4079
4079
  Component: async () => {
4080
- const component = await Promise.resolve().then(() => require("./index-DBVU2KOj.js"));
4080
+ const component = await Promise.resolve().then(() => require("./index-BoVX1KF8.js"));
4081
4081
  return { default: component.default };
4082
4082
  },
4083
4083
  permissions: [
@@ -4096,7 +4096,7 @@ const index = {
4096
4096
  defaultMessage: "Navigation"
4097
4097
  },
4098
4098
  Component: async () => {
4099
- const component = await Promise.resolve().then(() => require("./index-BJHlAfrS.js"));
4099
+ const component = await Promise.resolve().then(() => require("./index-dSU20yZ4.js"));
4100
4100
  return { default: component.default };
4101
4101
  },
4102
4102
  permissions: [
@@ -4125,7 +4125,7 @@ const index = {
4125
4125
  Component: async () => {
4126
4126
  return await Promise.resolve().then(() => require(
4127
4127
  /* webpackChunkName: "webatlas-settings-page" */
4128
- "./index-D2CkoDhN.js"
4128
+ "./index-UJ0LQ3Y3.js"
4129
4129
  ));
4130
4130
  },
4131
4131
  permissions: [
@@ -4154,7 +4154,7 @@ const index = {
4154
4154
  return Promise.all(
4155
4155
  locales.map(async (locale) => {
4156
4156
  try {
4157
- const { default: data } = await __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => Promise.resolve().then(() => require("./de-CL1TIZPg.js")), "./translations/en.json": () => Promise.resolve().then(() => require("./en-Du-Ap60j.js")) }), `./translations/${locale}.json`, 3);
4157
+ const { default: data } = await __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => Promise.resolve().then(() => require("./de-BZc1BkzH.js")), "./translations/en.json": () => Promise.resolve().then(() => require("./en-Deg4n_IM.js")) }), `./translations/${locale}.json`, 3);
4158
4158
  return { data, locale };
4159
4159
  } catch {
4160
4160
  return { data: {}, locale };
@@ -23,7 +23,7 @@ const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
23
23
  );
24
24
  });
25
25
  };
26
- const version = "0.6.1";
26
+ const version = "0.7.0";
27
27
  const keywords = [];
28
28
  const type = "commonjs";
29
29
  const exports = {
@@ -4059,7 +4059,7 @@ const index = {
4059
4059
  defaultMessage: "Routes"
4060
4060
  },
4061
4061
  Component: async () => {
4062
- const component = await import("./index-mUDowsKQ.mjs");
4062
+ const component = await import("./index-BEgpEtto.mjs");
4063
4063
  return { default: component.default };
4064
4064
  },
4065
4065
  permissions: [
@@ -4078,7 +4078,7 @@ const index = {
4078
4078
  defaultMessage: "Navigation"
4079
4079
  },
4080
4080
  Component: async () => {
4081
- const component = await import("./index-C2V-ZFHK.mjs");
4081
+ const component = await import("./index-B6MYtu3A.mjs");
4082
4082
  return { default: component.default };
4083
4083
  },
4084
4084
  permissions: [
@@ -4107,7 +4107,7 @@ const index = {
4107
4107
  Component: async () => {
4108
4108
  return await import(
4109
4109
  /* webpackChunkName: "webatlas-settings-page" */
4110
- "./index-DYKhGn15.mjs"
4110
+ "./index-BPhRQoGD.mjs"
4111
4111
  );
4112
4112
  },
4113
4113
  permissions: [
@@ -4136,7 +4136,7 @@ const index = {
4136
4136
  return Promise.all(
4137
4137
  locales.map(async (locale) => {
4138
4138
  try {
4139
- const { default: data } = await __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => import("./de-CzVD4dbZ.mjs"), "./translations/en.json": () => import("./en-Nk6QcTdr.mjs") }), `./translations/${locale}.json`, 3);
4139
+ const { default: data } = await __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => import("./de-oxxH8hft.mjs"), "./translations/en.json": () => import("./en-DqC5aDzA.mjs") }), `./translations/${locale}.json`, 3);
4140
4140
  return { data, locale };
4141
4141
  } catch {
4142
4142
  return { data: {}, locale };
@@ -4158,4 +4158,4 @@ export {
4158
4158
  transformToUrl as t,
4159
4159
  useApi as u
4160
4160
  };
4161
- //# sourceMappingURL=index-JVvkmiKE.mjs.map
4161
+ //# sourceMappingURL=index-CZ5qsGXH.mjs.map