@mattisvensson/strapi-plugin-webatlas 0.6.2 → 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/dist/_chunks/{de-CL1TIZPg.js → de-BZc1BkzH.js} +4 -1
  2. package/dist/_chunks/{de-CL1TIZPg.js.map → de-BZc1BkzH.js.map} +1 -1
  3. package/dist/_chunks/{de-CzVD4dbZ.mjs → de-oxxH8hft.mjs} +4 -1
  4. package/dist/_chunks/{de-CzVD4dbZ.mjs.map → de-oxxH8hft.mjs.map} +1 -1
  5. package/dist/_chunks/{en-Du-Ap60j.js → en-Deg4n_IM.js} +4 -1
  6. package/dist/_chunks/{en-Du-Ap60j.js.map → en-Deg4n_IM.js.map} +1 -1
  7. package/dist/_chunks/{en-Nk6QcTdr.mjs → en-DqC5aDzA.mjs} +4 -1
  8. package/dist/_chunks/{en-Nk6QcTdr.mjs.map → en-DqC5aDzA.mjs.map} +1 -1
  9. package/dist/_chunks/{index-C4-VBSgi.mjs → index-B6MYtu3A.mjs} +11 -6
  10. package/dist/_chunks/index-B6MYtu3A.mjs.map +1 -0
  11. package/dist/_chunks/index-BEgpEtto.mjs +247 -0
  12. package/dist/_chunks/index-BEgpEtto.mjs.map +1 -0
  13. package/dist/_chunks/{index-Z3yKckP0.js → index-BOEv4jIJ.js} +6 -6
  14. package/dist/_chunks/{index-Z3yKckP0.js.map → index-BOEv4jIJ.js.map} +1 -1
  15. package/dist/_chunks/{index-CC1UR_w8.mjs → index-BPhRQoGD.mjs} +2 -2
  16. package/dist/_chunks/{index-CC1UR_w8.mjs.map → index-BPhRQoGD.mjs.map} +1 -1
  17. package/dist/_chunks/index-BdlPAWj6.mjs +246 -0
  18. package/dist/_chunks/index-Bg96TqDm.js +247 -0
  19. package/dist/_chunks/index-Bg96TqDm.js.map +1 -0
  20. package/dist/_chunks/{index-B9OfSpne.mjs → index-BgzZLDPv.mjs} +10 -5
  21. package/dist/_chunks/index-BoVX1KF8.js +246 -0
  22. package/dist/_chunks/{index-Ch8tSWp4.js → index-ByU38WNH.js} +5 -5
  23. package/dist/_chunks/{index-iF1y6Mhe.mjs → index-CZ5qsGXH.mjs} +6 -6
  24. package/dist/_chunks/{index-iF1y6Mhe.mjs.map → index-CZ5qsGXH.mjs.map} +1 -1
  25. package/dist/_chunks/{index-BPIdov2N.mjs → index-D3xDvB4d.mjs} +5 -5
  26. package/dist/_chunks/{index-13yB9fna.mjs → index-DKdAgBbF.mjs} +1 -1
  27. package/dist/_chunks/{index-BDoljrOj.js → index-D_QCV5Z5.js} +2 -2
  28. package/dist/_chunks/{index-BDoljrOj.js.map → index-D_QCV5Z5.js.map} +1 -1
  29. package/dist/_chunks/{index-CjA6bLGU.js → index-UJ0LQ3Y3.js} +1 -1
  30. package/dist/_chunks/{index-Bw2Yq-Hx.js → index-dSU20yZ4.js} +10 -5
  31. package/dist/_chunks/{index-D1zlwukG.js → index-mObQ5NXj.js} +11 -6
  32. package/dist/_chunks/index-mObQ5NXj.js.map +1 -0
  33. package/dist/admin/index.js +1 -1
  34. package/dist/admin/index.mjs +1 -1
  35. package/dist/admin/src/pages/Routes/TableHeader.d.ts +5 -1
  36. package/dist/admin/src/pages/Routes/compareBy.d.ts +2 -0
  37. package/dist/server/index.js +1 -1
  38. package/dist/server/index.mjs +1 -1
  39. package/package.json +1 -1
  40. package/dist/_chunks/EmptyBox-BM4IscSk.mjs +0 -13
  41. package/dist/_chunks/EmptyBox-BM4IscSk.mjs.map +0 -1
  42. package/dist/_chunks/EmptyBox-T8t29l25.js +0 -12
  43. package/dist/_chunks/EmptyBox-T8t29l25.js.map +0 -1
  44. package/dist/_chunks/index-AIXu4HZz.mjs +0 -127
  45. package/dist/_chunks/index-AIXu4HZz.mjs.map +0 -1
  46. package/dist/_chunks/index-BOF-1QDH.js +0 -127
  47. package/dist/_chunks/index-BOF-1QDH.js.map +0 -1
  48. package/dist/_chunks/index-BluRjThy.mjs +0 -126
  49. package/dist/_chunks/index-C4-VBSgi.mjs.map +0 -1
  50. package/dist/_chunks/index-D1zlwukG.js.map +0 -1
  51. package/dist/_chunks/index-DeNZkmpv.js +0 -126
@@ -0,0 +1,247 @@
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { useState, useEffect, useMemo } from "react";
3
+ import { Thead, Tr, Th, Typography, VisuallyHidden, Td, Flex, LinkButton, Grid, Box, Field, Table, Tbody, EmptyStateLayout } from "@strapi/design-system";
4
+ import { ChevronDown, Pencil, Cross } from "@strapi/icons";
5
+ import { g as getTranslation, u as useApi, d as debounce } from "./index-CZ5qsGXH.mjs";
6
+ import { Page, Layouts, useNotification } from "@strapi/strapi/admin";
7
+ import "@strapi/icons/symbols";
8
+ import { F as FullLoader } from "./FullLoader-CrPED_dY.mjs";
9
+ import { useIntl } from "react-intl";
10
+ import { useSearchParams } from "react-router-dom";
11
+ function getRouteType(route) {
12
+ if (route.wrapper) {
13
+ return "wrapper";
14
+ } else if (!route.internal) {
15
+ return "external";
16
+ } else {
17
+ return "internal";
18
+ }
19
+ }
20
+ function TableHeader({
21
+ sortKey,
22
+ handleSort
23
+ }) {
24
+ const { formatMessage } = useIntl();
25
+ return /* @__PURE__ */ jsx(Thead, { children: /* @__PURE__ */ jsxs(Tr, { children: [
26
+ /* @__PURE__ */ jsxs(Th, { onClick: () => handleSort("title"), cursor: "pointer", children: [
27
+ /* @__PURE__ */ jsx(Typography, { variant: "sigma", children: formatMessage({
28
+ id: getTranslation("title"),
29
+ defaultMessage: "Title"
30
+ }) }),
31
+ sortKey === "title" && /* @__PURE__ */ jsx(ChevronDown, {})
32
+ ] }),
33
+ /* @__PURE__ */ jsxs(Th, { onClick: () => handleSort("fullPath"), cursor: "pointer", children: [
34
+ /* @__PURE__ */ jsx(Typography, { variant: "sigma", children: formatMessage({
35
+ id: getTranslation("route"),
36
+ defaultMessage: "Route"
37
+ }) }),
38
+ sortKey === "fullPath" && /* @__PURE__ */ jsx(ChevronDown, {})
39
+ ] }),
40
+ /* @__PURE__ */ jsxs(Th, { onClick: () => handleSort("type"), cursor: "pointer", children: [
41
+ /* @__PURE__ */ jsx(Typography, { variant: "sigma", children: formatMessage({
42
+ id: getTranslation("routes.page.column.type"),
43
+ defaultMessage: "Type"
44
+ }) }),
45
+ sortKey === "type" && /* @__PURE__ */ jsx(ChevronDown, {})
46
+ ] }),
47
+ /* @__PURE__ */ jsx(Th, { children: /* @__PURE__ */ jsx(VisuallyHidden, { children: formatMessage({
48
+ id: getTranslation("actions"),
49
+ defaultMessage: "Actions"
50
+ }) }) })
51
+ ] }) });
52
+ }
53
+ function TableRow({ route }) {
54
+ const { formatMessage } = useIntl();
55
+ return /* @__PURE__ */ jsxs(Tr, { children: [
56
+ /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", children: route.title }) }),
57
+ /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", children: route.fullPath }) }),
58
+ /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", children: formatMessage({
59
+ id: getTranslation(`route.type.${getRouteType(route)}`),
60
+ defaultMessage: "-"
61
+ }) }) }),
62
+ /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Flex, { gap: 2, justifyContent: "end", children: route.internal && /* @__PURE__ */ jsx(
63
+ LinkButton,
64
+ {
65
+ variant: "secondary",
66
+ startIcon: /* @__PURE__ */ jsx(Pencil, {}),
67
+ href: `/admin/content-manager/collection-types/${route.relatedContentType}/${route.relatedDocumentId}`,
68
+ children: formatMessage({
69
+ id: getTranslation("edit"),
70
+ defaultMessage: "Edit"
71
+ })
72
+ }
73
+ ) }) })
74
+ ] });
75
+ }
76
+ function PageWrapper({ children }) {
77
+ const { formatMessage } = useIntl();
78
+ return /* @__PURE__ */ jsxs(Page.Main, { children: [
79
+ /* @__PURE__ */ jsx(
80
+ Layouts.Header,
81
+ {
82
+ title: formatMessage({
83
+ id: getTranslation("routes.page.title"),
84
+ defaultMessage: "Routes"
85
+ }),
86
+ subtitle: formatMessage({
87
+ id: getTranslation("routes.page.subtitle"),
88
+ defaultMessage: "Overview of all existing routes"
89
+ })
90
+ }
91
+ ),
92
+ /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsx(Fragment, { children }) })
93
+ ] });
94
+ }
95
+ function compareBy(field, direction) {
96
+ if (!field) {
97
+ return () => 0;
98
+ }
99
+ if (field === "type") {
100
+ return (a, b) => {
101
+ const typeA = a.internal ? "internal" : "external";
102
+ const typeB = b.internal ? "internal" : "external";
103
+ return direction === "asc" ? typeA.localeCompare(typeB) : typeB.localeCompare(typeA);
104
+ };
105
+ }
106
+ return (a, b) => {
107
+ const aValue = a[field];
108
+ const bValue = b[field];
109
+ if (typeof aValue === "string" && typeof bValue === "string") {
110
+ return direction === "asc" ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue);
111
+ }
112
+ return 0;
113
+ };
114
+ }
115
+ function SearchInput({
116
+ searchQuery,
117
+ handleSearchChange
118
+ }) {
119
+ const { formatMessage } = useIntl();
120
+ return /* @__PURE__ */ jsx(Grid.Root, { style: { marginBottom: "16px" }, children: /* @__PURE__ */ jsx(Grid.Item, { col: 4, s: 12, children: /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(Field.Root, { children: /* @__PURE__ */ jsx(
121
+ Field.Input,
122
+ {
123
+ name: "search",
124
+ placeholder: formatMessage({
125
+ id: getTranslation("routes.page.searchPlaceholder"),
126
+ defaultMessage: "Search routes"
127
+ }),
128
+ value: searchQuery,
129
+ onChange: handleSearchChange,
130
+ endAction: searchQuery ? /* @__PURE__ */ jsx(
131
+ "button",
132
+ {
133
+ type: "button",
134
+ onClick: () => handleSearchChange({ target: { value: "" } }),
135
+ style: { color: "inherit", background: "none", border: "none", cursor: "pointer" },
136
+ "aria-label": "Clear search",
137
+ children: /* @__PURE__ */ jsx(Cross, {})
138
+ }
139
+ ) : null
140
+ }
141
+ ) }) }) }) });
142
+ }
143
+ function RouteTable({
144
+ routes,
145
+ sortKey,
146
+ handleSort
147
+ }) {
148
+ const { formatMessage } = useIntl();
149
+ return /* @__PURE__ */ jsxs(Table, { colCount: 4, rowCount: routes.length, children: [
150
+ /* @__PURE__ */ jsx(TableHeader, { sortKey, handleSort }),
151
+ /* @__PURE__ */ jsx(Tbody, { children: routes.length > 0 ? routes.map((route) => /* @__PURE__ */ jsx(TableRow, { route }, route.id)) : /* @__PURE__ */ jsx(Tr, { children: /* @__PURE__ */ jsx(Td, { colSpan: 4, children: /* @__PURE__ */ jsx(
152
+ EmptyStateLayout,
153
+ {
154
+ content: formatMessage({
155
+ id: getTranslation("routes.page.emptyRoutes"),
156
+ defaultMessage: "No routes found"
157
+ }),
158
+ shadow: false
159
+ }
160
+ ) }) }) })
161
+ ] });
162
+ }
163
+ const Routes = () => {
164
+ const { getRoutes } = useApi();
165
+ const { formatMessage } = useIntl();
166
+ const { toggleNotification } = useNotification();
167
+ const [allRoutes, setAllRoutes] = useState([]);
168
+ const [routes, setRoutes] = useState([]);
169
+ const [loading, setLoading] = useState(true);
170
+ const [searchParams, setSearchParams] = useSearchParams();
171
+ const initialQuery = searchParams.get("search") || "";
172
+ const [searchQuery, setSearchQuery] = useState(initialQuery);
173
+ const [sortKey, setSortKey] = useState(void 0);
174
+ const [sortDirection, setSortDirection] = useState("asc");
175
+ useEffect(() => {
176
+ const query = searchQuery.toLowerCase();
177
+ setRoutes(
178
+ allRoutes.filter(
179
+ (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)
180
+ )
181
+ );
182
+ }, [searchQuery, allRoutes]);
183
+ const debouncedSetSearchParams = useMemo(
184
+ () => debounce((value) => {
185
+ value ? setSearchParams({ search: value }) : setSearchParams({});
186
+ }, 300),
187
+ [setSearchParams]
188
+ );
189
+ const handleSearchChange = (e) => {
190
+ const value = e.target.value;
191
+ setSearchQuery(value);
192
+ debouncedSetSearchParams(value);
193
+ };
194
+ useEffect(() => {
195
+ async function fetchRoutes() {
196
+ try {
197
+ const data = await getRoutes();
198
+ setAllRoutes(data);
199
+ setRoutes(data);
200
+ } catch (err) {
201
+ console.error("Failed to fetch routes:", err);
202
+ toggleNotification({
203
+ type: "danger",
204
+ message: formatMessage({
205
+ id: getTranslation("notification.routes.fetchFailed"),
206
+ defaultMessage: "Failed to fetch routes"
207
+ })
208
+ });
209
+ } finally {
210
+ setLoading(false);
211
+ }
212
+ }
213
+ fetchRoutes();
214
+ }, []);
215
+ const handleSort = (key) => {
216
+ setSortDirection((prev) => prev === "asc" ? "desc" : "asc");
217
+ setSortKey(key);
218
+ };
219
+ useEffect(() => {
220
+ const sortedRoutes = sortKey ? [...routes].sort(compareBy(sortKey, sortDirection)) : routes;
221
+ setRoutes(sortedRoutes);
222
+ }, [sortKey, sortDirection]);
223
+ if (loading) {
224
+ return /* @__PURE__ */ jsx(PageWrapper, { children: /* @__PURE__ */ jsx(FullLoader, {}) });
225
+ }
226
+ return /* @__PURE__ */ jsxs(PageWrapper, { children: [
227
+ /* @__PURE__ */ jsx(
228
+ SearchInput,
229
+ {
230
+ handleSearchChange,
231
+ searchQuery
232
+ }
233
+ ),
234
+ /* @__PURE__ */ jsx(
235
+ RouteTable,
236
+ {
237
+ routes,
238
+ sortKey,
239
+ handleSort
240
+ }
241
+ )
242
+ ] });
243
+ };
244
+ export {
245
+ Routes as default
246
+ };
247
+ //# sourceMappingURL=index-BEgpEtto.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-BEgpEtto.mjs","sources":["../../admin/src/utils/getRouteType.ts","../../admin/src/pages/Routes/TableHeader.tsx","../../admin/src/pages/Routes/TableRow.tsx","../../admin/src/pages/Routes/PageWrapper.tsx","../../admin/src/pages/Routes/compareBy.ts","../../admin/src/pages/Routes/index.tsx"],"sourcesContent":["import type { Route } from \"../../../types\";\n\nexport default function getRouteType(route: Route): 'internal' | 'external' | 'wrapper' {\n if (route.wrapper) {\n return 'wrapper';\n } else if (!route.internal) {\n return 'external';\n } else {\n return 'internal';\n }\n}","import type { RouteSortKey } from '../../../../types';\nimport { Typography, Thead, Tr, Th, VisuallyHidden } from '@strapi/design-system';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\nimport { ChevronDown } from '@strapi/icons';\n\nexport default function TableHeader({\n sortKey,\n handleSort\n}: {\n sortKey: RouteSortKey,\n handleSort: (key: RouteSortKey) => void\n}) {\n const { formatMessage } = useIntl();\n\n return (\n <Thead>\n <Tr>\n <Th onClick={() => handleSort('title')} cursor=\"pointer\">\n <Typography variant=\"sigma\">\n {formatMessage({\n id: getTranslation('title'),\n defaultMessage: 'Title',\n })}\n </Typography>\n {sortKey === 'title' && <ChevronDown />}\n </Th>\n <Th onClick={() => handleSort('fullPath')} cursor=\"pointer\">\n <Typography variant=\"sigma\">\n {formatMessage({\n id: getTranslation('route'),\n defaultMessage: 'Route',\n })}\n </Typography>\n {sortKey === 'fullPath' && <ChevronDown />}\n </Th>\n <Th onClick={() => handleSort('type')} cursor=\"pointer\">\n <Typography variant=\"sigma\">\n {formatMessage({\n id: getTranslation('routes.page.column.type'),\n defaultMessage: 'Type',\n })}\n </Typography>\n {sortKey === 'type' && <ChevronDown />}\n </Th>\n <Th>\n <VisuallyHidden>\n {formatMessage({\n id: getTranslation('actions'),\n defaultMessage: 'Actions',\n })}\n </VisuallyHidden>\n </Th>\n </Tr>\n </Thead>\n )\n}","import type { Route } from '../../../../types';\nimport { Typography, Tr, Td, Flex, LinkButton } from '@strapi/design-system';\nimport { getTranslation, getRouteType } from '../../utils';\nimport { useIntl } from 'react-intl';\nimport { Pencil } from '@strapi/icons';\n\nexport default function TableRow({ route }: { route: Route }) {\n const { formatMessage } = useIntl();\n \n return (\n <Tr>\n <Td>\n <Typography textColor=\"neutral800\">{route.title}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">{route.fullPath}</Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">\n {formatMessage({\n id: getTranslation(`route.type.${getRouteType(route)}`),\n defaultMessage: '-',\n })}\n </Typography>\n </Td>\n <Td>\n <Flex gap={2} justifyContent=\"end\">\n {route.internal && \n <LinkButton\n variant=\"secondary\"\n startIcon={<Pencil />} \n href={`/admin/content-manager/collection-types/${route.relatedContentType}/${route.relatedDocumentId}`}\n >\n {formatMessage({\n id: getTranslation('edit'),\n defaultMessage: 'Edit',\n })}\n </LinkButton>\n }\n </Flex>\n </Td>\n </Tr>\n )\n}","import { Layouts, Page } from '@strapi/strapi/admin';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\n\nexport default function PageWrapper({ children }: { children: React.ReactNode }) {\n const { formatMessage } = useIntl();\n\n return (\n <Page.Main>\n <Layouts.Header\n title={formatMessage({\n id: getTranslation('routes.page.title'),\n defaultMessage: 'Routes',\n })}\n subtitle={formatMessage({\n id: getTranslation('routes.page.subtitle'),\n defaultMessage: 'Overview of all existing routes',\n })}\n />\n <Layouts.Content>\n <>\n {children}\n </>\n </Layouts.Content>\n </Page.Main>\n );\n}","import type { Route, RouteSortKey } from '../../../../types';\n\nexport default function compareBy(field: RouteSortKey, direction: 'asc' | 'desc') {\n if (!field) {\n return () => 0;\n }\n if (field === 'type') {\n return (a: Route, b: Route) => {\n const typeA = a.internal ? 'internal' : 'external';\n const typeB = b.internal ? 'internal' : 'external';\n return direction === 'asc'\n ? typeA.localeCompare(typeB)\n : typeB.localeCompare(typeA);\n };\n }\n return (a: Route, b: Route) => {\n const aValue = a[field];\n const bValue = b[field];\n if (typeof aValue === 'string' && typeof bValue === 'string') {\n return direction === 'asc'\n ? aValue.localeCompare(bValue)\n : bValue.localeCompare(aValue);\n }\n return 0;\n };\n}","/*\n *\n * Routes\n * This file contains the Routes page of the Webatlas plugin for Strapi.\n * It displays a table of all existing routes with their details and allows editing.\n *\n*/\n\nimport type { Route, RouteSortKey } from '../../../../types';\nimport { useState, useEffect } from 'react';\nimport { Table, Tbody, Box, Grid, Field, EmptyStateLayout, Tr, Td } from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { useApi } from '../../hooks';\nimport { FullLoader } from '../../components/UI';\nimport { getTranslation } from '../../utils';\nimport { useIntl } from 'react-intl';\nimport TableHeader from './TableHeader';\nimport TableRow from './TableRow';\nimport { useNotification } from '@strapi/strapi/admin'\nimport PageWrapper from './PageWrapper';\nimport { useSearchParams } from 'react-router-dom';\nimport debounce from '../../utils/debounce';\nimport { useMemo } from 'react';\nimport compareBy from './compareBy';\n\nfunction SearchInput({\n searchQuery,\n handleSearchChange\n}: {\n searchQuery: string;\n handleSearchChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n}) {\n\n const { formatMessage } = useIntl();\n\n return (\n <Grid.Root style={{ marginBottom: '16px' }}>\n <Grid.Item col={4} s={12}>\n <Box width=\"100%\">\n <Field.Root>\n <Field.Input\n name=\"search\"\n placeholder={formatMessage({\n id: getTranslation('routes.page.searchPlaceholder'),\n defaultMessage: 'Search routes',\n })}\n value={searchQuery}\n onChange={handleSearchChange}\n endAction={\n searchQuery ? (\n <button\n type=\"button\"\n onClick={() => handleSearchChange({ target: { value: '' } } as React.ChangeEvent<HTMLInputElement>)}\n style={{ color: 'inherit', background: 'none', border: 'none', cursor: 'pointer' }}\n aria-label=\"Clear search\"\n >\n <Cross />\n </button>\n ) : null\n }\n />\n </Field.Root>\n </Box>\n </Grid.Item>\n </Grid.Root>\n );\n}\n\nfunction RouteTable({\n routes, \n sortKey, \n handleSort\n}: { \n routes: Route[], \n sortKey: RouteSortKey, \n handleSort: (key: RouteSortKey) => void\n}) {\n \n const { formatMessage } = useIntl();\n\n return (\n <Table colCount={4} rowCount={routes.length}>\n <TableHeader sortKey={sortKey} handleSort={handleSort} />\n <Tbody>\n {routes.length > 0 ? routes.map((route: Route) => (\n <TableRow key={route.id} route={route} />\n )) : \n <Tr>\n <Td colSpan={4}>\n <EmptyStateLayout \n content={\n formatMessage({\n id: getTranslation('routes.page.emptyRoutes'),\n defaultMessage: 'No routes found',\n })\n } \n shadow={false}\n />\n </Td>\n </Tr>\n }\n </Tbody>\n </Table>\n )\n}\n\nconst Routes = () => {\n const { getRoutes } = useApi();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n \n const [allRoutes, setAllRoutes] = useState<Route[]>([]);\n const [routes, setRoutes] = useState<Route[]>([]);\n const [loading, setLoading] = useState(true);\n const [searchParams, setSearchParams] = useSearchParams();\n const initialQuery = searchParams.get('search') || '';\n const [searchQuery, setSearchQuery] = useState(initialQuery);\n const [sortKey, setSortKey] = useState<RouteSortKey>(undefined);\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc');\n\n useEffect(() => {\n const query = searchQuery.toLowerCase()\n setRoutes(\n allRoutes.filter((route) =>\n JSON.stringify(route.id).toLowerCase().includes(query) ||\n route.title.toLowerCase().includes(query) ||\n route.fullPath.toLowerCase().includes(query) ||\n route.relatedDocumentId.toLowerCase().includes(query) ||\n route.relatedContentType.toLowerCase().includes(query)\n )\n )\n }, [searchQuery, allRoutes]);\n\n const debouncedSetSearchParams = useMemo(() =>\n debounce((value: string) => {\n value\n ? setSearchParams({ search: value })\n : setSearchParams({});\n }, 300),\n [setSearchParams]);\n\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setSearchQuery(value);\n debouncedSetSearchParams(value);\n }\n\n useEffect(() => {\n async function fetchRoutes() {\n try {\n const data = await getRoutes();\n setAllRoutes(data);\n setRoutes(data);\n } catch (err) {\n console.error('Failed to fetch routes:', err);\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTranslation('notification.routes.fetchFailed'),\n defaultMessage: 'Failed to fetch routes',\n }),\n });\n } finally {\n setLoading(false);\n }\n }\n fetchRoutes();\n }, [])\n\n const handleSort = (key: RouteSortKey) => {\n setSortDirection(prev => (prev === 'asc' ? 'desc' : 'asc'));\n setSortKey(key);\n };\n\n useEffect(() => {\n const sortedRoutes = sortKey\n ? [...routes].sort(compareBy(sortKey, sortDirection))\n : routes; \n setRoutes(sortedRoutes);\n }, [sortKey, sortDirection]);\n\n if (loading) {\n return <PageWrapper>\n <FullLoader />\n </PageWrapper>\n }\n\n return (\n <PageWrapper>\n <SearchInput\n handleSearchChange={handleSearchChange}\n searchQuery={searchQuery}\n />\n <RouteTable\n routes={routes} \n sortKey={sortKey}\n handleSort={handleSort}\n />\n </PageWrapper>\n );\n};\n\nexport default Routes;"],"names":[],"mappings":"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"}
@@ -41,7 +41,7 @@ const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
41
41
  );
42
42
  });
43
43
  };
44
- const version = "0.6.2";
44
+ const version = "0.7.0";
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-BOF-1QDH.js"));
4080
+ const component = await Promise.resolve().then(() => require("./index-Bg96TqDm.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-D1zlwukG.js"));
4099
+ const component = await Promise.resolve().then(() => require("./index-mObQ5NXj.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-BDoljrOj.js"
4128
+ "./index-D_QCV5Z5.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 };
@@ -4174,4 +4174,4 @@ exports.transformToUrl = transformToUrl;
4174
4174
  exports.useAllContentTypes = useAllContentTypes;
4175
4175
  exports.useApi = useApi;
4176
4176
  exports.usePluginConfig = usePluginConfig;
4177
- //# sourceMappingURL=index-Z3yKckP0.js.map
4177
+ //# sourceMappingURL=index-BOEv4jIJ.js.map