@strapi/content-manager 5.61.0 → 5.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/ConfigurationForm/Fields.js +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.mjs +3 -3
- package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
- package/dist/admin/features/I18nSharedFieldsLock.js +54 -0
- package/dist/admin/features/I18nSharedFieldsLock.js.map +1 -0
- package/dist/admin/features/I18nSharedFieldsLock.mjs +31 -0
- package/dist/admin/features/I18nSharedFieldsLock.mjs.map +1 -0
- package/dist/admin/history/components/VersionInputRenderer.js +7 -2
- package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
- package/dist/admin/history/components/VersionInputRenderer.mjs +7 -3
- package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
- package/dist/admin/hooks/useContentManagerInitData.js +27 -8
- package/dist/admin/hooks/useContentManagerInitData.js.map +1 -1
- package/dist/admin/hooks/useContentManagerInitData.mjs +29 -10
- package/dist/admin/hooks/useContentManagerInitData.mjs.map +1 -1
- package/dist/admin/hooks/useDocument.js +11 -13
- package/dist/admin/hooks/useDocument.js.map +1 -1
- package/dist/admin/hooks/useDocument.mjs +11 -13
- package/dist/admin/hooks/useDocument.mjs.map +1 -1
- package/dist/admin/hooks/useI18nFieldLock.js +169 -0
- package/dist/admin/hooks/useI18nFieldLock.js.map +1 -0
- package/dist/admin/hooks/useI18nFieldLock.mjs +140 -0
- package/dist/admin/hooks/useI18nFieldLock.mjs.map +1 -0
- package/dist/admin/hooks/usePersistentQueryParams.js +16 -3
- package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
- package/dist/admin/hooks/usePersistentQueryParams.mjs +16 -3
- package/dist/admin/hooks/usePersistentQueryParams.mjs.map +1 -1
- package/dist/admin/index.js +5 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +2 -0
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/modules/app.js +8 -1
- package/dist/admin/modules/app.js.map +1 -1
- package/dist/admin/modules/app.mjs +8 -2
- package/dist/admin/modules/app.mjs.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.js +129 -127
- package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.mjs +129 -127
- package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.js +11 -4
- package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.mjs +12 -5
- package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +31 -21
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +32 -22
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js +98 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs +96 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js +1103 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs +1077 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js +211 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs +183 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js +84 -41
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs +86 -43
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +86 -20
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +89 -23
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +5 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +5 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +142 -22
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +143 -23
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js +402 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs +389 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +84 -33
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +85 -34
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js +5 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs +5 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +17 -4
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +18 -5
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +54 -6
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +54 -6
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +11 -9
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +12 -10
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +9 -4
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +9 -4
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.js +66 -63
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.mjs +66 -63
- package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js +7 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs +7 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/data.js +14 -9
- package/dist/admin/pages/EditView/utils/data.js.map +1 -1
- package/dist/admin/pages/EditView/utils/data.mjs +14 -9
- package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/forms.js +34 -0
- package/dist/admin/pages/EditView/utils/forms.js.map +1 -1
- package/dist/admin/pages/EditView/utils/forms.mjs +34 -1
- package/dist/admin/pages/EditView/utils/forms.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +2 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs +2 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +7 -6
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs +7 -6
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +11 -2
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +13 -4
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.js +15 -5
- package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.mjs +16 -7
- package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
- package/dist/admin/preview/components/InputPopover.js +18 -8
- package/dist/admin/preview/components/InputPopover.js.map +1 -1
- package/dist/admin/preview/components/InputPopover.mjs +19 -9
- package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
- package/dist/admin/preview/pages/Preview.js +5 -16
- package/dist/admin/preview/pages/Preview.js.map +1 -1
- package/dist/admin/preview/pages/Preview.mjs +5 -16
- package/dist/admin/preview/pages/Preview.mjs.map +1 -1
- package/dist/admin/preview/utils/fieldUtils.js +2 -0
- package/dist/admin/preview/utils/fieldUtils.js.map +1 -1
- package/dist/admin/preview/utils/fieldUtils.mjs +2 -1
- package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -1
- package/dist/admin/services/api.js +2 -1
- package/dist/admin/services/api.js.map +1 -1
- package/dist/admin/services/api.mjs +2 -1
- package/dist/admin/services/api.mjs.map +1 -1
- package/dist/admin/services/documents.js +21 -1
- package/dist/admin/services/documents.js.map +1 -1
- package/dist/admin/services/documents.mjs +21 -2
- package/dist/admin/services/documents.mjs.map +1 -1
- package/dist/admin/services/relations.js +47 -1
- package/dist/admin/services/relations.js.map +1 -1
- package/dist/admin/services/relations.mjs +47 -2
- package/dist/admin/services/relations.mjs.map +1 -1
- package/dist/admin/src/exports.d.ts +2 -0
- package/dist/admin/src/features/I18nSharedFieldsLock.d.ts +22 -0
- package/dist/admin/src/history/components/VersionInputRenderer.d.ts +7 -1
- package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
- package/dist/admin/src/hooks/useI18nFieldLock.d.ts +61 -0
- package/dist/admin/src/modules/app.d.ts +4 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/AddComponentMenu.d.ts +15 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/ComponentCopyModal.d.ts +58 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/CopiedComponents.d.ts +41 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/Initializer.d.ts +7 -3
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/NonRepeatable.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.d.ts +2 -2
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/utils/componentCopy.d.ts +115 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.d.ts +6 -3
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.d.ts +2 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +5 -1
- package/dist/admin/src/pages/EditView/utils/forms.d.ts +13 -2
- package/dist/admin/src/pages/ListView/components/Filters.d.ts +12 -3
- package/dist/admin/src/preview/services/preview.d.ts +1 -1
- package/dist/admin/src/preview/utils/fieldUtils.d.ts +1 -0
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/components.d.ts +2 -2
- package/dist/admin/src/services/contentTypes.d.ts +3 -3
- package/dist/admin/src/services/documents.d.ts +25 -21
- package/dist/admin/src/services/homepage.d.ts +1 -1
- package/dist/admin/src/services/init.d.ts +1 -1
- package/dist/admin/src/services/relations.d.ts +5 -3
- package/dist/admin/src/services/uid.d.ts +3 -3
- package/dist/admin/translations/en.json.js +41 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +41 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/server/controllers/relations.js +4 -2
- package/dist/server/controllers/relations.js.map +1 -1
- package/dist/server/controllers/relations.mjs +4 -2
- package/dist/server/controllers/relations.mjs.map +1 -1
- package/dist/server/controllers/utils/metadata.js +3 -1
- package/dist/server/controllers/utils/metadata.js.map +1 -1
- package/dist/server/controllers/utils/metadata.mjs +3 -1
- package/dist/server/controllers/utils/metadata.mjs.map +1 -1
- package/dist/server/history/services/utils.js +3 -1
- package/dist/server/history/services/utils.js.map +1 -1
- package/dist/server/history/services/utils.mjs +3 -1
- package/dist/server/history/services/utils.mjs.map +1 -1
- package/dist/server/homepage/services/homepage-query-utils.js +14 -0
- package/dist/server/homepage/services/homepage-query-utils.js.map +1 -1
- package/dist/server/homepage/services/homepage-query-utils.mjs +14 -1
- package/dist/server/homepage/services/homepage-query-utils.mjs.map +1 -1
- package/dist/server/homepage/services/homepage.js +1 -1
- package/dist/server/homepage/services/homepage.js.map +1 -1
- package/dist/server/homepage/services/homepage.mjs +2 -2
- package/dist/server/homepage/services/homepage.mjs.map +1 -1
- package/dist/server/mcp/sanitizers/shape-relations.js +1 -3
- package/dist/server/mcp/sanitizers/shape-relations.js.map +1 -1
- package/dist/server/mcp/sanitizers/shape-relations.mjs +1 -3
- package/dist/server/mcp/sanitizers/shape-relations.mjs.map +1 -1
- package/dist/server/mcp/schemas/output-schemas.js +2 -1
- package/dist/server/mcp/schemas/output-schemas.js.map +1 -1
- package/dist/server/mcp/schemas/output-schemas.mjs +2 -1
- package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -1
- package/dist/server/services/document-manager.js +3 -2
- package/dist/server/services/document-manager.js.map +1 -1
- package/dist/server/services/document-manager.mjs +3 -2
- package/dist/server/services/document-manager.mjs.map +1 -1
- package/dist/server/services/document-metadata.js +92 -4
- package/dist/server/services/document-metadata.js.map +1 -1
- package/dist/server/services/document-metadata.mjs +92 -4
- package/dist/server/services/document-metadata.mjs.map +1 -1
- package/dist/server/services/permission-checker.js +20 -8
- package/dist/server/services/permission-checker.js.map +1 -1
- package/dist/server/services/permission-checker.mjs +20 -8
- package/dist/server/services/permission-checker.mjs.map +1 -1
- package/dist/server/services/uid.js +2 -1
- package/dist/server/services/uid.js.map +1 -1
- package/dist/server/services/uid.mjs +2 -1
- package/dist/server/services/uid.mjs.map +1 -1
- package/dist/server/src/controllers/relations.d.ts.map +1 -1
- package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
- package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
- package/dist/server/src/history/services/utils.d.ts.map +1 -1
- package/dist/server/src/homepage/services/homepage-query-utils.d.ts +6 -0
- package/dist/server/src/homepage/services/homepage-query-utils.d.ts.map +1 -1
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +21 -7
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -1
- package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
- package/dist/server/src/services/document-manager.d.ts.map +1 -1
- package/dist/server/src/services/document-metadata.d.ts +5 -1
- package/dist/server/src/services/document-metadata.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +21 -7
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/permission-checker.d.ts +6 -5
- package/dist/server/src/services/permission-checker.d.ts.map +1 -1
- package/dist/server/src/services/uid.d.ts.map +1 -1
- package/dist/shared/contracts/collection-types.d.ts +7 -0
- package/dist/shared/contracts/collection-types.d.ts.map +1 -1
- package/dist/shared/contracts/single-types.d.ts +4 -0
- package/dist/shared/contracts/single-types.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -7,6 +7,7 @@ var designSystem = require('@strapi/design-system');
|
|
|
7
7
|
var reactIntl = require('react-intl');
|
|
8
8
|
var styledComponents = require('styled-components');
|
|
9
9
|
var useHasBeenNearViewport = require('../../../hooks/useHasBeenNearViewport.js');
|
|
10
|
+
var CopiedComponents = require('./FormInputs/Component/CopiedComponents.js');
|
|
10
11
|
var InputRenderer = require('./InputRenderer.js');
|
|
11
12
|
|
|
12
13
|
function _interopNamespace(e) {
|
|
@@ -198,73 +199,75 @@ const FormLayout = /*#__PURE__*/ React__namespace.memo(({ layout, document, hasB
|
|
|
198
199
|
defaultMessage: label
|
|
199
200
|
});
|
|
200
201
|
};
|
|
201
|
-
return /*#__PURE__*/ jsxRuntime.jsx(
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
202
|
+
return /*#__PURE__*/ jsxRuntime.jsx(CopiedComponents.CopiedComponentsProvider, {
|
|
203
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(IdleMountContext.Provider, {
|
|
204
|
+
value: scheduleMount,
|
|
205
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
206
|
+
direction: "column",
|
|
207
|
+
alignItems: "stretch",
|
|
208
|
+
gap: 6,
|
|
209
|
+
children: layout.map((panel)=>{
|
|
210
|
+
if (panel.some((row)=>row.some((field)=>field.type === 'dynamiczone'))) {
|
|
211
|
+
const [row] = panel;
|
|
212
|
+
const [field] = row;
|
|
213
|
+
return /*#__PURE__*/ jsxRuntime.jsx(LazyFormRow, {
|
|
214
|
+
fields: [
|
|
215
|
+
field
|
|
216
|
+
],
|
|
217
|
+
mountImmediately: hasMountSideEffects(field.attribute, document.components),
|
|
218
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Root, {
|
|
219
|
+
gap: 4,
|
|
220
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Item, {
|
|
221
|
+
col: 12,
|
|
222
|
+
s: 12,
|
|
223
|
+
xs: 12,
|
|
224
|
+
direction: "column",
|
|
225
|
+
alignItems: "stretch",
|
|
226
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(InputRenderer.InputRenderer, {
|
|
227
|
+
...field,
|
|
228
|
+
label: getLabel(field.name, field.label),
|
|
229
|
+
document: document
|
|
230
|
+
})
|
|
228
231
|
})
|
|
229
232
|
})
|
|
230
|
-
})
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
})
|
|
261
|
-
}
|
|
233
|
+
}, field.name);
|
|
234
|
+
}
|
|
235
|
+
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
|
|
236
|
+
...hasBackground && panelStyles,
|
|
237
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
238
|
+
direction: "column",
|
|
239
|
+
alignItems: "stretch",
|
|
240
|
+
gap: 6,
|
|
241
|
+
children: panel.map((row)=>{
|
|
242
|
+
return /*#__PURE__*/ jsxRuntime.jsx(LazyFormRow, {
|
|
243
|
+
fields: row,
|
|
244
|
+
mountImmediately: row.some((field)=>hasMountSideEffects(field.attribute, document.components)),
|
|
245
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(ResponsiveGridRoot, {
|
|
246
|
+
gap: {
|
|
247
|
+
initial: 6,
|
|
248
|
+
medium: 4
|
|
249
|
+
},
|
|
250
|
+
children: row.map(({ size, ...field })=>{
|
|
251
|
+
return /*#__PURE__*/ jsxRuntime.jsx(ResponsiveGridItem, {
|
|
252
|
+
col: size,
|
|
253
|
+
s: 12,
|
|
254
|
+
xs: 12,
|
|
255
|
+
direction: "column",
|
|
256
|
+
alignItems: "stretch",
|
|
257
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(InputRenderer.InputRenderer, {
|
|
258
|
+
...field,
|
|
259
|
+
size: size,
|
|
260
|
+
label: getLabel(field.name, field.label),
|
|
261
|
+
document: document
|
|
262
|
+
})
|
|
263
|
+
}, field.name);
|
|
264
|
+
})
|
|
262
265
|
})
|
|
263
|
-
})
|
|
264
|
-
}
|
|
266
|
+
}, row.map((field)=>field.name).join('.'));
|
|
267
|
+
})
|
|
265
268
|
})
|
|
266
|
-
})
|
|
267
|
-
}
|
|
269
|
+
}, panel.flatMap((row)=>row.map((field)=>field.name)).join('.'));
|
|
270
|
+
})
|
|
268
271
|
})
|
|
269
272
|
})
|
|
270
273
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormLayout.js","sources":["../../../../../admin/src/pages/EditView/components/FormLayout.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useForm } from '@strapi/admin/strapi-admin';\nimport { Box, BoxProps, Flex, Grid } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { EditLayout } from '../../../hooks/useDocumentLayout';\nimport { NEAR_VIEWPORT_MARGIN, getScrollParent } from '../../../hooks/useHasBeenNearViewport';\n\nimport { InputRenderer } from './InputRenderer';\n\nimport type { UseDocument } from '../../../hooks/useDocument';\n\n/* -------------------------------------------------------------------------------------------------\n * LazyFormRow\n * -----------------------------------------------------------------------------------------------*/\n\ntype LayoutField = EditLayout['layout'][number][number][number];\n\n/**\n * Rough rendered heights, only used to size placeholders so the scrollbar stays sensible.\n */\nconst ESTIMATED_HEIGHT: Partial<Record<LayoutField['type'], number>> = {\n richtext: 320,\n blocks: 320,\n json: 240,\n component: 240,\n dynamiczone: 160,\n relation: 120,\n media: 160,\n text: 120,\n};\nconst DEFAULT_ESTIMATED_HEIGHT = 80;\n\n/* -------------------------------------------------------------------------------------------------\n * Idle mount queue\n * -----------------------------------------------------------------------------------------------*/\n\ntype ScheduleMount = (mount: () => void) => () => void;\n\ninterface IdleMountQueue {\n schedule: ScheduleMount;\n dispose: () => void;\n}\n\nconst requestIdle = (callback: () => void): number =>\n typeof window.requestIdleCallback === 'function'\n ? window.requestIdleCallback(callback, { timeout: 2000 })\n : window.setTimeout(callback, 16);\n\nconst cancelIdle = (handle: number) =>\n typeof window.cancelIdleCallback === 'function'\n ? window.cancelIdleCallback(handle)\n : window.clearTimeout(handle);\n\n/**\n * Mounts the rows that weren't needed for the first paint, one per idle period, in the order\n * they were scheduled (top to bottom). Rows are then already rendered when the user scrolls to\n * them, and the browser search finds every field.\n */\nconst createIdleMountQueue = (): IdleMountQueue => {\n let queue: Array<() => void> = [];\n let handle: number | null = null;\n\n const flush = () => {\n handle = null;\n queue.shift()?.();\n\n if (queue.length > 0) {\n handle = requestIdle(flush);\n }\n };\n\n return {\n schedule: (mount) => {\n queue.push(mount);\n\n if (handle === null) {\n handle = requestIdle(flush);\n }\n\n return () => {\n queue = queue.filter((scheduled) => scheduled !== mount);\n };\n },\n dispose: () => {\n queue = [];\n\n if (handle !== null) {\n cancelIdle(handle);\n handle = null;\n }\n },\n };\n};\n\nconst IdleMountContext = React.createContext<ScheduleMount | null>(null);\n\nconst useIdleMountQueue = () => {\n const [queue] = React.useState(createIdleMountQueue);\n\n React.useEffect(() => queue.dispose, [queue]);\n\n return queue.schedule;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LazyFormRow\n * -----------------------------------------------------------------------------------------------*/\n\ntype Components = ReturnType<UseDocument>['components'];\ntype Attribute = LayoutField['attribute'];\n\n/**\n * Some inputs set a value when they mount: a required UID fetches its default value, and custom\n * fields may set a default. Their rows are mounted with the page, as they always were, so that\n * saving right after the page loads doesn't miss those values. Non-repeatable components are\n * expanded by default, so the inputs they contain count too.\n */\nconst hasMountSideEffects = (attribute: Attribute, components: Components, depth = 0): boolean => {\n if ((attribute.type === 'uid' && attribute.required) || 'customField' in attribute) {\n return true;\n }\n\n if (attribute.type === 'component' && !attribute.repeatable && depth < 10) {\n return Object.values(components[attribute.component]?.attributes ?? {}).some((nested) =>\n hasMountSideEffects(nested as Attribute, components, depth + 1)\n );\n }\n\n return false;\n};\n\ninterface LazyFormRowProps {\n fields: Pick<LayoutField, 'name' | 'type'>[];\n mountImmediately?: boolean;\n children: React.ReactNode;\n}\n\n/**\n * Mounts its children once they get close to the viewport, or in the background when the\n * browser is idle, then keeps them mounted. Rendering every field of a large content type\n * upfront is what makes the edit view slow: the cost of the first render should depend on\n * the screen, not on the size of the model.\n */\nconst LazyFormRow = ({ fields, mountImmediately = false, children }: LazyFormRowProps) => {\n const scheduleMount = React.useContext(IdleMountContext);\n const placeholderRef = React.useRef<HTMLDivElement>(null);\n const [isVisible, setIsVisible] = React.useState(\n () => mountImmediately || typeof IntersectionObserver === 'undefined'\n );\n\n // A field in error has to be mounted so the error is displayed and can receive the focus.\n const hasError = useForm('LazyFormRow', (state) =>\n fields.some(({ name }) => name in state.errors)\n );\n\n // Once mounted for an error, the row stays mounted when the errors are cleared (every\n // validation starts by clearing them), so its state (e.g. open blocks) is preserved.\n React.useEffect(() => {\n if (hasError) {\n setIsVisible(true);\n }\n }, [hasError]);\n\n const shouldMount = isVisible || hasError;\n\n React.useEffect(() => {\n const placeholder = placeholderRef.current;\n\n if (shouldMount || !placeholder) {\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n setIsVisible(true);\n }\n },\n { root: getScrollParent(placeholder), rootMargin: NEAR_VIEWPORT_MARGIN }\n );\n\n observer.observe(placeholder);\n\n // Low priority: user input interrupts the render of a row mounted in the background.\n const cancelIdleMount = scheduleMount?.(() =>\n React.startTransition(() => {\n setIsVisible(true);\n })\n );\n\n return () => {\n observer.disconnect();\n cancelIdleMount?.();\n };\n }, [shouldMount, scheduleMount]);\n\n if (shouldMount) {\n return <>{children}</>;\n }\n\n const height = Math.max(\n ...fields.map(({ type }) => ESTIMATED_HEIGHT[type] ?? DEFAULT_ESTIMATED_HEIGHT)\n );\n\n return <div ref={placeholderRef} style={{ height }} aria-hidden />;\n};\n\nexport const ResponsiveGridRoot = styled(Grid.Root)`\n container-type: inline-size;\n`;\n\nexport const ResponsiveGridItem =\n /**\n * TODO:\n * JSDOM cannot handle container queries.\n * This is a temporary workaround so that tests do not fail in the CI when jestdom throws an error\n * for failing to parse the stylesheet.\n */\n process.env.NODE_ENV !== 'test'\n ? styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n ${({ theme }) => theme.breakpoints.medium} {\n ${({ col }) => col && `grid-column: span ${col};`}\n }\n `\n : styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n `;\n\nconst panelStyles = {\n padding: {\n initial: 4,\n medium: 6,\n },\n borderColor: 'neutral150',\n background: 'neutral0',\n hasRadius: true,\n shadow: 'tableShadow',\n} satisfies BoxProps;\n\ninterface FormLayoutProps extends Pick<EditLayout, 'layout'> {\n hasBackground?: boolean;\n document: ReturnType<UseDocument>;\n}\n\nconst FormLayout = React.memo(({ layout, document, hasBackground = true }: FormLayoutProps) => {\n const { formatMessage } = useIntl();\n const scheduleMount = useIdleMountQueue();\n const modelUid = document.schema?.uid;\n\n const getLabel = (name: string, label: string) => {\n return formatMessage({\n id: `content-manager.content-types.${modelUid}.${name}`,\n defaultMessage: label,\n });\n };\n\n return (\n <IdleMountContext.Provider value={scheduleMount}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {layout.map((panel) => {\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n\n return (\n <LazyFormRow\n key={field.name}\n fields={[field]}\n mountImmediately={hasMountSideEffects(field.attribute, document.components)}\n >\n <Grid.Root gap={4}>\n <Grid.Item col={12} s={12} xs={12} direction=\"column\" alignItems=\"stretch\">\n <InputRenderer\n {...field}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </Grid.Item>\n </Grid.Root>\n </LazyFormRow>\n );\n }\n\n return (\n <Box\n key={panel.flatMap((row) => row.map((field) => field.name)).join('.')}\n {...(hasBackground && panelStyles)}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row) => {\n return (\n <LazyFormRow\n key={row.map((field) => field.name).join('.')}\n fields={row}\n mountImmediately={row.some((field) =>\n hasMountSideEffects(field.attribute, document.components)\n )}\n >\n <ResponsiveGridRoot gap={{ initial: 6, medium: 4 }}>\n {row.map(({ size, ...field }) => {\n return (\n <ResponsiveGridItem\n col={size}\n key={field.name}\n s={12}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <InputRenderer\n {...field}\n size={size}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </ResponsiveGridItem>\n );\n })}\n </ResponsiveGridRoot>\n </LazyFormRow>\n );\n })}\n </Flex>\n </Box>\n );\n })}\n </Flex>\n </IdleMountContext.Provider>\n );\n});\n\nFormLayout.displayName = 'FormLayout';\n\nexport { FormLayout, FormLayoutProps, hasMountSideEffects };\n"],"names":["ESTIMATED_HEIGHT","richtext","blocks","json","component","dynamiczone","relation","media","text","DEFAULT_ESTIMATED_HEIGHT","requestIdle","callback","window","requestIdleCallback","timeout","setTimeout","cancelIdle","handle","cancelIdleCallback","clearTimeout","createIdleMountQueue","queue","flush","shift","length","schedule","mount","push","filter","scheduled","dispose","IdleMountContext","React","createContext","useIdleMountQueue","useState","useEffect","hasMountSideEffects","attribute","components","depth","type","required","repeatable","Object","values","attributes","some","nested","LazyFormRow","fields","mountImmediately","children","scheduleMount","useContext","placeholderRef","useRef","isVisible","setIsVisible","IntersectionObserver","hasError","useForm","state","name","errors","shouldMount","placeholder","current","observer","entries","entry","isIntersecting","root","getScrollParent","rootMargin","NEAR_VIEWPORT_MARGIN","observe","cancelIdleMount","startTransition","disconnect","_jsx","_Fragment","height","Math","max","map","div","ref","style","aria-hidden","ResponsiveGridRoot","styled","Grid","Root","ResponsiveGridItem","process","env","NODE_ENV","Item","theme","breakpoints","medium","col","panelStyles","padding","initial","borderColor","background","hasRadius","shadow","FormLayout","memo","layout","document","hasBackground","formatMessage","useIntl","modelUid","schema","uid","getLabel","label","id","defaultMessage","Provider","value","Flex","direction","alignItems","gap","panel","row","field","s","xs","InputRenderer","Box","size","join","flatMap","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FormLayout.js","sources":["../../../../../admin/src/pages/EditView/components/FormLayout.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useForm } from '@strapi/admin/strapi-admin';\nimport { Box, BoxProps, Flex, Grid } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { EditLayout } from '../../../hooks/useDocumentLayout';\nimport { NEAR_VIEWPORT_MARGIN, getScrollParent } from '../../../hooks/useHasBeenNearViewport';\n\nimport { CopiedComponentsProvider } from './FormInputs/Component/CopiedComponents';\nimport { InputRenderer } from './InputRenderer';\n\nimport type { UseDocument } from '../../../hooks/useDocument';\n\n/* -------------------------------------------------------------------------------------------------\n * LazyFormRow\n * -----------------------------------------------------------------------------------------------*/\n\ntype LayoutField = EditLayout['layout'][number][number][number];\n\n/**\n * Rough rendered heights, only used to size placeholders so the scrollbar stays sensible.\n */\nconst ESTIMATED_HEIGHT: Partial<Record<LayoutField['type'], number>> = {\n richtext: 320,\n blocks: 320,\n json: 240,\n component: 240,\n dynamiczone: 160,\n relation: 120,\n media: 160,\n text: 120,\n};\nconst DEFAULT_ESTIMATED_HEIGHT = 80;\n\n/* -------------------------------------------------------------------------------------------------\n * Idle mount queue\n * -----------------------------------------------------------------------------------------------*/\n\ntype ScheduleMount = (mount: () => void) => () => void;\n\ninterface IdleMountQueue {\n schedule: ScheduleMount;\n dispose: () => void;\n}\n\nconst requestIdle = (callback: () => void): number =>\n typeof window.requestIdleCallback === 'function'\n ? window.requestIdleCallback(callback, { timeout: 2000 })\n : window.setTimeout(callback, 16);\n\nconst cancelIdle = (handle: number) =>\n typeof window.cancelIdleCallback === 'function'\n ? window.cancelIdleCallback(handle)\n : window.clearTimeout(handle);\n\n/**\n * Mounts the rows that weren't needed for the first paint, one per idle period, in the order\n * they were scheduled (top to bottom). Rows are then already rendered when the user scrolls to\n * them, and the browser search finds every field.\n */\nconst createIdleMountQueue = (): IdleMountQueue => {\n let queue: Array<() => void> = [];\n let handle: number | null = null;\n\n const flush = () => {\n handle = null;\n queue.shift()?.();\n\n if (queue.length > 0) {\n handle = requestIdle(flush);\n }\n };\n\n return {\n schedule: (mount) => {\n queue.push(mount);\n\n if (handle === null) {\n handle = requestIdle(flush);\n }\n\n return () => {\n queue = queue.filter((scheduled) => scheduled !== mount);\n };\n },\n dispose: () => {\n queue = [];\n\n if (handle !== null) {\n cancelIdle(handle);\n handle = null;\n }\n },\n };\n};\n\nconst IdleMountContext = React.createContext<ScheduleMount | null>(null);\n\nconst useIdleMountQueue = () => {\n const [queue] = React.useState(createIdleMountQueue);\n\n React.useEffect(() => queue.dispose, [queue]);\n\n return queue.schedule;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LazyFormRow\n * -----------------------------------------------------------------------------------------------*/\n\ntype Components = ReturnType<UseDocument>['components'];\ntype Attribute = LayoutField['attribute'];\n\n/**\n * Some inputs set a value when they mount: a required UID fetches its default value, and custom\n * fields may set a default. Their rows are mounted with the page, as they always were, so that\n * saving right after the page loads doesn't miss those values. Non-repeatable components are\n * expanded by default, so the inputs they contain count too.\n */\nconst hasMountSideEffects = (attribute: Attribute, components: Components, depth = 0): boolean => {\n if ((attribute.type === 'uid' && attribute.required) || 'customField' in attribute) {\n return true;\n }\n\n if (attribute.type === 'component' && !attribute.repeatable && depth < 10) {\n return Object.values(components[attribute.component]?.attributes ?? {}).some((nested) =>\n hasMountSideEffects(nested as Attribute, components, depth + 1)\n );\n }\n\n return false;\n};\n\ninterface LazyFormRowProps {\n fields: Pick<LayoutField, 'name' | 'type'>[];\n mountImmediately?: boolean;\n children: React.ReactNode;\n}\n\n/**\n * Mounts its children once they get close to the viewport, or in the background when the\n * browser is idle, then keeps them mounted. Rendering every field of a large content type\n * upfront is what makes the edit view slow: the cost of the first render should depend on\n * the screen, not on the size of the model.\n */\nconst LazyFormRow = ({ fields, mountImmediately = false, children }: LazyFormRowProps) => {\n const scheduleMount = React.useContext(IdleMountContext);\n const placeholderRef = React.useRef<HTMLDivElement>(null);\n const [isVisible, setIsVisible] = React.useState(\n () => mountImmediately || typeof IntersectionObserver === 'undefined'\n );\n\n // A field in error has to be mounted so the error is displayed and can receive the focus.\n const hasError = useForm('LazyFormRow', (state) =>\n fields.some(({ name }) => name in state.errors)\n );\n\n // Once mounted for an error, the row stays mounted when the errors are cleared (every\n // validation starts by clearing them), so its state (e.g. open blocks) is preserved.\n React.useEffect(() => {\n if (hasError) {\n setIsVisible(true);\n }\n }, [hasError]);\n\n const shouldMount = isVisible || hasError;\n\n React.useEffect(() => {\n const placeholder = placeholderRef.current;\n\n if (shouldMount || !placeholder) {\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n setIsVisible(true);\n }\n },\n { root: getScrollParent(placeholder), rootMargin: NEAR_VIEWPORT_MARGIN }\n );\n\n observer.observe(placeholder);\n\n // Low priority: user input interrupts the render of a row mounted in the background.\n const cancelIdleMount = scheduleMount?.(() =>\n React.startTransition(() => {\n setIsVisible(true);\n })\n );\n\n return () => {\n observer.disconnect();\n cancelIdleMount?.();\n };\n }, [shouldMount, scheduleMount]);\n\n if (shouldMount) {\n return <>{children}</>;\n }\n\n const height = Math.max(\n ...fields.map(({ type }) => ESTIMATED_HEIGHT[type] ?? DEFAULT_ESTIMATED_HEIGHT)\n );\n\n return <div ref={placeholderRef} style={{ height }} aria-hidden />;\n};\n\nexport const ResponsiveGridRoot = styled(Grid.Root)`\n container-type: inline-size;\n`;\n\nexport const ResponsiveGridItem =\n /**\n * TODO:\n * JSDOM cannot handle container queries.\n * This is a temporary workaround so that tests do not fail in the CI when jestdom throws an error\n * for failing to parse the stylesheet.\n */\n process.env.NODE_ENV !== 'test'\n ? styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n ${({ theme }) => theme.breakpoints.medium} {\n ${({ col }) => col && `grid-column: span ${col};`}\n }\n `\n : styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n `;\n\nconst panelStyles = {\n padding: {\n initial: 4,\n medium: 6,\n },\n borderColor: 'neutral150',\n background: 'neutral0',\n hasRadius: true,\n shadow: 'tableShadow',\n} satisfies BoxProps;\n\ninterface FormLayoutProps extends Pick<EditLayout, 'layout'> {\n hasBackground?: boolean;\n document: ReturnType<UseDocument>;\n}\n\nconst FormLayout = React.memo(({ layout, document, hasBackground = true }: FormLayoutProps) => {\n const { formatMessage } = useIntl();\n const scheduleMount = useIdleMountQueue();\n const modelUid = document.schema?.uid;\n\n const getLabel = (name: string, label: string) => {\n return formatMessage({\n id: `content-manager.content-types.${modelUid}.${name}`,\n defaultMessage: label,\n });\n };\n\n return (\n <CopiedComponentsProvider>\n <IdleMountContext.Provider value={scheduleMount}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {layout.map((panel) => {\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n\n return (\n <LazyFormRow\n key={field.name}\n fields={[field]}\n mountImmediately={hasMountSideEffects(field.attribute, document.components)}\n >\n <Grid.Root gap={4}>\n <Grid.Item col={12} s={12} xs={12} direction=\"column\" alignItems=\"stretch\">\n <InputRenderer\n {...field}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </Grid.Item>\n </Grid.Root>\n </LazyFormRow>\n );\n }\n\n return (\n <Box\n key={panel.flatMap((row) => row.map((field) => field.name)).join('.')}\n {...(hasBackground && panelStyles)}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row) => {\n return (\n <LazyFormRow\n key={row.map((field) => field.name).join('.')}\n fields={row}\n mountImmediately={row.some((field) =>\n hasMountSideEffects(field.attribute, document.components)\n )}\n >\n <ResponsiveGridRoot gap={{ initial: 6, medium: 4 }}>\n {row.map(({ size, ...field }) => {\n return (\n <ResponsiveGridItem\n col={size}\n key={field.name}\n s={12}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <InputRenderer\n {...field}\n size={size}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </ResponsiveGridItem>\n );\n })}\n </ResponsiveGridRoot>\n </LazyFormRow>\n );\n })}\n </Flex>\n </Box>\n );\n })}\n </Flex>\n </IdleMountContext.Provider>\n </CopiedComponentsProvider>\n );\n});\n\nFormLayout.displayName = 'FormLayout';\n\nexport { FormLayout, FormLayoutProps, hasMountSideEffects };\n"],"names":["ESTIMATED_HEIGHT","richtext","blocks","json","component","dynamiczone","relation","media","text","DEFAULT_ESTIMATED_HEIGHT","requestIdle","callback","window","requestIdleCallback","timeout","setTimeout","cancelIdle","handle","cancelIdleCallback","clearTimeout","createIdleMountQueue","queue","flush","shift","length","schedule","mount","push","filter","scheduled","dispose","IdleMountContext","React","createContext","useIdleMountQueue","useState","useEffect","hasMountSideEffects","attribute","components","depth","type","required","repeatable","Object","values","attributes","some","nested","LazyFormRow","fields","mountImmediately","children","scheduleMount","useContext","placeholderRef","useRef","isVisible","setIsVisible","IntersectionObserver","hasError","useForm","state","name","errors","shouldMount","placeholder","current","observer","entries","entry","isIntersecting","root","getScrollParent","rootMargin","NEAR_VIEWPORT_MARGIN","observe","cancelIdleMount","startTransition","disconnect","_jsx","_Fragment","height","Math","max","map","div","ref","style","aria-hidden","ResponsiveGridRoot","styled","Grid","Root","ResponsiveGridItem","process","env","NODE_ENV","Item","theme","breakpoints","medium","col","panelStyles","padding","initial","borderColor","background","hasRadius","shadow","FormLayout","memo","layout","document","hasBackground","formatMessage","useIntl","modelUid","schema","uid","getLabel","label","id","defaultMessage","CopiedComponentsProvider","Provider","value","Flex","direction","alignItems","gap","panel","row","field","s","xs","InputRenderer","Box","size","join","flatMap","displayName"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { Grid, Flex, Box } from '@strapi/design-system';
|
|
|
5
5
|
import { useIntl } from 'react-intl';
|
|
6
6
|
import { styled } from 'styled-components';
|
|
7
7
|
import { NEAR_VIEWPORT_MARGIN, getScrollParent } from '../../../hooks/useHasBeenNearViewport.mjs';
|
|
8
|
+
import { CopiedComponentsProvider } from './FormInputs/Component/CopiedComponents.mjs';
|
|
8
9
|
import { InputRenderer as MemoizedInputRenderer } from './InputRenderer.mjs';
|
|
9
10
|
|
|
10
11
|
/**
|
|
@@ -176,73 +177,75 @@ const FormLayout = /*#__PURE__*/ React.memo(({ layout, document, hasBackground =
|
|
|
176
177
|
defaultMessage: label
|
|
177
178
|
});
|
|
178
179
|
};
|
|
179
|
-
return /*#__PURE__*/ jsx(
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
180
|
+
return /*#__PURE__*/ jsx(CopiedComponentsProvider, {
|
|
181
|
+
children: /*#__PURE__*/ jsx(IdleMountContext.Provider, {
|
|
182
|
+
value: scheduleMount,
|
|
183
|
+
children: /*#__PURE__*/ jsx(Flex, {
|
|
184
|
+
direction: "column",
|
|
185
|
+
alignItems: "stretch",
|
|
186
|
+
gap: 6,
|
|
187
|
+
children: layout.map((panel)=>{
|
|
188
|
+
if (panel.some((row)=>row.some((field)=>field.type === 'dynamiczone'))) {
|
|
189
|
+
const [row] = panel;
|
|
190
|
+
const [field] = row;
|
|
191
|
+
return /*#__PURE__*/ jsx(LazyFormRow, {
|
|
192
|
+
fields: [
|
|
193
|
+
field
|
|
194
|
+
],
|
|
195
|
+
mountImmediately: hasMountSideEffects(field.attribute, document.components),
|
|
196
|
+
children: /*#__PURE__*/ jsx(Grid.Root, {
|
|
197
|
+
gap: 4,
|
|
198
|
+
children: /*#__PURE__*/ jsx(Grid.Item, {
|
|
199
|
+
col: 12,
|
|
200
|
+
s: 12,
|
|
201
|
+
xs: 12,
|
|
202
|
+
direction: "column",
|
|
203
|
+
alignItems: "stretch",
|
|
204
|
+
children: /*#__PURE__*/ jsx(MemoizedInputRenderer, {
|
|
205
|
+
...field,
|
|
206
|
+
label: getLabel(field.name, field.label),
|
|
207
|
+
document: document
|
|
208
|
+
})
|
|
206
209
|
})
|
|
207
210
|
})
|
|
208
|
-
})
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
})
|
|
239
|
-
}
|
|
211
|
+
}, field.name);
|
|
212
|
+
}
|
|
213
|
+
return /*#__PURE__*/ jsx(Box, {
|
|
214
|
+
...hasBackground && panelStyles,
|
|
215
|
+
children: /*#__PURE__*/ jsx(Flex, {
|
|
216
|
+
direction: "column",
|
|
217
|
+
alignItems: "stretch",
|
|
218
|
+
gap: 6,
|
|
219
|
+
children: panel.map((row)=>{
|
|
220
|
+
return /*#__PURE__*/ jsx(LazyFormRow, {
|
|
221
|
+
fields: row,
|
|
222
|
+
mountImmediately: row.some((field)=>hasMountSideEffects(field.attribute, document.components)),
|
|
223
|
+
children: /*#__PURE__*/ jsx(ResponsiveGridRoot, {
|
|
224
|
+
gap: {
|
|
225
|
+
initial: 6,
|
|
226
|
+
medium: 4
|
|
227
|
+
},
|
|
228
|
+
children: row.map(({ size, ...field })=>{
|
|
229
|
+
return /*#__PURE__*/ jsx(ResponsiveGridItem, {
|
|
230
|
+
col: size,
|
|
231
|
+
s: 12,
|
|
232
|
+
xs: 12,
|
|
233
|
+
direction: "column",
|
|
234
|
+
alignItems: "stretch",
|
|
235
|
+
children: /*#__PURE__*/ jsx(MemoizedInputRenderer, {
|
|
236
|
+
...field,
|
|
237
|
+
size: size,
|
|
238
|
+
label: getLabel(field.name, field.label),
|
|
239
|
+
document: document
|
|
240
|
+
})
|
|
241
|
+
}, field.name);
|
|
242
|
+
})
|
|
240
243
|
})
|
|
241
|
-
})
|
|
242
|
-
}
|
|
244
|
+
}, row.map((field)=>field.name).join('.'));
|
|
245
|
+
})
|
|
243
246
|
})
|
|
244
|
-
})
|
|
245
|
-
}
|
|
247
|
+
}, panel.flatMap((row)=>row.map((field)=>field.name)).join('.'));
|
|
248
|
+
})
|
|
246
249
|
})
|
|
247
250
|
})
|
|
248
251
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormLayout.mjs","sources":["../../../../../admin/src/pages/EditView/components/FormLayout.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useForm } from '@strapi/admin/strapi-admin';\nimport { Box, BoxProps, Flex, Grid } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { EditLayout } from '../../../hooks/useDocumentLayout';\nimport { NEAR_VIEWPORT_MARGIN, getScrollParent } from '../../../hooks/useHasBeenNearViewport';\n\nimport { InputRenderer } from './InputRenderer';\n\nimport type { UseDocument } from '../../../hooks/useDocument';\n\n/* -------------------------------------------------------------------------------------------------\n * LazyFormRow\n * -----------------------------------------------------------------------------------------------*/\n\ntype LayoutField = EditLayout['layout'][number][number][number];\n\n/**\n * Rough rendered heights, only used to size placeholders so the scrollbar stays sensible.\n */\nconst ESTIMATED_HEIGHT: Partial<Record<LayoutField['type'], number>> = {\n richtext: 320,\n blocks: 320,\n json: 240,\n component: 240,\n dynamiczone: 160,\n relation: 120,\n media: 160,\n text: 120,\n};\nconst DEFAULT_ESTIMATED_HEIGHT = 80;\n\n/* -------------------------------------------------------------------------------------------------\n * Idle mount queue\n * -----------------------------------------------------------------------------------------------*/\n\ntype ScheduleMount = (mount: () => void) => () => void;\n\ninterface IdleMountQueue {\n schedule: ScheduleMount;\n dispose: () => void;\n}\n\nconst requestIdle = (callback: () => void): number =>\n typeof window.requestIdleCallback === 'function'\n ? window.requestIdleCallback(callback, { timeout: 2000 })\n : window.setTimeout(callback, 16);\n\nconst cancelIdle = (handle: number) =>\n typeof window.cancelIdleCallback === 'function'\n ? window.cancelIdleCallback(handle)\n : window.clearTimeout(handle);\n\n/**\n * Mounts the rows that weren't needed for the first paint, one per idle period, in the order\n * they were scheduled (top to bottom). Rows are then already rendered when the user scrolls to\n * them, and the browser search finds every field.\n */\nconst createIdleMountQueue = (): IdleMountQueue => {\n let queue: Array<() => void> = [];\n let handle: number | null = null;\n\n const flush = () => {\n handle = null;\n queue.shift()?.();\n\n if (queue.length > 0) {\n handle = requestIdle(flush);\n }\n };\n\n return {\n schedule: (mount) => {\n queue.push(mount);\n\n if (handle === null) {\n handle = requestIdle(flush);\n }\n\n return () => {\n queue = queue.filter((scheduled) => scheduled !== mount);\n };\n },\n dispose: () => {\n queue = [];\n\n if (handle !== null) {\n cancelIdle(handle);\n handle = null;\n }\n },\n };\n};\n\nconst IdleMountContext = React.createContext<ScheduleMount | null>(null);\n\nconst useIdleMountQueue = () => {\n const [queue] = React.useState(createIdleMountQueue);\n\n React.useEffect(() => queue.dispose, [queue]);\n\n return queue.schedule;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LazyFormRow\n * -----------------------------------------------------------------------------------------------*/\n\ntype Components = ReturnType<UseDocument>['components'];\ntype Attribute = LayoutField['attribute'];\n\n/**\n * Some inputs set a value when they mount: a required UID fetches its default value, and custom\n * fields may set a default. Their rows are mounted with the page, as they always were, so that\n * saving right after the page loads doesn't miss those values. Non-repeatable components are\n * expanded by default, so the inputs they contain count too.\n */\nconst hasMountSideEffects = (attribute: Attribute, components: Components, depth = 0): boolean => {\n if ((attribute.type === 'uid' && attribute.required) || 'customField' in attribute) {\n return true;\n }\n\n if (attribute.type === 'component' && !attribute.repeatable && depth < 10) {\n return Object.values(components[attribute.component]?.attributes ?? {}).some((nested) =>\n hasMountSideEffects(nested as Attribute, components, depth + 1)\n );\n }\n\n return false;\n};\n\ninterface LazyFormRowProps {\n fields: Pick<LayoutField, 'name' | 'type'>[];\n mountImmediately?: boolean;\n children: React.ReactNode;\n}\n\n/**\n * Mounts its children once they get close to the viewport, or in the background when the\n * browser is idle, then keeps them mounted. Rendering every field of a large content type\n * upfront is what makes the edit view slow: the cost of the first render should depend on\n * the screen, not on the size of the model.\n */\nconst LazyFormRow = ({ fields, mountImmediately = false, children }: LazyFormRowProps) => {\n const scheduleMount = React.useContext(IdleMountContext);\n const placeholderRef = React.useRef<HTMLDivElement>(null);\n const [isVisible, setIsVisible] = React.useState(\n () => mountImmediately || typeof IntersectionObserver === 'undefined'\n );\n\n // A field in error has to be mounted so the error is displayed and can receive the focus.\n const hasError = useForm('LazyFormRow', (state) =>\n fields.some(({ name }) => name in state.errors)\n );\n\n // Once mounted for an error, the row stays mounted when the errors are cleared (every\n // validation starts by clearing them), so its state (e.g. open blocks) is preserved.\n React.useEffect(() => {\n if (hasError) {\n setIsVisible(true);\n }\n }, [hasError]);\n\n const shouldMount = isVisible || hasError;\n\n React.useEffect(() => {\n const placeholder = placeholderRef.current;\n\n if (shouldMount || !placeholder) {\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n setIsVisible(true);\n }\n },\n { root: getScrollParent(placeholder), rootMargin: NEAR_VIEWPORT_MARGIN }\n );\n\n observer.observe(placeholder);\n\n // Low priority: user input interrupts the render of a row mounted in the background.\n const cancelIdleMount = scheduleMount?.(() =>\n React.startTransition(() => {\n setIsVisible(true);\n })\n );\n\n return () => {\n observer.disconnect();\n cancelIdleMount?.();\n };\n }, [shouldMount, scheduleMount]);\n\n if (shouldMount) {\n return <>{children}</>;\n }\n\n const height = Math.max(\n ...fields.map(({ type }) => ESTIMATED_HEIGHT[type] ?? DEFAULT_ESTIMATED_HEIGHT)\n );\n\n return <div ref={placeholderRef} style={{ height }} aria-hidden />;\n};\n\nexport const ResponsiveGridRoot = styled(Grid.Root)`\n container-type: inline-size;\n`;\n\nexport const ResponsiveGridItem =\n /**\n * TODO:\n * JSDOM cannot handle container queries.\n * This is a temporary workaround so that tests do not fail in the CI when jestdom throws an error\n * for failing to parse the stylesheet.\n */\n process.env.NODE_ENV !== 'test'\n ? styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n ${({ theme }) => theme.breakpoints.medium} {\n ${({ col }) => col && `grid-column: span ${col};`}\n }\n `\n : styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n `;\n\nconst panelStyles = {\n padding: {\n initial: 4,\n medium: 6,\n },\n borderColor: 'neutral150',\n background: 'neutral0',\n hasRadius: true,\n shadow: 'tableShadow',\n} satisfies BoxProps;\n\ninterface FormLayoutProps extends Pick<EditLayout, 'layout'> {\n hasBackground?: boolean;\n document: ReturnType<UseDocument>;\n}\n\nconst FormLayout = React.memo(({ layout, document, hasBackground = true }: FormLayoutProps) => {\n const { formatMessage } = useIntl();\n const scheduleMount = useIdleMountQueue();\n const modelUid = document.schema?.uid;\n\n const getLabel = (name: string, label: string) => {\n return formatMessage({\n id: `content-manager.content-types.${modelUid}.${name}`,\n defaultMessage: label,\n });\n };\n\n return (\n <IdleMountContext.Provider value={scheduleMount}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {layout.map((panel) => {\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n\n return (\n <LazyFormRow\n key={field.name}\n fields={[field]}\n mountImmediately={hasMountSideEffects(field.attribute, document.components)}\n >\n <Grid.Root gap={4}>\n <Grid.Item col={12} s={12} xs={12} direction=\"column\" alignItems=\"stretch\">\n <InputRenderer\n {...field}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </Grid.Item>\n </Grid.Root>\n </LazyFormRow>\n );\n }\n\n return (\n <Box\n key={panel.flatMap((row) => row.map((field) => field.name)).join('.')}\n {...(hasBackground && panelStyles)}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row) => {\n return (\n <LazyFormRow\n key={row.map((field) => field.name).join('.')}\n fields={row}\n mountImmediately={row.some((field) =>\n hasMountSideEffects(field.attribute, document.components)\n )}\n >\n <ResponsiveGridRoot gap={{ initial: 6, medium: 4 }}>\n {row.map(({ size, ...field }) => {\n return (\n <ResponsiveGridItem\n col={size}\n key={field.name}\n s={12}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <InputRenderer\n {...field}\n size={size}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </ResponsiveGridItem>\n );\n })}\n </ResponsiveGridRoot>\n </LazyFormRow>\n );\n })}\n </Flex>\n </Box>\n );\n })}\n </Flex>\n </IdleMountContext.Provider>\n );\n});\n\nFormLayout.displayName = 'FormLayout';\n\nexport { FormLayout, FormLayoutProps, hasMountSideEffects };\n"],"names":["ESTIMATED_HEIGHT","richtext","blocks","json","component","dynamiczone","relation","media","text","DEFAULT_ESTIMATED_HEIGHT","requestIdle","callback","window","requestIdleCallback","timeout","setTimeout","cancelIdle","handle","cancelIdleCallback","clearTimeout","createIdleMountQueue","queue","flush","shift","length","schedule","mount","push","filter","scheduled","dispose","IdleMountContext","React","createContext","useIdleMountQueue","useState","useEffect","hasMountSideEffects","attribute","components","depth","type","required","repeatable","Object","values","attributes","some","nested","LazyFormRow","fields","mountImmediately","children","scheduleMount","useContext","placeholderRef","useRef","isVisible","setIsVisible","IntersectionObserver","hasError","useForm","state","name","errors","shouldMount","placeholder","current","observer","entries","entry","isIntersecting","root","getScrollParent","rootMargin","NEAR_VIEWPORT_MARGIN","observe","cancelIdleMount","startTransition","disconnect","_jsx","_Fragment","height","Math","max","map","div","ref","style","aria-hidden","ResponsiveGridRoot","styled","Grid","Root","ResponsiveGridItem","process","env","NODE_ENV","Item","theme","breakpoints","medium","col","panelStyles","padding","initial","borderColor","background","hasRadius","shadow","FormLayout","memo","layout","document","hasBackground","formatMessage","useIntl","modelUid","schema","uid","getLabel","label","id","defaultMessage","Provider","value","Flex","direction","alignItems","gap","panel","row","field","s","xs","InputRenderer","Box","size","join","flatMap","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FormLayout.mjs","sources":["../../../../../admin/src/pages/EditView/components/FormLayout.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useForm } from '@strapi/admin/strapi-admin';\nimport { Box, BoxProps, Flex, Grid } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { EditLayout } from '../../../hooks/useDocumentLayout';\nimport { NEAR_VIEWPORT_MARGIN, getScrollParent } from '../../../hooks/useHasBeenNearViewport';\n\nimport { CopiedComponentsProvider } from './FormInputs/Component/CopiedComponents';\nimport { InputRenderer } from './InputRenderer';\n\nimport type { UseDocument } from '../../../hooks/useDocument';\n\n/* -------------------------------------------------------------------------------------------------\n * LazyFormRow\n * -----------------------------------------------------------------------------------------------*/\n\ntype LayoutField = EditLayout['layout'][number][number][number];\n\n/**\n * Rough rendered heights, only used to size placeholders so the scrollbar stays sensible.\n */\nconst ESTIMATED_HEIGHT: Partial<Record<LayoutField['type'], number>> = {\n richtext: 320,\n blocks: 320,\n json: 240,\n component: 240,\n dynamiczone: 160,\n relation: 120,\n media: 160,\n text: 120,\n};\nconst DEFAULT_ESTIMATED_HEIGHT = 80;\n\n/* -------------------------------------------------------------------------------------------------\n * Idle mount queue\n * -----------------------------------------------------------------------------------------------*/\n\ntype ScheduleMount = (mount: () => void) => () => void;\n\ninterface IdleMountQueue {\n schedule: ScheduleMount;\n dispose: () => void;\n}\n\nconst requestIdle = (callback: () => void): number =>\n typeof window.requestIdleCallback === 'function'\n ? window.requestIdleCallback(callback, { timeout: 2000 })\n : window.setTimeout(callback, 16);\n\nconst cancelIdle = (handle: number) =>\n typeof window.cancelIdleCallback === 'function'\n ? window.cancelIdleCallback(handle)\n : window.clearTimeout(handle);\n\n/**\n * Mounts the rows that weren't needed for the first paint, one per idle period, in the order\n * they were scheduled (top to bottom). Rows are then already rendered when the user scrolls to\n * them, and the browser search finds every field.\n */\nconst createIdleMountQueue = (): IdleMountQueue => {\n let queue: Array<() => void> = [];\n let handle: number | null = null;\n\n const flush = () => {\n handle = null;\n queue.shift()?.();\n\n if (queue.length > 0) {\n handle = requestIdle(flush);\n }\n };\n\n return {\n schedule: (mount) => {\n queue.push(mount);\n\n if (handle === null) {\n handle = requestIdle(flush);\n }\n\n return () => {\n queue = queue.filter((scheduled) => scheduled !== mount);\n };\n },\n dispose: () => {\n queue = [];\n\n if (handle !== null) {\n cancelIdle(handle);\n handle = null;\n }\n },\n };\n};\n\nconst IdleMountContext = React.createContext<ScheduleMount | null>(null);\n\nconst useIdleMountQueue = () => {\n const [queue] = React.useState(createIdleMountQueue);\n\n React.useEffect(() => queue.dispose, [queue]);\n\n return queue.schedule;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LazyFormRow\n * -----------------------------------------------------------------------------------------------*/\n\ntype Components = ReturnType<UseDocument>['components'];\ntype Attribute = LayoutField['attribute'];\n\n/**\n * Some inputs set a value when they mount: a required UID fetches its default value, and custom\n * fields may set a default. Their rows are mounted with the page, as they always were, so that\n * saving right after the page loads doesn't miss those values. Non-repeatable components are\n * expanded by default, so the inputs they contain count too.\n */\nconst hasMountSideEffects = (attribute: Attribute, components: Components, depth = 0): boolean => {\n if ((attribute.type === 'uid' && attribute.required) || 'customField' in attribute) {\n return true;\n }\n\n if (attribute.type === 'component' && !attribute.repeatable && depth < 10) {\n return Object.values(components[attribute.component]?.attributes ?? {}).some((nested) =>\n hasMountSideEffects(nested as Attribute, components, depth + 1)\n );\n }\n\n return false;\n};\n\ninterface LazyFormRowProps {\n fields: Pick<LayoutField, 'name' | 'type'>[];\n mountImmediately?: boolean;\n children: React.ReactNode;\n}\n\n/**\n * Mounts its children once they get close to the viewport, or in the background when the\n * browser is idle, then keeps them mounted. Rendering every field of a large content type\n * upfront is what makes the edit view slow: the cost of the first render should depend on\n * the screen, not on the size of the model.\n */\nconst LazyFormRow = ({ fields, mountImmediately = false, children }: LazyFormRowProps) => {\n const scheduleMount = React.useContext(IdleMountContext);\n const placeholderRef = React.useRef<HTMLDivElement>(null);\n const [isVisible, setIsVisible] = React.useState(\n () => mountImmediately || typeof IntersectionObserver === 'undefined'\n );\n\n // A field in error has to be mounted so the error is displayed and can receive the focus.\n const hasError = useForm('LazyFormRow', (state) =>\n fields.some(({ name }) => name in state.errors)\n );\n\n // Once mounted for an error, the row stays mounted when the errors are cleared (every\n // validation starts by clearing them), so its state (e.g. open blocks) is preserved.\n React.useEffect(() => {\n if (hasError) {\n setIsVisible(true);\n }\n }, [hasError]);\n\n const shouldMount = isVisible || hasError;\n\n React.useEffect(() => {\n const placeholder = placeholderRef.current;\n\n if (shouldMount || !placeholder) {\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n setIsVisible(true);\n }\n },\n { root: getScrollParent(placeholder), rootMargin: NEAR_VIEWPORT_MARGIN }\n );\n\n observer.observe(placeholder);\n\n // Low priority: user input interrupts the render of a row mounted in the background.\n const cancelIdleMount = scheduleMount?.(() =>\n React.startTransition(() => {\n setIsVisible(true);\n })\n );\n\n return () => {\n observer.disconnect();\n cancelIdleMount?.();\n };\n }, [shouldMount, scheduleMount]);\n\n if (shouldMount) {\n return <>{children}</>;\n }\n\n const height = Math.max(\n ...fields.map(({ type }) => ESTIMATED_HEIGHT[type] ?? DEFAULT_ESTIMATED_HEIGHT)\n );\n\n return <div ref={placeholderRef} style={{ height }} aria-hidden />;\n};\n\nexport const ResponsiveGridRoot = styled(Grid.Root)`\n container-type: inline-size;\n`;\n\nexport const ResponsiveGridItem =\n /**\n * TODO:\n * JSDOM cannot handle container queries.\n * This is a temporary workaround so that tests do not fail in the CI when jestdom throws an error\n * for failing to parse the stylesheet.\n */\n process.env.NODE_ENV !== 'test'\n ? styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n ${({ theme }) => theme.breakpoints.medium} {\n ${({ col }) => col && `grid-column: span ${col};`}\n }\n `\n : styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n `;\n\nconst panelStyles = {\n padding: {\n initial: 4,\n medium: 6,\n },\n borderColor: 'neutral150',\n background: 'neutral0',\n hasRadius: true,\n shadow: 'tableShadow',\n} satisfies BoxProps;\n\ninterface FormLayoutProps extends Pick<EditLayout, 'layout'> {\n hasBackground?: boolean;\n document: ReturnType<UseDocument>;\n}\n\nconst FormLayout = React.memo(({ layout, document, hasBackground = true }: FormLayoutProps) => {\n const { formatMessage } = useIntl();\n const scheduleMount = useIdleMountQueue();\n const modelUid = document.schema?.uid;\n\n const getLabel = (name: string, label: string) => {\n return formatMessage({\n id: `content-manager.content-types.${modelUid}.${name}`,\n defaultMessage: label,\n });\n };\n\n return (\n <CopiedComponentsProvider>\n <IdleMountContext.Provider value={scheduleMount}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {layout.map((panel) => {\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n\n return (\n <LazyFormRow\n key={field.name}\n fields={[field]}\n mountImmediately={hasMountSideEffects(field.attribute, document.components)}\n >\n <Grid.Root gap={4}>\n <Grid.Item col={12} s={12} xs={12} direction=\"column\" alignItems=\"stretch\">\n <InputRenderer\n {...field}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </Grid.Item>\n </Grid.Root>\n </LazyFormRow>\n );\n }\n\n return (\n <Box\n key={panel.flatMap((row) => row.map((field) => field.name)).join('.')}\n {...(hasBackground && panelStyles)}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row) => {\n return (\n <LazyFormRow\n key={row.map((field) => field.name).join('.')}\n fields={row}\n mountImmediately={row.some((field) =>\n hasMountSideEffects(field.attribute, document.components)\n )}\n >\n <ResponsiveGridRoot gap={{ initial: 6, medium: 4 }}>\n {row.map(({ size, ...field }) => {\n return (\n <ResponsiveGridItem\n col={size}\n key={field.name}\n s={12}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <InputRenderer\n {...field}\n size={size}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </ResponsiveGridItem>\n );\n })}\n </ResponsiveGridRoot>\n </LazyFormRow>\n );\n })}\n </Flex>\n </Box>\n );\n })}\n </Flex>\n </IdleMountContext.Provider>\n </CopiedComponentsProvider>\n );\n});\n\nFormLayout.displayName = 'FormLayout';\n\nexport { FormLayout, FormLayoutProps, hasMountSideEffects };\n"],"names":["ESTIMATED_HEIGHT","richtext","blocks","json","component","dynamiczone","relation","media","text","DEFAULT_ESTIMATED_HEIGHT","requestIdle","callback","window","requestIdleCallback","timeout","setTimeout","cancelIdle","handle","cancelIdleCallback","clearTimeout","createIdleMountQueue","queue","flush","shift","length","schedule","mount","push","filter","scheduled","dispose","IdleMountContext","React","createContext","useIdleMountQueue","useState","useEffect","hasMountSideEffects","attribute","components","depth","type","required","repeatable","Object","values","attributes","some","nested","LazyFormRow","fields","mountImmediately","children","scheduleMount","useContext","placeholderRef","useRef","isVisible","setIsVisible","IntersectionObserver","hasError","useForm","state","name","errors","shouldMount","placeholder","current","observer","entries","entry","isIntersecting","root","getScrollParent","rootMargin","NEAR_VIEWPORT_MARGIN","observe","cancelIdleMount","startTransition","disconnect","_jsx","_Fragment","height","Math","max","map","div","ref","style","aria-hidden","ResponsiveGridRoot","styled","Grid","Root","ResponsiveGridItem","process","env","NODE_ENV","Item","theme","breakpoints","medium","col","panelStyles","padding","initial","borderColor","background","hasRadius","shadow","FormLayout","memo","layout","document","hasBackground","formatMessage","useIntl","modelUid","schema","uid","getLabel","label","id","defaultMessage","CopiedComponentsProvider","Provider","value","Flex","direction","alignItems","gap","panel","row","field","s","xs","InputRenderer","Box","size","join","flatMap","displayName"],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ var collections = require('../../../constants/collections.js');
|
|
|
8
8
|
var DocumentRBAC = require('../../../features/DocumentRBAC.js');
|
|
9
9
|
var useDocumentContext = require('../../../hooks/useDocumentContext.js');
|
|
10
10
|
var useDocumentLayout = require('../../../hooks/useDocumentLayout.js');
|
|
11
|
+
var useI18nFieldLock = require('../../../hooks/useI18nFieldLock.js');
|
|
11
12
|
var useLazyComponents = require('../../../hooks/useLazyComponents.js');
|
|
12
13
|
var InputPopover = require('../../../preview/components/InputPopover.js');
|
|
13
14
|
var usePreviewInputManager = require('../../../preview/hooks/usePreviewInputManager.js');
|
|
@@ -15,6 +16,7 @@ var conditionalFields = require('../../../utils/conditionalFields.js');
|
|
|
15
16
|
var data = require('../utils/data.js');
|
|
16
17
|
var BlocksInput = require('./FormInputs/BlocksInput/BlocksInput.js');
|
|
17
18
|
var Input = require('./FormInputs/Component/Input.js');
|
|
19
|
+
var ComponentContext = require('./FormInputs/ComponentContext.js');
|
|
18
20
|
var Field = require('./FormInputs/DynamicZone/Field.js');
|
|
19
21
|
var NotAllowed = require('./FormInputs/NotAllowed.js');
|
|
20
22
|
var Relations = require('./FormInputs/Relations/Relations.js');
|
|
@@ -62,6 +64,7 @@ size: layoutSize, ...inputProps })=>{
|
|
|
62
64
|
const isInPreviewPopover = InputPopover.useHasInputPopoverParent();
|
|
63
65
|
const blockIndex = InputPopover.usePreviewPopoverBlockIndex();
|
|
64
66
|
const shouldIgnorePermissions = isInDynamicZone || isInPreviewPopover;
|
|
67
|
+
const componentLevel = ComponentContext.useComponent('InputRenderer', (state)=>state.level);
|
|
65
68
|
const isFormDisabled = strapiAdmin.useForm('InputRenderer', (state)=>state.disabled);
|
|
66
69
|
const canCreateFields = DocumentRBAC.useDocumentRBAC('InputRenderer', (rbac)=>rbac.canCreateFields);
|
|
67
70
|
const canReadFields = DocumentRBAC.useDocumentRBAC('InputRenderer', (rbac)=>rbac.canReadFields);
|
|
@@ -89,6 +92,9 @@ size: layoutSize, ...inputProps })=>{
|
|
|
89
92
|
props.attribute.customField
|
|
90
93
|
] : undefined);
|
|
91
94
|
const hint = useFieldHint(providedHint, props.attribute);
|
|
95
|
+
const isNonLocalizedFieldLocked = useI18nFieldLock.useShouldLockNonLocalizedField(props.attribute, {
|
|
96
|
+
isInsideComponent: componentLevel >= 0
|
|
97
|
+
});
|
|
92
98
|
const renderComponentInput = React__namespace.useCallback((componentInputProps)=>/*#__PURE__*/ jsxRuntime.jsx(MemoizedInputRenderer, {
|
|
93
99
|
...componentInputProps
|
|
94
100
|
}, `input-${componentInputProps.name}-${localeKey}`), [
|
|
@@ -107,7 +113,7 @@ size: layoutSize, ...inputProps })=>{
|
|
|
107
113
|
...props
|
|
108
114
|
});
|
|
109
115
|
}
|
|
110
|
-
const fieldIsDisabled = !canUserEditField && !shouldIgnorePermissions || props.disabled || isFormDisabled;
|
|
116
|
+
const fieldIsDisabled = !canUserEditField && !shouldIgnorePermissions || props.disabled || isFormDisabled || isNonLocalizedFieldLocked;
|
|
111
117
|
/**
|
|
112
118
|
* Because a custom field has a unique prop but the type could be confused with either
|
|
113
119
|
* the useField hook or the type of the field we need to handle it separately and first.
|