@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 _, useEffect as M, useCallback as m, useRef as Ce, cloneElement as Re, isValidElement as z } from "react";
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 _e, produce as xe } from "immer";
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
- _e();
24
- const qe = xe((o, d) => {
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: x = !1,
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] = _(null), [A, P] = _(null), [k, F] = _(null), [b, w] = _(null);
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
- x && (t.key === "Meta" || t.ctrlKey) && l({
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
- x && (t.key === "Meta" || t.ctrlKey) && l({
121
+ _ && (t.key === "Meta" || t.ctrlKey) && l({
122
122
  type: "SET_SELECTION_MODE",
123
123
  payload: { selectionMode: "single" }
124
124
  });
125
125
  };
126
- return x && (window.addEventListener("keydown", e), window.addEventListener("keyup", s)), () => {
126
+ return _ && (window.addEventListener("keydown", e), window.addEventListener("keyup", s)), () => {
127
127
  window.removeEventListener("keydown", e), window.removeEventListener("keyup", s);
128
128
  };
129
- }, [x]);
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] = _(() => $e(B)), ce = Me(Z(Ae), Z(Pe, { coordinateGetter: pe })), Ee = L(() => {
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(Ge, { wrapperElement: "ul", dropAnimation: null, modifiers: [Oe] }, n.overlay && /* @__PURE__ */ S.createElement(
398
- Be,
397
+ /* @__PURE__ */ S.createElement(
398
+ Ge,
399
399
  {
400
- ...n.overlay,
401
- isSelected: n.selectedIds.has(n.overlay.id)
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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"}