@strapi/content-manager 5.38.1 → 5.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/admin/hooks/useDocument.js +21 -5
  2. package/dist/admin/hooks/useDocument.js.map +1 -1
  3. package/dist/admin/hooks/useDocument.mjs +22 -6
  4. package/dist/admin/hooks/useDocument.mjs.map +1 -1
  5. package/dist/admin/pages/EditView/components/DocumentActions.js +1 -0
  6. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  7. package/dist/admin/pages/EditView/components/DocumentActions.mjs +3 -2
  8. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  9. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +4 -4
  10. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
  11. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +71 -44
  12. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  13. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +54 -46
  14. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  15. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +107 -88
  16. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  17. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +109 -90
  18. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  19. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +91 -106
  20. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  21. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +94 -109
  22. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  23. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +43 -23
  24. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  25. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +45 -25
  26. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  27. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +2 -2
  28. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +30 -19
  29. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  30. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +34 -23
  31. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  32. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +1 -1
  33. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +1 -1
  34. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.mjs +1 -1
  35. package/dist/admin/pages/EditView/components/FormLayout.js +23 -3
  36. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormLayout.mjs +4 -3
  38. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  39. package/dist/admin/pages/EditView/components/Header.js +3 -0
  40. package/dist/admin/pages/EditView/components/Header.js.map +1 -1
  41. package/dist/admin/pages/EditView/components/Header.mjs +3 -0
  42. package/dist/admin/pages/EditView/components/Header.mjs.map +1 -1
  43. package/dist/admin/pages/EditView/components/InputRenderer.js +19 -7
  44. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  45. package/dist/admin/pages/EditView/components/InputRenderer.mjs +20 -8
  46. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  47. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +11 -15
  48. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
  49. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs +11 -16
  50. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
  51. package/dist/admin/src/pages/EditView/components/FormInputs/Component/NonRepeatable.d.ts +3 -2
  52. package/dist/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.d.ts +3 -2
  53. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +3 -3
  54. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +1 -1
  55. package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +1 -1
  56. package/dist/admin/src/pages/ListView/components/BulkActions/PublishAction.d.ts +3 -0
  57. package/dist/admin/src/pages/ListView/components/Filters.d.ts +3 -0
  58. package/dist/server/services/utils/draft.js +8 -1
  59. package/dist/server/services/utils/draft.js.map +1 -1
  60. package/dist/server/services/utils/draft.mjs +8 -1
  61. package/dist/server/services/utils/draft.mjs.map +1 -1
  62. package/dist/server/services/utils/populate.js +16 -1
  63. package/dist/server/services/utils/populate.js.map +1 -1
  64. package/dist/server/services/utils/populate.mjs +16 -1
  65. package/dist/server/services/utils/populate.mjs.map +1 -1
  66. package/dist/server/src/services/utils/draft.d.ts.map +1 -1
  67. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  68. package/package.json +6 -6
@@ -72,13 +72,13 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
72
72
  const meta = data$1?.meta;
73
73
  const { components, schema, schemas, isLoading: isLoadingSchema } = useContentTypeSchema.useContentTypeSchema(args.model);
74
74
  const isSingleType = schema?.kind === 'singleType';
75
- const getTitle = (mainField)=>{
75
+ const getTitle = React__namespace.useCallback((mainField)=>{
76
76
  // Always use mainField if it's not an id
77
77
  if (mainField !== 'id' && document?.[mainField]) {
78
78
  return document[mainField];
79
79
  }
80
80
  // When it's a singleType without a mainField, use the contentType displayName
81
- if (isSingleType && schema?.info.displayName) {
81
+ if (schema?.kind === 'singleType' && schema.info.displayName) {
82
82
  return schema.info.displayName;
83
83
  }
84
84
  // Otherwise, use a fallback
@@ -86,7 +86,11 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
86
86
  id: 'content-manager.containers.untitled',
87
87
  defaultMessage: 'Untitled'
88
88
  });
89
- };
89
+ }, [
90
+ document,
91
+ formatMessage,
92
+ schema
93
+ ]);
90
94
  React__namespace.useEffect(()=>{
91
95
  if (error) {
92
96
  toggleNotification({
@@ -153,7 +157,19 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
153
157
  ]);
154
158
  const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;
155
159
  const hasError = !!error;
156
- return {
160
+ return React__namespace.useMemo(()=>({
161
+ components,
162
+ document,
163
+ meta,
164
+ isLoading,
165
+ hasError,
166
+ schema,
167
+ schemas,
168
+ validate,
169
+ getTitle,
170
+ getInitialFormValues,
171
+ refetch
172
+ }), [
157
173
  components,
158
174
  document,
159
175
  meta,
@@ -165,7 +181,7 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
165
181
  getTitle,
166
182
  getInitialFormValues,
167
183
  refetch
168
- };
184
+ ]);
169
185
  };
170
186
  /* -------------------------------------------------------------------------------------------------
171
187
  * useDoc
@@ -1 +1 @@
1
- {"version":3,"file":"useDocument.js","sources":["../../../admin/src/hooks/useDocument.ts"],"sourcesContent":["/**\n * This hook doesn't use a context provider because we fetch directly from the server,\n * this sounds expensive but actually, it's really not. Because we have redux-toolkit-query\n * being a cache layer so if nothing invalidates the cache, we don't fetch again.\n */\n\nimport * as React from 'react';\n\nimport {\n useNotification,\n useAPIErrorHandler,\n useQueryParams,\n FormErrors,\n getYupValidationErrors,\n useForm,\n} from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useParams } from 'react-router-dom';\nimport { ValidationError } from 'yup';\n\nimport { SINGLE_TYPES } from '../constants/collections';\nimport { type AnyData, transformDocument } from '../pages/EditView/utils/data';\nimport { createDefaultForm } from '../pages/EditView/utils/forms';\nimport { useGetDocumentQuery } from '../services/documents';\nimport { buildValidParams } from '../utils/api';\nimport { createYupSchema } from '../utils/validation';\n\nimport { useContentTypeSchema, ComponentsDictionary } from './useContentTypeSchema';\nimport { useDocumentLayout } from './useDocumentLayout';\n\nimport type { FindOne } from '../../../shared/contracts/collection-types';\nimport type { ContentType } from '../../../shared/contracts/content-types';\nimport type { Modules } from '@strapi/types';\n\ninterface UseDocumentArgs {\n collectionType: string;\n model: string;\n documentId?: string;\n params?: object;\n}\n\ntype UseDocumentOpts = Parameters<typeof useGetDocumentQuery>[1];\n\ntype Document = FindOne.Response['data'];\n\ntype Schema = ContentType;\n\ntype UseDocument = (\n args: UseDocumentArgs,\n opts?: UseDocumentOpts\n) => {\n /**\n * These are the schemas of the components used in the content type, organised\n * by their uid.\n */\n components: ComponentsDictionary;\n document?: Document;\n meta?: FindOne.Response['meta'];\n isLoading: boolean;\n /**\n * This is the schema of the content type, it is not the same as the layout.\n */\n schema?: Schema;\n schemas?: Schema[];\n hasError?: boolean;\n refetch: () => void;\n validate: (document: Document) => null | FormErrors;\n /**\n * Get the document's title\n */\n getTitle: (mainField: string) => string;\n /**\n * Get the initial form values for the document\n */\n getInitialFormValues: (isCreatingDocument?: boolean) => AnyData | undefined;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocument\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @alpha\n * @public\n * @description Returns a document based on the model, collection type & id passed as arguments.\n * Also extracts its schema from the redux cache to be used for creating a validation schema.\n * @example\n * ```tsx\n * const { id, model, collectionType } = useParams<{ id: string; model: string; collectionType: string }>();\n *\n * if(!model || !collectionType) return null;\n *\n * const { document, isLoading, validate } = useDocument({ documentId: id, model, collectionType, params: { locale: 'en-GB' } })\n * const { update } = useDocumentActions()\n *\n * const onSubmit = async (document: Document) => {\n * const errors = validate(document);\n *\n * if(errors) {\n * // handle errors\n * }\n *\n * await update({ collectionType, model, id }, document)\n * }\n * ```\n *\n */\nconst useDocument: UseDocument = (args, opts) => {\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { formatMessage } = useIntl();\n\n const {\n currentData: data,\n isLoading: isLoadingDocument,\n isFetching: isFetchingDocument,\n error,\n refetch,\n } = useGetDocumentQuery(args, {\n ...opts,\n skip: (!args.documentId && args.collectionType !== SINGLE_TYPES) || opts?.skip,\n });\n const document = data?.data;\n const meta = data?.meta;\n\n const {\n components,\n schema,\n schemas,\n isLoading: isLoadingSchema,\n } = useContentTypeSchema(args.model);\n const isSingleType = schema?.kind === 'singleType';\n\n const getTitle = (mainField: string) => {\n // Always use mainField if it's not an id\n if (mainField !== 'id' && document?.[mainField]) {\n return document[mainField];\n }\n\n // When it's a singleType without a mainField, use the contentType displayName\n if (isSingleType && schema?.info.displayName) {\n return schema.info.displayName;\n }\n\n // Otherwise, use a fallback\n return formatMessage({\n id: 'content-manager.containers.untitled',\n defaultMessage: 'Untitled',\n });\n };\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [toggleNotification, error, formatAPIError, args.collectionType]);\n\n const validationSchema = React.useMemo(() => {\n if (!schema) {\n return null;\n }\n\n return createYupSchema(schema.attributes, components);\n }, [schema, components]);\n\n const validate = React.useCallback(\n (document: Modules.Documents.AnyDocument): FormErrors | null => {\n if (!validationSchema) {\n throw new Error(\n 'There is no validation schema generated, this is likely due to the schema not being loaded yet.'\n );\n }\n\n try {\n validationSchema.validateSync(document, { abortEarly: false, strict: true });\n return null;\n } catch (error) {\n if (error instanceof ValidationError) {\n return getYupValidationErrors(error);\n }\n\n throw error;\n }\n },\n [validationSchema]\n );\n\n /**\n * Here we prepare the form for editing, we need to:\n * - remove prohibited fields from the document (passwords | ADD YOURS WHEN THERES A NEW ONE)\n * - swap out count objects on relations for empty arrays\n * - set __temp_key__ on array objects for drag & drop\n *\n * We also prepare the form for new documents, so we need to:\n * - set default values on fields\n */\n const getInitialFormValues = React.useCallback(\n (isCreatingDocument: boolean = false) => {\n if ((!document && !isCreatingDocument && !isSingleType) || !schema) {\n return undefined;\n }\n\n /**\n * Check that we have an ID so we know the\n * document has been created in some way.\n */\n const form = document?.id ? document : createDefaultForm(schema, components);\n\n return transformDocument(schema, components)(form);\n },\n [document, isSingleType, schema, components]\n );\n\n const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;\n const hasError = !!error;\n\n return {\n components,\n document,\n meta,\n isLoading,\n hasError,\n schema,\n schemas,\n validate,\n getTitle,\n getInitialFormValues,\n refetch,\n } satisfies ReturnType<UseDocument>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDoc\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal this hook uses the router to extract the model, collection type & id from the url.\n * therefore, it shouldn't be used outside of the content-manager because it won't work as intended.\n */\nconst useDoc = () => {\n const { id, slug, collectionType, origin } = useParams<{\n id: string;\n origin: string;\n slug: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams();\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!slug) {\n throw new Error('Could not find model in url params');\n }\n\n const document = useDocument(\n { documentId: origin || id, model: slug, collectionType, params },\n {\n skip: id === 'create' || (!origin && !id && collectionType !== SINGLE_TYPES),\n }\n );\n\n const returnId = origin || (id === 'create' ? undefined : id);\n\n return {\n collectionType,\n model: slug,\n id: returnId,\n ...document,\n };\n};\n\n/**\n * @public\n * @experimental\n * Content manager context hooks for plugin development.\n * Make sure to use this hook inside the content manager.\n */\nconst useContentManagerContext = () => {\n const {\n collectionType,\n model,\n id,\n components,\n isLoading: isLoadingDoc,\n schema,\n schemas,\n } = useDoc();\n\n const layout = useDocumentLayout(model);\n\n const form = useForm<unknown>('useContentManagerContext', (state) => state);\n\n const isSingleType = collectionType === SINGLE_TYPES;\n const slug = model;\n const isCreatingEntry = id === 'create';\n\n const {} = useContentTypeSchema();\n\n const isLoading = isLoadingDoc || layout.isLoading;\n const error = layout.error;\n\n return {\n error,\n isLoading,\n\n // Base metadata\n model,\n collectionType,\n id,\n slug,\n isCreatingEntry,\n isSingleType,\n hasDraftAndPublish: schema?.options?.draftAndPublish ?? false,\n\n // All schema infos\n components,\n contentType: schema,\n contentTypes: schemas,\n\n // Form state\n form,\n\n // layout infos\n layout,\n };\n};\n\nexport { useDocument, useDoc, useContentManagerContext };\nexport type { UseDocument, UseDocumentArgs, Document, Schema, ComponentsDictionary };\n"],"names":["useDocument","args","opts","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","formatMessage","useIntl","currentData","data","isLoading","isLoadingDocument","isFetching","isFetchingDocument","error","refetch","useGetDocumentQuery","skip","documentId","collectionType","SINGLE_TYPES","document","meta","components","schema","schemas","isLoadingSchema","useContentTypeSchema","model","isSingleType","kind","getTitle","mainField","info","displayName","id","defaultMessage","React","useEffect","type","message","validationSchema","useMemo","createYupSchema","attributes","validate","useCallback","Error","validateSync","abortEarly","strict","ValidationError","getYupValidationErrors","getInitialFormValues","isCreatingDocument","undefined","form","createDefaultForm","transformDocument","hasError","useDoc","slug","origin","useParams","query","useQueryParams","params","buildValidParams","returnId","useContentManagerContext","isLoadingDoc","layout","useDocumentLayout","useForm","state","isCreatingEntry","hasDraftAndPublish","options","draftAndPublish","contentType","contentTypes"],"mappings":"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"}
1
+ {"version":3,"file":"useDocument.js","sources":["../../../admin/src/hooks/useDocument.ts"],"sourcesContent":["/**\n * This hook doesn't use a context provider because we fetch directly from the server,\n * this sounds expensive but actually, it's really not. Because we have redux-toolkit-query\n * being a cache layer so if nothing invalidates the cache, we don't fetch again.\n */\n\nimport * as React from 'react';\n\nimport {\n useNotification,\n useAPIErrorHandler,\n useQueryParams,\n FormErrors,\n getYupValidationErrors,\n useForm,\n} from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useParams } from 'react-router-dom';\nimport { ValidationError } from 'yup';\n\nimport { SINGLE_TYPES } from '../constants/collections';\nimport { type AnyData, transformDocument } from '../pages/EditView/utils/data';\nimport { createDefaultForm } from '../pages/EditView/utils/forms';\nimport { useGetDocumentQuery } from '../services/documents';\nimport { buildValidParams } from '../utils/api';\nimport { createYupSchema } from '../utils/validation';\n\nimport { useContentTypeSchema, ComponentsDictionary } from './useContentTypeSchema';\nimport { useDocumentLayout } from './useDocumentLayout';\n\nimport type { FindOne } from '../../../shared/contracts/collection-types';\nimport type { ContentType } from '../../../shared/contracts/content-types';\nimport type { Modules } from '@strapi/types';\n\ninterface UseDocumentArgs {\n collectionType: string;\n model: string;\n documentId?: string;\n params?: object;\n}\n\ntype UseDocumentOpts = Parameters<typeof useGetDocumentQuery>[1];\n\ntype Document = FindOne.Response['data'];\n\ntype Schema = ContentType;\n\ntype UseDocument = (\n args: UseDocumentArgs,\n opts?: UseDocumentOpts\n) => {\n /**\n * These are the schemas of the components used in the content type, organised\n * by their uid.\n */\n components: ComponentsDictionary;\n document?: Document;\n meta?: FindOne.Response['meta'];\n isLoading: boolean;\n /**\n * This is the schema of the content type, it is not the same as the layout.\n */\n schema?: Schema;\n schemas?: Schema[];\n hasError?: boolean;\n refetch: () => void;\n validate: (document: Document) => null | FormErrors;\n /**\n * Get the document's title\n */\n getTitle: (mainField: string) => string;\n /**\n * Get the initial form values for the document\n */\n getInitialFormValues: (isCreatingDocument?: boolean) => AnyData | undefined;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocument\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @alpha\n * @public\n * @description Returns a document based on the model, collection type & id passed as arguments.\n * Also extracts its schema from the redux cache to be used for creating a validation schema.\n * @example\n * ```tsx\n * const { id, model, collectionType } = useParams<{ id: string; model: string; collectionType: string }>();\n *\n * if(!model || !collectionType) return null;\n *\n * const { document, isLoading, validate } = useDocument({ documentId: id, model, collectionType, params: { locale: 'en-GB' } })\n * const { update } = useDocumentActions()\n *\n * const onSubmit = async (document: Document) => {\n * const errors = validate(document);\n *\n * if(errors) {\n * // handle errors\n * }\n *\n * await update({ collectionType, model, id }, document)\n * }\n * ```\n *\n */\nconst useDocument: UseDocument = (args, opts) => {\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { formatMessage } = useIntl();\n\n const {\n currentData: data,\n isLoading: isLoadingDocument,\n isFetching: isFetchingDocument,\n error,\n refetch,\n } = useGetDocumentQuery(args, {\n ...opts,\n skip: (!args.documentId && args.collectionType !== SINGLE_TYPES) || opts?.skip,\n });\n const document = data?.data;\n const meta = data?.meta;\n\n const {\n components,\n schema,\n schemas,\n isLoading: isLoadingSchema,\n } = useContentTypeSchema(args.model);\n const isSingleType = schema?.kind === 'singleType';\n\n const getTitle = 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 schema.info.displayName;\n }\n\n // Otherwise, use a fallback\n return formatMessage({\n id: 'content-manager.containers.untitled',\n defaultMessage: 'Untitled',\n });\n },\n [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,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { useForm, useNotification, useAPIErrorHandler, getYupValidationErrors, useQueryParams } from '@strapi/admin/strapi-admin';
2
+ import { useQueryParams, useNotification, useAPIErrorHandler, getYupValidationErrors, useForm } from '@strapi/admin/strapi-admin';
3
3
  import { useIntl } from 'react-intl';
4
4
  import { useParams } from 'react-router-dom';
5
5
  import { ValidationError } from 'yup';
@@ -51,13 +51,13 @@ import { useDocumentLayout } from './useDocumentLayout.mjs';
51
51
  const meta = data?.meta;
52
52
  const { components, schema, schemas, isLoading: isLoadingSchema } = useContentTypeSchema(args.model);
53
53
  const isSingleType = schema?.kind === 'singleType';
54
- const getTitle = (mainField)=>{
54
+ const getTitle = React.useCallback((mainField)=>{
55
55
  // Always use mainField if it's not an id
56
56
  if (mainField !== 'id' && document?.[mainField]) {
57
57
  return document[mainField];
58
58
  }
59
59
  // When it's a singleType without a mainField, use the contentType displayName
60
- if (isSingleType && schema?.info.displayName) {
60
+ if (schema?.kind === 'singleType' && schema.info.displayName) {
61
61
  return schema.info.displayName;
62
62
  }
63
63
  // Otherwise, use a fallback
@@ -65,7 +65,11 @@ import { useDocumentLayout } from './useDocumentLayout.mjs';
65
65
  id: 'content-manager.containers.untitled',
66
66
  defaultMessage: 'Untitled'
67
67
  });
68
- };
68
+ }, [
69
+ document,
70
+ formatMessage,
71
+ schema
72
+ ]);
69
73
  React.useEffect(()=>{
70
74
  if (error) {
71
75
  toggleNotification({
@@ -132,7 +136,19 @@ import { useDocumentLayout } from './useDocumentLayout.mjs';
132
136
  ]);
133
137
  const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;
134
138
  const hasError = !!error;
135
- return {
139
+ return React.useMemo(()=>({
140
+ components,
141
+ document,
142
+ meta,
143
+ isLoading,
144
+ hasError,
145
+ schema,
146
+ schemas,
147
+ validate,
148
+ getTitle,
149
+ getInitialFormValues,
150
+ refetch
151
+ }), [
136
152
  components,
137
153
  document,
138
154
  meta,
@@ -144,7 +160,7 @@ import { useDocumentLayout } from './useDocumentLayout.mjs';
144
160
  getTitle,
145
161
  getInitialFormValues,
146
162
  refetch
147
- };
163
+ ]);
148
164
  };
149
165
  /* -------------------------------------------------------------------------------------------------
150
166
  * useDoc
@@ -1 +1 @@
1
- {"version":3,"file":"useDocument.mjs","sources":["../../../admin/src/hooks/useDocument.ts"],"sourcesContent":["/**\n * This hook doesn't use a context provider because we fetch directly from the server,\n * this sounds expensive but actually, it's really not. Because we have redux-toolkit-query\n * being a cache layer so if nothing invalidates the cache, we don't fetch again.\n */\n\nimport * as React from 'react';\n\nimport {\n useNotification,\n useAPIErrorHandler,\n useQueryParams,\n FormErrors,\n getYupValidationErrors,\n useForm,\n} from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useParams } from 'react-router-dom';\nimport { ValidationError } from 'yup';\n\nimport { SINGLE_TYPES } from '../constants/collections';\nimport { type AnyData, transformDocument } from '../pages/EditView/utils/data';\nimport { createDefaultForm } from '../pages/EditView/utils/forms';\nimport { useGetDocumentQuery } from '../services/documents';\nimport { buildValidParams } from '../utils/api';\nimport { createYupSchema } from '../utils/validation';\n\nimport { useContentTypeSchema, ComponentsDictionary } from './useContentTypeSchema';\nimport { useDocumentLayout } from './useDocumentLayout';\n\nimport type { FindOne } from '../../../shared/contracts/collection-types';\nimport type { ContentType } from '../../../shared/contracts/content-types';\nimport type { Modules } from '@strapi/types';\n\ninterface UseDocumentArgs {\n collectionType: string;\n model: string;\n documentId?: string;\n params?: object;\n}\n\ntype UseDocumentOpts = Parameters<typeof useGetDocumentQuery>[1];\n\ntype Document = FindOne.Response['data'];\n\ntype Schema = ContentType;\n\ntype UseDocument = (\n args: UseDocumentArgs,\n opts?: UseDocumentOpts\n) => {\n /**\n * These are the schemas of the components used in the content type, organised\n * by their uid.\n */\n components: ComponentsDictionary;\n document?: Document;\n meta?: FindOne.Response['meta'];\n isLoading: boolean;\n /**\n * This is the schema of the content type, it is not the same as the layout.\n */\n schema?: Schema;\n schemas?: Schema[];\n hasError?: boolean;\n refetch: () => void;\n validate: (document: Document) => null | FormErrors;\n /**\n * Get the document's title\n */\n getTitle: (mainField: string) => string;\n /**\n * Get the initial form values for the document\n */\n getInitialFormValues: (isCreatingDocument?: boolean) => AnyData | undefined;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocument\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @alpha\n * @public\n * @description Returns a document based on the model, collection type & id passed as arguments.\n * Also extracts its schema from the redux cache to be used for creating a validation schema.\n * @example\n * ```tsx\n * const { id, model, collectionType } = useParams<{ id: string; model: string; collectionType: string }>();\n *\n * if(!model || !collectionType) return null;\n *\n * const { document, isLoading, validate } = useDocument({ documentId: id, model, collectionType, params: { locale: 'en-GB' } })\n * const { update } = useDocumentActions()\n *\n * const onSubmit = async (document: Document) => {\n * const errors = validate(document);\n *\n * if(errors) {\n * // handle errors\n * }\n *\n * await update({ collectionType, model, id }, document)\n * }\n * ```\n *\n */\nconst useDocument: UseDocument = (args, opts) => {\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { formatMessage } = useIntl();\n\n const {\n currentData: data,\n isLoading: isLoadingDocument,\n isFetching: isFetchingDocument,\n error,\n refetch,\n } = useGetDocumentQuery(args, {\n ...opts,\n skip: (!args.documentId && args.collectionType !== SINGLE_TYPES) || opts?.skip,\n });\n const document = data?.data;\n const meta = data?.meta;\n\n const {\n components,\n schema,\n schemas,\n isLoading: isLoadingSchema,\n } = useContentTypeSchema(args.model);\n const isSingleType = schema?.kind === 'singleType';\n\n const getTitle = (mainField: string) => {\n // Always use mainField if it's not an id\n if (mainField !== 'id' && document?.[mainField]) {\n return document[mainField];\n }\n\n // When it's a singleType without a mainField, use the contentType displayName\n if (isSingleType && schema?.info.displayName) {\n return schema.info.displayName;\n }\n\n // Otherwise, use a fallback\n return formatMessage({\n id: 'content-manager.containers.untitled',\n defaultMessage: 'Untitled',\n });\n };\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [toggleNotification, error, formatAPIError, args.collectionType]);\n\n const validationSchema = React.useMemo(() => {\n if (!schema) {\n return null;\n }\n\n return createYupSchema(schema.attributes, components);\n }, [schema, components]);\n\n const validate = React.useCallback(\n (document: Modules.Documents.AnyDocument): FormErrors | null => {\n if (!validationSchema) {\n throw new Error(\n 'There is no validation schema generated, this is likely due to the schema not being loaded yet.'\n );\n }\n\n try {\n validationSchema.validateSync(document, { abortEarly: false, strict: true });\n return null;\n } catch (error) {\n if (error instanceof ValidationError) {\n return getYupValidationErrors(error);\n }\n\n throw error;\n }\n },\n [validationSchema]\n );\n\n /**\n * Here we prepare the form for editing, we need to:\n * - remove prohibited fields from the document (passwords | ADD YOURS WHEN THERES A NEW ONE)\n * - swap out count objects on relations for empty arrays\n * - set __temp_key__ on array objects for drag & drop\n *\n * We also prepare the form for new documents, so we need to:\n * - set default values on fields\n */\n const getInitialFormValues = React.useCallback(\n (isCreatingDocument: boolean = false) => {\n if ((!document && !isCreatingDocument && !isSingleType) || !schema) {\n return undefined;\n }\n\n /**\n * Check that we have an ID so we know the\n * document has been created in some way.\n */\n const form = document?.id ? document : createDefaultForm(schema, components);\n\n return transformDocument(schema, components)(form);\n },\n [document, isSingleType, schema, components]\n );\n\n const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;\n const hasError = !!error;\n\n return {\n components,\n document,\n meta,\n isLoading,\n hasError,\n schema,\n schemas,\n validate,\n getTitle,\n getInitialFormValues,\n refetch,\n } satisfies ReturnType<UseDocument>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDoc\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal this hook uses the router to extract the model, collection type & id from the url.\n * therefore, it shouldn't be used outside of the content-manager because it won't work as intended.\n */\nconst useDoc = () => {\n const { id, slug, collectionType, origin } = useParams<{\n id: string;\n origin: string;\n slug: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams();\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!slug) {\n throw new Error('Could not find model in url params');\n }\n\n const document = useDocument(\n { documentId: origin || id, model: slug, collectionType, params },\n {\n skip: id === 'create' || (!origin && !id && collectionType !== SINGLE_TYPES),\n }\n );\n\n const returnId = origin || (id === 'create' ? undefined : id);\n\n return {\n collectionType,\n model: slug,\n id: returnId,\n ...document,\n };\n};\n\n/**\n * @public\n * @experimental\n * Content manager context hooks for plugin development.\n * Make sure to use this hook inside the content manager.\n */\nconst useContentManagerContext = () => {\n const {\n collectionType,\n model,\n id,\n components,\n isLoading: isLoadingDoc,\n schema,\n schemas,\n } = useDoc();\n\n const layout = useDocumentLayout(model);\n\n const form = useForm<unknown>('useContentManagerContext', (state) => state);\n\n const isSingleType = collectionType === SINGLE_TYPES;\n const slug = model;\n const isCreatingEntry = id === 'create';\n\n const {} = useContentTypeSchema();\n\n const isLoading = isLoadingDoc || layout.isLoading;\n const error = layout.error;\n\n return {\n error,\n isLoading,\n\n // Base metadata\n model,\n collectionType,\n id,\n slug,\n isCreatingEntry,\n isSingleType,\n hasDraftAndPublish: schema?.options?.draftAndPublish ?? false,\n\n // All schema infos\n components,\n contentType: schema,\n contentTypes: schemas,\n\n // Form state\n form,\n\n // layout infos\n layout,\n };\n};\n\nexport { useDocument, useDoc, useContentManagerContext };\nexport type { UseDocument, UseDocumentArgs, Document, Schema, ComponentsDictionary };\n"],"names":["useDocument","args","opts","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","formatMessage","useIntl","currentData","data","isLoading","isLoadingDocument","isFetching","isFetchingDocument","error","refetch","useGetDocumentQuery","skip","documentId","collectionType","SINGLE_TYPES","document","meta","components","schema","schemas","isLoadingSchema","useContentTypeSchema","model","isSingleType","kind","getTitle","mainField","info","displayName","id","defaultMessage","React","useEffect","type","message","validationSchema","useMemo","createYupSchema","attributes","validate","useCallback","Error","validateSync","abortEarly","strict","ValidationError","getYupValidationErrors","getInitialFormValues","isCreatingDocument","undefined","form","createDefaultForm","transformDocument","hasError","useDoc","slug","origin","useParams","query","useQueryParams","params","buildValidParams","returnId","useContentManagerContext","isLoadingDoc","layout","useDocumentLayout","useForm","state","isCreatingEntry","hasDraftAndPublish","options","draftAndPublish","contentType","contentTypes"],"mappings":"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"}
1
+ {"version":3,"file":"useDocument.mjs","sources":["../../../admin/src/hooks/useDocument.ts"],"sourcesContent":["/**\n * This hook doesn't use a context provider because we fetch directly from the server,\n * this sounds expensive but actually, it's really not. Because we have redux-toolkit-query\n * being a cache layer so if nothing invalidates the cache, we don't fetch again.\n */\n\nimport * as React from 'react';\n\nimport {\n useNotification,\n useAPIErrorHandler,\n useQueryParams,\n FormErrors,\n getYupValidationErrors,\n useForm,\n} from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useParams } from 'react-router-dom';\nimport { ValidationError } from 'yup';\n\nimport { SINGLE_TYPES } from '../constants/collections';\nimport { type AnyData, transformDocument } from '../pages/EditView/utils/data';\nimport { createDefaultForm } from '../pages/EditView/utils/forms';\nimport { useGetDocumentQuery } from '../services/documents';\nimport { buildValidParams } from '../utils/api';\nimport { createYupSchema } from '../utils/validation';\n\nimport { useContentTypeSchema, ComponentsDictionary } from './useContentTypeSchema';\nimport { useDocumentLayout } from './useDocumentLayout';\n\nimport type { FindOne } from '../../../shared/contracts/collection-types';\nimport type { ContentType } from '../../../shared/contracts/content-types';\nimport type { Modules } from '@strapi/types';\n\ninterface UseDocumentArgs {\n collectionType: string;\n model: string;\n documentId?: string;\n params?: object;\n}\n\ntype UseDocumentOpts = Parameters<typeof useGetDocumentQuery>[1];\n\ntype Document = FindOne.Response['data'];\n\ntype Schema = ContentType;\n\ntype UseDocument = (\n args: UseDocumentArgs,\n opts?: UseDocumentOpts\n) => {\n /**\n * These are the schemas of the components used in the content type, organised\n * by their uid.\n */\n components: ComponentsDictionary;\n document?: Document;\n meta?: FindOne.Response['meta'];\n isLoading: boolean;\n /**\n * This is the schema of the content type, it is not the same as the layout.\n */\n schema?: Schema;\n schemas?: Schema[];\n hasError?: boolean;\n refetch: () => void;\n validate: (document: Document) => null | FormErrors;\n /**\n * Get the document's title\n */\n getTitle: (mainField: string) => string;\n /**\n * Get the initial form values for the document\n */\n getInitialFormValues: (isCreatingDocument?: boolean) => AnyData | undefined;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocument\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @alpha\n * @public\n * @description Returns a document based on the model, collection type & id passed as arguments.\n * Also extracts its schema from the redux cache to be used for creating a validation schema.\n * @example\n * ```tsx\n * const { id, model, collectionType } = useParams<{ id: string; model: string; collectionType: string }>();\n *\n * if(!model || !collectionType) return null;\n *\n * const { document, isLoading, validate } = useDocument({ documentId: id, model, collectionType, params: { locale: 'en-GB' } })\n * const { update } = useDocumentActions()\n *\n * const onSubmit = async (document: Document) => {\n * const errors = validate(document);\n *\n * if(errors) {\n * // handle errors\n * }\n *\n * await update({ collectionType, model, id }, document)\n * }\n * ```\n *\n */\nconst useDocument: UseDocument = (args, opts) => {\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { formatMessage } = useIntl();\n\n const {\n currentData: data,\n isLoading: isLoadingDocument,\n isFetching: isFetchingDocument,\n error,\n refetch,\n } = useGetDocumentQuery(args, {\n ...opts,\n skip: (!args.documentId && args.collectionType !== SINGLE_TYPES) || opts?.skip,\n });\n const document = data?.data;\n const meta = data?.meta;\n\n const {\n components,\n schema,\n schemas,\n isLoading: isLoadingSchema,\n } = useContentTypeSchema(args.model);\n const isSingleType = schema?.kind === 'singleType';\n\n const getTitle = 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 schema.info.displayName;\n }\n\n // Otherwise, use a fallback\n return formatMessage({\n id: 'content-manager.containers.untitled',\n defaultMessage: 'Untitled',\n });\n },\n [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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"}
@@ -276,6 +276,7 @@ const DocumentActionsMenu = ({ actions, children, label, variant = 'tertiary' })
276
276
  /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Content, {
277
277
  maxHeight: undefined,
278
278
  popoverPlacement: "bottom-end",
279
+ maxWidth: "25rem",
279
280
  children: [
280
281
  actions.map((action)=>{
281
282
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Item, {