@strapi/content-manager 5.43.0 → 5.45.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.
- package/dist/admin/components/Widgets.js +1 -1
- package/dist/admin/components/Widgets.js.map +1 -1
- package/dist/admin/components/Widgets.mjs +1 -1
- package/dist/admin/components/Widgets.mjs.map +1 -1
- package/dist/admin/hooks/useDocument.js +3 -2
- package/dist/admin/hooks/useDocument.js.map +1 -1
- package/dist/admin/hooks/useDocument.mjs +3 -2
- package/dist/admin/hooks/useDocument.mjs.map +1 -1
- package/dist/admin/hooks/useDocumentLayout.js +2 -2
- package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
- package/dist/admin/hooks/useDocumentLayout.mjs +2 -2
- package/dist/admin/hooks/useDocumentLayout.mjs.map +1 -1
- package/dist/admin/hooks/usePersistentQueryParams.js +11 -5
- package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
- package/dist/admin/hooks/usePersistentQueryParams.mjs +12 -6
- package/dist/admin/hooks/usePersistentQueryParams.mjs.map +1 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.js +5 -3
- package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.mjs +5 -3
- package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +2 -0
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +2 -0
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/data.js +8 -0
- package/dist/admin/pages/EditView/utils/data.js.map +1 -1
- package/dist/admin/pages/EditView/utils/data.mjs +8 -0
- package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +22 -5
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +22 -5
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/src/hooks/useDocument.d.ts +1 -1
- package/dist/admin/src/hooks/usePersistentQueryParams.d.ts +3 -1
- package/dist/admin/src/index.d.ts +2 -1
- package/dist/admin/translations/cs.json.js +242 -8
- package/dist/admin/translations/cs.json.js.map +1 -1
- package/dist/admin/translations/cs.json.mjs +242 -9
- package/dist/admin/translations/cs.json.mjs.map +1 -1
- package/dist/server/controllers/collection-types.js +78 -1
- package/dist/server/controllers/collection-types.js.map +1 -1
- package/dist/server/controllers/collection-types.mjs +78 -1
- package/dist/server/controllers/collection-types.mjs.map +1 -1
- package/dist/server/controllers/validation/dimensions.js +17 -18
- package/dist/server/controllers/validation/dimensions.js.map +1 -1
- package/dist/server/controllers/validation/dimensions.mjs +18 -19
- package/dist/server/controllers/validation/dimensions.mjs.map +1 -1
- package/dist/server/controllers/validation/index.js +25 -23
- package/dist/server/controllers/validation/index.js.map +1 -1
- package/dist/server/controllers/validation/index.mjs +26 -24
- package/dist/server/controllers/validation/index.mjs.map +1 -1
- package/dist/server/controllers/validation/relations.js +21 -24
- package/dist/server/controllers/validation/relations.js.map +1 -1
- package/dist/server/controllers/validation/relations.mjs +22 -25
- package/dist/server/controllers/validation/relations.mjs.map +1 -1
- package/dist/server/history/controllers/validation/history-version.js +4 -24
- package/dist/server/history/controllers/validation/history-version.js.map +1 -1
- package/dist/server/history/controllers/validation/history-version.mjs +5 -6
- package/dist/server/history/controllers/validation/history-version.mjs.map +1 -1
- package/dist/server/history/services/lifecycles.js +1 -1
- package/dist/server/history/services/lifecycles.js.map +1 -1
- package/dist/server/history/services/lifecycles.mjs +1 -1
- package/dist/server/history/services/lifecycles.mjs.map +1 -1
- package/dist/server/homepage/controllers/homepage.js +6 -26
- package/dist/server/homepage/controllers/homepage.js.map +1 -1
- package/dist/server/homepage/controllers/homepage.mjs +7 -8
- package/dist/server/homepage/controllers/homepage.mjs.map +1 -1
- package/dist/server/preview/controllers/validation/preview.js +6 -26
- package/dist/server/preview/controllers/validation/preview.js.map +1 -1
- package/dist/server/preview/controllers/validation/preview.mjs +7 -8
- package/dist/server/preview/controllers/validation/preview.mjs.map +1 -1
- package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/dimensions.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/index.d.ts +16 -15
- package/dist/server/src/controllers/validation/index.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/relations.d.ts +17 -2
- package/dist/server/src/controllers/validation/relations.d.ts.map +1 -1
- package/dist/server/src/history/controllers/validation/history-version.d.ts +3 -1
- package/dist/server/src/history/controllers/validation/history-version.d.ts.map +1 -1
- package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -1
- package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -1
- package/dist/server/src/validation/policies/hasPermissions.d.ts +4 -1
- package/dist/server/src/validation/policies/hasPermissions.d.ts.map +1 -1
- package/dist/server/src/validation/zod.d.ts +34 -0
- package/dist/server/src/validation/zod.d.ts.map +1 -0
- package/dist/server/validation/policies/hasPermissions.js +4 -4
- package/dist/server/validation/policies/hasPermissions.js.map +1 -1
- package/dist/server/validation/policies/hasPermissions.mjs +5 -5
- package/dist/server/validation/policies/hasPermissions.mjs.map +1 -1
- package/dist/server/validation/zod.js +60 -0
- package/dist/server/validation/zod.js.map +1 -0
- package/dist/server/validation/zod.mjs +56 -0
- package/dist/server/validation/zod.mjs.map +1 -0
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Widgets.js","sources":["../../../admin/src/components/Widgets.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Widget, useTracking, useGetCountDocumentsQuery } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n IconButton,\n Table,\n Tbody,\n Td,\n Tr,\n Typography,\n Portal,\n} from '@strapi/design-system';\nimport { Pencil } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link, useNavigate } from 'react-router-dom';\nimport { styled, DefaultTheme } from 'styled-components';\n\nimport { DocumentStatus } from '../pages/EditView/components/DocumentStatus';\nimport { useGetRecentDocumentsQuery } from '../services/homepage';\n\nimport { RelativeTime } from './RelativeTime';\n\nimport type { RecentDocument } from '../../../shared/contracts/homepage';\n\nconst BASE_MAX_WIDTH = '14.4rem';\n\n/**\n * Calculate dynamic max-width based on column span\n * Base width is 14.4rem for 6 columns, scale proportionally\n */\nconst calculateDynamicMaxWidth = (columnWidth: number = 4): string => {\n const baseColumnWidth = 4;\n const baseMaxWidth = 14.4; // rem\n const calculatedWidth = (baseMaxWidth * columnWidth) / baseColumnWidth;\n return `${Math.round(calculatedWidth * 10) / 10}rem`;\n};\n\nconst CellTypography = styled(Typography)<{ $maxWidth?: string }>`\n display: block;\n max-width: ${({ $maxWidth }) => $maxWidth || BASE_MAX_WIDTH};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst RecentDocumentsTable = ({\n documents,\n type,\n dynamicMaxWidth = BASE_MAX_WIDTH,\n}: {\n documents: RecentDocument[];\n type: 'edited' | 'published';\n dynamicMaxWidth?: string;\n}) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const navigate = useNavigate();\n\n const getEditViewLink = (document: RecentDocument): string => {\n const isSingleType = document.kind === 'singleType';\n const kindPath = isSingleType ? 'single-types' : 'collection-types';\n const queryParams = document.locale ? `?plugins[i18n][locale]=${document.locale}` : '';\n\n return `/content-manager/${kindPath}/${document.contentTypeUid}${isSingleType ? '' : '/' + document.documentId}${queryParams}`;\n };\n\n const handleRowClick = (document: RecentDocument) => () => {\n trackUsage('willEditEntryFromHome', {\n entryType: type,\n });\n const link = getEditViewLink(document);\n navigate(link);\n };\n\n return (\n <Table colCount={5} rowCount={documents?.length ?? 0}>\n <Tbody>\n {documents?.map((document) => (\n <Tr onClick={handleRowClick(document)} cursor=\"pointer\" key={document.documentId}>\n <Td>\n <CellTypography\n title={document.title}\n variant=\"omega\"\n textColor=\"neutral800\"\n $maxWidth={dynamicMaxWidth}\n >\n {document.title}\n </CellTypography>\n </Td>\n <Td>\n <CellTypography variant=\"omega\" textColor=\"neutral600\" $maxWidth={dynamicMaxWidth}>\n {document.kind === 'singleType'\n ? formatMessage({\n id: 'content-manager.widget.last-edited.single-type',\n defaultMessage: 'Single-Type',\n })\n : formatMessage({\n id: document.contentTypeDisplayName,\n defaultMessage: document.contentTypeDisplayName,\n })}\n </CellTypography>\n </Td>\n <Td>\n <Box display=\"inline-block\">\n {document.status ? (\n <DocumentStatus status={document.status} />\n ) : (\n <Typography textColor=\"neutral600\" aria-hidden>\n -\n </Typography>\n )}\n </Box>\n </Td>\n <Td>\n <Typography textColor=\"neutral600\">\n <RelativeTime timestamp={new Date(document.updatedAt)} />\n </Typography>\n </Td>\n <Td onClick={(e) => e.stopPropagation()}>\n <Box display=\"inline-block\">\n <IconButton\n tag={Link}\n to={getEditViewLink(document)}\n onClick={() => trackUsage('willEditEntryFromHome', { type })}\n label={formatMessage({\n id: 'content-manager.actions.edit.label',\n defaultMessage: 'Edit',\n })}\n variant=\"ghost\"\n >\n <Pencil />\n </IconButton>\n </Box>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LastEditedWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst LastEditedWidget = ({ columnWidth = 6 }: { columnWidth?: number }) => {\n const { formatMessage } = useIntl();\n const { data, isLoading, error } = useGetRecentDocumentsQuery({ action: 'update' });\n\n const dynamicMaxWidth = calculateDynamicMaxWidth(columnWidth);\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error || !data) {\n return <Widget.Error />;\n }\n\n if (data.length === 0) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'content-manager.widget.last-edited.no-data',\n defaultMessage: 'No edited entries',\n })}\n </Widget.NoData>\n );\n }\n\n return <RecentDocumentsTable documents={data} type=\"edited\" dynamicMaxWidth={dynamicMaxWidth} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LastPublishedWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst LastPublishedWidget = ({ columnWidth = 6 }: { columnWidth?: number }) => {\n const { formatMessage } = useIntl();\n const { data, isLoading, error } = useGetRecentDocumentsQuery({ action: 'publish' });\n\n const dynamicMaxWidth = calculateDynamicMaxWidth(columnWidth);\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error || !data) {\n return <Widget.Error />;\n }\n\n if (data.length === 0) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'content-manager.widget.last-published.no-data',\n defaultMessage: 'No published entries',\n })}\n </Widget.NoData>\n );\n }\n\n return (\n <RecentDocumentsTable documents={data} type=\"published\" dynamicMaxWidth={dynamicMaxWidth} />\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ChartEntriesWidget\n * -----------------------------------------------------------------------------------------------*/\nconst RADIUS = 80;\nconst STROKE = 10;\nconst CIRCUMFERENCE = 2 * Math.PI * (RADIUS - STROKE / 2);\n\ntype ThemeColor = keyof DefaultTheme['colors'];\n\nconst ArcChart = styled.circle<{ $arcColor: ThemeColor }>`\n stroke: ${({ theme, $arcColor }) => theme.colors[$arcColor]};\n`;\n\nconst TextChart = styled.tspan<{ $textColor: ThemeColor }>`\n text-transform: lowercase;\n fill: ${({ theme, $textColor }) => theme.colors[$textColor]};\n`;\n\nconst KeyChartItem = styled(Flex)`\n width: 100%;\n\n ${({ theme }) => theme.breakpoints.small} {\n width: auto;\n }\n`;\n\ninterface ChartData {\n label: string;\n count: number;\n color: ThemeColor;\n}\n\nconst DonutChartSVG = ({ data }: { data: ChartData[] }) => {\n const { locale } = useIntl();\n const { formatMessage } = useIntl();\n const total = data.reduce((acc, curr) => acc + curr.count, 0);\n const [tooltip, setTooltip] = React.useState<{\n visible: boolean;\n x: number;\n y: number;\n value: ChartData | null;\n isTouch?: boolean;\n }>({ visible: false, x: 0, y: 0, value: null });\n\n let cumulativePercent = 0;\n\n const handleMouseOver = (e: React.MouseEvent<SVGCircleElement>, value: ChartData) => {\n setTooltip({\n visible: true,\n x: e.clientX,\n y: e.clientY,\n value,\n });\n };\n const handleMouseOut = () => {\n setTooltip((t) => ({ ...t, visible: false }));\n };\n\n const handleFocus = (e: React.FocusEvent<SVGCircleElement>, value: ChartData) => {\n setTooltip({\n visible: true,\n x:\n e.currentTarget.getBoundingClientRect().width / 2 +\n e.currentTarget.getBoundingClientRect().left,\n y:\n e.currentTarget.getBoundingClientRect().height +\n e.currentTarget.getBoundingClientRect().top,\n value,\n });\n };\n\n return (\n <Flex direction=\"column\" gap={6} margin=\"auto\">\n <svg\n width={RADIUS * 2}\n height={RADIUS * 2}\n viewBox={`0 0 ${RADIUS * 2} ${RADIUS * 2}`}\n style={{ position: 'relative', zIndex: 1 }}\n >\n <g transform={`rotate(-90 ${RADIUS} ${RADIUS})`}>\n {data.map((value) => {\n const percent = (value.count / total) * 100;\n const arcLength = (percent / 100) * CIRCUMFERENCE;\n const dashArray = `${arcLength} ${CIRCUMFERENCE - arcLength}`;\n const dashOffset = CIRCUMFERENCE * (1 - cumulativePercent / 100);\n const el = (\n <ArcChart\n key={value.label}\n cx={RADIUS}\n cy={RADIUS}\n r={RADIUS - STROKE / 2}\n fill=\"none\"\n strokeWidth={STROKE}\n strokeDasharray={dashArray}\n strokeDashoffset={dashOffset}\n style={{ transition: 'stroke-dashoffset 0.3s', cursor: 'pointer' }}\n tabIndex={0}\n aria-describedby={tooltip.visible ? 'chart-tooltip' : undefined}\n onFocus={(e) => handleFocus(e, value)}\n onBlur={handleMouseOut}\n onMouseMove={(e) => handleMouseOver(e, value)}\n onMouseLeave={handleMouseOut}\n $arcColor={value.color}\n />\n );\n cumulativePercent += percent;\n return el;\n })}\n </g>\n <text x={RADIUS} y={RADIUS} textAnchor=\"middle\" fontSize=\"2.4rem\" fontWeight=\"bold\">\n <TextChart x={RADIUS} dy=\"0\" $textColor=\"neutral800\">\n {new Intl.NumberFormat(locale, {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(total)}\n </TextChart>\n <TextChart\n x={RADIUS}\n dy=\"1.4em\"\n fontSize=\"1.4rem\"\n fontWeight=\"normal\"\n $textColor=\"neutral600\"\n >\n {formatMessage(\n {\n id: 'content-manager.widget.chart-entries.count.label',\n defaultMessage: '{count, plural, =0 {entries} one {entry} other {entries}}',\n },\n { count: total }\n )}\n </TextChart>\n </text>\n </svg>\n {tooltip.visible && tooltip.value && (\n <Portal\n style={{\n position: 'fixed',\n left: 16,\n top: 16,\n zIndex: 2,\n transform: `translate(${tooltip.x}px, ${tooltip.y}px)`,\n }}\n data-testid=\"entries-chart-tooltip\"\n >\n <Box\n background=\"neutral900\"\n padding={2}\n borderRadius={1}\n textAlign=\"center\"\n role=\"tooltip\"\n aria-live=\"polite\"\n >\n <Typography textColor=\"neutral0\">\n {formatMessage(\n {\n id: 'content-manager.widget.chart-entries.tooltip',\n defaultMessage: '{count} items',\n },\n {\n count: tooltip.value.count,\n label: tooltip.value.label,\n }\n )}\n </Typography>\n </Box>\n </Portal>\n )}\n <Flex gap={4} wrap=\"wrap\">\n {data.map(\n (value) =>\n value.count > 0 && (\n <KeyChartItem gap={1} key={value.label}>\n <Box background={value.color} padding={2} borderRadius={1} />\n <Typography variant=\"pi\">{value.label}</Typography>\n </KeyChartItem>\n )\n )}\n </Flex>\n </Flex>\n );\n};\n\nconst ChartEntriesWidget = () => {\n const { formatMessage } = useIntl();\n const { data: countDocuments, isLoading, error } = useGetCountDocumentsQuery();\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error) {\n return <Widget.Error />;\n }\n\n const { draft, published, modified } = countDocuments ?? {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n const total = draft + published + modified;\n\n if (!total) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'content-manager.widget.last-published.no-data',\n defaultMessage: 'No published entries',\n })}\n </Widget.NoData>\n );\n }\n\n return (\n <Flex minHeight=\"100%\">\n <DonutChartSVG\n data={[\n {\n label: formatMessage({\n id: 'content-manager.containers.List.draft',\n defaultMessage: 'Draft',\n }),\n count: draft,\n color: 'secondary500',\n },\n {\n label: formatMessage({\n id: 'content-manager.containers.List.modified',\n defaultMessage: 'Modified',\n }),\n count: modified,\n color: 'alternative500',\n },\n {\n label: formatMessage({\n id: 'content-manager.containers.List.published',\n defaultMessage: 'Published',\n }),\n count: published,\n color: 'success500',\n },\n ]}\n />\n </Flex>\n );\n};\n\nexport { ChartEntriesWidget, LastEditedWidget, LastPublishedWidget };\n"],"names":["BASE_MAX_WIDTH","calculateDynamicMaxWidth","columnWidth","baseColumnWidth","baseMaxWidth","calculatedWidth","Math","round","CellTypography","styled","Typography","$maxWidth","RecentDocumentsTable","documents","type","dynamicMaxWidth","formatMessage","useIntl","trackUsage","useTracking","navigate","useNavigate","getEditViewLink","document","isSingleType","kind","kindPath","queryParams","locale","contentTypeUid","documentId","handleRowClick","entryType","link","_jsx","Table","colCount","rowCount","length","Tbody","map","_jsxs","Tr","onClick","cursor","Td","title","variant","textColor","id","defaultMessage","contentTypeDisplayName","Box","display","status","DocumentStatus","aria-hidden","RelativeTime","timestamp","Date","updatedAt","e","stopPropagation","IconButton","tag","Link","to","label","Pencil","LastEditedWidget","data","isLoading","error","useGetRecentDocumentsQuery","action","Widget","Loading","Error","NoData","LastPublishedWidget","RADIUS","STROKE","CIRCUMFERENCE","PI","ArcChart","circle","theme","$arcColor","colors","TextChart","tspan","$textColor","KeyChartItem","Flex","breakpoints","small","DonutChartSVG","total","reduce","acc","curr","count","tooltip","setTooltip","React","useState","visible","x","y","value","cumulativePercent","handleMouseOver","clientX","clientY","handleMouseOut","t","handleFocus","currentTarget","getBoundingClientRect","width","left","height","top","direction","gap","margin","svg","viewBox","style","position","zIndex","g","transform","percent","arcLength","dashArray","dashOffset","el","cx","cy","r","fill","strokeWidth","strokeDasharray","strokeDashoffset","transition","tabIndex","aria-describedby","undefined","onFocus","onBlur","onMouseMove","onMouseLeave","color","text","textAnchor","fontSize","fontWeight","dy","Intl","NumberFormat","notation","maximumFractionDigits","format","Portal","data-testid","background","padding","borderRadius","textAlign","role","aria-live","wrap","ChartEntriesWidget","countDocuments","useGetCountDocumentsQuery","draft","published","modified","minHeight"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Widgets.js","sources":["../../../admin/src/components/Widgets.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Widget, useTracking, useGetCountDocumentsQuery } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n IconButton,\n Table,\n Tbody,\n Td,\n Tr,\n Typography,\n Portal,\n} from '@strapi/design-system';\nimport { Pencil } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link, useNavigate } from 'react-router-dom';\nimport { styled, DefaultTheme } from 'styled-components';\n\nimport { DocumentStatus } from '../pages/EditView/components/DocumentStatus';\nimport { useGetRecentDocumentsQuery } from '../services/homepage';\n\nimport { RelativeTime } from './RelativeTime';\n\nimport type { RecentDocument } from '../../../shared/contracts/homepage';\n\nconst BASE_MAX_WIDTH = '14.4rem';\n\n/**\n * Calculate dynamic max-width based on column span\n * Base width is 14.4rem for 6 columns, scale proportionally\n */\nconst calculateDynamicMaxWidth = (columnWidth: number = 4): string => {\n const baseColumnWidth = 4;\n const baseMaxWidth = 14.4; // rem\n const calculatedWidth = (baseMaxWidth * columnWidth) / baseColumnWidth;\n return `${Math.round(calculatedWidth * 10) / 10}rem`;\n};\n\nconst CellTypography = styled(Typography)<{ $maxWidth?: string }>`\n display: block;\n max-width: ${({ $maxWidth }) => $maxWidth || BASE_MAX_WIDTH};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst RecentDocumentsTable = ({\n documents,\n type,\n dynamicMaxWidth = BASE_MAX_WIDTH,\n}: {\n documents: RecentDocument[];\n type: 'edited' | 'published';\n dynamicMaxWidth?: string;\n}) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const navigate = useNavigate();\n\n const getEditViewLink = (document: RecentDocument): string => {\n const isSingleType = document.kind === 'singleType';\n const kindPath = isSingleType ? 'single-types' : 'collection-types';\n const queryParams = document.locale ? `?plugins[i18n][locale]=${document.locale}` : '';\n\n return `/content-manager/${kindPath}/${document.contentTypeUid}${isSingleType ? '' : '/' + document.documentId}${queryParams}`;\n };\n\n const handleRowClick = (document: RecentDocument) => () => {\n trackUsage('willEditEntryFromHome', {\n entryType: type,\n });\n const link = getEditViewLink(document);\n navigate(link);\n };\n\n return (\n <Table colCount={5} rowCount={documents?.length ?? 0}>\n <Tbody>\n {documents?.map((document) => (\n <Tr\n onClick={handleRowClick(document)}\n cursor=\"pointer\"\n key={`${document.documentId}-${document.locale ?? 'default'}`}\n >\n <Td>\n <CellTypography\n title={document.title}\n variant=\"omega\"\n textColor=\"neutral800\"\n $maxWidth={dynamicMaxWidth}\n >\n {document.title}\n </CellTypography>\n </Td>\n <Td>\n <CellTypography variant=\"omega\" textColor=\"neutral600\" $maxWidth={dynamicMaxWidth}>\n {document.kind === 'singleType'\n ? formatMessage({\n id: 'content-manager.widget.last-edited.single-type',\n defaultMessage: 'Single-Type',\n })\n : formatMessage({\n id: document.contentTypeDisplayName,\n defaultMessage: document.contentTypeDisplayName,\n })}\n </CellTypography>\n </Td>\n <Td>\n <Box display=\"inline-block\">\n {document.status ? (\n <DocumentStatus status={document.status} />\n ) : (\n <Typography textColor=\"neutral600\" aria-hidden>\n -\n </Typography>\n )}\n </Box>\n </Td>\n <Td>\n <Typography textColor=\"neutral600\">\n <RelativeTime timestamp={new Date(document.updatedAt)} />\n </Typography>\n </Td>\n <Td onClick={(e) => e.stopPropagation()}>\n <Box display=\"inline-block\">\n <IconButton\n tag={Link}\n to={getEditViewLink(document)}\n onClick={() => trackUsage('willEditEntryFromHome', { type })}\n label={formatMessage({\n id: 'content-manager.actions.edit.label',\n defaultMessage: 'Edit',\n })}\n variant=\"ghost\"\n >\n <Pencil />\n </IconButton>\n </Box>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LastEditedWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst LastEditedWidget = ({ columnWidth = 6 }: { columnWidth?: number }) => {\n const { formatMessage } = useIntl();\n const { data, isLoading, error } = useGetRecentDocumentsQuery({ action: 'update' });\n\n const dynamicMaxWidth = calculateDynamicMaxWidth(columnWidth);\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error || !data) {\n return <Widget.Error />;\n }\n\n if (data.length === 0) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'content-manager.widget.last-edited.no-data',\n defaultMessage: 'No edited entries',\n })}\n </Widget.NoData>\n );\n }\n\n return <RecentDocumentsTable documents={data} type=\"edited\" dynamicMaxWidth={dynamicMaxWidth} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LastPublishedWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst LastPublishedWidget = ({ columnWidth = 6 }: { columnWidth?: number }) => {\n const { formatMessage } = useIntl();\n const { data, isLoading, error } = useGetRecentDocumentsQuery({ action: 'publish' });\n\n const dynamicMaxWidth = calculateDynamicMaxWidth(columnWidth);\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error || !data) {\n return <Widget.Error />;\n }\n\n if (data.length === 0) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'content-manager.widget.last-published.no-data',\n defaultMessage: 'No published entries',\n })}\n </Widget.NoData>\n );\n }\n\n return (\n <RecentDocumentsTable documents={data} type=\"published\" dynamicMaxWidth={dynamicMaxWidth} />\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ChartEntriesWidget\n * -----------------------------------------------------------------------------------------------*/\nconst RADIUS = 80;\nconst STROKE = 10;\nconst CIRCUMFERENCE = 2 * Math.PI * (RADIUS - STROKE / 2);\n\ntype ThemeColor = keyof DefaultTheme['colors'];\n\nconst ArcChart = styled.circle<{ $arcColor: ThemeColor }>`\n stroke: ${({ theme, $arcColor }) => theme.colors[$arcColor]};\n`;\n\nconst TextChart = styled.tspan<{ $textColor: ThemeColor }>`\n text-transform: lowercase;\n fill: ${({ theme, $textColor }) => theme.colors[$textColor]};\n`;\n\nconst KeyChartItem = styled(Flex)`\n width: 100%;\n\n ${({ theme }) => theme.breakpoints.small} {\n width: auto;\n }\n`;\n\ninterface ChartData {\n label: string;\n count: number;\n color: ThemeColor;\n}\n\nconst DonutChartSVG = ({ data }: { data: ChartData[] }) => {\n const { locale } = useIntl();\n const { formatMessage } = useIntl();\n const total = data.reduce((acc, curr) => acc + curr.count, 0);\n const [tooltip, setTooltip] = React.useState<{\n visible: boolean;\n x: number;\n y: number;\n value: ChartData | null;\n isTouch?: boolean;\n }>({ visible: false, x: 0, y: 0, value: null });\n\n let cumulativePercent = 0;\n\n const handleMouseOver = (e: React.MouseEvent<SVGCircleElement>, value: ChartData) => {\n setTooltip({\n visible: true,\n x: e.clientX,\n y: e.clientY,\n value,\n });\n };\n const handleMouseOut = () => {\n setTooltip((t) => ({ ...t, visible: false }));\n };\n\n const handleFocus = (e: React.FocusEvent<SVGCircleElement>, value: ChartData) => {\n setTooltip({\n visible: true,\n x:\n e.currentTarget.getBoundingClientRect().width / 2 +\n e.currentTarget.getBoundingClientRect().left,\n y:\n e.currentTarget.getBoundingClientRect().height +\n e.currentTarget.getBoundingClientRect().top,\n value,\n });\n };\n\n return (\n <Flex direction=\"column\" gap={6} margin=\"auto\">\n <svg\n width={RADIUS * 2}\n height={RADIUS * 2}\n viewBox={`0 0 ${RADIUS * 2} ${RADIUS * 2}`}\n style={{ position: 'relative', zIndex: 1 }}\n >\n <g transform={`rotate(-90 ${RADIUS} ${RADIUS})`}>\n {data.map((value) => {\n const percent = (value.count / total) * 100;\n const arcLength = (percent / 100) * CIRCUMFERENCE;\n const dashArray = `${arcLength} ${CIRCUMFERENCE - arcLength}`;\n const dashOffset = CIRCUMFERENCE * (1 - cumulativePercent / 100);\n const el = (\n <ArcChart\n key={value.label}\n cx={RADIUS}\n cy={RADIUS}\n r={RADIUS - STROKE / 2}\n fill=\"none\"\n strokeWidth={STROKE}\n strokeDasharray={dashArray}\n strokeDashoffset={dashOffset}\n style={{ transition: 'stroke-dashoffset 0.3s', cursor: 'pointer' }}\n tabIndex={0}\n aria-describedby={tooltip.visible ? 'chart-tooltip' : undefined}\n onFocus={(e) => handleFocus(e, value)}\n onBlur={handleMouseOut}\n onMouseMove={(e) => handleMouseOver(e, value)}\n onMouseLeave={handleMouseOut}\n $arcColor={value.color}\n />\n );\n cumulativePercent += percent;\n return el;\n })}\n </g>\n <text x={RADIUS} y={RADIUS} textAnchor=\"middle\" fontSize=\"2.4rem\" fontWeight=\"bold\">\n <TextChart x={RADIUS} dy=\"0\" $textColor=\"neutral800\">\n {new Intl.NumberFormat(locale, {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(total)}\n </TextChart>\n <TextChart\n x={RADIUS}\n dy=\"1.4em\"\n fontSize=\"1.4rem\"\n fontWeight=\"normal\"\n $textColor=\"neutral600\"\n >\n {formatMessage(\n {\n id: 'content-manager.widget.chart-entries.count.label',\n defaultMessage: '{count, plural, =0 {entries} one {entry} other {entries}}',\n },\n { count: total }\n )}\n </TextChart>\n </text>\n </svg>\n {tooltip.visible && tooltip.value && (\n <Portal\n style={{\n position: 'fixed',\n left: 16,\n top: 16,\n zIndex: 2,\n transform: `translate(${tooltip.x}px, ${tooltip.y}px)`,\n }}\n data-testid=\"entries-chart-tooltip\"\n >\n <Box\n background=\"neutral900\"\n padding={2}\n borderRadius={1}\n textAlign=\"center\"\n role=\"tooltip\"\n aria-live=\"polite\"\n >\n <Typography textColor=\"neutral0\">\n {formatMessage(\n {\n id: 'content-manager.widget.chart-entries.tooltip',\n defaultMessage: '{count} items',\n },\n {\n count: tooltip.value.count,\n label: tooltip.value.label,\n }\n )}\n </Typography>\n </Box>\n </Portal>\n )}\n <Flex gap={4} wrap=\"wrap\">\n {data.map(\n (value) =>\n value.count > 0 && (\n <KeyChartItem gap={1} key={value.label}>\n <Box background={value.color} padding={2} borderRadius={1} />\n <Typography variant=\"pi\">{value.label}</Typography>\n </KeyChartItem>\n )\n )}\n </Flex>\n </Flex>\n );\n};\n\nconst ChartEntriesWidget = () => {\n const { formatMessage } = useIntl();\n const { data: countDocuments, isLoading, error } = useGetCountDocumentsQuery();\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error) {\n return <Widget.Error />;\n }\n\n const { draft, published, modified } = countDocuments ?? {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n const total = draft + published + modified;\n\n if (!total) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'content-manager.widget.last-published.no-data',\n defaultMessage: 'No published entries',\n })}\n </Widget.NoData>\n );\n }\n\n return (\n <Flex minHeight=\"100%\">\n <DonutChartSVG\n data={[\n {\n label: formatMessage({\n id: 'content-manager.containers.List.draft',\n defaultMessage: 'Draft',\n }),\n count: draft,\n color: 'secondary500',\n },\n {\n label: formatMessage({\n id: 'content-manager.containers.List.modified',\n defaultMessage: 'Modified',\n }),\n count: modified,\n color: 'alternative500',\n },\n {\n label: formatMessage({\n id: 'content-manager.containers.List.published',\n defaultMessage: 'Published',\n }),\n count: published,\n color: 'success500',\n },\n ]}\n />\n </Flex>\n );\n};\n\nexport { ChartEntriesWidget, LastEditedWidget, LastPublishedWidget };\n"],"names":["BASE_MAX_WIDTH","calculateDynamicMaxWidth","columnWidth","baseColumnWidth","baseMaxWidth","calculatedWidth","Math","round","CellTypography","styled","Typography","$maxWidth","RecentDocumentsTable","documents","type","dynamicMaxWidth","formatMessage","useIntl","trackUsage","useTracking","navigate","useNavigate","getEditViewLink","document","isSingleType","kind","kindPath","queryParams","locale","contentTypeUid","documentId","handleRowClick","entryType","link","_jsx","Table","colCount","rowCount","length","Tbody","map","_jsxs","Tr","onClick","cursor","Td","title","variant","textColor","id","defaultMessage","contentTypeDisplayName","Box","display","status","DocumentStatus","aria-hidden","RelativeTime","timestamp","Date","updatedAt","e","stopPropagation","IconButton","tag","Link","to","label","Pencil","LastEditedWidget","data","isLoading","error","useGetRecentDocumentsQuery","action","Widget","Loading","Error","NoData","LastPublishedWidget","RADIUS","STROKE","CIRCUMFERENCE","PI","ArcChart","circle","theme","$arcColor","colors","TextChart","tspan","$textColor","KeyChartItem","Flex","breakpoints","small","DonutChartSVG","total","reduce","acc","curr","count","tooltip","setTooltip","React","useState","visible","x","y","value","cumulativePercent","handleMouseOver","clientX","clientY","handleMouseOut","t","handleFocus","currentTarget","getBoundingClientRect","width","left","height","top","direction","gap","margin","svg","viewBox","style","position","zIndex","g","transform","percent","arcLength","dashArray","dashOffset","el","cx","cy","r","fill","strokeWidth","strokeDasharray","strokeDashoffset","transition","tabIndex","aria-describedby","undefined","onFocus","onBlur","onMouseMove","onMouseLeave","color","text","textAnchor","fontSize","fontWeight","dy","Intl","NumberFormat","notation","maximumFractionDigits","format","Portal","data-testid","background","padding","borderRadius","textAlign","role","aria-live","wrap","ChartEntriesWidget","countDocuments","useGetCountDocumentsQuery","draft","published","modified","minHeight"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Widgets.mjs","sources":["../../../admin/src/components/Widgets.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Widget, useTracking, useGetCountDocumentsQuery } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n IconButton,\n Table,\n Tbody,\n Td,\n Tr,\n Typography,\n Portal,\n} from '@strapi/design-system';\nimport { Pencil } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link, useNavigate } from 'react-router-dom';\nimport { styled, DefaultTheme } from 'styled-components';\n\nimport { DocumentStatus } from '../pages/EditView/components/DocumentStatus';\nimport { useGetRecentDocumentsQuery } from '../services/homepage';\n\nimport { RelativeTime } from './RelativeTime';\n\nimport type { RecentDocument } from '../../../shared/contracts/homepage';\n\nconst BASE_MAX_WIDTH = '14.4rem';\n\n/**\n * Calculate dynamic max-width based on column span\n * Base width is 14.4rem for 6 columns, scale proportionally\n */\nconst calculateDynamicMaxWidth = (columnWidth: number = 4): string => {\n const baseColumnWidth = 4;\n const baseMaxWidth = 14.4; // rem\n const calculatedWidth = (baseMaxWidth * columnWidth) / baseColumnWidth;\n return `${Math.round(calculatedWidth * 10) / 10}rem`;\n};\n\nconst CellTypography = styled(Typography)<{ $maxWidth?: string }>`\n display: block;\n max-width: ${({ $maxWidth }) => $maxWidth || BASE_MAX_WIDTH};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst RecentDocumentsTable = ({\n documents,\n type,\n dynamicMaxWidth = BASE_MAX_WIDTH,\n}: {\n documents: RecentDocument[];\n type: 'edited' | 'published';\n dynamicMaxWidth?: string;\n}) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const navigate = useNavigate();\n\n const getEditViewLink = (document: RecentDocument): string => {\n const isSingleType = document.kind === 'singleType';\n const kindPath = isSingleType ? 'single-types' : 'collection-types';\n const queryParams = document.locale ? `?plugins[i18n][locale]=${document.locale}` : '';\n\n return `/content-manager/${kindPath}/${document.contentTypeUid}${isSingleType ? '' : '/' + document.documentId}${queryParams}`;\n };\n\n const handleRowClick = (document: RecentDocument) => () => {\n trackUsage('willEditEntryFromHome', {\n entryType: type,\n });\n const link = getEditViewLink(document);\n navigate(link);\n };\n\n return (\n <Table colCount={5} rowCount={documents?.length ?? 0}>\n <Tbody>\n {documents?.map((document) => (\n <Tr onClick={handleRowClick(document)} cursor=\"pointer\" key={document.documentId}>\n <Td>\n <CellTypography\n title={document.title}\n variant=\"omega\"\n textColor=\"neutral800\"\n $maxWidth={dynamicMaxWidth}\n >\n {document.title}\n </CellTypography>\n </Td>\n <Td>\n <CellTypography variant=\"omega\" textColor=\"neutral600\" $maxWidth={dynamicMaxWidth}>\n {document.kind === 'singleType'\n ? formatMessage({\n id: 'content-manager.widget.last-edited.single-type',\n defaultMessage: 'Single-Type',\n })\n : formatMessage({\n id: document.contentTypeDisplayName,\n defaultMessage: document.contentTypeDisplayName,\n })}\n </CellTypography>\n </Td>\n <Td>\n <Box display=\"inline-block\">\n {document.status ? (\n <DocumentStatus status={document.status} />\n ) : (\n <Typography textColor=\"neutral600\" aria-hidden>\n -\n </Typography>\n )}\n </Box>\n </Td>\n <Td>\n <Typography textColor=\"neutral600\">\n <RelativeTime timestamp={new Date(document.updatedAt)} />\n </Typography>\n </Td>\n <Td onClick={(e) => e.stopPropagation()}>\n <Box display=\"inline-block\">\n <IconButton\n tag={Link}\n to={getEditViewLink(document)}\n onClick={() => trackUsage('willEditEntryFromHome', { type })}\n label={formatMessage({\n id: 'content-manager.actions.edit.label',\n defaultMessage: 'Edit',\n })}\n variant=\"ghost\"\n >\n <Pencil />\n </IconButton>\n </Box>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LastEditedWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst LastEditedWidget = ({ columnWidth = 6 }: { columnWidth?: number }) => {\n const { formatMessage } = useIntl();\n const { data, isLoading, error } = useGetRecentDocumentsQuery({ action: 'update' });\n\n const dynamicMaxWidth = calculateDynamicMaxWidth(columnWidth);\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error || !data) {\n return <Widget.Error />;\n }\n\n if (data.length === 0) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'content-manager.widget.last-edited.no-data',\n defaultMessage: 'No edited entries',\n })}\n </Widget.NoData>\n );\n }\n\n return <RecentDocumentsTable documents={data} type=\"edited\" dynamicMaxWidth={dynamicMaxWidth} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LastPublishedWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst LastPublishedWidget = ({ columnWidth = 6 }: { columnWidth?: number }) => {\n const { formatMessage } = useIntl();\n const { data, isLoading, error } = useGetRecentDocumentsQuery({ action: 'publish' });\n\n const dynamicMaxWidth = calculateDynamicMaxWidth(columnWidth);\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error || !data) {\n return <Widget.Error />;\n }\n\n if (data.length === 0) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'content-manager.widget.last-published.no-data',\n defaultMessage: 'No published entries',\n })}\n </Widget.NoData>\n );\n }\n\n return (\n <RecentDocumentsTable documents={data} type=\"published\" dynamicMaxWidth={dynamicMaxWidth} />\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ChartEntriesWidget\n * -----------------------------------------------------------------------------------------------*/\nconst RADIUS = 80;\nconst STROKE = 10;\nconst CIRCUMFERENCE = 2 * Math.PI * (RADIUS - STROKE / 2);\n\ntype ThemeColor = keyof DefaultTheme['colors'];\n\nconst ArcChart = styled.circle<{ $arcColor: ThemeColor }>`\n stroke: ${({ theme, $arcColor }) => theme.colors[$arcColor]};\n`;\n\nconst TextChart = styled.tspan<{ $textColor: ThemeColor }>`\n text-transform: lowercase;\n fill: ${({ theme, $textColor }) => theme.colors[$textColor]};\n`;\n\nconst KeyChartItem = styled(Flex)`\n width: 100%;\n\n ${({ theme }) => theme.breakpoints.small} {\n width: auto;\n }\n`;\n\ninterface ChartData {\n label: string;\n count: number;\n color: ThemeColor;\n}\n\nconst DonutChartSVG = ({ data }: { data: ChartData[] }) => {\n const { locale } = useIntl();\n const { formatMessage } = useIntl();\n const total = data.reduce((acc, curr) => acc + curr.count, 0);\n const [tooltip, setTooltip] = React.useState<{\n visible: boolean;\n x: number;\n y: number;\n value: ChartData | null;\n isTouch?: boolean;\n }>({ visible: false, x: 0, y: 0, value: null });\n\n let cumulativePercent = 0;\n\n const handleMouseOver = (e: React.MouseEvent<SVGCircleElement>, value: ChartData) => {\n setTooltip({\n visible: true,\n x: e.clientX,\n y: e.clientY,\n value,\n });\n };\n const handleMouseOut = () => {\n setTooltip((t) => ({ ...t, visible: false }));\n };\n\n const handleFocus = (e: React.FocusEvent<SVGCircleElement>, value: ChartData) => {\n setTooltip({\n visible: true,\n x:\n e.currentTarget.getBoundingClientRect().width / 2 +\n e.currentTarget.getBoundingClientRect().left,\n y:\n e.currentTarget.getBoundingClientRect().height +\n e.currentTarget.getBoundingClientRect().top,\n value,\n });\n };\n\n return (\n <Flex direction=\"column\" gap={6} margin=\"auto\">\n <svg\n width={RADIUS * 2}\n height={RADIUS * 2}\n viewBox={`0 0 ${RADIUS * 2} ${RADIUS * 2}`}\n style={{ position: 'relative', zIndex: 1 }}\n >\n <g transform={`rotate(-90 ${RADIUS} ${RADIUS})`}>\n {data.map((value) => {\n const percent = (value.count / total) * 100;\n const arcLength = (percent / 100) * CIRCUMFERENCE;\n const dashArray = `${arcLength} ${CIRCUMFERENCE - arcLength}`;\n const dashOffset = CIRCUMFERENCE * (1 - cumulativePercent / 100);\n const el = (\n <ArcChart\n key={value.label}\n cx={RADIUS}\n cy={RADIUS}\n r={RADIUS - STROKE / 2}\n fill=\"none\"\n strokeWidth={STROKE}\n strokeDasharray={dashArray}\n strokeDashoffset={dashOffset}\n style={{ transition: 'stroke-dashoffset 0.3s', cursor: 'pointer' }}\n tabIndex={0}\n aria-describedby={tooltip.visible ? 'chart-tooltip' : undefined}\n onFocus={(e) => handleFocus(e, value)}\n onBlur={handleMouseOut}\n onMouseMove={(e) => handleMouseOver(e, value)}\n onMouseLeave={handleMouseOut}\n $arcColor={value.color}\n />\n );\n cumulativePercent += percent;\n return el;\n })}\n </g>\n <text x={RADIUS} y={RADIUS} textAnchor=\"middle\" fontSize=\"2.4rem\" fontWeight=\"bold\">\n <TextChart x={RADIUS} dy=\"0\" $textColor=\"neutral800\">\n {new Intl.NumberFormat(locale, {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(total)}\n </TextChart>\n <TextChart\n x={RADIUS}\n dy=\"1.4em\"\n fontSize=\"1.4rem\"\n fontWeight=\"normal\"\n $textColor=\"neutral600\"\n >\n {formatMessage(\n {\n id: 'content-manager.widget.chart-entries.count.label',\n defaultMessage: '{count, plural, =0 {entries} one {entry} other {entries}}',\n },\n { count: total }\n )}\n </TextChart>\n </text>\n </svg>\n {tooltip.visible && tooltip.value && (\n <Portal\n style={{\n position: 'fixed',\n left: 16,\n top: 16,\n zIndex: 2,\n transform: `translate(${tooltip.x}px, ${tooltip.y}px)`,\n }}\n data-testid=\"entries-chart-tooltip\"\n >\n <Box\n background=\"neutral900\"\n padding={2}\n borderRadius={1}\n textAlign=\"center\"\n role=\"tooltip\"\n aria-live=\"polite\"\n >\n <Typography textColor=\"neutral0\">\n {formatMessage(\n {\n id: 'content-manager.widget.chart-entries.tooltip',\n defaultMessage: '{count} items',\n },\n {\n count: tooltip.value.count,\n label: tooltip.value.label,\n }\n )}\n </Typography>\n </Box>\n </Portal>\n )}\n <Flex gap={4} wrap=\"wrap\">\n {data.map(\n (value) =>\n value.count > 0 && (\n <KeyChartItem gap={1} key={value.label}>\n <Box background={value.color} padding={2} borderRadius={1} />\n <Typography variant=\"pi\">{value.label}</Typography>\n </KeyChartItem>\n )\n )}\n </Flex>\n </Flex>\n );\n};\n\nconst ChartEntriesWidget = () => {\n const { formatMessage } = useIntl();\n const { data: countDocuments, isLoading, error } = useGetCountDocumentsQuery();\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error) {\n return <Widget.Error />;\n }\n\n const { draft, published, modified } = countDocuments ?? {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n const total = draft + published + modified;\n\n if (!total) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'content-manager.widget.last-published.no-data',\n defaultMessage: 'No published entries',\n })}\n </Widget.NoData>\n );\n }\n\n return (\n <Flex minHeight=\"100%\">\n <DonutChartSVG\n data={[\n {\n label: formatMessage({\n id: 'content-manager.containers.List.draft',\n defaultMessage: 'Draft',\n }),\n count: draft,\n color: 'secondary500',\n },\n {\n label: formatMessage({\n id: 'content-manager.containers.List.modified',\n defaultMessage: 'Modified',\n }),\n count: modified,\n color: 'alternative500',\n },\n {\n label: formatMessage({\n id: 'content-manager.containers.List.published',\n defaultMessage: 'Published',\n }),\n count: published,\n color: 'success500',\n },\n ]}\n />\n </Flex>\n );\n};\n\nexport { ChartEntriesWidget, LastEditedWidget, LastPublishedWidget };\n"],"names":["BASE_MAX_WIDTH","calculateDynamicMaxWidth","columnWidth","baseColumnWidth","baseMaxWidth","calculatedWidth","Math","round","CellTypography","styled","Typography","$maxWidth","RecentDocumentsTable","documents","type","dynamicMaxWidth","formatMessage","useIntl","trackUsage","useTracking","navigate","useNavigate","getEditViewLink","document","isSingleType","kind","kindPath","queryParams","locale","contentTypeUid","documentId","handleRowClick","entryType","link","_jsx","Table","colCount","rowCount","length","Tbody","map","_jsxs","Tr","onClick","cursor","Td","title","variant","textColor","id","defaultMessage","contentTypeDisplayName","Box","display","status","DocumentStatus","aria-hidden","RelativeTime","timestamp","Date","updatedAt","e","stopPropagation","IconButton","tag","Link","to","label","Pencil","LastEditedWidget","data","isLoading","error","useGetRecentDocumentsQuery","action","Widget","Loading","Error","NoData","LastPublishedWidget","RADIUS","STROKE","CIRCUMFERENCE","PI","ArcChart","circle","theme","$arcColor","colors","TextChart","tspan","$textColor","KeyChartItem","Flex","breakpoints","small","DonutChartSVG","total","reduce","acc","curr","count","tooltip","setTooltip","React","useState","visible","x","y","value","cumulativePercent","handleMouseOver","clientX","clientY","handleMouseOut","t","handleFocus","currentTarget","getBoundingClientRect","width","left","height","top","direction","gap","margin","svg","viewBox","style","position","zIndex","g","transform","percent","arcLength","dashArray","dashOffset","el","cx","cy","r","fill","strokeWidth","strokeDasharray","strokeDashoffset","transition","tabIndex","aria-describedby","undefined","onFocus","onBlur","onMouseMove","onMouseLeave","color","text","textAnchor","fontSize","fontWeight","dy","Intl","NumberFormat","notation","maximumFractionDigits","format","Portal","data-testid","background","padding","borderRadius","textAlign","role","aria-live","wrap","ChartEntriesWidget","countDocuments","useGetCountDocumentsQuery","draft","published","modified","minHeight"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Widgets.mjs","sources":["../../../admin/src/components/Widgets.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Widget, useTracking, useGetCountDocumentsQuery } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n IconButton,\n Table,\n Tbody,\n Td,\n Tr,\n Typography,\n Portal,\n} from '@strapi/design-system';\nimport { Pencil } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link, useNavigate } from 'react-router-dom';\nimport { styled, DefaultTheme } from 'styled-components';\n\nimport { DocumentStatus } from '../pages/EditView/components/DocumentStatus';\nimport { useGetRecentDocumentsQuery } from '../services/homepage';\n\nimport { RelativeTime } from './RelativeTime';\n\nimport type { RecentDocument } from '../../../shared/contracts/homepage';\n\nconst BASE_MAX_WIDTH = '14.4rem';\n\n/**\n * Calculate dynamic max-width based on column span\n * Base width is 14.4rem for 6 columns, scale proportionally\n */\nconst calculateDynamicMaxWidth = (columnWidth: number = 4): string => {\n const baseColumnWidth = 4;\n const baseMaxWidth = 14.4; // rem\n const calculatedWidth = (baseMaxWidth * columnWidth) / baseColumnWidth;\n return `${Math.round(calculatedWidth * 10) / 10}rem`;\n};\n\nconst CellTypography = styled(Typography)<{ $maxWidth?: string }>`\n display: block;\n max-width: ${({ $maxWidth }) => $maxWidth || BASE_MAX_WIDTH};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst RecentDocumentsTable = ({\n documents,\n type,\n dynamicMaxWidth = BASE_MAX_WIDTH,\n}: {\n documents: RecentDocument[];\n type: 'edited' | 'published';\n dynamicMaxWidth?: string;\n}) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const navigate = useNavigate();\n\n const getEditViewLink = (document: RecentDocument): string => {\n const isSingleType = document.kind === 'singleType';\n const kindPath = isSingleType ? 'single-types' : 'collection-types';\n const queryParams = document.locale ? `?plugins[i18n][locale]=${document.locale}` : '';\n\n return `/content-manager/${kindPath}/${document.contentTypeUid}${isSingleType ? '' : '/' + document.documentId}${queryParams}`;\n };\n\n const handleRowClick = (document: RecentDocument) => () => {\n trackUsage('willEditEntryFromHome', {\n entryType: type,\n });\n const link = getEditViewLink(document);\n navigate(link);\n };\n\n return (\n <Table colCount={5} rowCount={documents?.length ?? 0}>\n <Tbody>\n {documents?.map((document) => (\n <Tr\n onClick={handleRowClick(document)}\n cursor=\"pointer\"\n key={`${document.documentId}-${document.locale ?? 'default'}`}\n >\n <Td>\n <CellTypography\n title={document.title}\n variant=\"omega\"\n textColor=\"neutral800\"\n $maxWidth={dynamicMaxWidth}\n >\n {document.title}\n </CellTypography>\n </Td>\n <Td>\n <CellTypography variant=\"omega\" textColor=\"neutral600\" $maxWidth={dynamicMaxWidth}>\n {document.kind === 'singleType'\n ? formatMessage({\n id: 'content-manager.widget.last-edited.single-type',\n defaultMessage: 'Single-Type',\n })\n : formatMessage({\n id: document.contentTypeDisplayName,\n defaultMessage: document.contentTypeDisplayName,\n })}\n </CellTypography>\n </Td>\n <Td>\n <Box display=\"inline-block\">\n {document.status ? (\n <DocumentStatus status={document.status} />\n ) : (\n <Typography textColor=\"neutral600\" aria-hidden>\n -\n </Typography>\n )}\n </Box>\n </Td>\n <Td>\n <Typography textColor=\"neutral600\">\n <RelativeTime timestamp={new Date(document.updatedAt)} />\n </Typography>\n </Td>\n <Td onClick={(e) => e.stopPropagation()}>\n <Box display=\"inline-block\">\n <IconButton\n tag={Link}\n to={getEditViewLink(document)}\n onClick={() => trackUsage('willEditEntryFromHome', { type })}\n label={formatMessage({\n id: 'content-manager.actions.edit.label',\n defaultMessage: 'Edit',\n })}\n variant=\"ghost\"\n >\n <Pencil />\n </IconButton>\n </Box>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LastEditedWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst LastEditedWidget = ({ columnWidth = 6 }: { columnWidth?: number }) => {\n const { formatMessage } = useIntl();\n const { data, isLoading, error } = useGetRecentDocumentsQuery({ action: 'update' });\n\n const dynamicMaxWidth = calculateDynamicMaxWidth(columnWidth);\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error || !data) {\n return <Widget.Error />;\n }\n\n if (data.length === 0) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'content-manager.widget.last-edited.no-data',\n defaultMessage: 'No edited entries',\n })}\n </Widget.NoData>\n );\n }\n\n return <RecentDocumentsTable documents={data} type=\"edited\" dynamicMaxWidth={dynamicMaxWidth} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LastPublishedWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst LastPublishedWidget = ({ columnWidth = 6 }: { columnWidth?: number }) => {\n const { formatMessage } = useIntl();\n const { data, isLoading, error } = useGetRecentDocumentsQuery({ action: 'publish' });\n\n const dynamicMaxWidth = calculateDynamicMaxWidth(columnWidth);\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error || !data) {\n return <Widget.Error />;\n }\n\n if (data.length === 0) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'content-manager.widget.last-published.no-data',\n defaultMessage: 'No published entries',\n })}\n </Widget.NoData>\n );\n }\n\n return (\n <RecentDocumentsTable documents={data} type=\"published\" dynamicMaxWidth={dynamicMaxWidth} />\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ChartEntriesWidget\n * -----------------------------------------------------------------------------------------------*/\nconst RADIUS = 80;\nconst STROKE = 10;\nconst CIRCUMFERENCE = 2 * Math.PI * (RADIUS - STROKE / 2);\n\ntype ThemeColor = keyof DefaultTheme['colors'];\n\nconst ArcChart = styled.circle<{ $arcColor: ThemeColor }>`\n stroke: ${({ theme, $arcColor }) => theme.colors[$arcColor]};\n`;\n\nconst TextChart = styled.tspan<{ $textColor: ThemeColor }>`\n text-transform: lowercase;\n fill: ${({ theme, $textColor }) => theme.colors[$textColor]};\n`;\n\nconst KeyChartItem = styled(Flex)`\n width: 100%;\n\n ${({ theme }) => theme.breakpoints.small} {\n width: auto;\n }\n`;\n\ninterface ChartData {\n label: string;\n count: number;\n color: ThemeColor;\n}\n\nconst DonutChartSVG = ({ data }: { data: ChartData[] }) => {\n const { locale } = useIntl();\n const { formatMessage } = useIntl();\n const total = data.reduce((acc, curr) => acc + curr.count, 0);\n const [tooltip, setTooltip] = React.useState<{\n visible: boolean;\n x: number;\n y: number;\n value: ChartData | null;\n isTouch?: boolean;\n }>({ visible: false, x: 0, y: 0, value: null });\n\n let cumulativePercent = 0;\n\n const handleMouseOver = (e: React.MouseEvent<SVGCircleElement>, value: ChartData) => {\n setTooltip({\n visible: true,\n x: e.clientX,\n y: e.clientY,\n value,\n });\n };\n const handleMouseOut = () => {\n setTooltip((t) => ({ ...t, visible: false }));\n };\n\n const handleFocus = (e: React.FocusEvent<SVGCircleElement>, value: ChartData) => {\n setTooltip({\n visible: true,\n x:\n e.currentTarget.getBoundingClientRect().width / 2 +\n e.currentTarget.getBoundingClientRect().left,\n y:\n e.currentTarget.getBoundingClientRect().height +\n e.currentTarget.getBoundingClientRect().top,\n value,\n });\n };\n\n return (\n <Flex direction=\"column\" gap={6} margin=\"auto\">\n <svg\n width={RADIUS * 2}\n height={RADIUS * 2}\n viewBox={`0 0 ${RADIUS * 2} ${RADIUS * 2}`}\n style={{ position: 'relative', zIndex: 1 }}\n >\n <g transform={`rotate(-90 ${RADIUS} ${RADIUS})`}>\n {data.map((value) => {\n const percent = (value.count / total) * 100;\n const arcLength = (percent / 100) * CIRCUMFERENCE;\n const dashArray = `${arcLength} ${CIRCUMFERENCE - arcLength}`;\n const dashOffset = CIRCUMFERENCE * (1 - cumulativePercent / 100);\n const el = (\n <ArcChart\n key={value.label}\n cx={RADIUS}\n cy={RADIUS}\n r={RADIUS - STROKE / 2}\n fill=\"none\"\n strokeWidth={STROKE}\n strokeDasharray={dashArray}\n strokeDashoffset={dashOffset}\n style={{ transition: 'stroke-dashoffset 0.3s', cursor: 'pointer' }}\n tabIndex={0}\n aria-describedby={tooltip.visible ? 'chart-tooltip' : undefined}\n onFocus={(e) => handleFocus(e, value)}\n onBlur={handleMouseOut}\n onMouseMove={(e) => handleMouseOver(e, value)}\n onMouseLeave={handleMouseOut}\n $arcColor={value.color}\n />\n );\n cumulativePercent += percent;\n return el;\n })}\n </g>\n <text x={RADIUS} y={RADIUS} textAnchor=\"middle\" fontSize=\"2.4rem\" fontWeight=\"bold\">\n <TextChart x={RADIUS} dy=\"0\" $textColor=\"neutral800\">\n {new Intl.NumberFormat(locale, {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(total)}\n </TextChart>\n <TextChart\n x={RADIUS}\n dy=\"1.4em\"\n fontSize=\"1.4rem\"\n fontWeight=\"normal\"\n $textColor=\"neutral600\"\n >\n {formatMessage(\n {\n id: 'content-manager.widget.chart-entries.count.label',\n defaultMessage: '{count, plural, =0 {entries} one {entry} other {entries}}',\n },\n { count: total }\n )}\n </TextChart>\n </text>\n </svg>\n {tooltip.visible && tooltip.value && (\n <Portal\n style={{\n position: 'fixed',\n left: 16,\n top: 16,\n zIndex: 2,\n transform: `translate(${tooltip.x}px, ${tooltip.y}px)`,\n }}\n data-testid=\"entries-chart-tooltip\"\n >\n <Box\n background=\"neutral900\"\n padding={2}\n borderRadius={1}\n textAlign=\"center\"\n role=\"tooltip\"\n aria-live=\"polite\"\n >\n <Typography textColor=\"neutral0\">\n {formatMessage(\n {\n id: 'content-manager.widget.chart-entries.tooltip',\n defaultMessage: '{count} items',\n },\n {\n count: tooltip.value.count,\n label: tooltip.value.label,\n }\n )}\n </Typography>\n </Box>\n </Portal>\n )}\n <Flex gap={4} wrap=\"wrap\">\n {data.map(\n (value) =>\n value.count > 0 && (\n <KeyChartItem gap={1} key={value.label}>\n <Box background={value.color} padding={2} borderRadius={1} />\n <Typography variant=\"pi\">{value.label}</Typography>\n </KeyChartItem>\n )\n )}\n </Flex>\n </Flex>\n );\n};\n\nconst ChartEntriesWidget = () => {\n const { formatMessage } = useIntl();\n const { data: countDocuments, isLoading, error } = useGetCountDocumentsQuery();\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error) {\n return <Widget.Error />;\n }\n\n const { draft, published, modified } = countDocuments ?? {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n const total = draft + published + modified;\n\n if (!total) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'content-manager.widget.last-published.no-data',\n defaultMessage: 'No published entries',\n })}\n </Widget.NoData>\n );\n }\n\n return (\n <Flex minHeight=\"100%\">\n <DonutChartSVG\n data={[\n {\n label: formatMessage({\n id: 'content-manager.containers.List.draft',\n defaultMessage: 'Draft',\n }),\n count: draft,\n color: 'secondary500',\n },\n {\n label: formatMessage({\n id: 'content-manager.containers.List.modified',\n defaultMessage: 'Modified',\n }),\n count: modified,\n color: 'alternative500',\n },\n {\n label: formatMessage({\n id: 'content-manager.containers.List.published',\n defaultMessage: 'Published',\n }),\n count: published,\n color: 'success500',\n },\n ]}\n />\n </Flex>\n );\n};\n\nexport { ChartEntriesWidget, LastEditedWidget, LastPublishedWidget };\n"],"names":["BASE_MAX_WIDTH","calculateDynamicMaxWidth","columnWidth","baseColumnWidth","baseMaxWidth","calculatedWidth","Math","round","CellTypography","styled","Typography","$maxWidth","RecentDocumentsTable","documents","type","dynamicMaxWidth","formatMessage","useIntl","trackUsage","useTracking","navigate","useNavigate","getEditViewLink","document","isSingleType","kind","kindPath","queryParams","locale","contentTypeUid","documentId","handleRowClick","entryType","link","_jsx","Table","colCount","rowCount","length","Tbody","map","_jsxs","Tr","onClick","cursor","Td","title","variant","textColor","id","defaultMessage","contentTypeDisplayName","Box","display","status","DocumentStatus","aria-hidden","RelativeTime","timestamp","Date","updatedAt","e","stopPropagation","IconButton","tag","Link","to","label","Pencil","LastEditedWidget","data","isLoading","error","useGetRecentDocumentsQuery","action","Widget","Loading","Error","NoData","LastPublishedWidget","RADIUS","STROKE","CIRCUMFERENCE","PI","ArcChart","circle","theme","$arcColor","colors","TextChart","tspan","$textColor","KeyChartItem","Flex","breakpoints","small","DonutChartSVG","total","reduce","acc","curr","count","tooltip","setTooltip","React","useState","visible","x","y","value","cumulativePercent","handleMouseOver","clientX","clientY","handleMouseOut","t","handleFocus","currentTarget","getBoundingClientRect","width","left","height","top","direction","gap","margin","svg","viewBox","style","position","zIndex","g","transform","percent","arcLength","dashArray","dashOffset","el","cx","cy","r","fill","strokeWidth","strokeDasharray","strokeDashoffset","transition","tabIndex","aria-describedby","undefined","onFocus","onBlur","onMouseMove","onMouseLeave","color","text","textAnchor","fontSize","fontWeight","dy","Intl","NumberFormat","notation","maximumFractionDigits","format","Portal","data-testid","background","padding","borderRadius","textAlign","role","aria-live","wrap","ChartEntriesWidget","countDocuments","useGetCountDocumentsQuery","draft","published","modified","minHeight"],"mappings":"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"}
|
|
@@ -191,7 +191,7 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
|
191
191
|
* -----------------------------------------------------------------------------------------------*/ /**
|
|
192
192
|
* @internal this hook uses the router to extract the model, collection type & id from the url.
|
|
193
193
|
* therefore, it shouldn't be used outside of the content-manager because it won't work as intended.
|
|
194
|
-
*/ const useDoc = ()=>{
|
|
194
|
+
*/ const useDoc = (opts)=>{
|
|
195
195
|
const { id, slug, collectionType, origin } = reactRouterDom.useParams();
|
|
196
196
|
const [{ query }] = strapiAdmin.useQueryParams();
|
|
197
197
|
const params = React__namespace.useMemo(()=>api.buildValidParams(query), [
|
|
@@ -209,7 +209,8 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
|
209
209
|
collectionType,
|
|
210
210
|
params
|
|
211
211
|
}, {
|
|
212
|
-
|
|
212
|
+
...opts,
|
|
213
|
+
skip: id === 'create' || !origin && !id && collectionType !== collections.SINGLE_TYPES || opts?.skip
|
|
213
214
|
});
|
|
214
215
|
const returnId = origin || (id === 'create' ? undefined : id);
|
|
215
216
|
return {
|
|
@@ -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 = React.useCallback(\n (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 (schema?.kind === 'singleType' && schema.info.displayName) {\n return formatMessage({\n id: schema.info.displayName,\n defaultMessage: schema.info.displayName,\n });\n }\n\n // Otherwise, use a fallback\n return formatMessage({\n id: 'content-manager.containers.untitled',\n defaultMessage: 'Untitled',\n });\n },\n [document, formatMessage, schema]\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 React.useMemo(\n () =>\n ({\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 components,\n document,\n meta,\n isLoading,\n hasError,\n schema,\n schemas,\n validate,\n getTitle,\n getInitialFormValues,\n refetch,\n ]\n );\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","React","useCallback","mainField","info","displayName","id","defaultMessage","useEffect","type","message","validationSchema","useMemo","createYupSchema","attributes","validate","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 = React.useCallback(\n (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 (schema?.kind === 'singleType' && schema.info.displayName) {\n return formatMessage({\n id: schema.info.displayName,\n defaultMessage: schema.info.displayName,\n });\n }\n\n // Otherwise, use a fallback\n return formatMessage({\n id: 'content-manager.containers.untitled',\n defaultMessage: 'Untitled',\n });\n },\n [document, formatMessage, schema]\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 React.useMemo(\n () =>\n ({\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 components,\n document,\n meta,\n isLoading,\n hasError,\n schema,\n schemas,\n validate,\n getTitle,\n getInitialFormValues,\n refetch,\n ]\n );\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 = (opts?: UseDocumentOpts) => {\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 ...opts,\n skip: id === 'create' || (!origin && !id && collectionType !== SINGLE_TYPES) || opts?.skip,\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","React","useCallback","mainField","info","displayName","id","defaultMessage","useEffect","type","message","validationSchema","useMemo","createYupSchema","attributes","validate","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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"}
|
|
@@ -170,7 +170,7 @@ import { useDocumentLayout } from './useDocumentLayout.mjs';
|
|
|
170
170
|
* -----------------------------------------------------------------------------------------------*/ /**
|
|
171
171
|
* @internal this hook uses the router to extract the model, collection type & id from the url.
|
|
172
172
|
* therefore, it shouldn't be used outside of the content-manager because it won't work as intended.
|
|
173
|
-
*/ const useDoc = ()=>{
|
|
173
|
+
*/ const useDoc = (opts)=>{
|
|
174
174
|
const { id, slug, collectionType, origin } = useParams();
|
|
175
175
|
const [{ query }] = useQueryParams();
|
|
176
176
|
const params = React.useMemo(()=>buildValidParams(query), [
|
|
@@ -188,7 +188,8 @@ import { useDocumentLayout } from './useDocumentLayout.mjs';
|
|
|
188
188
|
collectionType,
|
|
189
189
|
params
|
|
190
190
|
}, {
|
|
191
|
-
|
|
191
|
+
...opts,
|
|
192
|
+
skip: id === 'create' || !origin && !id && collectionType !== SINGLE_TYPES || opts?.skip
|
|
192
193
|
});
|
|
193
194
|
const returnId = origin || (id === 'create' ? undefined : id);
|
|
194
195
|
return {
|
|
@@ -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 = React.useCallback(\n (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 (schema?.kind === 'singleType' && schema.info.displayName) {\n return formatMessage({\n id: schema.info.displayName,\n defaultMessage: schema.info.displayName,\n });\n }\n\n // Otherwise, use a fallback\n return formatMessage({\n id: 'content-manager.containers.untitled',\n defaultMessage: 'Untitled',\n });\n },\n [document, formatMessage, schema]\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 React.useMemo(\n () =>\n ({\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 components,\n document,\n meta,\n isLoading,\n hasError,\n schema,\n schemas,\n validate,\n getTitle,\n getInitialFormValues,\n refetch,\n ]\n );\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","React","useCallback","mainField","info","displayName","id","defaultMessage","useEffect","type","message","validationSchema","useMemo","createYupSchema","attributes","validate","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 = React.useCallback(\n (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 (schema?.kind === 'singleType' && schema.info.displayName) {\n return formatMessage({\n id: schema.info.displayName,\n defaultMessage: schema.info.displayName,\n });\n }\n\n // Otherwise, use a fallback\n return formatMessage({\n id: 'content-manager.containers.untitled',\n defaultMessage: 'Untitled',\n });\n },\n [document, formatMessage, schema]\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 React.useMemo(\n () =>\n ({\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 components,\n document,\n meta,\n isLoading,\n hasError,\n schema,\n schemas,\n validate,\n getTitle,\n getInitialFormValues,\n refetch,\n ]\n );\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 = (opts?: UseDocumentOpts) => {\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 ...opts,\n skip: id === 'create' || (!origin && !id && collectionType !== SINGLE_TYPES) || opts?.skip,\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","React","useCallback","mainField","info","displayName","id","defaultMessage","useEffect","type","message","validationSchema","useMemo","createYupSchema","attributes","validate","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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"}
|
|
@@ -69,8 +69,8 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
|
69
69
|
const { toggleNotification } = strapiAdmin.useNotification();
|
|
70
70
|
const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
|
|
71
71
|
const { isLoading: isLoadingSchemas, schemas } = useContentTypeSchema.useContentTypeSchema();
|
|
72
|
-
const { data, isLoading: isLoadingConfigs, error
|
|
73
|
-
const isLoading = isLoadingSchemas ||
|
|
72
|
+
const { data, isLoading: isLoadingConfigs, error } = contentTypes.useGetContentTypeConfigurationQuery(model);
|
|
73
|
+
const isLoading = isLoadingSchemas || isLoadingConfigs;
|
|
74
74
|
React__namespace.useEffect(()=>{
|
|
75
75
|
if (error) {
|
|
76
76
|
toggleNotification({
|