@strapi/content-type-builder 5.57.0 → 5.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/AIChat/FeedbackModal.js +13 -7
- package/dist/admin/components/AIChat/FeedbackModal.js.map +1 -1
- package/dist/admin/components/AIChat/FeedbackModal.mjs +14 -8
- package/dist/admin/components/AIChat/FeedbackModal.mjs.map +1 -1
- package/dist/admin/components/AIChat/UploadCodeModal.js +12 -6
- package/dist/admin/components/AIChat/UploadCodeModal.js.map +1 -1
- package/dist/admin/components/AIChat/UploadCodeModal.mjs +13 -7
- package/dist/admin/components/AIChat/UploadCodeModal.mjs.map +1 -1
- package/dist/admin/components/AIChat/UploadFigmaModal.js +12 -6
- package/dist/admin/components/AIChat/UploadFigmaModal.js.map +1 -1
- package/dist/admin/components/AIChat/UploadFigmaModal.mjs +13 -7
- package/dist/admin/components/AIChat/UploadFigmaModal.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js +6 -3
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js.map +1 -1
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs +7 -4
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/Collapsible.js +9 -4
- package/dist/admin/components/AIChat/components/Collapsible.js.map +1 -1
- package/dist/admin/components/AIChat/components/Collapsible.mjs +10 -5
- package/dist/admin/components/AIChat/components/Collapsible.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/Dropzone.js +13 -6
- package/dist/admin/components/AIChat/components/Dropzone.js.map +1 -1
- package/dist/admin/components/AIChat/components/Dropzone.mjs +14 -7
- package/dist/admin/components/AIChat/components/Dropzone.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/FloatingPanel.js +11 -4
- package/dist/admin/components/AIChat/components/FloatingPanel.js.map +1 -1
- package/dist/admin/components/AIChat/components/FloatingPanel.mjs +12 -5
- package/dist/admin/components/AIChat/components/FloatingPanel.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/FullScreenImage.js +16 -8
- package/dist/admin/components/AIChat/components/FullScreenImage.js.map +1 -1
- package/dist/admin/components/AIChat/components/FullScreenImage.mjs +17 -9
- package/dist/admin/components/AIChat/components/FullScreenImage.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/Input.js +6 -3
- package/dist/admin/components/AIChat/components/Input.js.map +1 -1
- package/dist/admin/components/AIChat/components/Input.mjs +7 -4
- package/dist/admin/components/AIChat/components/Input.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/Messages/Message.js +88 -12
- package/dist/admin/components/AIChat/components/Messages/Message.js.map +1 -1
- package/dist/admin/components/AIChat/components/Messages/Message.mjs +87 -13
- package/dist/admin/components/AIChat/components/Messages/Message.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/StepModal.js +44 -17
- package/dist/admin/components/AIChat/components/StepModal.js.map +1 -1
- package/dist/admin/components/AIChat/components/StepModal.mjs +45 -18
- package/dist/admin/components/AIChat/components/StepModal.mjs.map +1 -1
- package/dist/admin/components/AIChat/providers/ChatProvider.js +79 -27
- package/dist/admin/components/AIChat/providers/ChatProvider.js.map +1 -1
- package/dist/admin/components/AIChat/providers/ChatProvider.mjs +80 -28
- package/dist/admin/components/AIChat/providers/ChatProvider.mjs.map +1 -1
- package/dist/admin/components/AIChat/providers/SchemaProvider.js +6 -3
- package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -1
- package/dist/admin/components/AIChat/providers/SchemaProvider.mjs +7 -4
- package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -1
- package/dist/admin/components/AttributeOptions/AttributeOption.js +2 -2
- package/dist/admin/components/AttributeOptions/AttributeOption.js.map +1 -1
- package/dist/admin/components/AttributeOptions/AttributeOption.mjs +2 -2
- package/dist/admin/components/AttributeOptions/AttributeOption.mjs.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.js.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.mjs.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.js.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.mjs.map +1 -1
- package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.js +2 -1
- package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.js.map +1 -1
- package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.mjs +2 -1
- package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.mjs.map +1 -1
- package/dist/admin/components/DataManager/DataManagerProvider.js +317 -275
- package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
- package/dist/admin/components/DataManager/DataManagerProvider.mjs +319 -277
- package/dist/admin/components/DataManager/DataManagerProvider.mjs.map +1 -1
- package/dist/admin/components/DataManager/RenameMigrationModal.js.map +1 -1
- package/dist/admin/components/DataManager/RenameMigrationModal.mjs.map +1 -1
- package/dist/admin/components/DataManager/reducer.js +53 -4
- package/dist/admin/components/DataManager/reducer.js.map +1 -1
- package/dist/admin/components/DataManager/reducer.mjs +53 -4
- package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
- package/dist/admin/components/DynamicZoneList.js +2 -1
- package/dist/admin/components/DynamicZoneList.js.map +1 -1
- package/dist/admin/components/DynamicZoneList.mjs +2 -1
- package/dist/admin/components/DynamicZoneList.mjs.map +1 -1
- package/dist/admin/components/FormModal/FormModal.js +36 -62
- package/dist/admin/components/FormModal/FormModal.js.map +1 -1
- package/dist/admin/components/FormModal/FormModal.mjs +36 -62
- package/dist/admin/components/FormModal/FormModal.mjs.map +1 -1
- package/dist/admin/components/FormModal/attributes/ConditionForm.js +2 -1
- package/dist/admin/components/FormModal/attributes/ConditionForm.js.map +1 -1
- package/dist/admin/components/FormModal/attributes/ConditionForm.mjs +2 -1
- package/dist/admin/components/FormModal/attributes/ConditionForm.mjs.map +1 -1
- package/dist/admin/components/FormModal/attributes/types.js +2 -2
- package/dist/admin/components/FormModal/attributes/types.js.map +1 -1
- package/dist/admin/components/FormModal/attributes/types.mjs +2 -2
- package/dist/admin/components/FormModal/attributes/types.mjs.map +1 -1
- package/dist/admin/components/FormModal/forms/forms.js +1 -1
- package/dist/admin/components/FormModal/forms/forms.js.map +1 -1
- package/dist/admin/components/FormModal/forms/forms.mjs +1 -1
- package/dist/admin/components/FormModal/forms/forms.mjs.map +1 -1
- package/dist/admin/components/GenericInputs.js +2 -1
- package/dist/admin/components/GenericInputs.js.map +1 -1
- package/dist/admin/components/GenericInputs.mjs +2 -1
- package/dist/admin/components/GenericInputs.mjs.map +1 -1
- package/dist/admin/components/TabForm.js.map +1 -1
- package/dist/admin/components/TabForm.mjs.map +1 -1
- package/dist/admin/src/components/AIChat/components/FullScreenImage.d.ts +8 -0
- package/dist/admin/src/components/AIChat/components/Messages/Message.d.ts +20 -0
- package/dist/admin/src/components/DataManager/utils/cleanData.d.ts +8 -8
- package/dist/admin/translations/cs.json.js +0 -2
- package/dist/admin/translations/cs.json.js.map +1 -1
- package/dist/admin/translations/cs.json.mjs +0 -2
- package/dist/admin/translations/cs.json.mjs.map +1 -1
- package/dist/admin/translations/de.json.js +0 -2
- package/dist/admin/translations/de.json.js.map +1 -1
- package/dist/admin/translations/de.json.mjs +0 -2
- package/dist/admin/translations/de.json.mjs.map +1 -1
- package/dist/admin/translations/en.json.js +0 -2
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +0 -2
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/ja.json.js +0 -2
- package/dist/admin/translations/ja.json.js.map +1 -1
- package/dist/admin/translations/ja.json.mjs +0 -2
- package/dist/admin/translations/ja.json.mjs.map +1 -1
- package/dist/admin/translations/ko.json.js +0 -2
- package/dist/admin/translations/ko.json.js.map +1 -1
- package/dist/admin/translations/ko.json.mjs +0 -2
- package/dist/admin/translations/ko.json.mjs.map +1 -1
- package/dist/admin/translations/nl.json.js +0 -2
- package/dist/admin/translations/nl.json.js.map +1 -1
- package/dist/admin/translations/nl.json.mjs +0 -2
- package/dist/admin/translations/nl.json.mjs.map +1 -1
- package/dist/admin/translations/pl.json.js +0 -2
- package/dist/admin/translations/pl.json.js.map +1 -1
- package/dist/admin/translations/pl.json.mjs +0 -2
- package/dist/admin/translations/pl.json.mjs.map +1 -1
- package/dist/admin/translations/ru.json.js +0 -2
- package/dist/admin/translations/ru.json.js.map +1 -1
- package/dist/admin/translations/ru.json.mjs +0 -2
- package/dist/admin/translations/ru.json.mjs.map +1 -1
- package/dist/admin/translations/sk.json.js +0 -2
- package/dist/admin/translations/sk.json.js.map +1 -1
- package/dist/admin/translations/sk.json.mjs +0 -2
- package/dist/admin/translations/sk.json.mjs.map +1 -1
- package/dist/admin/utils/folderTelemetry.js.map +1 -1
- package/dist/admin/utils/folderTelemetry.mjs.map +1 -1
- package/dist/admin/utils/formAPI.js.map +1 -1
- package/dist/admin/utils/formAPI.mjs.map +1 -1
- package/dist/server/controllers/validation/schema.js +3 -2
- package/dist/server/controllers/validation/schema.js.map +1 -1
- package/dist/server/controllers/validation/schema.mjs +4 -3
- package/dist/server/controllers/validation/schema.mjs.map +1 -1
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/services/migration-builder/index.js.map +1 -1
- package/dist/server/services/migration-builder/index.mjs.map +1 -1
- package/dist/server/services/schema.js +87 -1
- package/dist/server/services/schema.js.map +1 -1
- package/dist/server/services/schema.mjs +87 -1
- package/dist/server/services/schema.mjs.map +1 -1
- package/dist/server/src/controllers/validation/schema.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/services/migration-builder/index.d.ts.map +1 -1
- package/dist/server/src/services/schema-builder/types.d.ts.map +1 -1
- package/dist/server/src/services/schema.d.ts.map +1 -1
- package/dist/server/src/utils/uid-target.d.ts +18 -0
- package/dist/server/src/utils/uid-target.d.ts.map +1 -0
- package/dist/server/utils/uid-target.js +34 -0
- package/dist/server/utils/uid-target.js.map +1 -0
- package/dist/server/utils/uid-target.mjs +31 -0
- package/dist/server/utils/uid-target.mjs.map +1 -0
- package/package.json +6 -6
|
@@ -9,7 +9,7 @@ var AttributeIcon = require('../AttributeIcon.js');
|
|
|
9
9
|
var useFormModalNavigation = require('../FormModalNavigation/useFormModalNavigation.js');
|
|
10
10
|
var OptionBoxWrapper = require('./OptionBoxWrapper.js');
|
|
11
11
|
|
|
12
|
-
const newAttributes =
|
|
12
|
+
const newAttributes = new Set();
|
|
13
13
|
const NewBadge = ()=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
14
14
|
grow: 1,
|
|
15
15
|
justifyContent: "flex-end",
|
|
@@ -68,7 +68,7 @@ const AttributeOption = ({ type = 'text' })=>{
|
|
|
68
68
|
defaultMessage: type
|
|
69
69
|
})
|
|
70
70
|
}),
|
|
71
|
-
newAttributes.
|
|
71
|
+
newAttributes.has(type) && /*#__PURE__*/ jsxRuntime.jsx(NewBadge, {})
|
|
72
72
|
]
|
|
73
73
|
}),
|
|
74
74
|
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AttributeOption.js","sources":["../../../../admin/src/components/AttributeOptions/AttributeOption.tsx"],"sourcesContent":["/**\n *\n * AttributeOption\n *\n */\n\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { Sparkle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../utils/getTrad';\nimport { AttributeIcon, IconByType } from '../AttributeIcon';\nimport { useFormModalNavigation } from '../FormModalNavigation/useFormModalNavigation';\n\nimport { OptionBoxWrapper } from './OptionBoxWrapper';\n\nconst newAttributes
|
|
1
|
+
{"version":3,"file":"AttributeOption.js","sources":["../../../../admin/src/components/AttributeOptions/AttributeOption.tsx"],"sourcesContent":["/**\n *\n * AttributeOption\n *\n */\n\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { Sparkle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../utils/getTrad';\nimport { AttributeIcon, IconByType } from '../AttributeIcon';\nimport { useFormModalNavigation } from '../FormModalNavigation/useFormModalNavigation';\n\nimport { OptionBoxWrapper } from './OptionBoxWrapper';\n\nconst newAttributes = new Set<string>();\n\nconst NewBadge = () => (\n <Flex grow={1} justifyContent=\"flex-end\">\n <Flex gap={1} hasRadius background=\"alternative100\" padding={`0.2rem 0.4rem`}>\n <Sparkle width={`1rem`} height={`1rem`} fill=\"alternative600\" />\n <Typography textColor=\"alternative600\" variant=\"sigma\">\n New\n </Typography>\n </Flex>\n </Flex>\n);\n\ntype AttributeOptionProps = {\n type: IconByType;\n};\n\nexport const AttributeOption = ({ type = 'text' }: AttributeOptionProps) => {\n const { formatMessage } = useIntl();\n\n const { onClickSelectField } = useFormModalNavigation();\n\n const handleClick = () => {\n const step = type === 'component' ? '1' : null;\n\n onClickSelectField({\n attributeType: type,\n step,\n });\n };\n\n return (\n <OptionBoxWrapper padding={4} tag=\"button\" hasRadius type=\"button\" onClick={handleClick}>\n <Flex>\n <AttributeIcon type={type} />\n <Box paddingLeft={4} width=\"100%\">\n <Flex justifyContent=\"space-between\">\n <Typography fontWeight=\"bold\" textColor=\"neutral800\">\n {formatMessage({ id: getTrad(`attribute.${type}`), defaultMessage: type })}\n </Typography>\n {newAttributes.has(type) && <NewBadge />}\n </Flex>\n <Flex>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad(`attribute.${type}.description`),\n defaultMessage: 'A type for modeling data',\n })}\n </Typography>\n </Flex>\n </Box>\n </Flex>\n </OptionBoxWrapper>\n );\n};\n"],"names":["newAttributes","Set","NewBadge","_jsx","Flex","grow","justifyContent","_jsxs","gap","hasRadius","background","padding","Sparkle","width","height","fill","Typography","textColor","variant","AttributeOption","type","formatMessage","useIntl","onClickSelectField","useFormModalNavigation","handleClick","step","attributeType","OptionBoxWrapper","tag","onClick","AttributeIcon","Box","paddingLeft","fontWeight","id","getTrad","defaultMessage","has"],"mappings":";;;;;;;;;;;AAgBA,MAAMA,gBAAgB,IAAIC,GAAAA,EAAAA;AAE1B,MAAMC,QAAAA,GAAW,kBACfC,cAAA,CAACC,iBAAAA,EAAAA;QAAKC,IAAAA,EAAM,CAAA;QAAGC,cAAAA,EAAe,UAAA;AAC5B,QAAA,QAAA,gBAAAC,eAAA,CAACH,iBAAAA,EAAAA;YAAKI,GAAAA,EAAK,CAAA;YAAGC,SAAS,EAAA,IAAA;YAACC,UAAAA,EAAW,gBAAA;YAAiBC,OAAAA,EAAS,CAAC,aAAa,CAAC;;8BAC1ER,cAAA,CAACS,aAAAA,EAAAA;oBAAQC,KAAAA,EAAO,CAAC,IAAI,CAAC;oBAAEC,MAAAA,EAAQ,CAAC,IAAI,CAAC;oBAAEC,IAAAA,EAAK;;8BAC7CZ,cAAA,CAACa,uBAAAA,EAAAA;oBAAWC,SAAAA,EAAU,gBAAA;oBAAiBC,OAAAA,EAAQ,OAAA;AAAQ,oBAAA,QAAA,EAAA;;;;;MAWhDC,eAAAA,GAAkB,CAAC,EAAEC,IAAAA,GAAO,MAAM,EAAwB,GAAA;IACrE,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAE1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,6CAAAA,EAAAA;AAE/B,IAAA,MAAMC,WAAAA,GAAc,IAAA;QAClB,MAAMC,IAAAA,GAAON,IAAAA,KAAS,WAAA,GAAc,GAAA,GAAM,IAAA;QAE1CG,kBAAAA,CAAmB;YACjBI,aAAAA,EAAeP,IAAAA;AACfM,YAAAA;AACF,SAAA,CAAA;AACF,IAAA,CAAA;AAEA,IAAA,qBACEvB,cAAA,CAACyB,iCAAAA,EAAAA;QAAiBjB,OAAAA,EAAS,CAAA;QAAGkB,GAAAA,EAAI,QAAA;QAASpB,SAAS,EAAA,IAAA;QAACW,IAAAA,EAAK,QAAA;QAASU,OAAAA,EAASL,WAAAA;AAC1E,QAAA,QAAA,gBAAAlB,eAAA,CAACH,iBAAAA,EAAAA;;8BACCD,cAAA,CAAC4B,2BAAAA,EAAAA;oBAAcX,IAAAA,EAAMA;;8BACrBb,eAAA,CAACyB,gBAAAA,EAAAA;oBAAIC,WAAAA,EAAa,CAAA;oBAAGpB,KAAAA,EAAM,MAAA;;sCACzBN,eAAA,CAACH,iBAAAA,EAAAA;4BAAKE,cAAAA,EAAe,eAAA;;8CACnBH,cAAA,CAACa,uBAAAA,EAAAA;oCAAWkB,UAAAA,EAAW,MAAA;oCAAOjB,SAAAA,EAAU,YAAA;8CACrCI,aAAAA,CAAc;AAAEc,wCAAAA,EAAAA,EAAIC,eAAAA,CAAQ,CAAC,UAAU,EAAEhB,IAAAA,CAAAA,CAAM,CAAA;wCAAGiB,cAAAA,EAAgBjB;AAAK,qCAAA;;gCAEzEpB,aAAAA,CAAcsC,GAAG,CAAClB,IAAAA,CAAAA,kBAASjB,cAAA,CAACD,QAAAA,EAAAA,EAAAA;;;sCAE/BC,cAAA,CAACC,iBAAAA,EAAAA;AACC,4BAAA,QAAA,gBAAAD,cAAA,CAACa,uBAAAA,EAAAA;gCAAWE,OAAAA,EAAQ,IAAA;gCAAKD,SAAAA,EAAU,YAAA;0CAChCI,aAAAA,CAAc;AACbc,oCAAAA,EAAAA,EAAIC,gBAAQ,CAAC,UAAU,EAAEhB,IAAAA,CAAK,YAAY,CAAC,CAAA;oCAC3CiB,cAAAA,EAAgB;AAClB,iCAAA;;;;;;;;AAOd;;;;"}
|
|
@@ -7,7 +7,7 @@ import { AttributeIcon } from '../AttributeIcon.mjs';
|
|
|
7
7
|
import { useFormModalNavigation } from '../FormModalNavigation/useFormModalNavigation.mjs';
|
|
8
8
|
import { OptionBoxWrapper } from './OptionBoxWrapper.mjs';
|
|
9
9
|
|
|
10
|
-
const newAttributes =
|
|
10
|
+
const newAttributes = new Set();
|
|
11
11
|
const NewBadge = ()=>/*#__PURE__*/ jsx(Flex, {
|
|
12
12
|
grow: 1,
|
|
13
13
|
justifyContent: "flex-end",
|
|
@@ -66,7 +66,7 @@ const AttributeOption = ({ type = 'text' })=>{
|
|
|
66
66
|
defaultMessage: type
|
|
67
67
|
})
|
|
68
68
|
}),
|
|
69
|
-
newAttributes.
|
|
69
|
+
newAttributes.has(type) && /*#__PURE__*/ jsx(NewBadge, {})
|
|
70
70
|
]
|
|
71
71
|
}),
|
|
72
72
|
/*#__PURE__*/ jsx(Flex, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AttributeOption.mjs","sources":["../../../../admin/src/components/AttributeOptions/AttributeOption.tsx"],"sourcesContent":["/**\n *\n * AttributeOption\n *\n */\n\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { Sparkle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../utils/getTrad';\nimport { AttributeIcon, IconByType } from '../AttributeIcon';\nimport { useFormModalNavigation } from '../FormModalNavigation/useFormModalNavigation';\n\nimport { OptionBoxWrapper } from './OptionBoxWrapper';\n\nconst newAttributes
|
|
1
|
+
{"version":3,"file":"AttributeOption.mjs","sources":["../../../../admin/src/components/AttributeOptions/AttributeOption.tsx"],"sourcesContent":["/**\n *\n * AttributeOption\n *\n */\n\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { Sparkle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../utils/getTrad';\nimport { AttributeIcon, IconByType } from '../AttributeIcon';\nimport { useFormModalNavigation } from '../FormModalNavigation/useFormModalNavigation';\n\nimport { OptionBoxWrapper } from './OptionBoxWrapper';\n\nconst newAttributes = new Set<string>();\n\nconst NewBadge = () => (\n <Flex grow={1} justifyContent=\"flex-end\">\n <Flex gap={1} hasRadius background=\"alternative100\" padding={`0.2rem 0.4rem`}>\n <Sparkle width={`1rem`} height={`1rem`} fill=\"alternative600\" />\n <Typography textColor=\"alternative600\" variant=\"sigma\">\n New\n </Typography>\n </Flex>\n </Flex>\n);\n\ntype AttributeOptionProps = {\n type: IconByType;\n};\n\nexport const AttributeOption = ({ type = 'text' }: AttributeOptionProps) => {\n const { formatMessage } = useIntl();\n\n const { onClickSelectField } = useFormModalNavigation();\n\n const handleClick = () => {\n const step = type === 'component' ? '1' : null;\n\n onClickSelectField({\n attributeType: type,\n step,\n });\n };\n\n return (\n <OptionBoxWrapper padding={4} tag=\"button\" hasRadius type=\"button\" onClick={handleClick}>\n <Flex>\n <AttributeIcon type={type} />\n <Box paddingLeft={4} width=\"100%\">\n <Flex justifyContent=\"space-between\">\n <Typography fontWeight=\"bold\" textColor=\"neutral800\">\n {formatMessage({ id: getTrad(`attribute.${type}`), defaultMessage: type })}\n </Typography>\n {newAttributes.has(type) && <NewBadge />}\n </Flex>\n <Flex>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad(`attribute.${type}.description`),\n defaultMessage: 'A type for modeling data',\n })}\n </Typography>\n </Flex>\n </Box>\n </Flex>\n </OptionBoxWrapper>\n );\n};\n"],"names":["newAttributes","Set","NewBadge","_jsx","Flex","grow","justifyContent","_jsxs","gap","hasRadius","background","padding","Sparkle","width","height","fill","Typography","textColor","variant","AttributeOption","type","formatMessage","useIntl","onClickSelectField","useFormModalNavigation","handleClick","step","attributeType","OptionBoxWrapper","tag","onClick","AttributeIcon","Box","paddingLeft","fontWeight","id","getTrad","defaultMessage","has"],"mappings":";;;;;;;;;AAgBA,MAAMA,gBAAgB,IAAIC,GAAAA,EAAAA;AAE1B,MAAMC,QAAAA,GAAW,kBACfC,GAAA,CAACC,IAAAA,EAAAA;QAAKC,IAAAA,EAAM,CAAA;QAAGC,cAAAA,EAAe,UAAA;AAC5B,QAAA,QAAA,gBAAAC,IAAA,CAACH,IAAAA,EAAAA;YAAKI,GAAAA,EAAK,CAAA;YAAGC,SAAS,EAAA,IAAA;YAACC,UAAAA,EAAW,gBAAA;YAAiBC,OAAAA,EAAS,CAAC,aAAa,CAAC;;8BAC1ER,GAAA,CAACS,OAAAA,EAAAA;oBAAQC,KAAAA,EAAO,CAAC,IAAI,CAAC;oBAAEC,MAAAA,EAAQ,CAAC,IAAI,CAAC;oBAAEC,IAAAA,EAAK;;8BAC7CZ,GAAA,CAACa,UAAAA,EAAAA;oBAAWC,SAAAA,EAAU,gBAAA;oBAAiBC,OAAAA,EAAQ,OAAA;AAAQ,oBAAA,QAAA,EAAA;;;;;MAWhDC,eAAAA,GAAkB,CAAC,EAAEC,IAAAA,GAAO,MAAM,EAAwB,GAAA;IACrE,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAE1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,sBAAAA,EAAAA;AAE/B,IAAA,MAAMC,WAAAA,GAAc,IAAA;QAClB,MAAMC,IAAAA,GAAON,IAAAA,KAAS,WAAA,GAAc,GAAA,GAAM,IAAA;QAE1CG,kBAAAA,CAAmB;YACjBI,aAAAA,EAAeP,IAAAA;AACfM,YAAAA;AACF,SAAA,CAAA;AACF,IAAA,CAAA;AAEA,IAAA,qBACEvB,GAAA,CAACyB,gBAAAA,EAAAA;QAAiBjB,OAAAA,EAAS,CAAA;QAAGkB,GAAAA,EAAI,QAAA;QAASpB,SAAS,EAAA,IAAA;QAACW,IAAAA,EAAK,QAAA;QAASU,OAAAA,EAASL,WAAAA;AAC1E,QAAA,QAAA,gBAAAlB,IAAA,CAACH,IAAAA,EAAAA;;8BACCD,GAAA,CAAC4B,aAAAA,EAAAA;oBAAcX,IAAAA,EAAMA;;8BACrBb,IAAA,CAACyB,GAAAA,EAAAA;oBAAIC,WAAAA,EAAa,CAAA;oBAAGpB,KAAAA,EAAM,MAAA;;sCACzBN,IAAA,CAACH,IAAAA,EAAAA;4BAAKE,cAAAA,EAAe,eAAA;;8CACnBH,GAAA,CAACa,UAAAA,EAAAA;oCAAWkB,UAAAA,EAAW,MAAA;oCAAOjB,SAAAA,EAAU,YAAA;8CACrCI,aAAAA,CAAc;AAAEc,wCAAAA,EAAAA,EAAIC,OAAAA,CAAQ,CAAC,UAAU,EAAEhB,IAAAA,CAAAA,CAAM,CAAA;wCAAGiB,cAAAA,EAAgBjB;AAAK,qCAAA;;gCAEzEpB,aAAAA,CAAcsC,GAAG,CAAClB,IAAAA,CAAAA,kBAASjB,GAAA,CAACD,QAAAA,EAAAA,EAAAA;;;sCAE/BC,GAAA,CAACC,IAAAA,EAAAA;AACC,4BAAA,QAAA,gBAAAD,GAAA,CAACa,UAAAA,EAAAA;gCAAWE,OAAAA,EAAQ,IAAA;gCAAKD,SAAAA,EAAU,YAAA;0CAChCI,aAAAA,CAAc;AACbc,oCAAAA,EAAAA,EAAIC,QAAQ,CAAC,UAAU,EAAEhB,IAAAA,CAAK,YAAY,CAAC,CAAA;oCAC3CiB,cAAAA,EAAgB;AAClB,iCAAA;;;;;;;;AAOd;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildFolderTree.js","sources":["../../../../../admin/src/components/ContentTypeBuilderNav/lib/buildFolderTree.ts"],"sourcesContent":["import { MAX_FOLDER_DEPTH } from '../../DataManager/utils/contentStructure';\n\nimport type { Status } from '../../../types';\nimport type {\n ContentStructureSection,\n GroupStatus,\n} from '../../DataManager/utils/contentStructure';\nimport type { UID } from '@strapi/types';\n\nexport type ContentTypeLink = {\n uid: UID.ContentType;\n to: string;\n title: string;\n status: Status;\n};\n\nexport type FolderNode = {\n type: 'folder';\n id: string;\n name: string;\n status: GroupStatus;\n depth: number;\n parentId: string | null;\n children: FolderTreeNode[];\n};\n\nexport type ContentTypeNode = {\n type: 'contentType';\n uid: UID.ContentType;\n to: string;\n title: string;\n status: Status;\n depth: number;\n parentId: string | null;\n};\n\nexport type FolderTreeNode = FolderNode | ContentTypeNode;\n\nexport function buildSectionTree(\n section: ContentStructureSection,\n links: ContentTypeLink[],\n compareTitle: (a: string, b: string) => number\n): FolderTreeNode[] {\n const groups = section.groups;\n\n const groupById = new Map(groups.map((group) => [group.id, group]));\n const linkByUid = new Map(links.map((link) => [link.uid, link]));\n\n const childGroupIds = new Set<string>();\n\n for (const group of groups) {\n for (const child of group.children) {\n if (child.type === 'group') {\n childGroupIds.add(child.id);\n }\n }\n }\n\n const grouped = new Set<UID.ContentType>();\n\n const buildFolder = (\n group: ContentStructureSection['groups'][number],\n depth: number\n ): FolderNode => {\n const children: FolderTreeNode[] = [];\n\n for (const child of group.children) {\n if (child.type === 'group') {\n const subGroup = groupById.get(child.id);\n\n if (!subGroup) {\n continue;\n }\n\n children.push(buildFolder(subGroup, depth + 1));\n continue;\n }\n\n const link = linkByUid.get(child.uid);\n\n if (!link) {\n continue;\n }\n\n grouped.add(child.uid);\n\n children.push({\n type: 'contentType',\n status: link.status,\n parentId: group.id,\n title: link.title,\n depth: depth + 1,\n uid: link.uid,\n to: link.to,\n });\n }\n\n return {\n type: 'folder',\n parentId: group.parent,\n status: group.status,\n name: group.name,\n id: group.id,\n children,\n depth,\n };\n };\n\n const rootFolders = groups\n .filter((group) => !childGroupIds.has(group.id))\n .map((group) => buildFolder(group, 0));\n\n const ungrouped = links\n .filter((link) => !grouped.has(link.uid))\n .sort((a, b) => compareTitle(a.title, b.title))\n .map(\n (link): ContentTypeNode => ({\n type: 'contentType',\n status: link.status,\n title: link.title,\n parentId: null,\n uid: link.uid,\n to: link.to,\n depth: 0,\n })\n );\n\n return [...ungrouped, ...rootFolders];\n}\n\nexport function filterTree(\n nodes: FolderTreeNode[],\n matches: (text: string) => boolean\n): FolderTreeNode[] {\n const result: FolderTreeNode[] = [];\n\n for (const node of nodes) {\n if (node.type === 'contentType') {\n if (matches(node.title) || matches(node.uid)) {\n result.push(node);\n }\n\n continue;\n }\n\n if (matches(node.name)) {\n result.push(node);\n continue;\n }\n\n const filteredChildren = filterTree(node.children, matches);\n\n if (filteredChildren.length > 0) {\n result.push({ ...node, children: filteredChildren });\n }\n }\n\n return result;\n}\n\nexport function subtreeFolderHeight(folder: FolderNode): number {\n let deepestChild = 0;\n\n for (const child of folder.children) {\n if (child.type === 'folder') {\n deepestChild = Math.max(deepestChild, subtreeFolderHeight(child));\n }\n }\n\n return 1 + deepestChild;\n}\n\n/**\n * Whether moving `folder` under a target (a folder, or `null` for the section\n * root) would keep the resulting subtree within {@link MAX_FOLDER_DEPTH}.\n */\nexport function canNestFolderAt(folder: FolderNode, target: FolderNode | null): boolean {\n const targetDomainDepth = target ? target.depth + 1 : 0;\n const deepestResult = targetDomainDepth + subtreeFolderHeight(folder);\n\n return deepestResult <= MAX_FOLDER_DEPTH;\n}\n\nexport function countSubtree(\n section: ContentStructureSection,\n folderId: string,\n countableUids: ReadonlySet<UID.ContentType>\n): { contentTypes: number; subfolders: number } {\n const groupById = new Map(section.groups.map((group) => [group.id, group]));\n\n let contentTypes = 0;\n let subfolders = 0;\n\n const walk = (group: ContentStructureSection['groups'][number]) => {\n for (const child of group.children) {\n if (child.type === 'contentType') {\n if (countableUids.has(child.uid)) {\n contentTypes += 1;\n }\n\n continue;\n }\n\n const childGroup = groupById.get(child.id);\n\n if (!childGroup) {\n continue;\n }\n\n subfolders += 1;\n walk(childGroup);\n }\n };\n\n const root = groupById.get(folderId);\n\n if (root) {\n walk(root);\n }\n\n return { contentTypes, subfolders };\n}\n\nexport function collectSubtreeContentTypeUids(\n section: ContentStructureSection,\n folderId: string\n): UID.ContentType[] {\n const groupById = new Map(section.groups.map((group) => [group.id, group]));\n const uids: UID.ContentType[] = [];\n\n const walk = (id: string) => {\n const group = groupById.get(id);\n\n if (!group) {\n return;\n }\n\n for (const child of group.children) {\n if (child.type === 'contentType') {\n uids.push(child.uid);\n continue;\n }\n\n walk(child.id);\n }\n };\n\n walk(folderId);\n\n return uids;\n}\n\nexport function indexFolders(nodes: FolderTreeNode[]): Map<string, FolderNode> {\n const index = new Map<string, FolderNode>();\n\n const walk = (node: FolderTreeNode) => {\n if (node.type !== 'folder') {\n return;\n }\n\n index.set(node.id, node);\n node.children.forEach(walk);\n };\n\n nodes.forEach(walk);\n\n return index;\n}\n"],"names":["buildSectionTree","section","links","compareTitle","groups","groupById","Map","map","group","id","linkByUid","link","uid","childGroupIds","Set","child","children","type","add","grouped","buildFolder","depth","subGroup","get","push","status","parentId","title","to","parent","name","rootFolders","filter","has","ungrouped","sort","a","b","filterTree","nodes","matches","result","node","filteredChildren","length","subtreeFolderHeight","folder","deepestChild","Math","max","canNestFolderAt","target","targetDomainDepth","deepestResult","MAX_FOLDER_DEPTH","countSubtree","folderId","countableUids","contentTypes","subfolders","walk","childGroup","root","collectSubtreeContentTypeUids","uids"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"buildFolderTree.js","sources":["../../../../../admin/src/components/ContentTypeBuilderNav/lib/buildFolderTree.ts"],"sourcesContent":["import { MAX_FOLDER_DEPTH } from '../../DataManager/utils/contentStructure';\n\nimport type { Status } from '../../../types';\nimport type {\n ContentStructureSection,\n GroupStatus,\n} from '../../DataManager/utils/contentStructure';\nimport type { UID } from '@strapi/types';\n\nexport type ContentTypeLink = {\n uid: UID.ContentType;\n to: string;\n title: string;\n status: Status;\n};\n\nexport type FolderNode = {\n type: 'folder';\n id: string;\n name: string;\n status: GroupStatus;\n depth: number;\n parentId: string | null;\n children: FolderTreeNode[];\n};\n\nexport type ContentTypeNode = {\n type: 'contentType';\n uid: UID.ContentType;\n to: string;\n title: string;\n status: Status;\n depth: number;\n parentId: string | null;\n};\n\nexport type FolderTreeNode = FolderNode | ContentTypeNode;\n\nexport function buildSectionTree(\n section: ContentStructureSection,\n links: ContentTypeLink[],\n compareTitle: (a: string, b: string) => number\n): FolderTreeNode[] {\n const groups = section.groups;\n\n const groupById = new Map(groups.map((group) => [group.id, group]));\n const linkByUid = new Map(links.map((link) => [link.uid, link]));\n\n const childGroupIds = new Set<string>();\n\n for (const group of groups) {\n for (const child of group.children) {\n if (child.type === 'group') {\n childGroupIds.add(child.id);\n }\n }\n }\n\n const grouped = new Set<UID.ContentType>();\n\n const buildFolder = (\n group: ContentStructureSection['groups'][number],\n depth: number\n ): FolderNode => {\n const children: FolderTreeNode[] = [];\n\n for (const child of group.children) {\n if (child.type === 'group') {\n const subGroup = groupById.get(child.id);\n\n if (!subGroup) {\n continue;\n }\n\n children.push(buildFolder(subGroup, depth + 1));\n continue;\n }\n\n const link = linkByUid.get(child.uid);\n\n if (!link) {\n continue;\n }\n\n grouped.add(child.uid);\n\n children.push({\n type: 'contentType',\n status: link.status,\n parentId: group.id,\n title: link.title,\n depth: depth + 1,\n uid: link.uid,\n to: link.to,\n });\n }\n\n return {\n type: 'folder',\n parentId: group.parent,\n status: group.status,\n name: group.name,\n id: group.id,\n children,\n depth,\n };\n };\n\n const rootFolders = groups\n .filter((group) => !childGroupIds.has(group.id))\n .map((group) => buildFolder(group, 0));\n\n const ungrouped = links\n .filter((link) => !grouped.has(link.uid))\n .sort((a, b) => compareTitle(a.title, b.title))\n .map((link): ContentTypeNode => ({\n type: 'contentType',\n status: link.status,\n title: link.title,\n parentId: null,\n uid: link.uid,\n to: link.to,\n depth: 0,\n }));\n\n return [...ungrouped, ...rootFolders];\n}\n\nexport function filterTree(\n nodes: FolderTreeNode[],\n matches: (text: string) => boolean\n): FolderTreeNode[] {\n const result: FolderTreeNode[] = [];\n\n for (const node of nodes) {\n if (node.type === 'contentType') {\n if (matches(node.title) || matches(node.uid)) {\n result.push(node);\n }\n\n continue;\n }\n\n if (matches(node.name)) {\n result.push(node);\n continue;\n }\n\n const filteredChildren = filterTree(node.children, matches);\n\n if (filteredChildren.length > 0) {\n result.push({ ...node, children: filteredChildren });\n }\n }\n\n return result;\n}\n\nexport function subtreeFolderHeight(folder: FolderNode): number {\n let deepestChild = 0;\n\n for (const child of folder.children) {\n if (child.type === 'folder') {\n deepestChild = Math.max(deepestChild, subtreeFolderHeight(child));\n }\n }\n\n return 1 + deepestChild;\n}\n\n/**\n * Whether moving `folder` under a target (a folder, or `null` for the section\n * root) would keep the resulting subtree within {@link MAX_FOLDER_DEPTH}.\n */\nexport function canNestFolderAt(folder: FolderNode, target: FolderNode | null): boolean {\n const targetDomainDepth = target ? target.depth + 1 : 0;\n const deepestResult = targetDomainDepth + subtreeFolderHeight(folder);\n\n return deepestResult <= MAX_FOLDER_DEPTH;\n}\n\nexport function countSubtree(\n section: ContentStructureSection,\n folderId: string,\n countableUids: ReadonlySet<UID.ContentType>\n): { contentTypes: number; subfolders: number } {\n const groupById = new Map(section.groups.map((group) => [group.id, group]));\n\n let contentTypes = 0;\n let subfolders = 0;\n\n const walk = (group: ContentStructureSection['groups'][number]) => {\n for (const child of group.children) {\n if (child.type === 'contentType') {\n if (countableUids.has(child.uid)) {\n contentTypes += 1;\n }\n\n continue;\n }\n\n const childGroup = groupById.get(child.id);\n\n if (!childGroup) {\n continue;\n }\n\n subfolders += 1;\n walk(childGroup);\n }\n };\n\n const root = groupById.get(folderId);\n\n if (root) {\n walk(root);\n }\n\n return { contentTypes, subfolders };\n}\n\nexport function collectSubtreeContentTypeUids(\n section: ContentStructureSection,\n folderId: string\n): UID.ContentType[] {\n const groupById = new Map(section.groups.map((group) => [group.id, group]));\n const uids: UID.ContentType[] = [];\n\n const walk = (id: string) => {\n const group = groupById.get(id);\n\n if (!group) {\n return;\n }\n\n for (const child of group.children) {\n if (child.type === 'contentType') {\n uids.push(child.uid);\n continue;\n }\n\n walk(child.id);\n }\n };\n\n walk(folderId);\n\n return uids;\n}\n\nexport function indexFolders(nodes: FolderTreeNode[]): Map<string, FolderNode> {\n const index = new Map<string, FolderNode>();\n\n const walk = (node: FolderTreeNode) => {\n if (node.type !== 'folder') {\n return;\n }\n\n index.set(node.id, node);\n node.children.forEach(walk);\n };\n\n nodes.forEach(walk);\n\n return index;\n}\n"],"names":["buildSectionTree","section","links","compareTitle","groups","groupById","Map","map","group","id","linkByUid","link","uid","childGroupIds","Set","child","children","type","add","grouped","buildFolder","depth","subGroup","get","push","status","parentId","title","to","parent","name","rootFolders","filter","has","ungrouped","sort","a","b","filterTree","nodes","matches","result","node","filteredChildren","length","subtreeFolderHeight","folder","deepestChild","Math","max","canNestFolderAt","target","targetDomainDepth","deepestResult","MAX_FOLDER_DEPTH","countSubtree","folderId","countableUids","contentTypes","subfolders","walk","childGroup","root","collectSubtreeContentTypeUids","uids"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildFolderTree.mjs","sources":["../../../../../admin/src/components/ContentTypeBuilderNav/lib/buildFolderTree.ts"],"sourcesContent":["import { MAX_FOLDER_DEPTH } from '../../DataManager/utils/contentStructure';\n\nimport type { Status } from '../../../types';\nimport type {\n ContentStructureSection,\n GroupStatus,\n} from '../../DataManager/utils/contentStructure';\nimport type { UID } from '@strapi/types';\n\nexport type ContentTypeLink = {\n uid: UID.ContentType;\n to: string;\n title: string;\n status: Status;\n};\n\nexport type FolderNode = {\n type: 'folder';\n id: string;\n name: string;\n status: GroupStatus;\n depth: number;\n parentId: string | null;\n children: FolderTreeNode[];\n};\n\nexport type ContentTypeNode = {\n type: 'contentType';\n uid: UID.ContentType;\n to: string;\n title: string;\n status: Status;\n depth: number;\n parentId: string | null;\n};\n\nexport type FolderTreeNode = FolderNode | ContentTypeNode;\n\nexport function buildSectionTree(\n section: ContentStructureSection,\n links: ContentTypeLink[],\n compareTitle: (a: string, b: string) => number\n): FolderTreeNode[] {\n const groups = section.groups;\n\n const groupById = new Map(groups.map((group) => [group.id, group]));\n const linkByUid = new Map(links.map((link) => [link.uid, link]));\n\n const childGroupIds = new Set<string>();\n\n for (const group of groups) {\n for (const child of group.children) {\n if (child.type === 'group') {\n childGroupIds.add(child.id);\n }\n }\n }\n\n const grouped = new Set<UID.ContentType>();\n\n const buildFolder = (\n group: ContentStructureSection['groups'][number],\n depth: number\n ): FolderNode => {\n const children: FolderTreeNode[] = [];\n\n for (const child of group.children) {\n if (child.type === 'group') {\n const subGroup = groupById.get(child.id);\n\n if (!subGroup) {\n continue;\n }\n\n children.push(buildFolder(subGroup, depth + 1));\n continue;\n }\n\n const link = linkByUid.get(child.uid);\n\n if (!link) {\n continue;\n }\n\n grouped.add(child.uid);\n\n children.push({\n type: 'contentType',\n status: link.status,\n parentId: group.id,\n title: link.title,\n depth: depth + 1,\n uid: link.uid,\n to: link.to,\n });\n }\n\n return {\n type: 'folder',\n parentId: group.parent,\n status: group.status,\n name: group.name,\n id: group.id,\n children,\n depth,\n };\n };\n\n const rootFolders = groups\n .filter((group) => !childGroupIds.has(group.id))\n .map((group) => buildFolder(group, 0));\n\n const ungrouped = links\n .filter((link) => !grouped.has(link.uid))\n .sort((a, b) => compareTitle(a.title, b.title))\n .map(\n (link): ContentTypeNode => ({\n type: 'contentType',\n status: link.status,\n title: link.title,\n parentId: null,\n uid: link.uid,\n to: link.to,\n depth: 0,\n })\n );\n\n return [...ungrouped, ...rootFolders];\n}\n\nexport function filterTree(\n nodes: FolderTreeNode[],\n matches: (text: string) => boolean\n): FolderTreeNode[] {\n const result: FolderTreeNode[] = [];\n\n for (const node of nodes) {\n if (node.type === 'contentType') {\n if (matches(node.title) || matches(node.uid)) {\n result.push(node);\n }\n\n continue;\n }\n\n if (matches(node.name)) {\n result.push(node);\n continue;\n }\n\n const filteredChildren = filterTree(node.children, matches);\n\n if (filteredChildren.length > 0) {\n result.push({ ...node, children: filteredChildren });\n }\n }\n\n return result;\n}\n\nexport function subtreeFolderHeight(folder: FolderNode): number {\n let deepestChild = 0;\n\n for (const child of folder.children) {\n if (child.type === 'folder') {\n deepestChild = Math.max(deepestChild, subtreeFolderHeight(child));\n }\n }\n\n return 1 + deepestChild;\n}\n\n/**\n * Whether moving `folder` under a target (a folder, or `null` for the section\n * root) would keep the resulting subtree within {@link MAX_FOLDER_DEPTH}.\n */\nexport function canNestFolderAt(folder: FolderNode, target: FolderNode | null): boolean {\n const targetDomainDepth = target ? target.depth + 1 : 0;\n const deepestResult = targetDomainDepth + subtreeFolderHeight(folder);\n\n return deepestResult <= MAX_FOLDER_DEPTH;\n}\n\nexport function countSubtree(\n section: ContentStructureSection,\n folderId: string,\n countableUids: ReadonlySet<UID.ContentType>\n): { contentTypes: number; subfolders: number } {\n const groupById = new Map(section.groups.map((group) => [group.id, group]));\n\n let contentTypes = 0;\n let subfolders = 0;\n\n const walk = (group: ContentStructureSection['groups'][number]) => {\n for (const child of group.children) {\n if (child.type === 'contentType') {\n if (countableUids.has(child.uid)) {\n contentTypes += 1;\n }\n\n continue;\n }\n\n const childGroup = groupById.get(child.id);\n\n if (!childGroup) {\n continue;\n }\n\n subfolders += 1;\n walk(childGroup);\n }\n };\n\n const root = groupById.get(folderId);\n\n if (root) {\n walk(root);\n }\n\n return { contentTypes, subfolders };\n}\n\nexport function collectSubtreeContentTypeUids(\n section: ContentStructureSection,\n folderId: string\n): UID.ContentType[] {\n const groupById = new Map(section.groups.map((group) => [group.id, group]));\n const uids: UID.ContentType[] = [];\n\n const walk = (id: string) => {\n const group = groupById.get(id);\n\n if (!group) {\n return;\n }\n\n for (const child of group.children) {\n if (child.type === 'contentType') {\n uids.push(child.uid);\n continue;\n }\n\n walk(child.id);\n }\n };\n\n walk(folderId);\n\n return uids;\n}\n\nexport function indexFolders(nodes: FolderTreeNode[]): Map<string, FolderNode> {\n const index = new Map<string, FolderNode>();\n\n const walk = (node: FolderTreeNode) => {\n if (node.type !== 'folder') {\n return;\n }\n\n index.set(node.id, node);\n node.children.forEach(walk);\n };\n\n nodes.forEach(walk);\n\n return index;\n}\n"],"names":["buildSectionTree","section","links","compareTitle","groups","groupById","Map","map","group","id","linkByUid","link","uid","childGroupIds","Set","child","children","type","add","grouped","buildFolder","depth","subGroup","get","push","status","parentId","title","to","parent","name","rootFolders","filter","has","ungrouped","sort","a","b","filterTree","nodes","matches","result","node","filteredChildren","length","subtreeFolderHeight","folder","deepestChild","Math","max","canNestFolderAt","target","targetDomainDepth","deepestResult","MAX_FOLDER_DEPTH","countSubtree","folderId","countableUids","contentTypes","subfolders","walk","childGroup","root","collectSubtreeContentTypeUids","uids"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"buildFolderTree.mjs","sources":["../../../../../admin/src/components/ContentTypeBuilderNav/lib/buildFolderTree.ts"],"sourcesContent":["import { MAX_FOLDER_DEPTH } from '../../DataManager/utils/contentStructure';\n\nimport type { Status } from '../../../types';\nimport type {\n ContentStructureSection,\n GroupStatus,\n} from '../../DataManager/utils/contentStructure';\nimport type { UID } from '@strapi/types';\n\nexport type ContentTypeLink = {\n uid: UID.ContentType;\n to: string;\n title: string;\n status: Status;\n};\n\nexport type FolderNode = {\n type: 'folder';\n id: string;\n name: string;\n status: GroupStatus;\n depth: number;\n parentId: string | null;\n children: FolderTreeNode[];\n};\n\nexport type ContentTypeNode = {\n type: 'contentType';\n uid: UID.ContentType;\n to: string;\n title: string;\n status: Status;\n depth: number;\n parentId: string | null;\n};\n\nexport type FolderTreeNode = FolderNode | ContentTypeNode;\n\nexport function buildSectionTree(\n section: ContentStructureSection,\n links: ContentTypeLink[],\n compareTitle: (a: string, b: string) => number\n): FolderTreeNode[] {\n const groups = section.groups;\n\n const groupById = new Map(groups.map((group) => [group.id, group]));\n const linkByUid = new Map(links.map((link) => [link.uid, link]));\n\n const childGroupIds = new Set<string>();\n\n for (const group of groups) {\n for (const child of group.children) {\n if (child.type === 'group') {\n childGroupIds.add(child.id);\n }\n }\n }\n\n const grouped = new Set<UID.ContentType>();\n\n const buildFolder = (\n group: ContentStructureSection['groups'][number],\n depth: number\n ): FolderNode => {\n const children: FolderTreeNode[] = [];\n\n for (const child of group.children) {\n if (child.type === 'group') {\n const subGroup = groupById.get(child.id);\n\n if (!subGroup) {\n continue;\n }\n\n children.push(buildFolder(subGroup, depth + 1));\n continue;\n }\n\n const link = linkByUid.get(child.uid);\n\n if (!link) {\n continue;\n }\n\n grouped.add(child.uid);\n\n children.push({\n type: 'contentType',\n status: link.status,\n parentId: group.id,\n title: link.title,\n depth: depth + 1,\n uid: link.uid,\n to: link.to,\n });\n }\n\n return {\n type: 'folder',\n parentId: group.parent,\n status: group.status,\n name: group.name,\n id: group.id,\n children,\n depth,\n };\n };\n\n const rootFolders = groups\n .filter((group) => !childGroupIds.has(group.id))\n .map((group) => buildFolder(group, 0));\n\n const ungrouped = links\n .filter((link) => !grouped.has(link.uid))\n .sort((a, b) => compareTitle(a.title, b.title))\n .map((link): ContentTypeNode => ({\n type: 'contentType',\n status: link.status,\n title: link.title,\n parentId: null,\n uid: link.uid,\n to: link.to,\n depth: 0,\n }));\n\n return [...ungrouped, ...rootFolders];\n}\n\nexport function filterTree(\n nodes: FolderTreeNode[],\n matches: (text: string) => boolean\n): FolderTreeNode[] {\n const result: FolderTreeNode[] = [];\n\n for (const node of nodes) {\n if (node.type === 'contentType') {\n if (matches(node.title) || matches(node.uid)) {\n result.push(node);\n }\n\n continue;\n }\n\n if (matches(node.name)) {\n result.push(node);\n continue;\n }\n\n const filteredChildren = filterTree(node.children, matches);\n\n if (filteredChildren.length > 0) {\n result.push({ ...node, children: filteredChildren });\n }\n }\n\n return result;\n}\n\nexport function subtreeFolderHeight(folder: FolderNode): number {\n let deepestChild = 0;\n\n for (const child of folder.children) {\n if (child.type === 'folder') {\n deepestChild = Math.max(deepestChild, subtreeFolderHeight(child));\n }\n }\n\n return 1 + deepestChild;\n}\n\n/**\n * Whether moving `folder` under a target (a folder, or `null` for the section\n * root) would keep the resulting subtree within {@link MAX_FOLDER_DEPTH}.\n */\nexport function canNestFolderAt(folder: FolderNode, target: FolderNode | null): boolean {\n const targetDomainDepth = target ? target.depth + 1 : 0;\n const deepestResult = targetDomainDepth + subtreeFolderHeight(folder);\n\n return deepestResult <= MAX_FOLDER_DEPTH;\n}\n\nexport function countSubtree(\n section: ContentStructureSection,\n folderId: string,\n countableUids: ReadonlySet<UID.ContentType>\n): { contentTypes: number; subfolders: number } {\n const groupById = new Map(section.groups.map((group) => [group.id, group]));\n\n let contentTypes = 0;\n let subfolders = 0;\n\n const walk = (group: ContentStructureSection['groups'][number]) => {\n for (const child of group.children) {\n if (child.type === 'contentType') {\n if (countableUids.has(child.uid)) {\n contentTypes += 1;\n }\n\n continue;\n }\n\n const childGroup = groupById.get(child.id);\n\n if (!childGroup) {\n continue;\n }\n\n subfolders += 1;\n walk(childGroup);\n }\n };\n\n const root = groupById.get(folderId);\n\n if (root) {\n walk(root);\n }\n\n return { contentTypes, subfolders };\n}\n\nexport function collectSubtreeContentTypeUids(\n section: ContentStructureSection,\n folderId: string\n): UID.ContentType[] {\n const groupById = new Map(section.groups.map((group) => [group.id, group]));\n const uids: UID.ContentType[] = [];\n\n const walk = (id: string) => {\n const group = groupById.get(id);\n\n if (!group) {\n return;\n }\n\n for (const child of group.children) {\n if (child.type === 'contentType') {\n uids.push(child.uid);\n continue;\n }\n\n walk(child.id);\n }\n };\n\n walk(folderId);\n\n return uids;\n}\n\nexport function indexFolders(nodes: FolderTreeNode[]): Map<string, FolderNode> {\n const index = new Map<string, FolderNode>();\n\n const walk = (node: FolderTreeNode) => {\n if (node.type !== 'folder') {\n return;\n }\n\n index.set(node.id, node);\n node.children.forEach(walk);\n };\n\n nodes.forEach(walk);\n\n return index;\n}\n"],"names":["buildSectionTree","section","links","compareTitle","groups","groupById","Map","map","group","id","linkByUid","link","uid","childGroupIds","Set","child","children","type","add","grouped","buildFolder","depth","subGroup","get","push","status","parentId","title","to","parent","name","rootFolders","filter","has","ungrouped","sort","a","b","filterTree","nodes","matches","result","node","filteredChildren","length","subtreeFolderHeight","folder","deepestChild","Math","max","canNestFolderAt","target","targetDomainDepth","deepestResult","MAX_FOLDER_DEPTH","countSubtree","folderId","countableUids","contentTypes","subfolders","walk","childGroup","root","collectSubtreeContentTypeUids","uids"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropProjection.js","sources":["../../../../../admin/src/components/ContentTypeBuilderNav/lib/dropProjection.ts"],"sourcesContent":["import { arrayMove } from '@dnd-kit/sortable';\n\nimport { MAX_FOLDER_DEPTH } from '../../DataManager/utils/contentStructure';\n\nimport { canNestFolderAt, subtreeFolderHeight } from './buildFolderTree';\n\nimport type { FlatItem } from './flatModel';\n\nexport const INDENT_WIDTH = 24; // theme.spaces[6]\n\n/**\n * Temporary flag to disable root content-type reordering.\n */\nconst ROOT_CONTENT_TYPE_REORDER = false;\n\nconst clamp = (value: number, min: number, max: number) => {\n return Math.min(Math.max(value, min), max);\n};\n\nexport type DropLine = {\n edge: 'top' | 'bottom';\n anchorId: string;\n};\n\nexport type InsertTarget = {\n parentId: string | null;\n line: DropLine | null;\n index: number;\n depth: number;\n};\n\nexport type DropTarget =\n | { kind: 'nest'; folderId: string; depth: number }\n | ({ kind: 'insert' } & InsertTarget);\n\n/**\n * Locates the position for the line indicator given that root-level re-ordering is currently\n * not possible. This is temporary measure until root-level re-ordering is implemented.\n */\nfunction getDropTargetSectionRoot(items: FlatItem[], activeId: string): InsertTarget {\n const rootItems = items.filter((item) => item.depth === 0 && item.id !== activeId);\n\n const lastRootLeaf = [...rootItems].reverse().find((item) => item.node.type === 'contentType');\n const firstRootFolder = rootItems.find((item) => item.node.type === 'folder');\n\n const line: DropLine | null = (() => {\n if (firstRootFolder) {\n return { anchorId: firstRootFolder.id, edge: 'top' };\n }\n\n if (lastRootLeaf) {\n return { anchorId: lastRootLeaf.id, edge: 'bottom' };\n }\n\n return null;\n })();\n\n return { parentId: null, index: 0, depth: 0, line };\n}\n\nfunction getDropTargetBetweenRows(\n items: FlatItem[],\n activeId: string,\n overId: string,\n offsetX: number,\n side?: 'before' | 'after'\n): InsertTarget | null {\n const activeIndex = items.findIndex((item) => item.id === activeId);\n const overIndex = items.findIndex((item) => item.id === overId);\n\n if (overIndex === -1 || activeIndex === -1) {\n return null;\n }\n\n const active = items[activeIndex];\n\n const { rowsBeforeSlot, previous, next } = (() => {\n if (side) {\n const withoutActive = items.filter((item) => item.id !== activeId);\n const overPos = withoutActive.findIndex((item) => item.id === overId);\n const insertPos = side === 'before' ? overPos : overPos + 1;\n\n return {\n rowsBeforeSlot: withoutActive.slice(0, insertPos),\n previous: withoutActive[insertPos - 1],\n next: withoutActive[insertPos],\n };\n }\n\n const reordered = arrayMove(items, activeIndex, overIndex);\n\n return {\n rowsBeforeSlot: reordered.slice(0, overIndex),\n previous: reordered[overIndex - 1],\n next: reordered[overIndex + 1],\n };\n })();\n\n const dragDepth = Math.round(offsetX / INDENT_WIDTH);\n const projectedDepth = active.depth + dragDepth;\n\n const minDepth = next ? next.depth : 0;\n\n let maxDepth: number;\n if (!previous) {\n maxDepth = 0;\n } else if (previous.node.type === 'folder' && !previous.collapsed) {\n maxDepth = previous.depth + 1;\n } else {\n maxDepth = previous.depth;\n }\n\n if (active.node.type === 'folder') {\n const folderCeiling = MAX_FOLDER_DEPTH - subtreeFolderHeight(active.node);\n maxDepth = Math.min(maxDepth, folderCeiling);\n }\n\n if (maxDepth < minDepth) {\n return null;\n }\n const depth = clamp(projectedDepth, minDepth, maxDepth);\n\n const parentId = ((): string | null => {\n if (depth === 0 || !previous) {\n return null;\n }\n\n if (depth === previous.depth) {\n return previous.parentId;\n }\n\n if (depth > previous.depth) {\n return previous.node.type === 'folder' ? previous.node.id : previous.parentId;\n }\n\n const ancestor = [...rowsBeforeSlot].reverse().find((item) => item.depth === depth);\n\n return ancestor ? ancestor.parentId : null;\n })();\n\n let index = 0;\n\n for (const item of rowsBeforeSlot) {\n if (item.parentId !== parentId || item.depth !== depth) {\n continue;\n }\n\n if (parentId === null && item.node.type !== 'folder') {\n continue;\n }\n\n index += 1;\n }\n\n const line: DropLine | null = (() => {\n if (next) {\n return { anchorId: next.id, edge: 'top' };\n }\n\n if (previous) {\n return { anchorId: previous.id, edge: 'bottom' };\n }\n\n return null;\n })();\n\n /** For the time being, root content types have no stored order, so trying to move something there is not a real re-order operation. */\n const insertingAmongRootContentTypes =\n parentId === null &&\n next !== undefined &&\n next.node.type === 'contentType' &&\n next.parentId === null;\n\n if (!ROOT_CONTENT_TYPE_REORDER && insertingAmongRootContentTypes) {\n return getDropTargetSectionRoot(items, activeId);\n }\n\n return { parentId, index, depth, line };\n}\n\nfunction getDropTargetFolderSibling(\n items: FlatItem[],\n activeId: string,\n folderId: string,\n side: 'before' | 'after'\n): InsertTarget | null {\n const folderIndex = items.findIndex((item) => item.id === folderId);\n const active = items.find((item) => item.id === activeId);\n\n if (folderIndex === -1 || !active) {\n return null;\n }\n\n const folder = items[folderIndex];\n const { parentId, depth } = folder;\n\n if (\n active.node.type === 'folder' &&\n depth + subtreeFolderHeight(active.node) > MAX_FOLDER_DEPTH\n ) {\n return null;\n }\n\n const boundary = side === 'before' ? folderIndex : folderIndex + 1;\n let index = 0;\n\n for (let i = 0; i < boundary; i += 1) {\n const item = items[i];\n\n if (item.id === activeId) {\n continue;\n }\n\n if (item.parentId !== parentId || item.depth !== depth) {\n continue;\n }\n\n if (parentId === null && item.node.type !== 'folder') {\n continue;\n }\n\n index += 1;\n }\n\n const line: DropLine = (() => {\n if (side === 'before') {\n return { anchorId: folder.id, edge: 'top' };\n }\n\n let lastIndex = folderIndex;\n\n for (let i = folderIndex + 1; i < items.length; i += 1) {\n if (items[i].depth <= depth) {\n break;\n }\n\n lastIndex = i;\n }\n\n return { anchorId: items[lastIndex].id, edge: 'bottom' };\n })();\n\n return { parentId, index, depth, line };\n}\n\ntype DragState = {\n activeId: string;\n overId: string;\n offsetX: number;\n pointer?: { x: number; y: number };\n overRect?: { top: number; height: number };\n};\n\n/**\n * This resolved the destination for a drag-and-drop operation in the contentStructure tree. It takes into account the active item being dragged, the item it is being dropped over, the horizontal offset of the drag, and optionally which side of the target item the drop is intended for.\n * It returns a DropTarget object that describes where the active item should be placed in relation to its siblings and parent in the tree structure.\n *\n * When the dragged row is over a non-folder row, the drop target is always a sibling of that row (and its destination is based on which half of the row the pointer is over).\n *\n * When the dragged row is over a folder row, the drop target can be either a sibling of that folder (if the pointer is over the top or bottom third of the row) or a child of that folder (if the pointer is over the middle third of the row).\n * If the folder is collapsed, dropping into it will expand it and place the active row inside it.\n *\n * If the destination is nested such that the destination could be one of several depths, the depth is determined by the horizontal offset of the pointer.\n *\n * This allows for a user to position a row at the end of a folder, even if there are several expanded folders above the destination. Otherwise, this would be a multi-step operation.\n *\n */\nexport function resolveDropTarget(items: FlatItem[], dragState: DragState): DropTarget | null {\n const { activeId, overId, offsetX, pointer, overRect } = dragState;\n\n if (overId === activeId) {\n return null;\n }\n\n const itemHoveredByCursor = items.find((item) => item.id === overId);\n\n // If item is valid FoldeRNode\n if (itemHoveredByCursor && itemHoveredByCursor.node.type === 'folder' && pointer && overRect) {\n const folderNode = itemHoveredByCursor.node;\n\n const nextItem = items[items.indexOf(itemHoveredByCursor) + 1];\n const hasVisibleChildren = nextItem != null && nextItem.depth > itemHoveredByCursor.depth;\n\n // Determine which zone of the folder row the pointer is in (top, middle, bottom).\n const zone = calculateFolderDropZone({\n itemBoundingBox: overRect,\n pointerY: pointer.y,\n hasVisibleChildren,\n });\n\n if (zone === 'nest') {\n const activeNode = items.find(({ id }) => id === activeId)?.node;\n const nestIsValid =\n activeNode == null ||\n activeNode.type !== 'folder' ||\n canNestFolderAt(activeNode, folderNode);\n\n if (!nestIsValid) {\n return null;\n }\n\n return { kind: 'nest', folderId: folderNode.id, depth: itemHoveredByCursor.depth + 1 };\n }\n\n const sibling = getDropTargetFolderSibling(items, activeId, overId, zone);\n if (sibling) {\n return { kind: 'insert', ...sibling };\n }\n }\n\n const side = (() => {\n if (!pointer || !overRect) {\n return undefined;\n }\n\n return pointer.y < overRect.top + overRect.height / 2 ? 'before' : 'after';\n })();\n\n const insert = getDropTargetBetweenRows(items, activeId, overId, offsetX, side);\n\n return insert ? { kind: 'insert', ...insert } : null;\n}\n\nexport type FolderDropZone = 'before' | 'nest' | 'after';\n\n/**\n * Configuration for the folder drop zones.\n *\n * There are three zones and several possible behaviors:\n * 1. The top zone of the folder row (\"beore\"). This drops the the dragged row above the folder row.\n * 2. The bottom zone of the folder row (\"after\"). This drops the dragged row below the folder row.\n * If the folder is expanded:\n * 3. The middle zone of the folder row (\"nest\"). This drops the dragged row inside the folder row.\n * If the folder is collapsed:\n * 3A. The middle zone of the folder row (\"nest\"). This drops the dragged row inside the folder row.\n * 3B. If the folder is held over the middle zone for a certain amount of time, the folder will expand and the dragged row can be dropped inside the folder row.\n */\n\nconst NEST_ZONE_BOTTOM = 0.8;\nconst NEST_ZONE_TOP = 0.2;\n\ntype CalculateFolderDropZoneProps = {\n itemBoundingBox: { top: number; height: number };\n hasVisibleChildren: boolean;\n pointerY: number;\n};\n\nexport function calculateFolderDropZone({\n hasVisibleChildren,\n itemBoundingBox,\n pointerY,\n}: CalculateFolderDropZoneProps): FolderDropZone {\n if (pointerY < itemBoundingBox.top + itemBoundingBox.height * NEST_ZONE_TOP) {\n return 'before';\n }\n\n if (\n !hasVisibleChildren &&\n pointerY > itemBoundingBox.top + itemBoundingBox.height * NEST_ZONE_BOTTOM\n ) {\n return 'after';\n }\n\n return 'nest';\n}\n"],"names":["INDENT_WIDTH","clamp","value","min","max","Math","getDropTargetSectionRoot","items","activeId","rootItems","filter","item","depth","id","lastRootLeaf","reverse","find","node","type","firstRootFolder","line","anchorId","edge","parentId","index","getDropTargetBetweenRows","overId","offsetX","side","activeIndex","findIndex","overIndex","active","rowsBeforeSlot","previous","next","withoutActive","overPos","insertPos","slice","reordered","arrayMove","dragDepth","round","projectedDepth","minDepth","maxDepth","collapsed","folderCeiling","MAX_FOLDER_DEPTH","subtreeFolderHeight","ancestor","insertingAmongRootContentTypes","undefined","getDropTargetFolderSibling","folderId","folderIndex","folder","boundary","i","lastIndex","length","resolveDropTarget","dragState","pointer","overRect","itemHoveredByCursor","folderNode","nextItem","indexOf","hasVisibleChildren","zone","calculateFolderDropZone","itemBoundingBox","pointerY","y","activeNode","nestIsValid","canNestFolderAt","kind","sibling","top","height","insert","NEST_ZONE_BOTTOM","NEST_ZONE_TOP"],"mappings":";;;;;;AAQO,MAAMA,YAAAA,GAAe,GAAG;AAO/B,MAAMC,KAAAA,GAAQ,CAACC,KAAAA,EAAeC,GAAAA,EAAaC,GAAAA,GAAAA;AACzC,IAAA,OAAOC,KAAKF,GAAG,CAACE,KAAKD,GAAG,CAACF,OAAOC,GAAAA,CAAAA,EAAMC,GAAAA,CAAAA;AACxC,CAAA;AAkBA;;;AAGC,IACD,SAASE,wBAAAA,CAAyBC,KAAiB,EAAEC,QAAgB,EAAA;AACnE,IAAA,MAAMC,SAAAA,GAAYF,KAAAA,CAAMG,MAAM,CAAC,CAACC,IAAAA,GAASA,IAAAA,CAAKC,KAAK,KAAK,CAAA,IAAKD,IAAAA,CAAKE,EAAE,KAAKL,QAAAA,CAAAA;AAEzE,IAAA,MAAMM,YAAAA,GAAe;AAAIL,QAAAA,GAAAA;KAAU,CAACM,OAAO,EAAA,CAAGC,IAAI,CAAC,CAACL,OAASA,IAAAA,CAAKM,IAAI,CAACC,IAAI,KAAK,aAAA,CAAA;IAChF,MAAMC,eAAAA,GAAkBV,SAAAA,CAAUO,IAAI,CAAC,CAACL,OAASA,IAAAA,CAAKM,IAAI,CAACC,IAAI,KAAK,QAAA,CAAA;IAEpE,MAAME,IAAAA,GAAwB,CAAC,IAAA;AAC7B,QAAA,IAAID,eAAAA,EAAiB;YACnB,OAAO;AAAEE,gBAAAA,QAAAA,EAAUF,gBAAgBN,EAAE;gBAAES,IAAAA,EAAM;AAAM,aAAA;AACrD,QAAA;AAEA,QAAA,IAAIR,YAAAA,EAAc;YAChB,OAAO;AAAEO,gBAAAA,QAAAA,EAAUP,aAAaD,EAAE;gBAAES,IAAAA,EAAM;AAAS,aAAA;AACrD,QAAA;QAEA,OAAO,IAAA;IACT,CAAA,GAAA;IAEA,OAAO;QAAEC,QAAAA,EAAU,IAAA;QAAMC,KAAAA,EAAO,CAAA;QAAGZ,KAAAA,EAAO,CAAA;AAAGQ,QAAAA;AAAK,KAAA;AACpD;AAEA,SAASK,wBAAAA,CACPlB,KAAiB,EACjBC,QAAgB,EAChBkB,MAAc,EACdC,OAAe,EACfC,IAAyB,EAAA;IAEzB,MAAMC,WAAAA,GAActB,MAAMuB,SAAS,CAAC,CAACnB,IAAAA,GAASA,IAAAA,CAAKE,EAAE,KAAKL,QAAAA,CAAAA;IAC1D,MAAMuB,SAAAA,GAAYxB,MAAMuB,SAAS,CAAC,CAACnB,IAAAA,GAASA,IAAAA,CAAKE,EAAE,KAAKa,MAAAA,CAAAA;AAExD,IAAA,IAAIK,SAAAA,KAAc,EAAC,IAAKF,WAAAA,KAAgB,EAAC,EAAG;QAC1C,OAAO,IAAA;AACT,IAAA;IAEA,MAAMG,MAAAA,GAASzB,KAAK,CAACsB,WAAAA,CAAY;IAEjC,MAAM,EAAEI,cAAc,EAAEC,QAAQ,EAAEC,IAAI,EAAE,GAAI,CAAA,IAAA;AAC1C,QAAA,IAAIP,IAAAA,EAAM;YACR,MAAMQ,aAAAA,GAAgB7B,MAAMG,MAAM,CAAC,CAACC,IAAAA,GAASA,IAAAA,CAAKE,EAAE,KAAKL,QAAAA,CAAAA;YACzD,MAAM6B,OAAAA,GAAUD,cAAcN,SAAS,CAAC,CAACnB,IAAAA,GAASA,IAAAA,CAAKE,EAAE,KAAKa,MAAAA,CAAAA;AAC9D,YAAA,MAAMY,SAAAA,GAAYV,IAAAA,KAAS,QAAA,GAAWS,OAAAA,GAAUA,OAAAA,GAAU,CAAA;YAE1D,OAAO;gBACLJ,cAAAA,EAAgBG,aAAAA,CAAcG,KAAK,CAAC,CAAA,EAAGD,SAAAA,CAAAA;gBACvCJ,QAAAA,EAAUE,aAAa,CAACE,SAAAA,GAAY,CAAA,CAAE;gBACtCH,IAAAA,EAAMC,aAAa,CAACE,SAAAA;AACtB,aAAA;AACF,QAAA;QAEA,MAAME,SAAAA,GAAYC,kBAAAA,CAAUlC,KAAAA,EAAOsB,WAAAA,EAAaE,SAAAA,CAAAA;QAEhD,OAAO;YACLE,cAAAA,EAAgBO,SAAAA,CAAUD,KAAK,CAAC,CAAA,EAAGR,SAAAA,CAAAA;YACnCG,QAAAA,EAAUM,SAAS,CAACT,SAAAA,GAAY,CAAA,CAAE;YAClCI,IAAAA,EAAMK,SAAS,CAACT,SAAAA,GAAY,CAAA;AAC9B,SAAA;IACF,CAAA,GAAA;AAEA,IAAA,MAAMW,SAAAA,GAAYrC,IAAAA,CAAKsC,KAAK,CAAChB,OAAAA,GAAU3B,YAAAA,CAAAA;IACvC,MAAM4C,cAAAA,GAAiBZ,MAAAA,CAAOpB,KAAK,GAAG8B,SAAAA;AAEtC,IAAA,MAAMG,QAAAA,GAAWV,IAAAA,GAAOA,IAAAA,CAAKvB,KAAK,GAAG,CAAA;IAErC,IAAIkC,QAAAA;AACJ,IAAA,IAAI,CAACZ,QAAAA,EAAU;QACbY,QAAAA,GAAW,CAAA;IACb,CAAA,MAAO,IAAIZ,QAAAA,CAASjB,IAAI,CAACC,IAAI,KAAK,QAAA,IAAY,CAACgB,QAAAA,CAASa,SAAS,EAAE;QACjED,QAAAA,GAAWZ,QAAAA,CAAStB,KAAK,GAAG,CAAA;IAC9B,CAAA,MAAO;AACLkC,QAAAA,QAAAA,GAAWZ,SAAStB,KAAK;AAC3B,IAAA;AAEA,IAAA,IAAIoB,MAAAA,CAAOf,IAAI,CAACC,IAAI,KAAK,QAAA,EAAU;AACjC,QAAA,MAAM8B,aAAAA,GAAgBC,iCAAAA,GAAmBC,mCAAAA,CAAoBlB,MAAAA,CAAOf,IAAI,CAAA;QACxE6B,QAAAA,GAAWzC,IAAAA,CAAKF,GAAG,CAAC2C,QAAAA,EAAUE,aAAAA,CAAAA;AAChC,IAAA;AAEA,IAAA,IAAIF,WAAWD,QAAAA,EAAU;QACvB,OAAO,IAAA;AACT,IAAA;IACA,MAAMjC,KAAAA,GAAQX,KAAAA,CAAM2C,cAAAA,EAAgBC,QAAAA,EAAUC,QAAAA,CAAAA;IAE9C,MAAMvB,QAAAA,GAAW,CAAC,IAAA;QAChB,IAAIX,KAAAA,KAAU,CAAA,IAAK,CAACsB,QAAAA,EAAU;YAC5B,OAAO,IAAA;AACT,QAAA;QAEA,IAAItB,KAAAA,KAAUsB,QAAAA,CAAStB,KAAK,EAAE;AAC5B,YAAA,OAAOsB,SAASX,QAAQ;AAC1B,QAAA;QAEA,IAAIX,KAAAA,GAAQsB,QAAAA,CAAStB,KAAK,EAAE;AAC1B,YAAA,OAAOsB,QAAAA,CAASjB,IAAI,CAACC,IAAI,KAAK,QAAA,GAAWgB,QAAAA,CAASjB,IAAI,CAACJ,EAAE,GAAGqB,QAAAA,CAASX,QAAQ;AAC/E,QAAA;AAEA,QAAA,MAAM4B,QAAAA,GAAW;AAAIlB,YAAAA,GAAAA;SAAe,CAAClB,OAAO,GAAGC,IAAI,CAAC,CAACL,IAAAA,GAASA,IAAAA,CAAKC,KAAK,KAAKA,KAAAA,CAAAA;QAE7E,OAAOuC,QAAAA,GAAWA,QAAAA,CAAS5B,QAAQ,GAAG,IAAA;IACxC,CAAA,GAAA;AAEA,IAAA,IAAIC,KAAAA,GAAQ,CAAA;IAEZ,KAAK,MAAMb,QAAQsB,cAAAA,CAAgB;AACjC,QAAA,IAAItB,KAAKY,QAAQ,KAAKA,YAAYZ,IAAAA,CAAKC,KAAK,KAAKA,KAAAA,EAAO;AACtD,YAAA;AACF,QAAA;AAEA,QAAA,IAAIW,aAAa,IAAA,IAAQZ,IAAAA,CAAKM,IAAI,CAACC,IAAI,KAAK,QAAA,EAAU;AACpD,YAAA;AACF,QAAA;QAEAM,KAAAA,IAAS,CAAA;AACX,IAAA;IAEA,MAAMJ,IAAAA,GAAwB,CAAC,IAAA;AAC7B,QAAA,IAAIe,IAAAA,EAAM;YACR,OAAO;AAAEd,gBAAAA,QAAAA,EAAUc,KAAKtB,EAAE;gBAAES,IAAAA,EAAM;AAAM,aAAA;AAC1C,QAAA;AAEA,QAAA,IAAIY,QAAAA,EAAU;YACZ,OAAO;AAAEb,gBAAAA,QAAAA,EAAUa,SAASrB,EAAE;gBAAES,IAAAA,EAAM;AAAS,aAAA;AACjD,QAAA;QAEA,OAAO,IAAA;IACT,CAAA,GAAA;AAEA,4IACA,MAAM8B,8BAAAA,GACJ7B,QAAAA,KAAa,QACbY,IAAAA,KAASkB,SAAAA,IACTlB,IAAAA,CAAKlB,IAAI,CAACC,IAAI,KAAK,aAAA,IACnBiB,IAAAA,CAAKZ,QAAQ,KAAK,IAAA;IAEpB,IAAkC6B,8BAAAA,EAAgC;AAChE,QAAA,OAAO9C,yBAAyBC,KAAAA,EAAOC,QAAAA,CAAAA;AACzC,IAAA;IAEA,OAAO;AAAEe,QAAAA,QAAAA;AAAUC,QAAAA,KAAAA;AAAOZ,QAAAA,KAAAA;AAAOQ,QAAAA;AAAK,KAAA;AACxC;AAEA,SAASkC,2BACP/C,KAAiB,EACjBC,QAAgB,EAChB+C,QAAgB,EAChB3B,IAAwB,EAAA;IAExB,MAAM4B,WAAAA,GAAcjD,MAAMuB,SAAS,CAAC,CAACnB,IAAAA,GAASA,IAAAA,CAAKE,EAAE,KAAK0C,QAAAA,CAAAA;IAC1D,MAAMvB,MAAAA,GAASzB,MAAMS,IAAI,CAAC,CAACL,IAAAA,GAASA,IAAAA,CAAKE,EAAE,KAAKL,QAAAA,CAAAA;AAEhD,IAAA,IAAIgD,WAAAA,KAAgB,EAAC,IAAK,CAACxB,MAAAA,EAAQ;QACjC,OAAO,IAAA;AACT,IAAA;IAEA,MAAMyB,MAAAA,GAASlD,KAAK,CAACiD,WAAAA,CAAY;AACjC,IAAA,MAAM,EAAEjC,QAAQ,EAAEX,KAAK,EAAE,GAAG6C,MAAAA;IAE5B,IACEzB,MAAAA,CAAOf,IAAI,CAACC,IAAI,KAAK,QAAA,IACrBN,KAAAA,GAAQsC,mCAAAA,CAAoBlB,MAAAA,CAAOf,IAAI,CAAA,GAAIgC,iCAAAA,EAC3C;QACA,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAMS,QAAAA,GAAW9B,IAAAA,KAAS,QAAA,GAAW4B,WAAAA,GAAcA,WAAAA,GAAc,CAAA;AACjE,IAAA,IAAIhC,KAAAA,GAAQ,CAAA;AAEZ,IAAA,IAAK,IAAImC,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAID,QAAAA,EAAUC,KAAK,CAAA,CAAG;QACpC,MAAMhD,IAAAA,GAAOJ,KAAK,CAACoD,CAAAA,CAAE;QAErB,IAAIhD,IAAAA,CAAKE,EAAE,KAAKL,QAAAA,EAAU;AACxB,YAAA;AACF,QAAA;AAEA,QAAA,IAAIG,KAAKY,QAAQ,KAAKA,YAAYZ,IAAAA,CAAKC,KAAK,KAAKA,KAAAA,EAAO;AACtD,YAAA;AACF,QAAA;AAEA,QAAA,IAAIW,aAAa,IAAA,IAAQZ,IAAAA,CAAKM,IAAI,CAACC,IAAI,KAAK,QAAA,EAAU;AACpD,YAAA;AACF,QAAA;QAEAM,KAAAA,IAAS,CAAA;AACX,IAAA;IAEA,MAAMJ,IAAAA,GAAiB,CAAC,IAAA;AACtB,QAAA,IAAIQ,SAAS,QAAA,EAAU;YACrB,OAAO;AAAEP,gBAAAA,QAAAA,EAAUoC,OAAO5C,EAAE;gBAAES,IAAAA,EAAM;AAAM,aAAA;AAC5C,QAAA;AAEA,QAAA,IAAIsC,SAAAA,GAAYJ,WAAAA;QAEhB,IAAK,IAAIG,IAAIH,WAAAA,GAAc,CAAA,EAAGG,IAAIpD,KAAAA,CAAMsD,MAAM,EAAEF,CAAAA,IAAK,CAAA,CAAG;AACtD,YAAA,IAAIpD,KAAK,CAACoD,CAAAA,CAAE,CAAC/C,KAAK,IAAIA,KAAAA,EAAO;AAC3B,gBAAA;AACF,YAAA;YAEAgD,SAAAA,GAAYD,CAAAA;AACd,QAAA;QAEA,OAAO;AAAEtC,YAAAA,QAAAA,EAAUd,KAAK,CAACqD,SAAAA,CAAU,CAAC/C,EAAE;YAAES,IAAAA,EAAM;AAAS,SAAA;IACzD,CAAA,GAAA;IAEA,OAAO;AAAEC,QAAAA,QAAAA;AAAUC,QAAAA,KAAAA;AAAOZ,QAAAA,KAAAA;AAAOQ,QAAAA;AAAK,KAAA;AACxC;AAUA;;;;;;;;;;;;;AAaC,IACM,SAAS0C,iBAAAA,CAAkBvD,KAAiB,EAAEwD,SAAoB,EAAA;IACvE,MAAM,EAAEvD,QAAQ,EAAEkB,MAAM,EAAEC,OAAO,EAAEqC,OAAO,EAAEC,QAAQ,EAAE,GAAGF,SAAAA;AAEzD,IAAA,IAAIrC,WAAWlB,QAAAA,EAAU;QACvB,OAAO,IAAA;AACT,IAAA;IAEA,MAAM0D,mBAAAA,GAAsB3D,MAAMS,IAAI,CAAC,CAACL,IAAAA,GAASA,IAAAA,CAAKE,EAAE,KAAKa,MAAAA,CAAAA;;IAG7D,IAAIwC,mBAAAA,IAAuBA,oBAAoBjD,IAAI,CAACC,IAAI,KAAK,QAAA,IAAY8C,WAAWC,QAAAA,EAAU;QAC5F,MAAME,UAAAA,GAAaD,oBAAoBjD,IAAI;AAE3C,QAAA,MAAMmD,WAAW7D,KAAK,CAACA,MAAM8D,OAAO,CAACH,uBAAuB,CAAA,CAAE;AAC9D,QAAA,MAAMI,qBAAqBF,QAAAA,IAAY,IAAA,IAAQA,SAASxD,KAAK,GAAGsD,oBAAoBtD,KAAK;;AAGzF,QAAA,MAAM2D,OAAOC,uBAAAA,CAAwB;YACnCC,eAAAA,EAAiBR,QAAAA;AACjBS,YAAAA,QAAAA,EAAUV,QAAQW,CAAC;AACnBL,YAAAA;AACF,SAAA,CAAA;AAEA,QAAA,IAAIC,SAAS,MAAA,EAAQ;YACnB,MAAMK,UAAAA,GAAarE,KAAAA,CAAMS,IAAI,CAAC,CAAC,EAAEH,EAAE,EAAE,GAAKA,EAAAA,KAAOL,QAAAA,CAAAA,EAAWS,IAAAA;YAC5D,MAAM4D,WAAAA,GACJD,cAAc,IAAA,IACdA,UAAAA,CAAW1D,IAAI,KAAK,QAAA,IACpB4D,gCAAgBF,UAAAA,EAAYT,UAAAA,CAAAA;AAE9B,YAAA,IAAI,CAACU,WAAAA,EAAa;gBAChB,OAAO,IAAA;AACT,YAAA;YAEA,OAAO;gBAAEE,IAAAA,EAAM,MAAA;AAAQxB,gBAAAA,QAAAA,EAAUY,WAAWtD,EAAE;gBAAED,KAAAA,EAAOsD,mBAAAA,CAAoBtD,KAAK,GAAG;AAAE,aAAA;AACvF,QAAA;AAEA,QAAA,MAAMoE,OAAAA,GAAU1B,0BAAAA,CAA2B/C,KAAAA,EAAOC,QAAAA,EAAUkB,MAAAA,EAAQ6C,IAAAA,CAAAA;AACpE,QAAA,IAAIS,OAAAA,EAAS;YACX,OAAO;gBAAED,IAAAA,EAAM,QAAA;AAAU,gBAAA,GAAGC;AAAQ,aAAA;AACtC,QAAA;AACF,IAAA;IAEA,MAAMpD,IAAAA,GAAO,CAAC,IAAA;QACZ,IAAI,CAACoC,OAAAA,IAAW,CAACC,QAAAA,EAAU;YACzB,OAAOZ,SAAAA;AACT,QAAA;QAEA,OAAOW,OAAAA,CAAQW,CAAC,GAAGV,QAAAA,CAASgB,GAAG,GAAGhB,QAAAA,CAASiB,MAAM,GAAG,CAAA,GAAI,QAAA,GAAW,OAAA;IACrE,CAAA,GAAA;AAEA,IAAA,MAAMC,MAAAA,GAAS1D,wBAAAA,CAAyBlB,KAAAA,EAAOC,QAAAA,EAAUkB,QAAQC,OAAAA,EAASC,IAAAA,CAAAA;AAE1E,IAAA,OAAOuD,MAAAA,GAAS;QAAEJ,IAAAA,EAAM,QAAA;AAAU,QAAA,GAAGI;KAAO,GAAI,IAAA;AAClD;AAIA;;;;;;;;;;;AAWC,IAED,MAAMC,gBAAAA,GAAmB,GAAA;AACzB,MAAMC,aAAAA,GAAgB,GAAA;AAQf,SAASb,wBAAwB,EACtCF,kBAAkB,EAClBG,eAAe,EACfC,QAAQ,EACqB,EAAA;AAC7B,IAAA,IAAIA,WAAWD,eAAAA,CAAgBQ,GAAG,GAAGR,eAAAA,CAAgBS,MAAM,GAAGG,aAAAA,EAAe;QAC3E,OAAO,QAAA;AACT,IAAA;IAEA,IACE,CAACf,sBACDI,QAAAA,GAAWD,eAAAA,CAAgBQ,GAAG,GAAGR,eAAAA,CAAgBS,MAAM,GAAGE,gBAAAA,EAC1D;QACA,OAAO,OAAA;AACT,IAAA;IAEA,OAAO,MAAA;AACT;;;;;;"}
|
|
1
|
+
{"version":3,"file":"dropProjection.js","sources":["../../../../../admin/src/components/ContentTypeBuilderNav/lib/dropProjection.ts"],"sourcesContent":["import { arrayMove } from '@dnd-kit/sortable';\n\nimport { MAX_FOLDER_DEPTH } from '../../DataManager/utils/contentStructure';\n\nimport { canNestFolderAt, subtreeFolderHeight } from './buildFolderTree';\n\nimport type { FlatItem } from './flatModel';\n\nexport const INDENT_WIDTH = 24; // theme.spaces[6]\n\n/**\n * Temporary flag to disable root content-type reordering.\n */\nconst ROOT_CONTENT_TYPE_REORDER = false;\n\nconst clamp = (value: number, min: number, max: number) => {\n return Math.min(Math.max(value, min), max);\n};\n\nexport type DropLine = {\n edge: 'top' | 'bottom';\n anchorId: string;\n};\n\nexport type InsertTarget = {\n parentId: string | null;\n line: DropLine | null;\n index: number;\n depth: number;\n};\n\nexport type DropTarget =\n { kind: 'nest'; folderId: string; depth: number } | ({ kind: 'insert' } & InsertTarget);\n\n/**\n * Locates the position for the line indicator given that root-level re-ordering is currently\n * not possible. This is temporary measure until root-level re-ordering is implemented.\n */\nfunction getDropTargetSectionRoot(items: FlatItem[], activeId: string): InsertTarget {\n const rootItems = items.filter((item) => item.depth === 0 && item.id !== activeId);\n\n const lastRootLeaf = [...rootItems].reverse().find((item) => item.node.type === 'contentType');\n const firstRootFolder = rootItems.find((item) => item.node.type === 'folder');\n\n const line: DropLine | null = (() => {\n if (firstRootFolder) {\n return { anchorId: firstRootFolder.id, edge: 'top' };\n }\n\n if (lastRootLeaf) {\n return { anchorId: lastRootLeaf.id, edge: 'bottom' };\n }\n\n return null;\n })();\n\n return { parentId: null, index: 0, depth: 0, line };\n}\n\nfunction getDropTargetBetweenRows(\n items: FlatItem[],\n activeId: string,\n overId: string,\n offsetX: number,\n side?: 'before' | 'after'\n): InsertTarget | null {\n const activeIndex = items.findIndex((item) => item.id === activeId);\n const overIndex = items.findIndex((item) => item.id === overId);\n\n if (overIndex === -1 || activeIndex === -1) {\n return null;\n }\n\n const active = items[activeIndex];\n\n const { rowsBeforeSlot, previous, next } = (() => {\n if (side) {\n const withoutActive = items.filter((item) => item.id !== activeId);\n const overPos = withoutActive.findIndex((item) => item.id === overId);\n const insertPos = side === 'before' ? overPos : overPos + 1;\n\n return {\n rowsBeforeSlot: withoutActive.slice(0, insertPos),\n previous: withoutActive[insertPos - 1],\n next: withoutActive[insertPos],\n };\n }\n\n const reordered = arrayMove(items, activeIndex, overIndex);\n\n return {\n rowsBeforeSlot: reordered.slice(0, overIndex),\n previous: reordered[overIndex - 1],\n next: reordered[overIndex + 1],\n };\n })();\n\n const dragDepth = Math.round(offsetX / INDENT_WIDTH);\n const projectedDepth = active.depth + dragDepth;\n\n const minDepth = next ? next.depth : 0;\n\n let maxDepth: number;\n if (!previous) {\n maxDepth = 0;\n } else if (previous.node.type === 'folder' && !previous.collapsed) {\n maxDepth = previous.depth + 1;\n } else {\n maxDepth = previous.depth;\n }\n\n if (active.node.type === 'folder') {\n const folderCeiling = MAX_FOLDER_DEPTH - subtreeFolderHeight(active.node);\n maxDepth = Math.min(maxDepth, folderCeiling);\n }\n\n if (maxDepth < minDepth) {\n return null;\n }\n const depth = clamp(projectedDepth, minDepth, maxDepth);\n\n const parentId = ((): string | null => {\n if (depth === 0 || !previous) {\n return null;\n }\n\n if (depth === previous.depth) {\n return previous.parentId;\n }\n\n if (depth > previous.depth) {\n return previous.node.type === 'folder' ? previous.node.id : previous.parentId;\n }\n\n const ancestor = [...rowsBeforeSlot].reverse().find((item) => item.depth === depth);\n\n return ancestor ? ancestor.parentId : null;\n })();\n\n let index = 0;\n\n for (const item of rowsBeforeSlot) {\n if (item.parentId !== parentId || item.depth !== depth) {\n continue;\n }\n\n if (parentId === null && item.node.type !== 'folder') {\n continue;\n }\n\n index += 1;\n }\n\n const line: DropLine | null = (() => {\n if (next) {\n return { anchorId: next.id, edge: 'top' };\n }\n\n if (previous) {\n return { anchorId: previous.id, edge: 'bottom' };\n }\n\n return null;\n })();\n\n /** For the time being, root content types have no stored order, so trying to move something there is not a real re-order operation. */\n const insertingAmongRootContentTypes =\n parentId === null &&\n next !== undefined &&\n next.node.type === 'contentType' &&\n next.parentId === null;\n\n if (!ROOT_CONTENT_TYPE_REORDER && insertingAmongRootContentTypes) {\n return getDropTargetSectionRoot(items, activeId);\n }\n\n return { parentId, index, depth, line };\n}\n\nfunction getDropTargetFolderSibling(\n items: FlatItem[],\n activeId: string,\n folderId: string,\n side: 'before' | 'after'\n): InsertTarget | null {\n const folderIndex = items.findIndex((item) => item.id === folderId);\n const active = items.find((item) => item.id === activeId);\n\n if (folderIndex === -1 || !active) {\n return null;\n }\n\n const folder = items[folderIndex];\n const { parentId, depth } = folder;\n\n if (\n active.node.type === 'folder' &&\n depth + subtreeFolderHeight(active.node) > MAX_FOLDER_DEPTH\n ) {\n return null;\n }\n\n const boundary = side === 'before' ? folderIndex : folderIndex + 1;\n let index = 0;\n\n for (let i = 0; i < boundary; i += 1) {\n const item = items[i];\n\n if (item.id === activeId) {\n continue;\n }\n\n if (item.parentId !== parentId || item.depth !== depth) {\n continue;\n }\n\n if (parentId === null && item.node.type !== 'folder') {\n continue;\n }\n\n index += 1;\n }\n\n const line: DropLine = (() => {\n if (side === 'before') {\n return { anchorId: folder.id, edge: 'top' };\n }\n\n let lastIndex = folderIndex;\n\n for (let i = folderIndex + 1; i < items.length; i += 1) {\n if (items[i].depth <= depth) {\n break;\n }\n\n lastIndex = i;\n }\n\n return { anchorId: items[lastIndex].id, edge: 'bottom' };\n })();\n\n return { parentId, index, depth, line };\n}\n\ntype DragState = {\n activeId: string;\n overId: string;\n offsetX: number;\n pointer?: { x: number; y: number };\n overRect?: { top: number; height: number };\n};\n\n/**\n * This resolved the destination for a drag-and-drop operation in the contentStructure tree. It takes into account the active item being dragged, the item it is being dropped over, the horizontal offset of the drag, and optionally which side of the target item the drop is intended for.\n * It returns a DropTarget object that describes where the active item should be placed in relation to its siblings and parent in the tree structure.\n *\n * When the dragged row is over a non-folder row, the drop target is always a sibling of that row (and its destination is based on which half of the row the pointer is over).\n *\n * When the dragged row is over a folder row, the drop target can be either a sibling of that folder (if the pointer is over the top or bottom third of the row) or a child of that folder (if the pointer is over the middle third of the row).\n * If the folder is collapsed, dropping into it will expand it and place the active row inside it.\n *\n * If the destination is nested such that the destination could be one of several depths, the depth is determined by the horizontal offset of the pointer.\n *\n * This allows for a user to position a row at the end of a folder, even if there are several expanded folders above the destination. Otherwise, this would be a multi-step operation.\n *\n */\nexport function resolveDropTarget(items: FlatItem[], dragState: DragState): DropTarget | null {\n const { activeId, overId, offsetX, pointer, overRect } = dragState;\n\n if (overId === activeId) {\n return null;\n }\n\n const itemHoveredByCursor = items.find((item) => item.id === overId);\n\n // If item is valid FoldeRNode\n if (itemHoveredByCursor && itemHoveredByCursor.node.type === 'folder' && pointer && overRect) {\n const folderNode = itemHoveredByCursor.node;\n\n const nextItem = items[items.indexOf(itemHoveredByCursor) + 1];\n const hasVisibleChildren = nextItem != null && nextItem.depth > itemHoveredByCursor.depth;\n\n // Determine which zone of the folder row the pointer is in (top, middle, bottom).\n const zone = calculateFolderDropZone({\n itemBoundingBox: overRect,\n pointerY: pointer.y,\n hasVisibleChildren,\n });\n\n if (zone === 'nest') {\n const activeNode = items.find(({ id }) => id === activeId)?.node;\n const nestIsValid =\n activeNode == null ||\n activeNode.type !== 'folder' ||\n canNestFolderAt(activeNode, folderNode);\n\n if (!nestIsValid) {\n return null;\n }\n\n return { kind: 'nest', folderId: folderNode.id, depth: itemHoveredByCursor.depth + 1 };\n }\n\n const sibling = getDropTargetFolderSibling(items, activeId, overId, zone);\n if (sibling) {\n return { kind: 'insert', ...sibling };\n }\n }\n\n const side = (() => {\n if (!pointer || !overRect) {\n return undefined;\n }\n\n return pointer.y < overRect.top + overRect.height / 2 ? 'before' : 'after';\n })();\n\n const insert = getDropTargetBetweenRows(items, activeId, overId, offsetX, side);\n\n return insert ? { kind: 'insert', ...insert } : null;\n}\n\nexport type FolderDropZone = 'before' | 'nest' | 'after';\n\n/**\n * Configuration for the folder drop zones.\n *\n * There are three zones and several possible behaviors:\n * 1. The top zone of the folder row (\"beore\"). This drops the the dragged row above the folder row.\n * 2. The bottom zone of the folder row (\"after\"). This drops the dragged row below the folder row.\n * If the folder is expanded:\n * 3. The middle zone of the folder row (\"nest\"). This drops the dragged row inside the folder row.\n * If the folder is collapsed:\n * 3A. The middle zone of the folder row (\"nest\"). This drops the dragged row inside the folder row.\n * 3B. If the folder is held over the middle zone for a certain amount of time, the folder will expand and the dragged row can be dropped inside the folder row.\n */\n\nconst NEST_ZONE_BOTTOM = 0.8;\nconst NEST_ZONE_TOP = 0.2;\n\ntype CalculateFolderDropZoneProps = {\n itemBoundingBox: { top: number; height: number };\n hasVisibleChildren: boolean;\n pointerY: number;\n};\n\nexport function calculateFolderDropZone({\n hasVisibleChildren,\n itemBoundingBox,\n pointerY,\n}: CalculateFolderDropZoneProps): FolderDropZone {\n if (pointerY < itemBoundingBox.top + itemBoundingBox.height * NEST_ZONE_TOP) {\n return 'before';\n }\n\n if (\n !hasVisibleChildren &&\n pointerY > itemBoundingBox.top + itemBoundingBox.height * NEST_ZONE_BOTTOM\n ) {\n return 'after';\n }\n\n return 'nest';\n}\n"],"names":["INDENT_WIDTH","clamp","value","min","max","Math","getDropTargetSectionRoot","items","activeId","rootItems","filter","item","depth","id","lastRootLeaf","reverse","find","node","type","firstRootFolder","line","anchorId","edge","parentId","index","getDropTargetBetweenRows","overId","offsetX","side","activeIndex","findIndex","overIndex","active","rowsBeforeSlot","previous","next","withoutActive","overPos","insertPos","slice","reordered","arrayMove","dragDepth","round","projectedDepth","minDepth","maxDepth","collapsed","folderCeiling","MAX_FOLDER_DEPTH","subtreeFolderHeight","ancestor","insertingAmongRootContentTypes","undefined","getDropTargetFolderSibling","folderId","folderIndex","folder","boundary","i","lastIndex","length","resolveDropTarget","dragState","pointer","overRect","itemHoveredByCursor","folderNode","nextItem","indexOf","hasVisibleChildren","zone","calculateFolderDropZone","itemBoundingBox","pointerY","y","activeNode","nestIsValid","canNestFolderAt","kind","sibling","top","height","insert","NEST_ZONE_BOTTOM","NEST_ZONE_TOP"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropProjection.mjs","sources":["../../../../../admin/src/components/ContentTypeBuilderNav/lib/dropProjection.ts"],"sourcesContent":["import { arrayMove } from '@dnd-kit/sortable';\n\nimport { MAX_FOLDER_DEPTH } from '../../DataManager/utils/contentStructure';\n\nimport { canNestFolderAt, subtreeFolderHeight } from './buildFolderTree';\n\nimport type { FlatItem } from './flatModel';\n\nexport const INDENT_WIDTH = 24; // theme.spaces[6]\n\n/**\n * Temporary flag to disable root content-type reordering.\n */\nconst ROOT_CONTENT_TYPE_REORDER = false;\n\nconst clamp = (value: number, min: number, max: number) => {\n return Math.min(Math.max(value, min), max);\n};\n\nexport type DropLine = {\n edge: 'top' | 'bottom';\n anchorId: string;\n};\n\nexport type InsertTarget = {\n parentId: string | null;\n line: DropLine | null;\n index: number;\n depth: number;\n};\n\nexport type DropTarget =\n | { kind: 'nest'; folderId: string; depth: number }\n | ({ kind: 'insert' } & InsertTarget);\n\n/**\n * Locates the position for the line indicator given that root-level re-ordering is currently\n * not possible. This is temporary measure until root-level re-ordering is implemented.\n */\nfunction getDropTargetSectionRoot(items: FlatItem[], activeId: string): InsertTarget {\n const rootItems = items.filter((item) => item.depth === 0 && item.id !== activeId);\n\n const lastRootLeaf = [...rootItems].reverse().find((item) => item.node.type === 'contentType');\n const firstRootFolder = rootItems.find((item) => item.node.type === 'folder');\n\n const line: DropLine | null = (() => {\n if (firstRootFolder) {\n return { anchorId: firstRootFolder.id, edge: 'top' };\n }\n\n if (lastRootLeaf) {\n return { anchorId: lastRootLeaf.id, edge: 'bottom' };\n }\n\n return null;\n })();\n\n return { parentId: null, index: 0, depth: 0, line };\n}\n\nfunction getDropTargetBetweenRows(\n items: FlatItem[],\n activeId: string,\n overId: string,\n offsetX: number,\n side?: 'before' | 'after'\n): InsertTarget | null {\n const activeIndex = items.findIndex((item) => item.id === activeId);\n const overIndex = items.findIndex((item) => item.id === overId);\n\n if (overIndex === -1 || activeIndex === -1) {\n return null;\n }\n\n const active = items[activeIndex];\n\n const { rowsBeforeSlot, previous, next } = (() => {\n if (side) {\n const withoutActive = items.filter((item) => item.id !== activeId);\n const overPos = withoutActive.findIndex((item) => item.id === overId);\n const insertPos = side === 'before' ? overPos : overPos + 1;\n\n return {\n rowsBeforeSlot: withoutActive.slice(0, insertPos),\n previous: withoutActive[insertPos - 1],\n next: withoutActive[insertPos],\n };\n }\n\n const reordered = arrayMove(items, activeIndex, overIndex);\n\n return {\n rowsBeforeSlot: reordered.slice(0, overIndex),\n previous: reordered[overIndex - 1],\n next: reordered[overIndex + 1],\n };\n })();\n\n const dragDepth = Math.round(offsetX / INDENT_WIDTH);\n const projectedDepth = active.depth + dragDepth;\n\n const minDepth = next ? next.depth : 0;\n\n let maxDepth: number;\n if (!previous) {\n maxDepth = 0;\n } else if (previous.node.type === 'folder' && !previous.collapsed) {\n maxDepth = previous.depth + 1;\n } else {\n maxDepth = previous.depth;\n }\n\n if (active.node.type === 'folder') {\n const folderCeiling = MAX_FOLDER_DEPTH - subtreeFolderHeight(active.node);\n maxDepth = Math.min(maxDepth, folderCeiling);\n }\n\n if (maxDepth < minDepth) {\n return null;\n }\n const depth = clamp(projectedDepth, minDepth, maxDepth);\n\n const parentId = ((): string | null => {\n if (depth === 0 || !previous) {\n return null;\n }\n\n if (depth === previous.depth) {\n return previous.parentId;\n }\n\n if (depth > previous.depth) {\n return previous.node.type === 'folder' ? previous.node.id : previous.parentId;\n }\n\n const ancestor = [...rowsBeforeSlot].reverse().find((item) => item.depth === depth);\n\n return ancestor ? ancestor.parentId : null;\n })();\n\n let index = 0;\n\n for (const item of rowsBeforeSlot) {\n if (item.parentId !== parentId || item.depth !== depth) {\n continue;\n }\n\n if (parentId === null && item.node.type !== 'folder') {\n continue;\n }\n\n index += 1;\n }\n\n const line: DropLine | null = (() => {\n if (next) {\n return { anchorId: next.id, edge: 'top' };\n }\n\n if (previous) {\n return { anchorId: previous.id, edge: 'bottom' };\n }\n\n return null;\n })();\n\n /** For the time being, root content types have no stored order, so trying to move something there is not a real re-order operation. */\n const insertingAmongRootContentTypes =\n parentId === null &&\n next !== undefined &&\n next.node.type === 'contentType' &&\n next.parentId === null;\n\n if (!ROOT_CONTENT_TYPE_REORDER && insertingAmongRootContentTypes) {\n return getDropTargetSectionRoot(items, activeId);\n }\n\n return { parentId, index, depth, line };\n}\n\nfunction getDropTargetFolderSibling(\n items: FlatItem[],\n activeId: string,\n folderId: string,\n side: 'before' | 'after'\n): InsertTarget | null {\n const folderIndex = items.findIndex((item) => item.id === folderId);\n const active = items.find((item) => item.id === activeId);\n\n if (folderIndex === -1 || !active) {\n return null;\n }\n\n const folder = items[folderIndex];\n const { parentId, depth } = folder;\n\n if (\n active.node.type === 'folder' &&\n depth + subtreeFolderHeight(active.node) > MAX_FOLDER_DEPTH\n ) {\n return null;\n }\n\n const boundary = side === 'before' ? folderIndex : folderIndex + 1;\n let index = 0;\n\n for (let i = 0; i < boundary; i += 1) {\n const item = items[i];\n\n if (item.id === activeId) {\n continue;\n }\n\n if (item.parentId !== parentId || item.depth !== depth) {\n continue;\n }\n\n if (parentId === null && item.node.type !== 'folder') {\n continue;\n }\n\n index += 1;\n }\n\n const line: DropLine = (() => {\n if (side === 'before') {\n return { anchorId: folder.id, edge: 'top' };\n }\n\n let lastIndex = folderIndex;\n\n for (let i = folderIndex + 1; i < items.length; i += 1) {\n if (items[i].depth <= depth) {\n break;\n }\n\n lastIndex = i;\n }\n\n return { anchorId: items[lastIndex].id, edge: 'bottom' };\n })();\n\n return { parentId, index, depth, line };\n}\n\ntype DragState = {\n activeId: string;\n overId: string;\n offsetX: number;\n pointer?: { x: number; y: number };\n overRect?: { top: number; height: number };\n};\n\n/**\n * This resolved the destination for a drag-and-drop operation in the contentStructure tree. It takes into account the active item being dragged, the item it is being dropped over, the horizontal offset of the drag, and optionally which side of the target item the drop is intended for.\n * It returns a DropTarget object that describes where the active item should be placed in relation to its siblings and parent in the tree structure.\n *\n * When the dragged row is over a non-folder row, the drop target is always a sibling of that row (and its destination is based on which half of the row the pointer is over).\n *\n * When the dragged row is over a folder row, the drop target can be either a sibling of that folder (if the pointer is over the top or bottom third of the row) or a child of that folder (if the pointer is over the middle third of the row).\n * If the folder is collapsed, dropping into it will expand it and place the active row inside it.\n *\n * If the destination is nested such that the destination could be one of several depths, the depth is determined by the horizontal offset of the pointer.\n *\n * This allows for a user to position a row at the end of a folder, even if there are several expanded folders above the destination. Otherwise, this would be a multi-step operation.\n *\n */\nexport function resolveDropTarget(items: FlatItem[], dragState: DragState): DropTarget | null {\n const { activeId, overId, offsetX, pointer, overRect } = dragState;\n\n if (overId === activeId) {\n return null;\n }\n\n const itemHoveredByCursor = items.find((item) => item.id === overId);\n\n // If item is valid FoldeRNode\n if (itemHoveredByCursor && itemHoveredByCursor.node.type === 'folder' && pointer && overRect) {\n const folderNode = itemHoveredByCursor.node;\n\n const nextItem = items[items.indexOf(itemHoveredByCursor) + 1];\n const hasVisibleChildren = nextItem != null && nextItem.depth > itemHoveredByCursor.depth;\n\n // Determine which zone of the folder row the pointer is in (top, middle, bottom).\n const zone = calculateFolderDropZone({\n itemBoundingBox: overRect,\n pointerY: pointer.y,\n hasVisibleChildren,\n });\n\n if (zone === 'nest') {\n const activeNode = items.find(({ id }) => id === activeId)?.node;\n const nestIsValid =\n activeNode == null ||\n activeNode.type !== 'folder' ||\n canNestFolderAt(activeNode, folderNode);\n\n if (!nestIsValid) {\n return null;\n }\n\n return { kind: 'nest', folderId: folderNode.id, depth: itemHoveredByCursor.depth + 1 };\n }\n\n const sibling = getDropTargetFolderSibling(items, activeId, overId, zone);\n if (sibling) {\n return { kind: 'insert', ...sibling };\n }\n }\n\n const side = (() => {\n if (!pointer || !overRect) {\n return undefined;\n }\n\n return pointer.y < overRect.top + overRect.height / 2 ? 'before' : 'after';\n })();\n\n const insert = getDropTargetBetweenRows(items, activeId, overId, offsetX, side);\n\n return insert ? { kind: 'insert', ...insert } : null;\n}\n\nexport type FolderDropZone = 'before' | 'nest' | 'after';\n\n/**\n * Configuration for the folder drop zones.\n *\n * There are three zones and several possible behaviors:\n * 1. The top zone of the folder row (\"beore\"). This drops the the dragged row above the folder row.\n * 2. The bottom zone of the folder row (\"after\"). This drops the dragged row below the folder row.\n * If the folder is expanded:\n * 3. The middle zone of the folder row (\"nest\"). This drops the dragged row inside the folder row.\n * If the folder is collapsed:\n * 3A. The middle zone of the folder row (\"nest\"). This drops the dragged row inside the folder row.\n * 3B. If the folder is held over the middle zone for a certain amount of time, the folder will expand and the dragged row can be dropped inside the folder row.\n */\n\nconst NEST_ZONE_BOTTOM = 0.8;\nconst NEST_ZONE_TOP = 0.2;\n\ntype CalculateFolderDropZoneProps = {\n itemBoundingBox: { top: number; height: number };\n hasVisibleChildren: boolean;\n pointerY: number;\n};\n\nexport function calculateFolderDropZone({\n hasVisibleChildren,\n itemBoundingBox,\n pointerY,\n}: CalculateFolderDropZoneProps): FolderDropZone {\n if (pointerY < itemBoundingBox.top + itemBoundingBox.height * NEST_ZONE_TOP) {\n return 'before';\n }\n\n if (\n !hasVisibleChildren &&\n pointerY > itemBoundingBox.top + itemBoundingBox.height * NEST_ZONE_BOTTOM\n ) {\n return 'after';\n }\n\n return 'nest';\n}\n"],"names":["INDENT_WIDTH","clamp","value","min","max","Math","getDropTargetSectionRoot","items","activeId","rootItems","filter","item","depth","id","lastRootLeaf","reverse","find","node","type","firstRootFolder","line","anchorId","edge","parentId","index","getDropTargetBetweenRows","overId","offsetX","side","activeIndex","findIndex","overIndex","active","rowsBeforeSlot","previous","next","withoutActive","overPos","insertPos","slice","reordered","arrayMove","dragDepth","round","projectedDepth","minDepth","maxDepth","collapsed","folderCeiling","MAX_FOLDER_DEPTH","subtreeFolderHeight","ancestor","insertingAmongRootContentTypes","undefined","getDropTargetFolderSibling","folderId","folderIndex","folder","boundary","i","lastIndex","length","resolveDropTarget","dragState","pointer","overRect","itemHoveredByCursor","folderNode","nextItem","indexOf","hasVisibleChildren","zone","calculateFolderDropZone","itemBoundingBox","pointerY","y","activeNode","nestIsValid","canNestFolderAt","kind","sibling","top","height","insert","NEST_ZONE_BOTTOM","NEST_ZONE_TOP"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dropProjection.mjs","sources":["../../../../../admin/src/components/ContentTypeBuilderNav/lib/dropProjection.ts"],"sourcesContent":["import { arrayMove } from '@dnd-kit/sortable';\n\nimport { MAX_FOLDER_DEPTH } from '../../DataManager/utils/contentStructure';\n\nimport { canNestFolderAt, subtreeFolderHeight } from './buildFolderTree';\n\nimport type { FlatItem } from './flatModel';\n\nexport const INDENT_WIDTH = 24; // theme.spaces[6]\n\n/**\n * Temporary flag to disable root content-type reordering.\n */\nconst ROOT_CONTENT_TYPE_REORDER = false;\n\nconst clamp = (value: number, min: number, max: number) => {\n return Math.min(Math.max(value, min), max);\n};\n\nexport type DropLine = {\n edge: 'top' | 'bottom';\n anchorId: string;\n};\n\nexport type InsertTarget = {\n parentId: string | null;\n line: DropLine | null;\n index: number;\n depth: number;\n};\n\nexport type DropTarget =\n { kind: 'nest'; folderId: string; depth: number } | ({ kind: 'insert' } & InsertTarget);\n\n/**\n * Locates the position for the line indicator given that root-level re-ordering is currently\n * not possible. This is temporary measure until root-level re-ordering is implemented.\n */\nfunction getDropTargetSectionRoot(items: FlatItem[], activeId: string): InsertTarget {\n const rootItems = items.filter((item) => item.depth === 0 && item.id !== activeId);\n\n const lastRootLeaf = [...rootItems].reverse().find((item) => item.node.type === 'contentType');\n const firstRootFolder = rootItems.find((item) => item.node.type === 'folder');\n\n const line: DropLine | null = (() => {\n if (firstRootFolder) {\n return { anchorId: firstRootFolder.id, edge: 'top' };\n }\n\n if (lastRootLeaf) {\n return { anchorId: lastRootLeaf.id, edge: 'bottom' };\n }\n\n return null;\n })();\n\n return { parentId: null, index: 0, depth: 0, line };\n}\n\nfunction getDropTargetBetweenRows(\n items: FlatItem[],\n activeId: string,\n overId: string,\n offsetX: number,\n side?: 'before' | 'after'\n): InsertTarget | null {\n const activeIndex = items.findIndex((item) => item.id === activeId);\n const overIndex = items.findIndex((item) => item.id === overId);\n\n if (overIndex === -1 || activeIndex === -1) {\n return null;\n }\n\n const active = items[activeIndex];\n\n const { rowsBeforeSlot, previous, next } = (() => {\n if (side) {\n const withoutActive = items.filter((item) => item.id !== activeId);\n const overPos = withoutActive.findIndex((item) => item.id === overId);\n const insertPos = side === 'before' ? overPos : overPos + 1;\n\n return {\n rowsBeforeSlot: withoutActive.slice(0, insertPos),\n previous: withoutActive[insertPos - 1],\n next: withoutActive[insertPos],\n };\n }\n\n const reordered = arrayMove(items, activeIndex, overIndex);\n\n return {\n rowsBeforeSlot: reordered.slice(0, overIndex),\n previous: reordered[overIndex - 1],\n next: reordered[overIndex + 1],\n };\n })();\n\n const dragDepth = Math.round(offsetX / INDENT_WIDTH);\n const projectedDepth = active.depth + dragDepth;\n\n const minDepth = next ? next.depth : 0;\n\n let maxDepth: number;\n if (!previous) {\n maxDepth = 0;\n } else if (previous.node.type === 'folder' && !previous.collapsed) {\n maxDepth = previous.depth + 1;\n } else {\n maxDepth = previous.depth;\n }\n\n if (active.node.type === 'folder') {\n const folderCeiling = MAX_FOLDER_DEPTH - subtreeFolderHeight(active.node);\n maxDepth = Math.min(maxDepth, folderCeiling);\n }\n\n if (maxDepth < minDepth) {\n return null;\n }\n const depth = clamp(projectedDepth, minDepth, maxDepth);\n\n const parentId = ((): string | null => {\n if (depth === 0 || !previous) {\n return null;\n }\n\n if (depth === previous.depth) {\n return previous.parentId;\n }\n\n if (depth > previous.depth) {\n return previous.node.type === 'folder' ? previous.node.id : previous.parentId;\n }\n\n const ancestor = [...rowsBeforeSlot].reverse().find((item) => item.depth === depth);\n\n return ancestor ? ancestor.parentId : null;\n })();\n\n let index = 0;\n\n for (const item of rowsBeforeSlot) {\n if (item.parentId !== parentId || item.depth !== depth) {\n continue;\n }\n\n if (parentId === null && item.node.type !== 'folder') {\n continue;\n }\n\n index += 1;\n }\n\n const line: DropLine | null = (() => {\n if (next) {\n return { anchorId: next.id, edge: 'top' };\n }\n\n if (previous) {\n return { anchorId: previous.id, edge: 'bottom' };\n }\n\n return null;\n })();\n\n /** For the time being, root content types have no stored order, so trying to move something there is not a real re-order operation. */\n const insertingAmongRootContentTypes =\n parentId === null &&\n next !== undefined &&\n next.node.type === 'contentType' &&\n next.parentId === null;\n\n if (!ROOT_CONTENT_TYPE_REORDER && insertingAmongRootContentTypes) {\n return getDropTargetSectionRoot(items, activeId);\n }\n\n return { parentId, index, depth, line };\n}\n\nfunction getDropTargetFolderSibling(\n items: FlatItem[],\n activeId: string,\n folderId: string,\n side: 'before' | 'after'\n): InsertTarget | null {\n const folderIndex = items.findIndex((item) => item.id === folderId);\n const active = items.find((item) => item.id === activeId);\n\n if (folderIndex === -1 || !active) {\n return null;\n }\n\n const folder = items[folderIndex];\n const { parentId, depth } = folder;\n\n if (\n active.node.type === 'folder' &&\n depth + subtreeFolderHeight(active.node) > MAX_FOLDER_DEPTH\n ) {\n return null;\n }\n\n const boundary = side === 'before' ? folderIndex : folderIndex + 1;\n let index = 0;\n\n for (let i = 0; i < boundary; i += 1) {\n const item = items[i];\n\n if (item.id === activeId) {\n continue;\n }\n\n if (item.parentId !== parentId || item.depth !== depth) {\n continue;\n }\n\n if (parentId === null && item.node.type !== 'folder') {\n continue;\n }\n\n index += 1;\n }\n\n const line: DropLine = (() => {\n if (side === 'before') {\n return { anchorId: folder.id, edge: 'top' };\n }\n\n let lastIndex = folderIndex;\n\n for (let i = folderIndex + 1; i < items.length; i += 1) {\n if (items[i].depth <= depth) {\n break;\n }\n\n lastIndex = i;\n }\n\n return { anchorId: items[lastIndex].id, edge: 'bottom' };\n })();\n\n return { parentId, index, depth, line };\n}\n\ntype DragState = {\n activeId: string;\n overId: string;\n offsetX: number;\n pointer?: { x: number; y: number };\n overRect?: { top: number; height: number };\n};\n\n/**\n * This resolved the destination for a drag-and-drop operation in the contentStructure tree. It takes into account the active item being dragged, the item it is being dropped over, the horizontal offset of the drag, and optionally which side of the target item the drop is intended for.\n * It returns a DropTarget object that describes where the active item should be placed in relation to its siblings and parent in the tree structure.\n *\n * When the dragged row is over a non-folder row, the drop target is always a sibling of that row (and its destination is based on which half of the row the pointer is over).\n *\n * When the dragged row is over a folder row, the drop target can be either a sibling of that folder (if the pointer is over the top or bottom third of the row) or a child of that folder (if the pointer is over the middle third of the row).\n * If the folder is collapsed, dropping into it will expand it and place the active row inside it.\n *\n * If the destination is nested such that the destination could be one of several depths, the depth is determined by the horizontal offset of the pointer.\n *\n * This allows for a user to position a row at the end of a folder, even if there are several expanded folders above the destination. Otherwise, this would be a multi-step operation.\n *\n */\nexport function resolveDropTarget(items: FlatItem[], dragState: DragState): DropTarget | null {\n const { activeId, overId, offsetX, pointer, overRect } = dragState;\n\n if (overId === activeId) {\n return null;\n }\n\n const itemHoveredByCursor = items.find((item) => item.id === overId);\n\n // If item is valid FoldeRNode\n if (itemHoveredByCursor && itemHoveredByCursor.node.type === 'folder' && pointer && overRect) {\n const folderNode = itemHoveredByCursor.node;\n\n const nextItem = items[items.indexOf(itemHoveredByCursor) + 1];\n const hasVisibleChildren = nextItem != null && nextItem.depth > itemHoveredByCursor.depth;\n\n // Determine which zone of the folder row the pointer is in (top, middle, bottom).\n const zone = calculateFolderDropZone({\n itemBoundingBox: overRect,\n pointerY: pointer.y,\n hasVisibleChildren,\n });\n\n if (zone === 'nest') {\n const activeNode = items.find(({ id }) => id === activeId)?.node;\n const nestIsValid =\n activeNode == null ||\n activeNode.type !== 'folder' ||\n canNestFolderAt(activeNode, folderNode);\n\n if (!nestIsValid) {\n return null;\n }\n\n return { kind: 'nest', folderId: folderNode.id, depth: itemHoveredByCursor.depth + 1 };\n }\n\n const sibling = getDropTargetFolderSibling(items, activeId, overId, zone);\n if (sibling) {\n return { kind: 'insert', ...sibling };\n }\n }\n\n const side = (() => {\n if (!pointer || !overRect) {\n return undefined;\n }\n\n return pointer.y < overRect.top + overRect.height / 2 ? 'before' : 'after';\n })();\n\n const insert = getDropTargetBetweenRows(items, activeId, overId, offsetX, side);\n\n return insert ? { kind: 'insert', ...insert } : null;\n}\n\nexport type FolderDropZone = 'before' | 'nest' | 'after';\n\n/**\n * Configuration for the folder drop zones.\n *\n * There are three zones and several possible behaviors:\n * 1. The top zone of the folder row (\"beore\"). This drops the the dragged row above the folder row.\n * 2. The bottom zone of the folder row (\"after\"). This drops the dragged row below the folder row.\n * If the folder is expanded:\n * 3. The middle zone of the folder row (\"nest\"). This drops the dragged row inside the folder row.\n * If the folder is collapsed:\n * 3A. The middle zone of the folder row (\"nest\"). This drops the dragged row inside the folder row.\n * 3B. If the folder is held over the middle zone for a certain amount of time, the folder will expand and the dragged row can be dropped inside the folder row.\n */\n\nconst NEST_ZONE_BOTTOM = 0.8;\nconst NEST_ZONE_TOP = 0.2;\n\ntype CalculateFolderDropZoneProps = {\n itemBoundingBox: { top: number; height: number };\n hasVisibleChildren: boolean;\n pointerY: number;\n};\n\nexport function calculateFolderDropZone({\n hasVisibleChildren,\n itemBoundingBox,\n pointerY,\n}: CalculateFolderDropZoneProps): FolderDropZone {\n if (pointerY < itemBoundingBox.top + itemBoundingBox.height * NEST_ZONE_TOP) {\n return 'before';\n }\n\n if (\n !hasVisibleChildren &&\n pointerY > itemBoundingBox.top + itemBoundingBox.height * NEST_ZONE_BOTTOM\n ) {\n return 'after';\n }\n\n return 'nest';\n}\n"],"names":["INDENT_WIDTH","clamp","value","min","max","Math","getDropTargetSectionRoot","items","activeId","rootItems","filter","item","depth","id","lastRootLeaf","reverse","find","node","type","firstRootFolder","line","anchorId","edge","parentId","index","getDropTargetBetweenRows","overId","offsetX","side","activeIndex","findIndex","overIndex","active","rowsBeforeSlot","previous","next","withoutActive","overPos","insertPos","slice","reordered","arrayMove","dragDepth","round","projectedDepth","minDepth","maxDepth","collapsed","folderCeiling","MAX_FOLDER_DEPTH","subtreeFolderHeight","ancestor","insertingAmongRootContentTypes","undefined","getDropTargetFolderSibling","folderId","folderIndex","folder","boundary","i","lastIndex","length","resolveDropTarget","dragState","pointer","overRect","itemHoveredByCursor","folderNode","nextItem","indexOf","hasVisibleChildren","zone","calculateFolderDropZone","itemBoundingBox","pointerY","y","activeNode","nestIsValid","canNestFolderAt","kind","sibling","top","height","insert","NEST_ZONE_BOTTOM","NEST_ZONE_TOP"],"mappings":"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"}
|
|
@@ -5,7 +5,8 @@ var designSystem = require('@strapi/design-system');
|
|
|
5
5
|
var reactIntl = require('react-intl');
|
|
6
6
|
var Styles = require('./Styles.js');
|
|
7
7
|
|
|
8
|
-
const
|
|
8
|
+
const EMPTY_RADIOS = [];
|
|
9
|
+
const CustomRadioGroup = ({ intlLabel, name, onChange, radios = EMPTY_RADIOS, value })=>{
|
|
9
10
|
const { formatMessage } = reactIntl.useIntl();
|
|
10
11
|
return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
11
12
|
direction: "column",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomRadioGroup.js","sources":["../../../../admin/src/components/CustomRadioGroup/CustomRadioGroup.tsx"],"sourcesContent":["import type { ChangeEventHandler } from 'react';\n\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { Wrapper } from './Styles';\n\nimport type { IntlLabel } from '../../types';\n\ninterface Radio {\n title: IntlLabel;\n description: IntlLabel;\n value: string | boolean;\n}\n\ninterface CustomRadioGroupProps {\n intlLabel: IntlLabel;\n name: string;\n onChange: ChangeEventHandler<HTMLInputElement>;\n radios?: Radio[];\n value?: string | boolean;\n}\n\nexport const CustomRadioGroup = ({\n intlLabel,\n name,\n onChange,\n radios =
|
|
1
|
+
{"version":3,"file":"CustomRadioGroup.js","sources":["../../../../admin/src/components/CustomRadioGroup/CustomRadioGroup.tsx"],"sourcesContent":["import type { ChangeEventHandler } from 'react';\n\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { Wrapper } from './Styles';\n\nimport type { IntlLabel } from '../../types';\n\nconst EMPTY_RADIOS: NonNullable<CustomRadioGroupProps['radios']> = [];\n\ninterface Radio {\n title: IntlLabel;\n description: IntlLabel;\n value: string | boolean;\n}\n\ninterface CustomRadioGroupProps {\n intlLabel: IntlLabel;\n name: string;\n onChange: ChangeEventHandler<HTMLInputElement>;\n radios?: Radio[];\n value?: string | boolean;\n}\n\nexport const CustomRadioGroup = ({\n intlLabel,\n name,\n onChange,\n radios = EMPTY_RADIOS,\n value,\n}: CustomRadioGroupProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral800\" htmlFor={name} tag=\"label\">\n {formatMessage(intlLabel)}\n </Typography>\n <Wrapper gap={4} alignItems=\"stretch\">\n {radios.map((radio) => {\n const radioValue = radio.value.toString();\n\n return (\n <label htmlFor={radioValue} key={radioValue} className=\"container\">\n <input\n id={radioValue}\n name={name}\n className=\"option-input\"\n checked={radio.value === value}\n value={radioValue}\n key={radioValue}\n onChange={onChange}\n type=\"radio\"\n />\n <Box className=\"option\" padding={4}>\n <Flex>\n <Box paddingRight={4}>\n <span className=\"checkmark\" />\n </Box>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Typography fontWeight=\"bold\">{formatMessage(radio.title)}</Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(radio.description)}\n </Typography>\n </Flex>\n </Flex>\n </Box>\n </label>\n );\n })}\n </Wrapper>\n </Flex>\n );\n};\n"],"names":["EMPTY_RADIOS","CustomRadioGroup","intlLabel","name","onChange","radios","value","formatMessage","useIntl","_jsxs","Flex","direction","alignItems","gap","_jsx","Typography","variant","fontWeight","textColor","htmlFor","tag","Wrapper","map","radio","radioValue","toString","label","className","input","id","checked","type","Box","padding","paddingRight","span","title","description"],"mappings":";;;;;;;AASA,MAAMA,eAA6D,EAAE;AAgB9D,MAAMC,gBAAAA,GAAmB,CAAC,EAC/BC,SAAS,EACTC,IAAI,EACJC,QAAQ,EACRC,MAAAA,GAASL,YAAY,EACrBM,KAAK,EACiB,GAAA;IACtB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAE1B,IAAA,qBACEC,eAAA,CAACC,iBAAAA,EAAAA;QAAKC,SAAAA,EAAU,QAAA;QAASC,UAAAA,EAAW,SAAA;QAAUC,GAAAA,EAAK,CAAA;;0BACjDC,cAAA,CAACC,uBAAAA,EAAAA;gBAAWC,OAAAA,EAAQ,IAAA;gBAAKC,UAAAA,EAAW,MAAA;gBAAOC,SAAAA,EAAU,YAAA;gBAAaC,OAAAA,EAAShB,IAAAA;gBAAMiB,GAAAA,EAAI,OAAA;0BAClFb,aAAAA,CAAcL,SAAAA;;0BAEjBY,cAAA,CAACO,cAAAA,EAAAA;gBAAQR,GAAAA,EAAK,CAAA;gBAAGD,UAAAA,EAAW,SAAA;0BACzBP,MAAAA,CAAOiB,GAAG,CAAC,CAACC,KAAAA,GAAAA;AACX,oBAAA,MAAMC,UAAAA,GAAaD,KAAAA,CAAMjB,KAAK,CAACmB,QAAQ,EAAA;AAEvC,oBAAA,qBACEhB,eAAA,CAACiB,OAAAA,EAAAA;wBAAMP,OAAAA,EAASK,UAAAA;wBAA6BG,SAAAA,EAAU,WAAA;;0CACrDb,cAAA,CAACc,OAAAA,EAAAA;gCACCC,EAAAA,EAAIL,UAAAA;gCACJrB,IAAAA,EAAMA,IAAAA;gCACNwB,SAAAA,EAAU,cAAA;gCACVG,OAAAA,EAASP,KAAAA,CAAMjB,KAAK,KAAKA,KAAAA;gCACzBA,KAAAA,EAAOkB,UAAAA;gCAEPpB,QAAAA,EAAUA,QAAAA;gCACV2B,IAAAA,EAAK;AAFAP,6BAAAA,EAAAA,UAAAA,CAAAA;0CAIPV,cAAA,CAACkB,gBAAAA,EAAAA;gCAAIL,SAAAA,EAAU,QAAA;gCAASM,OAAAA,EAAS,CAAA;AAC/B,gCAAA,QAAA,gBAAAxB,eAAA,CAACC,iBAAAA,EAAAA;;sDACCI,cAAA,CAACkB,gBAAAA,EAAAA;4CAAIE,YAAAA,EAAc,CAAA;AACjB,4CAAA,QAAA,gBAAApB,cAAA,CAACqB,MAAAA,EAAAA;gDAAKR,SAAAA,EAAU;;;sDAElBlB,eAAA,CAACC,iBAAAA,EAAAA;4CAAKC,SAAAA,EAAU,QAAA;4CAASC,UAAAA,EAAW,SAAA;4CAAUC,GAAAA,EAAK,CAAA;;8DACjDC,cAAA,CAACC,uBAAAA,EAAAA;oDAAWE,UAAAA,EAAW,MAAA;AAAQV,oDAAAA,QAAAA,EAAAA,aAAAA,CAAcgB,MAAMa,KAAK;;8DACxDtB,cAAA,CAACC,uBAAAA,EAAAA;oDAAWC,OAAAA,EAAQ,IAAA;oDAAKE,SAAAA,EAAU,YAAA;AAChCX,oDAAAA,QAAAA,EAAAA,aAAAA,CAAcgB,MAAMc,WAAW;;;;;;;;AAnBTb,qBAAAA,EAAAA,UAAAA,CAAAA;AA0BrC,gBAAA,CAAA;;;;AAIR;;;;"}
|
|
@@ -3,7 +3,8 @@ import { Flex, Typography, Box } from '@strapi/design-system';
|
|
|
3
3
|
import { useIntl } from 'react-intl';
|
|
4
4
|
import { Wrapper } from './Styles.mjs';
|
|
5
5
|
|
|
6
|
-
const
|
|
6
|
+
const EMPTY_RADIOS = [];
|
|
7
|
+
const CustomRadioGroup = ({ intlLabel, name, onChange, radios = EMPTY_RADIOS, value })=>{
|
|
7
8
|
const { formatMessage } = useIntl();
|
|
8
9
|
return /*#__PURE__*/ jsxs(Flex, {
|
|
9
10
|
direction: "column",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomRadioGroup.mjs","sources":["../../../../admin/src/components/CustomRadioGroup/CustomRadioGroup.tsx"],"sourcesContent":["import type { ChangeEventHandler } from 'react';\n\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { Wrapper } from './Styles';\n\nimport type { IntlLabel } from '../../types';\n\ninterface Radio {\n title: IntlLabel;\n description: IntlLabel;\n value: string | boolean;\n}\n\ninterface CustomRadioGroupProps {\n intlLabel: IntlLabel;\n name: string;\n onChange: ChangeEventHandler<HTMLInputElement>;\n radios?: Radio[];\n value?: string | boolean;\n}\n\nexport const CustomRadioGroup = ({\n intlLabel,\n name,\n onChange,\n radios =
|
|
1
|
+
{"version":3,"file":"CustomRadioGroup.mjs","sources":["../../../../admin/src/components/CustomRadioGroup/CustomRadioGroup.tsx"],"sourcesContent":["import type { ChangeEventHandler } from 'react';\n\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { Wrapper } from './Styles';\n\nimport type { IntlLabel } from '../../types';\n\nconst EMPTY_RADIOS: NonNullable<CustomRadioGroupProps['radios']> = [];\n\ninterface Radio {\n title: IntlLabel;\n description: IntlLabel;\n value: string | boolean;\n}\n\ninterface CustomRadioGroupProps {\n intlLabel: IntlLabel;\n name: string;\n onChange: ChangeEventHandler<HTMLInputElement>;\n radios?: Radio[];\n value?: string | boolean;\n}\n\nexport const CustomRadioGroup = ({\n intlLabel,\n name,\n onChange,\n radios = EMPTY_RADIOS,\n value,\n}: CustomRadioGroupProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral800\" htmlFor={name} tag=\"label\">\n {formatMessage(intlLabel)}\n </Typography>\n <Wrapper gap={4} alignItems=\"stretch\">\n {radios.map((radio) => {\n const radioValue = radio.value.toString();\n\n return (\n <label htmlFor={radioValue} key={radioValue} className=\"container\">\n <input\n id={radioValue}\n name={name}\n className=\"option-input\"\n checked={radio.value === value}\n value={radioValue}\n key={radioValue}\n onChange={onChange}\n type=\"radio\"\n />\n <Box className=\"option\" padding={4}>\n <Flex>\n <Box paddingRight={4}>\n <span className=\"checkmark\" />\n </Box>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Typography fontWeight=\"bold\">{formatMessage(radio.title)}</Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(radio.description)}\n </Typography>\n </Flex>\n </Flex>\n </Box>\n </label>\n );\n })}\n </Wrapper>\n </Flex>\n );\n};\n"],"names":["EMPTY_RADIOS","CustomRadioGroup","intlLabel","name","onChange","radios","value","formatMessage","useIntl","_jsxs","Flex","direction","alignItems","gap","_jsx","Typography","variant","fontWeight","textColor","htmlFor","tag","Wrapper","map","radio","radioValue","toString","label","className","input","id","checked","type","Box","padding","paddingRight","span","title","description"],"mappings":";;;;;AASA,MAAMA,eAA6D,EAAE;AAgB9D,MAAMC,gBAAAA,GAAmB,CAAC,EAC/BC,SAAS,EACTC,IAAI,EACJC,QAAQ,EACRC,MAAAA,GAASL,YAAY,EACrBM,KAAK,EACiB,GAAA;IACtB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAE1B,IAAA,qBACEC,IAAA,CAACC,IAAAA,EAAAA;QAAKC,SAAAA,EAAU,QAAA;QAASC,UAAAA,EAAW,SAAA;QAAUC,GAAAA,EAAK,CAAA;;0BACjDC,GAAA,CAACC,UAAAA,EAAAA;gBAAWC,OAAAA,EAAQ,IAAA;gBAAKC,UAAAA,EAAW,MAAA;gBAAOC,SAAAA,EAAU,YAAA;gBAAaC,OAAAA,EAAShB,IAAAA;gBAAMiB,GAAAA,EAAI,OAAA;0BAClFb,aAAAA,CAAcL,SAAAA;;0BAEjBY,GAAA,CAACO,OAAAA,EAAAA;gBAAQR,GAAAA,EAAK,CAAA;gBAAGD,UAAAA,EAAW,SAAA;0BACzBP,MAAAA,CAAOiB,GAAG,CAAC,CAACC,KAAAA,GAAAA;AACX,oBAAA,MAAMC,UAAAA,GAAaD,KAAAA,CAAMjB,KAAK,CAACmB,QAAQ,EAAA;AAEvC,oBAAA,qBACEhB,IAAA,CAACiB,OAAAA,EAAAA;wBAAMP,OAAAA,EAASK,UAAAA;wBAA6BG,SAAAA,EAAU,WAAA;;0CACrDb,GAAA,CAACc,OAAAA,EAAAA;gCACCC,EAAAA,EAAIL,UAAAA;gCACJrB,IAAAA,EAAMA,IAAAA;gCACNwB,SAAAA,EAAU,cAAA;gCACVG,OAAAA,EAASP,KAAAA,CAAMjB,KAAK,KAAKA,KAAAA;gCACzBA,KAAAA,EAAOkB,UAAAA;gCAEPpB,QAAAA,EAAUA,QAAAA;gCACV2B,IAAAA,EAAK;AAFAP,6BAAAA,EAAAA,UAAAA,CAAAA;0CAIPV,GAAA,CAACkB,GAAAA,EAAAA;gCAAIL,SAAAA,EAAU,QAAA;gCAASM,OAAAA,EAAS,CAAA;AAC/B,gCAAA,QAAA,gBAAAxB,IAAA,CAACC,IAAAA,EAAAA;;sDACCI,GAAA,CAACkB,GAAAA,EAAAA;4CAAIE,YAAAA,EAAc,CAAA;AACjB,4CAAA,QAAA,gBAAApB,GAAA,CAACqB,MAAAA,EAAAA;gDAAKR,SAAAA,EAAU;;;sDAElBlB,IAAA,CAACC,IAAAA,EAAAA;4CAAKC,SAAAA,EAAU,QAAA;4CAASC,UAAAA,EAAW,SAAA;4CAAUC,GAAAA,EAAK,CAAA;;8DACjDC,GAAA,CAACC,UAAAA,EAAAA;oDAAWE,UAAAA,EAAW,MAAA;AAAQV,oDAAAA,QAAAA,EAAAA,aAAAA,CAAcgB,MAAMa,KAAK;;8DACxDtB,GAAA,CAACC,UAAAA,EAAAA;oDAAWC,OAAAA,EAAQ,IAAA;oDAAKE,SAAAA,EAAU,YAAA;AAChCX,oDAAAA,QAAAA,EAAAA,aAAAA,CAAcgB,MAAMc,WAAW;;;;;;;;AAnBTb,qBAAAA,EAAAA,UAAAA,CAAAA;AA0BrC,gBAAA,CAAA;;;;AAIR;;;;"}
|