@strapi/content-manager 5.57.0 → 5.59.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 (178) hide show
  1. package/dist/admin/components/ConfigurationForm/Fields.js +4 -3
  2. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/Fields.mjs +4 -3
  4. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
  5. package/dist/admin/components/RelativeTime.js +2 -1
  6. package/dist/admin/components/RelativeTime.js.map +1 -1
  7. package/dist/admin/components/RelativeTime.mjs +2 -1
  8. package/dist/admin/components/RelativeTime.mjs.map +1 -1
  9. package/dist/admin/content-manager.js.map +1 -1
  10. package/dist/admin/content-manager.mjs.map +1 -1
  11. package/dist/admin/history/components/VersionContent.js +8 -8
  12. package/dist/admin/history/components/VersionContent.js.map +1 -1
  13. package/dist/admin/history/components/VersionContent.mjs +8 -8
  14. package/dist/admin/history/components/VersionContent.mjs.map +1 -1
  15. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  16. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
  17. package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
  18. package/dist/admin/hooks/useDocumentLayout.mjs.map +1 -1
  19. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  20. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
  21. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
  22. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
  23. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +2 -2
  24. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  25. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +2 -2
  26. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  27. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +7 -6
  28. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  29. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +7 -6
  30. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  31. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +2 -1
  32. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  33. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +2 -1
  34. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  35. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js +2 -1
  36. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs +2 -1
  38. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs.map +1 -1
  39. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +4 -3
  40. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  41. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +4 -3
  42. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  43. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  44. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +31 -11
  46. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +32 -12
  48. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/UID.js +2 -1
  50. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
  51. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +2 -1
  52. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
  53. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
  54. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs.map +1 -1
  55. package/dist/admin/pages/EditView/components/FormLayout.js +4 -4
  56. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  57. package/dist/admin/pages/EditView/components/FormLayout.mjs +4 -4
  58. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  59. package/dist/admin/pages/EditView/components/Panels.js.map +1 -1
  60. package/dist/admin/pages/EditView/components/Panels.mjs.map +1 -1
  61. package/dist/admin/pages/EditView/utils/data.js +3 -3
  62. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  63. package/dist/admin/pages/EditView/utils/data.mjs +3 -3
  64. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  65. package/dist/admin/pages/ListConfiguration/components/Settings.js +3 -3
  66. package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -1
  67. package/dist/admin/pages/ListConfiguration/components/Settings.mjs +3 -3
  68. package/dist/admin/pages/ListConfiguration/components/Settings.mjs.map +1 -1
  69. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js +2 -2
  70. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js.map +1 -1
  71. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs +2 -2
  72. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs.map +1 -1
  73. package/dist/admin/pages/ListView/ListViewPage.js +73 -13
  74. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  75. package/dist/admin/pages/ListView/ListViewPage.mjs +74 -14
  76. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  77. package/dist/admin/pages/ListView/components/AutoCloneFailureModal.js +1 -1
  78. package/dist/admin/pages/ListView/components/AutoCloneFailureModal.js.map +1 -1
  79. package/dist/admin/pages/ListView/components/AutoCloneFailureModal.mjs +1 -1
  80. package/dist/admin/pages/ListView/components/AutoCloneFailureModal.mjs.map +1 -1
  81. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  82. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
  83. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +4 -1
  84. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
  85. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs +4 -1
  86. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
  87. package/dist/admin/pages/ListView/components/Filters.js +12 -10
  88. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  89. package/dist/admin/pages/ListView/components/Filters.mjs +12 -10
  90. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  91. package/dist/admin/pages/ListView/components/TableCells/Relations.js.map +1 -1
  92. package/dist/admin/pages/ListView/components/TableCells/Relations.mjs.map +1 -1
  93. package/dist/admin/pages/ListView/components/ViewSettingsMenu.js +2 -1
  94. package/dist/admin/pages/ListView/components/ViewSettingsMenu.js.map +1 -1
  95. package/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs +2 -1
  96. package/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs.map +1 -1
  97. package/dist/admin/pages/ListView/utils/applyAttributeRenames.js +68 -0
  98. package/dist/admin/pages/ListView/utils/applyAttributeRenames.js.map +1 -0
  99. package/dist/admin/pages/ListView/utils/applyAttributeRenames.mjs +64 -0
  100. package/dist/admin/pages/ListView/utils/applyAttributeRenames.mjs.map +1 -0
  101. package/dist/admin/preview/components/PreviewHeader.js +3 -1
  102. package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
  103. package/dist/admin/preview/components/PreviewHeader.mjs +3 -1
  104. package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
  105. package/dist/admin/services/relations.js +5 -2
  106. package/dist/admin/services/relations.js.map +1 -1
  107. package/dist/admin/services/relations.mjs +5 -2
  108. package/dist/admin/services/relations.mjs.map +1 -1
  109. package/dist/admin/src/components/ConfigurationForm/Fields.d.ts +1 -1
  110. package/dist/admin/src/pages/ListView/utils/applyAttributeRenames.d.ts +12 -0
  111. package/dist/admin/translations/eu.json.js +3 -3
  112. package/dist/admin/translations/eu.json.mjs +3 -3
  113. package/dist/admin/translations/gu.json.js +4 -4
  114. package/dist/admin/translations/gu.json.mjs +4 -4
  115. package/dist/admin/translations/hi.json.js +9 -9
  116. package/dist/admin/translations/hi.json.mjs +9 -9
  117. package/dist/admin/translations/ml.json.js +6 -6
  118. package/dist/admin/translations/ml.json.mjs +6 -6
  119. package/dist/admin/translations/sa.json.js +10 -10
  120. package/dist/admin/translations/sa.json.mjs +10 -10
  121. package/dist/server/history/entitlements.js +26 -0
  122. package/dist/server/history/entitlements.js.map +1 -0
  123. package/dist/server/history/entitlements.mjs +24 -0
  124. package/dist/server/history/entitlements.mjs.map +1 -0
  125. package/dist/server/history/index.js +3 -0
  126. package/dist/server/history/index.js.map +1 -1
  127. package/dist/server/history/index.mjs +3 -0
  128. package/dist/server/history/index.mjs.map +1 -1
  129. package/dist/server/history/services/utils.js +19 -8
  130. package/dist/server/history/services/utils.js.map +1 -1
  131. package/dist/server/history/services/utils.mjs +18 -9
  132. package/dist/server/history/services/utils.mjs.map +1 -1
  133. package/dist/server/homepage/services/homepage.js.map +1 -1
  134. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  135. package/dist/server/preview/services/preview-config.js.map +1 -1
  136. package/dist/server/preview/services/preview-config.mjs.map +1 -1
  137. package/dist/server/register.js +6 -0
  138. package/dist/server/register.js.map +1 -1
  139. package/dist/server/register.mjs +6 -0
  140. package/dist/server/register.mjs.map +1 -1
  141. package/dist/server/services/components.js.map +1 -1
  142. package/dist/server/services/components.mjs.map +1 -1
  143. package/dist/server/services/configuration/rename-fields.js +68 -0
  144. package/dist/server/services/configuration/rename-fields.js.map +1 -0
  145. package/dist/server/services/configuration/rename-fields.mjs +66 -0
  146. package/dist/server/services/configuration/rename-fields.mjs.map +1 -0
  147. package/dist/server/services/utils/configuration/attribute-renames.js +164 -0
  148. package/dist/server/services/utils/configuration/attribute-renames.js.map +1 -0
  149. package/dist/server/services/utils/configuration/attribute-renames.mjs +161 -0
  150. package/dist/server/services/utils/configuration/attribute-renames.mjs.map +1 -0
  151. package/dist/server/services/utils/configuration/attributes.js +12 -12
  152. package/dist/server/services/utils/configuration/attributes.js.map +1 -1
  153. package/dist/server/services/utils/configuration/attributes.mjs +12 -12
  154. package/dist/server/services/utils/configuration/attributes.mjs.map +1 -1
  155. package/dist/server/src/history/entitlements.d.ts +9 -0
  156. package/dist/server/src/history/entitlements.d.ts.map +1 -0
  157. package/dist/server/src/history/index.d.ts.map +1 -1
  158. package/dist/server/src/history/services/utils.d.ts +6 -0
  159. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  160. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  161. package/dist/server/src/index.d.ts +2 -0
  162. package/dist/server/src/index.d.ts.map +1 -1
  163. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  164. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  165. package/dist/server/src/register.d.ts.map +1 -1
  166. package/dist/server/src/services/components.d.ts +2 -0
  167. package/dist/server/src/services/components.d.ts.map +1 -1
  168. package/dist/server/src/services/configuration/rename-fields.d.ts +15 -0
  169. package/dist/server/src/services/configuration/rename-fields.d.ts.map +1 -0
  170. package/dist/server/src/services/index.d.ts +2 -0
  171. package/dist/server/src/services/index.d.ts.map +1 -1
  172. package/dist/server/src/services/utils/configuration/attribute-renames.d.ts +57 -0
  173. package/dist/server/src/services/utils/configuration/attribute-renames.d.ts.map +1 -0
  174. package/dist/shared/contracts/content-types.d.ts +5 -0
  175. package/dist/shared/contracts/content-types.d.ts.map +1 -1
  176. package/dist/shared/contracts/relations.d.ts +1 -0
  177. package/dist/shared/contracts/relations.d.ts.map +1 -1
  178. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"UID.mjs","sources":["../../../../../../admin/src/pages/EditView/components/FormInputs/UID.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n type InputProps,\n useField,\n useForm,\n useNotification,\n useAPIErrorHandler,\n useQueryParams,\n useFocusInputField,\n} from '@strapi/admin/strapi-admin';\nimport {\n Field,\n Flex,\n FlexComponent,\n TextInput,\n Typography,\n useComposedRefs,\n} from '@strapi/design-system';\nimport { CheckCircle, WarningCircle, Loader, ArrowClockwise } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useMatch } from 'react-router-dom';\nimport { styled, keyframes } from 'styled-components';\n\nimport { useDebounce } from '../../../../hooks/useDebounce';\nimport { useDocumentContext } from '../../../../hooks/useDocumentContext';\nimport { CLONE_PATH } from '../../../../router';\nimport {\n useGenerateUIDMutation,\n useGetAvailabilityQuery,\n useGetDefaultUIDQuery,\n} from '../../../../services/uid';\nimport { buildValidParams } from '../../../../utils/api';\n\nimport type { CheckUIDAvailability } from '../../../../../../shared/contracts/uid';\nimport type { Schema } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * InputUID\n * -----------------------------------------------------------------------------------------------*/\n\nconst UID_REGEX = /^[A-Za-z0-9-_.~]*$/;\n\ninterface UIDInputProps extends Omit<InputProps, 'type'> {\n attribute?: Pick<Schema.Attribute.UIDProperties, 'regex'>;\n type: Schema.Attribute.TypeOf<Schema.Attribute.UID>;\n}\n\nconst UIDInput = React.forwardRef<HTMLInputElement, UIDInputProps>(\n ({ hint, label, labelAction, name, required, attribute = {}, ...props }, ref) => {\n const { currentDocumentMeta } = useDocumentContext('UIDInput');\n const allFormValues = useForm('InputUID', (form) => form.values);\n const [availability, setAvailability] = React.useState<CheckUIDAvailability.Response>();\n const [showRegenerate, setShowRegenerate] = React.useState(false);\n const isCloning = useMatch(CLONE_PATH) !== null;\n const field = useField<string>(name);\n const debouncedValue = useDebounce(field.value, 300);\n const hasChanged = debouncedValue !== field.initialValue;\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { formatMessage } = useIntl();\n const [{ query }] = useQueryParams();\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n const { regex } = attribute;\n const validationRegExp = regex ? new RegExp(regex) : UID_REGEX;\n const trimmedDebouncedValue = debouncedValue?.trim() ?? '';\n\n const {\n data: defaultGeneratedUID,\n isLoading: isGeneratingDefaultUID,\n error: apiError,\n } = useGetDefaultUIDQuery(\n {\n contentTypeUID: currentDocumentMeta.model,\n field: name,\n data: {\n id: currentDocumentMeta.documentId ?? '',\n ...allFormValues,\n },\n params,\n },\n {\n skip: (field.value !== undefined && field.value !== '') || !required,\n }\n );\n\n React.useEffect(() => {\n if (apiError) {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(apiError),\n });\n }\n }, [apiError, formatAPIError, toggleNotification]);\n\n /**\n * If the defaultGeneratedUID is available, then we set it as the value,\n * but we also want to set it as the initialValue too.\n */\n React.useEffect(() => {\n if (defaultGeneratedUID && field.value === undefined) {\n field.onChange(name, defaultGeneratedUID);\n }\n }, [defaultGeneratedUID, field, name]);\n\n const [generateUID, { isLoading: isGeneratingUID }] = useGenerateUIDMutation();\n\n const handleRegenerateClick = async () => {\n try {\n const res = await generateUID({\n contentTypeUID: currentDocumentMeta.model,\n field: name,\n data: { id: currentDocumentMeta.documentId ?? '', ...allFormValues },\n params,\n });\n\n if ('data' in res) {\n field.onChange(name, res.data);\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred.',\n }),\n });\n }\n };\n\n const {\n data: availabilityData,\n isLoading: isCheckingAvailability,\n error: availabilityError,\n } = useGetAvailabilityQuery(\n {\n contentTypeUID: currentDocumentMeta.model,\n field: name,\n value: trimmedDebouncedValue,\n params,\n },\n {\n // Don't check availability if the value is empty or wasn't changed\n skip: !(\n (hasChanged || isCloning) &&\n trimmedDebouncedValue !== '' &&\n validationRegExp.test(trimmedDebouncedValue)\n ),\n }\n );\n\n React.useEffect(() => {\n if (availabilityError) {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(availabilityError),\n });\n }\n }, [availabilityError, formatAPIError, toggleNotification]);\n\n React.useEffect(() => {\n /**\n * always store the data in state because that way as seen below\n * we can then remove the data to stop showing the label.\n */\n setAvailability(availabilityData);\n\n let timer: number;\n\n if (availabilityData?.isAvailable) {\n timer = window.setTimeout(() => {\n setAvailability(undefined);\n }, 4000);\n }\n\n return () => {\n if (timer) {\n clearTimeout(timer);\n }\n };\n }, [availabilityData]);\n\n const isLoading = isGeneratingDefaultUID || isGeneratingUID || isCheckingAvailability;\n\n const fieldRef = useFocusInputField<HTMLInputElement>(name);\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n const shouldShowAvailability =\n (hasChanged || isCloning) && trimmedDebouncedValue !== '' && availability && !showRegenerate;\n\n return (\n <Field.Root hint={hint} name={name} error={field.error} required={required}>\n <Field.Label action={labelAction}>{label}</Field.Label>\n <TextInput\n ref={composedRefs}\n disabled={props.disabled}\n endAction={\n <Flex position=\"relative\" gap={1}>\n {shouldShowAvailability && (\n <TextValidation\n alignItems=\"center\"\n gap={1}\n justifyContent=\"flex-end\"\n $available={!!availability?.isAvailable}\n data-not-here-outer\n position=\"absolute\"\n pointerEvents=\"none\"\n right={6}\n width=\"100px\"\n >\n {availability?.isAvailable ? <CheckCircle /> : <WarningCircle />}\n\n <Typography\n textColor={availability.isAvailable ? 'success600' : 'danger600'}\n variant=\"pi\"\n >\n {formatMessage(\n availability.isAvailable\n ? {\n id: 'content-manager.components.uid.available',\n defaultMessage: 'Available',\n }\n : {\n id: 'content-manager.components.uid.unavailable',\n defaultMessage: 'Unavailable',\n }\n )}\n </Typography>\n </TextValidation>\n )}\n\n {!props.disabled && (\n <>\n {showRegenerate && (\n <TextValidation alignItems=\"center\" justifyContent=\"flex-end\" gap={1}>\n <Typography textColor=\"primary600\" variant=\"pi\">\n {formatMessage({\n id: 'content-manager.components.uid.regenerate',\n defaultMessage: 'Regenerate',\n })}\n </Typography>\n </TextValidation>\n )}\n\n <FieldActionWrapper\n onClick={handleRegenerateClick}\n label={formatMessage({\n id: 'content-manager.components.uid.regenerate',\n defaultMessage: 'Regenerate',\n })}\n onMouseEnter={() => setShowRegenerate(true)}\n onMouseLeave={() => setShowRegenerate(false)}\n >\n {isLoading ? (\n <LoadingWrapper data-testid=\"loading-wrapper\">\n <Loader />\n </LoadingWrapper>\n ) : (\n <ArrowClockwise />\n )}\n </FieldActionWrapper>\n </>\n )}\n </Flex>\n }\n onChange={field.onChange}\n value={field.value ?? ''}\n {...props}\n type=\"text\"\n />\n <Field.Error />\n <Field.Hint />\n </Field.Root>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * FieldActionWrapper\n * -----------------------------------------------------------------------------------------------*/\n\nconst FieldActionWrapper = styled(Field.Action)`\n width: 1.6rem;\n\n svg {\n height: 1.6rem;\n width: 1.6rem;\n path {\n fill: ${({ theme }) => theme.colors.neutral400};\n }\n }\n\n svg:hover {\n path {\n fill: ${({ theme }) => theme.colors.primary600};\n }\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * TextValidation\n * -----------------------------------------------------------------------------------------------*/\n\nconst TextValidation = styled<FlexComponent>(Flex)<{ $available?: boolean }>`\n svg {\n height: 1.2rem;\n width: 1.2rem;\n\n path {\n fill: ${({ theme, $available }) =>\n $available ? theme.colors.success600 : theme.colors.danger600};\n }\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * LoadingWrapper\n * -----------------------------------------------------------------------------------------------*/\n\nconst rotation = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(359deg);\n }\n`;\n\nconst LoadingWrapper = styled<FlexComponent>(Flex)`\n animation: ${rotation} 2s infinite linear;\n`;\n\nconst MemoizedUIDInput = React.memo(UIDInput);\n\nexport { MemoizedUIDInput as UIDInput };\nexport type { UIDInputProps };\n"],"names":["UID_REGEX","UIDInput","React","forwardRef","hint","label","labelAction","name","required","attribute","props","ref","currentDocumentMeta","useDocumentContext","allFormValues","useForm","form","values","availability","setAvailability","useState","showRegenerate","setShowRegenerate","isCloning","useMatch","CLONE_PATH","field","useField","debouncedValue","useDebounce","value","hasChanged","initialValue","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","formatMessage","useIntl","query","useQueryParams","params","useMemo","buildValidParams","regex","validationRegExp","RegExp","trimmedDebouncedValue","trim","data","defaultGeneratedUID","isLoading","isGeneratingDefaultUID","error","apiError","useGetDefaultUIDQuery","contentTypeUID","model","id","documentId","skip","undefined","useEffect","type","message","onChange","generateUID","isGeneratingUID","useGenerateUIDMutation","handleRegenerateClick","res","defaultMessage","availabilityData","isCheckingAvailability","availabilityError","useGetAvailabilityQuery","test","timer","isAvailable","window","setTimeout","clearTimeout","fieldRef","useFocusInputField","composedRefs","useComposedRefs","shouldShowAvailability","_jsxs","Field","Root","_jsx","Label","action","TextInput","disabled","endAction","Flex","position","gap","TextValidation","alignItems","justifyContent","$available","data-not-here-outer","pointerEvents","right","width","CheckCircle","WarningCircle","Typography","textColor","variant","_Fragment","FieldActionWrapper","onClick","onMouseEnter","onMouseLeave","LoadingWrapper","data-testid","Loader","ArrowClockwise","Error","Hint","styled","Action","theme","colors","neutral400","primary600","success600","danger600","rotation","keyframes","MemoizedUIDInput","memo"],"mappings":"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"}
1
+ {"version":3,"file":"UID.mjs","sources":["../../../../../../admin/src/pages/EditView/components/FormInputs/UID.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n type InputProps,\n useField,\n useForm,\n useNotification,\n useAPIErrorHandler,\n useQueryParams,\n useFocusInputField,\n} from '@strapi/admin/strapi-admin';\nimport {\n Field,\n Flex,\n FlexComponent,\n TextInput,\n Typography,\n useComposedRefs,\n} from '@strapi/design-system';\nimport { CheckCircle, WarningCircle, Loader, ArrowClockwise } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useMatch } from 'react-router-dom';\nimport { styled, keyframes } from 'styled-components';\n\nimport { useDebounce } from '../../../../hooks/useDebounce';\nimport { useDocumentContext } from '../../../../hooks/useDocumentContext';\nimport { CLONE_PATH } from '../../../../router';\nimport {\n useGenerateUIDMutation,\n useGetAvailabilityQuery,\n useGetDefaultUIDQuery,\n} from '../../../../services/uid';\nimport { buildValidParams } from '../../../../utils/api';\n\nimport type { CheckUIDAvailability } from '../../../../../../shared/contracts/uid';\nimport type { Schema } from '@strapi/types';\n\nconst EMPTY_ATTRIBUTE: NonNullable<UIDInputProps['attribute']> = {};\n\n/* -------------------------------------------------------------------------------------------------\n * InputUID\n * -----------------------------------------------------------------------------------------------*/\n\nconst UID_REGEX = /^[A-Za-z0-9-_.~]*$/;\n\ninterface UIDInputProps extends Omit<InputProps, 'type'> {\n attribute?: Pick<Schema.Attribute.UIDProperties, 'regex'>;\n type: Schema.Attribute.TypeOf<Schema.Attribute.UID>;\n}\n\nconst UIDInput = React.forwardRef<HTMLInputElement, UIDInputProps>(\n ({ hint, label, labelAction, name, required, attribute = EMPTY_ATTRIBUTE, ...props }, ref) => {\n const { currentDocumentMeta } = useDocumentContext('UIDInput');\n const allFormValues = useForm('InputUID', (form) => form.values);\n const [availability, setAvailability] = React.useState<CheckUIDAvailability.Response>();\n const [showRegenerate, setShowRegenerate] = React.useState(false);\n const isCloning = useMatch(CLONE_PATH) !== null;\n const field = useField<string>(name);\n const debouncedValue = useDebounce(field.value, 300);\n const hasChanged = debouncedValue !== field.initialValue;\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { formatMessage } = useIntl();\n const [{ query }] = useQueryParams();\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n const { regex } = attribute;\n const validationRegExp = regex ? new RegExp(regex) : UID_REGEX;\n const trimmedDebouncedValue = debouncedValue?.trim() ?? '';\n\n const {\n data: defaultGeneratedUID,\n isLoading: isGeneratingDefaultUID,\n error: apiError,\n } = useGetDefaultUIDQuery(\n {\n contentTypeUID: currentDocumentMeta.model,\n field: name,\n data: {\n id: currentDocumentMeta.documentId ?? '',\n ...allFormValues,\n },\n params,\n },\n {\n skip: (field.value !== undefined && field.value !== '') || !required,\n }\n );\n\n React.useEffect(() => {\n if (apiError) {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(apiError),\n });\n }\n }, [apiError, formatAPIError, toggleNotification]);\n\n /**\n * If the defaultGeneratedUID is available, then we set it as the value,\n * but we also want to set it as the initialValue too.\n */\n React.useEffect(() => {\n if (defaultGeneratedUID && field.value === undefined) {\n field.onChange(name, defaultGeneratedUID);\n }\n }, [defaultGeneratedUID, field, name]);\n\n const [generateUID, { isLoading: isGeneratingUID }] = useGenerateUIDMutation();\n\n const handleRegenerateClick = async () => {\n try {\n const res = await generateUID({\n contentTypeUID: currentDocumentMeta.model,\n field: name,\n data: { id: currentDocumentMeta.documentId ?? '', ...allFormValues },\n params,\n });\n\n if ('data' in res) {\n field.onChange(name, res.data);\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred.',\n }),\n });\n }\n };\n\n const {\n data: availabilityData,\n isLoading: isCheckingAvailability,\n error: availabilityError,\n } = useGetAvailabilityQuery(\n {\n contentTypeUID: currentDocumentMeta.model,\n field: name,\n value: trimmedDebouncedValue,\n params,\n },\n {\n // Don't check availability if the value is empty or wasn't changed\n skip: !(\n (hasChanged || isCloning) &&\n trimmedDebouncedValue !== '' &&\n validationRegExp.test(trimmedDebouncedValue)\n ),\n }\n );\n\n React.useEffect(() => {\n if (availabilityError) {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(availabilityError),\n });\n }\n }, [availabilityError, formatAPIError, toggleNotification]);\n\n React.useEffect(() => {\n /**\n * always store the data in state because that way as seen below\n * we can then remove the data to stop showing the label.\n */\n setAvailability(availabilityData);\n\n let timer: number;\n\n if (availabilityData?.isAvailable) {\n timer = window.setTimeout(() => {\n setAvailability(undefined);\n }, 4000);\n }\n\n return () => {\n if (timer) {\n clearTimeout(timer);\n }\n };\n }, [availabilityData]);\n\n const isLoading = isGeneratingDefaultUID || isGeneratingUID || isCheckingAvailability;\n\n const fieldRef = useFocusInputField<HTMLInputElement>(name);\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n const shouldShowAvailability =\n (hasChanged || isCloning) && trimmedDebouncedValue !== '' && availability && !showRegenerate;\n\n return (\n <Field.Root hint={hint} name={name} error={field.error} required={required}>\n <Field.Label action={labelAction}>{label}</Field.Label>\n <TextInput\n ref={composedRefs}\n disabled={props.disabled}\n endAction={\n <Flex position=\"relative\" gap={1}>\n {shouldShowAvailability && (\n <TextValidation\n alignItems=\"center\"\n gap={1}\n justifyContent=\"flex-end\"\n $available={!!availability?.isAvailable}\n data-not-here-outer\n position=\"absolute\"\n pointerEvents=\"none\"\n right={6}\n width=\"100px\"\n >\n {availability?.isAvailable ? <CheckCircle /> : <WarningCircle />}\n\n <Typography\n textColor={availability.isAvailable ? 'success600' : 'danger600'}\n variant=\"pi\"\n >\n {formatMessage(\n availability.isAvailable\n ? {\n id: 'content-manager.components.uid.available',\n defaultMessage: 'Available',\n }\n : {\n id: 'content-manager.components.uid.unavailable',\n defaultMessage: 'Unavailable',\n }\n )}\n </Typography>\n </TextValidation>\n )}\n\n {!props.disabled && (\n <>\n {showRegenerate && (\n <TextValidation alignItems=\"center\" justifyContent=\"flex-end\" gap={1}>\n <Typography textColor=\"primary600\" variant=\"pi\">\n {formatMessage({\n id: 'content-manager.components.uid.regenerate',\n defaultMessage: 'Regenerate',\n })}\n </Typography>\n </TextValidation>\n )}\n\n <FieldActionWrapper\n onClick={handleRegenerateClick}\n label={formatMessage({\n id: 'content-manager.components.uid.regenerate',\n defaultMessage: 'Regenerate',\n })}\n onMouseEnter={() => setShowRegenerate(true)}\n onMouseLeave={() => setShowRegenerate(false)}\n >\n {isLoading ? (\n <LoadingWrapper data-testid=\"loading-wrapper\">\n <Loader />\n </LoadingWrapper>\n ) : (\n <ArrowClockwise />\n )}\n </FieldActionWrapper>\n </>\n )}\n </Flex>\n }\n onChange={field.onChange}\n value={field.value ?? ''}\n {...props}\n type=\"text\"\n />\n <Field.Error />\n <Field.Hint />\n </Field.Root>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * FieldActionWrapper\n * -----------------------------------------------------------------------------------------------*/\n\nconst FieldActionWrapper = styled(Field.Action)`\n width: 1.6rem;\n\n svg {\n height: 1.6rem;\n width: 1.6rem;\n path {\n fill: ${({ theme }) => theme.colors.neutral400};\n }\n }\n\n svg:hover {\n path {\n fill: ${({ theme }) => theme.colors.primary600};\n }\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * TextValidation\n * -----------------------------------------------------------------------------------------------*/\n\nconst TextValidation = styled<FlexComponent>(Flex)<{ $available?: boolean }>`\n svg {\n height: 1.2rem;\n width: 1.2rem;\n\n path {\n fill: ${({ theme, $available }) =>\n $available ? theme.colors.success600 : theme.colors.danger600};\n }\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * LoadingWrapper\n * -----------------------------------------------------------------------------------------------*/\n\nconst rotation = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(359deg);\n }\n`;\n\nconst LoadingWrapper = styled<FlexComponent>(Flex)`\n animation: ${rotation} 2s infinite linear;\n`;\n\nconst MemoizedUIDInput = React.memo(UIDInput);\n\nexport { MemoizedUIDInput as UIDInput };\nexport type { UIDInputProps };\n"],"names":["EMPTY_ATTRIBUTE","UID_REGEX","UIDInput","React","forwardRef","hint","label","labelAction","name","required","attribute","props","ref","currentDocumentMeta","useDocumentContext","allFormValues","useForm","form","values","availability","setAvailability","useState","showRegenerate","setShowRegenerate","isCloning","useMatch","CLONE_PATH","field","useField","debouncedValue","useDebounce","value","hasChanged","initialValue","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","formatMessage","useIntl","query","useQueryParams","params","useMemo","buildValidParams","regex","validationRegExp","RegExp","trimmedDebouncedValue","trim","data","defaultGeneratedUID","isLoading","isGeneratingDefaultUID","error","apiError","useGetDefaultUIDQuery","contentTypeUID","model","id","documentId","skip","undefined","useEffect","type","message","onChange","generateUID","isGeneratingUID","useGenerateUIDMutation","handleRegenerateClick","res","defaultMessage","availabilityData","isCheckingAvailability","availabilityError","useGetAvailabilityQuery","test","timer","isAvailable","window","setTimeout","clearTimeout","fieldRef","useFocusInputField","composedRefs","useComposedRefs","shouldShowAvailability","_jsxs","Field","Root","_jsx","Label","action","TextInput","disabled","endAction","Flex","position","gap","TextValidation","alignItems","justifyContent","$available","data-not-here-outer","pointerEvents","right","width","CheckCircle","WarningCircle","Typography","textColor","variant","_Fragment","FieldActionWrapper","onClick","onMouseEnter","onMouseLeave","LoadingWrapper","data-testid","Loader","ArrowClockwise","Error","Hint","styled","Action","theme","colors","neutral400","primary600","success600","danger600","rotation","keyframes","MemoizedUIDInput","memo"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Editor.js","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Wysiwyg/Editor.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport CodeMirror, { EditorFromTextArea } from 'codemirror5';\nimport { styled } from 'styled-components';\n\nimport { PreviewWysiwyg } from './PreviewWysiwyg';\nimport { newlineAndIndentContinueMarkdownList } from './utils/continueList';\n\nimport type { FieldValue, InputProps } from '@strapi/admin/strapi-admin';\n\nimport 'codemirror5/addon/display/placeholder';\n\ninterface EditorApi {\n focus: () => void;\n scrollIntoView: (args?: Parameters<HTMLElement['scrollIntoView']>[0]) => void;\n}\n\ninterface EditorProps\n extends Omit<FieldValue<string>, 'initialValue'>,\n Omit<InputProps, 'type' | 'label'> {\n editorRef: React.MutableRefObject<EditorFromTextArea>;\n isPreviewMode?: boolean;\n isExpandMode?: boolean;\n textareaRef: React.RefObject<HTMLTextAreaElement>;\n}\n\nconst Editor = React.forwardRef<EditorApi, EditorProps>(\n (\n {\n disabled,\n editorRef,\n error,\n isPreviewMode,\n isExpandMode,\n name,\n onChange,\n placeholder,\n textareaRef,\n value,\n },\n forwardedRef\n ) => {\n const onChangeRef = React.useRef(onChange);\n\n React.useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n React.useEffect(() => {\n if (editorRef.current) {\n // Ensure the editor and its wrapper are cleaned up whenever this view is re-rendered\n // e.g. in case of re-ordering wysiwyg components in a DynamicZone\n editorRef.current.toTextArea();\n }\n editorRef.current = CodeMirror.fromTextArea(textareaRef.current!, {\n lineWrapping: true,\n extraKeys: {\n Enter: 'newlineAndIndentContinueMarkdownList',\n Tab: false,\n 'Shift-Tab': false,\n },\n readOnly: false,\n smartIndent: false,\n placeholder,\n spellcheck: true,\n inputStyle: 'contenteditable',\n });\n\n // @ts-expect-error – doesn't think command exists?\n CodeMirror.commands.newlineAndIndentContinueMarkdownList =\n newlineAndIndentContinueMarkdownList;\n editorRef.current.on('change', (cm, change) => {\n // setValue (prop sync) must not notify the form — parent already has the value.\n if (change.origin === 'setValue') {\n return;\n }\n onChangeRef.current(name, cm.getValue());\n });\n }, [editorRef, textareaRef, name, placeholder]);\n\n React.useEffect(() => {\n if (editorRef.current.hasFocus()) {\n return;\n }\n const nextValue = value ?? '';\n if (editorRef.current.getValue() !== nextValue) {\n editorRef.current.setValue(nextValue);\n }\n }, [editorRef, value]);\n\n React.useEffect(() => {\n if (isPreviewMode || disabled) {\n editorRef.current.setOption('readOnly', 'nocursor');\n } else {\n editorRef.current.setOption('readOnly', false);\n }\n }, [disabled, isPreviewMode, editorRef]);\n\n React.useEffect(() => {\n if (error) {\n editorRef.current.setOption('screenReaderLabel', error);\n } else {\n // to replace with translation\n editorRef.current.setOption('screenReaderLabel', 'Editor');\n }\n }, [editorRef, error]);\n\n React.useImperativeHandle(\n forwardedRef,\n () => ({\n focus() {\n editorRef.current.getInputField().focus();\n },\n scrollIntoView(args?: Parameters<HTMLElement['scrollIntoView']>[0]) {\n editorRef.current.getInputField().scrollIntoView(args);\n },\n }),\n [editorRef]\n );\n\n return (\n <EditorAndPreviewWrapper>\n <EditorStylesContainer $isExpandMode={isExpandMode} $disabled={disabled || isPreviewMode}>\n <textarea ref={textareaRef} />\n </EditorStylesContainer>\n {isPreviewMode && <PreviewWysiwyg data={value} />}\n </EditorAndPreviewWrapper>\n );\n }\n);\n\nconst EditorAndPreviewWrapper = styled.div`\n position: relative;\n height: calc(100%);\n\n ${({ theme }) => theme.breakpoints.medium} {\n height: calc(100% - 48px);\n }\n`;\n\nconst EditorStylesContainer = styled.div<{ $disabled?: boolean; $isExpandMode?: boolean }>`\n cursor: ${({ $disabled }) => ($disabled ? 'not-allowed !important' : 'auto')};\n height: 100%;\n /* BASICS */\n .CodeMirror-placeholder {\n color: ${({ theme }) => theme.colors.neutral600} !important;\n }\n\n .CodeMirror {\n /* Set height, width, borders, and global font properties here */\n font-size: 1.6rem;\n height: ${({ $isExpandMode }) =>\n $isExpandMode\n ? '100%'\n : '410px'}; // 512px(total height) - 48px (header) - 52px(footer) - 2px border\n color: ${({ theme }) => theme.colors.neutral800};\n direction: ltr;\n font-family:\n -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans',\n 'Helvetica Neue', sans-serif;\n\n ${({ theme }) => theme.breakpoints.medium} {\n font-size: 1.4rem;\n }\n }\n\n /* PADDING */\n\n .CodeMirror-lines {\n padding: ${({ theme }) => `${theme.spaces[3]} ${theme.spaces[4]}`};\n /* Vertical padding around content */\n }\n\n .CodeMirror-scrollbar-filler,\n .CodeMirror-gutter-filler {\n /* The little square between H and V scrollbars */\n background-color: ${({ theme }) => `${theme.colors.neutral0}`};\n }\n\n /* GUTTER */\n\n .CodeMirror-gutters {\n border-right: 1px solid #ddd;\n background-color: #f7f7f7;\n white-space: nowrap;\n }\n .CodeMirror-linenumbers {\n }\n .CodeMirror-linenumber {\n padding: 0 3px 0 5px;\n min-width: 20px;\n text-align: right;\n color: #999;\n white-space: nowrap;\n }\n\n .CodeMirror-guttermarker {\n color: black;\n }\n .CodeMirror-guttermarker-subtle {\n color: #999;\n }\n\n /* CURSOR */\n\n .CodeMirror-cursor {\n border-left: 1px solid black;\n border-right: none;\n width: 0;\n }\n /* Shown when moving in bi-directional text */\n .CodeMirror div.CodeMirror-secondarycursor {\n border-left: 1px solid silver;\n }\n .cm-fat-cursor .CodeMirror-cursor {\n width: auto;\n border: 0 !important;\n background: #7e7;\n }\n .cm-fat-cursor div.CodeMirror-cursors {\n /* z-index: 1; */\n }\n\n .cm-fat-cursor-mark {\n background-color: rgba(20, 255, 20, 0.5);\n -webkit-animation: blink 1.06s steps(1) infinite;\n -moz-animation: blink 1.06s steps(1) infinite;\n animation: blink 1.06s steps(1) infinite;\n }\n .cm-animate-fat-cursor {\n width: auto;\n border: 0;\n -webkit-animation: blink 1.06s steps(1) infinite;\n -moz-animation: blink 1.06s steps(1) infinite;\n animation: blink 1.06s steps(1) infinite;\n background-color: #7e7;\n }\n\n /* Can style cursor different in overwrite (non-insert) mode */\n .CodeMirror-overwrite .CodeMirror-cursor {\n }\n\n .cm-tab {\n display: inline-block;\n text-decoration: inherit;\n }\n\n .CodeMirror-rulers {\n position: absolute;\n left: 0;\n right: 0;\n top: -50px;\n bottom: 0;\n overflow: hidden;\n }\n .CodeMirror-ruler {\n border-left: 1px solid #ccc;\n top: 0;\n bottom: 0;\n position: absolute;\n }\n\n /* DEFAULT THEME */\n\n .cm-header,\n .cm-strong {\n font-weight: bold;\n }\n .cm-em {\n font-style: italic;\n }\n .cm-link {\n text-decoration: underline;\n }\n .cm-strikethrough {\n text-decoration: line-through;\n }\n\n .CodeMirror-composing {\n border-bottom: 2px solid;\n }\n\n /* Default styles for common addons */\n\n div.CodeMirror span.CodeMirror-matchingbracket {\n color: #0b0;\n }\n div.CodeMirror span.CodeMirror-nonmatchingbracket {\n color: #a22;\n }\n .CodeMirror-matchingtag {\n background: rgba(255, 150, 0, 0.3);\n }\n .CodeMirror-activeline-background {\n background: #e8f2ff;\n }\n\n /* STOP */\n\n /* The rest of this file contains styles related to the mechanics of\n the editor. You probably shouldn't touch them. */\n\n .CodeMirror {\n position: relative;\n overflow: hidden;\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => `${theme.colors.neutral0}`};\n }\n\n .CodeMirror-scroll {\n overflow: scroll !important; /* Things will break if this is overridden */\n /* 50px is the magic margin used to hide the element's real scrollbars */\n /* See overflow: hidden in .CodeMirror */\n margin-bottom: -50px;\n margin-right: -50px;\n padding-bottom: 50px;\n height: 100%;\n outline: none; /* Prevent dragging from highlighting the element */\n position: relative;\n }\n .CodeMirror-sizer {\n position: relative;\n border-right: 50px solid transparent;\n }\n\n /* The fake, visible scrollbars. Used to force redraw during scrolling\n before actual scrolling happens, thus preventing shaking and\n flickering artifacts. */\n .CodeMirror-vscrollbar,\n .CodeMirror-hscrollbar,\n .CodeMirror-scrollbar-filler,\n .CodeMirror-gutter-filler {\n position: absolute;\n z-index: 1;\n display: none;\n outline: none;\n }\n\n .CodeMirror-vscrollbar {\n right: 0;\n top: 0;\n overflow-x: hidden;\n overflow-y: scroll;\n }\n .CodeMirror-hscrollbar {\n bottom: 0;\n left: 0;\n overflow-y: hidden;\n overflow-x: scroll;\n }\n .CodeMirror-scrollbar-filler {\n right: 0;\n bottom: 0;\n }\n\n .CodeMirror-lines {\n cursor: text;\n min-height: 1px; /* prevents collapsing before first draw */\n }\n /* Reset some styles that the rest of the page might have set */\n .CodeMirror pre.CodeMirror-line,\n .CodeMirror pre.CodeMirror-line-like {\n -moz-border-radius: 0;\n -webkit-border-radius: 0;\n border-radius: 0;\n border-width: 0;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n margin: 0;\n white-space: pre;\n word-wrap: normal;\n line-height: 1.5;\n color: inherit;\n /* z-index: 2; */\n position: relative;\n overflow: visible;\n -webkit-tap-highlight-color: transparent;\n -webkit-font-variant-ligatures: contextual;\n font-variant-ligatures: contextual;\n }\n\n .CodeMirror pre.CodeMirror-line-like {\n z-index: 2;\n }\n\n .CodeMirror-wrap pre.CodeMirror-line,\n .CodeMirror-wrap pre.CodeMirror-line-like {\n word-wrap: break-word;\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n .CodeMirror-linebackground {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: 0;\n }\n\n .CodeMirror-linewidget {\n position: relative;\n /* z-index: 2; */\n padding: 0.1px; /* Force widget margins to stay inside of the container */\n }\n\n .CodeMirror-widget {\n }\n\n .CodeMirror-rtl pre {\n direction: rtl;\n }\n\n .CodeMirror-code {\n outline: none;\n }\n\n /* Force content-box sizing for the elements where we expect it */\n .CodeMirror-scroll,\n .CodeMirror-sizer,\n .CodeMirror-gutter,\n .CodeMirror-gutters,\n .CodeMirror-linenumber {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n }\n\n .CodeMirror-measure {\n position: absolute;\n width: 100%;\n height: 0;\n overflow: hidden;\n visibility: hidden;\n }\n\n .CodeMirror-cursor {\n position: absolute;\n pointer-events: none;\n border-color: ${({ theme }) => `${theme.colors.neutral800}`};\n }\n .CodeMirror-measure pre {\n position: static;\n }\n\n div.CodeMirror-cursors {\n visibility: hidden;\n position: relative;\n + div {\n z-index: 0 !important;\n }\n }\n\n div.CodeMirror-dragcursors {\n visibility: visible;\n }\n\n .CodeMirror-focused div.CodeMirror-cursors {\n visibility: visible;\n }\n\n .CodeMirror-selected {\n background: ${({ theme }) => theme.colors.neutral200};\n /* z-index: -10; */\n }\n .CodeMirror-crosshair {\n cursor: crosshair;\n }\n\n /* Used to force a border model for a node */\n .cm-force-border {\n padding-right: 0.1px;\n }\n\n /* See issue #2901 */\n .cm-tab-wrap-hack:after {\n content: '';\n }\n\n /* Help users use markselection to safely style text background */\n span.CodeMirror-selectedtext {\n background: none;\n }\n\n span {\n color: ${({ theme }) => theme.colors.neutral800} !important;\n }\n`;\n\nexport { Editor };\nexport type { EditorProps, EditorApi };\n"],"names":["Editor","React","forwardRef","disabled","editorRef","error","isPreviewMode","isExpandMode","name","onChange","placeholder","textareaRef","value","forwardedRef","onChangeRef","useRef","useEffect","current","toTextArea","CodeMirror","fromTextArea","lineWrapping","extraKeys","Enter","Tab","readOnly","smartIndent","spellcheck","inputStyle","commands","newlineAndIndentContinueMarkdownList","on","cm","change","origin","getValue","hasFocus","nextValue","setValue","setOption","useImperativeHandle","focus","getInputField","scrollIntoView","args","_jsxs","EditorAndPreviewWrapper","_jsx","EditorStylesContainer","$isExpandMode","$disabled","textarea","ref","PreviewWysiwyg","data","styled","div","theme","breakpoints","medium","colors","neutral600","neutral800","spaces","neutral0","borderRadius","neutral200"],"mappings":"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"}
1
+ {"version":3,"file":"Editor.js","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Wysiwyg/Editor.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport CodeMirror, { EditorFromTextArea } from 'codemirror5';\nimport { styled } from 'styled-components';\n\nimport { PreviewWysiwyg } from './PreviewWysiwyg';\nimport { newlineAndIndentContinueMarkdownList } from './utils/continueList';\n\nimport type { FieldValue, InputProps } from '@strapi/admin/strapi-admin';\n\nimport 'codemirror5/addon/display/placeholder';\n\ninterface EditorApi {\n focus: () => void;\n scrollIntoView: (args?: Parameters<HTMLElement['scrollIntoView']>[0]) => void;\n}\n\ninterface EditorProps\n extends Omit<FieldValue<string>, 'initialValue'>, Omit<InputProps, 'type' | 'label'> {\n editorRef: React.MutableRefObject<EditorFromTextArea>;\n isPreviewMode?: boolean;\n isExpandMode?: boolean;\n textareaRef: React.RefObject<HTMLTextAreaElement>;\n}\n\nconst Editor = React.forwardRef<EditorApi, EditorProps>(\n (\n {\n disabled,\n editorRef,\n error,\n isPreviewMode,\n isExpandMode,\n name,\n onChange,\n placeholder,\n textareaRef,\n value,\n },\n forwardedRef\n ) => {\n const onChangeRef = React.useRef(onChange);\n\n React.useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n React.useEffect(() => {\n if (editorRef.current) {\n // Ensure the editor and its wrapper are cleaned up whenever this view is re-rendered\n // e.g. in case of re-ordering wysiwyg components in a DynamicZone\n editorRef.current.toTextArea();\n }\n editorRef.current = CodeMirror.fromTextArea(textareaRef.current!, {\n lineWrapping: true,\n extraKeys: {\n Enter: 'newlineAndIndentContinueMarkdownList',\n Tab: false,\n 'Shift-Tab': false,\n },\n readOnly: false,\n smartIndent: false,\n placeholder,\n spellcheck: true,\n inputStyle: 'contenteditable',\n });\n\n // @ts-expect-error – doesn't think command exists?\n CodeMirror.commands.newlineAndIndentContinueMarkdownList =\n newlineAndIndentContinueMarkdownList;\n editorRef.current.on('change', (cm, change) => {\n // setValue (prop sync) must not notify the form — parent already has the value.\n if (change.origin === 'setValue') {\n return;\n }\n onChangeRef.current(name, cm.getValue());\n });\n }, [editorRef, textareaRef, name, placeholder]);\n\n React.useEffect(() => {\n if (editorRef.current.hasFocus()) {\n return;\n }\n const nextValue = value ?? '';\n if (editorRef.current.getValue() !== nextValue) {\n editorRef.current.setValue(nextValue);\n }\n }, [editorRef, value]);\n\n React.useEffect(() => {\n if (isPreviewMode || disabled) {\n editorRef.current.setOption('readOnly', 'nocursor');\n } else {\n editorRef.current.setOption('readOnly', false);\n }\n }, [disabled, isPreviewMode, editorRef]);\n\n React.useEffect(() => {\n if (error) {\n editorRef.current.setOption('screenReaderLabel', error);\n } else {\n // to replace with translation\n editorRef.current.setOption('screenReaderLabel', 'Editor');\n }\n }, [editorRef, error]);\n\n React.useImperativeHandle(\n forwardedRef,\n () => ({\n focus() {\n editorRef.current.getInputField().focus();\n },\n scrollIntoView(args?: Parameters<HTMLElement['scrollIntoView']>[0]) {\n editorRef.current.getInputField().scrollIntoView(args);\n },\n }),\n [editorRef]\n );\n\n return (\n <EditorAndPreviewWrapper>\n <EditorStylesContainer $isExpandMode={isExpandMode} $disabled={disabled || isPreviewMode}>\n <textarea ref={textareaRef} />\n </EditorStylesContainer>\n {isPreviewMode && <PreviewWysiwyg data={value} />}\n </EditorAndPreviewWrapper>\n );\n }\n);\n\nconst EditorAndPreviewWrapper = styled.div`\n position: relative;\n height: calc(100%);\n\n ${({ theme }) => theme.breakpoints.medium} {\n height: calc(100% - 48px);\n }\n`;\n\nconst EditorStylesContainer = styled.div<{ $disabled?: boolean; $isExpandMode?: boolean }>`\n cursor: ${({ $disabled }) => ($disabled ? 'not-allowed !important' : 'auto')};\n height: 100%;\n /* BASICS */\n .CodeMirror-placeholder {\n color: ${({ theme }) => theme.colors.neutral600} !important;\n }\n\n .CodeMirror {\n /* Set height, width, borders, and global font properties here */\n font-size: 1.6rem;\n height: ${({ $isExpandMode }) =>\n $isExpandMode\n ? '100%'\n : '410px'}; // 512px(total height) - 48px (header) - 52px(footer) - 2px border\n color: ${({ theme }) => theme.colors.neutral800};\n direction: ltr;\n font-family:\n -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans',\n 'Helvetica Neue', sans-serif;\n\n ${({ theme }) => theme.breakpoints.medium} {\n font-size: 1.4rem;\n }\n }\n\n /* PADDING */\n\n .CodeMirror-lines {\n padding: ${({ theme }) => `${theme.spaces[3]} ${theme.spaces[4]}`};\n /* Vertical padding around content */\n }\n\n .CodeMirror-scrollbar-filler,\n .CodeMirror-gutter-filler {\n /* The little square between H and V scrollbars */\n background-color: ${({ theme }) => `${theme.colors.neutral0}`};\n }\n\n /* GUTTER */\n\n .CodeMirror-gutters {\n border-right: 1px solid #ddd;\n background-color: #f7f7f7;\n white-space: nowrap;\n }\n .CodeMirror-linenumbers {\n }\n .CodeMirror-linenumber {\n padding: 0 3px 0 5px;\n min-width: 20px;\n text-align: right;\n color: #999;\n white-space: nowrap;\n }\n\n .CodeMirror-guttermarker {\n color: black;\n }\n .CodeMirror-guttermarker-subtle {\n color: #999;\n }\n\n /* CURSOR */\n\n .CodeMirror-cursor {\n border-left: 1px solid black;\n border-right: none;\n width: 0;\n }\n /* Shown when moving in bi-directional text */\n .CodeMirror div.CodeMirror-secondarycursor {\n border-left: 1px solid silver;\n }\n .cm-fat-cursor .CodeMirror-cursor {\n width: auto;\n border: 0 !important;\n background: #7e7;\n }\n .cm-fat-cursor div.CodeMirror-cursors {\n /* z-index: 1; */\n }\n\n .cm-fat-cursor-mark {\n background-color: rgba(20, 255, 20, 0.5);\n -webkit-animation: blink 1.06s steps(1) infinite;\n -moz-animation: blink 1.06s steps(1) infinite;\n animation: blink 1.06s steps(1) infinite;\n }\n .cm-animate-fat-cursor {\n width: auto;\n border: 0;\n -webkit-animation: blink 1.06s steps(1) infinite;\n -moz-animation: blink 1.06s steps(1) infinite;\n animation: blink 1.06s steps(1) infinite;\n background-color: #7e7;\n }\n\n /* Can style cursor different in overwrite (non-insert) mode */\n .CodeMirror-overwrite .CodeMirror-cursor {\n }\n\n .cm-tab {\n display: inline-block;\n text-decoration: inherit;\n }\n\n .CodeMirror-rulers {\n position: absolute;\n left: 0;\n right: 0;\n top: -50px;\n bottom: 0;\n overflow: hidden;\n }\n .CodeMirror-ruler {\n border-left: 1px solid #ccc;\n top: 0;\n bottom: 0;\n position: absolute;\n }\n\n /* DEFAULT THEME */\n\n .cm-header,\n .cm-strong {\n font-weight: bold;\n }\n .cm-em {\n font-style: italic;\n }\n .cm-link {\n text-decoration: underline;\n }\n .cm-strikethrough {\n text-decoration: line-through;\n }\n\n .CodeMirror-composing {\n border-bottom: 2px solid;\n }\n\n /* Default styles for common addons */\n\n div.CodeMirror span.CodeMirror-matchingbracket {\n color: #0b0;\n }\n div.CodeMirror span.CodeMirror-nonmatchingbracket {\n color: #a22;\n }\n .CodeMirror-matchingtag {\n background: rgba(255, 150, 0, 0.3);\n }\n .CodeMirror-activeline-background {\n background: #e8f2ff;\n }\n\n /* STOP */\n\n /* The rest of this file contains styles related to the mechanics of\n the editor. You probably shouldn't touch them. */\n\n .CodeMirror {\n position: relative;\n overflow: hidden;\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => `${theme.colors.neutral0}`};\n }\n\n .CodeMirror-scroll {\n overflow: scroll !important; /* Things will break if this is overridden */\n /* 50px is the magic margin used to hide the element's real scrollbars */\n /* See overflow: hidden in .CodeMirror */\n margin-bottom: -50px;\n margin-right: -50px;\n padding-bottom: 50px;\n height: 100%;\n outline: none; /* Prevent dragging from highlighting the element */\n position: relative;\n }\n .CodeMirror-sizer {\n position: relative;\n border-right: 50px solid transparent;\n }\n\n /* The fake, visible scrollbars. Used to force redraw during scrolling\n before actual scrolling happens, thus preventing shaking and\n flickering artifacts. */\n .CodeMirror-vscrollbar,\n .CodeMirror-hscrollbar,\n .CodeMirror-scrollbar-filler,\n .CodeMirror-gutter-filler {\n position: absolute;\n z-index: 1;\n display: none;\n outline: none;\n }\n\n .CodeMirror-vscrollbar {\n right: 0;\n top: 0;\n overflow-x: hidden;\n overflow-y: scroll;\n }\n .CodeMirror-hscrollbar {\n bottom: 0;\n left: 0;\n overflow-y: hidden;\n overflow-x: scroll;\n }\n .CodeMirror-scrollbar-filler {\n right: 0;\n bottom: 0;\n }\n\n .CodeMirror-lines {\n cursor: text;\n min-height: 1px; /* prevents collapsing before first draw */\n }\n /* Reset some styles that the rest of the page might have set */\n .CodeMirror pre.CodeMirror-line,\n .CodeMirror pre.CodeMirror-line-like {\n -moz-border-radius: 0;\n -webkit-border-radius: 0;\n border-radius: 0;\n border-width: 0;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n margin: 0;\n white-space: pre;\n word-wrap: normal;\n line-height: 1.5;\n color: inherit;\n /* z-index: 2; */\n position: relative;\n overflow: visible;\n -webkit-tap-highlight-color: transparent;\n -webkit-font-variant-ligatures: contextual;\n font-variant-ligatures: contextual;\n }\n\n .CodeMirror pre.CodeMirror-line-like {\n z-index: 2;\n }\n\n .CodeMirror-wrap pre.CodeMirror-line,\n .CodeMirror-wrap pre.CodeMirror-line-like {\n word-wrap: break-word;\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n .CodeMirror-linebackground {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: 0;\n }\n\n .CodeMirror-linewidget {\n position: relative;\n /* z-index: 2; */\n padding: 0.1px; /* Force widget margins to stay inside of the container */\n }\n\n .CodeMirror-widget {\n }\n\n .CodeMirror-rtl pre {\n direction: rtl;\n }\n\n .CodeMirror-code {\n outline: none;\n }\n\n /* Force content-box sizing for the elements where we expect it */\n .CodeMirror-scroll,\n .CodeMirror-sizer,\n .CodeMirror-gutter,\n .CodeMirror-gutters,\n .CodeMirror-linenumber {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n }\n\n .CodeMirror-measure {\n position: absolute;\n width: 100%;\n height: 0;\n overflow: hidden;\n visibility: hidden;\n }\n\n .CodeMirror-cursor {\n position: absolute;\n pointer-events: none;\n border-color: ${({ theme }) => `${theme.colors.neutral800}`};\n }\n .CodeMirror-measure pre {\n position: static;\n }\n\n div.CodeMirror-cursors {\n visibility: hidden;\n position: relative;\n + div {\n z-index: 0 !important;\n }\n }\n\n div.CodeMirror-dragcursors {\n visibility: visible;\n }\n\n .CodeMirror-focused div.CodeMirror-cursors {\n visibility: visible;\n }\n\n .CodeMirror-selected {\n background: ${({ theme }) => theme.colors.neutral200};\n /* z-index: -10; */\n }\n .CodeMirror-crosshair {\n cursor: crosshair;\n }\n\n /* Used to force a border model for a node */\n .cm-force-border {\n padding-right: 0.1px;\n }\n\n /* See issue #2901 */\n .cm-tab-wrap-hack:after {\n content: '';\n }\n\n /* Help users use markselection to safely style text background */\n span.CodeMirror-selectedtext {\n background: none;\n }\n\n span {\n color: ${({ theme }) => theme.colors.neutral800} !important;\n }\n`;\n\nexport { Editor };\nexport type { EditorProps, EditorApi };\n"],"names":["Editor","React","forwardRef","disabled","editorRef","error","isPreviewMode","isExpandMode","name","onChange","placeholder","textareaRef","value","forwardedRef","onChangeRef","useRef","useEffect","current","toTextArea","CodeMirror","fromTextArea","lineWrapping","extraKeys","Enter","Tab","readOnly","smartIndent","spellcheck","inputStyle","commands","newlineAndIndentContinueMarkdownList","on","cm","change","origin","getValue","hasFocus","nextValue","setValue","setOption","useImperativeHandle","focus","getInputField","scrollIntoView","args","_jsxs","EditorAndPreviewWrapper","_jsx","EditorStylesContainer","$isExpandMode","$disabled","textarea","ref","PreviewWysiwyg","data","styled","div","theme","breakpoints","medium","colors","neutral600","neutral800","spaces","neutral0","borderRadius","neutral200"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Editor.mjs","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Wysiwyg/Editor.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport CodeMirror, { EditorFromTextArea } from 'codemirror5';\nimport { styled } from 'styled-components';\n\nimport { PreviewWysiwyg } from './PreviewWysiwyg';\nimport { newlineAndIndentContinueMarkdownList } from './utils/continueList';\n\nimport type { FieldValue, InputProps } from '@strapi/admin/strapi-admin';\n\nimport 'codemirror5/addon/display/placeholder';\n\ninterface EditorApi {\n focus: () => void;\n scrollIntoView: (args?: Parameters<HTMLElement['scrollIntoView']>[0]) => void;\n}\n\ninterface EditorProps\n extends Omit<FieldValue<string>, 'initialValue'>,\n Omit<InputProps, 'type' | 'label'> {\n editorRef: React.MutableRefObject<EditorFromTextArea>;\n isPreviewMode?: boolean;\n isExpandMode?: boolean;\n textareaRef: React.RefObject<HTMLTextAreaElement>;\n}\n\nconst Editor = React.forwardRef<EditorApi, EditorProps>(\n (\n {\n disabled,\n editorRef,\n error,\n isPreviewMode,\n isExpandMode,\n name,\n onChange,\n placeholder,\n textareaRef,\n value,\n },\n forwardedRef\n ) => {\n const onChangeRef = React.useRef(onChange);\n\n React.useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n React.useEffect(() => {\n if (editorRef.current) {\n // Ensure the editor and its wrapper are cleaned up whenever this view is re-rendered\n // e.g. in case of re-ordering wysiwyg components in a DynamicZone\n editorRef.current.toTextArea();\n }\n editorRef.current = CodeMirror.fromTextArea(textareaRef.current!, {\n lineWrapping: true,\n extraKeys: {\n Enter: 'newlineAndIndentContinueMarkdownList',\n Tab: false,\n 'Shift-Tab': false,\n },\n readOnly: false,\n smartIndent: false,\n placeholder,\n spellcheck: true,\n inputStyle: 'contenteditable',\n });\n\n // @ts-expect-error – doesn't think command exists?\n CodeMirror.commands.newlineAndIndentContinueMarkdownList =\n newlineAndIndentContinueMarkdownList;\n editorRef.current.on('change', (cm, change) => {\n // setValue (prop sync) must not notify the form — parent already has the value.\n if (change.origin === 'setValue') {\n return;\n }\n onChangeRef.current(name, cm.getValue());\n });\n }, [editorRef, textareaRef, name, placeholder]);\n\n React.useEffect(() => {\n if (editorRef.current.hasFocus()) {\n return;\n }\n const nextValue = value ?? '';\n if (editorRef.current.getValue() !== nextValue) {\n editorRef.current.setValue(nextValue);\n }\n }, [editorRef, value]);\n\n React.useEffect(() => {\n if (isPreviewMode || disabled) {\n editorRef.current.setOption('readOnly', 'nocursor');\n } else {\n editorRef.current.setOption('readOnly', false);\n }\n }, [disabled, isPreviewMode, editorRef]);\n\n React.useEffect(() => {\n if (error) {\n editorRef.current.setOption('screenReaderLabel', error);\n } else {\n // to replace with translation\n editorRef.current.setOption('screenReaderLabel', 'Editor');\n }\n }, [editorRef, error]);\n\n React.useImperativeHandle(\n forwardedRef,\n () => ({\n focus() {\n editorRef.current.getInputField().focus();\n },\n scrollIntoView(args?: Parameters<HTMLElement['scrollIntoView']>[0]) {\n editorRef.current.getInputField().scrollIntoView(args);\n },\n }),\n [editorRef]\n );\n\n return (\n <EditorAndPreviewWrapper>\n <EditorStylesContainer $isExpandMode={isExpandMode} $disabled={disabled || isPreviewMode}>\n <textarea ref={textareaRef} />\n </EditorStylesContainer>\n {isPreviewMode && <PreviewWysiwyg data={value} />}\n </EditorAndPreviewWrapper>\n );\n }\n);\n\nconst EditorAndPreviewWrapper = styled.div`\n position: relative;\n height: calc(100%);\n\n ${({ theme }) => theme.breakpoints.medium} {\n height: calc(100% - 48px);\n }\n`;\n\nconst EditorStylesContainer = styled.div<{ $disabled?: boolean; $isExpandMode?: boolean }>`\n cursor: ${({ $disabled }) => ($disabled ? 'not-allowed !important' : 'auto')};\n height: 100%;\n /* BASICS */\n .CodeMirror-placeholder {\n color: ${({ theme }) => theme.colors.neutral600} !important;\n }\n\n .CodeMirror {\n /* Set height, width, borders, and global font properties here */\n font-size: 1.6rem;\n height: ${({ $isExpandMode }) =>\n $isExpandMode\n ? '100%'\n : '410px'}; // 512px(total height) - 48px (header) - 52px(footer) - 2px border\n color: ${({ theme }) => theme.colors.neutral800};\n direction: ltr;\n font-family:\n -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans',\n 'Helvetica Neue', sans-serif;\n\n ${({ theme }) => theme.breakpoints.medium} {\n font-size: 1.4rem;\n }\n }\n\n /* PADDING */\n\n .CodeMirror-lines {\n padding: ${({ theme }) => `${theme.spaces[3]} ${theme.spaces[4]}`};\n /* Vertical padding around content */\n }\n\n .CodeMirror-scrollbar-filler,\n .CodeMirror-gutter-filler {\n /* The little square between H and V scrollbars */\n background-color: ${({ theme }) => `${theme.colors.neutral0}`};\n }\n\n /* GUTTER */\n\n .CodeMirror-gutters {\n border-right: 1px solid #ddd;\n background-color: #f7f7f7;\n white-space: nowrap;\n }\n .CodeMirror-linenumbers {\n }\n .CodeMirror-linenumber {\n padding: 0 3px 0 5px;\n min-width: 20px;\n text-align: right;\n color: #999;\n white-space: nowrap;\n }\n\n .CodeMirror-guttermarker {\n color: black;\n }\n .CodeMirror-guttermarker-subtle {\n color: #999;\n }\n\n /* CURSOR */\n\n .CodeMirror-cursor {\n border-left: 1px solid black;\n border-right: none;\n width: 0;\n }\n /* Shown when moving in bi-directional text */\n .CodeMirror div.CodeMirror-secondarycursor {\n border-left: 1px solid silver;\n }\n .cm-fat-cursor .CodeMirror-cursor {\n width: auto;\n border: 0 !important;\n background: #7e7;\n }\n .cm-fat-cursor div.CodeMirror-cursors {\n /* z-index: 1; */\n }\n\n .cm-fat-cursor-mark {\n background-color: rgba(20, 255, 20, 0.5);\n -webkit-animation: blink 1.06s steps(1) infinite;\n -moz-animation: blink 1.06s steps(1) infinite;\n animation: blink 1.06s steps(1) infinite;\n }\n .cm-animate-fat-cursor {\n width: auto;\n border: 0;\n -webkit-animation: blink 1.06s steps(1) infinite;\n -moz-animation: blink 1.06s steps(1) infinite;\n animation: blink 1.06s steps(1) infinite;\n background-color: #7e7;\n }\n\n /* Can style cursor different in overwrite (non-insert) mode */\n .CodeMirror-overwrite .CodeMirror-cursor {\n }\n\n .cm-tab {\n display: inline-block;\n text-decoration: inherit;\n }\n\n .CodeMirror-rulers {\n position: absolute;\n left: 0;\n right: 0;\n top: -50px;\n bottom: 0;\n overflow: hidden;\n }\n .CodeMirror-ruler {\n border-left: 1px solid #ccc;\n top: 0;\n bottom: 0;\n position: absolute;\n }\n\n /* DEFAULT THEME */\n\n .cm-header,\n .cm-strong {\n font-weight: bold;\n }\n .cm-em {\n font-style: italic;\n }\n .cm-link {\n text-decoration: underline;\n }\n .cm-strikethrough {\n text-decoration: line-through;\n }\n\n .CodeMirror-composing {\n border-bottom: 2px solid;\n }\n\n /* Default styles for common addons */\n\n div.CodeMirror span.CodeMirror-matchingbracket {\n color: #0b0;\n }\n div.CodeMirror span.CodeMirror-nonmatchingbracket {\n color: #a22;\n }\n .CodeMirror-matchingtag {\n background: rgba(255, 150, 0, 0.3);\n }\n .CodeMirror-activeline-background {\n background: #e8f2ff;\n }\n\n /* STOP */\n\n /* The rest of this file contains styles related to the mechanics of\n the editor. You probably shouldn't touch them. */\n\n .CodeMirror {\n position: relative;\n overflow: hidden;\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => `${theme.colors.neutral0}`};\n }\n\n .CodeMirror-scroll {\n overflow: scroll !important; /* Things will break if this is overridden */\n /* 50px is the magic margin used to hide the element's real scrollbars */\n /* See overflow: hidden in .CodeMirror */\n margin-bottom: -50px;\n margin-right: -50px;\n padding-bottom: 50px;\n height: 100%;\n outline: none; /* Prevent dragging from highlighting the element */\n position: relative;\n }\n .CodeMirror-sizer {\n position: relative;\n border-right: 50px solid transparent;\n }\n\n /* The fake, visible scrollbars. Used to force redraw during scrolling\n before actual scrolling happens, thus preventing shaking and\n flickering artifacts. */\n .CodeMirror-vscrollbar,\n .CodeMirror-hscrollbar,\n .CodeMirror-scrollbar-filler,\n .CodeMirror-gutter-filler {\n position: absolute;\n z-index: 1;\n display: none;\n outline: none;\n }\n\n .CodeMirror-vscrollbar {\n right: 0;\n top: 0;\n overflow-x: hidden;\n overflow-y: scroll;\n }\n .CodeMirror-hscrollbar {\n bottom: 0;\n left: 0;\n overflow-y: hidden;\n overflow-x: scroll;\n }\n .CodeMirror-scrollbar-filler {\n right: 0;\n bottom: 0;\n }\n\n .CodeMirror-lines {\n cursor: text;\n min-height: 1px; /* prevents collapsing before first draw */\n }\n /* Reset some styles that the rest of the page might have set */\n .CodeMirror pre.CodeMirror-line,\n .CodeMirror pre.CodeMirror-line-like {\n -moz-border-radius: 0;\n -webkit-border-radius: 0;\n border-radius: 0;\n border-width: 0;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n margin: 0;\n white-space: pre;\n word-wrap: normal;\n line-height: 1.5;\n color: inherit;\n /* z-index: 2; */\n position: relative;\n overflow: visible;\n -webkit-tap-highlight-color: transparent;\n -webkit-font-variant-ligatures: contextual;\n font-variant-ligatures: contextual;\n }\n\n .CodeMirror pre.CodeMirror-line-like {\n z-index: 2;\n }\n\n .CodeMirror-wrap pre.CodeMirror-line,\n .CodeMirror-wrap pre.CodeMirror-line-like {\n word-wrap: break-word;\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n .CodeMirror-linebackground {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: 0;\n }\n\n .CodeMirror-linewidget {\n position: relative;\n /* z-index: 2; */\n padding: 0.1px; /* Force widget margins to stay inside of the container */\n }\n\n .CodeMirror-widget {\n }\n\n .CodeMirror-rtl pre {\n direction: rtl;\n }\n\n .CodeMirror-code {\n outline: none;\n }\n\n /* Force content-box sizing for the elements where we expect it */\n .CodeMirror-scroll,\n .CodeMirror-sizer,\n .CodeMirror-gutter,\n .CodeMirror-gutters,\n .CodeMirror-linenumber {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n }\n\n .CodeMirror-measure {\n position: absolute;\n width: 100%;\n height: 0;\n overflow: hidden;\n visibility: hidden;\n }\n\n .CodeMirror-cursor {\n position: absolute;\n pointer-events: none;\n border-color: ${({ theme }) => `${theme.colors.neutral800}`};\n }\n .CodeMirror-measure pre {\n position: static;\n }\n\n div.CodeMirror-cursors {\n visibility: hidden;\n position: relative;\n + div {\n z-index: 0 !important;\n }\n }\n\n div.CodeMirror-dragcursors {\n visibility: visible;\n }\n\n .CodeMirror-focused div.CodeMirror-cursors {\n visibility: visible;\n }\n\n .CodeMirror-selected {\n background: ${({ theme }) => theme.colors.neutral200};\n /* z-index: -10; */\n }\n .CodeMirror-crosshair {\n cursor: crosshair;\n }\n\n /* Used to force a border model for a node */\n .cm-force-border {\n padding-right: 0.1px;\n }\n\n /* See issue #2901 */\n .cm-tab-wrap-hack:after {\n content: '';\n }\n\n /* Help users use markselection to safely style text background */\n span.CodeMirror-selectedtext {\n background: none;\n }\n\n span {\n color: ${({ theme }) => theme.colors.neutral800} !important;\n }\n`;\n\nexport { Editor };\nexport type { EditorProps, EditorApi };\n"],"names":["Editor","React","forwardRef","disabled","editorRef","error","isPreviewMode","isExpandMode","name","onChange","placeholder","textareaRef","value","forwardedRef","onChangeRef","useRef","useEffect","current","toTextArea","CodeMirror","fromTextArea","lineWrapping","extraKeys","Enter","Tab","readOnly","smartIndent","spellcheck","inputStyle","commands","newlineAndIndentContinueMarkdownList","on","cm","change","origin","getValue","hasFocus","nextValue","setValue","setOption","useImperativeHandle","focus","getInputField","scrollIntoView","args","_jsxs","EditorAndPreviewWrapper","_jsx","EditorStylesContainer","$isExpandMode","$disabled","textarea","ref","PreviewWysiwyg","data","styled","div","theme","breakpoints","medium","colors","neutral600","neutral800","spaces","neutral0","borderRadius","neutral200"],"mappings":"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"}
1
+ {"version":3,"file":"Editor.mjs","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Wysiwyg/Editor.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport CodeMirror, { EditorFromTextArea } from 'codemirror5';\nimport { styled } from 'styled-components';\n\nimport { PreviewWysiwyg } from './PreviewWysiwyg';\nimport { newlineAndIndentContinueMarkdownList } from './utils/continueList';\n\nimport type { FieldValue, InputProps } from '@strapi/admin/strapi-admin';\n\nimport 'codemirror5/addon/display/placeholder';\n\ninterface EditorApi {\n focus: () => void;\n scrollIntoView: (args?: Parameters<HTMLElement['scrollIntoView']>[0]) => void;\n}\n\ninterface EditorProps\n extends Omit<FieldValue<string>, 'initialValue'>, Omit<InputProps, 'type' | 'label'> {\n editorRef: React.MutableRefObject<EditorFromTextArea>;\n isPreviewMode?: boolean;\n isExpandMode?: boolean;\n textareaRef: React.RefObject<HTMLTextAreaElement>;\n}\n\nconst Editor = React.forwardRef<EditorApi, EditorProps>(\n (\n {\n disabled,\n editorRef,\n error,\n isPreviewMode,\n isExpandMode,\n name,\n onChange,\n placeholder,\n textareaRef,\n value,\n },\n forwardedRef\n ) => {\n const onChangeRef = React.useRef(onChange);\n\n React.useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n React.useEffect(() => {\n if (editorRef.current) {\n // Ensure the editor and its wrapper are cleaned up whenever this view is re-rendered\n // e.g. in case of re-ordering wysiwyg components in a DynamicZone\n editorRef.current.toTextArea();\n }\n editorRef.current = CodeMirror.fromTextArea(textareaRef.current!, {\n lineWrapping: true,\n extraKeys: {\n Enter: 'newlineAndIndentContinueMarkdownList',\n Tab: false,\n 'Shift-Tab': false,\n },\n readOnly: false,\n smartIndent: false,\n placeholder,\n spellcheck: true,\n inputStyle: 'contenteditable',\n });\n\n // @ts-expect-error – doesn't think command exists?\n CodeMirror.commands.newlineAndIndentContinueMarkdownList =\n newlineAndIndentContinueMarkdownList;\n editorRef.current.on('change', (cm, change) => {\n // setValue (prop sync) must not notify the form — parent already has the value.\n if (change.origin === 'setValue') {\n return;\n }\n onChangeRef.current(name, cm.getValue());\n });\n }, [editorRef, textareaRef, name, placeholder]);\n\n React.useEffect(() => {\n if (editorRef.current.hasFocus()) {\n return;\n }\n const nextValue = value ?? '';\n if (editorRef.current.getValue() !== nextValue) {\n editorRef.current.setValue(nextValue);\n }\n }, [editorRef, value]);\n\n React.useEffect(() => {\n if (isPreviewMode || disabled) {\n editorRef.current.setOption('readOnly', 'nocursor');\n } else {\n editorRef.current.setOption('readOnly', false);\n }\n }, [disabled, isPreviewMode, editorRef]);\n\n React.useEffect(() => {\n if (error) {\n editorRef.current.setOption('screenReaderLabel', error);\n } else {\n // to replace with translation\n editorRef.current.setOption('screenReaderLabel', 'Editor');\n }\n }, [editorRef, error]);\n\n React.useImperativeHandle(\n forwardedRef,\n () => ({\n focus() {\n editorRef.current.getInputField().focus();\n },\n scrollIntoView(args?: Parameters<HTMLElement['scrollIntoView']>[0]) {\n editorRef.current.getInputField().scrollIntoView(args);\n },\n }),\n [editorRef]\n );\n\n return (\n <EditorAndPreviewWrapper>\n <EditorStylesContainer $isExpandMode={isExpandMode} $disabled={disabled || isPreviewMode}>\n <textarea ref={textareaRef} />\n </EditorStylesContainer>\n {isPreviewMode && <PreviewWysiwyg data={value} />}\n </EditorAndPreviewWrapper>\n );\n }\n);\n\nconst EditorAndPreviewWrapper = styled.div`\n position: relative;\n height: calc(100%);\n\n ${({ theme }) => theme.breakpoints.medium} {\n height: calc(100% - 48px);\n }\n`;\n\nconst EditorStylesContainer = styled.div<{ $disabled?: boolean; $isExpandMode?: boolean }>`\n cursor: ${({ $disabled }) => ($disabled ? 'not-allowed !important' : 'auto')};\n height: 100%;\n /* BASICS */\n .CodeMirror-placeholder {\n color: ${({ theme }) => theme.colors.neutral600} !important;\n }\n\n .CodeMirror {\n /* Set height, width, borders, and global font properties here */\n font-size: 1.6rem;\n height: ${({ $isExpandMode }) =>\n $isExpandMode\n ? '100%'\n : '410px'}; // 512px(total height) - 48px (header) - 52px(footer) - 2px border\n color: ${({ theme }) => theme.colors.neutral800};\n direction: ltr;\n font-family:\n -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans',\n 'Helvetica Neue', sans-serif;\n\n ${({ theme }) => theme.breakpoints.medium} {\n font-size: 1.4rem;\n }\n }\n\n /* PADDING */\n\n .CodeMirror-lines {\n padding: ${({ theme }) => `${theme.spaces[3]} ${theme.spaces[4]}`};\n /* Vertical padding around content */\n }\n\n .CodeMirror-scrollbar-filler,\n .CodeMirror-gutter-filler {\n /* The little square between H and V scrollbars */\n background-color: ${({ theme }) => `${theme.colors.neutral0}`};\n }\n\n /* GUTTER */\n\n .CodeMirror-gutters {\n border-right: 1px solid #ddd;\n background-color: #f7f7f7;\n white-space: nowrap;\n }\n .CodeMirror-linenumbers {\n }\n .CodeMirror-linenumber {\n padding: 0 3px 0 5px;\n min-width: 20px;\n text-align: right;\n color: #999;\n white-space: nowrap;\n }\n\n .CodeMirror-guttermarker {\n color: black;\n }\n .CodeMirror-guttermarker-subtle {\n color: #999;\n }\n\n /* CURSOR */\n\n .CodeMirror-cursor {\n border-left: 1px solid black;\n border-right: none;\n width: 0;\n }\n /* Shown when moving in bi-directional text */\n .CodeMirror div.CodeMirror-secondarycursor {\n border-left: 1px solid silver;\n }\n .cm-fat-cursor .CodeMirror-cursor {\n width: auto;\n border: 0 !important;\n background: #7e7;\n }\n .cm-fat-cursor div.CodeMirror-cursors {\n /* z-index: 1; */\n }\n\n .cm-fat-cursor-mark {\n background-color: rgba(20, 255, 20, 0.5);\n -webkit-animation: blink 1.06s steps(1) infinite;\n -moz-animation: blink 1.06s steps(1) infinite;\n animation: blink 1.06s steps(1) infinite;\n }\n .cm-animate-fat-cursor {\n width: auto;\n border: 0;\n -webkit-animation: blink 1.06s steps(1) infinite;\n -moz-animation: blink 1.06s steps(1) infinite;\n animation: blink 1.06s steps(1) infinite;\n background-color: #7e7;\n }\n\n /* Can style cursor different in overwrite (non-insert) mode */\n .CodeMirror-overwrite .CodeMirror-cursor {\n }\n\n .cm-tab {\n display: inline-block;\n text-decoration: inherit;\n }\n\n .CodeMirror-rulers {\n position: absolute;\n left: 0;\n right: 0;\n top: -50px;\n bottom: 0;\n overflow: hidden;\n }\n .CodeMirror-ruler {\n border-left: 1px solid #ccc;\n top: 0;\n bottom: 0;\n position: absolute;\n }\n\n /* DEFAULT THEME */\n\n .cm-header,\n .cm-strong {\n font-weight: bold;\n }\n .cm-em {\n font-style: italic;\n }\n .cm-link {\n text-decoration: underline;\n }\n .cm-strikethrough {\n text-decoration: line-through;\n }\n\n .CodeMirror-composing {\n border-bottom: 2px solid;\n }\n\n /* Default styles for common addons */\n\n div.CodeMirror span.CodeMirror-matchingbracket {\n color: #0b0;\n }\n div.CodeMirror span.CodeMirror-nonmatchingbracket {\n color: #a22;\n }\n .CodeMirror-matchingtag {\n background: rgba(255, 150, 0, 0.3);\n }\n .CodeMirror-activeline-background {\n background: #e8f2ff;\n }\n\n /* STOP */\n\n /* The rest of this file contains styles related to the mechanics of\n the editor. You probably shouldn't touch them. */\n\n .CodeMirror {\n position: relative;\n overflow: hidden;\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => `${theme.colors.neutral0}`};\n }\n\n .CodeMirror-scroll {\n overflow: scroll !important; /* Things will break if this is overridden */\n /* 50px is the magic margin used to hide the element's real scrollbars */\n /* See overflow: hidden in .CodeMirror */\n margin-bottom: -50px;\n margin-right: -50px;\n padding-bottom: 50px;\n height: 100%;\n outline: none; /* Prevent dragging from highlighting the element */\n position: relative;\n }\n .CodeMirror-sizer {\n position: relative;\n border-right: 50px solid transparent;\n }\n\n /* The fake, visible scrollbars. Used to force redraw during scrolling\n before actual scrolling happens, thus preventing shaking and\n flickering artifacts. */\n .CodeMirror-vscrollbar,\n .CodeMirror-hscrollbar,\n .CodeMirror-scrollbar-filler,\n .CodeMirror-gutter-filler {\n position: absolute;\n z-index: 1;\n display: none;\n outline: none;\n }\n\n .CodeMirror-vscrollbar {\n right: 0;\n top: 0;\n overflow-x: hidden;\n overflow-y: scroll;\n }\n .CodeMirror-hscrollbar {\n bottom: 0;\n left: 0;\n overflow-y: hidden;\n overflow-x: scroll;\n }\n .CodeMirror-scrollbar-filler {\n right: 0;\n bottom: 0;\n }\n\n .CodeMirror-lines {\n cursor: text;\n min-height: 1px; /* prevents collapsing before first draw */\n }\n /* Reset some styles that the rest of the page might have set */\n .CodeMirror pre.CodeMirror-line,\n .CodeMirror pre.CodeMirror-line-like {\n -moz-border-radius: 0;\n -webkit-border-radius: 0;\n border-radius: 0;\n border-width: 0;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n margin: 0;\n white-space: pre;\n word-wrap: normal;\n line-height: 1.5;\n color: inherit;\n /* z-index: 2; */\n position: relative;\n overflow: visible;\n -webkit-tap-highlight-color: transparent;\n -webkit-font-variant-ligatures: contextual;\n font-variant-ligatures: contextual;\n }\n\n .CodeMirror pre.CodeMirror-line-like {\n z-index: 2;\n }\n\n .CodeMirror-wrap pre.CodeMirror-line,\n .CodeMirror-wrap pre.CodeMirror-line-like {\n word-wrap: break-word;\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n .CodeMirror-linebackground {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: 0;\n }\n\n .CodeMirror-linewidget {\n position: relative;\n /* z-index: 2; */\n padding: 0.1px; /* Force widget margins to stay inside of the container */\n }\n\n .CodeMirror-widget {\n }\n\n .CodeMirror-rtl pre {\n direction: rtl;\n }\n\n .CodeMirror-code {\n outline: none;\n }\n\n /* Force content-box sizing for the elements where we expect it */\n .CodeMirror-scroll,\n .CodeMirror-sizer,\n .CodeMirror-gutter,\n .CodeMirror-gutters,\n .CodeMirror-linenumber {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n }\n\n .CodeMirror-measure {\n position: absolute;\n width: 100%;\n height: 0;\n overflow: hidden;\n visibility: hidden;\n }\n\n .CodeMirror-cursor {\n position: absolute;\n pointer-events: none;\n border-color: ${({ theme }) => `${theme.colors.neutral800}`};\n }\n .CodeMirror-measure pre {\n position: static;\n }\n\n div.CodeMirror-cursors {\n visibility: hidden;\n position: relative;\n + div {\n z-index: 0 !important;\n }\n }\n\n div.CodeMirror-dragcursors {\n visibility: visible;\n }\n\n .CodeMirror-focused div.CodeMirror-cursors {\n visibility: visible;\n }\n\n .CodeMirror-selected {\n background: ${({ theme }) => theme.colors.neutral200};\n /* z-index: -10; */\n }\n .CodeMirror-crosshair {\n cursor: crosshair;\n }\n\n /* Used to force a border model for a node */\n .cm-force-border {\n padding-right: 0.1px;\n }\n\n /* See issue #2901 */\n .cm-tab-wrap-hack:after {\n content: '';\n }\n\n /* Help users use markselection to safely style text background */\n span.CodeMirror-selectedtext {\n background: none;\n }\n\n span {\n color: ${({ theme }) => theme.colors.neutral800} !important;\n }\n`;\n\nexport { Editor };\nexport type { EditorProps, EditorApi };\n"],"names":["Editor","React","forwardRef","disabled","editorRef","error","isPreviewMode","isExpandMode","name","onChange","placeholder","textareaRef","value","forwardedRef","onChangeRef","useRef","useEffect","current","toTextArea","CodeMirror","fromTextArea","lineWrapping","extraKeys","Enter","Tab","readOnly","smartIndent","spellcheck","inputStyle","commands","newlineAndIndentContinueMarkdownList","on","cm","change","origin","getValue","hasFocus","nextValue","setValue","setOption","useImperativeHandle","focus","getInputField","scrollIntoView","args","_jsxs","EditorAndPreviewWrapper","_jsx","EditorStylesContainer","$isExpandMode","$disabled","textarea","ref","PreviewWysiwyg","data","styled","div","theme","breakpoints","medium","colors","neutral600","neutral800","spaces","neutral0","borderRadius","neutral200"],"mappings":"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"}
@@ -66,7 +66,7 @@ const FormLayout = /*#__PURE__*/ React__namespace.memo(({ layout, document, hasB
66
66
  direction: "column",
67
67
  alignItems: "stretch",
68
68
  gap: 6,
69
- children: layout.map((panel, index)=>{
69
+ children: layout.map((panel)=>{
70
70
  if (panel.some((row)=>row.some((field)=>field.type === 'dynamiczone'))) {
71
71
  const [row] = panel;
72
72
  const [field] = row;
@@ -92,7 +92,7 @@ const FormLayout = /*#__PURE__*/ React__namespace.memo(({ layout, document, hasB
92
92
  direction: "column",
93
93
  alignItems: "stretch",
94
94
  gap: 6,
95
- children: panel.map((row, gridRowIndex)=>{
95
+ children: panel.map((row)=>{
96
96
  return /*#__PURE__*/ jsxRuntime.jsx(ResponsiveGridRoot, {
97
97
  gap: {
98
98
  initial: 6,
@@ -112,10 +112,10 @@ const FormLayout = /*#__PURE__*/ React__namespace.memo(({ layout, document, hasB
112
112
  })
113
113
  }, field.name);
114
114
  })
115
- }, gridRowIndex);
115
+ }, row.map((field)=>field.name).join('.'));
116
116
  })
117
117
  })
118
- }, index);
118
+ }, panel.flatMap((row)=>row.map((field)=>field.name)).join('.'));
119
119
  })
120
120
  });
121
121
  });
@@ -1 +1 @@
1
- {"version":3,"file":"FormLayout.js","sources":["../../../../../admin/src/pages/EditView/components/FormLayout.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, BoxProps, Flex, Grid } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { EditLayout } from '../../../hooks/useDocumentLayout';\n\nimport { InputRenderer } from './InputRenderer';\n\nimport type { UseDocument } from '../../../hooks/useDocument';\n\nexport const ResponsiveGridRoot = styled(Grid.Root)`\n container-type: inline-size;\n`;\n\nexport const ResponsiveGridItem =\n /**\n * TODO:\n * JSDOM cannot handle container queries.\n * This is a temporary workaround so that tests do not fail in the CI when jestdom throws an error\n * for failing to parse the stylesheet.\n */\n process.env.NODE_ENV !== 'test'\n ? styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n ${({ theme }) => theme.breakpoints.medium} {\n ${({ col }) => col && `grid-column: span ${col};`}\n }\n `\n : styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n `;\n\nconst panelStyles = {\n padding: {\n initial: 4,\n medium: 6,\n },\n borderColor: 'neutral150',\n background: 'neutral0',\n hasRadius: true,\n shadow: 'tableShadow',\n} satisfies BoxProps;\n\ninterface FormLayoutProps extends Pick<EditLayout, 'layout'> {\n hasBackground?: boolean;\n document: ReturnType<UseDocument>;\n}\n\nconst FormLayout = React.memo(({ layout, document, hasBackground = true }: FormLayoutProps) => {\n const { formatMessage } = useIntl();\n const modelUid = document.schema?.uid;\n\n const getLabel = (name: string, label: string) => {\n return formatMessage({\n id: `content-manager.content-types.${modelUid}.${name}`,\n defaultMessage: label,\n });\n };\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {layout.map((panel, index) => {\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n\n return (\n <Grid.Root key={field.name} gap={4}>\n <Grid.Item col={12} s={12} xs={12} direction=\"column\" alignItems=\"stretch\">\n <InputRenderer\n {...field}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </Grid.Item>\n </Grid.Root>\n );\n }\n\n return (\n <Box key={index} {...(hasBackground && panelStyles)}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row, gridRowIndex) => {\n return (\n <ResponsiveGridRoot key={gridRowIndex} gap={{ initial: 6, medium: 4 }}>\n {row.map(({ size, ...field }) => {\n return (\n <ResponsiveGridItem\n col={size}\n key={field.name}\n s={12}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <InputRenderer\n {...field}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </ResponsiveGridItem>\n );\n })}\n </ResponsiveGridRoot>\n );\n })}\n </Flex>\n </Box>\n );\n })}\n </Flex>\n );\n});\n\nFormLayout.displayName = 'FormLayout';\n\nexport { FormLayout, FormLayoutProps };\n"],"names":["ResponsiveGridRoot","styled","Grid","Root","ResponsiveGridItem","process","env","NODE_ENV","Item","theme","breakpoints","medium","col","panelStyles","padding","initial","borderColor","background","hasRadius","shadow","FormLayout","React","memo","layout","document","hasBackground","formatMessage","useIntl","modelUid","schema","uid","getLabel","name","label","id","defaultMessage","_jsx","Flex","direction","alignItems","gap","map","panel","index","some","row","field","type","s","xs","InputRenderer","Box","gridRowIndex","size","displayName"],"mappings":"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"}
1
+ {"version":3,"file":"FormLayout.js","sources":["../../../../../admin/src/pages/EditView/components/FormLayout.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, BoxProps, Flex, Grid } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { EditLayout } from '../../../hooks/useDocumentLayout';\n\nimport { InputRenderer } from './InputRenderer';\n\nimport type { UseDocument } from '../../../hooks/useDocument';\n\nexport const ResponsiveGridRoot = styled(Grid.Root)`\n container-type: inline-size;\n`;\n\nexport const ResponsiveGridItem =\n /**\n * TODO:\n * JSDOM cannot handle container queries.\n * This is a temporary workaround so that tests do not fail in the CI when jestdom throws an error\n * for failing to parse the stylesheet.\n */\n process.env.NODE_ENV !== 'test'\n ? styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n ${({ theme }) => theme.breakpoints.medium} {\n ${({ col }) => col && `grid-column: span ${col};`}\n }\n `\n : styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n `;\n\nconst panelStyles = {\n padding: {\n initial: 4,\n medium: 6,\n },\n borderColor: 'neutral150',\n background: 'neutral0',\n hasRadius: true,\n shadow: 'tableShadow',\n} satisfies BoxProps;\n\ninterface FormLayoutProps extends Pick<EditLayout, 'layout'> {\n hasBackground?: boolean;\n document: ReturnType<UseDocument>;\n}\n\nconst FormLayout = React.memo(({ layout, document, hasBackground = true }: FormLayoutProps) => {\n const { formatMessage } = useIntl();\n const modelUid = document.schema?.uid;\n\n const getLabel = (name: string, label: string) => {\n return formatMessage({\n id: `content-manager.content-types.${modelUid}.${name}`,\n defaultMessage: label,\n });\n };\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {layout.map((panel) => {\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n\n return (\n <Grid.Root key={field.name} gap={4}>\n <Grid.Item col={12} s={12} xs={12} direction=\"column\" alignItems=\"stretch\">\n <InputRenderer\n {...field}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </Grid.Item>\n </Grid.Root>\n );\n }\n\n return (\n <Box\n key={panel.flatMap((row) => row.map((field) => field.name)).join('.')}\n {...(hasBackground && panelStyles)}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row) => {\n return (\n <ResponsiveGridRoot\n key={row.map((field) => field.name).join('.')}\n gap={{ initial: 6, medium: 4 }}\n >\n {row.map(({ size, ...field }) => {\n return (\n <ResponsiveGridItem\n col={size}\n key={field.name}\n s={12}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <InputRenderer\n {...field}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </ResponsiveGridItem>\n );\n })}\n </ResponsiveGridRoot>\n );\n })}\n </Flex>\n </Box>\n );\n })}\n </Flex>\n );\n});\n\nFormLayout.displayName = 'FormLayout';\n\nexport { FormLayout, FormLayoutProps };\n"],"names":["ResponsiveGridRoot","styled","Grid","Root","ResponsiveGridItem","process","env","NODE_ENV","Item","theme","breakpoints","medium","col","panelStyles","padding","initial","borderColor","background","hasRadius","shadow","FormLayout","React","memo","layout","document","hasBackground","formatMessage","useIntl","modelUid","schema","uid","getLabel","name","label","id","defaultMessage","_jsx","Flex","direction","alignItems","gap","map","panel","some","row","field","type","s","xs","InputRenderer","Box","size","join","flatMap","displayName"],"mappings":"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"}
@@ -44,7 +44,7 @@ const FormLayout = /*#__PURE__*/ React.memo(({ layout, document, hasBackground =
44
44
  direction: "column",
45
45
  alignItems: "stretch",
46
46
  gap: 6,
47
- children: layout.map((panel, index)=>{
47
+ children: layout.map((panel)=>{
48
48
  if (panel.some((row)=>row.some((field)=>field.type === 'dynamiczone'))) {
49
49
  const [row] = panel;
50
50
  const [field] = row;
@@ -70,7 +70,7 @@ const FormLayout = /*#__PURE__*/ React.memo(({ layout, document, hasBackground =
70
70
  direction: "column",
71
71
  alignItems: "stretch",
72
72
  gap: 6,
73
- children: panel.map((row, gridRowIndex)=>{
73
+ children: panel.map((row)=>{
74
74
  return /*#__PURE__*/ jsx(ResponsiveGridRoot, {
75
75
  gap: {
76
76
  initial: 6,
@@ -90,10 +90,10 @@ const FormLayout = /*#__PURE__*/ React.memo(({ layout, document, hasBackground =
90
90
  })
91
91
  }, field.name);
92
92
  })
93
- }, gridRowIndex);
93
+ }, row.map((field)=>field.name).join('.'));
94
94
  })
95
95
  })
96
- }, index);
96
+ }, panel.flatMap((row)=>row.map((field)=>field.name)).join('.'));
97
97
  })
98
98
  });
99
99
  });
@@ -1 +1 @@
1
- {"version":3,"file":"FormLayout.mjs","sources":["../../../../../admin/src/pages/EditView/components/FormLayout.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, BoxProps, Flex, Grid } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { EditLayout } from '../../../hooks/useDocumentLayout';\n\nimport { InputRenderer } from './InputRenderer';\n\nimport type { UseDocument } from '../../../hooks/useDocument';\n\nexport const ResponsiveGridRoot = styled(Grid.Root)`\n container-type: inline-size;\n`;\n\nexport const ResponsiveGridItem =\n /**\n * TODO:\n * JSDOM cannot handle container queries.\n * This is a temporary workaround so that tests do not fail in the CI when jestdom throws an error\n * for failing to parse the stylesheet.\n */\n process.env.NODE_ENV !== 'test'\n ? styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n ${({ theme }) => theme.breakpoints.medium} {\n ${({ col }) => col && `grid-column: span ${col};`}\n }\n `\n : styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n `;\n\nconst panelStyles = {\n padding: {\n initial: 4,\n medium: 6,\n },\n borderColor: 'neutral150',\n background: 'neutral0',\n hasRadius: true,\n shadow: 'tableShadow',\n} satisfies BoxProps;\n\ninterface FormLayoutProps extends Pick<EditLayout, 'layout'> {\n hasBackground?: boolean;\n document: ReturnType<UseDocument>;\n}\n\nconst FormLayout = React.memo(({ layout, document, hasBackground = true }: FormLayoutProps) => {\n const { formatMessage } = useIntl();\n const modelUid = document.schema?.uid;\n\n const getLabel = (name: string, label: string) => {\n return formatMessage({\n id: `content-manager.content-types.${modelUid}.${name}`,\n defaultMessage: label,\n });\n };\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {layout.map((panel, index) => {\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n\n return (\n <Grid.Root key={field.name} gap={4}>\n <Grid.Item col={12} s={12} xs={12} direction=\"column\" alignItems=\"stretch\">\n <InputRenderer\n {...field}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </Grid.Item>\n </Grid.Root>\n );\n }\n\n return (\n <Box key={index} {...(hasBackground && panelStyles)}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row, gridRowIndex) => {\n return (\n <ResponsiveGridRoot key={gridRowIndex} gap={{ initial: 6, medium: 4 }}>\n {row.map(({ size, ...field }) => {\n return (\n <ResponsiveGridItem\n col={size}\n key={field.name}\n s={12}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <InputRenderer\n {...field}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </ResponsiveGridItem>\n );\n })}\n </ResponsiveGridRoot>\n );\n })}\n </Flex>\n </Box>\n );\n })}\n </Flex>\n );\n});\n\nFormLayout.displayName = 'FormLayout';\n\nexport { FormLayout, FormLayoutProps };\n"],"names":["ResponsiveGridRoot","styled","Grid","Root","ResponsiveGridItem","process","env","NODE_ENV","Item","theme","breakpoints","medium","col","panelStyles","padding","initial","borderColor","background","hasRadius","shadow","FormLayout","React","memo","layout","document","hasBackground","formatMessage","useIntl","modelUid","schema","uid","getLabel","name","label","id","defaultMessage","_jsx","Flex","direction","alignItems","gap","map","panel","index","some","row","field","type","s","xs","InputRenderer","Box","gridRowIndex","size","displayName"],"mappings":"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"}
1
+ {"version":3,"file":"FormLayout.mjs","sources":["../../../../../admin/src/pages/EditView/components/FormLayout.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, BoxProps, Flex, Grid } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { EditLayout } from '../../../hooks/useDocumentLayout';\n\nimport { InputRenderer } from './InputRenderer';\n\nimport type { UseDocument } from '../../../hooks/useDocument';\n\nexport const ResponsiveGridRoot = styled(Grid.Root)`\n container-type: inline-size;\n`;\n\nexport const ResponsiveGridItem =\n /**\n * TODO:\n * JSDOM cannot handle container queries.\n * This is a temporary workaround so that tests do not fail in the CI when jestdom throws an error\n * for failing to parse the stylesheet.\n */\n process.env.NODE_ENV !== 'test'\n ? styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n ${({ theme }) => theme.breakpoints.medium} {\n ${({ col }) => col && `grid-column: span ${col};`}\n }\n `\n : styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n `;\n\nconst panelStyles = {\n padding: {\n initial: 4,\n medium: 6,\n },\n borderColor: 'neutral150',\n background: 'neutral0',\n hasRadius: true,\n shadow: 'tableShadow',\n} satisfies BoxProps;\n\ninterface FormLayoutProps extends Pick<EditLayout, 'layout'> {\n hasBackground?: boolean;\n document: ReturnType<UseDocument>;\n}\n\nconst FormLayout = React.memo(({ layout, document, hasBackground = true }: FormLayoutProps) => {\n const { formatMessage } = useIntl();\n const modelUid = document.schema?.uid;\n\n const getLabel = (name: string, label: string) => {\n return formatMessage({\n id: `content-manager.content-types.${modelUid}.${name}`,\n defaultMessage: label,\n });\n };\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {layout.map((panel) => {\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n\n return (\n <Grid.Root key={field.name} gap={4}>\n <Grid.Item col={12} s={12} xs={12} direction=\"column\" alignItems=\"stretch\">\n <InputRenderer\n {...field}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </Grid.Item>\n </Grid.Root>\n );\n }\n\n return (\n <Box\n key={panel.flatMap((row) => row.map((field) => field.name)).join('.')}\n {...(hasBackground && panelStyles)}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row) => {\n return (\n <ResponsiveGridRoot\n key={row.map((field) => field.name).join('.')}\n gap={{ initial: 6, medium: 4 }}\n >\n {row.map(({ size, ...field }) => {\n return (\n <ResponsiveGridItem\n col={size}\n key={field.name}\n s={12}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <InputRenderer\n {...field}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </ResponsiveGridItem>\n );\n })}\n </ResponsiveGridRoot>\n );\n })}\n </Flex>\n </Box>\n );\n })}\n </Flex>\n );\n});\n\nFormLayout.displayName = 'FormLayout';\n\nexport { FormLayout, FormLayoutProps };\n"],"names":["ResponsiveGridRoot","styled","Grid","Root","ResponsiveGridItem","process","env","NODE_ENV","Item","theme","breakpoints","medium","col","panelStyles","padding","initial","borderColor","background","hasRadius","shadow","FormLayout","React","memo","layout","document","hasBackground","formatMessage","useIntl","modelUid","schema","uid","getLabel","name","label","id","defaultMessage","_jsx","Flex","direction","alignItems","gap","map","panel","some","row","field","type","s","xs","InputRenderer","Box","size","join","flatMap","displayName"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Panels.js","sources":["../../../../../admin/src/pages/EditView/components/Panels.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useQueryParams,\n useStrapiApp,\n DescriptionComponentRenderer,\n useIsDesktop,\n createContext,\n} from '@strapi/admin/strapi-admin';\nimport { Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useMatch } from 'react-router-dom';\n\nimport { InjectionZone } from '../../../components/InjectionZone';\nimport { useDoc } from '../../../hooks/useDocument';\nimport { CLONE_PATH } from '../../../router';\n\nimport { DocumentActions } from './DocumentActions';\n\nimport type {\n ContentManagerPlugin,\n DocumentActionProps,\n PanelComponent,\n PanelComponentProps,\n} from '../../../content-manager';\n\ninterface PanelDescription {\n title: string;\n content: React.ReactNode;\n}\ninterface PanelsItemsProps {\n panels: (PanelDescription & { id: string })[];\n setVisiblePanels:\n | React.Dispatch<React.SetStateAction<(PanelDescription & { id: string })[]>>\n | null\n | undefined;\n visiblePanelsLength: number | undefined;\n}\n\nconst PanelsItems = ({ panels, setVisiblePanels, visiblePanelsLength }: PanelsItemsProps) => {\n React.useEffect(() => {\n if (setVisiblePanels && visiblePanelsLength !== panels.length) {\n setVisiblePanels(panels);\n }\n }, [panels, panels.length, setVisiblePanels, visiblePanelsLength]);\n\n return (\n <>\n {panels.map(({ content, id, ...description }) => (\n <Panel key={id} {...description}>\n {content}\n </Panel>\n ))}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Panels\n * -----------------------------------------------------------------------------------------------*/\n\nconst Panels = ({ withActions = true }: { withActions?: boolean }) => {\n const isCloning = useMatch(CLONE_PATH) !== null;\n const [\n {\n query: { status },\n },\n ] = useQueryParams<{ status: 'draft' | 'published' }>({\n status: 'draft',\n });\n const { model, id, document, meta, collectionType } = useDoc();\n const plugins = useStrapiApp('Panels', (state) => state.plugins);\n // Optional context consumer\n const setVisiblePanels = usePanelsContext('Panels', (s) => s.setVisiblePanels, false);\n const visiblePanels = usePanelsContext('Panels', (s) => s.visiblePanels, false);\n\n const allPanels = (\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getEditViewSidePanels();\n const filteredPanels = allPanels.filter((panel) => (panel as PanelComponent).type !== 'actions');\n const panelsToDisplay = withActions ? allPanels : filteredPanels;\n\n const props = {\n activeTab: status,\n model,\n documentId: id,\n document: isCloning ? undefined : document,\n meta: isCloning ? undefined : meta,\n collectionType,\n } satisfies PanelComponentProps;\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <DescriptionComponentRenderer props={props} descriptions={panelsToDisplay}>\n {(panels) => (\n <PanelsItems\n panels={panels}\n setVisiblePanels={setVisiblePanels}\n visiblePanelsLength={visiblePanels?.length}\n />\n )}\n </DescriptionComponentRenderer>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Default Action Panels (CE)\n * -----------------------------------------------------------------------------------------------*/\n\nconst ActionsPanel: PanelComponent = () => {\n const { formatMessage } = useIntl();\n\n return {\n title: formatMessage({\n id: 'content-manager.containers.edit.panels.default.title',\n defaultMessage: 'Entry',\n }),\n content: <ActionsPanelContent />,\n };\n};\n\nActionsPanel.type = 'actions';\n\nconst ActionsPanelContent = () => {\n const isCloning = useMatch(CLONE_PATH) !== null;\n const [\n {\n query: { status = 'draft' },\n },\n ] = useQueryParams<{ status: 'draft' | 'published' }>();\n const { model, id, document, meta, collectionType } = useDoc();\n const plugins = useStrapiApp('ActionsPanel', (state) => state.plugins);\n\n const props = {\n activeTab: status,\n model,\n documentId: id,\n document: isCloning ? undefined : document,\n meta: isCloning ? undefined : meta,\n collectionType,\n } satisfies DocumentActionProps;\n\n return (\n <Flex direction=\"column\" gap={2} width=\"100%\">\n <DescriptionComponentRenderer\n props={props}\n descriptions={(\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getDocumentActions('panel')}\n >\n {(actions) => <DocumentActions actions={actions} />}\n </DescriptionComponentRenderer>\n <InjectionZone area=\"editView.right-links\" slug={model} />\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Panel\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PanelProps extends Pick<PanelDescription, 'title'> {\n children: React.ReactNode;\n}\n\nconst Panel = React.forwardRef<HTMLElement, PanelProps>(({ children, title }, ref) => {\n const isDesktop = useIsDesktop();\n\n return (\n <Flex\n ref={ref}\n tag=\"aside\"\n aria-labelledby=\"additional-information\"\n background={{ initial: 'transparent', large: 'neutral0' }}\n borderColor={{ initial: 'transparent', large: 'neutral150' }}\n hasRadius={isDesktop}\n padding={{ initial: 0, large: 4 }}\n shadow={{ initial: 'none', large: 'tableShadow' }}\n gap={{ initial: 4, large: 3 }}\n direction=\"column\"\n justifyContent=\"stretch\"\n alignItems=\"flex-start\"\n >\n <Typography tag=\"h2\" variant=\"sigma\" textTransform=\"uppercase\" textColor=\"neutral600\">\n {title}\n </Typography>\n {children}\n </Flex>\n );\n});\n\n/* -------------------------------------------------------------------------------------------------\n * PanelsContext\n * -----------------------------------------------------------------------------------------------*/\n\nconst [PanelsProviderImpl, usePanelsContext] = createContext<{\n visiblePanels: (PanelDescription & { id: string })[];\n setVisiblePanels: React.Dispatch<React.SetStateAction<(PanelDescription & { id: string })[]>>;\n}>('PanelsContext');\n\nconst PanelsProvider = ({ children }: React.PropsWithChildren) => {\n const [visiblePanels, setVisiblePanels] = React.useState<(PanelDescription & { id: string })[]>(\n []\n );\n\n return (\n <PanelsProviderImpl visiblePanels={visiblePanels} setVisiblePanels={setVisiblePanels}>\n {children}\n </PanelsProviderImpl>\n );\n};\n\nexport { Panels, ActionsPanel, ActionsPanelContent, PanelsProvider, usePanelsContext };\nexport type { PanelDescription };\n"],"names":["PanelsItems","panels","setVisiblePanels","visiblePanelsLength","React","useEffect","length","_jsx","_Fragment","map","content","id","description","Panel","Panels","withActions","isCloning","useMatch","CLONE_PATH","query","status","useQueryParams","model","document","meta","collectionType","useDoc","plugins","useStrapiApp","state","usePanelsContext","s","visiblePanels","allPanels","apis","getEditViewSidePanels","filteredPanels","filter","panel","type","panelsToDisplay","props","activeTab","documentId","undefined","Flex","direction","alignItems","gap","DescriptionComponentRenderer","descriptions","ActionsPanel","formatMessage","useIntl","title","defaultMessage","ActionsPanelContent","_jsxs","width","getDocumentActions","actions","DocumentActions","InjectionZone","area","slug","forwardRef","children","ref","isDesktop","useIsDesktop","tag","aria-labelledby","background","initial","large","borderColor","hasRadius","padding","shadow","justifyContent","Typography","variant","textTransform","textColor","PanelsProviderImpl","createContext","PanelsProvider","useState"],"mappings":"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"}
1
+ {"version":3,"file":"Panels.js","sources":["../../../../../admin/src/pages/EditView/components/Panels.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useQueryParams,\n useStrapiApp,\n DescriptionComponentRenderer,\n useIsDesktop,\n createContext,\n} from '@strapi/admin/strapi-admin';\nimport { Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useMatch } from 'react-router-dom';\n\nimport { InjectionZone } from '../../../components/InjectionZone';\nimport { useDoc } from '../../../hooks/useDocument';\nimport { CLONE_PATH } from '../../../router';\n\nimport { DocumentActions } from './DocumentActions';\n\nimport type {\n ContentManagerPlugin,\n DocumentActionProps,\n PanelComponent,\n PanelComponentProps,\n} from '../../../content-manager';\n\ninterface PanelDescription {\n title: string;\n content: React.ReactNode;\n}\ninterface PanelsItemsProps {\n panels: (PanelDescription & { id: string })[];\n setVisiblePanels:\n React.Dispatch<React.SetStateAction<(PanelDescription & { id: string })[]>> | null | undefined;\n visiblePanelsLength: number | undefined;\n}\n\nconst PanelsItems = ({ panels, setVisiblePanels, visiblePanelsLength }: PanelsItemsProps) => {\n React.useEffect(() => {\n if (setVisiblePanels && visiblePanelsLength !== panels.length) {\n setVisiblePanels(panels);\n }\n }, [panels, panels.length, setVisiblePanels, visiblePanelsLength]);\n\n return (\n <>\n {panels.map(({ content, id, ...description }) => (\n <Panel key={id} {...description}>\n {content}\n </Panel>\n ))}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Panels\n * -----------------------------------------------------------------------------------------------*/\n\nconst Panels = ({ withActions = true }: { withActions?: boolean }) => {\n const isCloning = useMatch(CLONE_PATH) !== null;\n const [\n {\n query: { status },\n },\n ] = useQueryParams<{ status: 'draft' | 'published' }>({\n status: 'draft',\n });\n const { model, id, document, meta, collectionType } = useDoc();\n const plugins = useStrapiApp('Panels', (state) => state.plugins);\n // Optional context consumer\n const setVisiblePanels = usePanelsContext('Panels', (s) => s.setVisiblePanels, false);\n const visiblePanels = usePanelsContext('Panels', (s) => s.visiblePanels, false);\n\n const allPanels = (\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getEditViewSidePanels();\n const filteredPanels = allPanels.filter((panel) => (panel as PanelComponent).type !== 'actions');\n const panelsToDisplay = withActions ? allPanels : filteredPanels;\n\n const props = {\n activeTab: status,\n model,\n documentId: id,\n document: isCloning ? undefined : document,\n meta: isCloning ? undefined : meta,\n collectionType,\n } satisfies PanelComponentProps;\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <DescriptionComponentRenderer props={props} descriptions={panelsToDisplay}>\n {(panels) => (\n <PanelsItems\n panels={panels}\n setVisiblePanels={setVisiblePanels}\n visiblePanelsLength={visiblePanels?.length}\n />\n )}\n </DescriptionComponentRenderer>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Default Action Panels (CE)\n * -----------------------------------------------------------------------------------------------*/\n\nconst ActionsPanel: PanelComponent = () => {\n const { formatMessage } = useIntl();\n\n return {\n title: formatMessage({\n id: 'content-manager.containers.edit.panels.default.title',\n defaultMessage: 'Entry',\n }),\n content: <ActionsPanelContent />,\n };\n};\n\nActionsPanel.type = 'actions';\n\nconst ActionsPanelContent = () => {\n const isCloning = useMatch(CLONE_PATH) !== null;\n const [\n {\n query: { status = 'draft' },\n },\n ] = useQueryParams<{ status: 'draft' | 'published' }>();\n const { model, id, document, meta, collectionType } = useDoc();\n const plugins = useStrapiApp('ActionsPanel', (state) => state.plugins);\n\n const props = {\n activeTab: status,\n model,\n documentId: id,\n document: isCloning ? undefined : document,\n meta: isCloning ? undefined : meta,\n collectionType,\n } satisfies DocumentActionProps;\n\n return (\n <Flex direction=\"column\" gap={2} width=\"100%\">\n <DescriptionComponentRenderer\n props={props}\n descriptions={(\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getDocumentActions('panel')}\n >\n {(actions) => <DocumentActions actions={actions} />}\n </DescriptionComponentRenderer>\n <InjectionZone area=\"editView.right-links\" slug={model} />\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Panel\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PanelProps extends Pick<PanelDescription, 'title'> {\n children: React.ReactNode;\n}\n\nconst Panel = React.forwardRef<HTMLElement, PanelProps>(({ children, title }, ref) => {\n const isDesktop = useIsDesktop();\n\n return (\n <Flex\n ref={ref}\n tag=\"aside\"\n aria-labelledby=\"additional-information\"\n background={{ initial: 'transparent', large: 'neutral0' }}\n borderColor={{ initial: 'transparent', large: 'neutral150' }}\n hasRadius={isDesktop}\n padding={{ initial: 0, large: 4 }}\n shadow={{ initial: 'none', large: 'tableShadow' }}\n gap={{ initial: 4, large: 3 }}\n direction=\"column\"\n justifyContent=\"stretch\"\n alignItems=\"flex-start\"\n >\n <Typography tag=\"h2\" variant=\"sigma\" textTransform=\"uppercase\" textColor=\"neutral600\">\n {title}\n </Typography>\n {children}\n </Flex>\n );\n});\n\n/* -------------------------------------------------------------------------------------------------\n * PanelsContext\n * -----------------------------------------------------------------------------------------------*/\n\nconst [PanelsProviderImpl, usePanelsContext] = createContext<{\n visiblePanels: (PanelDescription & { id: string })[];\n setVisiblePanels: React.Dispatch<React.SetStateAction<(PanelDescription & { id: string })[]>>;\n}>('PanelsContext');\n\nconst PanelsProvider = ({ children }: React.PropsWithChildren) => {\n const [visiblePanels, setVisiblePanels] = React.useState<(PanelDescription & { id: string })[]>(\n []\n );\n\n return (\n <PanelsProviderImpl visiblePanels={visiblePanels} setVisiblePanels={setVisiblePanels}>\n {children}\n </PanelsProviderImpl>\n );\n};\n\nexport { Panels, ActionsPanel, ActionsPanelContent, PanelsProvider, usePanelsContext };\nexport type { PanelDescription };\n"],"names":["PanelsItems","panels","setVisiblePanels","visiblePanelsLength","React","useEffect","length","_jsx","_Fragment","map","content","id","description","Panel","Panels","withActions","isCloning","useMatch","CLONE_PATH","query","status","useQueryParams","model","document","meta","collectionType","useDoc","plugins","useStrapiApp","state","usePanelsContext","s","visiblePanels","allPanels","apis","getEditViewSidePanels","filteredPanels","filter","panel","type","panelsToDisplay","props","activeTab","documentId","undefined","Flex","direction","alignItems","gap","DescriptionComponentRenderer","descriptions","ActionsPanel","formatMessage","useIntl","title","defaultMessage","ActionsPanelContent","_jsxs","width","getDocumentActions","actions","DocumentActions","InjectionZone","area","slug","forwardRef","children","ref","isDesktop","useIsDesktop","tag","aria-labelledby","background","initial","large","borderColor","hasRadius","padding","shadow","justifyContent","Typography","variant","textTransform","textColor","PanelsProviderImpl","createContext","PanelsProvider","useState"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Panels.mjs","sources":["../../../../../admin/src/pages/EditView/components/Panels.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useQueryParams,\n useStrapiApp,\n DescriptionComponentRenderer,\n useIsDesktop,\n createContext,\n} from '@strapi/admin/strapi-admin';\nimport { Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useMatch } from 'react-router-dom';\n\nimport { InjectionZone } from '../../../components/InjectionZone';\nimport { useDoc } from '../../../hooks/useDocument';\nimport { CLONE_PATH } from '../../../router';\n\nimport { DocumentActions } from './DocumentActions';\n\nimport type {\n ContentManagerPlugin,\n DocumentActionProps,\n PanelComponent,\n PanelComponentProps,\n} from '../../../content-manager';\n\ninterface PanelDescription {\n title: string;\n content: React.ReactNode;\n}\ninterface PanelsItemsProps {\n panels: (PanelDescription & { id: string })[];\n setVisiblePanels:\n | React.Dispatch<React.SetStateAction<(PanelDescription & { id: string })[]>>\n | null\n | undefined;\n visiblePanelsLength: number | undefined;\n}\n\nconst PanelsItems = ({ panels, setVisiblePanels, visiblePanelsLength }: PanelsItemsProps) => {\n React.useEffect(() => {\n if (setVisiblePanels && visiblePanelsLength !== panels.length) {\n setVisiblePanels(panels);\n }\n }, [panels, panels.length, setVisiblePanels, visiblePanelsLength]);\n\n return (\n <>\n {panels.map(({ content, id, ...description }) => (\n <Panel key={id} {...description}>\n {content}\n </Panel>\n ))}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Panels\n * -----------------------------------------------------------------------------------------------*/\n\nconst Panels = ({ withActions = true }: { withActions?: boolean }) => {\n const isCloning = useMatch(CLONE_PATH) !== null;\n const [\n {\n query: { status },\n },\n ] = useQueryParams<{ status: 'draft' | 'published' }>({\n status: 'draft',\n });\n const { model, id, document, meta, collectionType } = useDoc();\n const plugins = useStrapiApp('Panels', (state) => state.plugins);\n // Optional context consumer\n const setVisiblePanels = usePanelsContext('Panels', (s) => s.setVisiblePanels, false);\n const visiblePanels = usePanelsContext('Panels', (s) => s.visiblePanels, false);\n\n const allPanels = (\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getEditViewSidePanels();\n const filteredPanels = allPanels.filter((panel) => (panel as PanelComponent).type !== 'actions');\n const panelsToDisplay = withActions ? allPanels : filteredPanels;\n\n const props = {\n activeTab: status,\n model,\n documentId: id,\n document: isCloning ? undefined : document,\n meta: isCloning ? undefined : meta,\n collectionType,\n } satisfies PanelComponentProps;\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <DescriptionComponentRenderer props={props} descriptions={panelsToDisplay}>\n {(panels) => (\n <PanelsItems\n panels={panels}\n setVisiblePanels={setVisiblePanels}\n visiblePanelsLength={visiblePanels?.length}\n />\n )}\n </DescriptionComponentRenderer>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Default Action Panels (CE)\n * -----------------------------------------------------------------------------------------------*/\n\nconst ActionsPanel: PanelComponent = () => {\n const { formatMessage } = useIntl();\n\n return {\n title: formatMessage({\n id: 'content-manager.containers.edit.panels.default.title',\n defaultMessage: 'Entry',\n }),\n content: <ActionsPanelContent />,\n };\n};\n\nActionsPanel.type = 'actions';\n\nconst ActionsPanelContent = () => {\n const isCloning = useMatch(CLONE_PATH) !== null;\n const [\n {\n query: { status = 'draft' },\n },\n ] = useQueryParams<{ status: 'draft' | 'published' }>();\n const { model, id, document, meta, collectionType } = useDoc();\n const plugins = useStrapiApp('ActionsPanel', (state) => state.plugins);\n\n const props = {\n activeTab: status,\n model,\n documentId: id,\n document: isCloning ? undefined : document,\n meta: isCloning ? undefined : meta,\n collectionType,\n } satisfies DocumentActionProps;\n\n return (\n <Flex direction=\"column\" gap={2} width=\"100%\">\n <DescriptionComponentRenderer\n props={props}\n descriptions={(\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getDocumentActions('panel')}\n >\n {(actions) => <DocumentActions actions={actions} />}\n </DescriptionComponentRenderer>\n <InjectionZone area=\"editView.right-links\" slug={model} />\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Panel\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PanelProps extends Pick<PanelDescription, 'title'> {\n children: React.ReactNode;\n}\n\nconst Panel = React.forwardRef<HTMLElement, PanelProps>(({ children, title }, ref) => {\n const isDesktop = useIsDesktop();\n\n return (\n <Flex\n ref={ref}\n tag=\"aside\"\n aria-labelledby=\"additional-information\"\n background={{ initial: 'transparent', large: 'neutral0' }}\n borderColor={{ initial: 'transparent', large: 'neutral150' }}\n hasRadius={isDesktop}\n padding={{ initial: 0, large: 4 }}\n shadow={{ initial: 'none', large: 'tableShadow' }}\n gap={{ initial: 4, large: 3 }}\n direction=\"column\"\n justifyContent=\"stretch\"\n alignItems=\"flex-start\"\n >\n <Typography tag=\"h2\" variant=\"sigma\" textTransform=\"uppercase\" textColor=\"neutral600\">\n {title}\n </Typography>\n {children}\n </Flex>\n );\n});\n\n/* -------------------------------------------------------------------------------------------------\n * PanelsContext\n * -----------------------------------------------------------------------------------------------*/\n\nconst [PanelsProviderImpl, usePanelsContext] = createContext<{\n visiblePanels: (PanelDescription & { id: string })[];\n setVisiblePanels: React.Dispatch<React.SetStateAction<(PanelDescription & { id: string })[]>>;\n}>('PanelsContext');\n\nconst PanelsProvider = ({ children }: React.PropsWithChildren) => {\n const [visiblePanels, setVisiblePanels] = React.useState<(PanelDescription & { id: string })[]>(\n []\n );\n\n return (\n <PanelsProviderImpl visiblePanels={visiblePanels} setVisiblePanels={setVisiblePanels}>\n {children}\n </PanelsProviderImpl>\n );\n};\n\nexport { Panels, ActionsPanel, ActionsPanelContent, PanelsProvider, usePanelsContext };\nexport type { PanelDescription };\n"],"names":["PanelsItems","panels","setVisiblePanels","visiblePanelsLength","React","useEffect","length","_jsx","_Fragment","map","content","id","description","Panel","Panels","withActions","isCloning","useMatch","CLONE_PATH","query","status","useQueryParams","model","document","meta","collectionType","useDoc","plugins","useStrapiApp","state","usePanelsContext","s","visiblePanels","allPanels","apis","getEditViewSidePanels","filteredPanels","filter","panel","type","panelsToDisplay","props","activeTab","documentId","undefined","Flex","direction","alignItems","gap","DescriptionComponentRenderer","descriptions","ActionsPanel","formatMessage","useIntl","title","defaultMessage","ActionsPanelContent","_jsxs","width","getDocumentActions","actions","DocumentActions","InjectionZone","area","slug","forwardRef","children","ref","isDesktop","useIsDesktop","tag","aria-labelledby","background","initial","large","borderColor","hasRadius","padding","shadow","justifyContent","Typography","variant","textTransform","textColor","PanelsProviderImpl","createContext","PanelsProvider","useState"],"mappings":"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"}
1
+ {"version":3,"file":"Panels.mjs","sources":["../../../../../admin/src/pages/EditView/components/Panels.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useQueryParams,\n useStrapiApp,\n DescriptionComponentRenderer,\n useIsDesktop,\n createContext,\n} from '@strapi/admin/strapi-admin';\nimport { Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useMatch } from 'react-router-dom';\n\nimport { InjectionZone } from '../../../components/InjectionZone';\nimport { useDoc } from '../../../hooks/useDocument';\nimport { CLONE_PATH } from '../../../router';\n\nimport { DocumentActions } from './DocumentActions';\n\nimport type {\n ContentManagerPlugin,\n DocumentActionProps,\n PanelComponent,\n PanelComponentProps,\n} from '../../../content-manager';\n\ninterface PanelDescription {\n title: string;\n content: React.ReactNode;\n}\ninterface PanelsItemsProps {\n panels: (PanelDescription & { id: string })[];\n setVisiblePanels:\n React.Dispatch<React.SetStateAction<(PanelDescription & { id: string })[]>> | null | undefined;\n visiblePanelsLength: number | undefined;\n}\n\nconst PanelsItems = ({ panels, setVisiblePanels, visiblePanelsLength }: PanelsItemsProps) => {\n React.useEffect(() => {\n if (setVisiblePanels && visiblePanelsLength !== panels.length) {\n setVisiblePanels(panels);\n }\n }, [panels, panels.length, setVisiblePanels, visiblePanelsLength]);\n\n return (\n <>\n {panels.map(({ content, id, ...description }) => (\n <Panel key={id} {...description}>\n {content}\n </Panel>\n ))}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Panels\n * -----------------------------------------------------------------------------------------------*/\n\nconst Panels = ({ withActions = true }: { withActions?: boolean }) => {\n const isCloning = useMatch(CLONE_PATH) !== null;\n const [\n {\n query: { status },\n },\n ] = useQueryParams<{ status: 'draft' | 'published' }>({\n status: 'draft',\n });\n const { model, id, document, meta, collectionType } = useDoc();\n const plugins = useStrapiApp('Panels', (state) => state.plugins);\n // Optional context consumer\n const setVisiblePanels = usePanelsContext('Panels', (s) => s.setVisiblePanels, false);\n const visiblePanels = usePanelsContext('Panels', (s) => s.visiblePanels, false);\n\n const allPanels = (\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getEditViewSidePanels();\n const filteredPanels = allPanels.filter((panel) => (panel as PanelComponent).type !== 'actions');\n const panelsToDisplay = withActions ? allPanels : filteredPanels;\n\n const props = {\n activeTab: status,\n model,\n documentId: id,\n document: isCloning ? undefined : document,\n meta: isCloning ? undefined : meta,\n collectionType,\n } satisfies PanelComponentProps;\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <DescriptionComponentRenderer props={props} descriptions={panelsToDisplay}>\n {(panels) => (\n <PanelsItems\n panels={panels}\n setVisiblePanels={setVisiblePanels}\n visiblePanelsLength={visiblePanels?.length}\n />\n )}\n </DescriptionComponentRenderer>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Default Action Panels (CE)\n * -----------------------------------------------------------------------------------------------*/\n\nconst ActionsPanel: PanelComponent = () => {\n const { formatMessage } = useIntl();\n\n return {\n title: formatMessage({\n id: 'content-manager.containers.edit.panels.default.title',\n defaultMessage: 'Entry',\n }),\n content: <ActionsPanelContent />,\n };\n};\n\nActionsPanel.type = 'actions';\n\nconst ActionsPanelContent = () => {\n const isCloning = useMatch(CLONE_PATH) !== null;\n const [\n {\n query: { status = 'draft' },\n },\n ] = useQueryParams<{ status: 'draft' | 'published' }>();\n const { model, id, document, meta, collectionType } = useDoc();\n const plugins = useStrapiApp('ActionsPanel', (state) => state.plugins);\n\n const props = {\n activeTab: status,\n model,\n documentId: id,\n document: isCloning ? undefined : document,\n meta: isCloning ? undefined : meta,\n collectionType,\n } satisfies DocumentActionProps;\n\n return (\n <Flex direction=\"column\" gap={2} width=\"100%\">\n <DescriptionComponentRenderer\n props={props}\n descriptions={(\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getDocumentActions('panel')}\n >\n {(actions) => <DocumentActions actions={actions} />}\n </DescriptionComponentRenderer>\n <InjectionZone area=\"editView.right-links\" slug={model} />\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Panel\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PanelProps extends Pick<PanelDescription, 'title'> {\n children: React.ReactNode;\n}\n\nconst Panel = React.forwardRef<HTMLElement, PanelProps>(({ children, title }, ref) => {\n const isDesktop = useIsDesktop();\n\n return (\n <Flex\n ref={ref}\n tag=\"aside\"\n aria-labelledby=\"additional-information\"\n background={{ initial: 'transparent', large: 'neutral0' }}\n borderColor={{ initial: 'transparent', large: 'neutral150' }}\n hasRadius={isDesktop}\n padding={{ initial: 0, large: 4 }}\n shadow={{ initial: 'none', large: 'tableShadow' }}\n gap={{ initial: 4, large: 3 }}\n direction=\"column\"\n justifyContent=\"stretch\"\n alignItems=\"flex-start\"\n >\n <Typography tag=\"h2\" variant=\"sigma\" textTransform=\"uppercase\" textColor=\"neutral600\">\n {title}\n </Typography>\n {children}\n </Flex>\n );\n});\n\n/* -------------------------------------------------------------------------------------------------\n * PanelsContext\n * -----------------------------------------------------------------------------------------------*/\n\nconst [PanelsProviderImpl, usePanelsContext] = createContext<{\n visiblePanels: (PanelDescription & { id: string })[];\n setVisiblePanels: React.Dispatch<React.SetStateAction<(PanelDescription & { id: string })[]>>;\n}>('PanelsContext');\n\nconst PanelsProvider = ({ children }: React.PropsWithChildren) => {\n const [visiblePanels, setVisiblePanels] = React.useState<(PanelDescription & { id: string })[]>(\n []\n );\n\n return (\n <PanelsProviderImpl visiblePanels={visiblePanels} setVisiblePanels={setVisiblePanels}>\n {children}\n </PanelsProviderImpl>\n );\n};\n\nexport { Panels, ActionsPanel, ActionsPanelContent, PanelsProvider, usePanelsContext };\nexport type { PanelDescription };\n"],"names":["PanelsItems","panels","setVisiblePanels","visiblePanelsLength","React","useEffect","length","_jsx","_Fragment","map","content","id","description","Panel","Panels","withActions","isCloning","useMatch","CLONE_PATH","query","status","useQueryParams","model","document","meta","collectionType","useDoc","plugins","useStrapiApp","state","usePanelsContext","s","visiblePanels","allPanels","apis","getEditViewSidePanels","filteredPanels","filter","panel","type","panelsToDisplay","props","activeTab","documentId","undefined","Flex","direction","alignItems","gap","DescriptionComponentRenderer","descriptions","ActionsPanel","formatMessage","useIntl","title","defaultMessage","ActionsPanelContent","_jsxs","width","getDocumentActions","actions","DocumentActions","InjectionZone","area","slug","forwardRef","children","ref","isDesktop","useIsDesktop","tag","aria-labelledby","background","initial","large","borderColor","hasRadius","padding","shadow","justifyContent","Typography","variant","textTransform","textColor","PanelsProviderImpl","createContext","PanelsProvider","useState"],"mappings":"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"}