@strapi/content-manager 5.38.0 → 5.39.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/history/components/VersionContent.js +48 -16
- package/dist/admin/history/components/VersionContent.js.map +1 -1
- package/dist/admin/history/components/VersionContent.mjs +48 -16
- package/dist/admin/history/components/VersionContent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.js +51 -0
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.mjs +52 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +6 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +6 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +148 -111
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +152 -115
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js +15 -5
- package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs +15 -5
- package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.js +54 -1
- package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.mjs +54 -1
- package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
- package/dist/admin/src/exports.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.d.ts +1 -0
- package/dist/admin/src/utils/conditionalFields.d.ts +12 -0
- package/dist/admin/translations/en.json.js +5 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +5 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +136 -2
- package/dist/admin/translations/es.json.js.map +1 -1
- package/dist/admin/translations/es.json.mjs +136 -2
- package/dist/admin/translations/es.json.mjs.map +1 -1
- package/dist/admin/utils/conditionalFields.js +76 -0
- package/dist/admin/utils/conditionalFields.js.map +1 -0
- package/dist/admin/utils/conditionalFields.mjs +69 -0
- package/dist/admin/utils/conditionalFields.mjs.map +1 -0
- package/dist/server/controllers/collection-types.js +157 -4
- package/dist/server/controllers/collection-types.js.map +1 -1
- package/dist/server/controllers/collection-types.mjs +159 -6
- package/dist/server/controllers/collection-types.mjs.map +1 -1
- package/dist/server/controllers/single-types.js +19 -4
- package/dist/server/controllers/single-types.js.map +1 -1
- package/dist/server/controllers/single-types.mjs +19 -4
- package/dist/server/controllers/single-types.mjs.map +1 -1
- package/dist/server/preview/services/preview.js +2 -1
- package/dist/server/preview/services/preview.js.map +1 -1
- package/dist/server/preview/services/preview.mjs +2 -1
- package/dist/server/preview/services/preview.mjs.map +1 -1
- package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
- package/dist/server/src/controllers/single-types.d.ts.map +1 -1
- package/dist/server/src/preview/services/preview.d.ts.map +1 -1
- package/package.json +13 -8
|
@@ -9,6 +9,7 @@ var reactIntl = require('react-intl');
|
|
|
9
9
|
var useDocument = require('../../hooks/useDocument.js');
|
|
10
10
|
var hooks = require('../../modules/hooks.js');
|
|
11
11
|
var data = require('../../pages/EditView/utils/data.js');
|
|
12
|
+
var conditionalFields = require('../../utils/conditionalFields.js');
|
|
12
13
|
var History = require('../pages/History.js');
|
|
13
14
|
var VersionInputRenderer = require('./VersionInputRenderer.js');
|
|
14
15
|
|
|
@@ -80,19 +81,56 @@ const createLayoutFromFields = (fields)=>{
|
|
|
80
81
|
}
|
|
81
82
|
/* -------------------------------------------------------------------------------------------------
|
|
82
83
|
* FormPanel
|
|
83
|
-
* -----------------------------------------------------------------------------------------------*/
|
|
84
|
+
* -----------------------------------------------------------------------------------------------*/ // Reuse one rules engine instance instead of creating a new one on every render.
|
|
85
|
+
const rulesEngine = strapiAdmin.createRulesEngine();
|
|
86
|
+
const getPanelConditionDependencyPaths = (panel)=>{
|
|
87
|
+
// Aggregate condition dependencies across all fields in the panel so we can subscribe narrowly.
|
|
88
|
+
const dependencies = new Set();
|
|
89
|
+
for (const row of panel){
|
|
90
|
+
for (const field of row){
|
|
91
|
+
const condition = field.attribute?.conditions?.visible;
|
|
92
|
+
if (!condition) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const paths = conditionalFields.getConditionDependencyPaths(condition);
|
|
96
|
+
if (paths === null) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
for (const path of paths){
|
|
100
|
+
dependencies.add(path);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return [
|
|
105
|
+
...dependencies
|
|
106
|
+
].sort();
|
|
107
|
+
};
|
|
108
|
+
const FormPanel = ({ panel })=>{
|
|
84
109
|
const isMobile = strapiAdmin.useIsMobile();
|
|
85
|
-
const
|
|
86
|
-
|
|
110
|
+
const conditionDependencyPaths = React__namespace.useMemo(()=>getPanelConditionDependencyPaths(panel), [
|
|
111
|
+
panel
|
|
112
|
+
]);
|
|
113
|
+
const getValues = strapiAdmin.useForm('FormPanel', (state)=>state.getValues);
|
|
114
|
+
const conditionSubscriptionValue = strapiAdmin.useForm('FormPanel', (state)=>{
|
|
115
|
+
return conditionalFields.getConditionDependencySubscriptionValue(state.values, conditionDependencyPaths);
|
|
116
|
+
});
|
|
117
|
+
// For narrow subscriptions, read the latest full values lazily via getValues() to evaluate rules.
|
|
118
|
+
// This avoids rerendering for unrelated form changes while preserving correct condition evaluation.
|
|
119
|
+
const fieldValues = conditionDependencyPaths === null ? conditionSubscriptionValue : getValues();
|
|
120
|
+
const isFieldVisible = React__namespace.useCallback((field)=>{
|
|
121
|
+
const condition = field.attribute?.conditions?.visible;
|
|
122
|
+
if (!condition) {
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
return rulesEngine.evaluate(condition, fieldValues);
|
|
126
|
+
}, [
|
|
127
|
+
fieldValues
|
|
128
|
+
]);
|
|
87
129
|
if (panel.some((row)=>row.some((field)=>field.type === 'dynamiczone'))) {
|
|
88
130
|
const [row] = panel;
|
|
89
131
|
const [field] = row;
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
const isVisible = rulesEngine.evaluate(condition, fieldValues);
|
|
93
|
-
if (!isVisible) {
|
|
94
|
-
return null; // Skip rendering the dynamic zone if the condition is not met
|
|
95
|
-
}
|
|
132
|
+
if (!isFieldVisible(field)) {
|
|
133
|
+
return null;
|
|
96
134
|
}
|
|
97
135
|
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Root, {
|
|
98
136
|
gap: 4,
|
|
@@ -129,13 +167,7 @@ const createLayoutFromFields = (fields)=>{
|
|
|
129
167
|
alignItems: "stretch",
|
|
130
168
|
gap: 6,
|
|
131
169
|
children: panel.map((row, gridRowIndex)=>{
|
|
132
|
-
const visibleFields = row.filter(
|
|
133
|
-
const condition = field.attribute?.conditions?.visible;
|
|
134
|
-
if (condition) {
|
|
135
|
-
return rulesEngine.evaluate(condition, fieldValues);
|
|
136
|
-
}
|
|
137
|
-
return true;
|
|
138
|
-
});
|
|
170
|
+
const visibleFields = row.filter(isFieldVisible);
|
|
139
171
|
if (visibleFields.length === 0) {
|
|
140
172
|
return null; // Skip rendering the entire grid row
|
|
141
173
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VersionContent.js","sources":["../../../../admin/src/history/components/VersionContent.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Form, Layouts, useForm, createRulesEngine, useIsMobile } from '@strapi/admin/strapi-admin';\nimport { Box, Divider, Flex, Grid, Typography } from '@strapi/design-system';\nimport pipe from 'lodash/fp/pipe';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../hooks/useDocument';\nimport { useTypedSelector } from '../../modules/hooks';\nimport {\n prepareTempKeys,\n removeFieldsThatDontExistOnSchema,\n} from '../../pages/EditView/utils/data';\nimport { HistoryContextValue, useHistoryContext } from '../pages/History';\n\nimport { VersionInputRenderer } from './VersionInputRenderer';\n\nimport type { Metadatas } from '../../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../../shared/contracts/init';\nimport type { ComponentsDictionary, Document } from '../../hooks/useDocument';\nimport type { EditFieldLayout } from '../../hooks/useDocumentLayout';\nimport type { Schema } from '@strapi/types';\n\nconst createLayoutFromFields = <T extends EditFieldLayout | UnknownField>(fields: T[]) => {\n return (\n fields\n .reduce<Array<T[]>>((rows, field) => {\n if (field.type === 'dynamiczone') {\n // Dynamic zones take up all the columns in a row\n rows.push([field]);\n\n return rows;\n }\n\n if (!rows[rows.length - 1]) {\n // Create a new row if there isn't one available\n rows.push([]);\n }\n\n // Push fields to the current row, they wrap and handle their own column size\n rows[rows.length - 1].push(field);\n\n return rows;\n }, [])\n // Map the rows to panels\n .map((row) => [row])\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * getRemainingFieldsLayout\n * -----------------------------------------------------------------------------------------------*/\n\ninterface GetRemainingFieldsLayoutOptions\n extends Pick<HistoryContextValue, 'layout'>,\n Pick<GetInitData.Response['data'], 'fieldSizes'> {\n schemaAttributes: HistoryContextValue['schema']['attributes'];\n metadatas: Metadatas;\n}\n\n/**\n * Build a layout for the fields that are were deleted from the edit view layout\n * via the configure the view page. This layout will be merged with the main one.\n * Those fields would be restored if the user restores the history version, which is why it's\n * important to show them, even if they're not in the normal layout.\n */\nfunction getRemaingFieldsLayout({\n layout,\n metadatas,\n schemaAttributes,\n fieldSizes,\n}: GetRemainingFieldsLayoutOptions) {\n const fieldsInLayout = layout.flatMap((panel) =>\n panel.flatMap((row) => row.flatMap((field) => field.name))\n );\n const remainingFields = Object.entries(metadatas).reduce<EditFieldLayout[]>(\n (currentRemainingFields, [name, field]) => {\n // Make sure we do not fields that are not visible, e.g. \"id\"\n if (!fieldsInLayout.includes(name) && field.edit.visible === true) {\n const attribute = schemaAttributes[name];\n // @ts-expect-error not sure why attribute causes type error\n currentRemainingFields.push({\n attribute,\n type: attribute.type,\n visible: true,\n disabled: true,\n label: field.edit.label || name,\n name: name,\n size: fieldSizes[attribute.type].default ?? 12,\n });\n }\n\n return currentRemainingFields;\n },\n []\n );\n\n return createLayoutFromFields(remainingFields);\n}\n\n/* -------------------------------------------------------------------------------------------------\n * FormPanel\n * -----------------------------------------------------------------------------------------------*/\n\nconst FormPanel = ({ panel }: { panel: EditFieldLayout[][] }) => {\n const isMobile = useIsMobile();\n const fieldValues = useForm('Fields', (state) => state.values);\n const rulesEngine = createRulesEngine();\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n const condition = field.attribute?.conditions?.visible;\n\n if (condition) {\n const isVisible = rulesEngine.evaluate(condition, fieldValues);\n if (!isVisible) {\n return null; // Skip rendering the dynamic zone if the condition is not met\n }\n }\n\n return (\n <Grid.Root key={field.name} gap={4}>\n <Grid.Item xs={12} direction=\"column\" alignItems=\"stretch\">\n <VersionInputRenderer {...field} />\n </Grid.Item>\n </Grid.Root>\n );\n }\n\n return (\n <Box\n hasRadius={!isMobile}\n background={{ initial: 'transparent', medium: 'neutral0' }}\n shadow={{ initial: 'none', medium: 'tableShadow' }}\n padding={{ initial: 0, medium: 6 }}\n borderColor={{ initial: 'transparent', medium: 'neutral150' }}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row, gridRowIndex) => {\n const visibleFields = row.filter((field) => {\n const condition = field.attribute?.conditions?.visible;\n\n if (condition) {\n return rulesEngine.evaluate(condition, fieldValues);\n }\n\n return true;\n });\n\n if (visibleFields.length === 0) {\n return null; // Skip rendering the entire grid row\n }\n\n return (\n <Grid.Root key={gridRowIndex} gap={{ initial: 6, medium: 4 }}>\n {visibleFields.map(({ size, ...field }) => {\n return (\n <Grid.Item\n col={size}\n key={field.name}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <VersionInputRenderer {...field} />\n </Grid.Item>\n );\n })}\n </Grid.Root>\n );\n })}\n </Flex>\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * VersionContent\n * -----------------------------------------------------------------------------------------------*/\n\ntype UnknownField = EditFieldLayout & { shouldIgnoreRBAC: boolean };\n\nconst VersionContent = () => {\n const { formatMessage } = useIntl();\n const { fieldSizes } = useTypedSelector((state) => state['content-manager'].app);\n const version = useHistoryContext('VersionContent', (state) => state.selectedVersion);\n const layout = useHistoryContext('VersionContent', (state) => state.layout);\n const configuration = useHistoryContext('VersionContent', (state) => state.configuration);\n const schema = useHistoryContext('VersionContent', (state) => state.schema);\n\n // Build a layout for the unknown fields section\n const removedAttributes = version.meta.unknownAttributes.removed;\n const removedAttributesAsFields = Object.entries(removedAttributes).map(\n ([attributeName, attribute]) => {\n const field = {\n attribute,\n shouldIgnoreRBAC: true,\n type: attribute.type,\n visible: true,\n disabled: true,\n label: attributeName,\n name: attributeName,\n size: fieldSizes[attribute.type].default ?? 12,\n } as UnknownField;\n\n return field;\n }\n );\n const unknownFieldsLayout = createLayoutFromFields(removedAttributesAsFields);\n\n // Build a layout for the fields that are were deleted from the layout\n const remainingFieldsLayout = getRemaingFieldsLayout({\n metadatas: configuration.contentType.metadatas,\n layout,\n schemaAttributes: schema.attributes,\n fieldSizes,\n });\n\n const { components } = useDoc();\n\n /**\n * Transform the data before passing it to the form so that each field\n * has a uniquely generated key\n */\n const transformedData = React.useMemo(() => {\n const transform =\n (schemaAttributes: Schema.Attributes, components: ComponentsDictionary = {}) =>\n (document: Omit<Document, 'id'>) => {\n const schema = { attributes: schemaAttributes };\n\n const transformations = pipe(\n removeFieldsThatDontExistOnSchema(schema),\n prepareTempKeys(schema, components)\n );\n return transformations(document);\n };\n\n return transform(version.schema, components)(version.data);\n }, [components, version.data, version.schema]);\n\n return (\n <Layouts.Content>\n <Box paddingBottom={{ initial: 0, large: 8 }}>\n <Form key={version.id} disabled={true} method=\"PUT\" initialValues={transformedData}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} position=\"relative\">\n {[...layout, ...remainingFieldsLayout].map((panel, index) => {\n return <FormPanel key={index} panel={panel} />;\n })}\n </Flex>\n </Form>\n {removedAttributesAsFields.length > 0 && (\n <>\n <Box paddingTop={{ initial: 4, large: 0 }}>\n <Divider />\n </Box>\n <Box paddingTop={{ initial: 4, large: 8 }}>\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n paddingBottom={{ initial: 4, large: 6 }}\n gap={1}\n >\n <Typography variant=\"delta\">\n {formatMessage({\n id: 'content-manager.history.content.unknown-fields.title',\n defaultMessage: 'Unknown fields',\n })}\n </Typography>\n <Typography variant=\"pi\">\n {formatMessage(\n {\n id: 'content-manager.history.content.unknown-fields.message',\n defaultMessage:\n 'These fields have been deleted or renamed in the Content-Type Builder. <b>These fields will not be restored.</b>',\n },\n {\n b: (chunks: React.ReactNode) => (\n <Typography variant=\"pi\" fontWeight=\"bold\">\n {chunks}\n </Typography>\n ),\n }\n )}\n </Typography>\n </Flex>\n <Form\n key={`${version.id}-unknownFields`}\n disabled={true}\n method=\"PUT\"\n initialValues={version.data}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} position=\"relative\">\n {unknownFieldsLayout.map((panel, index) => {\n return <FormPanel key={index} panel={panel} />;\n })}\n </Flex>\n </Form>\n </Box>\n </>\n )}\n </Box>\n </Layouts.Content>\n );\n};\n\nexport { VersionContent, getRemaingFieldsLayout };\n"],"names":["createLayoutFromFields","fields","reduce","rows","field","type","push","length","map","row","getRemaingFieldsLayout","layout","metadatas","schemaAttributes","fieldSizes","fieldsInLayout","flatMap","panel","name","remainingFields","Object","entries","currentRemainingFields","includes","edit","visible","attribute","disabled","label","size","default","FormPanel","isMobile","useIsMobile","fieldValues","useForm","state","values","rulesEngine","createRulesEngine","some","condition","conditions","isVisible","evaluate","_jsx","Grid","Root","gap","Item","xs","direction","alignItems","VersionInputRenderer","Box","hasRadius","background","initial","medium","shadow","padding","borderColor","Flex","gridRowIndex","visibleFields","filter","col","VersionContent","formatMessage","useIntl","useTypedSelector","app","version","useHistoryContext","selectedVersion","configuration","schema","removedAttributes","meta","unknownAttributes","removed","removedAttributesAsFields","attributeName","shouldIgnoreRBAC","unknownFieldsLayout","remainingFieldsLayout","contentType","attributes","components","useDoc","transformedData","React","useMemo","transform","document","transformations","pipe","removeFieldsThatDontExistOnSchema","prepareTempKeys","data","Layouts","Content","_jsxs","paddingBottom","large","Form","method","initialValues","position","index","id","_Fragment","paddingTop","Divider","Typography","variant","defaultMessage","b","chunks","fontWeight"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VersionContent.js","sources":["../../../../admin/src/history/components/VersionContent.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Form, Layouts, createRulesEngine, useForm, useIsMobile } from '@strapi/admin/strapi-admin';\nimport { Box, Divider, Flex, Grid, Typography } from '@strapi/design-system';\nimport pipe from 'lodash/fp/pipe';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../hooks/useDocument';\nimport { useTypedSelector } from '../../modules/hooks';\nimport {\n prepareTempKeys,\n removeFieldsThatDontExistOnSchema,\n} from '../../pages/EditView/utils/data';\nimport {\n getConditionDependencyPaths,\n getConditionDependencySubscriptionValue,\n} from '../../utils/conditionalFields';\nimport { HistoryContextValue, useHistoryContext } from '../pages/History';\n\nimport { VersionInputRenderer } from './VersionInputRenderer';\n\nimport type { Metadatas } from '../../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../../shared/contracts/init';\nimport type { ComponentsDictionary, Document } from '../../hooks/useDocument';\nimport type { EditFieldLayout } from '../../hooks/useDocumentLayout';\nimport type { Schema } from '@strapi/types';\n\nconst createLayoutFromFields = <T extends EditFieldLayout | UnknownField>(fields: T[]) => {\n return (\n fields\n .reduce<Array<T[]>>((rows, field) => {\n if (field.type === 'dynamiczone') {\n // Dynamic zones take up all the columns in a row\n rows.push([field]);\n\n return rows;\n }\n\n if (!rows[rows.length - 1]) {\n // Create a new row if there isn't one available\n rows.push([]);\n }\n\n // Push fields to the current row, they wrap and handle their own column size\n rows[rows.length - 1].push(field);\n\n return rows;\n }, [])\n // Map the rows to panels\n .map((row) => [row])\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * getRemainingFieldsLayout\n * -----------------------------------------------------------------------------------------------*/\n\ninterface GetRemainingFieldsLayoutOptions\n extends Pick<HistoryContextValue, 'layout'>,\n Pick<GetInitData.Response['data'], 'fieldSizes'> {\n schemaAttributes: HistoryContextValue['schema']['attributes'];\n metadatas: Metadatas;\n}\n\n/**\n * Build a layout for the fields that are were deleted from the edit view layout\n * via the configure the view page. This layout will be merged with the main one.\n * Those fields would be restored if the user restores the history version, which is why it's\n * important to show them, even if they're not in the normal layout.\n */\nfunction getRemaingFieldsLayout({\n layout,\n metadatas,\n schemaAttributes,\n fieldSizes,\n}: GetRemainingFieldsLayoutOptions) {\n const fieldsInLayout = layout.flatMap((panel) =>\n panel.flatMap((row) => row.flatMap((field) => field.name))\n );\n const remainingFields = Object.entries(metadatas).reduce<EditFieldLayout[]>(\n (currentRemainingFields, [name, field]) => {\n // Make sure we do not fields that are not visible, e.g. \"id\"\n if (!fieldsInLayout.includes(name) && field.edit.visible === true) {\n const attribute = schemaAttributes[name];\n // @ts-expect-error not sure why attribute causes type error\n currentRemainingFields.push({\n attribute,\n type: attribute.type,\n visible: true,\n disabled: true,\n label: field.edit.label || name,\n name: name,\n size: fieldSizes[attribute.type].default ?? 12,\n });\n }\n\n return currentRemainingFields;\n },\n []\n );\n\n return createLayoutFromFields(remainingFields);\n}\n\n/* -------------------------------------------------------------------------------------------------\n * FormPanel\n * -----------------------------------------------------------------------------------------------*/\n\n// Reuse one rules engine instance instead of creating a new one on every render.\nconst rulesEngine = createRulesEngine();\n\nconst getPanelConditionDependencyPaths = (panel: EditFieldLayout[][]): string[] | null => {\n // Aggregate condition dependencies across all fields in the panel so we can subscribe narrowly.\n const dependencies = new Set<string>();\n\n for (const row of panel) {\n for (const field of row) {\n const condition = field.attribute?.conditions?.visible;\n\n if (!condition) {\n continue;\n }\n\n const paths = getConditionDependencyPaths(condition);\n\n if (paths === null) {\n return null;\n }\n\n for (const path of paths) {\n dependencies.add(path);\n }\n }\n }\n\n return [...dependencies].sort();\n};\n\nconst FormPanel = ({ panel }: { panel: EditFieldLayout[][] }) => {\n const isMobile = useIsMobile();\n const conditionDependencyPaths = React.useMemo(\n () => getPanelConditionDependencyPaths(panel),\n [panel]\n );\n const getValues = useForm(\n 'FormPanel',\n (state) => (state as typeof state & { getValues: () => unknown }).getValues\n );\n const conditionSubscriptionValue = useForm('FormPanel', (state) => {\n return getConditionDependencySubscriptionValue(state.values, conditionDependencyPaths);\n });\n // For narrow subscriptions, read the latest full values lazily via getValues() to evaluate rules.\n // This avoids rerendering for unrelated form changes while preserving correct condition evaluation.\n const fieldValues = conditionDependencyPaths === null ? conditionSubscriptionValue : getValues();\n\n const isFieldVisible = React.useCallback(\n (field: EditFieldLayout) => {\n const condition = field.attribute?.conditions?.visible;\n\n if (!condition) {\n return true;\n }\n\n return rulesEngine.evaluate(condition, fieldValues);\n },\n [fieldValues]\n );\n\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n\n if (!isFieldVisible(field)) {\n return null;\n }\n\n return (\n <Grid.Root key={field.name} gap={4}>\n <Grid.Item xs={12} direction=\"column\" alignItems=\"stretch\">\n <VersionInputRenderer {...field} />\n </Grid.Item>\n </Grid.Root>\n );\n }\n\n return (\n <Box\n hasRadius={!isMobile}\n background={{ initial: 'transparent', medium: 'neutral0' }}\n shadow={{ initial: 'none', medium: 'tableShadow' }}\n padding={{ initial: 0, medium: 6 }}\n borderColor={{ initial: 'transparent', medium: 'neutral150' }}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row, gridRowIndex) => {\n const visibleFields = row.filter(isFieldVisible);\n\n if (visibleFields.length === 0) {\n return null; // Skip rendering the entire grid row\n }\n\n return (\n <Grid.Root key={gridRowIndex} gap={{ initial: 6, medium: 4 }}>\n {visibleFields.map(({ size, ...field }) => {\n return (\n <Grid.Item\n col={size}\n key={field.name}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <VersionInputRenderer {...field} />\n </Grid.Item>\n );\n })}\n </Grid.Root>\n );\n })}\n </Flex>\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * VersionContent\n * -----------------------------------------------------------------------------------------------*/\n\ntype UnknownField = EditFieldLayout & { shouldIgnoreRBAC: boolean };\n\nconst VersionContent = () => {\n const { formatMessage } = useIntl();\n const { fieldSizes } = useTypedSelector((state) => state['content-manager'].app);\n const version = useHistoryContext('VersionContent', (state) => state.selectedVersion);\n const layout = useHistoryContext('VersionContent', (state) => state.layout);\n const configuration = useHistoryContext('VersionContent', (state) => state.configuration);\n const schema = useHistoryContext('VersionContent', (state) => state.schema);\n\n // Build a layout for the unknown fields section\n const removedAttributes = version.meta.unknownAttributes.removed;\n const removedAttributesAsFields = Object.entries(removedAttributes).map(\n ([attributeName, attribute]) => {\n const field = {\n attribute,\n shouldIgnoreRBAC: true,\n type: attribute.type,\n visible: true,\n disabled: true,\n label: attributeName,\n name: attributeName,\n size: fieldSizes[attribute.type].default ?? 12,\n } as UnknownField;\n\n return field;\n }\n );\n const unknownFieldsLayout = createLayoutFromFields(removedAttributesAsFields);\n\n // Build a layout for the fields that are were deleted from the layout\n const remainingFieldsLayout = getRemaingFieldsLayout({\n metadatas: configuration.contentType.metadatas,\n layout,\n schemaAttributes: schema.attributes,\n fieldSizes,\n });\n\n const { components } = useDoc();\n\n /**\n * Transform the data before passing it to the form so that each field\n * has a uniquely generated key\n */\n const transformedData = React.useMemo(() => {\n const transform =\n (schemaAttributes: Schema.Attributes, components: ComponentsDictionary = {}) =>\n (document: Omit<Document, 'id'>) => {\n const schema = { attributes: schemaAttributes };\n\n const transformations = pipe(\n removeFieldsThatDontExistOnSchema(schema),\n prepareTempKeys(schema, components)\n );\n return transformations(document);\n };\n\n return transform(version.schema, components)(version.data);\n }, [components, version.data, version.schema]);\n\n return (\n <Layouts.Content>\n <Box paddingBottom={{ initial: 0, large: 8 }}>\n <Form key={version.id} disabled={true} method=\"PUT\" initialValues={transformedData}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} position=\"relative\">\n {[...layout, ...remainingFieldsLayout].map((panel, index) => {\n return <FormPanel key={index} panel={panel} />;\n })}\n </Flex>\n </Form>\n {removedAttributesAsFields.length > 0 && (\n <>\n <Box paddingTop={{ initial: 4, large: 0 }}>\n <Divider />\n </Box>\n <Box paddingTop={{ initial: 4, large: 8 }}>\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n paddingBottom={{ initial: 4, large: 6 }}\n gap={1}\n >\n <Typography variant=\"delta\">\n {formatMessage({\n id: 'content-manager.history.content.unknown-fields.title',\n defaultMessage: 'Unknown fields',\n })}\n </Typography>\n <Typography variant=\"pi\">\n {formatMessage(\n {\n id: 'content-manager.history.content.unknown-fields.message',\n defaultMessage:\n 'These fields have been deleted or renamed in the Content-Type Builder. <b>These fields will not be restored.</b>',\n },\n {\n b: (chunks: React.ReactNode) => (\n <Typography variant=\"pi\" fontWeight=\"bold\">\n {chunks}\n </Typography>\n ),\n }\n )}\n </Typography>\n </Flex>\n <Form\n key={`${version.id}-unknownFields`}\n disabled={true}\n method=\"PUT\"\n initialValues={version.data}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} position=\"relative\">\n {unknownFieldsLayout.map((panel, index) => {\n return <FormPanel key={index} panel={panel} />;\n })}\n </Flex>\n </Form>\n </Box>\n </>\n )}\n </Box>\n </Layouts.Content>\n );\n};\n\nexport { VersionContent, getRemaingFieldsLayout };\n"],"names":["createLayoutFromFields","fields","reduce","rows","field","type","push","length","map","row","getRemaingFieldsLayout","layout","metadatas","schemaAttributes","fieldSizes","fieldsInLayout","flatMap","panel","name","remainingFields","Object","entries","currentRemainingFields","includes","edit","visible","attribute","disabled","label","size","default","rulesEngine","createRulesEngine","getPanelConditionDependencyPaths","dependencies","Set","condition","conditions","paths","getConditionDependencyPaths","path","add","sort","FormPanel","isMobile","useIsMobile","conditionDependencyPaths","React","useMemo","getValues","useForm","state","conditionSubscriptionValue","getConditionDependencySubscriptionValue","values","fieldValues","isFieldVisible","useCallback","evaluate","some","_jsx","Grid","Root","gap","Item","xs","direction","alignItems","VersionInputRenderer","Box","hasRadius","background","initial","medium","shadow","padding","borderColor","Flex","gridRowIndex","visibleFields","filter","col","VersionContent","formatMessage","useIntl","useTypedSelector","app","version","useHistoryContext","selectedVersion","configuration","schema","removedAttributes","meta","unknownAttributes","removed","removedAttributesAsFields","attributeName","shouldIgnoreRBAC","unknownFieldsLayout","remainingFieldsLayout","contentType","attributes","components","useDoc","transformedData","transform","document","transformations","pipe","removeFieldsThatDontExistOnSchema","prepareTempKeys","data","Layouts","Content","_jsxs","paddingBottom","large","Form","method","initialValues","position","index","id","_Fragment","paddingTop","Divider","Typography","variant","defaultMessage","b","chunks","fontWeight"],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import { useIntl } from 'react-intl';
|
|
|
7
7
|
import { useDoc } from '../../hooks/useDocument.mjs';
|
|
8
8
|
import { useTypedSelector } from '../../modules/hooks.mjs';
|
|
9
9
|
import { removeFieldsThatDontExistOnSchema, prepareTempKeys } from '../../pages/EditView/utils/data.mjs';
|
|
10
|
+
import { getConditionDependencySubscriptionValue, getConditionDependencyPaths } from '../../utils/conditionalFields.mjs';
|
|
10
11
|
import { useHistoryContext } from '../pages/History.mjs';
|
|
11
12
|
import { VersionInputRenderer } from './VersionInputRenderer.mjs';
|
|
12
13
|
|
|
@@ -59,19 +60,56 @@ const createLayoutFromFields = (fields)=>{
|
|
|
59
60
|
}
|
|
60
61
|
/* -------------------------------------------------------------------------------------------------
|
|
61
62
|
* FormPanel
|
|
62
|
-
* -----------------------------------------------------------------------------------------------*/
|
|
63
|
+
* -----------------------------------------------------------------------------------------------*/ // Reuse one rules engine instance instead of creating a new one on every render.
|
|
64
|
+
const rulesEngine = createRulesEngine();
|
|
65
|
+
const getPanelConditionDependencyPaths = (panel)=>{
|
|
66
|
+
// Aggregate condition dependencies across all fields in the panel so we can subscribe narrowly.
|
|
67
|
+
const dependencies = new Set();
|
|
68
|
+
for (const row of panel){
|
|
69
|
+
for (const field of row){
|
|
70
|
+
const condition = field.attribute?.conditions?.visible;
|
|
71
|
+
if (!condition) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const paths = getConditionDependencyPaths(condition);
|
|
75
|
+
if (paths === null) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
for (const path of paths){
|
|
79
|
+
dependencies.add(path);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return [
|
|
84
|
+
...dependencies
|
|
85
|
+
].sort();
|
|
86
|
+
};
|
|
87
|
+
const FormPanel = ({ panel })=>{
|
|
63
88
|
const isMobile = useIsMobile();
|
|
64
|
-
const
|
|
65
|
-
|
|
89
|
+
const conditionDependencyPaths = React.useMemo(()=>getPanelConditionDependencyPaths(panel), [
|
|
90
|
+
panel
|
|
91
|
+
]);
|
|
92
|
+
const getValues = useForm('FormPanel', (state)=>state.getValues);
|
|
93
|
+
const conditionSubscriptionValue = useForm('FormPanel', (state)=>{
|
|
94
|
+
return getConditionDependencySubscriptionValue(state.values, conditionDependencyPaths);
|
|
95
|
+
});
|
|
96
|
+
// For narrow subscriptions, read the latest full values lazily via getValues() to evaluate rules.
|
|
97
|
+
// This avoids rerendering for unrelated form changes while preserving correct condition evaluation.
|
|
98
|
+
const fieldValues = conditionDependencyPaths === null ? conditionSubscriptionValue : getValues();
|
|
99
|
+
const isFieldVisible = React.useCallback((field)=>{
|
|
100
|
+
const condition = field.attribute?.conditions?.visible;
|
|
101
|
+
if (!condition) {
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
return rulesEngine.evaluate(condition, fieldValues);
|
|
105
|
+
}, [
|
|
106
|
+
fieldValues
|
|
107
|
+
]);
|
|
66
108
|
if (panel.some((row)=>row.some((field)=>field.type === 'dynamiczone'))) {
|
|
67
109
|
const [row] = panel;
|
|
68
110
|
const [field] = row;
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const isVisible = rulesEngine.evaluate(condition, fieldValues);
|
|
72
|
-
if (!isVisible) {
|
|
73
|
-
return null; // Skip rendering the dynamic zone if the condition is not met
|
|
74
|
-
}
|
|
111
|
+
if (!isFieldVisible(field)) {
|
|
112
|
+
return null;
|
|
75
113
|
}
|
|
76
114
|
return /*#__PURE__*/ jsx(Grid.Root, {
|
|
77
115
|
gap: 4,
|
|
@@ -108,13 +146,7 @@ const createLayoutFromFields = (fields)=>{
|
|
|
108
146
|
alignItems: "stretch",
|
|
109
147
|
gap: 6,
|
|
110
148
|
children: panel.map((row, gridRowIndex)=>{
|
|
111
|
-
const visibleFields = row.filter(
|
|
112
|
-
const condition = field.attribute?.conditions?.visible;
|
|
113
|
-
if (condition) {
|
|
114
|
-
return rulesEngine.evaluate(condition, fieldValues);
|
|
115
|
-
}
|
|
116
|
-
return true;
|
|
117
|
-
});
|
|
149
|
+
const visibleFields = row.filter(isFieldVisible);
|
|
118
150
|
if (visibleFields.length === 0) {
|
|
119
151
|
return null; // Skip rendering the entire grid row
|
|
120
152
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VersionContent.mjs","sources":["../../../../admin/src/history/components/VersionContent.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Form, Layouts, useForm, createRulesEngine, useIsMobile } from '@strapi/admin/strapi-admin';\nimport { Box, Divider, Flex, Grid, Typography } from '@strapi/design-system';\nimport pipe from 'lodash/fp/pipe';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../hooks/useDocument';\nimport { useTypedSelector } from '../../modules/hooks';\nimport {\n prepareTempKeys,\n removeFieldsThatDontExistOnSchema,\n} from '../../pages/EditView/utils/data';\nimport { HistoryContextValue, useHistoryContext } from '../pages/History';\n\nimport { VersionInputRenderer } from './VersionInputRenderer';\n\nimport type { Metadatas } from '../../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../../shared/contracts/init';\nimport type { ComponentsDictionary, Document } from '../../hooks/useDocument';\nimport type { EditFieldLayout } from '../../hooks/useDocumentLayout';\nimport type { Schema } from '@strapi/types';\n\nconst createLayoutFromFields = <T extends EditFieldLayout | UnknownField>(fields: T[]) => {\n return (\n fields\n .reduce<Array<T[]>>((rows, field) => {\n if (field.type === 'dynamiczone') {\n // Dynamic zones take up all the columns in a row\n rows.push([field]);\n\n return rows;\n }\n\n if (!rows[rows.length - 1]) {\n // Create a new row if there isn't one available\n rows.push([]);\n }\n\n // Push fields to the current row, they wrap and handle their own column size\n rows[rows.length - 1].push(field);\n\n return rows;\n }, [])\n // Map the rows to panels\n .map((row) => [row])\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * getRemainingFieldsLayout\n * -----------------------------------------------------------------------------------------------*/\n\ninterface GetRemainingFieldsLayoutOptions\n extends Pick<HistoryContextValue, 'layout'>,\n Pick<GetInitData.Response['data'], 'fieldSizes'> {\n schemaAttributes: HistoryContextValue['schema']['attributes'];\n metadatas: Metadatas;\n}\n\n/**\n * Build a layout for the fields that are were deleted from the edit view layout\n * via the configure the view page. This layout will be merged with the main one.\n * Those fields would be restored if the user restores the history version, which is why it's\n * important to show them, even if they're not in the normal layout.\n */\nfunction getRemaingFieldsLayout({\n layout,\n metadatas,\n schemaAttributes,\n fieldSizes,\n}: GetRemainingFieldsLayoutOptions) {\n const fieldsInLayout = layout.flatMap((panel) =>\n panel.flatMap((row) => row.flatMap((field) => field.name))\n );\n const remainingFields = Object.entries(metadatas).reduce<EditFieldLayout[]>(\n (currentRemainingFields, [name, field]) => {\n // Make sure we do not fields that are not visible, e.g. \"id\"\n if (!fieldsInLayout.includes(name) && field.edit.visible === true) {\n const attribute = schemaAttributes[name];\n // @ts-expect-error not sure why attribute causes type error\n currentRemainingFields.push({\n attribute,\n type: attribute.type,\n visible: true,\n disabled: true,\n label: field.edit.label || name,\n name: name,\n size: fieldSizes[attribute.type].default ?? 12,\n });\n }\n\n return currentRemainingFields;\n },\n []\n );\n\n return createLayoutFromFields(remainingFields);\n}\n\n/* -------------------------------------------------------------------------------------------------\n * FormPanel\n * -----------------------------------------------------------------------------------------------*/\n\nconst FormPanel = ({ panel }: { panel: EditFieldLayout[][] }) => {\n const isMobile = useIsMobile();\n const fieldValues = useForm('Fields', (state) => state.values);\n const rulesEngine = createRulesEngine();\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n const condition = field.attribute?.conditions?.visible;\n\n if (condition) {\n const isVisible = rulesEngine.evaluate(condition, fieldValues);\n if (!isVisible) {\n return null; // Skip rendering the dynamic zone if the condition is not met\n }\n }\n\n return (\n <Grid.Root key={field.name} gap={4}>\n <Grid.Item xs={12} direction=\"column\" alignItems=\"stretch\">\n <VersionInputRenderer {...field} />\n </Grid.Item>\n </Grid.Root>\n );\n }\n\n return (\n <Box\n hasRadius={!isMobile}\n background={{ initial: 'transparent', medium: 'neutral0' }}\n shadow={{ initial: 'none', medium: 'tableShadow' }}\n padding={{ initial: 0, medium: 6 }}\n borderColor={{ initial: 'transparent', medium: 'neutral150' }}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row, gridRowIndex) => {\n const visibleFields = row.filter((field) => {\n const condition = field.attribute?.conditions?.visible;\n\n if (condition) {\n return rulesEngine.evaluate(condition, fieldValues);\n }\n\n return true;\n });\n\n if (visibleFields.length === 0) {\n return null; // Skip rendering the entire grid row\n }\n\n return (\n <Grid.Root key={gridRowIndex} gap={{ initial: 6, medium: 4 }}>\n {visibleFields.map(({ size, ...field }) => {\n return (\n <Grid.Item\n col={size}\n key={field.name}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <VersionInputRenderer {...field} />\n </Grid.Item>\n );\n })}\n </Grid.Root>\n );\n })}\n </Flex>\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * VersionContent\n * -----------------------------------------------------------------------------------------------*/\n\ntype UnknownField = EditFieldLayout & { shouldIgnoreRBAC: boolean };\n\nconst VersionContent = () => {\n const { formatMessage } = useIntl();\n const { fieldSizes } = useTypedSelector((state) => state['content-manager'].app);\n const version = useHistoryContext('VersionContent', (state) => state.selectedVersion);\n const layout = useHistoryContext('VersionContent', (state) => state.layout);\n const configuration = useHistoryContext('VersionContent', (state) => state.configuration);\n const schema = useHistoryContext('VersionContent', (state) => state.schema);\n\n // Build a layout for the unknown fields section\n const removedAttributes = version.meta.unknownAttributes.removed;\n const removedAttributesAsFields = Object.entries(removedAttributes).map(\n ([attributeName, attribute]) => {\n const field = {\n attribute,\n shouldIgnoreRBAC: true,\n type: attribute.type,\n visible: true,\n disabled: true,\n label: attributeName,\n name: attributeName,\n size: fieldSizes[attribute.type].default ?? 12,\n } as UnknownField;\n\n return field;\n }\n );\n const unknownFieldsLayout = createLayoutFromFields(removedAttributesAsFields);\n\n // Build a layout for the fields that are were deleted from the layout\n const remainingFieldsLayout = getRemaingFieldsLayout({\n metadatas: configuration.contentType.metadatas,\n layout,\n schemaAttributes: schema.attributes,\n fieldSizes,\n });\n\n const { components } = useDoc();\n\n /**\n * Transform the data before passing it to the form so that each field\n * has a uniquely generated key\n */\n const transformedData = React.useMemo(() => {\n const transform =\n (schemaAttributes: Schema.Attributes, components: ComponentsDictionary = {}) =>\n (document: Omit<Document, 'id'>) => {\n const schema = { attributes: schemaAttributes };\n\n const transformations = pipe(\n removeFieldsThatDontExistOnSchema(schema),\n prepareTempKeys(schema, components)\n );\n return transformations(document);\n };\n\n return transform(version.schema, components)(version.data);\n }, [components, version.data, version.schema]);\n\n return (\n <Layouts.Content>\n <Box paddingBottom={{ initial: 0, large: 8 }}>\n <Form key={version.id} disabled={true} method=\"PUT\" initialValues={transformedData}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} position=\"relative\">\n {[...layout, ...remainingFieldsLayout].map((panel, index) => {\n return <FormPanel key={index} panel={panel} />;\n })}\n </Flex>\n </Form>\n {removedAttributesAsFields.length > 0 && (\n <>\n <Box paddingTop={{ initial: 4, large: 0 }}>\n <Divider />\n </Box>\n <Box paddingTop={{ initial: 4, large: 8 }}>\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n paddingBottom={{ initial: 4, large: 6 }}\n gap={1}\n >\n <Typography variant=\"delta\">\n {formatMessage({\n id: 'content-manager.history.content.unknown-fields.title',\n defaultMessage: 'Unknown fields',\n })}\n </Typography>\n <Typography variant=\"pi\">\n {formatMessage(\n {\n id: 'content-manager.history.content.unknown-fields.message',\n defaultMessage:\n 'These fields have been deleted or renamed in the Content-Type Builder. <b>These fields will not be restored.</b>',\n },\n {\n b: (chunks: React.ReactNode) => (\n <Typography variant=\"pi\" fontWeight=\"bold\">\n {chunks}\n </Typography>\n ),\n }\n )}\n </Typography>\n </Flex>\n <Form\n key={`${version.id}-unknownFields`}\n disabled={true}\n method=\"PUT\"\n initialValues={version.data}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} position=\"relative\">\n {unknownFieldsLayout.map((panel, index) => {\n return <FormPanel key={index} panel={panel} />;\n })}\n </Flex>\n </Form>\n </Box>\n </>\n )}\n </Box>\n </Layouts.Content>\n );\n};\n\nexport { VersionContent, getRemaingFieldsLayout };\n"],"names":["createLayoutFromFields","fields","reduce","rows","field","type","push","length","map","row","getRemaingFieldsLayout","layout","metadatas","schemaAttributes","fieldSizes","fieldsInLayout","flatMap","panel","name","remainingFields","Object","entries","currentRemainingFields","includes","edit","visible","attribute","disabled","label","size","default","FormPanel","isMobile","useIsMobile","fieldValues","useForm","state","values","rulesEngine","createRulesEngine","some","condition","conditions","isVisible","evaluate","_jsx","Grid","Root","gap","Item","xs","direction","alignItems","VersionInputRenderer","Box","hasRadius","background","initial","medium","shadow","padding","borderColor","Flex","gridRowIndex","visibleFields","filter","col","VersionContent","formatMessage","useIntl","useTypedSelector","app","version","useHistoryContext","selectedVersion","configuration","schema","removedAttributes","meta","unknownAttributes","removed","removedAttributesAsFields","attributeName","shouldIgnoreRBAC","unknownFieldsLayout","remainingFieldsLayout","contentType","attributes","components","useDoc","transformedData","React","useMemo","transform","document","transformations","pipe","removeFieldsThatDontExistOnSchema","prepareTempKeys","data","Layouts","Content","_jsxs","paddingBottom","large","Form","method","initialValues","position","index","id","_Fragment","paddingTop","Divider","Typography","variant","defaultMessage","b","chunks","fontWeight"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VersionContent.mjs","sources":["../../../../admin/src/history/components/VersionContent.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Form, Layouts, createRulesEngine, useForm, useIsMobile } from '@strapi/admin/strapi-admin';\nimport { Box, Divider, Flex, Grid, Typography } from '@strapi/design-system';\nimport pipe from 'lodash/fp/pipe';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../hooks/useDocument';\nimport { useTypedSelector } from '../../modules/hooks';\nimport {\n prepareTempKeys,\n removeFieldsThatDontExistOnSchema,\n} from '../../pages/EditView/utils/data';\nimport {\n getConditionDependencyPaths,\n getConditionDependencySubscriptionValue,\n} from '../../utils/conditionalFields';\nimport { HistoryContextValue, useHistoryContext } from '../pages/History';\n\nimport { VersionInputRenderer } from './VersionInputRenderer';\n\nimport type { Metadatas } from '../../../../shared/contracts/content-types';\nimport type { GetInitData } from '../../../../shared/contracts/init';\nimport type { ComponentsDictionary, Document } from '../../hooks/useDocument';\nimport type { EditFieldLayout } from '../../hooks/useDocumentLayout';\nimport type { Schema } from '@strapi/types';\n\nconst createLayoutFromFields = <T extends EditFieldLayout | UnknownField>(fields: T[]) => {\n return (\n fields\n .reduce<Array<T[]>>((rows, field) => {\n if (field.type === 'dynamiczone') {\n // Dynamic zones take up all the columns in a row\n rows.push([field]);\n\n return rows;\n }\n\n if (!rows[rows.length - 1]) {\n // Create a new row if there isn't one available\n rows.push([]);\n }\n\n // Push fields to the current row, they wrap and handle their own column size\n rows[rows.length - 1].push(field);\n\n return rows;\n }, [])\n // Map the rows to panels\n .map((row) => [row])\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * getRemainingFieldsLayout\n * -----------------------------------------------------------------------------------------------*/\n\ninterface GetRemainingFieldsLayoutOptions\n extends Pick<HistoryContextValue, 'layout'>,\n Pick<GetInitData.Response['data'], 'fieldSizes'> {\n schemaAttributes: HistoryContextValue['schema']['attributes'];\n metadatas: Metadatas;\n}\n\n/**\n * Build a layout for the fields that are were deleted from the edit view layout\n * via the configure the view page. This layout will be merged with the main one.\n * Those fields would be restored if the user restores the history version, which is why it's\n * important to show them, even if they're not in the normal layout.\n */\nfunction getRemaingFieldsLayout({\n layout,\n metadatas,\n schemaAttributes,\n fieldSizes,\n}: GetRemainingFieldsLayoutOptions) {\n const fieldsInLayout = layout.flatMap((panel) =>\n panel.flatMap((row) => row.flatMap((field) => field.name))\n );\n const remainingFields = Object.entries(metadatas).reduce<EditFieldLayout[]>(\n (currentRemainingFields, [name, field]) => {\n // Make sure we do not fields that are not visible, e.g. \"id\"\n if (!fieldsInLayout.includes(name) && field.edit.visible === true) {\n const attribute = schemaAttributes[name];\n // @ts-expect-error not sure why attribute causes type error\n currentRemainingFields.push({\n attribute,\n type: attribute.type,\n visible: true,\n disabled: true,\n label: field.edit.label || name,\n name: name,\n size: fieldSizes[attribute.type].default ?? 12,\n });\n }\n\n return currentRemainingFields;\n },\n []\n );\n\n return createLayoutFromFields(remainingFields);\n}\n\n/* -------------------------------------------------------------------------------------------------\n * FormPanel\n * -----------------------------------------------------------------------------------------------*/\n\n// Reuse one rules engine instance instead of creating a new one on every render.\nconst rulesEngine = createRulesEngine();\n\nconst getPanelConditionDependencyPaths = (panel: EditFieldLayout[][]): string[] | null => {\n // Aggregate condition dependencies across all fields in the panel so we can subscribe narrowly.\n const dependencies = new Set<string>();\n\n for (const row of panel) {\n for (const field of row) {\n const condition = field.attribute?.conditions?.visible;\n\n if (!condition) {\n continue;\n }\n\n const paths = getConditionDependencyPaths(condition);\n\n if (paths === null) {\n return null;\n }\n\n for (const path of paths) {\n dependencies.add(path);\n }\n }\n }\n\n return [...dependencies].sort();\n};\n\nconst FormPanel = ({ panel }: { panel: EditFieldLayout[][] }) => {\n const isMobile = useIsMobile();\n const conditionDependencyPaths = React.useMemo(\n () => getPanelConditionDependencyPaths(panel),\n [panel]\n );\n const getValues = useForm(\n 'FormPanel',\n (state) => (state as typeof state & { getValues: () => unknown }).getValues\n );\n const conditionSubscriptionValue = useForm('FormPanel', (state) => {\n return getConditionDependencySubscriptionValue(state.values, conditionDependencyPaths);\n });\n // For narrow subscriptions, read the latest full values lazily via getValues() to evaluate rules.\n // This avoids rerendering for unrelated form changes while preserving correct condition evaluation.\n const fieldValues = conditionDependencyPaths === null ? conditionSubscriptionValue : getValues();\n\n const isFieldVisible = React.useCallback(\n (field: EditFieldLayout) => {\n const condition = field.attribute?.conditions?.visible;\n\n if (!condition) {\n return true;\n }\n\n return rulesEngine.evaluate(condition, fieldValues);\n },\n [fieldValues]\n );\n\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n\n if (!isFieldVisible(field)) {\n return null;\n }\n\n return (\n <Grid.Root key={field.name} gap={4}>\n <Grid.Item xs={12} direction=\"column\" alignItems=\"stretch\">\n <VersionInputRenderer {...field} />\n </Grid.Item>\n </Grid.Root>\n );\n }\n\n return (\n <Box\n hasRadius={!isMobile}\n background={{ initial: 'transparent', medium: 'neutral0' }}\n shadow={{ initial: 'none', medium: 'tableShadow' }}\n padding={{ initial: 0, medium: 6 }}\n borderColor={{ initial: 'transparent', medium: 'neutral150' }}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row, gridRowIndex) => {\n const visibleFields = row.filter(isFieldVisible);\n\n if (visibleFields.length === 0) {\n return null; // Skip rendering the entire grid row\n }\n\n return (\n <Grid.Root key={gridRowIndex} gap={{ initial: 6, medium: 4 }}>\n {visibleFields.map(({ size, ...field }) => {\n return (\n <Grid.Item\n col={size}\n key={field.name}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <VersionInputRenderer {...field} />\n </Grid.Item>\n );\n })}\n </Grid.Root>\n );\n })}\n </Flex>\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * VersionContent\n * -----------------------------------------------------------------------------------------------*/\n\ntype UnknownField = EditFieldLayout & { shouldIgnoreRBAC: boolean };\n\nconst VersionContent = () => {\n const { formatMessage } = useIntl();\n const { fieldSizes } = useTypedSelector((state) => state['content-manager'].app);\n const version = useHistoryContext('VersionContent', (state) => state.selectedVersion);\n const layout = useHistoryContext('VersionContent', (state) => state.layout);\n const configuration = useHistoryContext('VersionContent', (state) => state.configuration);\n const schema = useHistoryContext('VersionContent', (state) => state.schema);\n\n // Build a layout for the unknown fields section\n const removedAttributes = version.meta.unknownAttributes.removed;\n const removedAttributesAsFields = Object.entries(removedAttributes).map(\n ([attributeName, attribute]) => {\n const field = {\n attribute,\n shouldIgnoreRBAC: true,\n type: attribute.type,\n visible: true,\n disabled: true,\n label: attributeName,\n name: attributeName,\n size: fieldSizes[attribute.type].default ?? 12,\n } as UnknownField;\n\n return field;\n }\n );\n const unknownFieldsLayout = createLayoutFromFields(removedAttributesAsFields);\n\n // Build a layout for the fields that are were deleted from the layout\n const remainingFieldsLayout = getRemaingFieldsLayout({\n metadatas: configuration.contentType.metadatas,\n layout,\n schemaAttributes: schema.attributes,\n fieldSizes,\n });\n\n const { components } = useDoc();\n\n /**\n * Transform the data before passing it to the form so that each field\n * has a uniquely generated key\n */\n const transformedData = React.useMemo(() => {\n const transform =\n (schemaAttributes: Schema.Attributes, components: ComponentsDictionary = {}) =>\n (document: Omit<Document, 'id'>) => {\n const schema = { attributes: schemaAttributes };\n\n const transformations = pipe(\n removeFieldsThatDontExistOnSchema(schema),\n prepareTempKeys(schema, components)\n );\n return transformations(document);\n };\n\n return transform(version.schema, components)(version.data);\n }, [components, version.data, version.schema]);\n\n return (\n <Layouts.Content>\n <Box paddingBottom={{ initial: 0, large: 8 }}>\n <Form key={version.id} disabled={true} method=\"PUT\" initialValues={transformedData}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} position=\"relative\">\n {[...layout, ...remainingFieldsLayout].map((panel, index) => {\n return <FormPanel key={index} panel={panel} />;\n })}\n </Flex>\n </Form>\n {removedAttributesAsFields.length > 0 && (\n <>\n <Box paddingTop={{ initial: 4, large: 0 }}>\n <Divider />\n </Box>\n <Box paddingTop={{ initial: 4, large: 8 }}>\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n paddingBottom={{ initial: 4, large: 6 }}\n gap={1}\n >\n <Typography variant=\"delta\">\n {formatMessage({\n id: 'content-manager.history.content.unknown-fields.title',\n defaultMessage: 'Unknown fields',\n })}\n </Typography>\n <Typography variant=\"pi\">\n {formatMessage(\n {\n id: 'content-manager.history.content.unknown-fields.message',\n defaultMessage:\n 'These fields have been deleted or renamed in the Content-Type Builder. <b>These fields will not be restored.</b>',\n },\n {\n b: (chunks: React.ReactNode) => (\n <Typography variant=\"pi\" fontWeight=\"bold\">\n {chunks}\n </Typography>\n ),\n }\n )}\n </Typography>\n </Flex>\n <Form\n key={`${version.id}-unknownFields`}\n disabled={true}\n method=\"PUT\"\n initialValues={version.data}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} position=\"relative\">\n {unknownFieldsLayout.map((panel, index) => {\n return <FormPanel key={index} panel={panel} />;\n })}\n </Flex>\n </Form>\n </Box>\n </>\n )}\n </Box>\n </Layouts.Content>\n );\n};\n\nexport { VersionContent, getRemaingFieldsLayout };\n"],"names":["createLayoutFromFields","fields","reduce","rows","field","type","push","length","map","row","getRemaingFieldsLayout","layout","metadatas","schemaAttributes","fieldSizes","fieldsInLayout","flatMap","panel","name","remainingFields","Object","entries","currentRemainingFields","includes","edit","visible","attribute","disabled","label","size","default","rulesEngine","createRulesEngine","getPanelConditionDependencyPaths","dependencies","Set","condition","conditions","paths","getConditionDependencyPaths","path","add","sort","FormPanel","isMobile","useIsMobile","conditionDependencyPaths","React","useMemo","getValues","useForm","state","conditionSubscriptionValue","getConditionDependencySubscriptionValue","values","fieldValues","isFieldVisible","useCallback","evaluate","some","_jsx","Grid","Root","gap","Item","xs","direction","alignItems","VersionInputRenderer","Box","hasRadius","background","initial","medium","shadow","padding","borderColor","Flex","gridRowIndex","visibleFields","filter","col","VersionContent","formatMessage","useIntl","useTypedSelector","app","version","useHistoryContext","selectedVersion","configuration","schema","removedAttributes","meta","unknownAttributes","removed","removedAttributesAsFields","attributeName","shouldIgnoreRBAC","unknownFieldsLayout","remainingFieldsLayout","contentType","attributes","components","useDoc","transformedData","transform","document","transformations","pipe","removeFieldsThatDontExistOnSchema","prepareTempKeys","data","Layouts","Content","_jsxs","paddingBottom","large","Form","method","initialValues","position","index","id","_Fragment","paddingTop","Divider","Typography","variant","defaultMessage","b","chunks","fontWeight"],"mappings":"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"}
|
|
@@ -304,6 +304,55 @@ const isText = (node)=>{
|
|
|
304
304
|
});
|
|
305
305
|
}
|
|
306
306
|
};
|
|
307
|
+
/**
|
|
308
|
+
* Common handler for the shift+tab key on ordered and unordered lists (un-indentation)
|
|
309
|
+
*/ const hasChildren = (node)=>{
|
|
310
|
+
return typeof node === 'object' && node !== null && 'children' in node;
|
|
311
|
+
};
|
|
312
|
+
const handleShiftTabOnList = (editor)=>{
|
|
313
|
+
const currentListItemEntry = slate.Editor.above(editor, {
|
|
314
|
+
match: (node)=>!slate.Editor.isEditor(node) && 'type' in node && node.type === 'list-item'
|
|
315
|
+
});
|
|
316
|
+
if (!currentListItemEntry || !editor.selection) {
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
const [, currentListItemPath] = currentListItemEntry;
|
|
320
|
+
const [currentList] = slate.Editor.parent(editor, currentListItemPath);
|
|
321
|
+
if (!slate.Editor.isEditor(currentList) && hasChildren(currentList) && currentList.type === 'list') {
|
|
322
|
+
const parentListPath = slate.Path.parent(currentListItemPath);
|
|
323
|
+
const [parentList] = slate.Editor.parent(editor, parentListPath);
|
|
324
|
+
// Case 1: The parent of the current list is the editor itself.
|
|
325
|
+
if (slate.Editor.isEditor(parentList)) {
|
|
326
|
+
// Lift the list item to the top level of the editor's children.
|
|
327
|
+
slate.Transforms.liftNodes(editor, {
|
|
328
|
+
at: currentListItemPath,
|
|
329
|
+
match: (node)=>!slate.Editor.isEditor(node) && 'type' in node && node.type === 'list-item'
|
|
330
|
+
});
|
|
331
|
+
// Change the type of the newly lifted node from 'list-item' to 'paragraph'.
|
|
332
|
+
slate.Transforms.setNodes(editor, {
|
|
333
|
+
type: 'paragraph'
|
|
334
|
+
});
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
// Case 2: The parent of the current list is another list.
|
|
338
|
+
if (hasChildren(parentList) && parentList.type === 'list') {
|
|
339
|
+
slate.Transforms.liftNodes(editor, {
|
|
340
|
+
at: currentListItemPath,
|
|
341
|
+
match: (node)=>!slate.Editor.isEditor(node) && 'type' in node && node.type === 'list-item'
|
|
342
|
+
});
|
|
343
|
+
try {
|
|
344
|
+
const [remainingList, remainingListPath] = slate.Editor.node(editor, parentListPath);
|
|
345
|
+
if (hasChildren(remainingList) && remainingList.type === 'list' && remainingList.children.length === 0) {
|
|
346
|
+
slate.Transforms.removeNodes(editor, {
|
|
347
|
+
at: remainingListPath
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
} catch (error) {
|
|
351
|
+
// The path might no longer exist if the structure changed, which is fine
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
};
|
|
307
356
|
// All that's in common between ordered and unordered list blocks
|
|
308
357
|
const baseListBlock = {
|
|
309
358
|
renderElement: (props)=>/*#__PURE__*/ jsxRuntime.jsx(List, {
|
|
@@ -331,6 +380,7 @@ const listBlocks = {
|
|
|
331
380
|
icon: Icons.NumberList,
|
|
332
381
|
matchNode: (node)=>node.type === 'list' && node.format === 'ordered',
|
|
333
382
|
handleConvert: (editor)=>handleConvertToList(editor, 'ordered'),
|
|
383
|
+
handleShiftTab: handleShiftTabOnList,
|
|
334
384
|
snippets: [
|
|
335
385
|
'1.'
|
|
336
386
|
]
|
|
@@ -344,6 +394,7 @@ const listBlocks = {
|
|
|
344
394
|
icon: Icons.BulletList,
|
|
345
395
|
matchNode: (node)=>node.type === 'list' && node.format === 'unordered',
|
|
346
396
|
handleConvert: (editor)=>handleConvertToList(editor, 'unordered'),
|
|
397
|
+
handleShiftTab: handleShiftTabOnList,
|
|
347
398
|
snippets: [
|
|
348
399
|
'-',
|
|
349
400
|
'*',
|