@strapi/content-manager 5.61.1 → 5.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/ConfigurationForm/Fields.js +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.mjs +3 -3
- package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
- package/dist/admin/features/I18nSharedFieldsLock.js +54 -0
- package/dist/admin/features/I18nSharedFieldsLock.js.map +1 -0
- package/dist/admin/features/I18nSharedFieldsLock.mjs +31 -0
- package/dist/admin/features/I18nSharedFieldsLock.mjs.map +1 -0
- package/dist/admin/history/components/VersionInputRenderer.js +7 -2
- package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
- package/dist/admin/history/components/VersionInputRenderer.mjs +7 -3
- package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
- package/dist/admin/hooks/useContentManagerInitData.js +27 -8
- package/dist/admin/hooks/useContentManagerInitData.js.map +1 -1
- package/dist/admin/hooks/useContentManagerInitData.mjs +29 -10
- package/dist/admin/hooks/useContentManagerInitData.mjs.map +1 -1
- package/dist/admin/hooks/useDocument.js +11 -13
- package/dist/admin/hooks/useDocument.js.map +1 -1
- package/dist/admin/hooks/useDocument.mjs +11 -13
- package/dist/admin/hooks/useDocument.mjs.map +1 -1
- package/dist/admin/hooks/useI18nFieldLock.js +169 -0
- package/dist/admin/hooks/useI18nFieldLock.js.map +1 -0
- package/dist/admin/hooks/useI18nFieldLock.mjs +140 -0
- package/dist/admin/hooks/useI18nFieldLock.mjs.map +1 -0
- package/dist/admin/hooks/usePersistentQueryParams.js +16 -3
- package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
- package/dist/admin/hooks/usePersistentQueryParams.mjs +16 -3
- package/dist/admin/hooks/usePersistentQueryParams.mjs.map +1 -1
- package/dist/admin/index.js +5 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +2 -0
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/modules/app.js +8 -1
- package/dist/admin/modules/app.js.map +1 -1
- package/dist/admin/modules/app.mjs +8 -2
- package/dist/admin/modules/app.mjs.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.js +129 -127
- package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.mjs +129 -127
- package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.js +11 -4
- package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.mjs +12 -5
- package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +31 -21
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +32 -22
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js +98 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs +96 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js +1103 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs +1077 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js +211 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs +183 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js +84 -41
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs +86 -43
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +86 -20
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +89 -23
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +5 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +5 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +142 -22
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +143 -23
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js +402 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs +389 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +84 -33
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +85 -34
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js +5 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs +5 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +17 -4
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +18 -5
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +54 -6
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +54 -6
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +11 -9
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +12 -10
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +9 -4
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +9 -4
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.js +66 -63
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.mjs +66 -63
- package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js +7 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs +7 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/data.js +14 -9
- package/dist/admin/pages/EditView/utils/data.js.map +1 -1
- package/dist/admin/pages/EditView/utils/data.mjs +14 -9
- package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/forms.js +34 -0
- package/dist/admin/pages/EditView/utils/forms.js.map +1 -1
- package/dist/admin/pages/EditView/utils/forms.mjs +34 -1
- package/dist/admin/pages/EditView/utils/forms.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +2 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs +2 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +7 -6
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs +7 -6
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +11 -2
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +13 -4
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.js +15 -5
- package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.mjs +16 -7
- package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
- package/dist/admin/preview/components/InputPopover.js +18 -8
- package/dist/admin/preview/components/InputPopover.js.map +1 -1
- package/dist/admin/preview/components/InputPopover.mjs +19 -9
- package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
- package/dist/admin/preview/pages/Preview.js +5 -16
- package/dist/admin/preview/pages/Preview.js.map +1 -1
- package/dist/admin/preview/pages/Preview.mjs +5 -16
- package/dist/admin/preview/pages/Preview.mjs.map +1 -1
- package/dist/admin/preview/utils/fieldUtils.js +2 -0
- package/dist/admin/preview/utils/fieldUtils.js.map +1 -1
- package/dist/admin/preview/utils/fieldUtils.mjs +2 -1
- package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -1
- package/dist/admin/services/api.js +2 -1
- package/dist/admin/services/api.js.map +1 -1
- package/dist/admin/services/api.mjs +2 -1
- package/dist/admin/services/api.mjs.map +1 -1
- package/dist/admin/services/documents.js +21 -1
- package/dist/admin/services/documents.js.map +1 -1
- package/dist/admin/services/documents.mjs +21 -2
- package/dist/admin/services/documents.mjs.map +1 -1
- package/dist/admin/services/relations.js +47 -1
- package/dist/admin/services/relations.js.map +1 -1
- package/dist/admin/services/relations.mjs +47 -2
- package/dist/admin/services/relations.mjs.map +1 -1
- package/dist/admin/src/exports.d.ts +2 -0
- package/dist/admin/src/features/I18nSharedFieldsLock.d.ts +22 -0
- package/dist/admin/src/history/components/VersionInputRenderer.d.ts +7 -1
- package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
- package/dist/admin/src/hooks/useI18nFieldLock.d.ts +61 -0
- package/dist/admin/src/modules/app.d.ts +4 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/AddComponentMenu.d.ts +15 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/ComponentCopyModal.d.ts +58 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/CopiedComponents.d.ts +41 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/Initializer.d.ts +7 -3
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/NonRepeatable.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.d.ts +2 -2
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/utils/componentCopy.d.ts +115 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.d.ts +6 -3
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.d.ts +2 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +5 -1
- package/dist/admin/src/pages/EditView/utils/forms.d.ts +13 -2
- package/dist/admin/src/pages/ListView/components/Filters.d.ts +12 -3
- package/dist/admin/src/preview/services/preview.d.ts +1 -1
- package/dist/admin/src/preview/utils/fieldUtils.d.ts +1 -0
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/components.d.ts +2 -2
- package/dist/admin/src/services/contentTypes.d.ts +3 -3
- package/dist/admin/src/services/documents.d.ts +25 -21
- package/dist/admin/src/services/homepage.d.ts +1 -1
- package/dist/admin/src/services/init.d.ts +1 -1
- package/dist/admin/src/services/relations.d.ts +5 -3
- package/dist/admin/src/services/uid.d.ts +3 -3
- package/dist/admin/translations/en.json.js +41 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +41 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/server/controllers/relations.js +4 -2
- package/dist/server/controllers/relations.js.map +1 -1
- package/dist/server/controllers/relations.mjs +4 -2
- package/dist/server/controllers/relations.mjs.map +1 -1
- package/dist/server/controllers/utils/metadata.js +3 -1
- package/dist/server/controllers/utils/metadata.js.map +1 -1
- package/dist/server/controllers/utils/metadata.mjs +3 -1
- package/dist/server/controllers/utils/metadata.mjs.map +1 -1
- package/dist/server/history/services/utils.js +3 -1
- package/dist/server/history/services/utils.js.map +1 -1
- package/dist/server/history/services/utils.mjs +3 -1
- package/dist/server/history/services/utils.mjs.map +1 -1
- package/dist/server/homepage/services/homepage-query-utils.js +14 -0
- package/dist/server/homepage/services/homepage-query-utils.js.map +1 -1
- package/dist/server/homepage/services/homepage-query-utils.mjs +14 -1
- package/dist/server/homepage/services/homepage-query-utils.mjs.map +1 -1
- package/dist/server/homepage/services/homepage.js +1 -1
- package/dist/server/homepage/services/homepage.js.map +1 -1
- package/dist/server/homepage/services/homepage.mjs +2 -2
- package/dist/server/homepage/services/homepage.mjs.map +1 -1
- package/dist/server/mcp/sanitizers/shape-relations.js +1 -3
- package/dist/server/mcp/sanitizers/shape-relations.js.map +1 -1
- package/dist/server/mcp/sanitizers/shape-relations.mjs +1 -3
- package/dist/server/mcp/sanitizers/shape-relations.mjs.map +1 -1
- package/dist/server/mcp/schemas/output-schemas.js +2 -1
- package/dist/server/mcp/schemas/output-schemas.js.map +1 -1
- package/dist/server/mcp/schemas/output-schemas.mjs +2 -1
- package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -1
- package/dist/server/services/document-manager.js +3 -2
- package/dist/server/services/document-manager.js.map +1 -1
- package/dist/server/services/document-manager.mjs +3 -2
- package/dist/server/services/document-manager.mjs.map +1 -1
- package/dist/server/services/document-metadata.js +92 -4
- package/dist/server/services/document-metadata.js.map +1 -1
- package/dist/server/services/document-metadata.mjs +92 -4
- package/dist/server/services/document-metadata.mjs.map +1 -1
- package/dist/server/services/permission-checker.js +20 -8
- package/dist/server/services/permission-checker.js.map +1 -1
- package/dist/server/services/permission-checker.mjs +20 -8
- package/dist/server/services/permission-checker.mjs.map +1 -1
- package/dist/server/services/uid.js +2 -1
- package/dist/server/services/uid.js.map +1 -1
- package/dist/server/services/uid.mjs +2 -1
- package/dist/server/services/uid.mjs.map +1 -1
- package/dist/server/src/controllers/relations.d.ts.map +1 -1
- package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
- package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
- package/dist/server/src/history/services/utils.d.ts.map +1 -1
- package/dist/server/src/homepage/services/homepage-query-utils.d.ts +6 -0
- package/dist/server/src/homepage/services/homepage-query-utils.d.ts.map +1 -1
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +21 -7
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -1
- package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
- package/dist/server/src/services/document-manager.d.ts.map +1 -1
- package/dist/server/src/services/document-metadata.d.ts +5 -1
- package/dist/server/src/services/document-metadata.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +21 -7
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/permission-checker.d.ts +6 -5
- package/dist/server/src/services/permission-checker.d.ts.map +1 -1
- package/dist/server/src/services/uid.d.ts.map +1 -1
- package/dist/shared/contracts/collection-types.d.ts +7 -0
- package/dist/shared/contracts/collection-types.d.ts.map +1 -1
- package/dist/shared/contracts/single-types.d.ts +4 -0
- package/dist/shared/contracts/single-types.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CopiedComponents.mjs","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Component/CopiedComponents.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { createContext, useField, useForm } from '@strapi/admin/strapi-admin';\nimport { generateNKeysBetween } from 'fractional-indexing';\nimport toPath from 'lodash/toPath';\n\nimport { getIn, isInteger, isObject } from '../../../../../utils/objects';\n\nimport type { AnyData } from '../../../utils/data';\n\n/* -------------------------------------------------------------------------------------------------\n * Key paths\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * A component is identified by the temp keys of the rows leading to it, not by their indexes:\n * `blocks.[a1].dishes.[a0]`. Rows keep their key when they're reordered, so the identity survives\n * a move, and it's gone with the row when the row is deleted.\n */\nconst KEY_SEGMENT = /^\\[(.+)\\]$/;\n\nconst getTempKey = (row: unknown): string | undefined =>\n isObject(row) && typeof row.__temp_key__ === 'string' ? row.__temp_key__ : undefined;\n\n/**\n * @description Turns the name of a field into its key path: `blocks.1.dishes` becomes\n * `blocks.[a1].dishes`, `a1` being the temp key of the second block.\n */\nconst getFieldKeyPath = (values: unknown, name: string): string => {\n const segments = toPath(name);\n\n return segments\n .map((segment, position) => {\n if (!isInteger(segment)) {\n return segment;\n }\n\n const key = getTempKey(getIn(values, segments.slice(0, position + 1)));\n\n return `[${key ?? segment}]`;\n })\n .join('.');\n};\n\nconst getComponentKeyPath = (fieldKeyPath: string, tempKey: string) =>\n `${fieldKeyPath}.[${tempKey}]`;\n\n/**\n * @description Returns the component at the given key path, if the form still holds it.\n */\nconst getComponentAt = (values: unknown, keyPath: string): unknown => {\n let current: unknown = values;\n\n for (const segment of keyPath.split('.')) {\n const keyMatch = KEY_SEGMENT.exec(segment);\n\n if (keyMatch) {\n current = Array.isArray(current)\n ? current.find((row) => getTempKey(row) === keyMatch[1])\n : undefined;\n } else {\n current = isObject(current) ? current[segment] : undefined;\n }\n\n if (current === undefined || current === null) {\n return undefined;\n }\n }\n\n return current;\n};\n\n/**\n * @description Tells whether the form still holds the component at the given key path.\n */\nconst hasComponentAt = (values: unknown, keyPath: string): boolean =>\n getComponentAt(values, keyPath) !== undefined;\n\n/* -------------------------------------------------------------------------------------------------\n * Copy marker\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * Set on the components put in the form by a copy. Key paths aren't enough to recognise them:\n * \"Fill in from another locale\" replaces the values with rows that reuse the same temp keys\n * (`a0`, `a1`…), so a copy's key path can point to a component that wasn't copied. Editing a field\n * clones the objects on its path with `lodash/clone`, which keeps symbol keys, while values that\n * replace the component don't carry the marker. Symbol keys aren't serialised, so the marker never\n * reaches the API.\n */\nconst COPIED = Symbol('copied');\n\nconst withCopyMarker = (item: AnyData): AnyData => ({ ...item, [COPIED]: true });\n\n/**\n * @description Tells whether the form still holds, at the given key path, the component that was\n * copied there.\n */\nconst hasCopyAt = (values: unknown, keyPath: string): boolean => {\n const component = getComponentAt(values, keyPath);\n\n return isObject(component) && (component as Record<symbol, unknown>)[COPIED] === true;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * CopiedComponentsProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface CopiedComponentsContextValue {\n /**\n * The key paths of the components copied from another entry since the form was last saved.\n */\n copiedPaths: string[];\n markCopied: (keyPaths: string[]) => void;\n}\n\nconst [CopiedComponentsContextProvider, useCopiedComponentsContext] =\n createContext<CopiedComponentsContextValue>('CopiedComponents');\n\ninterface CopiedComponentsProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Remembers which components of the form were copied from another entry, so that they can be\n * flagged until the entry is saved. The state lives above the fields: a field nested in a block\n * is unmounted when the block collapses and would lose it otherwise. Must be rendered in a `Form`.\n */\nconst CopiedComponentsProvider = ({ children }: CopiedComponentsProviderProps) => {\n const [copiedPaths, setCopiedPaths] = React.useState<string[]>([]);\n const values = useForm('CopiedComponentsProvider', (state) => state.values);\n const isFormModified = useForm('CopiedComponentsProvider', (state) => state.modified);\n\n // Saving the entry, or undoing every change, clears the flags.\n React.useEffect(() => {\n if (!isFormModified) {\n setCopiedPaths((paths) => (paths.length > 0 ? [] : paths));\n }\n }, [isFormModified]);\n\n // A copied component that's removed or replaced (e.g. by \"Fill in from another locale\") drops its\n // flag, so that a component put at the same key path can't inherit it.\n React.useEffect(() => {\n setCopiedPaths((paths) => {\n const kept = paths.filter((path) => hasCopyAt(values, path));\n\n return kept.length === paths.length ? paths : kept;\n });\n }, [values]);\n\n const markCopied = React.useCallback((keyPaths: string[]) => {\n setCopiedPaths((paths) => {\n const added = keyPaths.filter((keyPath) => !paths.includes(keyPath));\n\n return added.length > 0 ? [...paths, ...added] : paths;\n });\n }, []);\n\n return (\n <CopiedComponentsContextProvider copiedPaths={copiedPaths} markCopied={markCopied}>\n {children}\n </CopiedComponentsContextProvider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useCopiedComponents\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @description Inserts copied components in a repeatable component or a dynamic zone field and\n * tells which of its rows are copies. Without a `CopiedComponentsProvider` the copies are still\n * inserted, they're just not flagged.\n */\nconst useCopiedComponents = (name: string) => {\n const copiedPaths = useCopiedComponentsContext(\n 'useCopiedComponents',\n (state) => state.copiedPaths,\n false\n );\n const markCopied = useCopiedComponentsContext(\n 'useCopiedComponents',\n (state) => state.markCopied,\n false\n );\n const { value, onChange } = useField<AnyData[] | null>(name);\n const fieldKeyPath = useForm('useCopiedComponents', (state) =>\n getFieldKeyPath(state.values, name)\n );\n\n const isCopied = React.useCallback(\n (tempKey: string) => copiedPaths?.includes(getComponentKeyPath(fieldKeyPath, tempKey)) ?? false,\n [copiedPaths, fieldKeyPath]\n );\n\n /**\n * The rows are added with their keys already set, so the copies are flagged by key rather than\n * recognised among the rows that appear next.\n */\n const insertCopies = React.useCallback(\n (items: AnyData[]) => {\n const rows = Array.isArray(value) ? value : [];\n const lastKey =\n rows\n .map(getTempKey)\n .filter((key): key is string => key !== undefined && key !== '')\n .sort()\n .pop() ?? null;\n const keys = generateNKeysBetween(lastKey, null, items.length);\n\n onChange(name, [\n ...rows,\n ...items.map((item, index) => withCopyMarker({ ...item, __temp_key__: keys[index] })),\n ]);\n markCopied?.(keys.map((key) => getComponentKeyPath(fieldKeyPath, key)));\n },\n [fieldKeyPath, markCopied, name, onChange, value]\n );\n\n return { isCopied, insertCopies };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useCopiedComponent\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @description Puts a copied component in a non-repeatable component field and tells whether the\n * field holds a copy. The flag is set on the field itself: resetting the field drops it, so a\n * component added afterwards isn't flagged. Without a `CopiedComponentsProvider` the copy is still\n * put in place, it's just not flagged.\n */\nconst useCopiedComponent = (name: string) => {\n const copiedPaths = useCopiedComponentsContext(\n 'useCopiedComponent',\n (state) => state.copiedPaths,\n false\n );\n const markCopied = useCopiedComponentsContext(\n 'useCopiedComponent',\n (state) => state.markCopied,\n false\n );\n const { onChange } = useField<AnyData | null>(name);\n const fieldKeyPath = useForm('useCopiedComponent', (state) =>\n getFieldKeyPath(state.values, name)\n );\n\n const isCopied = copiedPaths?.includes(fieldKeyPath) ?? false;\n\n const insertCopy = React.useCallback(\n (item: AnyData) => {\n onChange(name, withCopyMarker(item));\n markCopied?.([fieldKeyPath]);\n },\n [fieldKeyPath, markCopied, name, onChange]\n );\n\n return { isCopied, insertCopy };\n};\n\nexport {\n CopiedComponentsProvider,\n useCopiedComponents,\n useCopiedComponent,\n getFieldKeyPath,\n hasComponentAt,\n};\nexport type { CopiedComponentsProviderProps };\n"],"names":["KEY_SEGMENT","getTempKey","row","isObject","__temp_key__","undefined","getFieldKeyPath","values","name","segments","toPath","map","segment","position","isInteger","key","getIn","slice","join","getComponentKeyPath","fieldKeyPath","tempKey","getComponentAt","keyPath","current","split","keyMatch","exec","Array","isArray","find","COPIED","Symbol","withCopyMarker","item","hasCopyAt","component","CopiedComponentsContextProvider","useCopiedComponentsContext","createContext","CopiedComponentsProvider","children","copiedPaths","setCopiedPaths","React","useState","useForm","state","isFormModified","modified","useEffect","paths","length","kept","filter","path","markCopied","useCallback","keyPaths","added","includes","_jsx","useCopiedComponents","value","onChange","useField","isCopied","insertCopies","items","rows","lastKey","sort","pop","keys","generateNKeysBetween","index","useCopiedComponent","insertCopy"],"mappings":"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"}
|
|
@@ -6,54 +6,97 @@ var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
|
6
6
|
var designSystem = require('@strapi/design-system');
|
|
7
7
|
var Icons = require('@strapi/icons');
|
|
8
8
|
var reactIntl = require('react-intl');
|
|
9
|
+
var styledComponents = require('styled-components');
|
|
9
10
|
var translations = require('../../../../../utils/translations.js');
|
|
11
|
+
var AddComponentMenu = require('./AddComponentMenu.js');
|
|
10
12
|
|
|
11
|
-
const Initializer = ({ disabled, name, onClick })=>{
|
|
13
|
+
const Initializer = ({ disabled, name, onClick, onCopyClick })=>{
|
|
12
14
|
const { formatMessage } = reactIntl.useIntl();
|
|
13
15
|
const field = strapiAdmin.useField(name);
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
})
|
|
39
|
-
}),
|
|
40
|
-
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
41
|
-
justifyContent: "center",
|
|
42
|
-
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
43
|
-
textColor: disabled ? 'neutral600' : 'primary600',
|
|
44
|
-
variant: "pi",
|
|
45
|
-
fontWeight: "bold",
|
|
46
|
-
children: formatMessage({
|
|
47
|
-
id: translations.getTranslation('components.empty-repeatable'),
|
|
48
|
-
defaultMessage: 'No entry yet. Click to add one.'
|
|
49
|
-
})
|
|
50
|
-
})
|
|
51
|
-
})
|
|
52
|
-
]
|
|
16
|
+
const content = /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
17
|
+
tag: "span",
|
|
18
|
+
direction: "column",
|
|
19
|
+
gap: 2,
|
|
20
|
+
alignItems: "center",
|
|
21
|
+
children: [
|
|
22
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
23
|
+
tag: "span",
|
|
24
|
+
justifyContent: "center",
|
|
25
|
+
color: disabled ? 'neutral500' : 'primary600',
|
|
26
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(Icons.PlusCircle, {
|
|
27
|
+
width: "3.2rem",
|
|
28
|
+
height: "3.2rem"
|
|
29
|
+
})
|
|
30
|
+
}),
|
|
31
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
32
|
+
tag: "span",
|
|
33
|
+
textColor: disabled ? 'neutral600' : 'primary600',
|
|
34
|
+
variant: "pi",
|
|
35
|
+
fontWeight: "bold",
|
|
36
|
+
children: formatMessage({
|
|
37
|
+
id: translations.getTranslation('components.empty-repeatable'),
|
|
38
|
+
defaultMessage: 'No entry yet. Click to add one.'
|
|
39
|
+
})
|
|
53
40
|
})
|
|
54
|
-
|
|
41
|
+
]
|
|
42
|
+
});
|
|
43
|
+
if (onCopyClick) {
|
|
44
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Root, {
|
|
45
|
+
children: [
|
|
46
|
+
/*#__PURE__*/ jsxRuntime.jsx(InitializerMenuTrigger, {
|
|
47
|
+
disabled: disabled,
|
|
48
|
+
endIcon: null,
|
|
49
|
+
$hasError: !!field.error,
|
|
50
|
+
children: content
|
|
51
|
+
}),
|
|
52
|
+
/*#__PURE__*/ jsxRuntime.jsx(AddComponentMenu.AddComponentMenuContent, {
|
|
53
|
+
kind: "entry",
|
|
54
|
+
onAddEmpty: ()=>onClick?.(),
|
|
55
|
+
onCopy: onCopyClick
|
|
56
|
+
})
|
|
57
|
+
]
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
|
|
61
|
+
tag: "button",
|
|
62
|
+
background: disabled ? 'neutral150' : 'neutral100',
|
|
63
|
+
borderColor: field.error ? 'danger600' : 'neutral200',
|
|
64
|
+
hasRadius: true,
|
|
65
|
+
disabled: disabled,
|
|
66
|
+
onClick: onClick,
|
|
67
|
+
paddingTop: 9,
|
|
68
|
+
paddingBottom: 9,
|
|
69
|
+
type: "button",
|
|
70
|
+
style: {
|
|
71
|
+
cursor: disabled ? 'not-allowed' : 'pointer'
|
|
72
|
+
},
|
|
73
|
+
children: content
|
|
55
74
|
});
|
|
56
75
|
};
|
|
76
|
+
/**
|
|
77
|
+
* The menu trigger is a button of the design system, restyled as the placeholder box.
|
|
78
|
+
*/ const InitializerMenuTrigger = styledComponents.styled(designSystem.Menu.Trigger)`
|
|
79
|
+
&& {
|
|
80
|
+
width: 100%;
|
|
81
|
+
height: auto;
|
|
82
|
+
padding: ${({ theme })=>theme.spaces[9]} 0;
|
|
83
|
+
border: 1px solid
|
|
84
|
+
${({ theme, $hasError })=>$hasError ? theme.colors.danger600 : theme.colors.neutral200};
|
|
85
|
+
border-radius: ${({ theme })=>theme.borderRadius};
|
|
86
|
+
background: ${({ theme })=>theme.colors.neutral100};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
&&:not([disabled]):hover,
|
|
90
|
+
&&[data-state='open'] {
|
|
91
|
+
border-color: ${({ theme })=>theme.colors.primary200};
|
|
92
|
+
background: ${({ theme })=>theme.colors.primary100};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
&&[disabled] {
|
|
96
|
+
background: ${({ theme })=>theme.colors.neutral150};
|
|
97
|
+
cursor: not-allowed;
|
|
98
|
+
}
|
|
99
|
+
`;
|
|
57
100
|
|
|
58
101
|
exports.Initializer = Initializer;
|
|
59
102
|
//# sourceMappingURL=Initializer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Initializer.js","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Component/Initializer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { PlusCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTranslation } from '../../../../../utils/translations';\n\ninterface InitializerProps {\n disabled?: boolean;\n name: string;\n onClick?:
|
|
1
|
+
{"version":3,"file":"Initializer.js","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Component/Initializer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, Menu, Typography } from '@strapi/design-system';\nimport { PlusCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslation } from '../../../../../utils/translations';\n\nimport { AddComponentMenuContent } from './AddComponentMenu';\n\ninterface InitializerProps {\n disabled?: boolean;\n name: string;\n onClick?: () => void;\n /**\n * When set, clicking the placeholder offers to start with an empty component or to copy\n * existing content, instead of adding an empty component right away.\n */\n onCopyClick?: () => void;\n}\n\nconst Initializer = ({ disabled, name, onClick, onCopyClick }: InitializerProps) => {\n const { formatMessage } = useIntl();\n\n const field = useField(name);\n\n const content = (\n <Flex tag=\"span\" direction=\"column\" gap={2} alignItems=\"center\">\n <Flex tag=\"span\" justifyContent=\"center\" color={disabled ? 'neutral500' : 'primary600'}>\n <PlusCircle width=\"3.2rem\" height=\"3.2rem\" />\n </Flex>\n <Typography\n tag=\"span\"\n textColor={disabled ? 'neutral600' : 'primary600'}\n variant=\"pi\"\n fontWeight=\"bold\"\n >\n {formatMessage({\n id: getTranslation('components.empty-repeatable'),\n defaultMessage: 'No entry yet. Click to add one.',\n })}\n </Typography>\n </Flex>\n );\n\n if (onCopyClick) {\n return (\n <Menu.Root>\n <InitializerMenuTrigger disabled={disabled} endIcon={null} $hasError={!!field.error}>\n {content}\n </InitializerMenuTrigger>\n <AddComponentMenuContent kind=\"entry\" onAddEmpty={() => onClick?.()} onCopy={onCopyClick} />\n </Menu.Root>\n );\n }\n\n return (\n <Box\n tag=\"button\"\n background={disabled ? 'neutral150' : 'neutral100'}\n borderColor={field.error ? 'danger600' : 'neutral200'}\n hasRadius\n disabled={disabled}\n onClick={onClick}\n paddingTop={9}\n paddingBottom={9}\n type=\"button\"\n style={{ cursor: disabled ? 'not-allowed' : 'pointer' }}\n >\n {content}\n </Box>\n );\n};\n\n/**\n * The menu trigger is a button of the design system, restyled as the placeholder box.\n */\nconst InitializerMenuTrigger = styled(Menu.Trigger)<{ $hasError?: boolean }>`\n && {\n width: 100%;\n height: auto;\n padding: ${({ theme }) => theme.spaces[9]} 0;\n border: 1px solid\n ${({ theme, $hasError }) => ($hasError ? theme.colors.danger600 : theme.colors.neutral200)};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.neutral100};\n }\n\n &&:not([disabled]):hover,\n &&[data-state='open'] {\n border-color: ${({ theme }) => theme.colors.primary200};\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &&[disabled] {\n background: ${({ theme }) => theme.colors.neutral150};\n cursor: not-allowed;\n }\n`;\n\nexport { Initializer };\nexport type { InitializerProps };\n"],"names":["Initializer","disabled","name","onClick","onCopyClick","formatMessage","useIntl","field","useField","content","_jsxs","Flex","tag","direction","gap","alignItems","_jsx","justifyContent","color","PlusCircle","width","height","Typography","textColor","variant","fontWeight","id","getTranslation","defaultMessage","Menu","Root","InitializerMenuTrigger","endIcon","$hasError","error","AddComponentMenuContent","kind","onAddEmpty","onCopy","Box","background","borderColor","hasRadius","paddingTop","paddingBottom","type","style","cursor","styled","Trigger","theme","spaces","colors","danger600","neutral200","borderRadius","neutral100","primary200","primary100","neutral150"],"mappings":"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"}
|
|
@@ -1,57 +1,100 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import 'react';
|
|
3
3
|
import { useField } from '@strapi/admin/strapi-admin';
|
|
4
|
-
import {
|
|
4
|
+
import { Menu, Flex, Typography, Box } from '@strapi/design-system';
|
|
5
5
|
import { PlusCircle } from '@strapi/icons';
|
|
6
6
|
import { useIntl } from 'react-intl';
|
|
7
|
+
import { styled } from 'styled-components';
|
|
7
8
|
import { getTranslation } from '../../../../../utils/translations.mjs';
|
|
9
|
+
import { AddComponentMenuContent } from './AddComponentMenu.mjs';
|
|
8
10
|
|
|
9
|
-
const Initializer = ({ disabled, name, onClick })=>{
|
|
11
|
+
const Initializer = ({ disabled, name, onClick, onCopyClick })=>{
|
|
10
12
|
const { formatMessage } = useIntl();
|
|
11
13
|
const field = useField(name);
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
})
|
|
37
|
-
}),
|
|
38
|
-
/*#__PURE__*/ jsx(Flex, {
|
|
39
|
-
justifyContent: "center",
|
|
40
|
-
children: /*#__PURE__*/ jsx(Typography, {
|
|
41
|
-
textColor: disabled ? 'neutral600' : 'primary600',
|
|
42
|
-
variant: "pi",
|
|
43
|
-
fontWeight: "bold",
|
|
44
|
-
children: formatMessage({
|
|
45
|
-
id: getTranslation('components.empty-repeatable'),
|
|
46
|
-
defaultMessage: 'No entry yet. Click to add one.'
|
|
47
|
-
})
|
|
48
|
-
})
|
|
49
|
-
})
|
|
50
|
-
]
|
|
14
|
+
const content = /*#__PURE__*/ jsxs(Flex, {
|
|
15
|
+
tag: "span",
|
|
16
|
+
direction: "column",
|
|
17
|
+
gap: 2,
|
|
18
|
+
alignItems: "center",
|
|
19
|
+
children: [
|
|
20
|
+
/*#__PURE__*/ jsx(Flex, {
|
|
21
|
+
tag: "span",
|
|
22
|
+
justifyContent: "center",
|
|
23
|
+
color: disabled ? 'neutral500' : 'primary600',
|
|
24
|
+
children: /*#__PURE__*/ jsx(PlusCircle, {
|
|
25
|
+
width: "3.2rem",
|
|
26
|
+
height: "3.2rem"
|
|
27
|
+
})
|
|
28
|
+
}),
|
|
29
|
+
/*#__PURE__*/ jsx(Typography, {
|
|
30
|
+
tag: "span",
|
|
31
|
+
textColor: disabled ? 'neutral600' : 'primary600',
|
|
32
|
+
variant: "pi",
|
|
33
|
+
fontWeight: "bold",
|
|
34
|
+
children: formatMessage({
|
|
35
|
+
id: getTranslation('components.empty-repeatable'),
|
|
36
|
+
defaultMessage: 'No entry yet. Click to add one.'
|
|
37
|
+
})
|
|
51
38
|
})
|
|
52
|
-
|
|
39
|
+
]
|
|
40
|
+
});
|
|
41
|
+
if (onCopyClick) {
|
|
42
|
+
return /*#__PURE__*/ jsxs(Menu.Root, {
|
|
43
|
+
children: [
|
|
44
|
+
/*#__PURE__*/ jsx(InitializerMenuTrigger, {
|
|
45
|
+
disabled: disabled,
|
|
46
|
+
endIcon: null,
|
|
47
|
+
$hasError: !!field.error,
|
|
48
|
+
children: content
|
|
49
|
+
}),
|
|
50
|
+
/*#__PURE__*/ jsx(AddComponentMenuContent, {
|
|
51
|
+
kind: "entry",
|
|
52
|
+
onAddEmpty: ()=>onClick?.(),
|
|
53
|
+
onCopy: onCopyClick
|
|
54
|
+
})
|
|
55
|
+
]
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return /*#__PURE__*/ jsx(Box, {
|
|
59
|
+
tag: "button",
|
|
60
|
+
background: disabled ? 'neutral150' : 'neutral100',
|
|
61
|
+
borderColor: field.error ? 'danger600' : 'neutral200',
|
|
62
|
+
hasRadius: true,
|
|
63
|
+
disabled: disabled,
|
|
64
|
+
onClick: onClick,
|
|
65
|
+
paddingTop: 9,
|
|
66
|
+
paddingBottom: 9,
|
|
67
|
+
type: "button",
|
|
68
|
+
style: {
|
|
69
|
+
cursor: disabled ? 'not-allowed' : 'pointer'
|
|
70
|
+
},
|
|
71
|
+
children: content
|
|
53
72
|
});
|
|
54
73
|
};
|
|
74
|
+
/**
|
|
75
|
+
* The menu trigger is a button of the design system, restyled as the placeholder box.
|
|
76
|
+
*/ const InitializerMenuTrigger = styled(Menu.Trigger)`
|
|
77
|
+
&& {
|
|
78
|
+
width: 100%;
|
|
79
|
+
height: auto;
|
|
80
|
+
padding: ${({ theme })=>theme.spaces[9]} 0;
|
|
81
|
+
border: 1px solid
|
|
82
|
+
${({ theme, $hasError })=>$hasError ? theme.colors.danger600 : theme.colors.neutral200};
|
|
83
|
+
border-radius: ${({ theme })=>theme.borderRadius};
|
|
84
|
+
background: ${({ theme })=>theme.colors.neutral100};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
&&:not([disabled]):hover,
|
|
88
|
+
&&[data-state='open'] {
|
|
89
|
+
border-color: ${({ theme })=>theme.colors.primary200};
|
|
90
|
+
background: ${({ theme })=>theme.colors.primary100};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
&&[disabled] {
|
|
94
|
+
background: ${({ theme })=>theme.colors.neutral150};
|
|
95
|
+
cursor: not-allowed;
|
|
96
|
+
}
|
|
97
|
+
`;
|
|
55
98
|
|
|
56
99
|
export { Initializer };
|
|
57
100
|
//# sourceMappingURL=Initializer.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Initializer.mjs","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Component/Initializer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { PlusCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTranslation } from '../../../../../utils/translations';\n\ninterface InitializerProps {\n disabled?: boolean;\n name: string;\n onClick?:
|
|
1
|
+
{"version":3,"file":"Initializer.mjs","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Component/Initializer.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useField } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, Menu, Typography } from '@strapi/design-system';\nimport { PlusCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslation } from '../../../../../utils/translations';\n\nimport { AddComponentMenuContent } from './AddComponentMenu';\n\ninterface InitializerProps {\n disabled?: boolean;\n name: string;\n onClick?: () => void;\n /**\n * When set, clicking the placeholder offers to start with an empty component or to copy\n * existing content, instead of adding an empty component right away.\n */\n onCopyClick?: () => void;\n}\n\nconst Initializer = ({ disabled, name, onClick, onCopyClick }: InitializerProps) => {\n const { formatMessage } = useIntl();\n\n const field = useField(name);\n\n const content = (\n <Flex tag=\"span\" direction=\"column\" gap={2} alignItems=\"center\">\n <Flex tag=\"span\" justifyContent=\"center\" color={disabled ? 'neutral500' : 'primary600'}>\n <PlusCircle width=\"3.2rem\" height=\"3.2rem\" />\n </Flex>\n <Typography\n tag=\"span\"\n textColor={disabled ? 'neutral600' : 'primary600'}\n variant=\"pi\"\n fontWeight=\"bold\"\n >\n {formatMessage({\n id: getTranslation('components.empty-repeatable'),\n defaultMessage: 'No entry yet. Click to add one.',\n })}\n </Typography>\n </Flex>\n );\n\n if (onCopyClick) {\n return (\n <Menu.Root>\n <InitializerMenuTrigger disabled={disabled} endIcon={null} $hasError={!!field.error}>\n {content}\n </InitializerMenuTrigger>\n <AddComponentMenuContent kind=\"entry\" onAddEmpty={() => onClick?.()} onCopy={onCopyClick} />\n </Menu.Root>\n );\n }\n\n return (\n <Box\n tag=\"button\"\n background={disabled ? 'neutral150' : 'neutral100'}\n borderColor={field.error ? 'danger600' : 'neutral200'}\n hasRadius\n disabled={disabled}\n onClick={onClick}\n paddingTop={9}\n paddingBottom={9}\n type=\"button\"\n style={{ cursor: disabled ? 'not-allowed' : 'pointer' }}\n >\n {content}\n </Box>\n );\n};\n\n/**\n * The menu trigger is a button of the design system, restyled as the placeholder box.\n */\nconst InitializerMenuTrigger = styled(Menu.Trigger)<{ $hasError?: boolean }>`\n && {\n width: 100%;\n height: auto;\n padding: ${({ theme }) => theme.spaces[9]} 0;\n border: 1px solid\n ${({ theme, $hasError }) => ($hasError ? theme.colors.danger600 : theme.colors.neutral200)};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.neutral100};\n }\n\n &&:not([disabled]):hover,\n &&[data-state='open'] {\n border-color: ${({ theme }) => theme.colors.primary200};\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &&[disabled] {\n background: ${({ theme }) => theme.colors.neutral150};\n cursor: not-allowed;\n }\n`;\n\nexport { Initializer };\nexport type { InitializerProps };\n"],"names":["Initializer","disabled","name","onClick","onCopyClick","formatMessage","useIntl","field","useField","content","_jsxs","Flex","tag","direction","gap","alignItems","_jsx","justifyContent","color","PlusCircle","width","height","Typography","textColor","variant","fontWeight","id","getTranslation","defaultMessage","Menu","Root","InitializerMenuTrigger","endIcon","$hasError","error","AddComponentMenuContent","kind","onAddEmpty","onCopy","Box","background","borderColor","hasRadius","paddingTop","paddingBottom","type","style","cursor","styled","Trigger","theme","spaces","colors","danger600","neutral200","borderRadius","neutral100","primary200","primary100","neutral150"],"mappings":"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"}
|
|
@@ -6,13 +6,17 @@ var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
|
6
6
|
var designSystem = require('@strapi/design-system');
|
|
7
7
|
var Icons = require('@strapi/icons');
|
|
8
8
|
var reactIntl = require('react-intl');
|
|
9
|
+
var collections = require('../../../../../constants/collections.js');
|
|
9
10
|
var useDocumentContext = require('../../../../../hooks/useDocumentContext.js');
|
|
10
11
|
var translations = require('../../../../../utils/translations.js');
|
|
11
12
|
var data = require('../../../utils/data.js');
|
|
12
13
|
var forms = require('../../../utils/forms.js');
|
|
14
|
+
var ComponentCopyModal = require('./ComponentCopyModal.js');
|
|
15
|
+
var CopiedComponents = require('./CopiedComponents.js');
|
|
13
16
|
var Initializer = require('./Initializer.js');
|
|
14
17
|
var NonRepeatable = require('./NonRepeatable.js');
|
|
15
18
|
var Repeatable = require('./Repeatable.js');
|
|
19
|
+
var componentCopy = require('./utils/componentCopy.js');
|
|
16
20
|
|
|
17
21
|
function _interopNamespace(e) {
|
|
18
22
|
if (e && e.__esModule) return e;
|
|
@@ -37,51 +41,112 @@ var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
|
37
41
|
const ComponentInput = ({ label, required, name, attribute, disabled, labelAction, ...props })=>{
|
|
38
42
|
const { formatMessage } = reactIntl.useIntl();
|
|
39
43
|
const field = strapiAdmin.useField(name);
|
|
40
|
-
const
|
|
41
|
-
const {
|
|
44
|
+
const [isCopyModalOpen, setIsCopyModalOpen] = React__namespace.useState(false);
|
|
45
|
+
const { isCopied, insertCopy } = CopiedComponents.useCopiedComponent(name);
|
|
46
|
+
const { currentDocumentMeta, currentDocument: { components, document } } = useDocumentContext.useDocumentContext('ComponentInput');
|
|
47
|
+
// A reference into the document: it only changes when the document is refetched
|
|
48
|
+
const savedComponent = strapiAdmin.useForm('ComponentInput', (state)=>componentCopy.getSavedComponent(document, state.values, name));
|
|
49
|
+
const canCopyFromExisting = currentDocumentMeta.collectionType === collections.COLLECTION_TYPES;
|
|
50
|
+
const hasComponent = !attribute.repeatable && field.value !== undefined && field.value !== null;
|
|
51
|
+
const showResetComponent = hasComponent && !disabled;
|
|
52
|
+
/**
|
|
53
|
+
* A component that was just added is blank: copying into it fills it. Once it holds content,
|
|
54
|
+
* copying into it replaces that content and the user is warned.
|
|
55
|
+
*/ const hasContent = hasComponent && !componentCopy.isComponentBlank(field.value, attribute.component, components, savedComponent);
|
|
42
56
|
const handleInitialisationClick = ()=>{
|
|
43
57
|
const schema = components[attribute.component];
|
|
44
58
|
const form = forms.createDefaultForm(schema, components);
|
|
45
59
|
const data$1 = data.transformDocument(schema, components)(form);
|
|
46
60
|
field.onChange(name, data$1);
|
|
47
61
|
};
|
|
62
|
+
/**
|
|
63
|
+
* The copy replaces the component in place. It has no id, so the inputs holding server data for
|
|
64
|
+
* the replaced component (relations) drop it, see `RelationsField`.
|
|
65
|
+
*/ const handleCopyComponent = ([componentData])=>{
|
|
66
|
+
insertCopy(componentData);
|
|
67
|
+
return true;
|
|
68
|
+
};
|
|
48
69
|
return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Field.Root, {
|
|
49
70
|
error: field.error,
|
|
50
71
|
required: required,
|
|
51
72
|
children: [
|
|
52
73
|
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
53
74
|
justifyContent: "space-between",
|
|
75
|
+
alignItems: "center",
|
|
76
|
+
gap: 2,
|
|
54
77
|
children: [
|
|
55
|
-
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.
|
|
56
|
-
|
|
78
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
79
|
+
gap: 2,
|
|
57
80
|
children: [
|
|
58
|
-
|
|
59
|
-
|
|
81
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Field.Label, {
|
|
82
|
+
action: labelAction,
|
|
60
83
|
children: [
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
84
|
+
label,
|
|
85
|
+
attribute.repeatable && /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
86
|
+
children: [
|
|
87
|
+
" (",
|
|
88
|
+
Array.isArray(field.value) ? field.value.length : 0,
|
|
89
|
+
")"
|
|
90
|
+
]
|
|
91
|
+
})
|
|
64
92
|
]
|
|
93
|
+
}),
|
|
94
|
+
hasComponent && isCopied && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Badge, {
|
|
95
|
+
variant: "success",
|
|
96
|
+
size: "S",
|
|
97
|
+
children: formatMessage({
|
|
98
|
+
id: translations.getTranslation('components.Component.copied'),
|
|
99
|
+
defaultMessage: 'Copied'
|
|
100
|
+
})
|
|
65
101
|
})
|
|
66
102
|
]
|
|
67
103
|
}),
|
|
68
|
-
showResetComponent && /*#__PURE__*/ jsxRuntime.
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
104
|
+
showResetComponent && /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
105
|
+
gap: 1,
|
|
106
|
+
children: [
|
|
107
|
+
canCopyFromExisting && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
|
|
108
|
+
variant: "ghost",
|
|
109
|
+
size: "S",
|
|
110
|
+
startIcon: /*#__PURE__*/ jsxRuntime.jsx(Icons.Duplicate, {}),
|
|
111
|
+
onClick: ()=>setIsCopyModalOpen(true),
|
|
112
|
+
children: hasContent ? formatMessage({
|
|
113
|
+
id: translations.getTranslation('components.Component.replace-content'),
|
|
114
|
+
defaultMessage: 'Replace content…'
|
|
115
|
+
}) : formatMessage({
|
|
116
|
+
id: translations.getTranslation('components.AddComponentMenu.copy'),
|
|
117
|
+
defaultMessage: 'Use existing content…'
|
|
118
|
+
})
|
|
119
|
+
}),
|
|
120
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
|
|
121
|
+
label: formatMessage({
|
|
122
|
+
id: translations.getTranslation('components.reset-entry'),
|
|
123
|
+
defaultMessage: 'Reset Entry'
|
|
124
|
+
}),
|
|
125
|
+
variant: "ghost",
|
|
126
|
+
onClick: ()=>{
|
|
127
|
+
field.onChange(name, null);
|
|
128
|
+
},
|
|
129
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(Icons.Trash, {})
|
|
130
|
+
})
|
|
131
|
+
]
|
|
78
132
|
})
|
|
79
133
|
]
|
|
80
134
|
}),
|
|
81
135
|
!attribute.repeatable && !field.value && /*#__PURE__*/ jsxRuntime.jsx(Initializer.Initializer, {
|
|
82
136
|
disabled: disabled,
|
|
83
137
|
name: name,
|
|
84
|
-
onClick: handleInitialisationClick
|
|
138
|
+
onClick: handleInitialisationClick,
|
|
139
|
+
onCopyClick: canCopyFromExisting ? ()=>setIsCopyModalOpen(true) : undefined
|
|
140
|
+
}),
|
|
141
|
+
!attribute.repeatable && isCopyModalOpen && /*#__PURE__*/ jsxRuntime.jsx(ComponentCopyModal.ComponentCopyModal, {
|
|
142
|
+
componentUid: attribute.component,
|
|
143
|
+
fieldLabel: label,
|
|
144
|
+
mode: "component",
|
|
145
|
+
onClose: ()=>setIsCopyModalOpen(false),
|
|
146
|
+
onInsert: handleCopyComponent,
|
|
147
|
+
replacesContent: hasContent,
|
|
148
|
+
selection: "single",
|
|
149
|
+
sourceFieldName: name
|
|
85
150
|
}),
|
|
86
151
|
!attribute.repeatable && field.value ? /*#__PURE__*/ jsxRuntime.jsx(NonRepeatable.NonRepeatableComponent, {
|
|
87
152
|
attribute: attribute,
|
|
@@ -92,6 +157,7 @@ const ComponentInput = ({ label, required, name, attribute, disabled, labelActio
|
|
|
92
157
|
}) : null,
|
|
93
158
|
attribute.repeatable && /*#__PURE__*/ jsxRuntime.jsx(Repeatable.RepeatableComponent, {
|
|
94
159
|
attribute: attribute,
|
|
160
|
+
label: label,
|
|
95
161
|
name: name,
|
|
96
162
|
disabled: disabled,
|
|
97
163
|
...props,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Input.js","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Component/Input.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { InputProps, useField } from '@strapi/admin/strapi-admin';\nimport { Field, Flex, IconButton } from '@strapi/design-system';\nimport { Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useDocumentContext } from '../../../../../hooks/useDocumentContext';\nimport { EditFieldLayout } from '../../../../../hooks/useDocumentLayout';\nimport { getTranslation } from '../../../../../utils/translations';\nimport { type AnyData, transformDocument } from '../../../utils/data';\nimport { createDefaultForm } from '../../../utils/forms';\nimport { type InputRendererProps } from '../../InputRenderer';\n\nimport { Initializer } from './Initializer';\nimport { NonRepeatableComponent } from './NonRepeatable';\nimport { RepeatableComponent } from './Repeatable';\n\ninterface ComponentInputProps\n extends\n Omit<Extract<EditFieldLayout, { type: 'component' }>, 'size' | 'hint'>,\n Pick<InputProps, 'hint'> {\n labelAction?: React.ReactNode;\n children: (props: InputRendererProps) => React.ReactNode;\n /**\n * We need layout to come from the props, and not via a hook, because Content History needs\n * a way to modify the normal component layout to add hidden fields.\n */\n layout: ReadonlyArray<ReadonlyArray<EditFieldLayout>>;\n}\n\nconst ComponentInput = ({\n label,\n required,\n name,\n attribute,\n disabled,\n labelAction,\n ...props\n}: ComponentInputProps) => {\n const { formatMessage } = useIntl();\n const field = useField<AnyData | AnyData[] | null>(name);\n\n const showResetComponent =\n !attribute.repeatable && field.value !== undefined && field.value !== null && !disabled;\n\n const {\n currentDocument: { components },\n } = useDocumentContext('ComponentInput');\n\n const handleInitialisationClick = () => {\n const schema = components[attribute.component];\n const form = createDefaultForm(schema, components);\n const data = transformDocument(schema, components)(form);\n\n field.onChange(name, data);\n };\n\n return (\n <Field.Root error={field.error} required={required}>\n <Flex justifyContent=\"space-between\">\n <Field.Label action={labelAction}>\n {label}\n {attribute.repeatable && (\n <> ({Array.isArray(field.value) ? field.value.length : 0})</>\n )}\n </Field.Label>\n\n {showResetComponent && (\n <IconButton\n label={formatMessage({\n id: getTranslation('components.reset-entry'),\n defaultMessage: 'Reset Entry',\n })}\n variant=\"ghost\"\n onClick={() => {\n field.onChange(name, null);\n }}\n >\n <Trash />\n </IconButton>\n )}\n </Flex>\n {/**\n * if the field isn't repeatable then we display a button to start the field\n * TODO: should this just live in the `NonRepeatableComponent`?\n */}\n {!attribute.repeatable && !field.value && (\n <Initializer disabled={disabled} name={name} onClick={handleInitialisationClick} />\n )}\n {!attribute.repeatable && field.value ? (\n <NonRepeatableComponent attribute={attribute} name={name} disabled={disabled} {...props}>\n {props.children}\n </NonRepeatableComponent>\n ) : null}\n {attribute.repeatable && (\n <RepeatableComponent attribute={attribute} name={name} disabled={disabled} {...props}>\n {props.children}\n </RepeatableComponent>\n )}\n <Field.Error />\n </Field.Root>\n );\n};\n\nconst MemoizedComponentInput = React.memo(ComponentInput);\n\nexport { MemoizedComponentInput as ComponentInput };\nexport type { ComponentInputProps };\n"],"names":["ComponentInput","label","required","name","attribute","disabled","labelAction","props","formatMessage","useIntl","field","useField","showResetComponent","repeatable","value","undefined","currentDocument","components","useDocumentContext","handleInitialisationClick","schema","component","form","createDefaultForm","data","transformDocument","onChange","_jsxs","Field","Root","error","Flex","justifyContent","Label","action","_Fragment","Array","isArray","length","_jsx","IconButton","id","getTranslation","defaultMessage","variant","onClick","Trash","Initializer","NonRepeatableComponent","children","RepeatableComponent","Error","MemoizedComponentInput","React","memo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Input.js","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/Component/Input.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { InputProps, useField, useForm } from '@strapi/admin/strapi-admin';\nimport { Badge, Button, Field, Flex, IconButton } from '@strapi/design-system';\nimport { Duplicate, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { COLLECTION_TYPES } from '../../../../../constants/collections';\nimport { useDocumentContext } from '../../../../../hooks/useDocumentContext';\nimport { EditFieldLayout } from '../../../../../hooks/useDocumentLayout';\nimport { getTranslation } from '../../../../../utils/translations';\nimport { type AnyData, transformDocument } from '../../../utils/data';\nimport { createDefaultForm } from '../../../utils/forms';\nimport { type InputRendererProps } from '../../InputRenderer';\n\nimport { ComponentCopyModal } from './ComponentCopyModal';\nimport { useCopiedComponent } from './CopiedComponents';\nimport { Initializer } from './Initializer';\nimport { NonRepeatableComponent } from './NonRepeatable';\nimport { RepeatableComponent } from './Repeatable';\nimport { getSavedComponent, isComponentBlank } from './utils/componentCopy';\n\ninterface ComponentInputProps\n extends\n Omit<Extract<EditFieldLayout, { type: 'component' }>, 'size' | 'hint'>,\n Pick<InputProps, 'hint'> {\n labelAction?: React.ReactNode;\n children: (props: InputRendererProps) => React.ReactNode;\n /**\n * We need layout to come from the props, and not via a hook, because Content History needs\n * a way to modify the normal component layout to add hidden fields.\n */\n layout: ReadonlyArray<ReadonlyArray<EditFieldLayout>>;\n}\n\nconst ComponentInput = ({\n label,\n required,\n name,\n attribute,\n disabled,\n labelAction,\n ...props\n}: ComponentInputProps) => {\n const { formatMessage } = useIntl();\n const field = useField<AnyData | AnyData[] | null>(name);\n const [isCopyModalOpen, setIsCopyModalOpen] = React.useState(false);\n const { isCopied, insertCopy } = useCopiedComponent(name);\n\n const {\n currentDocumentMeta,\n currentDocument: { components, document },\n } = useDocumentContext('ComponentInput');\n // A reference into the document: it only changes when the document is refetched\n const savedComponent = useForm('ComponentInput', (state) =>\n getSavedComponent(document, state.values, name)\n );\n const canCopyFromExisting = currentDocumentMeta.collectionType === COLLECTION_TYPES;\n\n const hasComponent = !attribute.repeatable && field.value !== undefined && field.value !== null;\n const showResetComponent = hasComponent && !disabled;\n /**\n * A component that was just added is blank: copying into it fills it. Once it holds content,\n * copying into it replaces that content and the user is warned.\n */\n const hasContent =\n hasComponent && !isComponentBlank(field.value, attribute.component, components, savedComponent);\n\n const handleInitialisationClick = () => {\n const schema = components[attribute.component];\n const form = createDefaultForm(schema, components);\n const data = transformDocument(schema, components)(form);\n\n field.onChange(name, data);\n };\n\n /**\n * The copy replaces the component in place. It has no id, so the inputs holding server data for\n * the replaced component (relations) drop it, see `RelationsField`.\n */\n const handleCopyComponent = ([componentData]: AnyData[]) => {\n insertCopy(componentData);\n\n return true;\n };\n\n return (\n <Field.Root error={field.error} required={required}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" gap={2}>\n <Flex gap={2}>\n <Field.Label action={labelAction}>\n {label}\n {attribute.repeatable && (\n <> ({Array.isArray(field.value) ? field.value.length : 0})</>\n )}\n </Field.Label>\n {hasComponent && isCopied && (\n <Badge variant=\"success\" size=\"S\">\n {formatMessage({\n id: getTranslation('components.Component.copied'),\n defaultMessage: 'Copied',\n })}\n </Badge>\n )}\n </Flex>\n\n {showResetComponent && (\n <Flex gap={1}>\n {canCopyFromExisting && (\n <Button\n variant=\"ghost\"\n size=\"S\"\n startIcon={<Duplicate />}\n onClick={() => setIsCopyModalOpen(true)}\n >\n {hasContent\n ? formatMessage({\n id: getTranslation('components.Component.replace-content'),\n defaultMessage: 'Replace content…',\n })\n : formatMessage({\n id: getTranslation('components.AddComponentMenu.copy'),\n defaultMessage: 'Use existing content…',\n })}\n </Button>\n )}\n <IconButton\n label={formatMessage({\n id: getTranslation('components.reset-entry'),\n defaultMessage: 'Reset Entry',\n })}\n variant=\"ghost\"\n onClick={() => {\n field.onChange(name, null);\n }}\n >\n <Trash />\n </IconButton>\n </Flex>\n )}\n </Flex>\n {/**\n * if the field isn't repeatable then we display a button to start the field\n * TODO: should this just live in the `NonRepeatableComponent`?\n */}\n {!attribute.repeatable && !field.value && (\n <Initializer\n disabled={disabled}\n name={name}\n onClick={handleInitialisationClick}\n onCopyClick={canCopyFromExisting ? () => setIsCopyModalOpen(true) : undefined}\n />\n )}\n {!attribute.repeatable && isCopyModalOpen && (\n <ComponentCopyModal\n componentUid={attribute.component}\n fieldLabel={label}\n mode=\"component\"\n onClose={() => setIsCopyModalOpen(false)}\n onInsert={handleCopyComponent}\n replacesContent={hasContent}\n selection=\"single\"\n sourceFieldName={name}\n />\n )}\n {!attribute.repeatable && field.value ? (\n <NonRepeatableComponent attribute={attribute} name={name} disabled={disabled} {...props}>\n {props.children}\n </NonRepeatableComponent>\n ) : null}\n {attribute.repeatable && (\n <RepeatableComponent\n attribute={attribute}\n label={label}\n name={name}\n disabled={disabled}\n {...props}\n >\n {props.children}\n </RepeatableComponent>\n )}\n <Field.Error />\n </Field.Root>\n );\n};\n\nconst MemoizedComponentInput = React.memo(ComponentInput);\n\nexport { MemoizedComponentInput as ComponentInput };\nexport type { ComponentInputProps };\n"],"names":["ComponentInput","label","required","name","attribute","disabled","labelAction","props","formatMessage","useIntl","field","useField","isCopyModalOpen","setIsCopyModalOpen","React","useState","isCopied","insertCopy","useCopiedComponent","currentDocumentMeta","currentDocument","components","document","useDocumentContext","savedComponent","useForm","state","getSavedComponent","values","canCopyFromExisting","collectionType","COLLECTION_TYPES","hasComponent","repeatable","value","undefined","showResetComponent","hasContent","isComponentBlank","component","handleInitialisationClick","schema","form","createDefaultForm","data","transformDocument","onChange","handleCopyComponent","componentData","_jsxs","Field","Root","error","Flex","justifyContent","alignItems","gap","Label","action","_Fragment","Array","isArray","length","_jsx","Badge","variant","size","id","getTranslation","defaultMessage","Button","startIcon","Duplicate","onClick","IconButton","Trash","Initializer","onCopyClick","ComponentCopyModal","componentUid","fieldLabel","mode","onClose","onInsert","replacesContent","selection","sourceFieldName","NonRepeatableComponent","children","RepeatableComponent","Error","MemoizedComponentInput","memo"],"mappings":"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"}
|