@payloadcms/ui 3.80.0-internal.21e9c47 → 3.80.0-internal.52ab774
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/elements/ClipboardAction/mergeFormStateFromClipboard.d.ts.map +1 -1
- package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.js +53 -3
- package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.js.map +1 -1
- package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.spec.js +541 -0
- package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.spec.js.map +1 -0
- package/dist/elements/Combobox/index.d.ts.map +1 -1
- package/dist/elements/Combobox/index.js +1 -0
- package/dist/elements/Combobox/index.js.map +1 -1
- package/dist/elements/Hierarchy/ColumnBrowser/Column/index.d.ts.map +1 -0
- package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/Column/index.js +5 -5
- package/dist/elements/Hierarchy/ColumnBrowser/Column/index.js.map +1 -0
- package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/Column/index.scss +1 -1
- package/dist/elements/Hierarchy/ColumnBrowser/ColumnItem/index.d.ts.map +1 -0
- package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/ColumnItem/index.js +3 -3
- package/dist/elements/Hierarchy/ColumnBrowser/ColumnItem/index.js.map +1 -0
- package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/ColumnItem/index.scss +1 -1
- package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/index.d.ts +1 -1
- package/dist/elements/Hierarchy/ColumnBrowser/index.d.ts.map +1 -0
- package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/index.js +13 -10
- package/dist/elements/Hierarchy/ColumnBrowser/index.js.map +1 -0
- package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/types.d.ts +3 -0
- package/dist/elements/Hierarchy/ColumnBrowser/types.d.ts.map +1 -0
- package/dist/elements/Hierarchy/ColumnBrowser/types.js.map +1 -0
- package/dist/elements/Hierarchy/DocHeaderButton/index.d.ts.map +1 -0
- package/dist/elements/{HierarchyButton → Hierarchy/DocHeaderButton}/index.js +6 -6
- package/dist/elements/Hierarchy/DocHeaderButton/index.js.map +1 -0
- package/dist/elements/Hierarchy/DocHeaderButton/index.server.d.ts.map +1 -0
- package/dist/elements/{HierarchyButton → Hierarchy/DocHeaderButton}/index.server.js +3 -3
- package/dist/elements/Hierarchy/DocHeaderButton/index.server.js.map +1 -0
- package/dist/elements/Hierarchy/Drawer/fetchAncestorPath.d.ts.map +1 -0
- package/dist/elements/Hierarchy/Drawer/fetchAncestorPath.js.map +1 -0
- package/dist/elements/{HierarchyDrawer → Hierarchy}/Drawer/index.d.ts +3 -3
- package/dist/elements/Hierarchy/Drawer/index.d.ts.map +1 -0
- package/dist/elements/{HierarchyDrawer → Hierarchy}/Drawer/index.js +4 -2
- package/dist/elements/Hierarchy/Drawer/index.js.map +1 -0
- package/dist/elements/{HierarchyDrawer → Hierarchy/Drawer}/types.d.ts +4 -1
- package/dist/elements/Hierarchy/Drawer/types.d.ts.map +1 -0
- package/dist/elements/Hierarchy/Drawer/types.js.map +1 -0
- package/dist/elements/{HierarchyDrawer/index.d.ts → Hierarchy/Drawer/useHierarchyDrawer.d.ts} +1 -1
- package/dist/elements/Hierarchy/Drawer/useHierarchyDrawer.d.ts.map +1 -0
- package/dist/elements/{HierarchyDrawer/index.js → Hierarchy/Drawer/useHierarchyDrawer.js} +10 -8
- package/dist/elements/Hierarchy/Drawer/useHierarchyDrawer.js.map +1 -0
- package/dist/elements/Hierarchy/Field/SelectedHierarchies.d.ts.map +1 -0
- package/dist/elements/{HierarchyField → Hierarchy/Field}/SelectedHierarchies.js +7 -16
- package/dist/elements/Hierarchy/Field/SelectedHierarchies.js.map +1 -0
- package/dist/elements/{HierarchyField → Hierarchy/Field}/SelectedHierarchies.scss +1 -1
- package/dist/elements/Hierarchy/Field/index.client.d.ts.map +1 -0
- package/dist/elements/{HierarchyField → Hierarchy/Field}/index.client.js +17 -29
- package/dist/elements/Hierarchy/Field/index.client.js.map +1 -0
- package/dist/elements/{HierarchyField → Hierarchy/Field}/index.scss +1 -1
- package/dist/elements/Hierarchy/Field/index.server.d.ts.map +1 -0
- package/dist/elements/{HierarchyField → Hierarchy/Field}/index.server.js +2 -2
- package/dist/elements/Hierarchy/Field/index.server.js.map +1 -0
- package/dist/elements/Hierarchy/HydrateProvider/index.d.ts +4 -0
- package/dist/elements/Hierarchy/HydrateProvider/index.d.ts.map +1 -0
- package/dist/elements/Hierarchy/HydrateProvider/index.js +70 -0
- package/dist/elements/Hierarchy/HydrateProvider/index.js.map +1 -0
- package/dist/elements/{MoveMany → Hierarchy/MoveMany}/index.d.ts +3 -3
- package/dist/elements/Hierarchy/MoveMany/index.d.ts.map +1 -0
- package/dist/elements/{MoveMany → Hierarchy/MoveMany}/index.js +10 -10
- package/dist/elements/Hierarchy/MoveMany/index.js.map +1 -0
- package/dist/elements/{MoveMany → Hierarchy/MoveMany}/index.scss +1 -1
- package/dist/elements/Hierarchy/Search/HierarchySearchInput.d.ts.map +1 -0
- package/dist/elements/{HierarchySearch → Hierarchy/Search}/HierarchySearchInput.js +5 -5
- package/dist/elements/Hierarchy/Search/HierarchySearchInput.js.map +1 -0
- package/dist/elements/Hierarchy/Search/HierarchySearchResultItem.d.ts.map +1 -0
- package/dist/elements/Hierarchy/Search/HierarchySearchResultItem.js.map +1 -0
- package/dist/elements/Hierarchy/Search/HierarchySearchResults.d.ts.map +1 -0
- package/dist/elements/{HierarchySearch → Hierarchy/Search}/HierarchySearchResults.js +2 -2
- package/dist/elements/Hierarchy/Search/HierarchySearchResults.js.map +1 -0
- package/dist/elements/Hierarchy/Search/index.d.ts.map +1 -0
- package/dist/elements/{HierarchySearch → Hierarchy/Search}/index.js +2 -2
- package/dist/elements/Hierarchy/Search/index.js.map +1 -0
- package/dist/elements/{HierarchySearch → Hierarchy/Search}/index.scss +1 -1
- package/dist/elements/Hierarchy/Search/types.d.ts.map +1 -0
- package/dist/elements/Hierarchy/Search/types.js.map +1 -0
- package/dist/elements/Hierarchy/Search/useHierarchySearch.d.ts.map +1 -0
- package/dist/elements/{HierarchySearch → Hierarchy/Search}/useHierarchySearch.js +2 -2
- package/dist/elements/Hierarchy/Search/useHierarchySearch.js.map +1 -0
- package/dist/elements/{HierarchyTree → Hierarchy/Tree}/HierarchySidebarTab.d.ts +1 -0
- package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.d.ts.map +1 -0
- package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.js +194 -0
- package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.js.map +1 -0
- package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.server.d.ts.map +1 -0
- package/dist/elements/{HierarchyTree → Hierarchy/Tree}/HierarchySidebarTab.server.js +20 -10
- package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.server.js.map +1 -0
- package/dist/elements/Hierarchy/Tree/LoadMore/LoadMoreButton.d.ts.map +1 -0
- package/dist/elements/{Tree → Hierarchy/Tree}/LoadMore/LoadMoreButton.js +1 -1
- package/dist/elements/Hierarchy/Tree/LoadMore/LoadMoreButton.js.map +1 -0
- package/dist/elements/Hierarchy/Tree/LoadMore/index.d.ts.map +1 -0
- package/dist/elements/{Tree → Hierarchy/Tree}/LoadMore/index.js +1 -1
- package/dist/elements/Hierarchy/Tree/LoadMore/index.js.map +1 -0
- package/dist/elements/Hierarchy/Tree/TreeConnector.d.ts.map +1 -0
- package/dist/elements/Hierarchy/Tree/TreeConnector.js.map +1 -0
- package/dist/elements/Hierarchy/Tree/TreeFocusContext.d.ts.map +1 -0
- package/dist/elements/Hierarchy/Tree/TreeFocusContext.js.map +1 -0
- package/dist/elements/Hierarchy/Tree/TreeNode/index.d.ts +5 -0
- package/dist/elements/Hierarchy/Tree/TreeNode/index.d.ts.map +1 -0
- package/dist/elements/{Tree → Hierarchy/Tree}/TreeNode/index.js +11 -4
- package/dist/elements/Hierarchy/Tree/TreeNode/index.js.map +1 -0
- package/dist/elements/{Tree → Hierarchy/Tree}/TreeNode/index.scss +1 -1
- package/dist/elements/{HierarchyTree → Hierarchy/Tree}/index.d.ts +1 -0
- package/dist/elements/Hierarchy/Tree/index.d.ts.map +1 -0
- package/dist/elements/Hierarchy/Tree/index.js +305 -0
- package/dist/elements/Hierarchy/Tree/index.js.map +1 -0
- package/dist/elements/{Tree → Hierarchy/Tree}/index.scss +2 -5
- package/dist/elements/{Tree → Hierarchy/Tree}/types.d.ts +31 -22
- package/dist/elements/Hierarchy/Tree/types.d.ts.map +1 -0
- package/dist/elements/Hierarchy/Tree/types.js.map +1 -0
- package/dist/elements/Hierarchy/Tree/useChildren.d.ts +32 -0
- package/dist/elements/Hierarchy/Tree/useChildren.d.ts.map +1 -0
- package/dist/elements/{Tree → Hierarchy/Tree}/useChildren.js +52 -32
- package/dist/elements/Hierarchy/Tree/useChildren.js.map +1 -0
- package/dist/elements/Link/index.d.ts.map +1 -1
- package/dist/elements/LoadMoreRow/index.js +1 -1
- package/dist/elements/LoadMoreRow/index.js.map +1 -1
- package/dist/elements/PublishButton/index.d.ts.map +1 -1
- package/dist/elements/PublishButton/index.js +3 -1
- package/dist/elements/PublishButton/index.js.map +1 -1
- package/dist/elements/RelationshipTable/index.d.ts.map +1 -1
- package/dist/elements/RelationshipTable/index.js +14 -9
- package/dist/elements/RelationshipTable/index.js.map +1 -1
- package/dist/elements/Table/DefaultCell/fields/Hierarchy/index.js +1 -1
- package/dist/elements/Table/DefaultCell/fields/Hierarchy/index.js.map +1 -1
- package/dist/elements/Toasts/fieldErrors.d.ts +4 -0
- package/dist/elements/Toasts/fieldErrors.d.ts.map +1 -1
- package/dist/elements/Toasts/fieldErrors.js +4 -2
- package/dist/elements/Toasts/fieldErrors.js.map +1 -1
- package/dist/elements/Toasts/fieldErrors.spec.js +46 -0
- package/dist/elements/Toasts/fieldErrors.spec.js.map +1 -0
- package/dist/elements/WhereBuilder/Condition/Relationship/index.d.ts.map +1 -1
- package/dist/elements/WhereBuilder/Condition/Relationship/index.js +8 -6
- package/dist/elements/WhereBuilder/Condition/Relationship/index.js.map +1 -1
- package/dist/elements/WhereBuilder/field-types.d.ts.map +1 -1
- package/dist/elements/WhereBuilder/field-types.js +2 -5
- package/dist/elements/WhereBuilder/field-types.js.map +1 -1
- package/dist/exports/client/{DatePicker-CL2EGBVQ.js → DatePicker-T2DMDMM5.js} +2 -2
- package/dist/exports/client/chunk-WDZJLNNB.js +29 -0
- package/dist/exports/client/{chunk-SH42NW5R.js.map → chunk-WDZJLNNB.js.map} +4 -4
- package/dist/exports/client/index.d.ts +11 -15
- package/dist/exports/client/index.d.ts.map +1 -1
- package/dist/exports/client/index.js +26 -26
- package/dist/exports/client/index.js.map +4 -4
- package/dist/exports/rsc/index.d.ts +3 -3
- package/dist/exports/rsc/index.d.ts.map +1 -1
- package/dist/exports/rsc/index.js +3 -3
- package/dist/exports/rsc/index.js.map +1 -1
- package/dist/forms/Form/mergeServerFormState.d.ts.map +1 -1
- package/dist/forms/Form/mergeServerFormState.js +101 -24
- package/dist/forms/Form/mergeServerFormState.js.map +1 -1
- package/dist/icons/TableView/index.d.ts +3 -0
- package/dist/icons/TableView/index.d.ts.map +1 -0
- package/dist/icons/TableView/index.js +16 -0
- package/dist/icons/TableView/index.js.map +1 -0
- package/dist/providers/Hierarchy/index.d.ts.map +1 -1
- package/dist/providers/Hierarchy/index.js +29 -8
- package/dist/providers/Hierarchy/index.js.map +1 -1
- package/dist/providers/Hierarchy/types.d.ts +10 -5
- package/dist/providers/Hierarchy/types.d.ts.map +1 -1
- package/dist/providers/Hierarchy/types.js.map +1 -1
- package/dist/providers/SidebarTabs/index.d.ts +19 -0
- package/dist/providers/SidebarTabs/index.d.ts.map +1 -0
- package/dist/providers/SidebarTabs/index.js +24 -0
- package/dist/providers/SidebarTabs/index.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/views/Edit/index.d.ts.map +1 -1
- package/dist/views/Edit/index.js +12 -3
- package/dist/views/Edit/index.js.map +1 -1
- package/dist/views/HierarchyList/DocumentListSelection/index.d.ts.map +1 -1
- package/dist/views/HierarchyList/DocumentListSelection/index.js +147 -86
- package/dist/views/HierarchyList/DocumentListSelection/index.js.map +1 -1
- package/dist/views/HierarchyList/HierarchyListHeader/index.js +7 -6
- package/dist/views/HierarchyList/HierarchyListHeader/index.js.map +1 -1
- package/dist/views/HierarchyList/HierarchyTable/index.d.ts +7 -3
- package/dist/views/HierarchyList/HierarchyTable/index.d.ts.map +1 -1
- package/dist/views/HierarchyList/HierarchyTable/index.js +19 -18
- package/dist/views/HierarchyList/HierarchyTable/index.js.map +1 -1
- package/dist/views/HierarchyList/index.d.ts.map +1 -1
- package/dist/views/HierarchyList/index.js +3 -1
- package/dist/views/HierarchyList/index.js.map +1 -1
- package/package.json +4 -4
- package/dist/elements/HierarchyButton/index.d.ts.map +0 -1
- package/dist/elements/HierarchyButton/index.js.map +0 -1
- package/dist/elements/HierarchyButton/index.server.d.ts.map +0 -1
- package/dist/elements/HierarchyButton/index.server.js.map +0 -1
- package/dist/elements/HierarchyColumnBrowser/Column/index.d.ts.map +0 -1
- package/dist/elements/HierarchyColumnBrowser/Column/index.js.map +0 -1
- package/dist/elements/HierarchyColumnBrowser/ColumnItem/index.d.ts.map +0 -1
- package/dist/elements/HierarchyColumnBrowser/ColumnItem/index.js.map +0 -1
- package/dist/elements/HierarchyColumnBrowser/index.d.ts.map +0 -1
- package/dist/elements/HierarchyColumnBrowser/index.js.map +0 -1
- package/dist/elements/HierarchyColumnBrowser/types.d.ts.map +0 -1
- package/dist/elements/HierarchyColumnBrowser/types.js.map +0 -1
- package/dist/elements/HierarchyDrawer/Drawer/index.d.ts.map +0 -1
- package/dist/elements/HierarchyDrawer/Drawer/index.js.map +0 -1
- package/dist/elements/HierarchyDrawer/fetchAncestorPath.d.ts.map +0 -1
- package/dist/elements/HierarchyDrawer/fetchAncestorPath.js.map +0 -1
- package/dist/elements/HierarchyDrawer/index.d.ts.map +0 -1
- package/dist/elements/HierarchyDrawer/index.js.map +0 -1
- package/dist/elements/HierarchyDrawer/types.d.ts.map +0 -1
- package/dist/elements/HierarchyDrawer/types.js.map +0 -1
- package/dist/elements/HierarchyField/SelectedHierarchies.d.ts.map +0 -1
- package/dist/elements/HierarchyField/SelectedHierarchies.js.map +0 -1
- package/dist/elements/HierarchyField/index.client.d.ts.map +0 -1
- package/dist/elements/HierarchyField/index.client.js.map +0 -1
- package/dist/elements/HierarchyField/index.server.d.ts.map +0 -1
- package/dist/elements/HierarchyField/index.server.js.map +0 -1
- package/dist/elements/HierarchySearch/HierarchySearchInput.d.ts.map +0 -1
- package/dist/elements/HierarchySearch/HierarchySearchInput.js.map +0 -1
- package/dist/elements/HierarchySearch/HierarchySearchResultItem.d.ts.map +0 -1
- package/dist/elements/HierarchySearch/HierarchySearchResultItem.js.map +0 -1
- package/dist/elements/HierarchySearch/HierarchySearchResults.d.ts.map +0 -1
- package/dist/elements/HierarchySearch/HierarchySearchResults.js.map +0 -1
- package/dist/elements/HierarchySearch/index.d.ts.map +0 -1
- package/dist/elements/HierarchySearch/index.js.map +0 -1
- package/dist/elements/HierarchySearch/types.d.ts.map +0 -1
- package/dist/elements/HierarchySearch/types.js.map +0 -1
- package/dist/elements/HierarchySearch/useHierarchySearch.d.ts.map +0 -1
- package/dist/elements/HierarchySearch/useHierarchySearch.js.map +0 -1
- package/dist/elements/HierarchyTree/HierarchySidebarTab.d.ts.map +0 -1
- package/dist/elements/HierarchyTree/HierarchySidebarTab.js +0 -156
- package/dist/elements/HierarchyTree/HierarchySidebarTab.js.map +0 -1
- package/dist/elements/HierarchyTree/HierarchySidebarTab.server.d.ts.map +0 -1
- package/dist/elements/HierarchyTree/HierarchySidebarTab.server.js.map +0 -1
- package/dist/elements/HierarchyTree/LoadMore/LoadMoreButton.d.ts.map +0 -1
- package/dist/elements/HierarchyTree/LoadMore/LoadMoreButton.js +0 -36
- package/dist/elements/HierarchyTree/LoadMore/LoadMoreButton.js.map +0 -1
- package/dist/elements/HierarchyTree/LoadMore/index.d.ts.map +0 -1
- package/dist/elements/HierarchyTree/LoadMore/index.js +0 -29
- package/dist/elements/HierarchyTree/LoadMore/index.js.map +0 -1
- package/dist/elements/HierarchyTree/LoadMore/index.scss +0 -26
- package/dist/elements/HierarchyTree/TreeConnector.d.ts.map +0 -1
- package/dist/elements/HierarchyTree/TreeConnector.js.map +0 -1
- package/dist/elements/HierarchyTree/TreeFocusContext.d.ts.map +0 -1
- package/dist/elements/HierarchyTree/TreeFocusContext.js.map +0 -1
- package/dist/elements/HierarchyTree/TreeNode/index.d.ts +0 -5
- package/dist/elements/HierarchyTree/TreeNode/index.d.ts.map +0 -1
- package/dist/elements/HierarchyTree/TreeNode/index.js +0 -201
- package/dist/elements/HierarchyTree/TreeNode/index.js.map +0 -1
- package/dist/elements/HierarchyTree/TreeNode/index.scss +0 -99
- package/dist/elements/HierarchyTree/index.d.ts.map +0 -1
- package/dist/elements/HierarchyTree/index.js +0 -64
- package/dist/elements/HierarchyTree/index.js.map +0 -1
- package/dist/elements/HierarchyTree/index.scss +0 -42
- package/dist/elements/HierarchyTree/types.d.ts +0 -55
- package/dist/elements/HierarchyTree/types.d.ts.map +0 -1
- package/dist/elements/HierarchyTree/types.js.map +0 -1
- package/dist/elements/HierarchyTree/useChildren.d.ts +0 -26
- package/dist/elements/HierarchyTree/useChildren.d.ts.map +0 -1
- package/dist/elements/HierarchyTree/useChildren.js +0 -150
- package/dist/elements/HierarchyTree/useChildren.js.map +0 -1
- package/dist/elements/HierarchyTree/useTreeState.d.ts +0 -9
- package/dist/elements/HierarchyTree/useTreeState.d.ts.map +0 -1
- package/dist/elements/HierarchyTree/useTreeState.js +0 -50
- package/dist/elements/HierarchyTree/useTreeState.js.map +0 -1
- package/dist/elements/HydrateHierarchyProvider/index.d.ts +0 -4
- package/dist/elements/HydrateHierarchyProvider/index.d.ts.map +0 -1
- package/dist/elements/HydrateHierarchyProvider/index.js +0 -67
- package/dist/elements/HydrateHierarchyProvider/index.js.map +0 -1
- package/dist/elements/MoveMany/index.d.ts.map +0 -1
- package/dist/elements/MoveMany/index.js.map +0 -1
- package/dist/elements/Tree/LoadMore/LoadMoreButton.d.ts +0 -8
- package/dist/elements/Tree/LoadMore/LoadMoreButton.d.ts.map +0 -1
- package/dist/elements/Tree/LoadMore/LoadMoreButton.js.map +0 -1
- package/dist/elements/Tree/LoadMore/index.d.ts +0 -12
- package/dist/elements/Tree/LoadMore/index.d.ts.map +0 -1
- package/dist/elements/Tree/LoadMore/index.js.map +0 -1
- package/dist/elements/Tree/TreeConnector.d.ts +0 -7
- package/dist/elements/Tree/TreeConnector.d.ts.map +0 -1
- package/dist/elements/Tree/TreeConnector.js +0 -23
- package/dist/elements/Tree/TreeConnector.js.map +0 -1
- package/dist/elements/Tree/TreeFocusContext.d.ts +0 -28
- package/dist/elements/Tree/TreeFocusContext.d.ts.map +0 -1
- package/dist/elements/Tree/TreeFocusContext.js +0 -140
- package/dist/elements/Tree/TreeFocusContext.js.map +0 -1
- package/dist/elements/Tree/TreeNode/index.d.ts +0 -5
- package/dist/elements/Tree/TreeNode/index.d.ts.map +0 -1
- package/dist/elements/Tree/TreeNode/index.js.map +0 -1
- package/dist/elements/Tree/index.d.ts +0 -5
- package/dist/elements/Tree/index.d.ts.map +0 -1
- package/dist/elements/Tree/index.js +0 -258
- package/dist/elements/Tree/index.js.map +0 -1
- package/dist/elements/Tree/types.d.ts.map +0 -1
- package/dist/elements/Tree/types.js +0 -2
- package/dist/elements/Tree/types.js.map +0 -1
- package/dist/elements/Tree/useChildren.d.ts +0 -25
- package/dist/elements/Tree/useChildren.d.ts.map +0 -1
- package/dist/elements/Tree/useChildren.js.map +0 -1
- package/dist/exports/client/chunk-SH42NW5R.js +0 -29
- /package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/Column/index.d.ts +0 -0
- /package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/ColumnItem/index.d.ts +0 -0
- /package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/index.scss +0 -0
- /package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/types.js +0 -0
- /package/dist/elements/{HierarchyButton → Hierarchy/DocHeaderButton}/index.d.ts +0 -0
- /package/dist/elements/{HierarchyButton → Hierarchy/DocHeaderButton}/index.scss +0 -0
- /package/dist/elements/{HierarchyButton → Hierarchy/DocHeaderButton}/index.server.d.ts +0 -0
- /package/dist/elements/{HierarchyDrawer → Hierarchy/Drawer}/fetchAncestorPath.d.ts +0 -0
- /package/dist/elements/{HierarchyDrawer → Hierarchy/Drawer}/fetchAncestorPath.js +0 -0
- /package/dist/elements/{HierarchyDrawer → Hierarchy}/Drawer/index.scss +0 -0
- /package/dist/elements/{HierarchyDrawer → Hierarchy/Drawer}/types.js +0 -0
- /package/dist/elements/{HierarchyField → Hierarchy/Field}/SelectedHierarchies.d.ts +0 -0
- /package/dist/elements/{HierarchyField → Hierarchy/Field}/index.client.d.ts +0 -0
- /package/dist/elements/{HierarchyField → Hierarchy/Field}/index.server.d.ts +0 -0
- /package/dist/elements/{HierarchySearch → Hierarchy/Search}/HierarchySearchInput.d.ts +0 -0
- /package/dist/elements/{HierarchySearch → Hierarchy/Search}/HierarchySearchResultItem.d.ts +0 -0
- /package/dist/elements/{HierarchySearch → Hierarchy/Search}/HierarchySearchResultItem.js +0 -0
- /package/dist/elements/{HierarchySearch → Hierarchy/Search}/HierarchySearchResults.d.ts +0 -0
- /package/dist/elements/{HierarchySearch → Hierarchy/Search}/index.d.ts +0 -0
- /package/dist/elements/{HierarchySearch → Hierarchy/Search}/types.d.ts +0 -0
- /package/dist/elements/{HierarchySearch → Hierarchy/Search}/types.js +0 -0
- /package/dist/elements/{HierarchySearch → Hierarchy/Search}/useHierarchySearch.d.ts +0 -0
- /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/HierarchySidebarTab.server.d.ts +0 -0
- /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/LoadMore/LoadMoreButton.d.ts +0 -0
- /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/LoadMore/index.d.ts +0 -0
- /package/dist/elements/{Tree → Hierarchy/Tree}/LoadMore/index.scss +0 -0
- /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/TreeConnector.d.ts +0 -0
- /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/TreeConnector.js +0 -0
- /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/TreeFocusContext.d.ts +0 -0
- /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/TreeFocusContext.js +0 -0
- /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/types.js +0 -0
- /package/dist/exports/client/{DatePicker-CL2EGBVQ.js.map → DatePicker-T2DMDMM5.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeFormStateFromClipboard.d.ts","sourceRoot":"","sources":["../../../src/elements/ClipboardAction/mergeFormStateFromClipboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"mergeFormStateFromClipboard.d.ts","sourceRoot":"","sources":["../../../src/elements/ClipboardAction/mergeFormStateFromClipboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAIpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAIpD,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,SAAS,EAAE,SAAS,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,8BAyBA;AAED,wBAAgB,2BAA2B,CAAC,EAC1C,iBAAiB,EAAE,aAAa,EAChC,SAAS,EACT,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,iBAAiB,EAAE,kBAAkB,CAAA;IACrC,SAAS,EAAE,SAAS,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,aA0IA"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import ObjectIdImport from 'bson-objectid';
|
|
2
|
+
const ObjectId = 'default' in ObjectIdImport ? ObjectIdImport.default : ObjectIdImport;
|
|
1
3
|
export function reduceFormStateByPath({
|
|
2
4
|
formState,
|
|
3
5
|
path,
|
|
@@ -64,7 +66,7 @@ export function mergeFormStateFromClipboard({
|
|
|
64
66
|
}
|
|
65
67
|
if (fromRowToField) {
|
|
66
68
|
const lastRenderedPath = `${path}.0`;
|
|
67
|
-
const rowIDFromClipboard = dataFromClipboard[`${pathToReplace}.id`]
|
|
69
|
+
const rowIDFromClipboard = dataFromClipboard[`${pathToReplace}.id`]?.value;
|
|
68
70
|
const hasRows = formState[path].rows?.length;
|
|
69
71
|
formState[path].rows = [{
|
|
70
72
|
...(hasRows && isArray ? formState[path].rows[0] : {}),
|
|
@@ -81,20 +83,68 @@ export function mergeFormStateFromClipboard({
|
|
|
81
83
|
}
|
|
82
84
|
}
|
|
83
85
|
}
|
|
86
|
+
// Map to track old IDs to new IDs for regenerating nested IDs
|
|
87
|
+
const idReplacements = new Map();
|
|
84
88
|
for (const clipboardPath in dataFromClipboard) {
|
|
85
|
-
//
|
|
86
|
-
|
|
89
|
+
// When pasting into a specific row, skip only the direct row ID to avoid overwriting
|
|
90
|
+
// the target row's identity. Nested IDs (array item IDs within the block) should
|
|
91
|
+
// still be processed so they get regenerated below, preventing server-side duplication.
|
|
92
|
+
if (!pasteIntoField && clipboardPath === `${pathToReplace}.id` || !clipboardPath.startsWith(pathToReplace)) {
|
|
87
93
|
continue;
|
|
88
94
|
}
|
|
89
95
|
const newPath = clipboardPath.replace(pathToReplace, targetSegment);
|
|
90
96
|
const customComponents = isArray ? formState[newPath]?.customComponents : undefined;
|
|
91
97
|
const validate = isArray ? formState[newPath]?.validate : undefined;
|
|
98
|
+
// If this is an ID field, generate a new ID to prevent duplicates
|
|
99
|
+
if (clipboardPath.endsWith('.id') && dataFromClipboard[clipboardPath]?.value) {
|
|
100
|
+
const oldID = dataFromClipboard[clipboardPath].value;
|
|
101
|
+
if (typeof oldID === 'string' && ObjectId.isValid(oldID)) {
|
|
102
|
+
const newID = new ObjectId().toHexString();
|
|
103
|
+
idReplacements.set(clipboardPath, newID);
|
|
104
|
+
formState[newPath] = {
|
|
105
|
+
customComponents,
|
|
106
|
+
validate,
|
|
107
|
+
...dataFromClipboard[clipboardPath],
|
|
108
|
+
initialValue: newID,
|
|
109
|
+
value: newID
|
|
110
|
+
};
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
92
114
|
formState[newPath] = {
|
|
93
115
|
customComponents,
|
|
94
116
|
validate,
|
|
95
117
|
...dataFromClipboard[clipboardPath]
|
|
96
118
|
};
|
|
97
119
|
}
|
|
120
|
+
// Update parent field rows with new IDs
|
|
121
|
+
for (const [clipboardPath, newID] of idReplacements) {
|
|
122
|
+
const relativePath = clipboardPath.replace(`${pathToReplace}.`, '');
|
|
123
|
+
const segments = relativePath.split('.');
|
|
124
|
+
if (segments.length >= 2) {
|
|
125
|
+
const rowIndex = parseInt(segments[segments.length - 2], 10);
|
|
126
|
+
const parentFieldPath = segments.slice(0, segments.length - 2).join('.');
|
|
127
|
+
const fullParentPath = parentFieldPath ? `${targetSegment}.${parentFieldPath}` : targetSegment;
|
|
128
|
+
if (formState[fullParentPath] && Array.isArray(formState[fullParentPath].rows)) {
|
|
129
|
+
const parentRows = formState[fullParentPath].rows;
|
|
130
|
+
if (!isNaN(rowIndex) && parentRows[rowIndex]) {
|
|
131
|
+
parentRows[rowIndex].id = newID;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
} else if (segments.length === 1 && segments[0] === 'id') {
|
|
135
|
+
// Top-level block ID - extract field path and row index from targetSegment
|
|
136
|
+
const targetParts = targetSegment.split('.');
|
|
137
|
+
const lastPart = targetParts[targetParts.length - 1];
|
|
138
|
+
const rowIndexFromTarget = !isNaN(parseInt(lastPart, 10)) ? parseInt(lastPart, 10) : 0;
|
|
139
|
+
const fieldPath = !isNaN(parseInt(lastPart, 10)) ? targetParts.slice(0, -1).join('.') : targetSegment;
|
|
140
|
+
if (formState[fieldPath] && Array.isArray(formState[fieldPath].rows)) {
|
|
141
|
+
const rows = formState[fieldPath].rows;
|
|
142
|
+
if (rows[rowIndexFromTarget]) {
|
|
143
|
+
rows[rowIndexFromTarget].id = newID;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
98
148
|
return formState;
|
|
99
149
|
}
|
|
100
150
|
//# sourceMappingURL=mergeFormStateFromClipboard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeFormStateFromClipboard.js","names":["reduceFormStateByPath","formState","path","rowIndex","filteredState","prefix","key","startsWith","customComponents","_","validate","__","field","Array","isArray","rows","map","row","serializableRow","mergeFormStateFromClipboard","dataFromClipboard","clipboardData","type","typeFromClipboard","data","pathFromClipboard","rowIndexFromClipboard","copyFromField","pasteIntoField","fromRowToField","pathToReplace","targetSegment","lastRenderedPath","rowIDFromClipboard","value","hasRows","length","id","isLoading","initialValue","disableFormData","fieldPath","clipboardPath","endsWith","newPath","replace","undefined"],"sources":["../../../src/elements/ClipboardAction/mergeFormStateFromClipboard.ts"],"sourcesContent":["import type { FieldState, FormState } from 'payload'\n\nimport type { ClipboardPasteData } from './types.js'\n\nexport function reduceFormStateByPath({\n formState,\n path,\n rowIndex,\n}: {\n formState: FormState\n path: string\n rowIndex?: number\n}) {\n const filteredState: Record<string, FieldState> = {}\n const prefix = typeof rowIndex !== 'number' ? path : `${path}.${rowIndex}`\n\n for (const key in formState) {\n if (!key.startsWith(prefix)) {\n continue\n }\n\n const { customComponents: _, validate: __, ...field } = formState[key]\n\n if (Array.isArray(field.rows)) {\n field.rows = field.rows.map((row) => {\n if (!row || typeof row !== 'object') {\n return row\n }\n const { customComponents: _, ...serializableRow } = row\n return serializableRow\n })\n }\n\n filteredState[key] = field\n }\n\n return filteredState\n}\n\nexport function mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path,\n rowIndex,\n}: {\n dataFromClipboard: ClipboardPasteData\n formState: FormState\n path: string\n rowIndex?: number\n}) {\n const {\n type: typeFromClipboard,\n data: dataFromClipboard,\n path: pathFromClipboard,\n rowIndex: rowIndexFromClipboard,\n } = clipboardData\n\n const copyFromField = typeof rowIndexFromClipboard !== 'number'\n const pasteIntoField = typeof rowIndex !== 'number'\n const fromRowToField = !copyFromField && pasteIntoField\n const isArray = typeFromClipboard === 'array'\n\n let pathToReplace: string\n if (copyFromField && pasteIntoField) {\n pathToReplace = pathFromClipboard\n } else if (copyFromField) {\n pathToReplace = `${pathFromClipboard}.${rowIndex}`\n } else {\n pathToReplace = `${pathFromClipboard}.${rowIndexFromClipboard}`\n }\n\n let targetSegment: string\n if (!pasteIntoField) {\n targetSegment = `${path}.${rowIndex}`\n } else if (fromRowToField) {\n targetSegment = `${path}.0`\n } else {\n targetSegment = path\n }\n\n if (fromRowToField) {\n const lastRenderedPath = `${path}.0`\n const rowIDFromClipboard = dataFromClipboard[`${pathToReplace}.id`].value as string\n const hasRows = formState[path].rows?.length\n\n formState[path].rows = [\n {\n ...(hasRows && isArray ? formState[path].rows[0] : {}),\n id: rowIDFromClipboard,\n isLoading: false,\n lastRenderedPath,\n },\n ]\n formState[path].value = 1\n formState[path].initialValue = 1\n formState[path].disableFormData = true\n\n for (const fieldPath in formState) {\n if (\n fieldPath !== path &&\n !fieldPath.startsWith(lastRenderedPath) &&\n fieldPath.startsWith(path)\n ) {\n delete formState[fieldPath]\n }\n }\n }\n\n for (const clipboardPath in dataFromClipboard) {\n // Pasting a row id, skip overwriting\n if (\n (!pasteIntoField && clipboardPath.endsWith('.id')) ||\n !clipboardPath.startsWith(pathToReplace)\n ) {\n continue\n }\n\n const newPath = clipboardPath.replace(pathToReplace, targetSegment)\n\n const customComponents = isArray ? formState[newPath]?.customComponents : undefined\n const validate = isArray ? formState[newPath]?.validate : undefined\n\n formState[newPath] = {\n customComponents,\n validate,\n ...dataFromClipboard[clipboardPath],\n }\n }\n\n return formState\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"mergeFormStateFromClipboard.js","names":["ObjectIdImport","ObjectId","default","reduceFormStateByPath","formState","path","rowIndex","filteredState","prefix","key","startsWith","customComponents","_","validate","__","field","Array","isArray","rows","map","row","serializableRow","mergeFormStateFromClipboard","dataFromClipboard","clipboardData","type","typeFromClipboard","data","pathFromClipboard","rowIndexFromClipboard","copyFromField","pasteIntoField","fromRowToField","pathToReplace","targetSegment","lastRenderedPath","rowIDFromClipboard","value","hasRows","length","id","isLoading","initialValue","disableFormData","fieldPath","idReplacements","Map","clipboardPath","newPath","replace","undefined","endsWith","oldID","isValid","newID","toHexString","set","relativePath","segments","split","parseInt","parentFieldPath","slice","join","fullParentPath","parentRows","isNaN","targetParts","lastPart","rowIndexFromTarget"],"sources":["../../../src/elements/ClipboardAction/mergeFormStateFromClipboard.ts"],"sourcesContent":["import type { FieldState, FormState } from 'payload'\n\nimport ObjectIdImport from 'bson-objectid'\n\nimport type { ClipboardPasteData } from './types.js'\n\nconst ObjectId = 'default' in ObjectIdImport ? ObjectIdImport.default : ObjectIdImport\n\nexport function reduceFormStateByPath({\n formState,\n path,\n rowIndex,\n}: {\n formState: FormState\n path: string\n rowIndex?: number\n}) {\n const filteredState: Record<string, FieldState> = {}\n const prefix = typeof rowIndex !== 'number' ? path : `${path}.${rowIndex}`\n\n for (const key in formState) {\n if (!key.startsWith(prefix)) {\n continue\n }\n\n const { customComponents: _, validate: __, ...field } = formState[key]\n\n if (Array.isArray(field.rows)) {\n field.rows = field.rows.map((row) => {\n if (!row || typeof row !== 'object') {\n return row\n }\n const { customComponents: _, ...serializableRow } = row\n return serializableRow\n })\n }\n\n filteredState[key] = field\n }\n\n return filteredState\n}\n\nexport function mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path,\n rowIndex,\n}: {\n dataFromClipboard: ClipboardPasteData\n formState: FormState\n path: string\n rowIndex?: number\n}) {\n const {\n type: typeFromClipboard,\n data: dataFromClipboard,\n path: pathFromClipboard,\n rowIndex: rowIndexFromClipboard,\n } = clipboardData\n\n const copyFromField = typeof rowIndexFromClipboard !== 'number'\n const pasteIntoField = typeof rowIndex !== 'number'\n const fromRowToField = !copyFromField && pasteIntoField\n const isArray = typeFromClipboard === 'array'\n\n let pathToReplace: string\n if (copyFromField && pasteIntoField) {\n pathToReplace = pathFromClipboard\n } else if (copyFromField) {\n pathToReplace = `${pathFromClipboard}.${rowIndex}`\n } else {\n pathToReplace = `${pathFromClipboard}.${rowIndexFromClipboard}`\n }\n\n let targetSegment: string\n if (!pasteIntoField) {\n targetSegment = `${path}.${rowIndex}`\n } else if (fromRowToField) {\n targetSegment = `${path}.0`\n } else {\n targetSegment = path\n }\n\n if (fromRowToField) {\n const lastRenderedPath = `${path}.0`\n const rowIDFromClipboard = dataFromClipboard[`${pathToReplace}.id`]?.value as string\n const hasRows = formState[path].rows?.length\n\n formState[path].rows = [\n {\n ...(hasRows && isArray ? formState[path].rows[0] : {}),\n id: rowIDFromClipboard,\n isLoading: false,\n lastRenderedPath,\n },\n ]\n formState[path].value = 1\n formState[path].initialValue = 1\n formState[path].disableFormData = true\n\n for (const fieldPath in formState) {\n if (\n fieldPath !== path &&\n !fieldPath.startsWith(lastRenderedPath) &&\n fieldPath.startsWith(path)\n ) {\n delete formState[fieldPath]\n }\n }\n }\n\n // Map to track old IDs to new IDs for regenerating nested IDs\n const idReplacements: Map<string, string> = new Map()\n\n for (const clipboardPath in dataFromClipboard) {\n // When pasting into a specific row, skip only the direct row ID to avoid overwriting\n // the target row's identity. Nested IDs (array item IDs within the block) should\n // still be processed so they get regenerated below, preventing server-side duplication.\n if (\n (!pasteIntoField && clipboardPath === `${pathToReplace}.id`) ||\n !clipboardPath.startsWith(pathToReplace)\n ) {\n continue\n }\n\n const newPath = clipboardPath.replace(pathToReplace, targetSegment)\n\n const customComponents = isArray ? formState[newPath]?.customComponents : undefined\n const validate = isArray ? formState[newPath]?.validate : undefined\n\n // If this is an ID field, generate a new ID to prevent duplicates\n if (clipboardPath.endsWith('.id') && dataFromClipboard[clipboardPath]?.value) {\n const oldID = dataFromClipboard[clipboardPath].value as string\n if (typeof oldID === 'string' && ObjectId.isValid(oldID)) {\n const newID = new ObjectId().toHexString()\n idReplacements.set(clipboardPath, newID)\n\n formState[newPath] = {\n customComponents,\n validate,\n ...dataFromClipboard[clipboardPath],\n initialValue: newID,\n value: newID,\n }\n continue\n }\n }\n\n formState[newPath] = {\n customComponents,\n validate,\n ...dataFromClipboard[clipboardPath],\n }\n }\n\n // Update parent field rows with new IDs\n for (const [clipboardPath, newID] of idReplacements) {\n const relativePath = clipboardPath.replace(`${pathToReplace}.`, '')\n const segments = relativePath.split('.')\n\n if (segments.length >= 2) {\n const rowIndex = parseInt(segments[segments.length - 2], 10)\n const parentFieldPath = segments.slice(0, segments.length - 2).join('.')\n const fullParentPath = parentFieldPath ? `${targetSegment}.${parentFieldPath}` : targetSegment\n\n if (formState[fullParentPath] && Array.isArray(formState[fullParentPath].rows)) {\n const parentRows = formState[fullParentPath].rows\n if (!isNaN(rowIndex) && parentRows[rowIndex]) {\n parentRows[rowIndex].id = newID\n }\n }\n } else if (segments.length === 1 && segments[0] === 'id') {\n // Top-level block ID - extract field path and row index from targetSegment\n const targetParts = targetSegment.split('.')\n const lastPart = targetParts[targetParts.length - 1]\n const rowIndexFromTarget = !isNaN(parseInt(lastPart, 10)) ? parseInt(lastPart, 10) : 0\n const fieldPath = !isNaN(parseInt(lastPart, 10))\n ? targetParts.slice(0, -1).join('.')\n : targetSegment\n\n if (formState[fieldPath] && Array.isArray(formState[fieldPath].rows)) {\n const rows = formState[fieldPath].rows\n if (rows[rowIndexFromTarget]) {\n rows[rowIndexFromTarget].id = newID\n }\n }\n }\n }\n\n return formState\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
import ObjectIdImport from 'bson-objectid';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { mergeFormStateFromClipboard } from './mergeFormStateFromClipboard.js';
|
|
4
|
+
const ObjectId = 'default' in ObjectIdImport ? ObjectIdImport.default : ObjectIdImport;
|
|
5
|
+
describe('mergeFormStateFromClipboard', () => {
|
|
6
|
+
describe('block ID regeneration', () => {
|
|
7
|
+
it('should generate new IDs when pasting blocks to prevent duplicates', () => {
|
|
8
|
+
const copiedBlockID = new ObjectId().toHexString();
|
|
9
|
+
const formState = {
|
|
10
|
+
layout: {
|
|
11
|
+
valid: true,
|
|
12
|
+
value: 0,
|
|
13
|
+
initialValue: 0,
|
|
14
|
+
rows: []
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const clipboardData = {
|
|
18
|
+
type: 'blocks',
|
|
19
|
+
path: 'layout',
|
|
20
|
+
blocks: [],
|
|
21
|
+
data: {
|
|
22
|
+
'layout.0.id': {
|
|
23
|
+
value: copiedBlockID,
|
|
24
|
+
valid: true
|
|
25
|
+
},
|
|
26
|
+
'layout.0.blockType': {
|
|
27
|
+
value: 'content',
|
|
28
|
+
valid: true
|
|
29
|
+
},
|
|
30
|
+
'layout.0.text': {
|
|
31
|
+
value: 'test content',
|
|
32
|
+
valid: true
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
rowIndex: 0
|
|
36
|
+
};
|
|
37
|
+
const result = mergeFormStateFromClipboard({
|
|
38
|
+
dataFromClipboard: clipboardData,
|
|
39
|
+
formState,
|
|
40
|
+
path: 'layout'
|
|
41
|
+
});
|
|
42
|
+
// Check that a new ID was generated
|
|
43
|
+
expect(result['layout.0.id']).toBeDefined();
|
|
44
|
+
expect(result['layout.0.id'].value).toBeDefined();
|
|
45
|
+
expect(result['layout.0.id'].value).not.toEqual(copiedBlockID);
|
|
46
|
+
expect(ObjectId.isValid(result['layout.0.id'].value)).toBe(true);
|
|
47
|
+
// Check that the row metadata also has the new ID
|
|
48
|
+
expect(result.layout.rows).toHaveLength(1);
|
|
49
|
+
expect(result.layout.rows?.[0]?.id).not.toEqual(copiedBlockID);
|
|
50
|
+
expect(result.layout.rows?.[0]?.id).toEqual(result['layout.0.id'].value);
|
|
51
|
+
});
|
|
52
|
+
it('should generate new IDs for nested blocks', () => {
|
|
53
|
+
const copiedBlockID = new ObjectId().toHexString();
|
|
54
|
+
const copiedNestedBlockID = new ObjectId().toHexString();
|
|
55
|
+
const formState = {
|
|
56
|
+
layout: {
|
|
57
|
+
valid: true,
|
|
58
|
+
value: 0,
|
|
59
|
+
initialValue: 0,
|
|
60
|
+
rows: []
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const clipboardData = {
|
|
64
|
+
type: 'blocks',
|
|
65
|
+
path: 'layout',
|
|
66
|
+
blocks: [],
|
|
67
|
+
data: {
|
|
68
|
+
'layout.0.id': {
|
|
69
|
+
value: copiedBlockID,
|
|
70
|
+
valid: true
|
|
71
|
+
},
|
|
72
|
+
'layout.0.blockType': {
|
|
73
|
+
value: 'container',
|
|
74
|
+
valid: true
|
|
75
|
+
},
|
|
76
|
+
'layout.0.subBlocks': {
|
|
77
|
+
value: 1,
|
|
78
|
+
valid: true,
|
|
79
|
+
rows: [{
|
|
80
|
+
id: copiedNestedBlockID
|
|
81
|
+
}]
|
|
82
|
+
},
|
|
83
|
+
'layout.0.subBlocks.0.id': {
|
|
84
|
+
value: copiedNestedBlockID,
|
|
85
|
+
valid: true
|
|
86
|
+
},
|
|
87
|
+
'layout.0.subBlocks.0.blockType': {
|
|
88
|
+
value: 'content',
|
|
89
|
+
valid: true
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
rowIndex: 0
|
|
93
|
+
};
|
|
94
|
+
const result = mergeFormStateFromClipboard({
|
|
95
|
+
dataFromClipboard: clipboardData,
|
|
96
|
+
formState,
|
|
97
|
+
path: 'layout'
|
|
98
|
+
});
|
|
99
|
+
// Check that parent block got new ID
|
|
100
|
+
expect(result['layout.0.id'].value).not.toEqual(copiedBlockID);
|
|
101
|
+
expect(ObjectId.isValid(result['layout.0.id'].value)).toBe(true);
|
|
102
|
+
// Check that nested block got new ID
|
|
103
|
+
expect(result['layout.0.subBlocks.0.id'].value).not.toEqual(copiedNestedBlockID);
|
|
104
|
+
expect(ObjectId.isValid(result['layout.0.subBlocks.0.id'].value)).toBe(true);
|
|
105
|
+
// Check that parent and nested IDs are different
|
|
106
|
+
expect(result['layout.0.id'].value).not.toEqual(result['layout.0.subBlocks.0.id'].value);
|
|
107
|
+
// Check that parent row metadata has new ID
|
|
108
|
+
expect(result.layout.rows?.[0]?.id).toEqual(result['layout.0.id'].value);
|
|
109
|
+
// Check that nested row metadata has new ID
|
|
110
|
+
expect(result['layout.0.subBlocks'].rows?.[0]?.id).toEqual(result['layout.0.subBlocks.0.id'].value);
|
|
111
|
+
});
|
|
112
|
+
it('should preserve non-ID field values when pasting', () => {
|
|
113
|
+
const copiedBlockID = new ObjectId().toHexString();
|
|
114
|
+
const formState = {
|
|
115
|
+
layout: {
|
|
116
|
+
valid: true,
|
|
117
|
+
value: 0,
|
|
118
|
+
initialValue: 0,
|
|
119
|
+
rows: []
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
const clipboardData = {
|
|
123
|
+
type: 'blocks',
|
|
124
|
+
path: 'layout',
|
|
125
|
+
blocks: [],
|
|
126
|
+
data: {
|
|
127
|
+
'layout.0.id': {
|
|
128
|
+
value: copiedBlockID,
|
|
129
|
+
valid: true
|
|
130
|
+
},
|
|
131
|
+
'layout.0.blockType': {
|
|
132
|
+
value: 'content',
|
|
133
|
+
valid: true
|
|
134
|
+
},
|
|
135
|
+
'layout.0.text': {
|
|
136
|
+
value: 'preserved text content',
|
|
137
|
+
valid: true
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
rowIndex: 0
|
|
141
|
+
};
|
|
142
|
+
const result = mergeFormStateFromClipboard({
|
|
143
|
+
dataFromClipboard: clipboardData,
|
|
144
|
+
formState,
|
|
145
|
+
path: 'layout'
|
|
146
|
+
});
|
|
147
|
+
// Non-ID fields should be preserved
|
|
148
|
+
expect(result['layout.0.blockType'].value).toEqual('content');
|
|
149
|
+
expect(result['layout.0.text'].value).toEqual('preserved text content');
|
|
150
|
+
});
|
|
151
|
+
it('should generate new ID when pasting from row to field', () => {
|
|
152
|
+
const copiedBlockID = new ObjectId().toHexString();
|
|
153
|
+
const formState = {
|
|
154
|
+
duplicate: {
|
|
155
|
+
valid: true,
|
|
156
|
+
value: 0,
|
|
157
|
+
initialValue: 0,
|
|
158
|
+
rows: []
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
// Simulating copying from blocks.1 and pasting into duplicate field
|
|
162
|
+
const clipboardData = {
|
|
163
|
+
type: 'blocks',
|
|
164
|
+
path: 'blocks',
|
|
165
|
+
blocks: [],
|
|
166
|
+
data: {
|
|
167
|
+
'blocks.1.id': {
|
|
168
|
+
value: copiedBlockID,
|
|
169
|
+
valid: true
|
|
170
|
+
},
|
|
171
|
+
'blocks.1.blockType': {
|
|
172
|
+
value: 'number',
|
|
173
|
+
valid: true
|
|
174
|
+
},
|
|
175
|
+
'blocks.1.number': {
|
|
176
|
+
value: 342,
|
|
177
|
+
valid: true
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
rowIndex: 1
|
|
181
|
+
};
|
|
182
|
+
const result = mergeFormStateFromClipboard({
|
|
183
|
+
dataFromClipboard: clipboardData,
|
|
184
|
+
formState,
|
|
185
|
+
path: 'duplicate'
|
|
186
|
+
});
|
|
187
|
+
// Check that a new ID was generated
|
|
188
|
+
expect(result['duplicate.0.id']).toBeDefined();
|
|
189
|
+
expect(result['duplicate.0.id'].value).toBeDefined();
|
|
190
|
+
expect(result['duplicate.0.id'].value).not.toEqual(copiedBlockID);
|
|
191
|
+
expect(ObjectId.isValid(result['duplicate.0.id'].value)).toBe(true);
|
|
192
|
+
// Check that the row metadata has the new ID (not the copied ID)
|
|
193
|
+
expect(result.duplicate.rows).toBeDefined();
|
|
194
|
+
expect(result.duplicate.rows).toHaveLength(1);
|
|
195
|
+
expect(result.duplicate.rows[0].id).not.toEqual(copiedBlockID);
|
|
196
|
+
expect(result.duplicate.rows[0].id).toEqual(result['duplicate.0.id'].value);
|
|
197
|
+
// Check that other fields were preserved
|
|
198
|
+
expect(result['duplicate.0.number'].value).toEqual(342);
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
describe('block row paste with nested array', () => {
|
|
202
|
+
it('should regenerate nested array item IDs when pasting a block row', () => {
|
|
203
|
+
const copiedBlockID = new ObjectId().toHexString();
|
|
204
|
+
const copiedArrayItemID1 = new ObjectId().toHexString();
|
|
205
|
+
const copiedArrayItemID2 = new ObjectId().toHexString();
|
|
206
|
+
const copiedArrayItemID3 = new ObjectId().toHexString();
|
|
207
|
+
const targetBlockID = new ObjectId().toHexString();
|
|
208
|
+
// Target form state: block at index 1 with empty buttons array
|
|
209
|
+
const formState = {
|
|
210
|
+
ctas: {
|
|
211
|
+
valid: true,
|
|
212
|
+
value: 2,
|
|
213
|
+
initialValue: 2,
|
|
214
|
+
rows: [{
|
|
215
|
+
id: copiedBlockID,
|
|
216
|
+
blockType: 'callToAction',
|
|
217
|
+
isLoading: false
|
|
218
|
+
}, {
|
|
219
|
+
id: targetBlockID,
|
|
220
|
+
blockType: 'callToAction',
|
|
221
|
+
isLoading: false
|
|
222
|
+
}]
|
|
223
|
+
},
|
|
224
|
+
'ctas.0': {
|
|
225
|
+
value: 'callToAction',
|
|
226
|
+
valid: true
|
|
227
|
+
},
|
|
228
|
+
'ctas.0.id': {
|
|
229
|
+
value: copiedBlockID,
|
|
230
|
+
valid: true
|
|
231
|
+
},
|
|
232
|
+
'ctas.0.buttons': {
|
|
233
|
+
valid: true,
|
|
234
|
+
value: 3,
|
|
235
|
+
rows: [{
|
|
236
|
+
id: copiedArrayItemID1,
|
|
237
|
+
isLoading: false
|
|
238
|
+
}, {
|
|
239
|
+
id: copiedArrayItemID2,
|
|
240
|
+
isLoading: false
|
|
241
|
+
}, {
|
|
242
|
+
id: copiedArrayItemID3,
|
|
243
|
+
isLoading: false
|
|
244
|
+
}]
|
|
245
|
+
},
|
|
246
|
+
'ctas.0.buttons.0.id': {
|
|
247
|
+
value: copiedArrayItemID1,
|
|
248
|
+
valid: true
|
|
249
|
+
},
|
|
250
|
+
'ctas.0.buttons.1.id': {
|
|
251
|
+
value: copiedArrayItemID2,
|
|
252
|
+
valid: true
|
|
253
|
+
},
|
|
254
|
+
'ctas.0.buttons.2.id': {
|
|
255
|
+
value: copiedArrayItemID3,
|
|
256
|
+
valid: true
|
|
257
|
+
},
|
|
258
|
+
'ctas.1': {
|
|
259
|
+
value: 'callToAction',
|
|
260
|
+
valid: true
|
|
261
|
+
},
|
|
262
|
+
'ctas.1.id': {
|
|
263
|
+
value: targetBlockID,
|
|
264
|
+
valid: true
|
|
265
|
+
},
|
|
266
|
+
'ctas.1.buttons': {
|
|
267
|
+
valid: true,
|
|
268
|
+
value: 0,
|
|
269
|
+
rows: []
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
// Clipboard: block row 0 (source) with 3 buttons
|
|
273
|
+
const clipboardData = {
|
|
274
|
+
type: 'blocks',
|
|
275
|
+
path: 'ctas',
|
|
276
|
+
blocks: [],
|
|
277
|
+
rowIndex: 0,
|
|
278
|
+
data: {
|
|
279
|
+
'ctas.0': {
|
|
280
|
+
value: 'callToAction',
|
|
281
|
+
valid: true
|
|
282
|
+
},
|
|
283
|
+
'ctas.0.id': {
|
|
284
|
+
value: copiedBlockID,
|
|
285
|
+
valid: true
|
|
286
|
+
},
|
|
287
|
+
'ctas.0.buttons': {
|
|
288
|
+
valid: true,
|
|
289
|
+
value: 3,
|
|
290
|
+
rows: [{
|
|
291
|
+
id: copiedArrayItemID1,
|
|
292
|
+
isLoading: false
|
|
293
|
+
}, {
|
|
294
|
+
id: copiedArrayItemID2,
|
|
295
|
+
isLoading: false
|
|
296
|
+
}, {
|
|
297
|
+
id: copiedArrayItemID3,
|
|
298
|
+
isLoading: false
|
|
299
|
+
}]
|
|
300
|
+
},
|
|
301
|
+
'ctas.0.buttons.0.id': {
|
|
302
|
+
value: copiedArrayItemID1,
|
|
303
|
+
valid: true
|
|
304
|
+
},
|
|
305
|
+
'ctas.0.buttons.0.label': {
|
|
306
|
+
value: 'Button 1',
|
|
307
|
+
valid: true
|
|
308
|
+
},
|
|
309
|
+
'ctas.0.buttons.1.id': {
|
|
310
|
+
value: copiedArrayItemID2,
|
|
311
|
+
valid: true
|
|
312
|
+
},
|
|
313
|
+
'ctas.0.buttons.1.label': {
|
|
314
|
+
value: 'Button 2',
|
|
315
|
+
valid: true
|
|
316
|
+
},
|
|
317
|
+
'ctas.0.buttons.2.id': {
|
|
318
|
+
value: copiedArrayItemID3,
|
|
319
|
+
valid: true
|
|
320
|
+
},
|
|
321
|
+
'ctas.0.buttons.2.label': {
|
|
322
|
+
value: 'Button 3',
|
|
323
|
+
valid: true
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
// Paste into block row 1 (target)
|
|
328
|
+
const result = mergeFormStateFromClipboard({
|
|
329
|
+
dataFromClipboard: clipboardData,
|
|
330
|
+
formState,
|
|
331
|
+
path: 'ctas',
|
|
332
|
+
rowIndex: 1
|
|
333
|
+
});
|
|
334
|
+
// Target block ID should NOT be overwritten
|
|
335
|
+
expect(result['ctas.1.id'].value).toEqual(targetBlockID);
|
|
336
|
+
// Nested array items should have NEW IDs (not the source IDs)
|
|
337
|
+
expect(result['ctas.1.buttons.0.id']).toBeDefined();
|
|
338
|
+
expect(result['ctas.1.buttons.0.id'].value).not.toEqual(copiedArrayItemID1);
|
|
339
|
+
expect(ObjectId.isValid(result['ctas.1.buttons.0.id'].value)).toBe(true);
|
|
340
|
+
expect(result['ctas.1.buttons.1.id']).toBeDefined();
|
|
341
|
+
expect(result['ctas.1.buttons.1.id'].value).not.toEqual(copiedArrayItemID2);
|
|
342
|
+
expect(result['ctas.1.buttons.2.id']).toBeDefined();
|
|
343
|
+
expect(result['ctas.1.buttons.2.id'].value).not.toEqual(copiedArrayItemID3);
|
|
344
|
+
// The rows metadata in ctas.1.buttons should have the new IDs
|
|
345
|
+
expect(result['ctas.1.buttons'].rows).toHaveLength(3);
|
|
346
|
+
expect(result['ctas.1.buttons'].rows[0].id).toEqual(result['ctas.1.buttons.0.id'].value);
|
|
347
|
+
expect(result['ctas.1.buttons'].rows[1].id).toEqual(result['ctas.1.buttons.1.id'].value);
|
|
348
|
+
expect(result['ctas.1.buttons'].rows[2].id).toEqual(result['ctas.1.buttons.2.id'].value);
|
|
349
|
+
// Field values should be copied
|
|
350
|
+
expect(result['ctas.1.buttons.0.label'].value).toEqual('Button 1');
|
|
351
|
+
expect(result['ctas.1.buttons.1.label'].value).toEqual('Button 2');
|
|
352
|
+
expect(result['ctas.1.buttons.2.label'].value).toEqual('Button 3');
|
|
353
|
+
// Source block should be untouched
|
|
354
|
+
expect(result['ctas.0.id'].value).toEqual(copiedBlockID);
|
|
355
|
+
expect(result['ctas.0.buttons'].rows).toHaveLength(3);
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
describe('array ID regeneration', () => {
|
|
359
|
+
it('should generate new IDs when pasting arrays to prevent duplicates', () => {
|
|
360
|
+
const copiedArrayID = new ObjectId().toHexString();
|
|
361
|
+
const formState = {
|
|
362
|
+
items: {
|
|
363
|
+
valid: true,
|
|
364
|
+
value: 0,
|
|
365
|
+
initialValue: 0,
|
|
366
|
+
rows: []
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
const clipboardData = {
|
|
370
|
+
type: 'array',
|
|
371
|
+
path: 'items',
|
|
372
|
+
fields: [],
|
|
373
|
+
data: {
|
|
374
|
+
'items.0.id': {
|
|
375
|
+
value: copiedArrayID,
|
|
376
|
+
valid: true
|
|
377
|
+
},
|
|
378
|
+
'items.0.text': {
|
|
379
|
+
value: 'test content',
|
|
380
|
+
valid: true
|
|
381
|
+
}
|
|
382
|
+
},
|
|
383
|
+
rowIndex: 0
|
|
384
|
+
};
|
|
385
|
+
const result = mergeFormStateFromClipboard({
|
|
386
|
+
dataFromClipboard: clipboardData,
|
|
387
|
+
formState,
|
|
388
|
+
path: 'items'
|
|
389
|
+
});
|
|
390
|
+
// Check that a new ID was generated
|
|
391
|
+
expect(result['items.0.id']).toBeDefined();
|
|
392
|
+
expect(result['items.0.id'].value).toBeDefined();
|
|
393
|
+
expect(result['items.0.id'].value).not.toEqual(copiedArrayID);
|
|
394
|
+
expect(ObjectId.isValid(result['items.0.id'].value)).toBe(true);
|
|
395
|
+
// Check that the row metadata also has the new ID
|
|
396
|
+
expect(result.items.rows).toHaveLength(1);
|
|
397
|
+
expect(result.items.rows?.[0]?.id).not.toEqual(copiedArrayID);
|
|
398
|
+
expect(result.items.rows?.[0]?.id).toEqual(result['items.0.id'].value);
|
|
399
|
+
});
|
|
400
|
+
it('should generate new IDs for nested arrays', () => {
|
|
401
|
+
const copiedArrayID = new ObjectId().toHexString();
|
|
402
|
+
const copiedNestedArrayID = new ObjectId().toHexString();
|
|
403
|
+
const formState = {
|
|
404
|
+
items: {
|
|
405
|
+
valid: true,
|
|
406
|
+
value: 0,
|
|
407
|
+
initialValue: 0,
|
|
408
|
+
rows: []
|
|
409
|
+
}
|
|
410
|
+
};
|
|
411
|
+
const clipboardData = {
|
|
412
|
+
type: 'array',
|
|
413
|
+
path: 'items',
|
|
414
|
+
fields: [],
|
|
415
|
+
data: {
|
|
416
|
+
'items.0.id': {
|
|
417
|
+
value: copiedArrayID,
|
|
418
|
+
valid: true
|
|
419
|
+
},
|
|
420
|
+
'items.0.text': {
|
|
421
|
+
value: 'parent array',
|
|
422
|
+
valid: true
|
|
423
|
+
},
|
|
424
|
+
'items.0.subArray': {
|
|
425
|
+
value: 1,
|
|
426
|
+
valid: true,
|
|
427
|
+
rows: [{
|
|
428
|
+
id: copiedNestedArrayID
|
|
429
|
+
}]
|
|
430
|
+
},
|
|
431
|
+
'items.0.subArray.0.id': {
|
|
432
|
+
value: copiedNestedArrayID,
|
|
433
|
+
valid: true
|
|
434
|
+
},
|
|
435
|
+
'items.0.subArray.0.text': {
|
|
436
|
+
value: 'nested array',
|
|
437
|
+
valid: true
|
|
438
|
+
}
|
|
439
|
+
},
|
|
440
|
+
rowIndex: 0
|
|
441
|
+
};
|
|
442
|
+
const result = mergeFormStateFromClipboard({
|
|
443
|
+
dataFromClipboard: clipboardData,
|
|
444
|
+
formState,
|
|
445
|
+
path: 'items'
|
|
446
|
+
});
|
|
447
|
+
// Check that parent array got new ID
|
|
448
|
+
expect(result['items.0.id'].value).not.toEqual(copiedArrayID);
|
|
449
|
+
expect(ObjectId.isValid(result['items.0.id'].value)).toBe(true);
|
|
450
|
+
// Check that nested array got new ID
|
|
451
|
+
expect(result['items.0.subArray.0.id'].value).not.toEqual(copiedNestedArrayID);
|
|
452
|
+
expect(ObjectId.isValid(result['items.0.subArray.0.id'].value)).toBe(true);
|
|
453
|
+
// Check that parent and nested IDs are different
|
|
454
|
+
expect(result['items.0.id'].value).not.toEqual(result['items.0.subArray.0.id'].value);
|
|
455
|
+
// Check that parent row metadata has new ID
|
|
456
|
+
expect(result.items.rows?.[0]?.id).toEqual(result['items.0.id'].value);
|
|
457
|
+
// Check that nested row metadata has new ID
|
|
458
|
+
expect(result['items.0.subArray'].rows?.[0]?.id).toEqual(result['items.0.subArray.0.id'].value);
|
|
459
|
+
});
|
|
460
|
+
it('should preserve non-ID field values when pasting arrays', () => {
|
|
461
|
+
const copiedArrayID = new ObjectId().toHexString();
|
|
462
|
+
const formState = {
|
|
463
|
+
items: {
|
|
464
|
+
valid: true,
|
|
465
|
+
value: 0,
|
|
466
|
+
initialValue: 0,
|
|
467
|
+
rows: []
|
|
468
|
+
}
|
|
469
|
+
};
|
|
470
|
+
const clipboardData = {
|
|
471
|
+
type: 'array',
|
|
472
|
+
path: 'items',
|
|
473
|
+
fields: [],
|
|
474
|
+
data: {
|
|
475
|
+
'items.0.id': {
|
|
476
|
+
value: copiedArrayID,
|
|
477
|
+
valid: true
|
|
478
|
+
},
|
|
479
|
+
'items.0.text': {
|
|
480
|
+
value: 'preserved array text',
|
|
481
|
+
valid: true
|
|
482
|
+
}
|
|
483
|
+
},
|
|
484
|
+
rowIndex: 0
|
|
485
|
+
};
|
|
486
|
+
const result = mergeFormStateFromClipboard({
|
|
487
|
+
dataFromClipboard: clipboardData,
|
|
488
|
+
formState,
|
|
489
|
+
path: 'items'
|
|
490
|
+
});
|
|
491
|
+
// Non-ID fields should be preserved
|
|
492
|
+
expect(result['items.0.text'].value).toEqual('preserved array text');
|
|
493
|
+
});
|
|
494
|
+
it('should generate new ID when pasting from array row to field', () => {
|
|
495
|
+
const copiedArrayID = new ObjectId().toHexString();
|
|
496
|
+
const formState = {
|
|
497
|
+
disableSort: {
|
|
498
|
+
valid: true,
|
|
499
|
+
value: 0,
|
|
500
|
+
initialValue: 0,
|
|
501
|
+
rows: []
|
|
502
|
+
}
|
|
503
|
+
};
|
|
504
|
+
// Simulating copying from items.0 and pasting into disableSort field
|
|
505
|
+
const clipboardData = {
|
|
506
|
+
type: 'array',
|
|
507
|
+
path: 'items',
|
|
508
|
+
fields: [],
|
|
509
|
+
data: {
|
|
510
|
+
'items.0.id': {
|
|
511
|
+
value: copiedArrayID,
|
|
512
|
+
valid: true
|
|
513
|
+
},
|
|
514
|
+
'items.0.text': {
|
|
515
|
+
value: 'row one',
|
|
516
|
+
valid: true
|
|
517
|
+
}
|
|
518
|
+
},
|
|
519
|
+
rowIndex: 0
|
|
520
|
+
};
|
|
521
|
+
const result = mergeFormStateFromClipboard({
|
|
522
|
+
dataFromClipboard: clipboardData,
|
|
523
|
+
formState,
|
|
524
|
+
path: 'disableSort'
|
|
525
|
+
});
|
|
526
|
+
// Check that a new ID was generated
|
|
527
|
+
expect(result['disableSort.0.id']).toBeDefined();
|
|
528
|
+
expect(result['disableSort.0.id'].value).toBeDefined();
|
|
529
|
+
expect(result['disableSort.0.id'].value).not.toEqual(copiedArrayID);
|
|
530
|
+
expect(ObjectId.isValid(result['disableSort.0.id'].value)).toBe(true);
|
|
531
|
+
// Check that the row metadata has the new ID (not the copied ID)
|
|
532
|
+
expect(result.disableSort.rows).toBeDefined();
|
|
533
|
+
expect(result.disableSort.rows).toHaveLength(1);
|
|
534
|
+
expect(result.disableSort.rows[0].id).not.toEqual(copiedArrayID);
|
|
535
|
+
expect(result.disableSort.rows[0].id).toEqual(result['disableSort.0.id'].value);
|
|
536
|
+
// Check that other fields were preserved
|
|
537
|
+
expect(result['disableSort.0.text'].value).toEqual('row one');
|
|
538
|
+
});
|
|
539
|
+
});
|
|
540
|
+
});
|
|
541
|
+
//# sourceMappingURL=mergeFormStateFromClipboard.spec.js.map
|