@strapi/content-manager 5.35.0 → 5.36.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 (81) hide show
  1. package/dist/admin/components/ActionsDrawer.js +5 -1
  2. package/dist/admin/components/ActionsDrawer.js.map +1 -1
  3. package/dist/admin/components/ActionsDrawer.mjs +5 -2
  4. package/dist/admin/components/ActionsDrawer.mjs.map +1 -1
  5. package/dist/admin/components/LeftMenu.js +1 -28
  6. package/dist/admin/components/LeftMenu.js.map +1 -1
  7. package/dist/admin/components/LeftMenu.mjs +2 -29
  8. package/dist/admin/components/LeftMenu.mjs.map +1 -1
  9. package/dist/admin/history/components/VersionContent.js +74 -59
  10. package/dist/admin/history/components/VersionContent.js.map +1 -1
  11. package/dist/admin/history/components/VersionContent.mjs +75 -60
  12. package/dist/admin/history/components/VersionContent.mjs.map +1 -1
  13. package/dist/admin/history/components/VersionsList.js +139 -54
  14. package/dist/admin/history/components/VersionsList.js.map +1 -1
  15. package/dist/admin/history/components/VersionsList.mjs +141 -56
  16. package/dist/admin/history/components/VersionsList.mjs.map +1 -1
  17. package/dist/admin/history/pages/History.js +27 -9
  18. package/dist/admin/history/pages/History.js.map +1 -1
  19. package/dist/admin/history/pages/History.mjs +28 -10
  20. package/dist/admin/history/pages/History.mjs.map +1 -1
  21. package/dist/admin/hooks/useDocument.js +1 -1
  22. package/dist/admin/hooks/useDocument.js.map +1 -1
  23. package/dist/admin/hooks/useDocument.mjs +1 -1
  24. package/dist/admin/hooks/useDocument.mjs.map +1 -1
  25. package/dist/admin/hooks/usePersistentQueryParams.js +56 -0
  26. package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -0
  27. package/dist/admin/hooks/usePersistentQueryParams.mjs +54 -0
  28. package/dist/admin/hooks/usePersistentQueryParams.mjs.map +1 -0
  29. package/dist/admin/pages/EditView/EditViewPage.js +10 -3
  30. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  31. package/dist/admin/pages/EditView/EditViewPage.mjs +11 -4
  32. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  33. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +10 -6
  34. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  35. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +11 -7
  36. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +8 -2
  38. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  39. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +8 -2
  40. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  41. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/AddComponentButton.js +9 -1
  42. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/AddComponentButton.js.map +1 -1
  43. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/AddComponentButton.mjs +9 -1
  44. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/AddComponentButton.mjs.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +7 -2
  46. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +7 -2
  48. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js +30 -11
  50. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js.map +1 -1
  51. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs +31 -12
  52. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs.map +1 -1
  53. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +4 -4
  54. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  55. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +4 -4
  56. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  57. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +4 -1
  58. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  59. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +4 -1
  60. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  61. package/dist/admin/pages/EditView/components/FormLayout.js +6 -9
  62. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormLayout.mjs +6 -9
  64. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  65. package/dist/admin/pages/EditView/components/Header.js +2 -0
  66. package/dist/admin/pages/EditView/components/Header.js.map +1 -1
  67. package/dist/admin/pages/EditView/components/Header.mjs +2 -0
  68. package/dist/admin/pages/EditView/components/Header.mjs.map +1 -1
  69. package/dist/admin/pages/ListView/ListViewPage.js +50 -18
  70. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  71. package/dist/admin/pages/ListView/ListViewPage.mjs +51 -19
  72. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  73. package/dist/admin/src/components/ActionsDrawer.d.ts +17 -1
  74. package/dist/admin/src/hooks/usePersistentQueryParams.d.ts +5 -0
  75. package/dist/server/preview/services/preview.js +1 -1
  76. package/dist/server/preview/services/preview.js.map +1 -1
  77. package/dist/server/preview/services/preview.mjs +1 -1
  78. package/dist/server/preview/services/preview.mjs.map +1 -1
  79. package/dist/server/src/preview/services/index.d.ts +1 -1
  80. package/dist/server/src/preview/utils.d.ts +1 -1
  81. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"VersionsList.mjs","sources":["../../../../admin/src/history/components/VersionsList.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\n\nimport { RelativeTime } from '../../components/RelativeTime';\nimport { DocumentStatus } from '../../pages/EditView/components/DocumentStatus';\nimport { getDisplayName } from '../../utils/users';\nimport { useHistoryContext } from '../pages/History';\n\nimport type { HistoryVersions } from '../../../../shared/contracts';\n\n/* -------------------------------------------------------------------------------------------------\n * BlueText\n * -----------------------------------------------------------------------------------------------*/\n\nconst BlueText = (children: React.ReactNode) => (\n <Typography textColor=\"primary600\" variant=\"pi\">\n {children}\n </Typography>\n);\n\n/* -------------------------------------------------------------------------------------------------\n * VersionCard\n * -----------------------------------------------------------------------------------------------*/\n\ninterface VersionCardProps {\n version: HistoryVersions.HistoryVersionDataResponse;\n isCurrent: boolean;\n}\n\nconst VersionCard = ({ version, isCurrent }: VersionCardProps) => {\n const { formatDate, formatMessage } = useIntl();\n const [{ query }] = useQueryParams<{ id?: string }>();\n const isActive = query.id === version.id.toString();\n const author = version.createdBy && getDisplayName(version.createdBy);\n\n return (\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n gap={3}\n hasRadius\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderColor={isActive ? 'primary600' : 'neutral200'}\n color=\"neutral800\"\n padding={5}\n tag={Link}\n to={`?${stringify({ ...query, id: version.id })}`}\n style={{ textDecoration: 'none' }}\n >\n <Flex direction=\"column\" gap={1} alignItems=\"flex-start\">\n <Typography tag=\"h3\" fontWeight=\"semiBold\">\n {formatDate(version.createdAt, {\n day: 'numeric',\n month: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })}\n </Typography>\n <Typography tag=\"p\" variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: 'content-manager.history.sidebar.versionDescription',\n defaultMessage:\n '{distanceToNow}{isAnonymous, select, true {} other { by {author}}}{isCurrent, select, true { <b>(current)</b>} other {}}',\n },\n {\n distanceToNow: <RelativeTime timestamp={new Date(version.createdAt)} />,\n author,\n isAnonymous: !Boolean(version.createdBy),\n isCurrent,\n b: BlueText,\n }\n )}\n </Typography>\n </Flex>\n {version.status && <DocumentStatus status={version.status} size=\"XS\" />}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PaginationButton\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PaginationButtonProps {\n page: number;\n children: React.ReactNode;\n}\n\nconst PaginationButton = ({ page, children }: PaginationButtonProps) => {\n const [{ query }] = useQueryParams<{ id?: string }>();\n\n // Remove the id from the pagination link, so that the history page can redirect\n // to the id of the first history version in the new page once it's loaded\n const { id: _id, ...queryRest } = query;\n\n return (\n <Link to={{ search: stringify({ ...queryRest, page }) }} style={{ textDecoration: 'none' }}>\n <Typography variant=\"omega\" textColor=\"primary600\">\n {children}\n </Typography>\n </Link>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * VersionsList\n * -----------------------------------------------------------------------------------------------*/\n\nconst VersionsList = () => {\n const { formatMessage } = useIntl();\n const { versions, page } = useHistoryContext('VersionsList', (state) => ({\n versions: state.versions,\n page: state.page,\n }));\n\n return (\n <Flex\n shrink={0}\n direction=\"column\"\n alignItems=\"stretch\"\n width=\"320px\"\n height=\"100dvh\"\n background=\"neutral0\"\n borderColor=\"neutral200\"\n borderWidth=\"0 0 0 1px\"\n borderStyle=\"solid\"\n tag=\"aside\"\n >\n <Flex\n direction=\"row\"\n justifyContent=\"space-between\"\n padding={4}\n borderColor=\"neutral200\"\n borderWidth=\"0 0 1px\"\n borderStyle=\"solid\"\n tag=\"header\"\n >\n <Typography tag=\"h2\" variant=\"omega\" fontWeight=\"semiBold\">\n {formatMessage({\n id: 'content-manager.history.sidebar.title',\n defaultMessage: 'Versions',\n })}\n </Typography>\n <Box background=\"neutral150\" hasRadius padding={1}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {versions.meta.pagination.total}\n </Typography>\n </Box>\n </Flex>\n <Box flex={1} overflow=\"auto\">\n {versions.meta.pagination.page > 1 && (\n <Box paddingTop={4} textAlign=\"center\">\n <PaginationButton page={page - 1}>\n {formatMessage({\n id: 'content-manager.history.sidebar.show-newer',\n defaultMessage: 'Show newer versions',\n })}\n </PaginationButton>\n </Box>\n )}\n <Flex direction=\"column\" gap={3} padding={4} tag=\"ul\" alignItems=\"stretch\">\n {versions.data.map((version, index) => (\n <li\n key={version.id}\n aria-label={formatMessage({\n id: 'content-manager.history.sidebar.title.version-card.aria-label',\n defaultMessage: 'Version card',\n })}\n >\n <VersionCard version={version} isCurrent={page === 1 && index === 0} />\n </li>\n ))}\n </Flex>\n {versions.meta.pagination.page < versions.meta.pagination.pageCount && (\n <Box paddingBottom={4} textAlign=\"center\">\n <PaginationButton page={page + 1}>\n {formatMessage({\n id: 'content-manager.history.sidebar.show-older',\n defaultMessage: 'Show older versions',\n })}\n </PaginationButton>\n </Box>\n )}\n </Box>\n </Flex>\n );\n};\n\nexport { VersionsList };\n"],"names":["BlueText","children","_jsx","Typography","textColor","variant","VersionCard","version","isCurrent","formatDate","formatMessage","useIntl","query","useQueryParams","isActive","id","toString","author","createdBy","getDisplayName","_jsxs","Flex","direction","alignItems","gap","hasRadius","borderWidth","borderStyle","borderColor","color","padding","tag","Link","to","stringify","style","textDecoration","fontWeight","createdAt","day","month","year","hour","minute","defaultMessage","distanceToNow","RelativeTime","timestamp","Date","isAnonymous","Boolean","b","status","DocumentStatus","size","PaginationButton","page","_id","queryRest","search","VersionsList","versions","useHistoryContext","state","shrink","width","height","background","justifyContent","Box","meta","pagination","total","flex","overflow","paddingTop","textAlign","data","map","index","li","aria-label","pageCount","paddingBottom"],"mappings":"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"}
1
+ {"version":3,"file":"VersionsList.mjs","sources":["../../../../admin/src/history/components/VersionsList.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams, useIsMobile } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\n\nimport { ActionsDrawer, useActionsDrawer } from '../../components/ActionsDrawer';\nimport { RelativeTime } from '../../components/RelativeTime';\nimport { DocumentStatus } from '../../pages/EditView/components/DocumentStatus';\nimport { getDisplayName } from '../../utils/users';\nimport { useHistoryContext } from '../pages/History';\n\nimport type { HistoryVersions } from '../../../../shared/contracts';\n\n/* -------------------------------------------------------------------------------------------------\n * BlueText\n * -----------------------------------------------------------------------------------------------*/\n\nconst BlueText = (children: React.ReactNode) => (\n <Typography textColor=\"primary600\" variant=\"pi\">\n {children}\n </Typography>\n);\n\n/* -------------------------------------------------------------------------------------------------\n * VersionAuthor\n * -----------------------------------------------------------------------------------------------*/\n\nconst VersionAuthor = ({\n version,\n isCurrent,\n}: {\n version: HistoryVersions.HistoryVersionDataResponse;\n isCurrent: boolean;\n}) => {\n const { formatMessage } = useIntl();\n const author = version.createdBy && getDisplayName(version.createdBy);\n return (\n <>\n {formatMessage(\n {\n id: 'content-manager.history.sidebar.versionDescription',\n defaultMessage:\n '{distanceToNow}{isAnonymous, select, true {} other { by {author}}}{isCurrent, select, true { <b>(current)</b>} other {}}',\n },\n {\n distanceToNow: <RelativeTime timestamp={new Date(version.createdAt)} />,\n author,\n isAnonymous: !Boolean(version.createdBy),\n isCurrent,\n b: BlueText,\n }\n )}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * VersionCard\n * -----------------------------------------------------------------------------------------------*/\n\ninterface VersionCardProps {\n version: HistoryVersions.HistoryVersionDataResponse;\n isCurrent: boolean;\n}\n\nconst VersionCard = ({ version, isCurrent }: VersionCardProps) => {\n const { formatDate } = useIntl();\n const [{ query }] = useQueryParams<{ id?: string }>();\n const setIsOpen = useActionsDrawer('VersionCard', (s) => s?.setIsOpen, false);\n const isActive = query.id === version.id.toString();\n\n const handleClick = () => {\n setIsOpen?.(false);\n };\n\n return (\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n gap={3}\n hasRadius\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderColor={isActive ? 'primary600' : 'neutral200'}\n color=\"neutral800\"\n padding={5}\n tag={Link}\n to={`?${stringify({ ...query, id: version.id })}`}\n style={{ textDecoration: 'none' }}\n onClick={handleClick}\n >\n <Flex direction=\"column\" gap={1} alignItems=\"flex-start\">\n <Typography tag=\"h3\" fontWeight=\"semiBold\">\n {formatDate(version.createdAt, {\n day: 'numeric',\n month: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })}\n </Typography>\n <Typography tag=\"p\" variant=\"pi\" textColor=\"neutral600\">\n <VersionAuthor version={version} isCurrent={isCurrent} />\n </Typography>\n </Flex>\n {version.status && <DocumentStatus status={version.status} size=\"XS\" />}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PaginationButton\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PaginationButtonProps {\n page: number;\n children: React.ReactNode;\n}\n\nconst PaginationButton = ({ page, children }: PaginationButtonProps) => {\n const [{ query }] = useQueryParams<{ id?: string }>();\n\n // Remove the id from the pagination link, so that the history page can redirect\n // to the id of the first history version in the new page once it's loaded\n const { id: _id, ...queryRest } = query;\n\n return (\n <Link to={{ search: stringify({ ...queryRest, page }) }} style={{ textDecoration: 'none' }}>\n <Typography variant=\"omega\" textColor=\"primary600\">\n {children}\n </Typography>\n </Link>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * VersionsListItems\n * -----------------------------------------------------------------------------------------------*/\n\nconst VersionsListItems = () => {\n const { formatMessage } = useIntl();\n const { versions, page } = useHistoryContext('VersionsListItems', (state) => ({\n versions: state.versions,\n page: state.page,\n }));\n\n return (\n <Box flex={1} overflow=\"auto\">\n {versions.meta.pagination.page > 1 && (\n <Box paddingTop={4} textAlign=\"center\">\n <PaginationButton page={page - 1}>\n {formatMessage({\n id: 'content-manager.history.sidebar.show-newer',\n defaultMessage: 'Show newer versions',\n })}\n </PaginationButton>\n </Box>\n )}\n <Flex\n direction=\"column\"\n gap={3}\n padding={{ initial: 0, medium: 4 }}\n tag=\"ul\"\n alignItems=\"stretch\"\n >\n {versions.data.map((version, index) => (\n <li\n key={version.id}\n aria-label={formatMessage({\n id: 'content-manager.history.sidebar.title.version-card.aria-label',\n defaultMessage: 'Version card',\n })}\n >\n <VersionCard version={version} isCurrent={page === 1 && index === 0} />\n </li>\n ))}\n </Flex>\n {versions.meta.pagination.page < versions.meta.pagination.pageCount && (\n <Box paddingBottom={4} textAlign=\"center\">\n <PaginationButton page={page + 1}>\n {formatMessage({\n id: 'content-manager.history.sidebar.show-older',\n defaultMessage: 'Show older versions',\n })}\n </PaginationButton>\n </Box>\n )}\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * VersionsList\n * -----------------------------------------------------------------------------------------------*/\n\nconst VersionsList = () => {\n const { formatMessage } = useIntl();\n const { versions, page } = useHistoryContext('VersionsList', (state) => ({\n versions: state.versions,\n page: state.page,\n }));\n const isMobile = useIsMobile();\n\n const [{ query }] = useQueryParams<{ id?: string }>();\n const currentVersion = versions.data.find((version) => version.id.toString() === query.id);\n\n return !isMobile ? (\n <Flex\n shrink={0}\n direction=\"column\"\n alignItems=\"stretch\"\n width={{ initial: '28rem', large: '32rem' }}\n height=\"100%\"\n overflow=\"hidden\"\n background=\"neutral0\"\n borderColor=\"neutral200\"\n borderWidth=\"0 0 0 1px\"\n borderStyle=\"solid\"\n tag=\"aside\"\n >\n <Flex\n direction=\"row\"\n justifyContent=\"space-between\"\n padding={4}\n borderColor=\"neutral200\"\n borderWidth=\"0 0 1px\"\n borderStyle=\"solid\"\n tag=\"header\"\n role=\"banner\"\n >\n <Typography tag=\"h2\" variant=\"omega\" fontWeight=\"semiBold\">\n {formatMessage({\n id: 'content-manager.history.sidebar.title',\n defaultMessage: 'Versions',\n })}\n </Typography>\n <Box background=\"neutral150\" hasRadius padding={1}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {versions.meta.pagination.total}\n </Typography>\n </Box>\n </Flex>\n <VersionsListItems />\n </Flex>\n ) : (\n <>\n <ActionsDrawer.Root hasContent hasSideNav>\n <ActionsDrawer.Overlay />\n <ActionsDrawer.Header>\n {currentVersion && (\n <Flex gap={2} overflow=\"hidden\">\n <Box flex={1} overflow=\"hidden\">\n <Typography\n display=\"block\"\n variant=\"omega\"\n textColor=\"neutral600\"\n overflow=\"hidden\"\n style={{ textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}\n >\n <VersionAuthor\n version={currentVersion}\n isCurrent={page === 1 && versions.data.indexOf(currentVersion) === 0}\n />\n </Typography>\n </Box>\n {currentVersion.status && <DocumentStatus status={currentVersion.status} size=\"XS\" />}\n </Flex>\n )}\n </ActionsDrawer.Header>\n <ActionsDrawer.Content>\n <VersionsListItems />\n </ActionsDrawer.Content>\n </ActionsDrawer.Root>\n {/* Adding a fixed height to the bottom of the page to prevent \n the actions drawer from covering the content\n (32px + 12px * 2 padding + 1px border) */}\n <Box width=\"100%\" height=\"5.7rem\" />\n </>\n );\n};\n\nexport { VersionsList };\n"],"names":["BlueText","children","_jsx","Typography","textColor","variant","VersionAuthor","version","isCurrent","formatMessage","useIntl","author","createdBy","getDisplayName","_Fragment","id","defaultMessage","distanceToNow","RelativeTime","timestamp","Date","createdAt","isAnonymous","Boolean","b","VersionCard","formatDate","query","useQueryParams","setIsOpen","useActionsDrawer","s","isActive","toString","handleClick","_jsxs","Flex","direction","alignItems","gap","hasRadius","borderWidth","borderStyle","borderColor","color","padding","tag","Link","to","stringify","style","textDecoration","onClick","fontWeight","day","month","year","hour","minute","status","DocumentStatus","size","PaginationButton","page","_id","queryRest","search","VersionsListItems","versions","useHistoryContext","state","Box","flex","overflow","meta","pagination","paddingTop","textAlign","initial","medium","data","map","index","li","aria-label","pageCount","paddingBottom","VersionsList","isMobile","useIsMobile","currentVersion","find","shrink","width","large","height","background","justifyContent","role","total","ActionsDrawer","Root","hasContent","hasSideNav","Overlay","Header","display","textOverflow","whiteSpace","indexOf","Content"],"mappings":"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"}
@@ -142,15 +142,21 @@ const [HistoryProvider, useHistoryContext] = strapiAdmin.createContext('HistoryP
142
142
  page: page,
143
143
  mainField: mainField,
144
144
  children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
145
- direction: "row",
145
+ direction: {
146
+ initial: 'column',
147
+ medium: 'row'
148
+ },
146
149
  alignItems: "flex-start",
150
+ height: "100%",
151
+ overflow: "hidden",
147
152
  children: [
148
153
  /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Main, {
149
154
  grow: 1,
150
- height: "100dvh",
155
+ width: "100%",
156
+ height: "100%",
151
157
  background: "neutral100",
152
158
  paddingBottom: 6,
153
- overflow: "auto",
159
+ overflow: "hidden auto",
154
160
  labelledBy: headerId,
155
161
  children: [
156
162
  /*#__PURE__*/ jsxRuntime.jsx(VersionHeader.VersionHeader, {
@@ -179,23 +185,35 @@ const [HistoryProvider, useHistoryContext] = strapiAdmin.createContext('HistoryP
179
185
  }
180
186
  if (error || !slug) {
181
187
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
182
- height: "100dvh",
183
188
  width: "100dvw",
184
189
  position: "fixed",
185
- top: 0,
190
+ top: {
191
+ initial: strapiAdmin.HEIGHT_TOP_NAVIGATION,
192
+ large: 0
193
+ },
194
+ bottom: 0,
186
195
  left: 0,
187
- zIndex: 4,
196
+ zIndex: {
197
+ initial: 2,
198
+ large: 4
199
+ },
188
200
  background: "neutral0",
189
201
  children: /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Page.Error, {})
190
202
  });
191
203
  }
192
204
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
193
- height: "100dvh",
194
205
  width: "100dvw",
195
206
  position: "fixed",
196
- top: 0,
207
+ top: {
208
+ initial: strapiAdmin.HEIGHT_TOP_NAVIGATION,
209
+ large: 0
210
+ },
211
+ bottom: 0,
197
212
  left: 0,
198
- zIndex: 4,
213
+ zIndex: {
214
+ initial: 2,
215
+ large: 4
216
+ },
199
217
  background: "neutral0",
200
218
  children: /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Page.Protect, {
201
219
  permissions: permissions,
@@ -1 +1 @@
1
- {"version":3,"file":"History.js","sources":["../../../../admin/src/history/pages/History.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams, Page, createContext, useRBAC } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, FocusTrap, Main, Portal, Link } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Navigate, useParams, NavLink } from 'react-router-dom';\n\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { PERMISSIONS } from '../../constants/plugin';\nimport { DocumentRBAC } from '../../features/DocumentRBAC';\nimport { useDocument } from '../../hooks/useDocument';\nimport { type EditLayout, useDocumentLayout } from '../../hooks/useDocumentLayout';\nimport { useGetContentTypeConfigurationQuery } from '../../services/contentTypes';\nimport { buildValidParams } from '../../utils/api';\nimport { VersionContent } from '../components/VersionContent';\nimport { VersionHeader } from '../components/VersionHeader';\nimport { VersionsList } from '../components/VersionsList';\nimport { useGetHistoryVersionsQuery } from '../services/historyVersion';\n\nimport type {\n ContentType,\n FindContentTypeConfiguration,\n} from '../../../../shared/contracts/content-types';\nimport type {\n HistoryVersionDataResponse,\n GetHistoryVersions,\n} from '../../../../shared/contracts/history-versions';\nimport type { UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * HistoryProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface HistoryContextValue {\n contentType: UID.ContentType;\n id?: string; // null for single types\n layout: EditLayout['layout'];\n configuration: FindContentTypeConfiguration.Response['data'];\n selectedVersion: HistoryVersionDataResponse;\n // Errors are handled outside of the provider, so we exclude errors from the response type\n versions: Extract<GetHistoryVersions.Response, { data: Array<HistoryVersionDataResponse> }>;\n page: number;\n mainField: string;\n schema: ContentType;\n}\n\nconst [HistoryProvider, useHistoryContext] = createContext<HistoryContextValue>('HistoryPage');\n\n/* -------------------------------------------------------------------------------------------------\n * HistoryPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst HistoryPage = () => {\n const headerId = React.useId();\n const { formatMessage } = useIntl();\n const {\n slug,\n id: documentId,\n collectionType,\n } = useParams<{\n collectionType: string;\n slug: UID.ContentType;\n id: string;\n }>();\n\n const { isLoading: isLoadingDocument, schema } = useDocument({\n collectionType: collectionType!,\n model: slug!,\n });\n\n const {\n isLoading: isLoadingLayout,\n edit: {\n layout,\n settings: { displayName, mainField },\n },\n } = useDocumentLayout(slug!);\n const { data: configuration, isLoading: isLoadingConfiguration } =\n useGetContentTypeConfigurationQuery(slug!);\n\n // Parse state from query params\n const [{ query }] = useQueryParams<{\n page?: number;\n id?: string;\n plugins?: Record<string, unknown>;\n }>();\n const { id: selectedVersionId, ...queryWithoutId } = query;\n const validQueryParamsWithoutId = buildValidParams(queryWithoutId);\n const page = validQueryParamsWithoutId.page ? Number(validQueryParamsWithoutId.page) : 1;\n\n const versionsResponse = useGetHistoryVersionsQuery(\n {\n contentType: slug!,\n ...(documentId ? { documentId } : {}),\n // Omit id since it's not needed by the endpoint and caused extra refetches\n ...validQueryParamsWithoutId,\n },\n { refetchOnMountOrArgChange: true }\n );\n\n /**\n * When the page is first mounted, if there's already data in the cache, RTK has a fullfilled\n * status for the first render, right before it triggers a new request. This means the code\n * briefly reaches the part that redirects to the first history version (if none is set).\n * But since that data is stale, that means auto-selecting a version that may not be the most\n * recent. To avoid this, we identify through requestId if the query is stale despite the\n * fullfilled status, and show the loader in that case.\n * This means we essentially don't want cache. We always refetch when the page mounts, and\n * we always show the loader until we have the most recent data. That's fine for this page.\n */\n const initialRequestId = React.useRef(versionsResponse.requestId);\n const isStaleRequest = versionsResponse.requestId === initialRequestId.current;\n\n /**\n * Ensure that we have the necessary data to render the page:\n * - slug for single types\n * - slug _and_ documentId for collection types\n */\n if (!slug || (collectionType === COLLECTION_TYPES && !documentId)) {\n return <Navigate to=\"/content-manager\" />;\n }\n\n if (\n isLoadingDocument ||\n isLoadingLayout ||\n versionsResponse.isFetching ||\n isStaleRequest ||\n isLoadingConfiguration\n ) {\n return <Page.Loading />;\n }\n\n // It was a success, handle empty data\n if (!versionsResponse.isError && !versionsResponse.data?.data?.length) {\n return (\n <>\n <Page.NoData\n action={\n <Link\n tag={NavLink}\n to={`/content-manager/${collectionType}/${slug}${documentId ? `/${documentId}` : ''}`}\n >\n {formatMessage({\n id: 'global.back',\n defaultMessage: 'Back',\n })}\n </Link>\n }\n />\n </>\n );\n }\n\n // We have data, handle selected version\n if (versionsResponse.data?.data?.length && !selectedVersionId) {\n return (\n <Navigate\n to={{ search: stringify({ ...query, id: versionsResponse.data.data[0].id }) }}\n replace\n />\n );\n }\n\n const selectedVersion = versionsResponse.data?.data?.find(\n (version) => version.id.toString() === selectedVersionId\n );\n if (\n versionsResponse.isError ||\n !layout ||\n !schema ||\n !selectedVersion ||\n !configuration ||\n // This should not happen as it's covered by versionsResponse.isError, but we need it for TS\n versionsResponse.data.error\n ) {\n return <Page.Error />;\n }\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n {\n id: 'content-manager.history.page-title',\n defaultMessage: '{contentType} history',\n },\n {\n contentType: displayName,\n }\n )}\n </Page.Title>\n <HistoryProvider\n contentType={slug}\n id={documentId}\n schema={schema}\n layout={layout}\n configuration={configuration}\n selectedVersion={selectedVersion}\n versions={versionsResponse.data}\n page={page}\n mainField={mainField}\n >\n <Flex direction=\"row\" alignItems=\"flex-start\">\n <Main\n grow={1}\n height=\"100dvh\"\n background=\"neutral100\"\n paddingBottom={6}\n overflow=\"auto\"\n labelledBy={headerId}\n >\n <VersionHeader headerId={headerId} />\n\n <VersionContent />\n </Main>\n <VersionsList />\n </Flex>\n </HistoryProvider>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedHistoryPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedHistoryPageImpl = () => {\n const { slug } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC(PERMISSIONS.map((action) => ({ action, subject: slug })));\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !slug) {\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={4}\n background=\"neutral0\"\n >\n <Page.Error />\n </Box>\n );\n }\n\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={4}\n background=\"neutral0\"\n >\n <Page.Protect permissions={permissions}>\n {({ permissions }) => (\n <DocumentRBAC permissions={permissions}>\n <HistoryPage />\n </DocumentRBAC>\n )}\n </Page.Protect>\n </Box>\n );\n};\n\nconst ProtectedHistoryPage = () => {\n return (\n <Portal>\n <FocusTrap>\n <ProtectedHistoryPageImpl />\n </FocusTrap>\n </Portal>\n );\n};\n\nexport { ProtectedHistoryPage, HistoryProvider, useHistoryContext };\nexport type { HistoryContextValue };\n"],"names":["HistoryProvider","useHistoryContext","createContext","HistoryPage","headerId","React","useId","formatMessage","useIntl","slug","id","documentId","collectionType","useParams","isLoading","isLoadingDocument","schema","useDocument","model","isLoadingLayout","edit","layout","settings","displayName","mainField","useDocumentLayout","data","configuration","isLoadingConfiguration","useGetContentTypeConfigurationQuery","query","useQueryParams","selectedVersionId","queryWithoutId","validQueryParamsWithoutId","buildValidParams","page","Number","versionsResponse","useGetHistoryVersionsQuery","contentType","refetchOnMountOrArgChange","initialRequestId","useRef","requestId","isStaleRequest","current","COLLECTION_TYPES","_jsx","Navigate","to","isFetching","Page","Loading","isError","length","_Fragment","NoData","action","Link","tag","NavLink","defaultMessage","search","stringify","replace","selectedVersion","find","version","toString","error","Error","_jsxs","Title","versions","Flex","direction","alignItems","Main","grow","height","background","paddingBottom","overflow","labelledBy","VersionHeader","VersionContent","VersionsList","ProtectedHistoryPageImpl","permissions","useRBAC","PERMISSIONS","map","subject","Box","width","position","top","left","zIndex","Protect","DocumentRBAC","ProtectedHistoryPage","Portal","FocusTrap"],"mappings":"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"}
1
+ {"version":3,"file":"History.js","sources":["../../../../admin/src/history/pages/History.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useQueryParams,\n Page,\n createContext,\n useRBAC,\n HEIGHT_TOP_NAVIGATION,\n} from '@strapi/admin/strapi-admin';\nimport { Box, Flex, FocusTrap, Main, Portal, Link } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Navigate, useParams, NavLink } from 'react-router-dom';\n\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { PERMISSIONS } from '../../constants/plugin';\nimport { DocumentRBAC } from '../../features/DocumentRBAC';\nimport { useDocument } from '../../hooks/useDocument';\nimport { type EditLayout, useDocumentLayout } from '../../hooks/useDocumentLayout';\nimport { useGetContentTypeConfigurationQuery } from '../../services/contentTypes';\nimport { buildValidParams } from '../../utils/api';\nimport { VersionContent } from '../components/VersionContent';\nimport { VersionHeader } from '../components/VersionHeader';\nimport { VersionsList } from '../components/VersionsList';\nimport { useGetHistoryVersionsQuery } from '../services/historyVersion';\n\nimport type {\n ContentType,\n FindContentTypeConfiguration,\n} from '../../../../shared/contracts/content-types';\nimport type {\n HistoryVersionDataResponse,\n GetHistoryVersions,\n} from '../../../../shared/contracts/history-versions';\nimport type { UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * HistoryProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface HistoryContextValue {\n contentType: UID.ContentType;\n id?: string; // null for single types\n layout: EditLayout['layout'];\n configuration: FindContentTypeConfiguration.Response['data'];\n selectedVersion: HistoryVersionDataResponse;\n // Errors are handled outside of the provider, so we exclude errors from the response type\n versions: Extract<GetHistoryVersions.Response, { data: Array<HistoryVersionDataResponse> }>;\n page: number;\n mainField: string;\n schema: ContentType;\n}\n\nconst [HistoryProvider, useHistoryContext] = createContext<HistoryContextValue>('HistoryPage');\n\n/* -------------------------------------------------------------------------------------------------\n * HistoryPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst HistoryPage = () => {\n const headerId = React.useId();\n const { formatMessage } = useIntl();\n const {\n slug,\n id: documentId,\n collectionType,\n } = useParams<{\n collectionType: string;\n slug: UID.ContentType;\n id: string;\n }>();\n\n const { isLoading: isLoadingDocument, schema } = useDocument({\n collectionType: collectionType!,\n model: slug!,\n });\n\n const {\n isLoading: isLoadingLayout,\n edit: {\n layout,\n settings: { displayName, mainField },\n },\n } = useDocumentLayout(slug!);\n const { data: configuration, isLoading: isLoadingConfiguration } =\n useGetContentTypeConfigurationQuery(slug!);\n\n // Parse state from query params\n const [{ query }] = useQueryParams<{\n page?: number;\n id?: string;\n plugins?: Record<string, unknown>;\n }>();\n const { id: selectedVersionId, ...queryWithoutId } = query;\n const validQueryParamsWithoutId = buildValidParams(queryWithoutId);\n const page = validQueryParamsWithoutId.page ? Number(validQueryParamsWithoutId.page) : 1;\n\n const versionsResponse = useGetHistoryVersionsQuery(\n {\n contentType: slug!,\n ...(documentId ? { documentId } : {}),\n // Omit id since it's not needed by the endpoint and caused extra refetches\n ...validQueryParamsWithoutId,\n },\n { refetchOnMountOrArgChange: true }\n );\n\n /**\n * When the page is first mounted, if there's already data in the cache, RTK has a fullfilled\n * status for the first render, right before it triggers a new request. This means the code\n * briefly reaches the part that redirects to the first history version (if none is set).\n * But since that data is stale, that means auto-selecting a version that may not be the most\n * recent. To avoid this, we identify through requestId if the query is stale despite the\n * fullfilled status, and show the loader in that case.\n * This means we essentially don't want cache. We always refetch when the page mounts, and\n * we always show the loader until we have the most recent data. That's fine for this page.\n */\n const initialRequestId = React.useRef(versionsResponse.requestId);\n const isStaleRequest = versionsResponse.requestId === initialRequestId.current;\n\n /**\n * Ensure that we have the necessary data to render the page:\n * - slug for single types\n * - slug _and_ documentId for collection types\n */\n if (!slug || (collectionType === COLLECTION_TYPES && !documentId)) {\n return <Navigate to=\"/content-manager\" />;\n }\n\n if (\n isLoadingDocument ||\n isLoadingLayout ||\n versionsResponse.isFetching ||\n isStaleRequest ||\n isLoadingConfiguration\n ) {\n return <Page.Loading />;\n }\n\n // It was a success, handle empty data\n if (!versionsResponse.isError && !versionsResponse.data?.data?.length) {\n return (\n <>\n <Page.NoData\n action={\n <Link\n tag={NavLink}\n to={`/content-manager/${collectionType}/${slug}${documentId ? `/${documentId}` : ''}`}\n >\n {formatMessage({\n id: 'global.back',\n defaultMessage: 'Back',\n })}\n </Link>\n }\n />\n </>\n );\n }\n\n // We have data, handle selected version\n if (versionsResponse.data?.data?.length && !selectedVersionId) {\n return (\n <Navigate\n to={{ search: stringify({ ...query, id: versionsResponse.data.data[0].id }) }}\n replace\n />\n );\n }\n\n const selectedVersion = versionsResponse.data?.data?.find(\n (version) => version.id.toString() === selectedVersionId\n );\n if (\n versionsResponse.isError ||\n !layout ||\n !schema ||\n !selectedVersion ||\n !configuration ||\n // This should not happen as it's covered by versionsResponse.isError, but we need it for TS\n versionsResponse.data.error\n ) {\n return <Page.Error />;\n }\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n {\n id: 'content-manager.history.page-title',\n defaultMessage: '{contentType} history',\n },\n {\n contentType: displayName,\n }\n )}\n </Page.Title>\n <HistoryProvider\n contentType={slug}\n id={documentId}\n schema={schema}\n layout={layout}\n configuration={configuration}\n selectedVersion={selectedVersion}\n versions={versionsResponse.data}\n page={page}\n mainField={mainField}\n >\n <Flex\n direction={{ initial: 'column', medium: 'row' }}\n alignItems=\"flex-start\"\n height=\"100%\"\n overflow=\"hidden\"\n >\n <Main\n grow={1}\n width=\"100%\"\n height=\"100%\"\n background=\"neutral100\"\n paddingBottom={6}\n overflow=\"hidden auto\"\n labelledBy={headerId}\n >\n <VersionHeader headerId={headerId} />\n <VersionContent />\n </Main>\n <VersionsList />\n </Flex>\n </HistoryProvider>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedHistoryPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedHistoryPageImpl = () => {\n const { slug } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC(PERMISSIONS.map((action) => ({ action, subject: slug })));\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !slug) {\n return (\n <Box\n width=\"100dvw\"\n position=\"fixed\"\n top={{ initial: HEIGHT_TOP_NAVIGATION, large: 0 }}\n bottom={0}\n left={0}\n zIndex={{ initial: 2, large: 4 }}\n background=\"neutral0\"\n >\n <Page.Error />\n </Box>\n );\n }\n\n return (\n <Box\n width=\"100dvw\"\n position=\"fixed\"\n top={{ initial: HEIGHT_TOP_NAVIGATION, large: 0 }}\n bottom={0}\n left={0}\n zIndex={{ initial: 2, large: 4 }}\n background=\"neutral0\"\n >\n <Page.Protect permissions={permissions}>\n {({ permissions }) => (\n <DocumentRBAC permissions={permissions}>\n <HistoryPage />\n </DocumentRBAC>\n )}\n </Page.Protect>\n </Box>\n );\n};\n\nconst ProtectedHistoryPage = () => {\n return (\n <Portal>\n <FocusTrap>\n <ProtectedHistoryPageImpl />\n </FocusTrap>\n </Portal>\n );\n};\n\nexport { ProtectedHistoryPage, HistoryProvider, useHistoryContext };\nexport type { HistoryContextValue };\n"],"names":["HistoryProvider","useHistoryContext","createContext","HistoryPage","headerId","React","useId","formatMessage","useIntl","slug","id","documentId","collectionType","useParams","isLoading","isLoadingDocument","schema","useDocument","model","isLoadingLayout","edit","layout","settings","displayName","mainField","useDocumentLayout","data","configuration","isLoadingConfiguration","useGetContentTypeConfigurationQuery","query","useQueryParams","selectedVersionId","queryWithoutId","validQueryParamsWithoutId","buildValidParams","page","Number","versionsResponse","useGetHistoryVersionsQuery","contentType","refetchOnMountOrArgChange","initialRequestId","useRef","requestId","isStaleRequest","current","COLLECTION_TYPES","_jsx","Navigate","to","isFetching","Page","Loading","isError","length","_Fragment","NoData","action","Link","tag","NavLink","defaultMessage","search","stringify","replace","selectedVersion","find","version","toString","error","Error","_jsxs","Title","versions","Flex","direction","initial","medium","alignItems","height","overflow","Main","grow","width","background","paddingBottom","labelledBy","VersionHeader","VersionContent","VersionsList","ProtectedHistoryPageImpl","permissions","useRBAC","PERMISSIONS","map","subject","Box","position","top","HEIGHT_TOP_NAVIGATION","large","bottom","left","zIndex","Protect","DocumentRBAC","ProtectedHistoryPage","Portal","FocusTrap"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
- import { createContext, useRBAC, Page, useQueryParams } from '@strapi/admin/strapi-admin';
3
+ import { createContext, useRBAC, Page, HEIGHT_TOP_NAVIGATION, useQueryParams } from '@strapi/admin/strapi-admin';
4
4
  import { Portal, FocusTrap, Box, Link, Flex, Main } from '@strapi/design-system';
5
5
  import { stringify } from 'qs';
6
6
  import { useIntl } from 'react-intl';
@@ -121,15 +121,21 @@ const [HistoryProvider, useHistoryContext] = createContext('HistoryPage');
121
121
  page: page,
122
122
  mainField: mainField,
123
123
  children: /*#__PURE__*/ jsxs(Flex, {
124
- direction: "row",
124
+ direction: {
125
+ initial: 'column',
126
+ medium: 'row'
127
+ },
125
128
  alignItems: "flex-start",
129
+ height: "100%",
130
+ overflow: "hidden",
126
131
  children: [
127
132
  /*#__PURE__*/ jsxs(Main, {
128
133
  grow: 1,
129
- height: "100dvh",
134
+ width: "100%",
135
+ height: "100%",
130
136
  background: "neutral100",
131
137
  paddingBottom: 6,
132
- overflow: "auto",
138
+ overflow: "hidden auto",
133
139
  labelledBy: headerId,
134
140
  children: [
135
141
  /*#__PURE__*/ jsx(VersionHeader, {
@@ -158,23 +164,35 @@ const [HistoryProvider, useHistoryContext] = createContext('HistoryPage');
158
164
  }
159
165
  if (error || !slug) {
160
166
  return /*#__PURE__*/ jsx(Box, {
161
- height: "100dvh",
162
167
  width: "100dvw",
163
168
  position: "fixed",
164
- top: 0,
169
+ top: {
170
+ initial: HEIGHT_TOP_NAVIGATION,
171
+ large: 0
172
+ },
173
+ bottom: 0,
165
174
  left: 0,
166
- zIndex: 4,
175
+ zIndex: {
176
+ initial: 2,
177
+ large: 4
178
+ },
167
179
  background: "neutral0",
168
180
  children: /*#__PURE__*/ jsx(Page.Error, {})
169
181
  });
170
182
  }
171
183
  return /*#__PURE__*/ jsx(Box, {
172
- height: "100dvh",
173
184
  width: "100dvw",
174
185
  position: "fixed",
175
- top: 0,
186
+ top: {
187
+ initial: HEIGHT_TOP_NAVIGATION,
188
+ large: 0
189
+ },
190
+ bottom: 0,
176
191
  left: 0,
177
- zIndex: 4,
192
+ zIndex: {
193
+ initial: 2,
194
+ large: 4
195
+ },
178
196
  background: "neutral0",
179
197
  children: /*#__PURE__*/ jsx(Page.Protect, {
180
198
  permissions: permissions,
@@ -1 +1 @@
1
- {"version":3,"file":"History.mjs","sources":["../../../../admin/src/history/pages/History.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams, Page, createContext, useRBAC } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, FocusTrap, Main, Portal, Link } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Navigate, useParams, NavLink } from 'react-router-dom';\n\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { PERMISSIONS } from '../../constants/plugin';\nimport { DocumentRBAC } from '../../features/DocumentRBAC';\nimport { useDocument } from '../../hooks/useDocument';\nimport { type EditLayout, useDocumentLayout } from '../../hooks/useDocumentLayout';\nimport { useGetContentTypeConfigurationQuery } from '../../services/contentTypes';\nimport { buildValidParams } from '../../utils/api';\nimport { VersionContent } from '../components/VersionContent';\nimport { VersionHeader } from '../components/VersionHeader';\nimport { VersionsList } from '../components/VersionsList';\nimport { useGetHistoryVersionsQuery } from '../services/historyVersion';\n\nimport type {\n ContentType,\n FindContentTypeConfiguration,\n} from '../../../../shared/contracts/content-types';\nimport type {\n HistoryVersionDataResponse,\n GetHistoryVersions,\n} from '../../../../shared/contracts/history-versions';\nimport type { UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * HistoryProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface HistoryContextValue {\n contentType: UID.ContentType;\n id?: string; // null for single types\n layout: EditLayout['layout'];\n configuration: FindContentTypeConfiguration.Response['data'];\n selectedVersion: HistoryVersionDataResponse;\n // Errors are handled outside of the provider, so we exclude errors from the response type\n versions: Extract<GetHistoryVersions.Response, { data: Array<HistoryVersionDataResponse> }>;\n page: number;\n mainField: string;\n schema: ContentType;\n}\n\nconst [HistoryProvider, useHistoryContext] = createContext<HistoryContextValue>('HistoryPage');\n\n/* -------------------------------------------------------------------------------------------------\n * HistoryPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst HistoryPage = () => {\n const headerId = React.useId();\n const { formatMessage } = useIntl();\n const {\n slug,\n id: documentId,\n collectionType,\n } = useParams<{\n collectionType: string;\n slug: UID.ContentType;\n id: string;\n }>();\n\n const { isLoading: isLoadingDocument, schema } = useDocument({\n collectionType: collectionType!,\n model: slug!,\n });\n\n const {\n isLoading: isLoadingLayout,\n edit: {\n layout,\n settings: { displayName, mainField },\n },\n } = useDocumentLayout(slug!);\n const { data: configuration, isLoading: isLoadingConfiguration } =\n useGetContentTypeConfigurationQuery(slug!);\n\n // Parse state from query params\n const [{ query }] = useQueryParams<{\n page?: number;\n id?: string;\n plugins?: Record<string, unknown>;\n }>();\n const { id: selectedVersionId, ...queryWithoutId } = query;\n const validQueryParamsWithoutId = buildValidParams(queryWithoutId);\n const page = validQueryParamsWithoutId.page ? Number(validQueryParamsWithoutId.page) : 1;\n\n const versionsResponse = useGetHistoryVersionsQuery(\n {\n contentType: slug!,\n ...(documentId ? { documentId } : {}),\n // Omit id since it's not needed by the endpoint and caused extra refetches\n ...validQueryParamsWithoutId,\n },\n { refetchOnMountOrArgChange: true }\n );\n\n /**\n * When the page is first mounted, if there's already data in the cache, RTK has a fullfilled\n * status for the first render, right before it triggers a new request. This means the code\n * briefly reaches the part that redirects to the first history version (if none is set).\n * But since that data is stale, that means auto-selecting a version that may not be the most\n * recent. To avoid this, we identify through requestId if the query is stale despite the\n * fullfilled status, and show the loader in that case.\n * This means we essentially don't want cache. We always refetch when the page mounts, and\n * we always show the loader until we have the most recent data. That's fine for this page.\n */\n const initialRequestId = React.useRef(versionsResponse.requestId);\n const isStaleRequest = versionsResponse.requestId === initialRequestId.current;\n\n /**\n * Ensure that we have the necessary data to render the page:\n * - slug for single types\n * - slug _and_ documentId for collection types\n */\n if (!slug || (collectionType === COLLECTION_TYPES && !documentId)) {\n return <Navigate to=\"/content-manager\" />;\n }\n\n if (\n isLoadingDocument ||\n isLoadingLayout ||\n versionsResponse.isFetching ||\n isStaleRequest ||\n isLoadingConfiguration\n ) {\n return <Page.Loading />;\n }\n\n // It was a success, handle empty data\n if (!versionsResponse.isError && !versionsResponse.data?.data?.length) {\n return (\n <>\n <Page.NoData\n action={\n <Link\n tag={NavLink}\n to={`/content-manager/${collectionType}/${slug}${documentId ? `/${documentId}` : ''}`}\n >\n {formatMessage({\n id: 'global.back',\n defaultMessage: 'Back',\n })}\n </Link>\n }\n />\n </>\n );\n }\n\n // We have data, handle selected version\n if (versionsResponse.data?.data?.length && !selectedVersionId) {\n return (\n <Navigate\n to={{ search: stringify({ ...query, id: versionsResponse.data.data[0].id }) }}\n replace\n />\n );\n }\n\n const selectedVersion = versionsResponse.data?.data?.find(\n (version) => version.id.toString() === selectedVersionId\n );\n if (\n versionsResponse.isError ||\n !layout ||\n !schema ||\n !selectedVersion ||\n !configuration ||\n // This should not happen as it's covered by versionsResponse.isError, but we need it for TS\n versionsResponse.data.error\n ) {\n return <Page.Error />;\n }\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n {\n id: 'content-manager.history.page-title',\n defaultMessage: '{contentType} history',\n },\n {\n contentType: displayName,\n }\n )}\n </Page.Title>\n <HistoryProvider\n contentType={slug}\n id={documentId}\n schema={schema}\n layout={layout}\n configuration={configuration}\n selectedVersion={selectedVersion}\n versions={versionsResponse.data}\n page={page}\n mainField={mainField}\n >\n <Flex direction=\"row\" alignItems=\"flex-start\">\n <Main\n grow={1}\n height=\"100dvh\"\n background=\"neutral100\"\n paddingBottom={6}\n overflow=\"auto\"\n labelledBy={headerId}\n >\n <VersionHeader headerId={headerId} />\n\n <VersionContent />\n </Main>\n <VersionsList />\n </Flex>\n </HistoryProvider>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedHistoryPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedHistoryPageImpl = () => {\n const { slug } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC(PERMISSIONS.map((action) => ({ action, subject: slug })));\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !slug) {\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={4}\n background=\"neutral0\"\n >\n <Page.Error />\n </Box>\n );\n }\n\n return (\n <Box\n height=\"100dvh\"\n width=\"100dvw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={4}\n background=\"neutral0\"\n >\n <Page.Protect permissions={permissions}>\n {({ permissions }) => (\n <DocumentRBAC permissions={permissions}>\n <HistoryPage />\n </DocumentRBAC>\n )}\n </Page.Protect>\n </Box>\n );\n};\n\nconst ProtectedHistoryPage = () => {\n return (\n <Portal>\n <FocusTrap>\n <ProtectedHistoryPageImpl />\n </FocusTrap>\n </Portal>\n );\n};\n\nexport { ProtectedHistoryPage, HistoryProvider, useHistoryContext };\nexport type { HistoryContextValue };\n"],"names":["HistoryProvider","useHistoryContext","createContext","HistoryPage","headerId","React","useId","formatMessage","useIntl","slug","id","documentId","collectionType","useParams","isLoading","isLoadingDocument","schema","useDocument","model","isLoadingLayout","edit","layout","settings","displayName","mainField","useDocumentLayout","data","configuration","isLoadingConfiguration","useGetContentTypeConfigurationQuery","query","useQueryParams","selectedVersionId","queryWithoutId","validQueryParamsWithoutId","buildValidParams","page","Number","versionsResponse","useGetHistoryVersionsQuery","contentType","refetchOnMountOrArgChange","initialRequestId","useRef","requestId","isStaleRequest","current","COLLECTION_TYPES","_jsx","Navigate","to","isFetching","Page","Loading","isError","length","_Fragment","NoData","action","Link","tag","NavLink","defaultMessage","search","stringify","replace","selectedVersion","find","version","toString","error","Error","_jsxs","Title","versions","Flex","direction","alignItems","Main","grow","height","background","paddingBottom","overflow","labelledBy","VersionHeader","VersionContent","VersionsList","ProtectedHistoryPageImpl","permissions","useRBAC","PERMISSIONS","map","subject","Box","width","position","top","left","zIndex","Protect","DocumentRBAC","ProtectedHistoryPage","Portal","FocusTrap"],"mappings":"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"}
1
+ {"version":3,"file":"History.mjs","sources":["../../../../admin/src/history/pages/History.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useQueryParams,\n Page,\n createContext,\n useRBAC,\n HEIGHT_TOP_NAVIGATION,\n} from '@strapi/admin/strapi-admin';\nimport { Box, Flex, FocusTrap, Main, Portal, Link } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Navigate, useParams, NavLink } from 'react-router-dom';\n\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { PERMISSIONS } from '../../constants/plugin';\nimport { DocumentRBAC } from '../../features/DocumentRBAC';\nimport { useDocument } from '../../hooks/useDocument';\nimport { type EditLayout, useDocumentLayout } from '../../hooks/useDocumentLayout';\nimport { useGetContentTypeConfigurationQuery } from '../../services/contentTypes';\nimport { buildValidParams } from '../../utils/api';\nimport { VersionContent } from '../components/VersionContent';\nimport { VersionHeader } from '../components/VersionHeader';\nimport { VersionsList } from '../components/VersionsList';\nimport { useGetHistoryVersionsQuery } from '../services/historyVersion';\n\nimport type {\n ContentType,\n FindContentTypeConfiguration,\n} from '../../../../shared/contracts/content-types';\nimport type {\n HistoryVersionDataResponse,\n GetHistoryVersions,\n} from '../../../../shared/contracts/history-versions';\nimport type { UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * HistoryProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface HistoryContextValue {\n contentType: UID.ContentType;\n id?: string; // null for single types\n layout: EditLayout['layout'];\n configuration: FindContentTypeConfiguration.Response['data'];\n selectedVersion: HistoryVersionDataResponse;\n // Errors are handled outside of the provider, so we exclude errors from the response type\n versions: Extract<GetHistoryVersions.Response, { data: Array<HistoryVersionDataResponse> }>;\n page: number;\n mainField: string;\n schema: ContentType;\n}\n\nconst [HistoryProvider, useHistoryContext] = createContext<HistoryContextValue>('HistoryPage');\n\n/* -------------------------------------------------------------------------------------------------\n * HistoryPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst HistoryPage = () => {\n const headerId = React.useId();\n const { formatMessage } = useIntl();\n const {\n slug,\n id: documentId,\n collectionType,\n } = useParams<{\n collectionType: string;\n slug: UID.ContentType;\n id: string;\n }>();\n\n const { isLoading: isLoadingDocument, schema } = useDocument({\n collectionType: collectionType!,\n model: slug!,\n });\n\n const {\n isLoading: isLoadingLayout,\n edit: {\n layout,\n settings: { displayName, mainField },\n },\n } = useDocumentLayout(slug!);\n const { data: configuration, isLoading: isLoadingConfiguration } =\n useGetContentTypeConfigurationQuery(slug!);\n\n // Parse state from query params\n const [{ query }] = useQueryParams<{\n page?: number;\n id?: string;\n plugins?: Record<string, unknown>;\n }>();\n const { id: selectedVersionId, ...queryWithoutId } = query;\n const validQueryParamsWithoutId = buildValidParams(queryWithoutId);\n const page = validQueryParamsWithoutId.page ? Number(validQueryParamsWithoutId.page) : 1;\n\n const versionsResponse = useGetHistoryVersionsQuery(\n {\n contentType: slug!,\n ...(documentId ? { documentId } : {}),\n // Omit id since it's not needed by the endpoint and caused extra refetches\n ...validQueryParamsWithoutId,\n },\n { refetchOnMountOrArgChange: true }\n );\n\n /**\n * When the page is first mounted, if there's already data in the cache, RTK has a fullfilled\n * status for the first render, right before it triggers a new request. This means the code\n * briefly reaches the part that redirects to the first history version (if none is set).\n * But since that data is stale, that means auto-selecting a version that may not be the most\n * recent. To avoid this, we identify through requestId if the query is stale despite the\n * fullfilled status, and show the loader in that case.\n * This means we essentially don't want cache. We always refetch when the page mounts, and\n * we always show the loader until we have the most recent data. That's fine for this page.\n */\n const initialRequestId = React.useRef(versionsResponse.requestId);\n const isStaleRequest = versionsResponse.requestId === initialRequestId.current;\n\n /**\n * Ensure that we have the necessary data to render the page:\n * - slug for single types\n * - slug _and_ documentId for collection types\n */\n if (!slug || (collectionType === COLLECTION_TYPES && !documentId)) {\n return <Navigate to=\"/content-manager\" />;\n }\n\n if (\n isLoadingDocument ||\n isLoadingLayout ||\n versionsResponse.isFetching ||\n isStaleRequest ||\n isLoadingConfiguration\n ) {\n return <Page.Loading />;\n }\n\n // It was a success, handle empty data\n if (!versionsResponse.isError && !versionsResponse.data?.data?.length) {\n return (\n <>\n <Page.NoData\n action={\n <Link\n tag={NavLink}\n to={`/content-manager/${collectionType}/${slug}${documentId ? `/${documentId}` : ''}`}\n >\n {formatMessage({\n id: 'global.back',\n defaultMessage: 'Back',\n })}\n </Link>\n }\n />\n </>\n );\n }\n\n // We have data, handle selected version\n if (versionsResponse.data?.data?.length && !selectedVersionId) {\n return (\n <Navigate\n to={{ search: stringify({ ...query, id: versionsResponse.data.data[0].id }) }}\n replace\n />\n );\n }\n\n const selectedVersion = versionsResponse.data?.data?.find(\n (version) => version.id.toString() === selectedVersionId\n );\n if (\n versionsResponse.isError ||\n !layout ||\n !schema ||\n !selectedVersion ||\n !configuration ||\n // This should not happen as it's covered by versionsResponse.isError, but we need it for TS\n versionsResponse.data.error\n ) {\n return <Page.Error />;\n }\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n {\n id: 'content-manager.history.page-title',\n defaultMessage: '{contentType} history',\n },\n {\n contentType: displayName,\n }\n )}\n </Page.Title>\n <HistoryProvider\n contentType={slug}\n id={documentId}\n schema={schema}\n layout={layout}\n configuration={configuration}\n selectedVersion={selectedVersion}\n versions={versionsResponse.data}\n page={page}\n mainField={mainField}\n >\n <Flex\n direction={{ initial: 'column', medium: 'row' }}\n alignItems=\"flex-start\"\n height=\"100%\"\n overflow=\"hidden\"\n >\n <Main\n grow={1}\n width=\"100%\"\n height=\"100%\"\n background=\"neutral100\"\n paddingBottom={6}\n overflow=\"hidden auto\"\n labelledBy={headerId}\n >\n <VersionHeader headerId={headerId} />\n <VersionContent />\n </Main>\n <VersionsList />\n </Flex>\n </HistoryProvider>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedHistoryPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedHistoryPageImpl = () => {\n const { slug } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC(PERMISSIONS.map((action) => ({ action, subject: slug })));\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !slug) {\n return (\n <Box\n width=\"100dvw\"\n position=\"fixed\"\n top={{ initial: HEIGHT_TOP_NAVIGATION, large: 0 }}\n bottom={0}\n left={0}\n zIndex={{ initial: 2, large: 4 }}\n background=\"neutral0\"\n >\n <Page.Error />\n </Box>\n );\n }\n\n return (\n <Box\n width=\"100dvw\"\n position=\"fixed\"\n top={{ initial: HEIGHT_TOP_NAVIGATION, large: 0 }}\n bottom={0}\n left={0}\n zIndex={{ initial: 2, large: 4 }}\n background=\"neutral0\"\n >\n <Page.Protect permissions={permissions}>\n {({ permissions }) => (\n <DocumentRBAC permissions={permissions}>\n <HistoryPage />\n </DocumentRBAC>\n )}\n </Page.Protect>\n </Box>\n );\n};\n\nconst ProtectedHistoryPage = () => {\n return (\n <Portal>\n <FocusTrap>\n <ProtectedHistoryPageImpl />\n </FocusTrap>\n </Portal>\n );\n};\n\nexport { ProtectedHistoryPage, HistoryProvider, useHistoryContext };\nexport type { HistoryContextValue };\n"],"names":["HistoryProvider","useHistoryContext","createContext","HistoryPage","headerId","React","useId","formatMessage","useIntl","slug","id","documentId","collectionType","useParams","isLoading","isLoadingDocument","schema","useDocument","model","isLoadingLayout","edit","layout","settings","displayName","mainField","useDocumentLayout","data","configuration","isLoadingConfiguration","useGetContentTypeConfigurationQuery","query","useQueryParams","selectedVersionId","queryWithoutId","validQueryParamsWithoutId","buildValidParams","page","Number","versionsResponse","useGetHistoryVersionsQuery","contentType","refetchOnMountOrArgChange","initialRequestId","useRef","requestId","isStaleRequest","current","COLLECTION_TYPES","_jsx","Navigate","to","isFetching","Page","Loading","isError","length","_Fragment","NoData","action","Link","tag","NavLink","defaultMessage","search","stringify","replace","selectedVersion","find","version","toString","error","Error","_jsxs","Title","versions","Flex","direction","initial","medium","alignItems","height","overflow","Main","grow","width","background","paddingBottom","labelledBy","VersionHeader","VersionContent","VersionsList","ProtectedHistoryPageImpl","permissions","useRBAC","PERMISSIONS","map","subject","Box","position","top","HEIGHT_TOP_NAVIGATION","large","bottom","left","zIndex","Protect","DocumentRBAC","ProtectedHistoryPage","Portal","FocusTrap"],"mappings":"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"}
@@ -192,7 +192,7 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
192
192
  }, {
193
193
  skip: id === 'create' || !origin && !id && collectionType !== collections.SINGLE_TYPES
194
194
  });
195
- const returnId = origin || id === 'create' ? undefined : id;
195
+ const returnId = origin || (id === 'create' ? undefined : id);
196
196
  return {
197
197
  collectionType,
198
198
  model: slug,
@@ -1 +1 @@
1
- {"version":3,"file":"useDocument.js","sources":["../../../admin/src/hooks/useDocument.ts"],"sourcesContent":["/**\n * This hook doesn't use a context provider because we fetch directly from the server,\n * this sounds expensive but actually, it's really not. Because we have redux-toolkit-query\n * being a cache layer so if nothing invalidates the cache, we don't fetch again.\n */\n\nimport * as React from 'react';\n\nimport {\n useNotification,\n useAPIErrorHandler,\n useQueryParams,\n FormErrors,\n getYupValidationErrors,\n useForm,\n} from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useParams } from 'react-router-dom';\nimport { ValidationError } from 'yup';\n\nimport { SINGLE_TYPES } from '../constants/collections';\nimport { type AnyData, transformDocument } from '../pages/EditView/utils/data';\nimport { createDefaultForm } from '../pages/EditView/utils/forms';\nimport { useGetDocumentQuery } from '../services/documents';\nimport { buildValidParams } from '../utils/api';\nimport { createYupSchema } from '../utils/validation';\n\nimport { useContentTypeSchema, ComponentsDictionary } from './useContentTypeSchema';\nimport { useDocumentLayout } from './useDocumentLayout';\n\nimport type { FindOne } from '../../../shared/contracts/collection-types';\nimport type { ContentType } from '../../../shared/contracts/content-types';\nimport type { Modules } from '@strapi/types';\n\ninterface UseDocumentArgs {\n collectionType: string;\n model: string;\n documentId?: string;\n params?: object;\n}\n\ntype UseDocumentOpts = Parameters<typeof useGetDocumentQuery>[1];\n\ntype Document = FindOne.Response['data'];\n\ntype Schema = ContentType;\n\ntype UseDocument = (\n args: UseDocumentArgs,\n opts?: UseDocumentOpts\n) => {\n /**\n * These are the schemas of the components used in the content type, organised\n * by their uid.\n */\n components: ComponentsDictionary;\n document?: Document;\n meta?: FindOne.Response['meta'];\n isLoading: boolean;\n /**\n * This is the schema of the content type, it is not the same as the layout.\n */\n schema?: Schema;\n schemas?: Schema[];\n hasError?: boolean;\n refetch: () => void;\n validate: (document: Document) => null | FormErrors;\n /**\n * Get the document's title\n */\n getTitle: (mainField: string) => string;\n /**\n * Get the initial form values for the document\n */\n getInitialFormValues: (isCreatingDocument?: boolean) => AnyData | undefined;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocument\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @alpha\n * @public\n * @description Returns a document based on the model, collection type & id passed as arguments.\n * Also extracts its schema from the redux cache to be used for creating a validation schema.\n * @example\n * ```tsx\n * const { id, model, collectionType } = useParams<{ id: string; model: string; collectionType: string }>();\n *\n * if(!model || !collectionType) return null;\n *\n * const { document, isLoading, validate } = useDocument({ documentId: id, model, collectionType, params: { locale: 'en-GB' } })\n * const { update } = useDocumentActions()\n *\n * const onSubmit = async (document: Document) => {\n * const errors = validate(document);\n *\n * if(errors) {\n * // handle errors\n * }\n *\n * await update({ collectionType, model, id }, document)\n * }\n * ```\n *\n */\nconst useDocument: UseDocument = (args, opts) => {\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { formatMessage } = useIntl();\n\n const {\n currentData: data,\n isLoading: isLoadingDocument,\n isFetching: isFetchingDocument,\n error,\n refetch,\n } = useGetDocumentQuery(args, {\n ...opts,\n skip: (!args.documentId && args.collectionType !== SINGLE_TYPES) || opts?.skip,\n });\n const document = data?.data;\n const meta = data?.meta;\n\n const {\n components,\n schema,\n schemas,\n isLoading: isLoadingSchema,\n } = useContentTypeSchema(args.model);\n const isSingleType = schema?.kind === 'singleType';\n\n const getTitle = (mainField: string) => {\n // Always use mainField if it's not an id\n if (mainField !== 'id' && document?.[mainField]) {\n return document[mainField];\n }\n\n // When it's a singleType without a mainField, use the contentType displayName\n if (isSingleType && schema?.info.displayName) {\n return schema.info.displayName;\n }\n\n // Otherwise, use a fallback\n return formatMessage({\n id: 'content-manager.containers.untitled',\n defaultMessage: 'Untitled',\n });\n };\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [toggleNotification, error, formatAPIError, args.collectionType]);\n\n const validationSchema = React.useMemo(() => {\n if (!schema) {\n return null;\n }\n\n return createYupSchema(schema.attributes, components);\n }, [schema, components]);\n\n const validate = React.useCallback(\n (document: Modules.Documents.AnyDocument): FormErrors | null => {\n if (!validationSchema) {\n throw new Error(\n 'There is no validation schema generated, this is likely due to the schema not being loaded yet.'\n );\n }\n\n try {\n validationSchema.validateSync(document, { abortEarly: false, strict: true });\n return null;\n } catch (error) {\n if (error instanceof ValidationError) {\n return getYupValidationErrors(error);\n }\n\n throw error;\n }\n },\n [validationSchema]\n );\n\n /**\n * Here we prepare the form for editing, we need to:\n * - remove prohibited fields from the document (passwords | ADD YOURS WHEN THERES A NEW ONE)\n * - swap out count objects on relations for empty arrays\n * - set __temp_key__ on array objects for drag & drop\n *\n * We also prepare the form for new documents, so we need to:\n * - set default values on fields\n */\n const getInitialFormValues = React.useCallback(\n (isCreatingDocument: boolean = false) => {\n if ((!document && !isCreatingDocument && !isSingleType) || !schema) {\n return undefined;\n }\n\n /**\n * Check that we have an ID so we know the\n * document has been created in some way.\n */\n const form = document?.id ? document : createDefaultForm(schema, components);\n\n return transformDocument(schema, components)(form);\n },\n [document, isSingleType, schema, components]\n );\n\n const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;\n const hasError = !!error;\n\n return {\n components,\n document,\n meta,\n isLoading,\n hasError,\n schema,\n schemas,\n validate,\n getTitle,\n getInitialFormValues,\n refetch,\n } satisfies ReturnType<UseDocument>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDoc\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal this hook uses the router to extract the model, collection type & id from the url.\n * therefore, it shouldn't be used outside of the content-manager because it won't work as intended.\n */\nconst useDoc = () => {\n const { id, slug, collectionType, origin } = useParams<{\n id: string;\n origin: string;\n slug: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams();\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!slug) {\n throw new Error('Could not find model in url params');\n }\n\n const document = useDocument(\n { documentId: origin || id, model: slug, collectionType, params },\n {\n skip: id === 'create' || (!origin && !id && collectionType !== SINGLE_TYPES),\n }\n );\n\n const returnId = origin || id === 'create' ? undefined : id;\n\n return {\n collectionType,\n model: slug,\n id: returnId,\n ...document,\n };\n};\n\n/**\n * @public\n * @experimental\n * Content manager context hooks for plugin development.\n * Make sure to use this hook inside the content manager.\n */\nconst useContentManagerContext = () => {\n const {\n collectionType,\n model,\n id,\n components,\n isLoading: isLoadingDoc,\n schema,\n schemas,\n } = useDoc();\n\n const layout = useDocumentLayout(model);\n\n const form = useForm<unknown>('useContentManagerContext', (state) => state);\n\n const isSingleType = collectionType === SINGLE_TYPES;\n const slug = model;\n const isCreatingEntry = id === 'create';\n\n const {} = useContentTypeSchema();\n\n const isLoading = isLoadingDoc || layout.isLoading;\n const error = layout.error;\n\n return {\n error,\n isLoading,\n\n // Base metadata\n model,\n collectionType,\n id,\n slug,\n isCreatingEntry,\n isSingleType,\n hasDraftAndPublish: schema?.options?.draftAndPublish ?? false,\n\n // All schema infos\n components,\n contentType: schema,\n contentTypes: schemas,\n\n // Form state\n form,\n\n // layout infos\n layout,\n };\n};\n\nexport { useDocument, useDoc, useContentManagerContext };\nexport type { UseDocument, UseDocumentArgs, Document, Schema, ComponentsDictionary };\n"],"names":["useDocument","args","opts","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","formatMessage","useIntl","currentData","data","isLoading","isLoadingDocument","isFetching","isFetchingDocument","error","refetch","useGetDocumentQuery","skip","documentId","collectionType","SINGLE_TYPES","document","meta","components","schema","schemas","isLoadingSchema","useContentTypeSchema","model","isSingleType","kind","getTitle","mainField","info","displayName","id","defaultMessage","React","useEffect","type","message","validationSchema","useMemo","createYupSchema","attributes","validate","useCallback","Error","validateSync","abortEarly","strict","ValidationError","getYupValidationErrors","getInitialFormValues","isCreatingDocument","undefined","form","createDefaultForm","transformDocument","hasError","useDoc","slug","origin","useParams","query","useQueryParams","params","buildValidParams","returnId","useContentManagerContext","isLoadingDoc","layout","useDocumentLayout","useForm","state","isCreatingEntry","hasDraftAndPublish","options","draftAndPublish","contentType","contentTypes"],"mappings":"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"}
1
+ {"version":3,"file":"useDocument.js","sources":["../../../admin/src/hooks/useDocument.ts"],"sourcesContent":["/**\n * This hook doesn't use a context provider because we fetch directly from the server,\n * this sounds expensive but actually, it's really not. Because we have redux-toolkit-query\n * being a cache layer so if nothing invalidates the cache, we don't fetch again.\n */\n\nimport * as React from 'react';\n\nimport {\n useNotification,\n useAPIErrorHandler,\n useQueryParams,\n FormErrors,\n getYupValidationErrors,\n useForm,\n} from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useParams } from 'react-router-dom';\nimport { ValidationError } from 'yup';\n\nimport { SINGLE_TYPES } from '../constants/collections';\nimport { type AnyData, transformDocument } from '../pages/EditView/utils/data';\nimport { createDefaultForm } from '../pages/EditView/utils/forms';\nimport { useGetDocumentQuery } from '../services/documents';\nimport { buildValidParams } from '../utils/api';\nimport { createYupSchema } from '../utils/validation';\n\nimport { useContentTypeSchema, ComponentsDictionary } from './useContentTypeSchema';\nimport { useDocumentLayout } from './useDocumentLayout';\n\nimport type { FindOne } from '../../../shared/contracts/collection-types';\nimport type { ContentType } from '../../../shared/contracts/content-types';\nimport type { Modules } from '@strapi/types';\n\ninterface UseDocumentArgs {\n collectionType: string;\n model: string;\n documentId?: string;\n params?: object;\n}\n\ntype UseDocumentOpts = Parameters<typeof useGetDocumentQuery>[1];\n\ntype Document = FindOne.Response['data'];\n\ntype Schema = ContentType;\n\ntype UseDocument = (\n args: UseDocumentArgs,\n opts?: UseDocumentOpts\n) => {\n /**\n * These are the schemas of the components used in the content type, organised\n * by their uid.\n */\n components: ComponentsDictionary;\n document?: Document;\n meta?: FindOne.Response['meta'];\n isLoading: boolean;\n /**\n * This is the schema of the content type, it is not the same as the layout.\n */\n schema?: Schema;\n schemas?: Schema[];\n hasError?: boolean;\n refetch: () => void;\n validate: (document: Document) => null | FormErrors;\n /**\n * Get the document's title\n */\n getTitle: (mainField: string) => string;\n /**\n * Get the initial form values for the document\n */\n getInitialFormValues: (isCreatingDocument?: boolean) => AnyData | undefined;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocument\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @alpha\n * @public\n * @description Returns a document based on the model, collection type & id passed as arguments.\n * Also extracts its schema from the redux cache to be used for creating a validation schema.\n * @example\n * ```tsx\n * const { id, model, collectionType } = useParams<{ id: string; model: string; collectionType: string }>();\n *\n * if(!model || !collectionType) return null;\n *\n * const { document, isLoading, validate } = useDocument({ documentId: id, model, collectionType, params: { locale: 'en-GB' } })\n * const { update } = useDocumentActions()\n *\n * const onSubmit = async (document: Document) => {\n * const errors = validate(document);\n *\n * if(errors) {\n * // handle errors\n * }\n *\n * await update({ collectionType, model, id }, document)\n * }\n * ```\n *\n */\nconst useDocument: UseDocument = (args, opts) => {\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { formatMessage } = useIntl();\n\n const {\n currentData: data,\n isLoading: isLoadingDocument,\n isFetching: isFetchingDocument,\n error,\n refetch,\n } = useGetDocumentQuery(args, {\n ...opts,\n skip: (!args.documentId && args.collectionType !== SINGLE_TYPES) || opts?.skip,\n });\n const document = data?.data;\n const meta = data?.meta;\n\n const {\n components,\n schema,\n schemas,\n isLoading: isLoadingSchema,\n } = useContentTypeSchema(args.model);\n const isSingleType = schema?.kind === 'singleType';\n\n const getTitle = (mainField: string) => {\n // Always use mainField if it's not an id\n if (mainField !== 'id' && document?.[mainField]) {\n return document[mainField];\n }\n\n // When it's a singleType without a mainField, use the contentType displayName\n if (isSingleType && schema?.info.displayName) {\n return schema.info.displayName;\n }\n\n // Otherwise, use a fallback\n return formatMessage({\n id: 'content-manager.containers.untitled',\n defaultMessage: 'Untitled',\n });\n };\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [toggleNotification, error, formatAPIError, args.collectionType]);\n\n const validationSchema = React.useMemo(() => {\n if (!schema) {\n return null;\n }\n\n return createYupSchema(schema.attributes, components);\n }, [schema, components]);\n\n const validate = React.useCallback(\n (document: Modules.Documents.AnyDocument): FormErrors | null => {\n if (!validationSchema) {\n throw new Error(\n 'There is no validation schema generated, this is likely due to the schema not being loaded yet.'\n );\n }\n\n try {\n validationSchema.validateSync(document, { abortEarly: false, strict: true });\n return null;\n } catch (error) {\n if (error instanceof ValidationError) {\n return getYupValidationErrors(error);\n }\n\n throw error;\n }\n },\n [validationSchema]\n );\n\n /**\n * Here we prepare the form for editing, we need to:\n * - remove prohibited fields from the document (passwords | ADD YOURS WHEN THERES A NEW ONE)\n * - swap out count objects on relations for empty arrays\n * - set __temp_key__ on array objects for drag & drop\n *\n * We also prepare the form for new documents, so we need to:\n * - set default values on fields\n */\n const getInitialFormValues = React.useCallback(\n (isCreatingDocument: boolean = false) => {\n if ((!document && !isCreatingDocument && !isSingleType) || !schema) {\n return undefined;\n }\n\n /**\n * Check that we have an ID so we know the\n * document has been created in some way.\n */\n const form = document?.id ? document : createDefaultForm(schema, components);\n\n return transformDocument(schema, components)(form);\n },\n [document, isSingleType, schema, components]\n );\n\n const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;\n const hasError = !!error;\n\n return {\n components,\n document,\n meta,\n isLoading,\n hasError,\n schema,\n schemas,\n validate,\n getTitle,\n getInitialFormValues,\n refetch,\n } satisfies ReturnType<UseDocument>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDoc\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal this hook uses the router to extract the model, collection type & id from the url.\n * therefore, it shouldn't be used outside of the content-manager because it won't work as intended.\n */\nconst useDoc = () => {\n const { id, slug, collectionType, origin } = useParams<{\n id: string;\n origin: string;\n slug: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams();\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!slug) {\n throw new Error('Could not find model in url params');\n }\n\n const document = useDocument(\n { documentId: origin || id, model: slug, collectionType, params },\n {\n skip: id === 'create' || (!origin && !id && collectionType !== SINGLE_TYPES),\n }\n );\n\n const returnId = origin || (id === 'create' ? undefined : id);\n\n return {\n collectionType,\n model: slug,\n id: returnId,\n ...document,\n };\n};\n\n/**\n * @public\n * @experimental\n * Content manager context hooks for plugin development.\n * Make sure to use this hook inside the content manager.\n */\nconst useContentManagerContext = () => {\n const {\n collectionType,\n model,\n id,\n components,\n isLoading: isLoadingDoc,\n schema,\n schemas,\n } = useDoc();\n\n const layout = useDocumentLayout(model);\n\n const form = useForm<unknown>('useContentManagerContext', (state) => state);\n\n const isSingleType = collectionType === SINGLE_TYPES;\n const slug = model;\n const isCreatingEntry = id === 'create';\n\n const {} = useContentTypeSchema();\n\n const isLoading = isLoadingDoc || layout.isLoading;\n const error = layout.error;\n\n return {\n error,\n isLoading,\n\n // Base metadata\n model,\n collectionType,\n id,\n slug,\n isCreatingEntry,\n isSingleType,\n hasDraftAndPublish: schema?.options?.draftAndPublish ?? false,\n\n // All schema infos\n components,\n contentType: schema,\n contentTypes: schemas,\n\n // Form state\n form,\n\n // layout infos\n layout,\n };\n};\n\nexport { useDocument, useDoc, useContentManagerContext };\nexport type { UseDocument, UseDocumentArgs, Document, Schema, ComponentsDictionary };\n"],"names":["useDocument","args","opts","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","formatMessage","useIntl","currentData","data","isLoading","isLoadingDocument","isFetching","isFetchingDocument","error","refetch","useGetDocumentQuery","skip","documentId","collectionType","SINGLE_TYPES","document","meta","components","schema","schemas","isLoadingSchema","useContentTypeSchema","model","isSingleType","kind","getTitle","mainField","info","displayName","id","defaultMessage","React","useEffect","type","message","validationSchema","useMemo","createYupSchema","attributes","validate","useCallback","Error","validateSync","abortEarly","strict","ValidationError","getYupValidationErrors","getInitialFormValues","isCreatingDocument","undefined","form","createDefaultForm","transformDocument","hasError","useDoc","slug","origin","useParams","query","useQueryParams","params","buildValidParams","returnId","useContentManagerContext","isLoadingDoc","layout","useDocumentLayout","useForm","state","isCreatingEntry","hasDraftAndPublish","options","draftAndPublish","contentType","contentTypes"],"mappings":"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"}
@@ -171,7 +171,7 @@ import { useDocumentLayout } from './useDocumentLayout.mjs';
171
171
  }, {
172
172
  skip: id === 'create' || !origin && !id && collectionType !== SINGLE_TYPES
173
173
  });
174
- const returnId = origin || id === 'create' ? undefined : id;
174
+ const returnId = origin || (id === 'create' ? undefined : id);
175
175
  return {
176
176
  collectionType,
177
177
  model: slug,
@@ -1 +1 @@
1
- {"version":3,"file":"useDocument.mjs","sources":["../../../admin/src/hooks/useDocument.ts"],"sourcesContent":["/**\n * This hook doesn't use a context provider because we fetch directly from the server,\n * this sounds expensive but actually, it's really not. Because we have redux-toolkit-query\n * being a cache layer so if nothing invalidates the cache, we don't fetch again.\n */\n\nimport * as React from 'react';\n\nimport {\n useNotification,\n useAPIErrorHandler,\n useQueryParams,\n FormErrors,\n getYupValidationErrors,\n useForm,\n} from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useParams } from 'react-router-dom';\nimport { ValidationError } from 'yup';\n\nimport { SINGLE_TYPES } from '../constants/collections';\nimport { type AnyData, transformDocument } from '../pages/EditView/utils/data';\nimport { createDefaultForm } from '../pages/EditView/utils/forms';\nimport { useGetDocumentQuery } from '../services/documents';\nimport { buildValidParams } from '../utils/api';\nimport { createYupSchema } from '../utils/validation';\n\nimport { useContentTypeSchema, ComponentsDictionary } from './useContentTypeSchema';\nimport { useDocumentLayout } from './useDocumentLayout';\n\nimport type { FindOne } from '../../../shared/contracts/collection-types';\nimport type { ContentType } from '../../../shared/contracts/content-types';\nimport type { Modules } from '@strapi/types';\n\ninterface UseDocumentArgs {\n collectionType: string;\n model: string;\n documentId?: string;\n params?: object;\n}\n\ntype UseDocumentOpts = Parameters<typeof useGetDocumentQuery>[1];\n\ntype Document = FindOne.Response['data'];\n\ntype Schema = ContentType;\n\ntype UseDocument = (\n args: UseDocumentArgs,\n opts?: UseDocumentOpts\n) => {\n /**\n * These are the schemas of the components used in the content type, organised\n * by their uid.\n */\n components: ComponentsDictionary;\n document?: Document;\n meta?: FindOne.Response['meta'];\n isLoading: boolean;\n /**\n * This is the schema of the content type, it is not the same as the layout.\n */\n schema?: Schema;\n schemas?: Schema[];\n hasError?: boolean;\n refetch: () => void;\n validate: (document: Document) => null | FormErrors;\n /**\n * Get the document's title\n */\n getTitle: (mainField: string) => string;\n /**\n * Get the initial form values for the document\n */\n getInitialFormValues: (isCreatingDocument?: boolean) => AnyData | undefined;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocument\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @alpha\n * @public\n * @description Returns a document based on the model, collection type & id passed as arguments.\n * Also extracts its schema from the redux cache to be used for creating a validation schema.\n * @example\n * ```tsx\n * const { id, model, collectionType } = useParams<{ id: string; model: string; collectionType: string }>();\n *\n * if(!model || !collectionType) return null;\n *\n * const { document, isLoading, validate } = useDocument({ documentId: id, model, collectionType, params: { locale: 'en-GB' } })\n * const { update } = useDocumentActions()\n *\n * const onSubmit = async (document: Document) => {\n * const errors = validate(document);\n *\n * if(errors) {\n * // handle errors\n * }\n *\n * await update({ collectionType, model, id }, document)\n * }\n * ```\n *\n */\nconst useDocument: UseDocument = (args, opts) => {\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { formatMessage } = useIntl();\n\n const {\n currentData: data,\n isLoading: isLoadingDocument,\n isFetching: isFetchingDocument,\n error,\n refetch,\n } = useGetDocumentQuery(args, {\n ...opts,\n skip: (!args.documentId && args.collectionType !== SINGLE_TYPES) || opts?.skip,\n });\n const document = data?.data;\n const meta = data?.meta;\n\n const {\n components,\n schema,\n schemas,\n isLoading: isLoadingSchema,\n } = useContentTypeSchema(args.model);\n const isSingleType = schema?.kind === 'singleType';\n\n const getTitle = (mainField: string) => {\n // Always use mainField if it's not an id\n if (mainField !== 'id' && document?.[mainField]) {\n return document[mainField];\n }\n\n // When it's a singleType without a mainField, use the contentType displayName\n if (isSingleType && schema?.info.displayName) {\n return schema.info.displayName;\n }\n\n // Otherwise, use a fallback\n return formatMessage({\n id: 'content-manager.containers.untitled',\n defaultMessage: 'Untitled',\n });\n };\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [toggleNotification, error, formatAPIError, args.collectionType]);\n\n const validationSchema = React.useMemo(() => {\n if (!schema) {\n return null;\n }\n\n return createYupSchema(schema.attributes, components);\n }, [schema, components]);\n\n const validate = React.useCallback(\n (document: Modules.Documents.AnyDocument): FormErrors | null => {\n if (!validationSchema) {\n throw new Error(\n 'There is no validation schema generated, this is likely due to the schema not being loaded yet.'\n );\n }\n\n try {\n validationSchema.validateSync(document, { abortEarly: false, strict: true });\n return null;\n } catch (error) {\n if (error instanceof ValidationError) {\n return getYupValidationErrors(error);\n }\n\n throw error;\n }\n },\n [validationSchema]\n );\n\n /**\n * Here we prepare the form for editing, we need to:\n * - remove prohibited fields from the document (passwords | ADD YOURS WHEN THERES A NEW ONE)\n * - swap out count objects on relations for empty arrays\n * - set __temp_key__ on array objects for drag & drop\n *\n * We also prepare the form for new documents, so we need to:\n * - set default values on fields\n */\n const getInitialFormValues = React.useCallback(\n (isCreatingDocument: boolean = false) => {\n if ((!document && !isCreatingDocument && !isSingleType) || !schema) {\n return undefined;\n }\n\n /**\n * Check that we have an ID so we know the\n * document has been created in some way.\n */\n const form = document?.id ? document : createDefaultForm(schema, components);\n\n return transformDocument(schema, components)(form);\n },\n [document, isSingleType, schema, components]\n );\n\n const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;\n const hasError = !!error;\n\n return {\n components,\n document,\n meta,\n isLoading,\n hasError,\n schema,\n schemas,\n validate,\n getTitle,\n getInitialFormValues,\n refetch,\n } satisfies ReturnType<UseDocument>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDoc\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal this hook uses the router to extract the model, collection type & id from the url.\n * therefore, it shouldn't be used outside of the content-manager because it won't work as intended.\n */\nconst useDoc = () => {\n const { id, slug, collectionType, origin } = useParams<{\n id: string;\n origin: string;\n slug: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams();\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!slug) {\n throw new Error('Could not find model in url params');\n }\n\n const document = useDocument(\n { documentId: origin || id, model: slug, collectionType, params },\n {\n skip: id === 'create' || (!origin && !id && collectionType !== SINGLE_TYPES),\n }\n );\n\n const returnId = origin || id === 'create' ? undefined : id;\n\n return {\n collectionType,\n model: slug,\n id: returnId,\n ...document,\n };\n};\n\n/**\n * @public\n * @experimental\n * Content manager context hooks for plugin development.\n * Make sure to use this hook inside the content manager.\n */\nconst useContentManagerContext = () => {\n const {\n collectionType,\n model,\n id,\n components,\n isLoading: isLoadingDoc,\n schema,\n schemas,\n } = useDoc();\n\n const layout = useDocumentLayout(model);\n\n const form = useForm<unknown>('useContentManagerContext', (state) => state);\n\n const isSingleType = collectionType === SINGLE_TYPES;\n const slug = model;\n const isCreatingEntry = id === 'create';\n\n const {} = useContentTypeSchema();\n\n const isLoading = isLoadingDoc || layout.isLoading;\n const error = layout.error;\n\n return {\n error,\n isLoading,\n\n // Base metadata\n model,\n collectionType,\n id,\n slug,\n isCreatingEntry,\n isSingleType,\n hasDraftAndPublish: schema?.options?.draftAndPublish ?? false,\n\n // All schema infos\n components,\n contentType: schema,\n contentTypes: schemas,\n\n // Form state\n form,\n\n // layout infos\n layout,\n };\n};\n\nexport { useDocument, useDoc, useContentManagerContext };\nexport type { UseDocument, UseDocumentArgs, Document, Schema, ComponentsDictionary };\n"],"names":["useDocument","args","opts","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","formatMessage","useIntl","currentData","data","isLoading","isLoadingDocument","isFetching","isFetchingDocument","error","refetch","useGetDocumentQuery","skip","documentId","collectionType","SINGLE_TYPES","document","meta","components","schema","schemas","isLoadingSchema","useContentTypeSchema","model","isSingleType","kind","getTitle","mainField","info","displayName","id","defaultMessage","React","useEffect","type","message","validationSchema","useMemo","createYupSchema","attributes","validate","useCallback","Error","validateSync","abortEarly","strict","ValidationError","getYupValidationErrors","getInitialFormValues","isCreatingDocument","undefined","form","createDefaultForm","transformDocument","hasError","useDoc","slug","origin","useParams","query","useQueryParams","params","buildValidParams","returnId","useContentManagerContext","isLoadingDoc","layout","useDocumentLayout","useForm","state","isCreatingEntry","hasDraftAndPublish","options","draftAndPublish","contentType","contentTypes"],"mappings":"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"}
1
+ {"version":3,"file":"useDocument.mjs","sources":["../../../admin/src/hooks/useDocument.ts"],"sourcesContent":["/**\n * This hook doesn't use a context provider because we fetch directly from the server,\n * this sounds expensive but actually, it's really not. Because we have redux-toolkit-query\n * being a cache layer so if nothing invalidates the cache, we don't fetch again.\n */\n\nimport * as React from 'react';\n\nimport {\n useNotification,\n useAPIErrorHandler,\n useQueryParams,\n FormErrors,\n getYupValidationErrors,\n useForm,\n} from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useParams } from 'react-router-dom';\nimport { ValidationError } from 'yup';\n\nimport { SINGLE_TYPES } from '../constants/collections';\nimport { type AnyData, transformDocument } from '../pages/EditView/utils/data';\nimport { createDefaultForm } from '../pages/EditView/utils/forms';\nimport { useGetDocumentQuery } from '../services/documents';\nimport { buildValidParams } from '../utils/api';\nimport { createYupSchema } from '../utils/validation';\n\nimport { useContentTypeSchema, ComponentsDictionary } from './useContentTypeSchema';\nimport { useDocumentLayout } from './useDocumentLayout';\n\nimport type { FindOne } from '../../../shared/contracts/collection-types';\nimport type { ContentType } from '../../../shared/contracts/content-types';\nimport type { Modules } from '@strapi/types';\n\ninterface UseDocumentArgs {\n collectionType: string;\n model: string;\n documentId?: string;\n params?: object;\n}\n\ntype UseDocumentOpts = Parameters<typeof useGetDocumentQuery>[1];\n\ntype Document = FindOne.Response['data'];\n\ntype Schema = ContentType;\n\ntype UseDocument = (\n args: UseDocumentArgs,\n opts?: UseDocumentOpts\n) => {\n /**\n * These are the schemas of the components used in the content type, organised\n * by their uid.\n */\n components: ComponentsDictionary;\n document?: Document;\n meta?: FindOne.Response['meta'];\n isLoading: boolean;\n /**\n * This is the schema of the content type, it is not the same as the layout.\n */\n schema?: Schema;\n schemas?: Schema[];\n hasError?: boolean;\n refetch: () => void;\n validate: (document: Document) => null | FormErrors;\n /**\n * Get the document's title\n */\n getTitle: (mainField: string) => string;\n /**\n * Get the initial form values for the document\n */\n getInitialFormValues: (isCreatingDocument?: boolean) => AnyData | undefined;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocument\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @alpha\n * @public\n * @description Returns a document based on the model, collection type & id passed as arguments.\n * Also extracts its schema from the redux cache to be used for creating a validation schema.\n * @example\n * ```tsx\n * const { id, model, collectionType } = useParams<{ id: string; model: string; collectionType: string }>();\n *\n * if(!model || !collectionType) return null;\n *\n * const { document, isLoading, validate } = useDocument({ documentId: id, model, collectionType, params: { locale: 'en-GB' } })\n * const { update } = useDocumentActions()\n *\n * const onSubmit = async (document: Document) => {\n * const errors = validate(document);\n *\n * if(errors) {\n * // handle errors\n * }\n *\n * await update({ collectionType, model, id }, document)\n * }\n * ```\n *\n */\nconst useDocument: UseDocument = (args, opts) => {\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { formatMessage } = useIntl();\n\n const {\n currentData: data,\n isLoading: isLoadingDocument,\n isFetching: isFetchingDocument,\n error,\n refetch,\n } = useGetDocumentQuery(args, {\n ...opts,\n skip: (!args.documentId && args.collectionType !== SINGLE_TYPES) || opts?.skip,\n });\n const document = data?.data;\n const meta = data?.meta;\n\n const {\n components,\n schema,\n schemas,\n isLoading: isLoadingSchema,\n } = useContentTypeSchema(args.model);\n const isSingleType = schema?.kind === 'singleType';\n\n const getTitle = (mainField: string) => {\n // Always use mainField if it's not an id\n if (mainField !== 'id' && document?.[mainField]) {\n return document[mainField];\n }\n\n // When it's a singleType without a mainField, use the contentType displayName\n if (isSingleType && schema?.info.displayName) {\n return schema.info.displayName;\n }\n\n // Otherwise, use a fallback\n return formatMessage({\n id: 'content-manager.containers.untitled',\n defaultMessage: 'Untitled',\n });\n };\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [toggleNotification, error, formatAPIError, args.collectionType]);\n\n const validationSchema = React.useMemo(() => {\n if (!schema) {\n return null;\n }\n\n return createYupSchema(schema.attributes, components);\n }, [schema, components]);\n\n const validate = React.useCallback(\n (document: Modules.Documents.AnyDocument): FormErrors | null => {\n if (!validationSchema) {\n throw new Error(\n 'There is no validation schema generated, this is likely due to the schema not being loaded yet.'\n );\n }\n\n try {\n validationSchema.validateSync(document, { abortEarly: false, strict: true });\n return null;\n } catch (error) {\n if (error instanceof ValidationError) {\n return getYupValidationErrors(error);\n }\n\n throw error;\n }\n },\n [validationSchema]\n );\n\n /**\n * Here we prepare the form for editing, we need to:\n * - remove prohibited fields from the document (passwords | ADD YOURS WHEN THERES A NEW ONE)\n * - swap out count objects on relations for empty arrays\n * - set __temp_key__ on array objects for drag & drop\n *\n * We also prepare the form for new documents, so we need to:\n * - set default values on fields\n */\n const getInitialFormValues = React.useCallback(\n (isCreatingDocument: boolean = false) => {\n if ((!document && !isCreatingDocument && !isSingleType) || !schema) {\n return undefined;\n }\n\n /**\n * Check that we have an ID so we know the\n * document has been created in some way.\n */\n const form = document?.id ? document : createDefaultForm(schema, components);\n\n return transformDocument(schema, components)(form);\n },\n [document, isSingleType, schema, components]\n );\n\n const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;\n const hasError = !!error;\n\n return {\n components,\n document,\n meta,\n isLoading,\n hasError,\n schema,\n schemas,\n validate,\n getTitle,\n getInitialFormValues,\n refetch,\n } satisfies ReturnType<UseDocument>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDoc\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal this hook uses the router to extract the model, collection type & id from the url.\n * therefore, it shouldn't be used outside of the content-manager because it won't work as intended.\n */\nconst useDoc = () => {\n const { id, slug, collectionType, origin } = useParams<{\n id: string;\n origin: string;\n slug: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams();\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!slug) {\n throw new Error('Could not find model in url params');\n }\n\n const document = useDocument(\n { documentId: origin || id, model: slug, collectionType, params },\n {\n skip: id === 'create' || (!origin && !id && collectionType !== SINGLE_TYPES),\n }\n );\n\n const returnId = origin || (id === 'create' ? undefined : id);\n\n return {\n collectionType,\n model: slug,\n id: returnId,\n ...document,\n };\n};\n\n/**\n * @public\n * @experimental\n * Content manager context hooks for plugin development.\n * Make sure to use this hook inside the content manager.\n */\nconst useContentManagerContext = () => {\n const {\n collectionType,\n model,\n id,\n components,\n isLoading: isLoadingDoc,\n schema,\n schemas,\n } = useDoc();\n\n const layout = useDocumentLayout(model);\n\n const form = useForm<unknown>('useContentManagerContext', (state) => state);\n\n const isSingleType = collectionType === SINGLE_TYPES;\n const slug = model;\n const isCreatingEntry = id === 'create';\n\n const {} = useContentTypeSchema();\n\n const isLoading = isLoadingDoc || layout.isLoading;\n const error = layout.error;\n\n return {\n error,\n isLoading,\n\n // Base metadata\n model,\n collectionType,\n id,\n slug,\n isCreatingEntry,\n isSingleType,\n hasDraftAndPublish: schema?.options?.draftAndPublish ?? false,\n\n // All schema infos\n components,\n contentType: schema,\n contentTypes: schemas,\n\n // Form state\n form,\n\n // layout infos\n layout,\n };\n};\n\nexport { useDocument, useDoc, useContentManagerContext };\nexport type { UseDocument, UseDocumentArgs, Document, Schema, ComponentsDictionary };\n"],"names":["useDocument","args","opts","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","formatMessage","useIntl","currentData","data","isLoading","isLoadingDocument","isFetching","isFetchingDocument","error","refetch","useGetDocumentQuery","skip","documentId","collectionType","SINGLE_TYPES","document","meta","components","schema","schemas","isLoadingSchema","useContentTypeSchema","model","isSingleType","kind","getTitle","mainField","info","displayName","id","defaultMessage","React","useEffect","type","message","validationSchema","useMemo","createYupSchema","attributes","validate","useCallback","Error","validateSync","abortEarly","strict","ValidationError","getYupValidationErrors","getInitialFormValues","isCreatingDocument","undefined","form","createDefaultForm","transformDocument","hasError","useDoc","slug","origin","useParams","query","useQueryParams","params","buildValidParams","returnId","useContentManagerContext","isLoadingDoc","layout","useDocumentLayout","useForm","state","isCreatingEntry","hasDraftAndPublish","options","draftAndPublish","contentType","contentTypes"],"mappings":"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"}