@frontify/fondue 12.0.0-beta.304 → 12.0.0-beta.305
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.
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import S, { memo as De, useMemo as L, useReducer as Se, useTransition as Te, useState as
|
|
1
|
+
import S, { memo as De, useMemo as L, useReducer as Se, useTransition as Te, useState as x, useEffect as M, useCallback as m, useRef as Ce, cloneElement as Re, isValidElement as z } from "react";
|
|
2
2
|
import { SortableContext as we, verticalListSortingStrategy as he } from "@dnd-kit/sortable";
|
|
3
3
|
import { restrictToWindowEdges as Oe } from "@dnd-kit/modifiers";
|
|
4
|
-
import { enableMapSet as
|
|
4
|
+
import { enableMapSet as xe, produce as _e } from "immer";
|
|
5
5
|
import { createPortal as be } from "react-dom";
|
|
6
6
|
import Q from "../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isEqual.es.js";
|
|
7
7
|
import { MeasuringStrategy as Le, KeyboardCode as T, useSensors as Me, useSensor as Z, PointerSensor as Ae, KeyboardSensor as Pe, DndContext as ke, closestCorners as ve, DragOverlay as Ge } from "@dnd-kit/core";
|
|
@@ -20,8 +20,8 @@ const Ye = {
|
|
|
20
20
|
strategy: Le.Always
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
|
-
|
|
24
|
-
const qe =
|
|
23
|
+
xe();
|
|
24
|
+
const qe = _e((o, d) => {
|
|
25
25
|
switch (d.type) {
|
|
26
26
|
case "EXPAND_NODE":
|
|
27
27
|
o.expandedIds = new Set(o.expandedIds).add(d.payload);
|
|
@@ -94,7 +94,7 @@ const qe = xe((o, d) => {
|
|
|
94
94
|
selectedIds: I,
|
|
95
95
|
expandedIds: E,
|
|
96
96
|
draggable: N = !1,
|
|
97
|
-
multiselect:
|
|
97
|
+
multiselect: _ = !1,
|
|
98
98
|
"data-test-id": te = "fondue-tree"
|
|
99
99
|
}) => {
|
|
100
100
|
var J;
|
|
@@ -110,23 +110,23 @@ const qe = xe((o, d) => {
|
|
|
110
110
|
projection: null
|
|
111
111
|
}),
|
|
112
112
|
[E, I]
|
|
113
|
-
), [n, l] = Se(qe, ne), [, oe] = Te(), [R, K] =
|
|
113
|
+
), [n, l] = Se(qe, ne), [, oe] = Te(), [R, K] = x(null), [A, P] = x(null), [k, F] = x(null), [b, w] = x(null);
|
|
114
114
|
M(() => {
|
|
115
115
|
const e = (t) => {
|
|
116
|
-
|
|
116
|
+
_ && (t.key === "Meta" || t.ctrlKey) && l({
|
|
117
117
|
type: "SET_SELECTION_MODE",
|
|
118
118
|
payload: { selectionMode: "multiselect" }
|
|
119
119
|
});
|
|
120
120
|
}, s = (t) => {
|
|
121
|
-
|
|
121
|
+
_ && (t.key === "Meta" || t.ctrlKey) && l({
|
|
122
122
|
type: "SET_SELECTION_MODE",
|
|
123
123
|
payload: { selectionMode: "single" }
|
|
124
124
|
});
|
|
125
125
|
};
|
|
126
|
-
return
|
|
126
|
+
return _ && (window.addEventListener("keydown", e), window.addEventListener("keyup", s)), () => {
|
|
127
127
|
window.removeEventListener("keydown", e), window.removeEventListener("keyup", s);
|
|
128
128
|
};
|
|
129
|
-
}, [
|
|
129
|
+
}, [_]);
|
|
130
130
|
const U = m((e) => {
|
|
131
131
|
l({ type: "REGISTER_OVERLAY_ITEM", payload: e });
|
|
132
132
|
}, []), V = m((e) => {
|
|
@@ -236,7 +236,7 @@ const qe = xe((o, d) => {
|
|
|
236
236
|
), B = Ce({
|
|
237
237
|
nodes: n.nodes,
|
|
238
238
|
offset: R ?? 0
|
|
239
|
-
}), [pe] =
|
|
239
|
+
}), [pe] = x(() => $e(B)), ce = Me(Z(Ae), Z(Pe, { coordinateGetter: pe })), Ee = L(() => {
|
|
240
240
|
const e = (t) => {
|
|
241
241
|
let r = t.id;
|
|
242
242
|
const a = n.nodes.find((i) => i.props.id === t.id);
|
|
@@ -394,13 +394,22 @@ const qe = xe((o, d) => {
|
|
|
394
394
|
},
|
|
395
395
|
/* @__PURE__ */ S.createElement(we, { items: me, strategy: he }, ue),
|
|
396
396
|
be(
|
|
397
|
-
/* @__PURE__ */ S.createElement(
|
|
398
|
-
|
|
397
|
+
/* @__PURE__ */ S.createElement(
|
|
398
|
+
Ge,
|
|
399
399
|
{
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
400
|
+
zIndex: 1500,
|
|
401
|
+
wrapperElement: "ul",
|
|
402
|
+
dropAnimation: null,
|
|
403
|
+
modifiers: [Oe]
|
|
404
|
+
},
|
|
405
|
+
n.overlay && /* @__PURE__ */ S.createElement(
|
|
406
|
+
Be,
|
|
407
|
+
{
|
|
408
|
+
...n.overlay,
|
|
409
|
+
isSelected: n.selectedIds.has(n.overlay.id)
|
|
410
|
+
}
|
|
411
|
+
)
|
|
412
|
+
),
|
|
404
413
|
document.body
|
|
405
414
|
)
|
|
406
415
|
)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tree.es.js","sources":["../../../src/components/Tree/Tree.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport React, {\n ReactElement,\n cloneElement,\n isValidElement,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n useTransition,\n} from 'react';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { restrictToWindowEdges } from '@dnd-kit/modifiers';\nimport { enableMapSet, produce } from 'immer';\nimport { createPortal } from 'react-dom';\nimport isEqual from 'lodash-es/isEqual';\nimport {\n DndContext,\n DragEndEvent,\n DragMoveEvent,\n DragOverlay,\n KeyboardCode,\n KeyboardSensor,\n MeasuringConfiguration,\n MeasuringStrategy,\n PointerSensor,\n closestCorners,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\n\nimport type {\n RegisterNodeChildrenPayload,\n SensorContext,\n TreeActive,\n TreeAnnouncements,\n TreeDragOverEvent,\n TreeDragStartEvent,\n TreeOver,\n TreeProps,\n TreeState,\n TreeStateAction,\n} from '@components/Tree/types';\n\nimport { type Overlay, TreeItemOverlay } from './TreeItem';\n\nimport {\n recursivelyRemoveFragmentsAndEnrichChildren,\n sortableTreeKeyboardCoordinates,\n useDeepCompareEffect,\n} from './utils';\n\nimport {\n currentNodesChanged,\n findIndexById,\n getCurrentChildrenForNewNodesIfExpanded,\n getMovementAnnouncement,\n getNodeChildrenIds,\n getProjection,\n getReactNodeIdsInFlatArray,\n removeReactNodesFromFlatArray,\n updateNodeWithNewChildren,\n} from './helpers';\n\nimport { TreeContext, TreeContextProps } from './TreeContext';\nimport { ROOT_ID } from './helpers';\n\nconst measuring: MeasuringConfiguration = {\n droppable: {\n strategy: MeasuringStrategy.Always,\n },\n};\n\nenableMapSet();\n\nconst reducer = produce((draft: TreeState, action: TreeStateAction) => {\n switch (action.type) {\n case 'EXPAND_NODE':\n draft.expandedIds = new Set(draft.expandedIds).add(action.payload);\n return;\n\n case 'SHRINK_NODE':\n const newExpanded = new Set(draft.expandedIds);\n newExpanded.delete(action.payload);\n\n draft.expandedIds = newExpanded;\n return;\n\n case 'SET_SELECTION_MODE':\n draft.selectionMode = action.payload.selectionMode;\n return;\n\n case 'SET_PROJECTION':\n if (!isEqual(draft.projection, action.payload)) {\n draft.projection = action.payload;\n }\n return;\n\n case 'REGISTER_OVERLAY_ITEM':\n draft.overlay = action.payload;\n return;\n\n case 'REGISTER_ROOT_NODES':\n // reset rootNodes keeping any children when expanded\n draft.rootNodes = getCurrentChildrenForNewNodesIfExpanded(\n draft.rootNodes,\n draft.expandedIds,\n action.payload,\n );\n return;\n\n case 'REGISTER_NODE_CHILDREN':\n const { id: parentId, children } = action.payload;\n\n if (findIndexById(draft.rootNodes, parentId) === -1) {\n // This can happen when this action is triggered before the rootNodes array is updated\n // It happens if using static data will all nodes and handling expandedIds outside the Tree component\n // Most of the cases, it will register the children properly afterwards\n // See Scrollable Tree With Label story\n console.warn(`Parent element with ID \"${parentId}\" not found when registering children.`);\n return;\n }\n\n const currentChildrenIds = getNodeChildrenIds(draft.rootNodes, parentId);\n const newChildrenIds = children.map((node) => node.props.id);\n\n if (\n !isEqual(currentChildrenIds, newChildrenIds) ||\n currentNodesChanged(currentChildrenIds, draft.rootNodes, children)\n ) {\n // keep any children when parent expanded\n const newChildren = getCurrentChildrenForNewNodesIfExpanded(\n draft.rootNodes,\n draft.expandedIds,\n children,\n );\n draft.rootNodes = updateNodeWithNewChildren(draft.rootNodes, parentId, newChildren);\n }\n\n return;\n\n case 'UNREGISTER_NODE_CHILDREN':\n const nodeIds = getReactNodeIdsInFlatArray(draft.rootNodes, action.payload);\n if (nodeIds.length > 0) {\n draft.rootNodes = removeReactNodesFromFlatArray(draft.rootNodes, nodeIds);\n }\n return;\n\n case 'REGISTER_NODES':\n draft.nodes = action.payload;\n return;\n\n case 'REPLACE_EXPANDED':\n draft.expandedIds = new Set(action.payload);\n return;\n\n case 'REPLACE_SELECTED':\n draft.selectedIds = new Set(action.payload);\n return;\n\n case 'REPLACE_STATE':\n draft.rootNodes = action.payload.rootNodes;\n draft.overlay = action.payload.overlay;\n draft.projection = action.payload.projection;\n draft.selectedIds = action.payload.selectedIds;\n draft.expandedIds = action.payload.expandedIds;\n draft.selectionMode = action.payload.selectionMode;\n return;\n\n default:\n console.warn(`Updated tree with action \"${action.type}\" but it has not effect.`);\n return;\n }\n});\n\nexport const Tree = memo(\n ({\n id,\n onDrop,\n onSelect = () => void 0,\n onExpand,\n onShrink,\n children,\n selectedIds,\n expandedIds,\n draggable = false,\n multiselect = false,\n 'data-test-id': dataTestId = 'fondue-tree',\n }: TreeProps) => {\n const initialState: TreeState = useMemo(\n () => ({\n selectionMode: 'single',\n selectedIds: new Set(selectedIds ?? []),\n expandedIds: new Set(expandedIds ?? []),\n rootNodes: [],\n expandedNodes: [],\n nodes: [],\n nodesReady: false,\n projection: null,\n }),\n [expandedIds, selectedIds],\n );\n\n const [treeState, updateTreeState] = useReducer(reducer, initialState);\n const [, startTransition] = useTransition();\n\n const [offset, setOffset] = useState<Nullable<number>>(null);\n const [overId, setOverId] = useState<Nullable<string>>(null);\n const [activeId, setActiveId] = useState<Nullable<string>>(null);\n const [currentPosition, setCurrentPosition] =\n useState<Nullable<{ overId: string; parentId: Nullable<string> }>>(null);\n\n useEffect(() => {\n const keyDownHandler = (event: globalThis.KeyboardEvent) => {\n if (multiselect && (event.key === 'Meta' || event.ctrlKey)) {\n updateTreeState({\n type: 'SET_SELECTION_MODE',\n payload: { selectionMode: 'multiselect' },\n });\n }\n };\n\n const keyUpHandler = (event: globalThis.KeyboardEvent) => {\n if (multiselect && (event.key === 'Meta' || event.ctrlKey)) {\n updateTreeState({\n type: 'SET_SELECTION_MODE',\n payload: { selectionMode: 'single' },\n });\n }\n };\n\n if (multiselect) {\n window.addEventListener('keydown', keyDownHandler);\n window.addEventListener('keyup', keyUpHandler);\n }\n\n return () => {\n window.removeEventListener('keydown', keyDownHandler);\n window.removeEventListener('keyup', keyUpHandler);\n };\n }, [multiselect]);\n\n const registerOverlay = useCallback((overlay: Overlay) => {\n updateTreeState({ type: 'REGISTER_OVERLAY_ITEM', payload: overlay });\n }, []);\n\n const registerNodeChildren = useCallback((payload: RegisterNodeChildrenPayload) => {\n updateTreeState({ type: 'REGISTER_NODE_CHILDREN', payload });\n }, []);\n\n const unregisterNodeChildren = useCallback((payload: string) => {\n updateTreeState({ type: 'UNREGISTER_NODE_CHILDREN', payload });\n }, []);\n\n const handleSelect = useCallback(\n (id: string) => {\n onSelect(id);\n },\n [onSelect],\n );\n\n const handleExpand = useCallback(\n (id: string) => {\n if (onExpand) {\n return onExpand(id);\n }\n\n updateTreeState({\n type: 'EXPAND_NODE',\n payload: id,\n });\n },\n [onExpand],\n );\n\n const handleShrink = useCallback(\n (id: string) => {\n if (onShrink) {\n return onShrink(id);\n }\n\n updateTreeState({\n type: 'SHRINK_NODE',\n payload: id,\n });\n },\n [onShrink],\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n resetState();\n\n const { over, active } = event;\n\n if (!over?.id || !active?.id || !treeState.projection?.parentId) {\n return;\n }\n\n const activeNode = treeState.nodes.find((node) => node.props.id === active.id);\n const contentComponent = activeNode?.props?.contentComponent;\n\n onDrop?.({\n id: active.id.toString(),\n parentId: treeState.projection.parentId,\n sort: treeState.projection.position,\n contentComponent,\n });\n };\n\n const handleDragStart = ({ active: { id: activeId, data } }: TreeDragStartEvent) => {\n setActiveId(activeId);\n setOverId(activeId);\n\n if (activeId && data.current) {\n setCurrentPosition({\n parentId: data.current.parentId,\n overId: activeId,\n });\n }\n\n document.body.style.setProperty('cursor', 'grabbing');\n };\n\n const handleDragOver = ({ over }: TreeDragOverEvent) => {\n setOverId(over?.id ?? null);\n };\n\n const handleDragMove = ({ delta }: DragMoveEvent) => {\n setOffset(delta.x);\n };\n\n const handleDragCancel = () => {\n resetState();\n };\n\n const resetState = () => {\n setOverId(null);\n setActiveId(null);\n setOffset(0);\n setCurrentPosition(null);\n\n document.body.style.setProperty('cursor', 'default');\n };\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLUListElement>) => {\n const activeElement = document.activeElement;\n\n if (\n !activeElement?.parentElement ||\n activeElement.getAttribute('role') !== 'treeitem' ||\n !(activeElement instanceof HTMLLIElement)\n ) {\n return;\n }\n\n const items = Array.from(activeElement.parentElement.children).filter(\n (child) => child.nodeName === 'LI',\n ) as HTMLLIElement[];\n\n const currentIndex = items.indexOf(activeElement);\n\n const node = treeState.nodes[currentIndex];\n\n const id: string = node.props.id;\n const isExpanded = treeState.expandedIds.has(id);\n const parentId: string | undefined = node.props.parentId;\n const hasChildren = activeElement.getAttribute('data-has-children') === 'true';\n\n const { code } = event;\n\n const toggleSelect = () => {\n event.preventDefault();\n\n handleSelect(id);\n };\n\n const expandItem = () => {\n event.preventDefault();\n\n handleExpand(id);\n };\n\n const shrinkItem = () => {\n event.preventDefault();\n\n handleShrink(id);\n };\n\n const focusPrevious = () => {\n const previousIndex = (currentIndex + items.length - 1) % items.length;\n items[previousIndex].focus();\n };\n\n const focusNext = () => {\n const nextIndex = (currentIndex + 1) % items.length;\n items[nextIndex].focus();\n };\n\n switch (code) {\n case KeyboardCode.Enter:\n toggleSelect();\n\n break;\n\n case KeyboardCode.Space:\n hasChildren ? expandItem() : toggleSelect();\n\n break;\n\n case KeyboardCode.Right:\n if (!hasChildren) {\n break;\n }\n\n isExpanded ? focusNext() : expandItem();\n\n break;\n\n case KeyboardCode.Left:\n if (hasChildren && isExpanded) {\n shrinkItem();\n } else if (parentId && parentId !== ROOT_ID) {\n const parentIndex = treeState.nodes.findIndex((node) => node.props.id === parentId);\n\n items[parentIndex].focus();\n }\n break;\n\n case KeyboardCode.Up:\n event.preventDefault();\n focusPrevious();\n\n break;\n\n case KeyboardCode.Down:\n event.preventDefault();\n focusNext();\n\n break;\n\n default:\n break;\n }\n },\n [handleExpand, handleShrink, handleSelect, treeState.expandedIds, treeState.nodes],\n );\n\n const sensorContext: SensorContext = useRef({\n nodes: treeState.nodes,\n offset: offset ?? 0,\n });\n\n const [coordinateGetter] = useState(() => sortableTreeKeyboardCoordinates(sensorContext));\n\n const sensors = useSensors(useSensor(PointerSensor), useSensor(KeyboardSensor, { coordinateGetter }));\n\n const announcements: TreeAnnouncements = useMemo(() => {\n const getActiveTitle = (active: TreeActive) => {\n let title: string = active.id;\n\n const activeNode = treeState.nodes.find((node) => node.props.id === active.id);\n\n if (activeNode && isValidElement(activeNode.props.contentComponent)) {\n title = activeNode.props.contentComponent.props.title;\n } else if (activeNode && activeNode.props.label) {\n title = activeNode.props.label;\n }\n\n return title;\n };\n const getOverTitle = (over: TreeOver | null) => {\n let title = over?.id;\n\n const overNode = treeState.nodes.find((node) => node.props.id === over?.id);\n\n if (overNode && isValidElement(overNode.props.contentComponent)) {\n title = overNode.props.contentComponent.props.title;\n } else if (overNode && overNode.props.label) {\n title = overNode.props.label;\n }\n\n return title;\n };\n\n return {\n onDragStart({ active }) {\n return `Picked up ${getActiveTitle(active) || active.id}.`;\n },\n onDragMove({ active, over }) {\n return getMovementAnnouncement({\n eventName: 'onDragMove',\n activeId: active.id,\n activeTitle: getActiveTitle(active),\n overId: over?.id,\n overTitle: getOverTitle(over),\n treeState,\n setCurrentPosition,\n currentPosition,\n });\n },\n onDragOver({ active, over }) {\n return getMovementAnnouncement({\n eventName: 'onDragOver',\n activeId: active.id,\n activeTitle: getActiveTitle(active),\n overId: over?.id,\n overTitle: getOverTitle(over),\n treeState,\n setCurrentPosition,\n currentPosition,\n });\n },\n onDragEnd({ active, over }) {\n return getMovementAnnouncement({\n eventName: 'onDragEnd',\n activeId: active.id,\n activeTitle: getActiveTitle(active),\n overId: over?.id,\n overTitle: getOverTitle(over),\n treeState,\n setCurrentPosition,\n currentPosition,\n });\n },\n onDragCancel({ active }) {\n const title = getActiveTitle(active);\n\n return `Moving was cancelled. ${title} was dropped in its original position.`;\n },\n };\n }, [currentPosition, treeState]);\n\n useDeepCompareEffect(() => {\n if (!children) {\n return;\n }\n\n updateTreeState({\n type: 'REGISTER_ROOT_NODES',\n payload: recursivelyRemoveFragmentsAndEnrichChildren(children, { parentId: ROOT_ID, level: 0 }),\n });\n }, [children]);\n\n useDeepCompareEffect(() => {\n if (treeState.rootNodes.length === 0) {\n return;\n }\n\n startTransition(() => {\n const nodesToRender: { id: string; node: ReactElement }[] = [];\n for (const node of treeState.rootNodes) {\n const parentId = node.props.parentId;\n if (\n typeof parentId === 'string' &&\n (parentId === ROOT_ID ||\n (treeState.expandedIds.has(parentId) && nodesToRender.find((n) => n.id === parentId)))\n ) {\n nodesToRender.push({ id: node.props.id, node });\n }\n }\n\n updateTreeState({\n type: 'REGISTER_NODES',\n payload: nodesToRender.map((n) => n.node),\n });\n });\n }, [treeState.rootNodes, treeState.expandedIds]);\n\n useEffect(() => {\n updateTreeState({\n type: 'REPLACE_EXPANDED',\n payload: expandedIds ?? [],\n });\n }, [expandedIds]);\n\n useEffect(() => {\n updateTreeState({\n type: 'REPLACE_SELECTED',\n payload: selectedIds ?? [],\n });\n }, [selectedIds]);\n\n useDeepCompareEffect(() => {\n sensorContext.current = {\n nodes: treeState.nodes,\n offset: offset ?? 0,\n };\n }, [offset, treeState.nodes]);\n\n useEffect(() => {\n const projection =\n activeId && overId\n ? getProjection({\n nodes: treeState.nodes,\n activeId,\n overId,\n dragOffset: offset ?? 0,\n })\n : null;\n\n updateTreeState({\n type: 'SET_PROJECTION',\n payload: projection,\n });\n }, [activeId, offset, overId, treeState.nodes]);\n\n const { nodes, items } = useMemo(() => {\n return {\n items: treeState.nodes.map((node) => node.props.id),\n nodes: treeState.nodes.map((node) =>\n cloneElement(node, {\n treeDraggable: draggable,\n registerOverlay,\n onExpand: handleExpand,\n onShrink: handleShrink,\n onSelect: handleSelect,\n registerNodeChildren,\n unregisterNodeChildren,\n }),\n ),\n };\n }, [\n draggable,\n handleExpand,\n handleShrink,\n handleSelect,\n registerOverlay,\n treeState.nodes,\n registerNodeChildren,\n unregisterNodeChildren,\n ]);\n\n const contextValue: TreeContextProps = useMemo(\n () => ({\n treeState,\n onSelect: handleSelect,\n onExpand: handleExpand,\n onShrink: handleShrink,\n }),\n [treeState, handleSelect, handleExpand, handleShrink],\n );\n\n return (\n <TreeContext.Provider value={contextValue}>\n <ul\n id={id}\n role=\"tree\"\n data-test-id={dataTestId}\n onKeyDown={handleKeyDown}\n aria-multiselectable={treeState.selectionMode === 'multiselect'}\n className=\"tw-p-0 tw-m-0 tw-font-sans tw-font-normal tw-list-none tw-text-left tw-text-sm tw-select-none\"\n >\n <DndContext\n sensors={sensors}\n measuring={measuring}\n onDragEnd={handleDragEnd}\n onDragOver={handleDragOver}\n onDragMove={handleDragMove}\n onDragStart={handleDragStart}\n onDragCancel={handleDragCancel}\n accessibility={{\n announcements,\n container: document.getElementById(id)?.parentElement ?? document.body,\n }}\n collisionDetection={closestCorners}\n >\n <SortableContext items={items} strategy={verticalListSortingStrategy}>\n {nodes}\n </SortableContext>\n\n {createPortal(\n <DragOverlay wrapperElement=\"ul\" dropAnimation={null} modifiers={[restrictToWindowEdges]}>\n {treeState.overlay && (\n <TreeItemOverlay\n {...treeState.overlay}\n isSelected={treeState.selectedIds.has(treeState.overlay.id)}\n />\n )}\n </DragOverlay>,\n document.body,\n )}\n </DndContext>\n </ul>\n </TreeContext.Provider>\n );\n },\n);\n\nTree.displayName = 'FondueTree';\n"],"names":["measuring","MeasuringStrategy","enableMapSet","reducer","produce","draft","action","newExpanded","isEqual","getCurrentChildrenForNewNodesIfExpanded","parentId","children","findIndexById","currentChildrenIds","getNodeChildrenIds","newChildrenIds","node","currentNodesChanged","newChildren","updateNodeWithNewChildren","nodeIds","getReactNodeIdsInFlatArray","removeReactNodesFromFlatArray","Tree","memo","id","onDrop","onSelect","onExpand","onShrink","selectedIds","expandedIds","draggable","multiselect","dataTestId","initialState","useMemo","treeState","updateTreeState","useReducer","startTransition","useTransition","offset","setOffset","useState","overId","setOverId","activeId","setActiveId","currentPosition","setCurrentPosition","useEffect","keyDownHandler","event","keyUpHandler","registerOverlay","useCallback","overlay","registerNodeChildren","payload","unregisterNodeChildren","handleSelect","handleExpand","handleShrink","handleDragEnd","resetState","over","active","_a","activeNode","contentComponent","_b","handleDragStart","data","handleDragOver","handleDragMove","delta","handleDragCancel","handleKeyDown","activeElement","items","child","currentIndex","isExpanded","hasChildren","code","toggleSelect","expandItem","shrinkItem","focusPrevious","previousIndex","focusNext","nextIndex","KeyboardCode","ROOT_ID","parentIndex","sensorContext","useRef","coordinateGetter","sortableTreeKeyboardCoordinates","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","announcements","getActiveTitle","title","isValidElement","getOverTitle","overNode","getMovementAnnouncement","useDeepCompareEffect","recursivelyRemoveFragmentsAndEnrichChildren","nodesToRender","n","projection","getProjection","nodes","cloneElement","contextValue","React","TreeContext","DndContext","closestCorners","SortableContext","verticalListSortingStrategy","createPortal","DragOverlay","restrictToWindowEdges","TreeItemOverlay"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Tree.es.js","sources":["../../../src/components/Tree/Tree.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport React, {\n ReactElement,\n cloneElement,\n isValidElement,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n useTransition,\n} from 'react';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { restrictToWindowEdges } from '@dnd-kit/modifiers';\nimport { enableMapSet, produce } from 'immer';\nimport { createPortal } from 'react-dom';\nimport isEqual from 'lodash-es/isEqual';\nimport {\n DndContext,\n DragEndEvent,\n DragMoveEvent,\n DragOverlay,\n KeyboardCode,\n KeyboardSensor,\n MeasuringConfiguration,\n MeasuringStrategy,\n PointerSensor,\n closestCorners,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\n\nimport type {\n RegisterNodeChildrenPayload,\n SensorContext,\n TreeActive,\n TreeAnnouncements,\n TreeDragOverEvent,\n TreeDragStartEvent,\n TreeOver,\n TreeProps,\n TreeState,\n TreeStateAction,\n} from '@components/Tree/types';\n\nimport { type Overlay, TreeItemOverlay } from './TreeItem';\n\nimport {\n recursivelyRemoveFragmentsAndEnrichChildren,\n sortableTreeKeyboardCoordinates,\n useDeepCompareEffect,\n} from './utils';\n\nimport {\n currentNodesChanged,\n findIndexById,\n getCurrentChildrenForNewNodesIfExpanded,\n getMovementAnnouncement,\n getNodeChildrenIds,\n getProjection,\n getReactNodeIdsInFlatArray,\n removeReactNodesFromFlatArray,\n updateNodeWithNewChildren,\n} from './helpers';\n\nimport { TreeContext, TreeContextProps } from './TreeContext';\nimport { ROOT_ID } from './helpers';\n\nconst measuring: MeasuringConfiguration = {\n droppable: {\n strategy: MeasuringStrategy.Always,\n },\n};\n\nenableMapSet();\n\nconst reducer = produce((draft: TreeState, action: TreeStateAction) => {\n switch (action.type) {\n case 'EXPAND_NODE':\n draft.expandedIds = new Set(draft.expandedIds).add(action.payload);\n return;\n\n case 'SHRINK_NODE':\n const newExpanded = new Set(draft.expandedIds);\n newExpanded.delete(action.payload);\n\n draft.expandedIds = newExpanded;\n return;\n\n case 'SET_SELECTION_MODE':\n draft.selectionMode = action.payload.selectionMode;\n return;\n\n case 'SET_PROJECTION':\n if (!isEqual(draft.projection, action.payload)) {\n draft.projection = action.payload;\n }\n return;\n\n case 'REGISTER_OVERLAY_ITEM':\n draft.overlay = action.payload;\n return;\n\n case 'REGISTER_ROOT_NODES':\n // reset rootNodes keeping any children when expanded\n draft.rootNodes = getCurrentChildrenForNewNodesIfExpanded(\n draft.rootNodes,\n draft.expandedIds,\n action.payload,\n );\n return;\n\n case 'REGISTER_NODE_CHILDREN':\n const { id: parentId, children } = action.payload;\n\n if (findIndexById(draft.rootNodes, parentId) === -1) {\n // This can happen when this action is triggered before the rootNodes array is updated\n // It happens if using static data will all nodes and handling expandedIds outside the Tree component\n // Most of the cases, it will register the children properly afterwards\n // See Scrollable Tree With Label story\n console.warn(`Parent element with ID \"${parentId}\" not found when registering children.`);\n return;\n }\n\n const currentChildrenIds = getNodeChildrenIds(draft.rootNodes, parentId);\n const newChildrenIds = children.map((node) => node.props.id);\n\n if (\n !isEqual(currentChildrenIds, newChildrenIds) ||\n currentNodesChanged(currentChildrenIds, draft.rootNodes, children)\n ) {\n // keep any children when parent expanded\n const newChildren = getCurrentChildrenForNewNodesIfExpanded(\n draft.rootNodes,\n draft.expandedIds,\n children,\n );\n draft.rootNodes = updateNodeWithNewChildren(draft.rootNodes, parentId, newChildren);\n }\n\n return;\n\n case 'UNREGISTER_NODE_CHILDREN':\n const nodeIds = getReactNodeIdsInFlatArray(draft.rootNodes, action.payload);\n if (nodeIds.length > 0) {\n draft.rootNodes = removeReactNodesFromFlatArray(draft.rootNodes, nodeIds);\n }\n return;\n\n case 'REGISTER_NODES':\n draft.nodes = action.payload;\n return;\n\n case 'REPLACE_EXPANDED':\n draft.expandedIds = new Set(action.payload);\n return;\n\n case 'REPLACE_SELECTED':\n draft.selectedIds = new Set(action.payload);\n return;\n\n case 'REPLACE_STATE':\n draft.rootNodes = action.payload.rootNodes;\n draft.overlay = action.payload.overlay;\n draft.projection = action.payload.projection;\n draft.selectedIds = action.payload.selectedIds;\n draft.expandedIds = action.payload.expandedIds;\n draft.selectionMode = action.payload.selectionMode;\n return;\n\n default:\n console.warn(`Updated tree with action \"${action.type}\" but it has not effect.`);\n return;\n }\n});\n\nexport const Tree = memo(\n ({\n id,\n onDrop,\n onSelect = () => void 0,\n onExpand,\n onShrink,\n children,\n selectedIds,\n expandedIds,\n draggable = false,\n multiselect = false,\n 'data-test-id': dataTestId = 'fondue-tree',\n }: TreeProps) => {\n const initialState: TreeState = useMemo(\n () => ({\n selectionMode: 'single',\n selectedIds: new Set(selectedIds ?? []),\n expandedIds: new Set(expandedIds ?? []),\n rootNodes: [],\n expandedNodes: [],\n nodes: [],\n nodesReady: false,\n projection: null,\n }),\n [expandedIds, selectedIds],\n );\n\n const [treeState, updateTreeState] = useReducer(reducer, initialState);\n const [, startTransition] = useTransition();\n\n const [offset, setOffset] = useState<Nullable<number>>(null);\n const [overId, setOverId] = useState<Nullable<string>>(null);\n const [activeId, setActiveId] = useState<Nullable<string>>(null);\n const [currentPosition, setCurrentPosition] =\n useState<Nullable<{ overId: string; parentId: Nullable<string> }>>(null);\n\n useEffect(() => {\n const keyDownHandler = (event: globalThis.KeyboardEvent) => {\n if (multiselect && (event.key === 'Meta' || event.ctrlKey)) {\n updateTreeState({\n type: 'SET_SELECTION_MODE',\n payload: { selectionMode: 'multiselect' },\n });\n }\n };\n\n const keyUpHandler = (event: globalThis.KeyboardEvent) => {\n if (multiselect && (event.key === 'Meta' || event.ctrlKey)) {\n updateTreeState({\n type: 'SET_SELECTION_MODE',\n payload: { selectionMode: 'single' },\n });\n }\n };\n\n if (multiselect) {\n window.addEventListener('keydown', keyDownHandler);\n window.addEventListener('keyup', keyUpHandler);\n }\n\n return () => {\n window.removeEventListener('keydown', keyDownHandler);\n window.removeEventListener('keyup', keyUpHandler);\n };\n }, [multiselect]);\n\n const registerOverlay = useCallback((overlay: Overlay) => {\n updateTreeState({ type: 'REGISTER_OVERLAY_ITEM', payload: overlay });\n }, []);\n\n const registerNodeChildren = useCallback((payload: RegisterNodeChildrenPayload) => {\n updateTreeState({ type: 'REGISTER_NODE_CHILDREN', payload });\n }, []);\n\n const unregisterNodeChildren = useCallback((payload: string) => {\n updateTreeState({ type: 'UNREGISTER_NODE_CHILDREN', payload });\n }, []);\n\n const handleSelect = useCallback(\n (id: string) => {\n onSelect(id);\n },\n [onSelect],\n );\n\n const handleExpand = useCallback(\n (id: string) => {\n if (onExpand) {\n return onExpand(id);\n }\n\n updateTreeState({\n type: 'EXPAND_NODE',\n payload: id,\n });\n },\n [onExpand],\n );\n\n const handleShrink = useCallback(\n (id: string) => {\n if (onShrink) {\n return onShrink(id);\n }\n\n updateTreeState({\n type: 'SHRINK_NODE',\n payload: id,\n });\n },\n [onShrink],\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n resetState();\n\n const { over, active } = event;\n\n if (!over?.id || !active?.id || !treeState.projection?.parentId) {\n return;\n }\n\n const activeNode = treeState.nodes.find((node) => node.props.id === active.id);\n const contentComponent = activeNode?.props?.contentComponent;\n\n onDrop?.({\n id: active.id.toString(),\n parentId: treeState.projection.parentId,\n sort: treeState.projection.position,\n contentComponent,\n });\n };\n\n const handleDragStart = ({ active: { id: activeId, data } }: TreeDragStartEvent) => {\n setActiveId(activeId);\n setOverId(activeId);\n\n if (activeId && data.current) {\n setCurrentPosition({\n parentId: data.current.parentId,\n overId: activeId,\n });\n }\n\n document.body.style.setProperty('cursor', 'grabbing');\n };\n\n const handleDragOver = ({ over }: TreeDragOverEvent) => {\n setOverId(over?.id ?? null);\n };\n\n const handleDragMove = ({ delta }: DragMoveEvent) => {\n setOffset(delta.x);\n };\n\n const handleDragCancel = () => {\n resetState();\n };\n\n const resetState = () => {\n setOverId(null);\n setActiveId(null);\n setOffset(0);\n setCurrentPosition(null);\n\n document.body.style.setProperty('cursor', 'default');\n };\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLUListElement>) => {\n const activeElement = document.activeElement;\n\n if (\n !activeElement?.parentElement ||\n activeElement.getAttribute('role') !== 'treeitem' ||\n !(activeElement instanceof HTMLLIElement)\n ) {\n return;\n }\n\n const items = Array.from(activeElement.parentElement.children).filter(\n (child) => child.nodeName === 'LI',\n ) as HTMLLIElement[];\n\n const currentIndex = items.indexOf(activeElement);\n\n const node = treeState.nodes[currentIndex];\n\n const id: string = node.props.id;\n const isExpanded = treeState.expandedIds.has(id);\n const parentId: string | undefined = node.props.parentId;\n const hasChildren = activeElement.getAttribute('data-has-children') === 'true';\n\n const { code } = event;\n\n const toggleSelect = () => {\n event.preventDefault();\n\n handleSelect(id);\n };\n\n const expandItem = () => {\n event.preventDefault();\n\n handleExpand(id);\n };\n\n const shrinkItem = () => {\n event.preventDefault();\n\n handleShrink(id);\n };\n\n const focusPrevious = () => {\n const previousIndex = (currentIndex + items.length - 1) % items.length;\n items[previousIndex].focus();\n };\n\n const focusNext = () => {\n const nextIndex = (currentIndex + 1) % items.length;\n items[nextIndex].focus();\n };\n\n switch (code) {\n case KeyboardCode.Enter:\n toggleSelect();\n\n break;\n\n case KeyboardCode.Space:\n hasChildren ? expandItem() : toggleSelect();\n\n break;\n\n case KeyboardCode.Right:\n if (!hasChildren) {\n break;\n }\n\n isExpanded ? focusNext() : expandItem();\n\n break;\n\n case KeyboardCode.Left:\n if (hasChildren && isExpanded) {\n shrinkItem();\n } else if (parentId && parentId !== ROOT_ID) {\n const parentIndex = treeState.nodes.findIndex((node) => node.props.id === parentId);\n\n items[parentIndex].focus();\n }\n break;\n\n case KeyboardCode.Up:\n event.preventDefault();\n focusPrevious();\n\n break;\n\n case KeyboardCode.Down:\n event.preventDefault();\n focusNext();\n\n break;\n\n default:\n break;\n }\n },\n [handleExpand, handleShrink, handleSelect, treeState.expandedIds, treeState.nodes],\n );\n\n const sensorContext: SensorContext = useRef({\n nodes: treeState.nodes,\n offset: offset ?? 0,\n });\n\n const [coordinateGetter] = useState(() => sortableTreeKeyboardCoordinates(sensorContext));\n\n const sensors = useSensors(useSensor(PointerSensor), useSensor(KeyboardSensor, { coordinateGetter }));\n\n const announcements: TreeAnnouncements = useMemo(() => {\n const getActiveTitle = (active: TreeActive) => {\n let title: string = active.id;\n\n const activeNode = treeState.nodes.find((node) => node.props.id === active.id);\n\n if (activeNode && isValidElement(activeNode.props.contentComponent)) {\n title = activeNode.props.contentComponent.props.title;\n } else if (activeNode && activeNode.props.label) {\n title = activeNode.props.label;\n }\n\n return title;\n };\n const getOverTitle = (over: TreeOver | null) => {\n let title = over?.id;\n\n const overNode = treeState.nodes.find((node) => node.props.id === over?.id);\n\n if (overNode && isValidElement(overNode.props.contentComponent)) {\n title = overNode.props.contentComponent.props.title;\n } else if (overNode && overNode.props.label) {\n title = overNode.props.label;\n }\n\n return title;\n };\n\n return {\n onDragStart({ active }) {\n return `Picked up ${getActiveTitle(active) || active.id}.`;\n },\n onDragMove({ active, over }) {\n return getMovementAnnouncement({\n eventName: 'onDragMove',\n activeId: active.id,\n activeTitle: getActiveTitle(active),\n overId: over?.id,\n overTitle: getOverTitle(over),\n treeState,\n setCurrentPosition,\n currentPosition,\n });\n },\n onDragOver({ active, over }) {\n return getMovementAnnouncement({\n eventName: 'onDragOver',\n activeId: active.id,\n activeTitle: getActiveTitle(active),\n overId: over?.id,\n overTitle: getOverTitle(over),\n treeState,\n setCurrentPosition,\n currentPosition,\n });\n },\n onDragEnd({ active, over }) {\n return getMovementAnnouncement({\n eventName: 'onDragEnd',\n activeId: active.id,\n activeTitle: getActiveTitle(active),\n overId: over?.id,\n overTitle: getOverTitle(over),\n treeState,\n setCurrentPosition,\n currentPosition,\n });\n },\n onDragCancel({ active }) {\n const title = getActiveTitle(active);\n\n return `Moving was cancelled. ${title} was dropped in its original position.`;\n },\n };\n }, [currentPosition, treeState]);\n\n useDeepCompareEffect(() => {\n if (!children) {\n return;\n }\n\n updateTreeState({\n type: 'REGISTER_ROOT_NODES',\n payload: recursivelyRemoveFragmentsAndEnrichChildren(children, { parentId: ROOT_ID, level: 0 }),\n });\n }, [children]);\n\n useDeepCompareEffect(() => {\n if (treeState.rootNodes.length === 0) {\n return;\n }\n\n startTransition(() => {\n const nodesToRender: { id: string; node: ReactElement }[] = [];\n for (const node of treeState.rootNodes) {\n const parentId = node.props.parentId;\n if (\n typeof parentId === 'string' &&\n (parentId === ROOT_ID ||\n (treeState.expandedIds.has(parentId) && nodesToRender.find((n) => n.id === parentId)))\n ) {\n nodesToRender.push({ id: node.props.id, node });\n }\n }\n\n updateTreeState({\n type: 'REGISTER_NODES',\n payload: nodesToRender.map((n) => n.node),\n });\n });\n }, [treeState.rootNodes, treeState.expandedIds]);\n\n useEffect(() => {\n updateTreeState({\n type: 'REPLACE_EXPANDED',\n payload: expandedIds ?? [],\n });\n }, [expandedIds]);\n\n useEffect(() => {\n updateTreeState({\n type: 'REPLACE_SELECTED',\n payload: selectedIds ?? [],\n });\n }, [selectedIds]);\n\n useDeepCompareEffect(() => {\n sensorContext.current = {\n nodes: treeState.nodes,\n offset: offset ?? 0,\n };\n }, [offset, treeState.nodes]);\n\n useEffect(() => {\n const projection =\n activeId && overId\n ? getProjection({\n nodes: treeState.nodes,\n activeId,\n overId,\n dragOffset: offset ?? 0,\n })\n : null;\n\n updateTreeState({\n type: 'SET_PROJECTION',\n payload: projection,\n });\n }, [activeId, offset, overId, treeState.nodes]);\n\n const { nodes, items } = useMemo(() => {\n return {\n items: treeState.nodes.map((node) => node.props.id),\n nodes: treeState.nodes.map((node) =>\n cloneElement(node, {\n treeDraggable: draggable,\n registerOverlay,\n onExpand: handleExpand,\n onShrink: handleShrink,\n onSelect: handleSelect,\n registerNodeChildren,\n unregisterNodeChildren,\n }),\n ),\n };\n }, [\n draggable,\n handleExpand,\n handleShrink,\n handleSelect,\n registerOverlay,\n treeState.nodes,\n registerNodeChildren,\n unregisterNodeChildren,\n ]);\n\n const contextValue: TreeContextProps = useMemo(\n () => ({\n treeState,\n onSelect: handleSelect,\n onExpand: handleExpand,\n onShrink: handleShrink,\n }),\n [treeState, handleSelect, handleExpand, handleShrink],\n );\n\n return (\n <TreeContext.Provider value={contextValue}>\n <ul\n id={id}\n role=\"tree\"\n data-test-id={dataTestId}\n onKeyDown={handleKeyDown}\n aria-multiselectable={treeState.selectionMode === 'multiselect'}\n className=\"tw-p-0 tw-m-0 tw-font-sans tw-font-normal tw-list-none tw-text-left tw-text-sm tw-select-none\"\n >\n <DndContext\n sensors={sensors}\n measuring={measuring}\n onDragEnd={handleDragEnd}\n onDragOver={handleDragOver}\n onDragMove={handleDragMove}\n onDragStart={handleDragStart}\n onDragCancel={handleDragCancel}\n accessibility={{\n announcements,\n container: document.getElementById(id)?.parentElement ?? document.body,\n }}\n collisionDetection={closestCorners}\n >\n <SortableContext items={items} strategy={verticalListSortingStrategy}>\n {nodes}\n </SortableContext>\n\n {createPortal(\n <DragOverlay\n zIndex={1500}\n wrapperElement=\"ul\"\n dropAnimation={null}\n modifiers={[restrictToWindowEdges]}\n >\n {treeState.overlay && (\n <TreeItemOverlay\n {...treeState.overlay}\n isSelected={treeState.selectedIds.has(treeState.overlay.id)}\n />\n )}\n </DragOverlay>,\n document.body,\n )}\n </DndContext>\n </ul>\n </TreeContext.Provider>\n );\n },\n);\n\nTree.displayName = 'FondueTree';\n"],"names":["measuring","MeasuringStrategy","enableMapSet","reducer","produce","draft","action","newExpanded","isEqual","getCurrentChildrenForNewNodesIfExpanded","parentId","children","findIndexById","currentChildrenIds","getNodeChildrenIds","newChildrenIds","node","currentNodesChanged","newChildren","updateNodeWithNewChildren","nodeIds","getReactNodeIdsInFlatArray","removeReactNodesFromFlatArray","Tree","memo","id","onDrop","onSelect","onExpand","onShrink","selectedIds","expandedIds","draggable","multiselect","dataTestId","initialState","useMemo","treeState","updateTreeState","useReducer","startTransition","useTransition","offset","setOffset","useState","overId","setOverId","activeId","setActiveId","currentPosition","setCurrentPosition","useEffect","keyDownHandler","event","keyUpHandler","registerOverlay","useCallback","overlay","registerNodeChildren","payload","unregisterNodeChildren","handleSelect","handleExpand","handleShrink","handleDragEnd","resetState","over","active","_a","activeNode","contentComponent","_b","handleDragStart","data","handleDragOver","handleDragMove","delta","handleDragCancel","handleKeyDown","activeElement","items","child","currentIndex","isExpanded","hasChildren","code","toggleSelect","expandItem","shrinkItem","focusPrevious","previousIndex","focusNext","nextIndex","KeyboardCode","ROOT_ID","parentIndex","sensorContext","useRef","coordinateGetter","sortableTreeKeyboardCoordinates","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","announcements","getActiveTitle","title","isValidElement","getOverTitle","overNode","getMovementAnnouncement","useDeepCompareEffect","recursivelyRemoveFragmentsAndEnrichChildren","nodesToRender","n","projection","getProjection","nodes","cloneElement","contextValue","React","TreeContext","DndContext","closestCorners","SortableContext","verticalListSortingStrategy","createPortal","DragOverlay","restrictToWindowEdges","TreeItemOverlay"],"mappings":"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"}
|