@strapi/content-manager 5.48.1 → 5.49.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/ActionsDrawer.js +3 -2
- package/dist/admin/components/ActionsDrawer.js.map +1 -1
- package/dist/admin/components/ComponentIcon.js +4 -3
- package/dist/admin/components/ComponentIcon.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/EditFieldForm.js +3 -2
- package/dist/admin/components/ConfigurationForm/EditFieldForm.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.js +3 -2
- package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Form.js +7 -3
- package/dist/admin/components/ConfigurationForm/Form.js.map +1 -1
- package/dist/admin/components/LeftMenu.js +3 -2
- package/dist/admin/components/LeftMenu.js.map +1 -1
- package/dist/admin/components/RelativeTime.js +3 -2
- package/dist/admin/components/RelativeTime.js.map +1 -1
- package/dist/admin/components/Widgets.js +3 -2
- package/dist/admin/components/Widgets.js.map +1 -1
- package/dist/admin/features/DocumentRBAC.js +3 -2
- package/dist/admin/features/DocumentRBAC.js.map +1 -1
- package/dist/admin/history/components/VersionContent.js +7 -3
- package/dist/admin/history/components/VersionContent.js.map +1 -1
- package/dist/admin/history/components/VersionHeader.js +3 -2
- package/dist/admin/history/components/VersionHeader.js.map +1 -1
- package/dist/admin/history/components/VersionInputRenderer.js +3 -2
- package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
- package/dist/admin/history/pages/History.js +3 -2
- package/dist/admin/history/pages/History.js.map +1 -1
- package/dist/admin/history/routes.js +3 -2
- package/dist/admin/history/routes.js.map +1 -1
- package/dist/admin/hooks/useContentTypeSchema.js +3 -2
- package/dist/admin/hooks/useContentTypeSchema.js.map +1 -1
- package/dist/admin/hooks/useDocument.js +3 -2
- package/dist/admin/hooks/useDocument.js.map +1 -1
- package/dist/admin/hooks/useDocumentActions.js +3 -2
- package/dist/admin/hooks/useDocumentActions.js.map +1 -1
- package/dist/admin/hooks/useDocumentContext.js +3 -2
- package/dist/admin/hooks/useDocumentContext.js.map +1 -1
- package/dist/admin/hooks/useDocumentLayout.js +3 -2
- package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
- package/dist/admin/hooks/useDragAndDrop.js +3 -2
- package/dist/admin/hooks/useDragAndDrop.js.map +1 -1
- package/dist/admin/hooks/useKeyboardDragAndDrop.js +3 -2
- package/dist/admin/hooks/useKeyboardDragAndDrop.js.map +1 -1
- package/dist/admin/hooks/useOnce.js +3 -2
- package/dist/admin/hooks/useOnce.js.map +1 -1
- package/dist/admin/hooks/usePersistentQueryParams.js +7 -2
- package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
- package/dist/admin/pages/ComponentConfigurationPage.js +3 -2
- package/dist/admin/pages/ComponentConfigurationPage.js.map +1 -1
- package/dist/admin/pages/EditConfigurationPage.js +3 -2
- package/dist/admin/pages/EditConfigurationPage.js.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.js +3 -2
- package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.js +80 -39
- package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.mjs +67 -33
- package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/EditorToolbarObserver.js +3 -2
- package/dist/admin/pages/EditView/components/EditorToolbarObserver.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js +4 -3
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +4 -3
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +7 -3
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +7 -3
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/UID.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js +8 -4
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.js +5 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.js +15 -2
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js +5 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.js +3 -2
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/Header.js +3 -2
- package/dist/admin/pages/EditView/components/Header.js.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js +3 -2
- package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/Panels.js +3 -2
- package/dist/admin/pages/EditView/components/Panels.js.map +1 -1
- package/dist/admin/pages/EditView/utils/data.js +5 -1
- package/dist/admin/pages/EditView/utils/data.js.map +1 -1
- package/dist/admin/pages/EditView/utils/keyboardShortcuts.js +35 -0
- package/dist/admin/pages/EditView/utils/keyboardShortcuts.js.map +1 -0
- package/dist/admin/pages/EditView/utils/keyboardShortcuts.mjs +33 -0
- package/dist/admin/pages/EditView/utils/keyboardShortcuts.mjs.map +1 -0
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +3 -2
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +3 -2
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +3 -2
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/Settings.js +3 -2
- package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js +3 -2
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +3 -2
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/Actions.js +3 -2
- package/dist/admin/pages/ListView/components/BulkActions/Actions.js.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +3 -2
- package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +3 -2
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.js +3 -2
- package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
- package/dist/admin/pages/ListView/components/TableActions.js +3 -2
- package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/CellContent.js +7 -3
- package/dist/admin/pages/ListView/components/TableCells/CellContent.js.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/CellValue.js +7 -2
- package/dist/admin/pages/ListView/components/TableCells/CellValue.js.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/Relations.js +3 -2
- package/dist/admin/pages/ListView/components/TableCells/Relations.js.map +1 -1
- package/dist/admin/preview/components/InputPopover.js +3 -2
- package/dist/admin/preview/components/InputPopover.js.map +1 -1
- package/dist/admin/preview/hooks/usePreviewInputManager.js +3 -2
- package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -1
- package/dist/admin/preview/pages/Preview.js +3 -2
- package/dist/admin/preview/pages/Preview.js.map +1 -1
- package/dist/admin/preview/routes.js +3 -2
- package/dist/admin/preview/routes.js.map +1 -1
- package/dist/admin/src/pages/EditView/utils/keyboardShortcuts.d.ts +18 -0
- package/dist/admin/translations/cs.json.js +2 -1
- package/dist/admin/translations/cs.json.js.map +1 -1
- package/dist/admin/translations/cs.json.mjs +2 -1
- package/dist/admin/translations/cs.json.mjs.map +1 -1
- package/dist/admin/translations/de.json.js +2 -1
- package/dist/admin/translations/de.json.js.map +1 -1
- package/dist/admin/translations/de.json.mjs +2 -1
- package/dist/admin/translations/de.json.mjs.map +1 -1
- package/dist/admin/translations/en.json.js +2 -1
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +2 -1
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +2 -1
- package/dist/admin/translations/es.json.js.map +1 -1
- package/dist/admin/translations/es.json.mjs +2 -1
- package/dist/admin/translations/es.json.mjs.map +1 -1
- package/dist/admin/translations/fr.json.js +2 -1
- package/dist/admin/translations/fr.json.js.map +1 -1
- package/dist/admin/translations/fr.json.mjs +2 -1
- package/dist/admin/translations/fr.json.mjs.map +1 -1
- package/dist/admin/translations/nl.json.js +2 -1
- package/dist/admin/translations/nl.json.js.map +1 -1
- package/dist/admin/translations/nl.json.mjs +2 -1
- package/dist/admin/translations/nl.json.mjs.map +1 -1
- package/dist/admin/translations/pl.json.js +2 -1
- package/dist/admin/translations/pl.json.js.map +1 -1
- package/dist/admin/translations/pl.json.mjs +2 -1
- package/dist/admin/translations/pl.json.mjs.map +1 -1
- package/dist/admin/translations/sk.json.js +2 -1
- package/dist/admin/translations/sk.json.js.map +1 -1
- package/dist/admin/translations/sk.json.mjs +2 -1
- package/dist/admin/translations/sk.json.mjs.map +1 -1
- package/dist/admin/utils/objects.js +9 -4
- package/dist/admin/utils/objects.js.map +1 -1
- package/dist/admin/utils/validation.js +7 -3
- package/dist/admin/utils/validation.js.map +1 -1
- package/dist/server/controllers/utils/clone.js +5 -1
- package/dist/server/controllers/utils/clone.js.map +1 -1
- package/dist/server/controllers/utils/clone.mjs.map +1 -1
- package/dist/server/controllers/validation/index.js +6 -2
- package/dist/server/controllers/validation/index.js.map +1 -1
- package/dist/server/homepage/services/homepage.js +6 -1
- package/dist/server/homepage/services/homepage.js.map +1 -1
- package/dist/server/homepage/services/homepage.mjs +6 -1
- package/dist/server/homepage/services/homepage.mjs.map +1 -1
- package/dist/server/mcp/handlers/collection-handlers.js +15 -18
- package/dist/server/mcp/handlers/collection-handlers.js.map +1 -1
- package/dist/server/mcp/handlers/collection-handlers.mjs +16 -19
- package/dist/server/mcp/handlers/collection-handlers.mjs.map +1 -1
- package/dist/server/mcp/handlers/single-type-handlers.js +12 -12
- package/dist/server/mcp/handlers/single-type-handlers.js.map +1 -1
- package/dist/server/mcp/handlers/single-type-handlers.mjs +13 -13
- package/dist/server/mcp/handlers/single-type-handlers.mjs.map +1 -1
- package/dist/server/mcp/register-content-manager-mcp-tools.js +4 -1
- package/dist/server/mcp/register-content-manager-mcp-tools.js.map +1 -1
- package/dist/server/mcp/register-content-manager-mcp-tools.mjs +4 -1
- package/dist/server/mcp/register-content-manager-mcp-tools.mjs.map +1 -1
- package/dist/server/mcp/sanitizers/shape-relations.js +108 -0
- package/dist/server/mcp/sanitizers/shape-relations.js.map +1 -0
- package/dist/server/mcp/sanitizers/shape-relations.mjs +103 -0
- package/dist/server/mcp/sanitizers/shape-relations.mjs.map +1 -0
- package/dist/server/mcp/schemas/data-schema.js +0 -3
- package/dist/server/mcp/schemas/data-schema.js.map +1 -1
- package/dist/server/mcp/schemas/data-schema.mjs +0 -3
- package/dist/server/mcp/schemas/data-schema.mjs.map +1 -1
- package/dist/server/mcp/schemas/output-schemas.js +30 -4
- package/dist/server/mcp/schemas/output-schemas.js.map +1 -1
- package/dist/server/mcp/schemas/output-schemas.mjs +30 -4
- package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -1
- package/dist/server/mcp/utils.js +30 -3
- package/dist/server/mcp/utils.js.map +1 -1
- package/dist/server/mcp/utils.mjs +30 -4
- package/dist/server/mcp/utils.mjs.map +1 -1
- package/dist/server/middlewares/routing.js +5 -1
- package/dist/server/middlewares/routing.js.map +1 -1
- package/dist/server/services/populate-builder.js.map +1 -1
- package/dist/server/services/populate-builder.mjs.map +1 -1
- package/dist/server/services/uid.js +9 -4
- package/dist/server/services/uid.js.map +1 -1
- package/dist/server/services/utils/configuration/attributes.js +14 -10
- package/dist/server/services/utils/configuration/attributes.js.map +1 -1
- package/dist/server/services/utils/configuration/layouts.js +8 -4
- package/dist/server/services/utils/configuration/layouts.js.map +1 -1
- package/dist/server/services/utils/configuration/metadatas.js +19 -15
- package/dist/server/services/utils/configuration/metadatas.js.map +1 -1
- package/dist/server/services/utils/configuration/settings.js +5 -1
- package/dist/server/services/utils/configuration/settings.js.map +1 -1
- package/dist/server/services/utils/draft.js +5 -1
- package/dist/server/services/utils/draft.js.map +1 -1
- package/dist/server/services/utils/populate.js +8 -4
- package/dist/server/services/utils/populate.js.map +1 -1
- package/dist/server/services/utils/populate.mjs.map +1 -1
- package/dist/server/services/utils/store.js +9 -5
- package/dist/server/services/utils/store.js.map +1 -1
- package/dist/server/src/controllers/utils/clone.d.ts +1 -1
- package/dist/server/src/controllers/utils/clone.d.ts.map +1 -1
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +3 -1
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/handlers/collection-handlers.d.ts.map +1 -1
- package/dist/server/src/mcp/handlers/single-type-handlers.d.ts.map +1 -1
- package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts +2 -1
- package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts.map +1 -1
- package/dist/server/src/mcp/sanitizers/shape-relations.d.ts +38 -0
- package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -0
- package/dist/server/src/mcp/schemas/data-schema.d.ts +0 -3
- package/dist/server/src/mcp/schemas/data-schema.d.ts.map +1 -1
- package/dist/server/src/mcp/schemas/output-schemas.d.ts +2 -2
- package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
- package/dist/server/src/mcp/types.d.ts +2 -2
- package/dist/server/src/mcp/types.d.ts.map +1 -1
- package/dist/server/src/mcp/utils.d.ts +19 -1
- package/dist/server/src/mcp/utils.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +3 -1
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/populate-builder.d.ts +3 -1
- package/dist/server/src/services/populate-builder.d.ts.map +1 -1
- package/dist/server/src/services/utils/populate.d.ts +3 -1
- package/dist/server/src/services/utils/populate.d.ts.map +1 -1
- package/package.json +7 -7
|
@@ -12,7 +12,10 @@ var strings = require('../../utils/strings.js');
|
|
|
12
12
|
var translations = require('../../utils/translations.js');
|
|
13
13
|
var Fields = require('./Fields.js');
|
|
14
14
|
|
|
15
|
-
function
|
|
15
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
|
+
|
|
17
|
+
function _interopNamespace(e) {
|
|
18
|
+
if (e && e.__esModule) return e;
|
|
16
19
|
var n = Object.create(null);
|
|
17
20
|
if (e) {
|
|
18
21
|
Object.keys(e).forEach(function (k) {
|
|
@@ -29,13 +32,14 @@ function _interopNamespaceDefault(e) {
|
|
|
29
32
|
return Object.freeze(n);
|
|
30
33
|
}
|
|
31
34
|
|
|
32
|
-
var React__namespace = /*#__PURE__*/
|
|
35
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
36
|
+
var pipe__default = /*#__PURE__*/_interopDefault(pipe);
|
|
33
37
|
|
|
34
38
|
const ConfigurationForm = ({ attributes: attributes$1, fieldSizes, layout: editLayout, onSubmit })=>{
|
|
35
39
|
const { components, settings, layout, metadatas } = editLayout;
|
|
36
40
|
const { formatMessage } = reactIntl.useIntl();
|
|
37
41
|
const initialValues = React__namespace.useMemo(()=>{
|
|
38
|
-
const transformations =
|
|
42
|
+
const transformations = pipe__default.default(flattenPanels, replaceMainFieldWithNameOnly, extractMetadata, addTmpSpaceToLayout, addTmpKeysToLayout);
|
|
39
43
|
return {
|
|
40
44
|
layout: transformations(layout),
|
|
41
45
|
settings: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Form.js","sources":["../../../../admin/src/components/ConfigurationForm/Form.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Form,\n FormProps,\n useForm,\n InputRenderer,\n BackButton,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport { Button, Divider, Flex, Grid, Main, Typography } from '@strapi/design-system';\nimport { generateNKeysBetween } from 'fractional-indexing';\nimport pipe from 'lodash/fp/pipe';\nimport { useIntl } from 'react-intl';\n\nimport { ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD } from '../../constants/attributes';\nimport { capitalise } from '../../utils/strings';\nimport { getTranslation } from '../../utils/translations';\n\nimport { Fields, FieldsProps, TEMP_FIELD_NAME } from './Fields';\n\nimport type { EditFieldLayout, EditLayout } from '../../hooks/useDocumentLayout';\n\n/* -------------------------------------------------------------------------------------------------\n * ConfigurationForm\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ConfigurationFormProps extends Pick<FieldsProps, 'attributes' | 'fieldSizes'> {\n layout: EditLayout;\n onSubmit: FormProps<ConfigurationFormData>['onSubmit'];\n}\n\n/**\n * Every key in EditFieldLayout is turned to optional never and then we overwrite the ones we are using.\n */\n\ntype EditFieldSpacerLayout = {\n [key in keyof Omit<EditFieldLayout, 'name' | 'size'>]?: never;\n} & {\n description?: never;\n editable?: never;\n name: '_TEMP_';\n size: number;\n __temp_key__: string;\n};\n\ninterface ConfigurationFormData extends Pick<EditLayout, 'settings'> {\n layout: Array<{\n __temp_key__: string;\n children: Array<\n | (Pick<EditFieldLayout, 'label' | 'size' | 'name' | 'placeholder' | 'mainField'> & {\n description: EditFieldLayout['hint'];\n editable: EditFieldLayout['disabled'];\n __temp_key__: string;\n })\n | EditFieldSpacerLayout\n >;\n }>;\n}\n\nconst ConfigurationForm = ({\n attributes,\n fieldSizes,\n layout: editLayout,\n onSubmit,\n}: ConfigurationFormProps) => {\n const { components, settings, layout, metadatas } = editLayout;\n\n const { formatMessage } = useIntl();\n\n const initialValues: ConfigurationFormData = React.useMemo(() => {\n const transformations = pipe(\n flattenPanels,\n replaceMainFieldWithNameOnly,\n extractMetadata,\n addTmpSpaceToLayout,\n addTmpKeysToLayout\n );\n\n return {\n layout: transformations(layout),\n settings: {\n ...settings,\n relationOpenMode: settings.relationOpenMode ?? 'modal',\n },\n };\n }, [layout, settings]);\n\n return (\n <>\n <Main>\n <Form initialValues={initialValues} onSubmit={onSubmit} method=\"PUT\">\n <Header name={settings.displayName ?? ''} />\n <Layouts.Content>\n <Flex\n alignItems=\"stretch\"\n background=\"neutral0\"\n direction=\"column\"\n gap={6}\n hasRadius\n shadow=\"tableShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTranslation('containers.SettingPage.settings'),\n defaultMessage: 'Settings',\n })}\n </Typography>\n <Grid.Root gap={4}>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <InputRenderer\n type=\"enumeration\"\n label={formatMessage({\n id: getTranslation('containers.SettingPage.editSettings.entry.title'),\n defaultMessage: 'Entry title',\n })}\n hint={formatMessage({\n id: getTranslation(\n 'containers.SettingPage.editSettings.entry.title.description'\n ),\n defaultMessage: 'Set the display field of your entry',\n })}\n name=\"settings.mainField\"\n options={Object.entries(attributes).reduce<\n Array<{ label: string; value: string }>\n >((acc, [key, attribute]) => {\n if (!attribute) {\n return acc;\n }\n\n /**\n * Create the list of attributes from the schema as to which can\n * be our `mainField` and dictate the display name of the schema\n * we're editing.\n */\n if (!ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD.includes(attribute.type)) {\n acc.push({\n label: key,\n value: key,\n });\n }\n\n return acc;\n }, [])}\n />\n </Grid.Item>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <InputRenderer\n type=\"enumeration\"\n label={formatMessage({\n id: getTranslation('containers.SettingPage.editSettings.relationOpenMode'),\n defaultMessage: 'Relation open behavior',\n })}\n hint={formatMessage({\n id: getTranslation(\n 'containers.SettingPage.editSettings.relationOpenMode.description'\n ),\n defaultMessage: 'Choose how relation entries open when clicked',\n })}\n name=\"settings.relationOpenMode\"\n options={[\n {\n label: formatMessage({\n id: getTranslation(\n 'containers.SettingPage.editSettings.relationOpenMode.modal'\n ),\n defaultMessage: 'Modal (default)',\n }),\n value: 'modal',\n },\n {\n label: formatMessage({\n id: getTranslation(\n 'containers.SettingPage.editSettings.relationOpenMode.page'\n ),\n defaultMessage: 'Navigate to page',\n }),\n value: 'page',\n },\n {\n label: formatMessage({\n id: getTranslation(\n 'containers.SettingPage.editSettings.relationOpenMode.newTab'\n ),\n defaultMessage: 'Open in new tab',\n }),\n value: 'newTab',\n },\n ]}\n />\n </Grid.Item>\n </Grid.Root>\n <Divider />\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Typography variant=\"delta\" tag=\"h3\">\n {formatMessage({\n id: getTranslation('containers.SettingPage.view'),\n defaultMessage: 'View',\n })}\n </Typography>\n <Fields\n attributes={attributes}\n components={components}\n fieldSizes={fieldSizes}\n metadatas={metadatas}\n />\n </Flex>\n </Flex>\n </Layouts.Content>\n </Form>\n </Main>\n </>\n );\n};\n\n/**\n * @internal\n * @description Panels don't exist in the layout, so we flatten by one.\n */\nconst flattenPanels = (layout: EditLayout['layout']): EditLayout['layout'][number] =>\n layout.flat(1);\n\n/**\n * @internal\n * @description We don't need the mainField object in the layout, we only need the name.\n */\nconst replaceMainFieldWithNameOnly = (layout: EditLayout['layout'][number]) =>\n layout.map((row) =>\n row.map((field) => ({\n ...field,\n mainField: field.mainField?.name,\n }))\n );\n\n/**\n * @internal\n * @description We extract the metadata values from the field layout, because these are editable by the user.\n */\nconst extractMetadata = (\n layout: EditLayout['layout'][number]\n): Array<Exclude<ConfigurationFormData['layout'], { name: '_TEMP_' }>[number]['children']> => {\n return layout.map((row) =>\n row.map(({ label, disabled, hint, placeholder, size, name, mainField }) => ({\n label,\n editable: !disabled,\n description: hint,\n mainField,\n placeholder,\n size,\n name,\n __temp_key__: '',\n }))\n );\n};\n\n/**\n * @internal\n * @description Each row of the layout has a max size of 12 (based on bootstrap grid system)\n * So in order to offer a better drop zone we add the _TEMP_ div to complete the remaining substract (12 - existing)\n */\nconst addTmpSpaceToLayout = (\n layout: ReturnType<typeof extractMetadata>\n): Array<ConfigurationFormData['layout'][number]['children']> => [\n ...layout.map((row) => {\n const totalSpaceTaken = row.reduce((acc, field) => acc + field.size, 0);\n\n if (totalSpaceTaken < 12) {\n return [\n ...row,\n {\n name: TEMP_FIELD_NAME,\n size: 12 - totalSpaceTaken,\n __temp_key__: '',\n } satisfies EditFieldSpacerLayout,\n ];\n }\n\n return row;\n }),\n];\n\n/**\n * @internal\n * @description At this point of the transformations we have Field[][], but each row for the form should have a __temp_key__\n * applied. This means we need to change it so `Field` is nested under the children property.\n */\nconst addTmpKeysToLayout = (\n layout: ReturnType<typeof addTmpSpaceToLayout>\n): ConfigurationFormData['layout'] => {\n const keys = generateNKeysBetween(undefined, undefined, layout.length);\n\n return layout.map((row, rowIndex) => {\n const fieldKeys = generateNKeysBetween(undefined, undefined, row.length);\n\n return {\n __temp_key__: keys[rowIndex],\n children: row.map((field, fieldIndex) => {\n return {\n ...field,\n __temp_key__: fieldKeys[fieldIndex],\n };\n }),\n };\n });\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Header\n * -----------------------------------------------------------------------------------------------*/\n\ninterface HeaderProps {\n name: string;\n}\n\nconst Header = ({ name }: HeaderProps) => {\n const { formatMessage } = useIntl();\n const modified = useForm('Header', (state) => state.modified);\n const isSubmitting = useForm('Header', (state) => state.isSubmitting);\n\n return (\n <Layouts.Header\n title={formatMessage(\n {\n id: getTranslation('components.SettingsViewWrapper.pluginHeader.title'),\n defaultMessage: `Configure the view - {name}`,\n },\n { name: capitalise(name) }\n )}\n subtitle={formatMessage({\n id: getTranslation('components.SettingsViewWrapper.pluginHeader.description.edit-settings'),\n defaultMessage: 'Customize how the edit view will look like.',\n })}\n navigationAction={<BackButton />}\n primaryAction={\n <Button disabled={!modified} loading={isSubmitting} type=\"submit\">\n {formatMessage({ id: 'global.save', defaultMessage: 'Save' })}\n </Button>\n }\n />\n );\n};\n\nexport { ConfigurationForm };\nexport type { ConfigurationFormProps, ConfigurationFormData, EditFieldSpacerLayout };\n"],"names":["ConfigurationForm","attributes","fieldSizes","layout","editLayout","onSubmit","components","settings","metadatas","formatMessage","useIntl","initialValues","React","useMemo","transformations","pipe","flattenPanels","replaceMainFieldWithNameOnly","extractMetadata","addTmpSpaceToLayout","addTmpKeysToLayout","relationOpenMode","_jsx","_Fragment","Main","_jsxs","Form","method","Header","name","displayName","Layouts","Content","Flex","alignItems","background","direction","gap","hasRadius","shadow","paddingTop","paddingBottom","paddingLeft","paddingRight","Typography","variant","tag","id","getTranslation","defaultMessage","Grid","Root","Item","col","xs","InputRenderer","type","label","hint","options","Object","entries","reduce","acc","key","attribute","ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD","includes","push","value","Divider","Fields","flat","map","row","field","mainField","disabled","placeholder","size","editable","description","__temp_key__","totalSpaceTaken","TEMP_FIELD_NAME","keys","generateNKeysBetween","undefined","length","rowIndex","fieldKeys","children","fieldIndex","modified","useForm","state","isSubmitting","title","capitalise","subtitle","navigationAction","BackButton","primaryAction","Button","loading"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Form.js","sources":["../../../../admin/src/components/ConfigurationForm/Form.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Form,\n FormProps,\n useForm,\n InputRenderer,\n BackButton,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport { Button, Divider, Flex, Grid, Main, Typography } from '@strapi/design-system';\nimport { generateNKeysBetween } from 'fractional-indexing';\nimport pipe from 'lodash/fp/pipe';\nimport { useIntl } from 'react-intl';\n\nimport { ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD } from '../../constants/attributes';\nimport { capitalise } from '../../utils/strings';\nimport { getTranslation } from '../../utils/translations';\n\nimport { Fields, FieldsProps, TEMP_FIELD_NAME } from './Fields';\n\nimport type { EditFieldLayout, EditLayout } from '../../hooks/useDocumentLayout';\n\n/* -------------------------------------------------------------------------------------------------\n * ConfigurationForm\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ConfigurationFormProps extends Pick<FieldsProps, 'attributes' | 'fieldSizes'> {\n layout: EditLayout;\n onSubmit: FormProps<ConfigurationFormData>['onSubmit'];\n}\n\n/**\n * Every key in EditFieldLayout is turned to optional never and then we overwrite the ones we are using.\n */\n\ntype EditFieldSpacerLayout = {\n [key in keyof Omit<EditFieldLayout, 'name' | 'size'>]?: never;\n} & {\n description?: never;\n editable?: never;\n name: '_TEMP_';\n size: number;\n __temp_key__: string;\n};\n\ninterface ConfigurationFormData extends Pick<EditLayout, 'settings'> {\n layout: Array<{\n __temp_key__: string;\n children: Array<\n | (Pick<EditFieldLayout, 'label' | 'size' | 'name' | 'placeholder' | 'mainField'> & {\n description: EditFieldLayout['hint'];\n editable: EditFieldLayout['disabled'];\n __temp_key__: string;\n })\n | EditFieldSpacerLayout\n >;\n }>;\n}\n\nconst ConfigurationForm = ({\n attributes,\n fieldSizes,\n layout: editLayout,\n onSubmit,\n}: ConfigurationFormProps) => {\n const { components, settings, layout, metadatas } = editLayout;\n\n const { formatMessage } = useIntl();\n\n const initialValues: ConfigurationFormData = React.useMemo(() => {\n const transformations = pipe(\n flattenPanels,\n replaceMainFieldWithNameOnly,\n extractMetadata,\n addTmpSpaceToLayout,\n addTmpKeysToLayout\n );\n\n return {\n layout: transformations(layout),\n settings: {\n ...settings,\n relationOpenMode: settings.relationOpenMode ?? 'modal',\n },\n };\n }, [layout, settings]);\n\n return (\n <>\n <Main>\n <Form initialValues={initialValues} onSubmit={onSubmit} method=\"PUT\">\n <Header name={settings.displayName ?? ''} />\n <Layouts.Content>\n <Flex\n alignItems=\"stretch\"\n background=\"neutral0\"\n direction=\"column\"\n gap={6}\n hasRadius\n shadow=\"tableShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTranslation('containers.SettingPage.settings'),\n defaultMessage: 'Settings',\n })}\n </Typography>\n <Grid.Root gap={4}>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <InputRenderer\n type=\"enumeration\"\n label={formatMessage({\n id: getTranslation('containers.SettingPage.editSettings.entry.title'),\n defaultMessage: 'Entry title',\n })}\n hint={formatMessage({\n id: getTranslation(\n 'containers.SettingPage.editSettings.entry.title.description'\n ),\n defaultMessage: 'Set the display field of your entry',\n })}\n name=\"settings.mainField\"\n options={Object.entries(attributes).reduce<\n Array<{ label: string; value: string }>\n >((acc, [key, attribute]) => {\n if (!attribute) {\n return acc;\n }\n\n /**\n * Create the list of attributes from the schema as to which can\n * be our `mainField` and dictate the display name of the schema\n * we're editing.\n */\n if (!ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD.includes(attribute.type)) {\n acc.push({\n label: key,\n value: key,\n });\n }\n\n return acc;\n }, [])}\n />\n </Grid.Item>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <InputRenderer\n type=\"enumeration\"\n label={formatMessage({\n id: getTranslation('containers.SettingPage.editSettings.relationOpenMode'),\n defaultMessage: 'Relation open behavior',\n })}\n hint={formatMessage({\n id: getTranslation(\n 'containers.SettingPage.editSettings.relationOpenMode.description'\n ),\n defaultMessage: 'Choose how relation entries open when clicked',\n })}\n name=\"settings.relationOpenMode\"\n options={[\n {\n label: formatMessage({\n id: getTranslation(\n 'containers.SettingPage.editSettings.relationOpenMode.modal'\n ),\n defaultMessage: 'Modal (default)',\n }),\n value: 'modal',\n },\n {\n label: formatMessage({\n id: getTranslation(\n 'containers.SettingPage.editSettings.relationOpenMode.page'\n ),\n defaultMessage: 'Navigate to page',\n }),\n value: 'page',\n },\n {\n label: formatMessage({\n id: getTranslation(\n 'containers.SettingPage.editSettings.relationOpenMode.newTab'\n ),\n defaultMessage: 'Open in new tab',\n }),\n value: 'newTab',\n },\n ]}\n />\n </Grid.Item>\n </Grid.Root>\n <Divider />\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Typography variant=\"delta\" tag=\"h3\">\n {formatMessage({\n id: getTranslation('containers.SettingPage.view'),\n defaultMessage: 'View',\n })}\n </Typography>\n <Fields\n attributes={attributes}\n components={components}\n fieldSizes={fieldSizes}\n metadatas={metadatas}\n />\n </Flex>\n </Flex>\n </Layouts.Content>\n </Form>\n </Main>\n </>\n );\n};\n\n/**\n * @internal\n * @description Panels don't exist in the layout, so we flatten by one.\n */\nconst flattenPanels = (layout: EditLayout['layout']): EditLayout['layout'][number] =>\n layout.flat(1);\n\n/**\n * @internal\n * @description We don't need the mainField object in the layout, we only need the name.\n */\nconst replaceMainFieldWithNameOnly = (layout: EditLayout['layout'][number]) =>\n layout.map((row) =>\n row.map((field) => ({\n ...field,\n mainField: field.mainField?.name,\n }))\n );\n\n/**\n * @internal\n * @description We extract the metadata values from the field layout, because these are editable by the user.\n */\nconst extractMetadata = (\n layout: EditLayout['layout'][number]\n): Array<Exclude<ConfigurationFormData['layout'], { name: '_TEMP_' }>[number]['children']> => {\n return layout.map((row) =>\n row.map(({ label, disabled, hint, placeholder, size, name, mainField }) => ({\n label,\n editable: !disabled,\n description: hint,\n mainField,\n placeholder,\n size,\n name,\n __temp_key__: '',\n }))\n );\n};\n\n/**\n * @internal\n * @description Each row of the layout has a max size of 12 (based on bootstrap grid system)\n * So in order to offer a better drop zone we add the _TEMP_ div to complete the remaining substract (12 - existing)\n */\nconst addTmpSpaceToLayout = (\n layout: ReturnType<typeof extractMetadata>\n): Array<ConfigurationFormData['layout'][number]['children']> => [\n ...layout.map((row) => {\n const totalSpaceTaken = row.reduce((acc, field) => acc + field.size, 0);\n\n if (totalSpaceTaken < 12) {\n return [\n ...row,\n {\n name: TEMP_FIELD_NAME,\n size: 12 - totalSpaceTaken,\n __temp_key__: '',\n } satisfies EditFieldSpacerLayout,\n ];\n }\n\n return row;\n }),\n];\n\n/**\n * @internal\n * @description At this point of the transformations we have Field[][], but each row for the form should have a __temp_key__\n * applied. This means we need to change it so `Field` is nested under the children property.\n */\nconst addTmpKeysToLayout = (\n layout: ReturnType<typeof addTmpSpaceToLayout>\n): ConfigurationFormData['layout'] => {\n const keys = generateNKeysBetween(undefined, undefined, layout.length);\n\n return layout.map((row, rowIndex) => {\n const fieldKeys = generateNKeysBetween(undefined, undefined, row.length);\n\n return {\n __temp_key__: keys[rowIndex],\n children: row.map((field, fieldIndex) => {\n return {\n ...field,\n __temp_key__: fieldKeys[fieldIndex],\n };\n }),\n };\n });\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Header\n * -----------------------------------------------------------------------------------------------*/\n\ninterface HeaderProps {\n name: string;\n}\n\nconst Header = ({ name }: HeaderProps) => {\n const { formatMessage } = useIntl();\n const modified = useForm('Header', (state) => state.modified);\n const isSubmitting = useForm('Header', (state) => state.isSubmitting);\n\n return (\n <Layouts.Header\n title={formatMessage(\n {\n id: getTranslation('components.SettingsViewWrapper.pluginHeader.title'),\n defaultMessage: `Configure the view - {name}`,\n },\n { name: capitalise(name) }\n )}\n subtitle={formatMessage({\n id: getTranslation('components.SettingsViewWrapper.pluginHeader.description.edit-settings'),\n defaultMessage: 'Customize how the edit view will look like.',\n })}\n navigationAction={<BackButton />}\n primaryAction={\n <Button disabled={!modified} loading={isSubmitting} type=\"submit\">\n {formatMessage({ id: 'global.save', defaultMessage: 'Save' })}\n </Button>\n }\n />\n );\n};\n\nexport { ConfigurationForm };\nexport type { ConfigurationFormProps, ConfigurationFormData, EditFieldSpacerLayout };\n"],"names":["ConfigurationForm","attributes","fieldSizes","layout","editLayout","onSubmit","components","settings","metadatas","formatMessage","useIntl","initialValues","React","useMemo","transformations","pipe","flattenPanels","replaceMainFieldWithNameOnly","extractMetadata","addTmpSpaceToLayout","addTmpKeysToLayout","relationOpenMode","_jsx","_Fragment","Main","_jsxs","Form","method","Header","name","displayName","Layouts","Content","Flex","alignItems","background","direction","gap","hasRadius","shadow","paddingTop","paddingBottom","paddingLeft","paddingRight","Typography","variant","tag","id","getTranslation","defaultMessage","Grid","Root","Item","col","xs","InputRenderer","type","label","hint","options","Object","entries","reduce","acc","key","attribute","ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD","includes","push","value","Divider","Fields","flat","map","row","field","mainField","disabled","placeholder","size","editable","description","__temp_key__","totalSpaceTaken","TEMP_FIELD_NAME","keys","generateNKeysBetween","undefined","length","rowIndex","fieldKeys","children","fieldIndex","modified","useForm","state","isSubmitting","title","capitalise","subtitle","navigationAction","BackButton","primaryAction","Button","loading"],"mappings":"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"}
|
|
@@ -9,7 +9,8 @@ var useContentManagerInitData = require('../hooks/useContentManagerInitData.js')
|
|
|
9
9
|
var hooks = require('../modules/hooks.js');
|
|
10
10
|
var translations = require('../utils/translations.js');
|
|
11
11
|
|
|
12
|
-
function
|
|
12
|
+
function _interopNamespace(e) {
|
|
13
|
+
if (e && e.__esModule) return e;
|
|
13
14
|
var n = Object.create(null);
|
|
14
15
|
if (e) {
|
|
15
16
|
Object.keys(e).forEach(function (k) {
|
|
@@ -26,7 +27,7 @@ function _interopNamespaceDefault(e) {
|
|
|
26
27
|
return Object.freeze(n);
|
|
27
28
|
}
|
|
28
29
|
|
|
29
|
-
var React__namespace = /*#__PURE__*/
|
|
30
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
30
31
|
|
|
31
32
|
const LeftMenu = ({ isFullPage = false })=>{
|
|
32
33
|
const [search, setSearch] = React__namespace.useState('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LeftMenu.js","sources":["../../../admin/src/components/LeftMenu.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { SubNav } from '@strapi/admin/strapi-admin';\nimport { Flex, Searchbar, useCollator, useFilter, Divider, Loader } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useContentManagerInitData } from '../hooks/useContentManagerInitData';\nimport { useTypedSelector } from '../modules/hooks';\nimport { getTranslation } from '../utils/translations';\n\nconst LeftMenu = ({ isFullPage = false }: { isFullPage?: boolean }) => {\n const [search, setSearch] = React.useState('');\n const { formatMessage, locale } = useIntl();\n\n // Initialize Content Manager data to ensure links are available\n const { isLoading } = useContentManagerInitData();\n\n const collectionTypeLinks = useTypedSelector(\n (state) => state['content-manager'].app.collectionTypeLinks\n );\n\n const singleTypeLinks = useTypedSelector((state) => state['content-manager'].app.singleTypeLinks);\n\n const { contains } = useFilter(locale, {\n sensitivity: 'base',\n });\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const menu = React.useMemo(\n () =>\n [\n {\n id: 'collectionTypes',\n title: formatMessage({\n id: getTranslation('components.LeftMenu.collection-types'),\n defaultMessage: 'Collection Types',\n }),\n searchable: true,\n links: collectionTypeLinks,\n },\n {\n id: 'singleTypes',\n title: formatMessage({\n id: getTranslation('components.LeftMenu.single-types'),\n defaultMessage: 'Single Types',\n }),\n searchable: true,\n links: singleTypeLinks,\n },\n ].map((section) => ({\n ...section,\n links: section.links\n /**\n * Filter by the search value\n */\n .filter((link) => contains(link.title, search.trim()))\n /**\n * Sort correctly using the language\n */\n .sort((a, b) => formatter.compare(a.title, b.title))\n /**\n * Apply the formated strings to the links from react-intl\n */\n .map((link) => {\n return {\n ...link,\n title: formatMessage({ id: link.title, defaultMessage: link.title }),\n };\n }),\n })),\n [collectionTypeLinks, search, singleTypeLinks, contains, formatMessage, formatter]\n );\n\n const handleClear = () => {\n setSearch('');\n };\n\n const handleChangeSearch = (event: React.ChangeEvent<HTMLInputElement>) => {\n setSearch(event.target.value);\n };\n\n const label = formatMessage({\n id: getTranslation('header.name'),\n defaultMessage: 'Content Manager',\n });\n\n // Show loading state while data is being fetched\n if (isLoading) {\n return (\n <SubNav.Main aria-label={label}>\n <SubNav.Header label={label} />\n <Divider />\n <Flex padding={4} justifyContent=\"center\">\n <Loader />\n </Flex>\n </SubNav.Main>\n );\n }\n\n return (\n <SubNav.Main aria-label={label}>\n {!isFullPage && (\n <>\n <SubNav.Header label={label} />\n <Divider />\n </>\n )}\n <SubNav.Content>\n {isFullPage && (\n <>\n <SubNav.Header label={label} />\n <Divider />\n </>\n )}\n <Flex\n paddingLeft={{\n initial: 3,\n large: 5,\n }}\n paddingRight={{\n initial: 3,\n large: 5,\n }}\n paddingTop={5}\n paddingBottom={{ initial: 1, large: 0 }}\n gap={3}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <Searchbar\n value={search}\n onChange={handleChangeSearch}\n onClear={handleClear}\n placeholder={formatMessage({\n id: 'search.placeholder',\n defaultMessage: 'Search',\n })}\n size=\"S\"\n // eslint-disable-next-line react/no-children-prop\n children={undefined}\n name={'search_contentType'}\n clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })}\n />\n </Flex>\n <SubNav.Sections>\n {menu.map((section) => {\n return (\n <SubNav.Section\n key={section.id}\n label={section.title}\n badgeLabel={section.links.length.toString()}\n >\n {section.links.map((link) => {\n return (\n <SubNav.Link\n key={link.uid}\n to={{\n pathname: link.to,\n }}\n label={link.title}\n />\n );\n })}\n </SubNav.Section>\n );\n })}\n </SubNav.Sections>\n </SubNav.Content>\n </SubNav.Main>\n );\n};\n\nexport { LeftMenu };\n"],"names":["LeftMenu","isFullPage","search","setSearch","React","useState","formatMessage","locale","useIntl","isLoading","useContentManagerInitData","collectionTypeLinks","useTypedSelector","state","app","singleTypeLinks","contains","useFilter","sensitivity","formatter","useCollator","menu","useMemo","id","title","getTranslation","defaultMessage","searchable","links","map","section","filter","link","trim","sort","a","b","compare","handleClear","handleChangeSearch","event","target","value","label","_jsxs","SubNav","Main","aria-label","_jsx","Header","Divider","Flex","padding","justifyContent","Loader","_Fragment","Content","paddingLeft","initial","large","paddingRight","paddingTop","paddingBottom","gap","direction","alignItems","Searchbar","onChange","onClear","placeholder","size","children","undefined","name","clearLabel","Sections","Section","badgeLabel","length","toString","Link","to","pathname","uid"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LeftMenu.js","sources":["../../../admin/src/components/LeftMenu.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { SubNav } from '@strapi/admin/strapi-admin';\nimport { Flex, Searchbar, useCollator, useFilter, Divider, Loader } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useContentManagerInitData } from '../hooks/useContentManagerInitData';\nimport { useTypedSelector } from '../modules/hooks';\nimport { getTranslation } from '../utils/translations';\n\nconst LeftMenu = ({ isFullPage = false }: { isFullPage?: boolean }) => {\n const [search, setSearch] = React.useState('');\n const { formatMessage, locale } = useIntl();\n\n // Initialize Content Manager data to ensure links are available\n const { isLoading } = useContentManagerInitData();\n\n const collectionTypeLinks = useTypedSelector(\n (state) => state['content-manager'].app.collectionTypeLinks\n );\n\n const singleTypeLinks = useTypedSelector((state) => state['content-manager'].app.singleTypeLinks);\n\n const { contains } = useFilter(locale, {\n sensitivity: 'base',\n });\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const menu = React.useMemo(\n () =>\n [\n {\n id: 'collectionTypes',\n title: formatMessage({\n id: getTranslation('components.LeftMenu.collection-types'),\n defaultMessage: 'Collection Types',\n }),\n searchable: true,\n links: collectionTypeLinks,\n },\n {\n id: 'singleTypes',\n title: formatMessage({\n id: getTranslation('components.LeftMenu.single-types'),\n defaultMessage: 'Single Types',\n }),\n searchable: true,\n links: singleTypeLinks,\n },\n ].map((section) => ({\n ...section,\n links: section.links\n /**\n * Filter by the search value\n */\n .filter((link) => contains(link.title, search.trim()))\n /**\n * Sort correctly using the language\n */\n .sort((a, b) => formatter.compare(a.title, b.title))\n /**\n * Apply the formated strings to the links from react-intl\n */\n .map((link) => {\n return {\n ...link,\n title: formatMessage({ id: link.title, defaultMessage: link.title }),\n };\n }),\n })),\n [collectionTypeLinks, search, singleTypeLinks, contains, formatMessage, formatter]\n );\n\n const handleClear = () => {\n setSearch('');\n };\n\n const handleChangeSearch = (event: React.ChangeEvent<HTMLInputElement>) => {\n setSearch(event.target.value);\n };\n\n const label = formatMessage({\n id: getTranslation('header.name'),\n defaultMessage: 'Content Manager',\n });\n\n // Show loading state while data is being fetched\n if (isLoading) {\n return (\n <SubNav.Main aria-label={label}>\n <SubNav.Header label={label} />\n <Divider />\n <Flex padding={4} justifyContent=\"center\">\n <Loader />\n </Flex>\n </SubNav.Main>\n );\n }\n\n return (\n <SubNav.Main aria-label={label}>\n {!isFullPage && (\n <>\n <SubNav.Header label={label} />\n <Divider />\n </>\n )}\n <SubNav.Content>\n {isFullPage && (\n <>\n <SubNav.Header label={label} />\n <Divider />\n </>\n )}\n <Flex\n paddingLeft={{\n initial: 3,\n large: 5,\n }}\n paddingRight={{\n initial: 3,\n large: 5,\n }}\n paddingTop={5}\n paddingBottom={{ initial: 1, large: 0 }}\n gap={3}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <Searchbar\n value={search}\n onChange={handleChangeSearch}\n onClear={handleClear}\n placeholder={formatMessage({\n id: 'search.placeholder',\n defaultMessage: 'Search',\n })}\n size=\"S\"\n // eslint-disable-next-line react/no-children-prop\n children={undefined}\n name={'search_contentType'}\n clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })}\n />\n </Flex>\n <SubNav.Sections>\n {menu.map((section) => {\n return (\n <SubNav.Section\n key={section.id}\n label={section.title}\n badgeLabel={section.links.length.toString()}\n >\n {section.links.map((link) => {\n return (\n <SubNav.Link\n key={link.uid}\n to={{\n pathname: link.to,\n }}\n label={link.title}\n />\n );\n })}\n </SubNav.Section>\n );\n })}\n </SubNav.Sections>\n </SubNav.Content>\n </SubNav.Main>\n );\n};\n\nexport { LeftMenu };\n"],"names":["LeftMenu","isFullPage","search","setSearch","React","useState","formatMessage","locale","useIntl","isLoading","useContentManagerInitData","collectionTypeLinks","useTypedSelector","state","app","singleTypeLinks","contains","useFilter","sensitivity","formatter","useCollator","menu","useMemo","id","title","getTranslation","defaultMessage","searchable","links","map","section","filter","link","trim","sort","a","b","compare","handleClear","handleChangeSearch","event","target","value","label","_jsxs","SubNav","Main","aria-label","_jsx","Header","Divider","Flex","padding","justifyContent","Loader","_Fragment","Content","paddingLeft","initial","large","paddingRight","paddingTop","paddingBottom","gap","direction","alignItems","Searchbar","onChange","onClear","placeholder","size","children","undefined","name","clearLabel","Sections","Section","badgeLabel","length","toString","Link","to","pathname","uid"],"mappings":"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"}
|
|
@@ -5,7 +5,8 @@ var React = require('react');
|
|
|
5
5
|
var dateFns = require('date-fns');
|
|
6
6
|
var reactIntl = require('react-intl');
|
|
7
7
|
|
|
8
|
-
function
|
|
8
|
+
function _interopNamespace(e) {
|
|
9
|
+
if (e && e.__esModule) return e;
|
|
9
10
|
var n = Object.create(null);
|
|
10
11
|
if (e) {
|
|
11
12
|
Object.keys(e).forEach(function (k) {
|
|
@@ -22,7 +23,7 @@ function _interopNamespaceDefault(e) {
|
|
|
22
23
|
return Object.freeze(n);
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
var React__namespace = /*#__PURE__*/
|
|
26
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
26
27
|
|
|
27
28
|
const intervals = [
|
|
28
29
|
'years',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RelativeTime.js","sources":["../../../admin/src/components/RelativeTime.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Duration, intervalToDuration, isPast } from 'date-fns';\nimport { useIntl } from 'react-intl';\n\nconst intervals: Array<keyof Duration> = ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];\n\ninterface CustomInterval {\n unit: keyof Duration;\n text: string;\n threshold: number;\n}\n\ninterface RelativeTimeProps extends React.ComponentPropsWithoutRef<'time'> {\n timestamp: Date;\n customIntervals?: CustomInterval[];\n}\n\n/**\n * Displays the relative time between a given timestamp and the current time.\n * You can display a custom message for given time intervals by passing an array of custom intervals.\n *\n * @example\n * ```jsx\n * <caption>Display \"last hour\" if the timestamp is less than an hour ago</caption>\n * <RelativeTime\n * timestamp={new Date('2021-01-01')}\n * customIntervals={[\n * { unit: 'hours', threshold: 1, text: 'last hour' },\n * ]}\n * ```\n */\nconst RelativeTime = React.forwardRef<HTMLTimeElement, RelativeTimeProps>(\n ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {\n const { formatRelativeTime, formatDate, formatTime } = useIntl();\n\n /**\n * TODO: make this auto-update, like a clock.\n */\n const interval = intervalToDuration({\n start: timestamp,\n end: Date.now(),\n // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.\n }) as Required<Duration>;\n\n const unit =\n intervals.find((intervalUnit) => {\n return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);\n }) ?? 'seconds';\n\n const relativeTime = isPast(timestamp) ? -interval[unit] : interval[unit];\n\n // Display custom text if interval is less than the threshold\n const customInterval = customIntervals.find(\n (custom) => interval[custom.unit] < custom.threshold\n );\n\n const displayText = customInterval\n ? customInterval.text\n : formatRelativeTime(relativeTime, unit, { numeric: 'auto' });\n\n return (\n <time\n ref={forwardedRef}\n dateTime={timestamp.toISOString()}\n role=\"time\"\n title={`${formatDate(timestamp)} ${formatTime(timestamp)}`}\n {...restProps}\n >\n {displayText}\n </time>\n );\n }\n);\n\nexport { RelativeTime };\nexport type { CustomInterval, RelativeTimeProps };\n"],"names":["intervals","RelativeTime","React","forwardRef","timestamp","customIntervals","restProps","forwardedRef","formatRelativeTime","formatDate","formatTime","useIntl","interval","intervalToDuration","start","end","Date","now","unit","find","intervalUnit","Object","keys","includes","relativeTime","isPast","customInterval","custom","threshold","displayText","text","numeric","_jsx","time","ref","dateTime","toISOString","role","title"],"mappings":"
|
|
1
|
+
{"version":3,"file":"RelativeTime.js","sources":["../../../admin/src/components/RelativeTime.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Duration, intervalToDuration, isPast } from 'date-fns';\nimport { useIntl } from 'react-intl';\n\nconst intervals: Array<keyof Duration> = ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];\n\ninterface CustomInterval {\n unit: keyof Duration;\n text: string;\n threshold: number;\n}\n\ninterface RelativeTimeProps extends React.ComponentPropsWithoutRef<'time'> {\n timestamp: Date;\n customIntervals?: CustomInterval[];\n}\n\n/**\n * Displays the relative time between a given timestamp and the current time.\n * You can display a custom message for given time intervals by passing an array of custom intervals.\n *\n * @example\n * ```jsx\n * <caption>Display \"last hour\" if the timestamp is less than an hour ago</caption>\n * <RelativeTime\n * timestamp={new Date('2021-01-01')}\n * customIntervals={[\n * { unit: 'hours', threshold: 1, text: 'last hour' },\n * ]}\n * ```\n */\nconst RelativeTime = React.forwardRef<HTMLTimeElement, RelativeTimeProps>(\n ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {\n const { formatRelativeTime, formatDate, formatTime } = useIntl();\n\n /**\n * TODO: make this auto-update, like a clock.\n */\n const interval = intervalToDuration({\n start: timestamp,\n end: Date.now(),\n // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.\n }) as Required<Duration>;\n\n const unit =\n intervals.find((intervalUnit) => {\n return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);\n }) ?? 'seconds';\n\n const relativeTime = isPast(timestamp) ? -interval[unit] : interval[unit];\n\n // Display custom text if interval is less than the threshold\n const customInterval = customIntervals.find(\n (custom) => interval[custom.unit] < custom.threshold\n );\n\n const displayText = customInterval\n ? customInterval.text\n : formatRelativeTime(relativeTime, unit, { numeric: 'auto' });\n\n return (\n <time\n ref={forwardedRef}\n dateTime={timestamp.toISOString()}\n role=\"time\"\n title={`${formatDate(timestamp)} ${formatTime(timestamp)}`}\n {...restProps}\n >\n {displayText}\n </time>\n );\n }\n);\n\nexport { RelativeTime };\nexport type { CustomInterval, RelativeTimeProps };\n"],"names":["intervals","RelativeTime","React","forwardRef","timestamp","customIntervals","restProps","forwardedRef","formatRelativeTime","formatDate","formatTime","useIntl","interval","intervalToDuration","start","end","Date","now","unit","find","intervalUnit","Object","keys","includes","relativeTime","isPast","customInterval","custom","threshold","displayText","text","numeric","_jsx","time","ref","dateTime","toISOString","role","title"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,SAAAA,GAAmC;AAAC,IAAA,OAAA;AAAS,IAAA,QAAA;AAAU,IAAA,MAAA;AAAQ,IAAA,OAAA;AAAS,IAAA,SAAA;AAAW,IAAA;AAAU,CAAA;AAanG;;;;;;;;;;;;;AAaC,IACD,MAAMC,YAAAA,iBAAeC,gBAAAA,CAAMC,UAAU,CACnC,CAAC,EAAEC,SAAS,EAAEC,eAAAA,GAAkB,EAAE,EAAE,GAAGC,WAAW,EAAEC,YAAAA,GAAAA;AAClD,IAAA,MAAM,EAAEC,kBAAkB,EAAEC,UAAU,EAAEC,UAAU,EAAE,GAAGC,iBAAAA,EAAAA;AAEvD;;QAGA,MAAMC,WAAWC,0BAAAA,CAAmB;QAClCC,KAAAA,EAAOV,SAAAA;AACPW,QAAAA,GAAAA,EAAKC,KAAKC,GAAG;AAEf,KAAA,CAAA;AAEA,IAAA,MAAMC,IAAAA,GACJlB,SAAAA,CAAUmB,IAAI,CAAC,CAACC,YAAAA,GAAAA;QACd,OAAOR,QAAQ,CAACQ,YAAAA,CAAa,GAAG,CAAA,IAAKC,OAAOC,IAAI,CAACV,QAAAA,CAAAA,CAAUW,QAAQ,CAACH,YAAAA,CAAAA;IACtE,CAAA,CAAA,IAAM,SAAA;IAER,MAAMI,YAAAA,GAAeC,cAAAA,CAAOrB,SAAAA,CAAAA,GAAa,CAACQ,QAAQ,CAACM,IAAAA,CAAK,GAAGN,QAAQ,CAACM,IAAAA,CAAK;;AAGzE,IAAA,MAAMQ,cAAAA,GAAiBrB,eAAAA,CAAgBc,IAAI,CACzC,CAACQ,MAAAA,GAAWf,QAAQ,CAACe,MAAAA,CAAOT,IAAI,CAAC,GAAGS,OAAOC,SAAS,CAAA;AAGtD,IAAA,MAAMC,cAAcH,cAAAA,GAChBA,cAAAA,CAAeI,IAAI,GACnBtB,kBAAAA,CAAmBgB,cAAcN,IAAAA,EAAM;QAAEa,OAAAA,EAAS;AAAO,KAAA,CAAA;AAE7D,IAAA,qBACEC,cAAA,CAACC,MAAAA,EAAAA;QACCC,GAAAA,EAAK3B,YAAAA;AACL4B,QAAAA,QAAAA,EAAU/B,UAAUgC,WAAW,EAAA;QAC/BC,IAAAA,EAAK,MAAA;AACLC,QAAAA,KAAAA,EAAO,GAAG7B,UAAAA,CAAWL,SAAAA,CAAAA,CAAW,CAAC,EAAEM,WAAWN,SAAAA,CAAAA,CAAAA,CAAY;AACzD,QAAA,GAAGE,SAAS;AAEZuB,QAAAA,QAAAA,EAAAA;;AAGP,CAAA;;;;"}
|
|
@@ -12,7 +12,8 @@ var DocumentStatus = require('../pages/EditView/components/DocumentStatus.js');
|
|
|
12
12
|
var homepage = require('../services/homepage.js');
|
|
13
13
|
var RelativeTime = require('./RelativeTime.js');
|
|
14
14
|
|
|
15
|
-
function
|
|
15
|
+
function _interopNamespace(e) {
|
|
16
|
+
if (e && e.__esModule) return e;
|
|
16
17
|
var n = Object.create(null);
|
|
17
18
|
if (e) {
|
|
18
19
|
Object.keys(e).forEach(function (k) {
|
|
@@ -29,7 +30,7 @@ function _interopNamespaceDefault(e) {
|
|
|
29
30
|
return Object.freeze(n);
|
|
30
31
|
}
|
|
31
32
|
|
|
32
|
-
var React__namespace = /*#__PURE__*/
|
|
33
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
33
34
|
|
|
34
35
|
const BASE_MAX_WIDTH = '14.4rem';
|
|
35
36
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Widgets.js","sources":["../../../admin/src/components/Widgets.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Widget, useTracking, useGetCountDocumentsQuery } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n IconButton,\n Table,\n Tbody,\n Td,\n Tr,\n Typography,\n Portal,\n} from '@strapi/design-system';\nimport { Pencil } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link, useNavigate } from 'react-router-dom';\nimport { styled, DefaultTheme } from 'styled-components';\n\nimport { DocumentStatus } from '../pages/EditView/components/DocumentStatus';\nimport { useGetRecentDocumentsQuery } from '../services/homepage';\n\nimport { RelativeTime } from './RelativeTime';\n\nimport type { RecentDocument } from '../../../shared/contracts/homepage';\n\nconst BASE_MAX_WIDTH = '14.4rem';\n\n/**\n * Calculate dynamic max-width based on column span\n * Base width is 14.4rem for 6 columns, scale proportionally\n */\nconst calculateDynamicMaxWidth = (columnWidth: number = 4): string => {\n const baseColumnWidth = 4;\n const baseMaxWidth = 14.4; // rem\n const calculatedWidth = (baseMaxWidth * columnWidth) / baseColumnWidth;\n return `${Math.round(calculatedWidth * 10) / 10}rem`;\n};\n\nconst CellTypography = styled(Typography)<{ $maxWidth?: string }>`\n display: block;\n max-width: ${({ $maxWidth }) => $maxWidth || BASE_MAX_WIDTH};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst RecentDocumentsTable = ({\n documents,\n type,\n dynamicMaxWidth = BASE_MAX_WIDTH,\n}: {\n documents: RecentDocument[];\n type: 'edited' | 'published';\n dynamicMaxWidth?: string;\n}) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const navigate = useNavigate();\n\n const getEditViewLink = (document: RecentDocument): string => {\n const isSingleType = document.kind === 'singleType';\n const kindPath = isSingleType ? 'single-types' : 'collection-types';\n const queryParams = document.locale ? `?plugins[i18n][locale]=${document.locale}` : '';\n\n return `/content-manager/${kindPath}/${document.contentTypeUid}${isSingleType ? '' : '/' + document.documentId}${queryParams}`;\n };\n\n const handleRowClick = (document: RecentDocument) => () => {\n trackUsage('willEditEntryFromHome', {\n entryType: type,\n });\n const link = getEditViewLink(document);\n navigate(link);\n };\n\n return (\n <Table colCount={5} rowCount={documents?.length ?? 0}>\n <Tbody>\n {documents?.map((document) => (\n <Tr\n onClick={handleRowClick(document)}\n cursor=\"pointer\"\n key={`${document.documentId}-${document.locale ?? 'default'}`}\n >\n <Td>\n <CellTypography\n title={document.title}\n variant=\"omega\"\n textColor=\"neutral800\"\n $maxWidth={dynamicMaxWidth}\n >\n {document.title}\n </CellTypography>\n </Td>\n <Td>\n <CellTypography variant=\"omega\" textColor=\"neutral600\" $maxWidth={dynamicMaxWidth}>\n {document.kind === 'singleType'\n ? formatMessage({\n id: 'content-manager.widget.last-edited.single-type',\n defaultMessage: 'Single-Type',\n })\n : formatMessage({\n id: document.contentTypeDisplayName,\n defaultMessage: document.contentTypeDisplayName,\n })}\n </CellTypography>\n </Td>\n <Td>\n <Box display=\"inline-block\">\n {document.status ? (\n <DocumentStatus status={document.status} />\n ) : (\n <Typography textColor=\"neutral600\" aria-hidden>\n -\n </Typography>\n )}\n </Box>\n </Td>\n <Td>\n <Typography textColor=\"neutral600\">\n <RelativeTime timestamp={new Date(document.updatedAt)} />\n </Typography>\n </Td>\n <Td onClick={(e) => e.stopPropagation()}>\n <Box display=\"inline-block\">\n <IconButton\n tag={Link}\n to={getEditViewLink(document)}\n onClick={() => trackUsage('willEditEntryFromHome', { type })}\n label={formatMessage({\n id: 'content-manager.actions.edit.label',\n defaultMessage: 'Edit',\n })}\n variant=\"ghost\"\n >\n <Pencil />\n </IconButton>\n </Box>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LastEditedWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst LastEditedWidget = ({ columnWidth = 6 }: { columnWidth?: number }) => {\n const { formatMessage } = useIntl();\n const { data, isLoading, error } = useGetRecentDocumentsQuery({ action: 'update' });\n\n const dynamicMaxWidth = calculateDynamicMaxWidth(columnWidth);\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error || !data) {\n return <Widget.Error />;\n }\n\n if (data.length === 0) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'content-manager.widget.last-edited.no-data',\n defaultMessage: 'No edited entries',\n })}\n </Widget.NoData>\n );\n }\n\n return <RecentDocumentsTable documents={data} type=\"edited\" dynamicMaxWidth={dynamicMaxWidth} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LastPublishedWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst LastPublishedWidget = ({ columnWidth = 6 }: { columnWidth?: number }) => {\n const { formatMessage } = useIntl();\n const { data, isLoading, error } = useGetRecentDocumentsQuery({ action: 'publish' });\n\n const dynamicMaxWidth = calculateDynamicMaxWidth(columnWidth);\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error || !data) {\n return <Widget.Error />;\n }\n\n if (data.length === 0) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'content-manager.widget.last-published.no-data',\n defaultMessage: 'No published entries',\n })}\n </Widget.NoData>\n );\n }\n\n return (\n <RecentDocumentsTable documents={data} type=\"published\" dynamicMaxWidth={dynamicMaxWidth} />\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ChartEntriesWidget\n * -----------------------------------------------------------------------------------------------*/\nconst RADIUS = 80;\nconst STROKE = 10;\nconst CIRCUMFERENCE = 2 * Math.PI * (RADIUS - STROKE / 2);\n\ntype ThemeColor = keyof DefaultTheme['colors'];\n\nconst ArcChart = styled.circle<{ $arcColor: ThemeColor }>`\n stroke: ${({ theme, $arcColor }) => theme.colors[$arcColor]};\n`;\n\nconst TextChart = styled.tspan<{ $textColor: ThemeColor }>`\n text-transform: lowercase;\n fill: ${({ theme, $textColor }) => theme.colors[$textColor]};\n`;\n\nconst KeyChartItem = styled(Flex)`\n width: 100%;\n\n ${({ theme }) => theme.breakpoints.small} {\n width: auto;\n }\n`;\n\ninterface ChartData {\n label: string;\n count: number;\n color: ThemeColor;\n}\n\nconst DonutChartSVG = ({ data }: { data: ChartData[] }) => {\n const { locale } = useIntl();\n const { formatMessage } = useIntl();\n const total = data.reduce((acc, curr) => acc + curr.count, 0);\n const [tooltip, setTooltip] = React.useState<{\n visible: boolean;\n x: number;\n y: number;\n value: ChartData | null;\n isTouch?: boolean;\n }>({ visible: false, x: 0, y: 0, value: null });\n\n let cumulativePercent = 0;\n\n const handleMouseOver = (e: React.MouseEvent<SVGCircleElement>, value: ChartData) => {\n setTooltip({\n visible: true,\n x: e.clientX,\n y: e.clientY,\n value,\n });\n };\n const handleMouseOut = () => {\n setTooltip((t) => ({ ...t, visible: false }));\n };\n\n const handleFocus = (e: React.FocusEvent<SVGCircleElement>, value: ChartData) => {\n setTooltip({\n visible: true,\n x:\n e.currentTarget.getBoundingClientRect().width / 2 +\n e.currentTarget.getBoundingClientRect().left,\n y:\n e.currentTarget.getBoundingClientRect().height +\n e.currentTarget.getBoundingClientRect().top,\n value,\n });\n };\n\n return (\n <Flex direction=\"column\" gap={6} margin=\"auto\">\n <svg\n width={RADIUS * 2}\n height={RADIUS * 2}\n viewBox={`0 0 ${RADIUS * 2} ${RADIUS * 2}`}\n style={{ position: 'relative', zIndex: 1 }}\n >\n <g transform={`rotate(-90 ${RADIUS} ${RADIUS})`}>\n {data.map((value) => {\n const percent = (value.count / total) * 100;\n const arcLength = (percent / 100) * CIRCUMFERENCE;\n const dashArray = `${arcLength} ${CIRCUMFERENCE - arcLength}`;\n const dashOffset = CIRCUMFERENCE * (1 - cumulativePercent / 100);\n const el = (\n <ArcChart\n key={value.label}\n cx={RADIUS}\n cy={RADIUS}\n r={RADIUS - STROKE / 2}\n fill=\"none\"\n strokeWidth={STROKE}\n strokeDasharray={dashArray}\n strokeDashoffset={dashOffset}\n style={{ transition: 'stroke-dashoffset 0.3s', cursor: 'pointer' }}\n tabIndex={0}\n aria-describedby={tooltip.visible ? 'chart-tooltip' : undefined}\n onFocus={(e) => handleFocus(e, value)}\n onBlur={handleMouseOut}\n onMouseMove={(e) => handleMouseOver(e, value)}\n onMouseLeave={handleMouseOut}\n $arcColor={value.color}\n />\n );\n cumulativePercent += percent;\n return el;\n })}\n </g>\n <text x={RADIUS} y={RADIUS} textAnchor=\"middle\" fontSize=\"2.4rem\" fontWeight=\"bold\">\n <TextChart x={RADIUS} dy=\"0\" $textColor=\"neutral800\">\n {new Intl.NumberFormat(locale, {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(total)}\n </TextChart>\n <TextChart\n x={RADIUS}\n dy=\"1.4em\"\n fontSize=\"1.4rem\"\n fontWeight=\"normal\"\n $textColor=\"neutral600\"\n >\n {formatMessage(\n {\n id: 'content-manager.widget.chart-entries.count.label',\n defaultMessage: '{count, plural, =0 {entries} one {entry} other {entries}}',\n },\n { count: total }\n )}\n </TextChart>\n </text>\n </svg>\n {tooltip.visible && tooltip.value && (\n <Portal\n style={{\n position: 'fixed',\n left: 16,\n top: 16,\n zIndex: 2,\n transform: `translate(${tooltip.x}px, ${tooltip.y}px)`,\n }}\n data-testid=\"entries-chart-tooltip\"\n >\n <Box\n background=\"neutral900\"\n padding={2}\n borderRadius={1}\n textAlign=\"center\"\n role=\"tooltip\"\n aria-live=\"polite\"\n >\n <Typography textColor=\"neutral0\">\n {formatMessage(\n {\n id: 'content-manager.widget.chart-entries.tooltip',\n defaultMessage: '{count} items',\n },\n {\n count: tooltip.value.count,\n label: tooltip.value.label,\n }\n )}\n </Typography>\n </Box>\n </Portal>\n )}\n <Flex gap={4} wrap=\"wrap\">\n {data.map(\n (value) =>\n value.count > 0 && (\n <KeyChartItem gap={1} key={value.label}>\n <Box background={value.color} padding={2} borderRadius={1} />\n <Typography variant=\"pi\">{value.label}</Typography>\n </KeyChartItem>\n )\n )}\n </Flex>\n </Flex>\n );\n};\n\nconst ChartEntriesWidget = () => {\n const { formatMessage } = useIntl();\n const { data: countDocuments, isLoading, error } = useGetCountDocumentsQuery();\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error) {\n return <Widget.Error />;\n }\n\n const { draft, published, modified } = countDocuments ?? {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n const total = draft + published + modified;\n\n if (!total) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'content-manager.widget.last-published.no-data',\n defaultMessage: 'No published entries',\n })}\n </Widget.NoData>\n );\n }\n\n return (\n <Flex minHeight=\"100%\">\n <DonutChartSVG\n data={[\n {\n label: formatMessage({\n id: 'content-manager.containers.List.draft',\n defaultMessage: 'Draft',\n }),\n count: draft,\n color: 'secondary500',\n },\n {\n label: formatMessage({\n id: 'content-manager.containers.List.modified',\n defaultMessage: 'Modified',\n }),\n count: modified,\n color: 'alternative500',\n },\n {\n label: formatMessage({\n id: 'content-manager.containers.List.published',\n defaultMessage: 'Published',\n }),\n count: published,\n color: 'success500',\n },\n ]}\n />\n </Flex>\n );\n};\n\nexport { ChartEntriesWidget, LastEditedWidget, LastPublishedWidget };\n"],"names":["BASE_MAX_WIDTH","calculateDynamicMaxWidth","columnWidth","baseColumnWidth","baseMaxWidth","calculatedWidth","Math","round","CellTypography","styled","Typography","$maxWidth","RecentDocumentsTable","documents","type","dynamicMaxWidth","formatMessage","useIntl","trackUsage","useTracking","navigate","useNavigate","getEditViewLink","document","isSingleType","kind","kindPath","queryParams","locale","contentTypeUid","documentId","handleRowClick","entryType","link","_jsx","Table","colCount","rowCount","length","Tbody","map","_jsxs","Tr","onClick","cursor","Td","title","variant","textColor","id","defaultMessage","contentTypeDisplayName","Box","display","status","DocumentStatus","aria-hidden","RelativeTime","timestamp","Date","updatedAt","e","stopPropagation","IconButton","tag","Link","to","label","Pencil","LastEditedWidget","data","isLoading","error","useGetRecentDocumentsQuery","action","Widget","Loading","Error","NoData","LastPublishedWidget","RADIUS","STROKE","CIRCUMFERENCE","PI","ArcChart","circle","theme","$arcColor","colors","TextChart","tspan","$textColor","KeyChartItem","Flex","breakpoints","small","DonutChartSVG","total","reduce","acc","curr","count","tooltip","setTooltip","React","useState","visible","x","y","value","cumulativePercent","handleMouseOver","clientX","clientY","handleMouseOut","t","handleFocus","currentTarget","getBoundingClientRect","width","left","height","top","direction","gap","margin","svg","viewBox","style","position","zIndex","g","transform","percent","arcLength","dashArray","dashOffset","el","cx","cy","r","fill","strokeWidth","strokeDasharray","strokeDashoffset","transition","tabIndex","aria-describedby","undefined","onFocus","onBlur","onMouseMove","onMouseLeave","color","text","textAnchor","fontSize","fontWeight","dy","Intl","NumberFormat","notation","maximumFractionDigits","format","Portal","data-testid","background","padding","borderRadius","textAlign","role","aria-live","wrap","ChartEntriesWidget","countDocuments","useGetCountDocumentsQuery","draft","published","modified","minHeight"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Widgets.js","sources":["../../../admin/src/components/Widgets.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Widget, useTracking, useGetCountDocumentsQuery } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n IconButton,\n Table,\n Tbody,\n Td,\n Tr,\n Typography,\n Portal,\n} from '@strapi/design-system';\nimport { Pencil } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link, useNavigate } from 'react-router-dom';\nimport { styled, DefaultTheme } from 'styled-components';\n\nimport { DocumentStatus } from '../pages/EditView/components/DocumentStatus';\nimport { useGetRecentDocumentsQuery } from '../services/homepage';\n\nimport { RelativeTime } from './RelativeTime';\n\nimport type { RecentDocument } from '../../../shared/contracts/homepage';\n\nconst BASE_MAX_WIDTH = '14.4rem';\n\n/**\n * Calculate dynamic max-width based on column span\n * Base width is 14.4rem for 6 columns, scale proportionally\n */\nconst calculateDynamicMaxWidth = (columnWidth: number = 4): string => {\n const baseColumnWidth = 4;\n const baseMaxWidth = 14.4; // rem\n const calculatedWidth = (baseMaxWidth * columnWidth) / baseColumnWidth;\n return `${Math.round(calculatedWidth * 10) / 10}rem`;\n};\n\nconst CellTypography = styled(Typography)<{ $maxWidth?: string }>`\n display: block;\n max-width: ${({ $maxWidth }) => $maxWidth || BASE_MAX_WIDTH};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst RecentDocumentsTable = ({\n documents,\n type,\n dynamicMaxWidth = BASE_MAX_WIDTH,\n}: {\n documents: RecentDocument[];\n type: 'edited' | 'published';\n dynamicMaxWidth?: string;\n}) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const navigate = useNavigate();\n\n const getEditViewLink = (document: RecentDocument): string => {\n const isSingleType = document.kind === 'singleType';\n const kindPath = isSingleType ? 'single-types' : 'collection-types';\n const queryParams = document.locale ? `?plugins[i18n][locale]=${document.locale}` : '';\n\n return `/content-manager/${kindPath}/${document.contentTypeUid}${isSingleType ? '' : '/' + document.documentId}${queryParams}`;\n };\n\n const handleRowClick = (document: RecentDocument) => () => {\n trackUsage('willEditEntryFromHome', {\n entryType: type,\n });\n const link = getEditViewLink(document);\n navigate(link);\n };\n\n return (\n <Table colCount={5} rowCount={documents?.length ?? 0}>\n <Tbody>\n {documents?.map((document) => (\n <Tr\n onClick={handleRowClick(document)}\n cursor=\"pointer\"\n key={`${document.documentId}-${document.locale ?? 'default'}`}\n >\n <Td>\n <CellTypography\n title={document.title}\n variant=\"omega\"\n textColor=\"neutral800\"\n $maxWidth={dynamicMaxWidth}\n >\n {document.title}\n </CellTypography>\n </Td>\n <Td>\n <CellTypography variant=\"omega\" textColor=\"neutral600\" $maxWidth={dynamicMaxWidth}>\n {document.kind === 'singleType'\n ? formatMessage({\n id: 'content-manager.widget.last-edited.single-type',\n defaultMessage: 'Single-Type',\n })\n : formatMessage({\n id: document.contentTypeDisplayName,\n defaultMessage: document.contentTypeDisplayName,\n })}\n </CellTypography>\n </Td>\n <Td>\n <Box display=\"inline-block\">\n {document.status ? (\n <DocumentStatus status={document.status} />\n ) : (\n <Typography textColor=\"neutral600\" aria-hidden>\n -\n </Typography>\n )}\n </Box>\n </Td>\n <Td>\n <Typography textColor=\"neutral600\">\n <RelativeTime timestamp={new Date(document.updatedAt)} />\n </Typography>\n </Td>\n <Td onClick={(e) => e.stopPropagation()}>\n <Box display=\"inline-block\">\n <IconButton\n tag={Link}\n to={getEditViewLink(document)}\n onClick={() => trackUsage('willEditEntryFromHome', { type })}\n label={formatMessage({\n id: 'content-manager.actions.edit.label',\n defaultMessage: 'Edit',\n })}\n variant=\"ghost\"\n >\n <Pencil />\n </IconButton>\n </Box>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LastEditedWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst LastEditedWidget = ({ columnWidth = 6 }: { columnWidth?: number }) => {\n const { formatMessage } = useIntl();\n const { data, isLoading, error } = useGetRecentDocumentsQuery({ action: 'update' });\n\n const dynamicMaxWidth = calculateDynamicMaxWidth(columnWidth);\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error || !data) {\n return <Widget.Error />;\n }\n\n if (data.length === 0) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'content-manager.widget.last-edited.no-data',\n defaultMessage: 'No edited entries',\n })}\n </Widget.NoData>\n );\n }\n\n return <RecentDocumentsTable documents={data} type=\"edited\" dynamicMaxWidth={dynamicMaxWidth} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LastPublishedWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst LastPublishedWidget = ({ columnWidth = 6 }: { columnWidth?: number }) => {\n const { formatMessage } = useIntl();\n const { data, isLoading, error } = useGetRecentDocumentsQuery({ action: 'publish' });\n\n const dynamicMaxWidth = calculateDynamicMaxWidth(columnWidth);\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error || !data) {\n return <Widget.Error />;\n }\n\n if (data.length === 0) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'content-manager.widget.last-published.no-data',\n defaultMessage: 'No published entries',\n })}\n </Widget.NoData>\n );\n }\n\n return (\n <RecentDocumentsTable documents={data} type=\"published\" dynamicMaxWidth={dynamicMaxWidth} />\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ChartEntriesWidget\n * -----------------------------------------------------------------------------------------------*/\nconst RADIUS = 80;\nconst STROKE = 10;\nconst CIRCUMFERENCE = 2 * Math.PI * (RADIUS - STROKE / 2);\n\ntype ThemeColor = keyof DefaultTheme['colors'];\n\nconst ArcChart = styled.circle<{ $arcColor: ThemeColor }>`\n stroke: ${({ theme, $arcColor }) => theme.colors[$arcColor]};\n`;\n\nconst TextChart = styled.tspan<{ $textColor: ThemeColor }>`\n text-transform: lowercase;\n fill: ${({ theme, $textColor }) => theme.colors[$textColor]};\n`;\n\nconst KeyChartItem = styled(Flex)`\n width: 100%;\n\n ${({ theme }) => theme.breakpoints.small} {\n width: auto;\n }\n`;\n\ninterface ChartData {\n label: string;\n count: number;\n color: ThemeColor;\n}\n\nconst DonutChartSVG = ({ data }: { data: ChartData[] }) => {\n const { locale } = useIntl();\n const { formatMessage } = useIntl();\n const total = data.reduce((acc, curr) => acc + curr.count, 0);\n const [tooltip, setTooltip] = React.useState<{\n visible: boolean;\n x: number;\n y: number;\n value: ChartData | null;\n isTouch?: boolean;\n }>({ visible: false, x: 0, y: 0, value: null });\n\n let cumulativePercent = 0;\n\n const handleMouseOver = (e: React.MouseEvent<SVGCircleElement>, value: ChartData) => {\n setTooltip({\n visible: true,\n x: e.clientX,\n y: e.clientY,\n value,\n });\n };\n const handleMouseOut = () => {\n setTooltip((t) => ({ ...t, visible: false }));\n };\n\n const handleFocus = (e: React.FocusEvent<SVGCircleElement>, value: ChartData) => {\n setTooltip({\n visible: true,\n x:\n e.currentTarget.getBoundingClientRect().width / 2 +\n e.currentTarget.getBoundingClientRect().left,\n y:\n e.currentTarget.getBoundingClientRect().height +\n e.currentTarget.getBoundingClientRect().top,\n value,\n });\n };\n\n return (\n <Flex direction=\"column\" gap={6} margin=\"auto\">\n <svg\n width={RADIUS * 2}\n height={RADIUS * 2}\n viewBox={`0 0 ${RADIUS * 2} ${RADIUS * 2}`}\n style={{ position: 'relative', zIndex: 1 }}\n >\n <g transform={`rotate(-90 ${RADIUS} ${RADIUS})`}>\n {data.map((value) => {\n const percent = (value.count / total) * 100;\n const arcLength = (percent / 100) * CIRCUMFERENCE;\n const dashArray = `${arcLength} ${CIRCUMFERENCE - arcLength}`;\n const dashOffset = CIRCUMFERENCE * (1 - cumulativePercent / 100);\n const el = (\n <ArcChart\n key={value.label}\n cx={RADIUS}\n cy={RADIUS}\n r={RADIUS - STROKE / 2}\n fill=\"none\"\n strokeWidth={STROKE}\n strokeDasharray={dashArray}\n strokeDashoffset={dashOffset}\n style={{ transition: 'stroke-dashoffset 0.3s', cursor: 'pointer' }}\n tabIndex={0}\n aria-describedby={tooltip.visible ? 'chart-tooltip' : undefined}\n onFocus={(e) => handleFocus(e, value)}\n onBlur={handleMouseOut}\n onMouseMove={(e) => handleMouseOver(e, value)}\n onMouseLeave={handleMouseOut}\n $arcColor={value.color}\n />\n );\n cumulativePercent += percent;\n return el;\n })}\n </g>\n <text x={RADIUS} y={RADIUS} textAnchor=\"middle\" fontSize=\"2.4rem\" fontWeight=\"bold\">\n <TextChart x={RADIUS} dy=\"0\" $textColor=\"neutral800\">\n {new Intl.NumberFormat(locale, {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(total)}\n </TextChart>\n <TextChart\n x={RADIUS}\n dy=\"1.4em\"\n fontSize=\"1.4rem\"\n fontWeight=\"normal\"\n $textColor=\"neutral600\"\n >\n {formatMessage(\n {\n id: 'content-manager.widget.chart-entries.count.label',\n defaultMessage: '{count, plural, =0 {entries} one {entry} other {entries}}',\n },\n { count: total }\n )}\n </TextChart>\n </text>\n </svg>\n {tooltip.visible && tooltip.value && (\n <Portal\n style={{\n position: 'fixed',\n left: 16,\n top: 16,\n zIndex: 2,\n transform: `translate(${tooltip.x}px, ${tooltip.y}px)`,\n }}\n data-testid=\"entries-chart-tooltip\"\n >\n <Box\n background=\"neutral900\"\n padding={2}\n borderRadius={1}\n textAlign=\"center\"\n role=\"tooltip\"\n aria-live=\"polite\"\n >\n <Typography textColor=\"neutral0\">\n {formatMessage(\n {\n id: 'content-manager.widget.chart-entries.tooltip',\n defaultMessage: '{count} items',\n },\n {\n count: tooltip.value.count,\n label: tooltip.value.label,\n }\n )}\n </Typography>\n </Box>\n </Portal>\n )}\n <Flex gap={4} wrap=\"wrap\">\n {data.map(\n (value) =>\n value.count > 0 && (\n <KeyChartItem gap={1} key={value.label}>\n <Box background={value.color} padding={2} borderRadius={1} />\n <Typography variant=\"pi\">{value.label}</Typography>\n </KeyChartItem>\n )\n )}\n </Flex>\n </Flex>\n );\n};\n\nconst ChartEntriesWidget = () => {\n const { formatMessage } = useIntl();\n const { data: countDocuments, isLoading, error } = useGetCountDocumentsQuery();\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error) {\n return <Widget.Error />;\n }\n\n const { draft, published, modified } = countDocuments ?? {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n const total = draft + published + modified;\n\n if (!total) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'content-manager.widget.last-published.no-data',\n defaultMessage: 'No published entries',\n })}\n </Widget.NoData>\n );\n }\n\n return (\n <Flex minHeight=\"100%\">\n <DonutChartSVG\n data={[\n {\n label: formatMessage({\n id: 'content-manager.containers.List.draft',\n defaultMessage: 'Draft',\n }),\n count: draft,\n color: 'secondary500',\n },\n {\n label: formatMessage({\n id: 'content-manager.containers.List.modified',\n defaultMessage: 'Modified',\n }),\n count: modified,\n color: 'alternative500',\n },\n {\n label: formatMessage({\n id: 'content-manager.containers.List.published',\n defaultMessage: 'Published',\n }),\n count: published,\n color: 'success500',\n },\n ]}\n />\n </Flex>\n );\n};\n\nexport { ChartEntriesWidget, LastEditedWidget, LastPublishedWidget };\n"],"names":["BASE_MAX_WIDTH","calculateDynamicMaxWidth","columnWidth","baseColumnWidth","baseMaxWidth","calculatedWidth","Math","round","CellTypography","styled","Typography","$maxWidth","RecentDocumentsTable","documents","type","dynamicMaxWidth","formatMessage","useIntl","trackUsage","useTracking","navigate","useNavigate","getEditViewLink","document","isSingleType","kind","kindPath","queryParams","locale","contentTypeUid","documentId","handleRowClick","entryType","link","_jsx","Table","colCount","rowCount","length","Tbody","map","_jsxs","Tr","onClick","cursor","Td","title","variant","textColor","id","defaultMessage","contentTypeDisplayName","Box","display","status","DocumentStatus","aria-hidden","RelativeTime","timestamp","Date","updatedAt","e","stopPropagation","IconButton","tag","Link","to","label","Pencil","LastEditedWidget","data","isLoading","error","useGetRecentDocumentsQuery","action","Widget","Loading","Error","NoData","LastPublishedWidget","RADIUS","STROKE","CIRCUMFERENCE","PI","ArcChart","circle","theme","$arcColor","colors","TextChart","tspan","$textColor","KeyChartItem","Flex","breakpoints","small","DonutChartSVG","total","reduce","acc","curr","count","tooltip","setTooltip","React","useState","visible","x","y","value","cumulativePercent","handleMouseOver","clientX","clientY","handleMouseOut","t","handleFocus","currentTarget","getBoundingClientRect","width","left","height","top","direction","gap","margin","svg","viewBox","style","position","zIndex","g","transform","percent","arcLength","dashArray","dashOffset","el","cx","cy","r","fill","strokeWidth","strokeDasharray","strokeDashoffset","transition","tabIndex","aria-describedby","undefined","onFocus","onBlur","onMouseMove","onMouseLeave","color","text","textAnchor","fontSize","fontWeight","dy","Intl","NumberFormat","notation","maximumFractionDigits","format","Portal","data-testid","background","padding","borderRadius","textAlign","role","aria-live","wrap","ChartEntriesWidget","countDocuments","useGetCountDocumentsQuery","draft","published","modified","minHeight"],"mappings":"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"}
|
|
@@ -5,7 +5,8 @@ var React = require('react');
|
|
|
5
5
|
var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
6
6
|
var reactRouterDom = require('react-router-dom');
|
|
7
7
|
|
|
8
|
-
function
|
|
8
|
+
function _interopNamespace(e) {
|
|
9
|
+
if (e && e.__esModule) return e;
|
|
9
10
|
var n = Object.create(null);
|
|
10
11
|
if (e) {
|
|
11
12
|
Object.keys(e).forEach(function (k) {
|
|
@@ -22,7 +23,7 @@ function _interopNamespaceDefault(e) {
|
|
|
22
23
|
return Object.freeze(n);
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
var React__namespace = /*#__PURE__*/
|
|
26
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
26
27
|
|
|
27
28
|
const [DocumentRBACProvider, useDocumentRBAC] = strapiAdmin.createContext('DocumentRBAC', {
|
|
28
29
|
canCreate: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentRBAC.js","sources":["../../../admin/src/features/DocumentRBAC.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useRBAC,\n useAuth,\n type Permission,\n createContext,\n Page,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\nimport { useParams } from 'react-router-dom';\n\nimport type { Schema } from '@strapi/types';\n\n/**\n * The boolean values indicate the global actions a user can perform on the document.\n * The `string[]` values tell us specifically which fields the actions can be performed on,\n * for example, if the `canReadFields` array is empty, than no fields can be read by the user.\n * This can happen even if the user can read the document.\n */\ninterface DocumentRBACContextValue {\n canCreate?: boolean;\n canCreateFields: string[];\n canDelete?: boolean;\n canPublish?: boolean;\n canRead?: boolean;\n canReadFields: string[];\n canUpdate?: boolean;\n canUpdateFields: string[];\n canUserAction: (\n fieldName: string,\n fieldsUserCanAction: string[],\n fieldType: Schema.Attribute.Kind\n ) => boolean;\n isLoading: boolean;\n}\n\nconst [DocumentRBACProvider, useDocumentRBAC] = createContext<DocumentRBACContextValue>(\n 'DocumentRBAC',\n {\n canCreate: false,\n canCreateFields: [],\n canDelete: false,\n canPublish: false,\n canRead: false,\n canReadFields: [],\n canUpdate: false,\n canUpdateFields: [],\n canUserAction: () => false,\n isLoading: false,\n }\n);\n\ninterface DocumentRBACProps {\n children: React.ReactNode;\n permissions: Permission[] | null;\n model?: string;\n}\n\n/**\n * @internal This component is not meant to be used outside of the Content Manager plugin.\n * It depends on knowing the slug/model of the content-type using the params of the URL or the model if it is passed as arg.\n * If you do use the hook outside of the context, we default to `false` for all actions.\n *\n * It then creates an list of `can{Action}` that are passed to the context for consumption\n * within the app to enforce RBAC.\n */\nconst DocumentRBAC = ({ children, permissions, model }: DocumentRBACProps) => {\n const { slug } = useParams<{ slug: string }>();\n\n if (!slug && !model) {\n throw new Error('Cannot find the slug param in the URL or the model prop is not provided.');\n }\n\n const contentTypeUid = model ?? slug;\n\n const [{ rawQuery }] = useQueryParams<{ plugins?: { i18n?: { locale?: string } } }>();\n\n const userPermissions = useAuth('DocumentRBAC', (state) => state.permissions);\n\n const contentTypePermissions = React.useMemo(() => {\n const contentTypePermissions = userPermissions.filter(\n (permission) => permission.subject === contentTypeUid\n );\n return contentTypePermissions.reduce<Record<string, Permission[]>>((acc, permission) => {\n const [action] = permission.action.split('.').slice(-1);\n return { ...acc, [action]: [...(acc[action] ?? []), permission] };\n }, {});\n }, [contentTypeUid, userPermissions]);\n\n const { isLoading, allowedActions } = useRBAC(\n contentTypePermissions,\n permissions ?? undefined,\n // TODO: useRBAC context should be typed and built differently\n // We are passing raw query as context to the hook so that it can\n // rely on the locale provided from DocumentRBAC for its permission calculations.\n rawQuery\n );\n\n const canCreateFields =\n !isLoading && allowedActions.canCreate\n ? extractAndDedupeFields(contentTypePermissions.create)\n : [];\n\n const canReadFields =\n !isLoading && allowedActions.canRead ? extractAndDedupeFields(contentTypePermissions.read) : [];\n\n const canUpdateFields =\n !isLoading && allowedActions.canUpdate\n ? extractAndDedupeFields(contentTypePermissions.update)\n : [];\n\n /**\n * @description Checks if the user can perform an action on a field based on the field names\n * provided as the second argument.\n */\n const canUserAction: DocumentRBACContextValue['canUserAction'] = React.useCallback(\n (fieldName, fieldsUserCanAction, fieldType) => {\n const name = removeNumericalStrings(fieldName.split('.'));\n\n const componentFieldNames = fieldsUserCanAction\n // filter out fields that aren't components (components are dot separated)\n .filter((field) => field.split('.').length > 1);\n\n if (fieldType === 'component') {\n // check if the field name is within any of those arrays\n return componentFieldNames.some((field) => {\n return field.includes(name.join('.'));\n });\n }\n\n /**\n * The field is within a component.\n */\n if (name.length > 1) {\n return componentFieldNames.includes(name.join('.'));\n }\n\n /**\n * just a regular field\n */\n return fieldsUserCanAction.includes(fieldName);\n },\n []\n );\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <DocumentRBACProvider\n isLoading={isLoading}\n canCreateFields={canCreateFields}\n canReadFields={canReadFields}\n canUpdateFields={canUpdateFields}\n canUserAction={canUserAction}\n {...allowedActions}\n >\n {children}\n </DocumentRBACProvider>\n );\n};\n\n/**\n * @internal it's really small, but it's used three times in a row and DRY for something this straight forward.\n */\nconst extractAndDedupeFields = (permissions: Permission[] = []) => {\n const allFields = permissions.flatMap((permission) => permission.properties?.fields);\n // An undefined entry means this permission grants access to all fields\n // (no field-level restriction). Returning [] signals \"no restriction\" to callers.\n if (allFields.some((field) => field === undefined)) return [];\n // Deduplicate fields\n return Array.from(new Set(allFields as string[]));\n};\n\n/**\n * @internal removes numerical strings from arrays.\n * @example\n * ```ts\n * const name = 'a.0.b';\n * const res = removeNumericalStrings(name.split('.'));\n * console.log(res); // ['a', 'b']\n * ```\n */\nconst removeNumericalStrings = (arr: string[]) => arr.filter((item) => isNaN(Number(item)));\n\nexport { DocumentRBAC, useDocumentRBAC, DocumentRBACContextValue, DocumentRBACProps };\n"],"names":["DocumentRBACProvider","useDocumentRBAC","createContext","canCreate","canCreateFields","canDelete","canPublish","canRead","canReadFields","canUpdate","canUpdateFields","canUserAction","isLoading","DocumentRBAC","children","permissions","model","slug","useParams","Error","contentTypeUid","rawQuery","useQueryParams","userPermissions","useAuth","state","contentTypePermissions","React","useMemo","filter","permission","subject","reduce","acc","action","split","slice","allowedActions","useRBAC","undefined","extractAndDedupeFields","create","read","update","useCallback","fieldName","fieldsUserCanAction","fieldType","name","removeNumericalStrings","componentFieldNames","field","length","some","includes","join","_jsx","Page","Loading","allFields","flatMap","properties","fields","Array","from","Set","arr","item","isNaN","Number"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,MAAM,CAACA,oBAAAA,EAAsBC,eAAAA,CAAgB,GAAGC,0BAC9C,cAAA,EACA;IACEC,SAAAA,EAAW,KAAA;AACXC,IAAAA,eAAAA,EAAiB,EAAE;IACnBC,SAAAA,EAAW,KAAA;IACXC,UAAAA,EAAY,KAAA;IACZC,OAAAA,EAAS,KAAA;AACTC,IAAAA,aAAAA,EAAe,EAAE;IACjBC,SAAAA,EAAW,KAAA;AACXC,IAAAA,eAAAA,EAAiB,EAAE;AACnBC,IAAAA,aAAAA,EAAe,IAAM,KAAA;IACrBC,SAAAA,EAAW;AACb,CAAA;AASF;;;;;;;IAQA,MAAMC,eAAe,CAAC,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,KAAK,EAAqB,GAAA;IACvE,MAAM,EAAEC,IAAI,EAAE,GAAGC,wBAAAA,EAAAA;IAEjB,IAAI,CAACD,IAAAA,IAAQ,CAACD,KAAAA,EAAO;AACnB,QAAA,MAAM,IAAIG,KAAAA,CAAM,0EAAA,CAAA;AAClB,IAAA;AAEA,IAAA,MAAMC,iBAAiBJ,KAAAA,IAASC,IAAAA;AAEhC,IAAA,MAAM,CAAC,EAAEI,QAAQ,EAAE,CAAC,GAAGC,0BAAAA,EAAAA;AAEvB,IAAA,MAAMC,kBAAkBC,mBAAAA,CAAQ,cAAA,EAAgB,CAACC,KAAAA,GAAUA,MAAMV,WAAW,CAAA;IAE5E,MAAMW,sBAAAA,GAAyBC,gBAAAA,CAAMC,OAAO,CAAC,IAAA;QAC3C,MAAMF,sBAAAA,GAAyBH,gBAAgBM,MAAM,CACnD,CAACC,UAAAA,GAAeA,UAAAA,CAAWC,OAAO,KAAKX,cAAAA,CAAAA;AAEzC,QAAA,OAAOM,sBAAAA,CAAuBM,MAAM,CAA+B,CAACC,GAAAA,EAAKH,UAAAA,GAAAA;YACvE,MAAM,CAACI,MAAAA,CAAO,GAAGJ,UAAAA,CAAWI,MAAM,CAACC,KAAK,CAAC,GAAA,CAAA,CAAKC,KAAK,CAAC,EAAC,CAAA;YACrD,OAAO;AAAE,gBAAA,GAAGH,GAAG;AAAE,gBAAA,CAACC,SAAS;uBAAKD,GAAG,CAACC,MAAAA,CAAO,IAAI,EAAE;AAAGJ,oBAAAA;AAAW;AAAC,aAAA;AAClE,QAAA,CAAA,EAAG,EAAC,CAAA;IACN,CAAA,EAAG;AAACV,QAAAA,cAAAA;AAAgBG,QAAAA;AAAgB,KAAA,CAAA;IAEpC,MAAM,EAAEX,SAAS,EAAEyB,cAAc,EAAE,GAAGC,mBAAAA,CACpCZ,sBAAAA,EACAX,WAAAA,IAAewB,SAAAA;;;AAIflB,IAAAA,QAAAA,CAAAA;IAGF,MAAMjB,eAAAA,GACJ,CAACQ,SAAAA,IAAayB,cAAAA,CAAelC,SAAS,GAClCqC,sBAAAA,CAAuBd,sBAAAA,CAAuBe,MAAM,CAAA,GACpD,EAAE;IAER,MAAMjC,aAAAA,GACJ,CAACI,SAAAA,IAAayB,cAAAA,CAAe9B,OAAO,GAAGiC,sBAAAA,CAAuBd,sBAAAA,CAAuBgB,IAAI,CAAA,GAAI,EAAE;IAEjG,MAAMhC,eAAAA,GACJ,CAACE,SAAAA,IAAayB,cAAAA,CAAe5B,SAAS,GAClC+B,sBAAAA,CAAuBd,sBAAAA,CAAuBiB,MAAM,CAAA,GACpD,EAAE;AAER;;;AAGC,MACD,MAAMhC,aAAAA,GAA2DgB,gBAAAA,CAAMiB,WAAW,CAChF,CAACC,WAAWC,mBAAAA,EAAqBC,SAAAA,GAAAA;AAC/B,QAAA,MAAMC,IAAAA,GAAOC,sBAAAA,CAAuBJ,SAAAA,CAAUV,KAAK,CAAC,GAAA,CAAA,CAAA;QAEpD,MAAMe,mBAAAA,GAAsBJ,mBAC1B;SACCjB,MAAM,CAAC,CAACsB,KAAAA,GAAUA,KAAAA,CAAMhB,KAAK,CAAC,GAAA,CAAA,CAAKiB,MAAM,GAAG,CAAA,CAAA;AAE/C,QAAA,IAAIL,cAAc,WAAA,EAAa;;YAE7B,OAAOG,mBAAAA,CAAoBG,IAAI,CAAC,CAACF,KAAAA,GAAAA;AAC/B,gBAAA,OAAOA,KAAAA,CAAMG,QAAQ,CAACN,IAAAA,CAAKO,IAAI,CAAC,GAAA,CAAA,CAAA;AAClC,YAAA,CAAA,CAAA;AACF,QAAA;AAEA;;AAEC,UACD,IAAIP,IAAAA,CAAKI,MAAM,GAAG,CAAA,EAAG;AACnB,YAAA,OAAOF,mBAAAA,CAAoBI,QAAQ,CAACN,IAAAA,CAAKO,IAAI,CAAC,GAAA,CAAA,CAAA;AAChD,QAAA;AAEA;;UAGA,OAAOT,mBAAAA,CAAoBQ,QAAQ,CAACT,SAAAA,CAAAA;AACtC,IAAA,CAAA,EACA,EAAE,CAAA;AAGJ,IAAA,IAAIjC,SAAAA,EAAW;QACb,qBAAO4C,cAAA,CAACC,iBAAKC,OAAO,EAAA,EAAA,CAAA;AACtB,IAAA;AAEA,IAAA,qBACEF,cAAA,CAACxD,oBAAAA,EAAAA;QACCY,SAAAA,EAAWA,SAAAA;QACXR,eAAAA,EAAiBA,eAAAA;QACjBI,aAAAA,EAAeA,aAAAA;QACfE,eAAAA,EAAiBA,eAAAA;QACjBC,aAAAA,EAAeA,aAAAA;AACd,QAAA,GAAG0B,cAAc;AAEjBvB,QAAAA,QAAAA,EAAAA;;AAGP;AAEA;;AAEC,IACD,MAAM0B,sBAAAA,GAAyB,CAACzB,WAAAA,GAA4B,EAAE,GAAA;IAC5D,MAAM4C,SAAAA,GAAY5C,YAAY6C,OAAO,CAAC,CAAC9B,UAAAA,GAAeA,UAAAA,CAAW+B,UAAU,EAAEC,MAAAA,CAAAA;;;IAG7E,IAAIH,SAAAA,CAAUN,IAAI,CAAC,CAACF,QAAUA,KAAAA,KAAUZ,SAAAA,CAAAA,EAAY,OAAO,EAAE;;AAE7D,IAAA,OAAOwB,KAAAA,CAAMC,IAAI,CAAC,IAAIC,GAAAA,CAAIN,SAAAA,CAAAA,CAAAA;AAC5B,CAAA;AAEA;;;;;;;;IASA,MAAMV,sBAAAA,GAAyB,CAACiB,GAAAA,GAAkBA,GAAAA,CAAIrC,MAAM,CAAC,CAACsC,IAAAA,GAASC,KAAAA,CAAMC,MAAAA,CAAOF,IAAAA,CAAAA,CAAAA,CAAAA;;;;;"}
|
|
1
|
+
{"version":3,"file":"DocumentRBAC.js","sources":["../../../admin/src/features/DocumentRBAC.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useRBAC,\n useAuth,\n type Permission,\n createContext,\n Page,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\nimport { useParams } from 'react-router-dom';\n\nimport type { Schema } from '@strapi/types';\n\n/**\n * The boolean values indicate the global actions a user can perform on the document.\n * The `string[]` values tell us specifically which fields the actions can be performed on,\n * for example, if the `canReadFields` array is empty, than no fields can be read by the user.\n * This can happen even if the user can read the document.\n */\ninterface DocumentRBACContextValue {\n canCreate?: boolean;\n canCreateFields: string[];\n canDelete?: boolean;\n canPublish?: boolean;\n canRead?: boolean;\n canReadFields: string[];\n canUpdate?: boolean;\n canUpdateFields: string[];\n canUserAction: (\n fieldName: string,\n fieldsUserCanAction: string[],\n fieldType: Schema.Attribute.Kind\n ) => boolean;\n isLoading: boolean;\n}\n\nconst [DocumentRBACProvider, useDocumentRBAC] = createContext<DocumentRBACContextValue>(\n 'DocumentRBAC',\n {\n canCreate: false,\n canCreateFields: [],\n canDelete: false,\n canPublish: false,\n canRead: false,\n canReadFields: [],\n canUpdate: false,\n canUpdateFields: [],\n canUserAction: () => false,\n isLoading: false,\n }\n);\n\ninterface DocumentRBACProps {\n children: React.ReactNode;\n permissions: Permission[] | null;\n model?: string;\n}\n\n/**\n * @internal This component is not meant to be used outside of the Content Manager plugin.\n * It depends on knowing the slug/model of the content-type using the params of the URL or the model if it is passed as arg.\n * If you do use the hook outside of the context, we default to `false` for all actions.\n *\n * It then creates an list of `can{Action}` that are passed to the context for consumption\n * within the app to enforce RBAC.\n */\nconst DocumentRBAC = ({ children, permissions, model }: DocumentRBACProps) => {\n const { slug } = useParams<{ slug: string }>();\n\n if (!slug && !model) {\n throw new Error('Cannot find the slug param in the URL or the model prop is not provided.');\n }\n\n const contentTypeUid = model ?? slug;\n\n const [{ rawQuery }] = useQueryParams<{ plugins?: { i18n?: { locale?: string } } }>();\n\n const userPermissions = useAuth('DocumentRBAC', (state) => state.permissions);\n\n const contentTypePermissions = React.useMemo(() => {\n const contentTypePermissions = userPermissions.filter(\n (permission) => permission.subject === contentTypeUid\n );\n return contentTypePermissions.reduce<Record<string, Permission[]>>((acc, permission) => {\n const [action] = permission.action.split('.').slice(-1);\n return { ...acc, [action]: [...(acc[action] ?? []), permission] };\n }, {});\n }, [contentTypeUid, userPermissions]);\n\n const { isLoading, allowedActions } = useRBAC(\n contentTypePermissions,\n permissions ?? undefined,\n // TODO: useRBAC context should be typed and built differently\n // We are passing raw query as context to the hook so that it can\n // rely on the locale provided from DocumentRBAC for its permission calculations.\n rawQuery\n );\n\n const canCreateFields =\n !isLoading && allowedActions.canCreate\n ? extractAndDedupeFields(contentTypePermissions.create)\n : [];\n\n const canReadFields =\n !isLoading && allowedActions.canRead ? extractAndDedupeFields(contentTypePermissions.read) : [];\n\n const canUpdateFields =\n !isLoading && allowedActions.canUpdate\n ? extractAndDedupeFields(contentTypePermissions.update)\n : [];\n\n /**\n * @description Checks if the user can perform an action on a field based on the field names\n * provided as the second argument.\n */\n const canUserAction: DocumentRBACContextValue['canUserAction'] = React.useCallback(\n (fieldName, fieldsUserCanAction, fieldType) => {\n const name = removeNumericalStrings(fieldName.split('.'));\n\n const componentFieldNames = fieldsUserCanAction\n // filter out fields that aren't components (components are dot separated)\n .filter((field) => field.split('.').length > 1);\n\n if (fieldType === 'component') {\n // check if the field name is within any of those arrays\n return componentFieldNames.some((field) => {\n return field.includes(name.join('.'));\n });\n }\n\n /**\n * The field is within a component.\n */\n if (name.length > 1) {\n return componentFieldNames.includes(name.join('.'));\n }\n\n /**\n * just a regular field\n */\n return fieldsUserCanAction.includes(fieldName);\n },\n []\n );\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <DocumentRBACProvider\n isLoading={isLoading}\n canCreateFields={canCreateFields}\n canReadFields={canReadFields}\n canUpdateFields={canUpdateFields}\n canUserAction={canUserAction}\n {...allowedActions}\n >\n {children}\n </DocumentRBACProvider>\n );\n};\n\n/**\n * @internal it's really small, but it's used three times in a row and DRY for something this straight forward.\n */\nconst extractAndDedupeFields = (permissions: Permission[] = []) => {\n const allFields = permissions.flatMap((permission) => permission.properties?.fields);\n // An undefined entry means this permission grants access to all fields\n // (no field-level restriction). Returning [] signals \"no restriction\" to callers.\n if (allFields.some((field) => field === undefined)) return [];\n // Deduplicate fields\n return Array.from(new Set(allFields as string[]));\n};\n\n/**\n * @internal removes numerical strings from arrays.\n * @example\n * ```ts\n * const name = 'a.0.b';\n * const res = removeNumericalStrings(name.split('.'));\n * console.log(res); // ['a', 'b']\n * ```\n */\nconst removeNumericalStrings = (arr: string[]) => arr.filter((item) => isNaN(Number(item)));\n\nexport { DocumentRBAC, useDocumentRBAC, DocumentRBACContextValue, DocumentRBACProps };\n"],"names":["DocumentRBACProvider","useDocumentRBAC","createContext","canCreate","canCreateFields","canDelete","canPublish","canRead","canReadFields","canUpdate","canUpdateFields","canUserAction","isLoading","DocumentRBAC","children","permissions","model","slug","useParams","Error","contentTypeUid","rawQuery","useQueryParams","userPermissions","useAuth","state","contentTypePermissions","React","useMemo","filter","permission","subject","reduce","acc","action","split","slice","allowedActions","useRBAC","undefined","extractAndDedupeFields","create","read","update","useCallback","fieldName","fieldsUserCanAction","fieldType","name","removeNumericalStrings","componentFieldNames","field","length","some","includes","join","_jsx","Page","Loading","allFields","flatMap","properties","fields","Array","from","Set","arr","item","isNaN","Number"],"mappings":"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"}
|
|
@@ -13,7 +13,10 @@ var conditionalFields = require('../../utils/conditionalFields.js');
|
|
|
13
13
|
var History = require('../pages/History.js');
|
|
14
14
|
var VersionInputRenderer = require('./VersionInputRenderer.js');
|
|
15
15
|
|
|
16
|
-
function
|
|
16
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
17
|
+
|
|
18
|
+
function _interopNamespace(e) {
|
|
19
|
+
if (e && e.__esModule) return e;
|
|
17
20
|
var n = Object.create(null);
|
|
18
21
|
if (e) {
|
|
19
22
|
Object.keys(e).forEach(function (k) {
|
|
@@ -30,7 +33,8 @@ function _interopNamespaceDefault(e) {
|
|
|
30
33
|
return Object.freeze(n);
|
|
31
34
|
}
|
|
32
35
|
|
|
33
|
-
var React__namespace = /*#__PURE__*/
|
|
36
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
37
|
+
var pipe__default = /*#__PURE__*/_interopDefault(pipe);
|
|
34
38
|
|
|
35
39
|
const createLayoutFromFields = (fields)=>{
|
|
36
40
|
return fields.reduce((rows, field)=>{
|
|
@@ -231,7 +235,7 @@ const VersionContent = ()=>{
|
|
|
231
235
|
const schema = {
|
|
232
236
|
attributes: schemaAttributes
|
|
233
237
|
};
|
|
234
|
-
const transformations =
|
|
238
|
+
const transformations = pipe__default.default(data.removeFieldsThatDontExistOnSchema(schema), data.prepareTempKeys(schema, components));
|
|
235
239
|
return transformations(document);
|
|
236
240
|
};
|
|
237
241
|
return transform(version.schema, components)(version.data);
|