@react-querybuilder/dnd
Version:
Drag-and-drop-enabled version of react-querybuilder (DnD-library-agnostic)
1 lines • 14.8 kB
Source Map (JSON)
{"version":3,"file":"react-dnd-llotf5dK.mjs","names":[],"sources":["../src/isTouchDevice.ts","../src/adapters/react-dnd.tsx"],"sourcesContent":["/* v8 ignore file -- @preserve */\n/* oxlint-disable prefer-global-this */\n\nexport const isTouchDevice = (): boolean =>\n (typeof window !== 'undefined' && 'ontouchstart' in window) ||\n (typeof navigator !== 'undefined' && navigator.maxTouchPoints > 0);\n","import * as React from 'react';\nimport { useRef } from 'react';\nimport type { ConnectDragPreview, ConnectDragSource, useDrag as useDragOriginal } from 'react-dnd';\nimport type * as ReactDnD from 'react-dnd';\nimport type * as ReactDndHtml5Backend from 'react-dnd-html5-backend';\nimport type {\n DndDropTargetType,\n DragCollection,\n DraggedItem,\n DropCollection,\n DropResult,\n RuleGroupTypeAny,\n RuleType,\n} from 'react-querybuilder';\nimport { findPath } from 'react-querybuilder';\nimport type {\n AdapterUseInlineCombinatorDnDResult,\n AdapterUseRuleDnDResult,\n AdapterUseRuleGroupDnDResult,\n DndAdapter,\n DndAdapterInlineCombinatorDnDParams,\n DndAdapterProviderProps,\n DndAdapterRuleDnDParams,\n DndAdapterRuleGroupDnDParams,\n} from '../adapter';\nimport {\n buildDropResult,\n canDropOnInlineCombinator,\n canDropOnRule,\n canDropOnRuleGroup,\n handleDrop,\n} from '../dndLogic';\nimport { isHotkeyPressed } from '../isHotkeyPressed';\nimport { isTouchDevice } from '../isTouchDevice';\nimport type { DndProp } from '../types';\n\ntype ReactDndBackendFactory = typeof ReactDndHtml5Backend.HTML5Backend;\n\nlet emptyImage: HTMLImageElement;\n\nconst getEmptyImage = (): HTMLImageElement => {\n if (!emptyImage) {\n emptyImage = new Image();\n emptyImage.src = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n }\n return emptyImage;\n};\n\nconst ruleGroupAndRuleAccept: [DndDropTargetType, DndDropTargetType] = ['rule', 'ruleGroup'];\n\n// #region Internal hooks\n\nconst useRuleDragCommon = (\n params: DndAdapterRuleDnDParams | DndAdapterRuleGroupDnDParams,\n type: DndDropTargetType,\n useDrag: typeof useDragOriginal\n): [DragCollection, ConnectDragSource, ConnectDragPreview] =>\n useDrag<DraggedItem, DropResult, DragCollection>(\n () => ({\n type,\n item: () => ({\n ...findPath(params.path, params.schema.getQuery())!,\n path: params.path,\n qbId: params.schema.qbId,\n }),\n canDrag: !params.disabled,\n previewOptions: { captureDraggingState: !!params.hideDefaultDragPreview },\n collect: monitor => ({\n isDragging: !params.disabled && monitor.isDragging(),\n dragMonitorId: monitor.getHandlerId() ?? '',\n }),\n end: (item, monitor) => {\n handleDrop({\n item,\n dropResult: monitor.getDropResult(),\n schema: params.schema,\n actions: params.actions,\n copyModeModifierKey: params.copyModeModifierKey,\n groupModeModifierKey: params.groupModeModifierKey,\n onRuleDrop: params.onRuleDrop,\n });\n },\n }),\n [params.actions.groupRule, params.actions.moveRule, params.disabled, params.path]\n );\n\n// #endregion\n\n/**\n * Creates a {@link DndAdapter} backed by `react-dnd`.\n *\n * @example\n * ```tsx\n * import { QueryBuilderDnD } from '@react-querybuilder/dnd';\n * import { createReactDnDAdapter } from '@react-querybuilder/dnd/react-dnd';\n * import * as ReactDnD from 'react-dnd';\n * import * as ReactDnDHTML5Backend from 'react-dnd-html5-backend';\n *\n * const adapter = createReactDnDAdapter({ ...ReactDnD, ...ReactDnDHTML5Backend });\n *\n * <QueryBuilderDnD dnd={adapter}>\n * <QueryBuilder />\n * </QueryBuilderDnD>\n * ```\n *\n * @group DnD\n */\nexport const createReactDnDAdapter = (dndExports: DndProp): DndAdapter => {\n const {\n useDrag,\n useDrop,\n DndProvider: RDndProvider,\n DndContext,\n } = dndExports as typeof ReactDnD & DndProp;\n\n // Select backend: prefer touch on touch devices\n let backend: ReactDndBackendFactory | undefined = dndExports.ReactDndBackend;\n if (!backend) {\n // v8 ignore next -- jsdom unconditionally defines `window.ontouchstart`\n backend = isTouchDevice()\n ? (dndExports.TouchBackend ?? dndExports.HTML5Backend)\n : (dndExports.HTML5Backend ?? dndExports.TouchBackend);\n }\n\n const DndProvider = ({ debugMode, children }: DndAdapterProviderProps): React.JSX.Element => (\n <RDndProvider backend={backend!} debugMode={debugMode}>\n <DndContext.Consumer>{() => <>{children}</>}</DndContext.Consumer>\n </RDndProvider>\n );\n\n const useRuleDnD = (params: DndAdapterRuleDnDParams): AdapterUseRuleDnDResult => {\n const dndRef = useRef<HTMLDivElement>(null);\n const dragRef = useRef<HTMLSpanElement>(null);\n\n const [{ isDragging, dragMonitorId }, drag, preview] = useRuleDragCommon(\n params,\n 'rule',\n useDrag\n );\n\n const [{ isOver, dropMonitorId, dropEffect, groupItems, dropNotAllowed }, drop] = useDrop<\n DraggedItem,\n DropResult,\n DropCollection\n >(\n () => ({\n accept: ruleGroupAndRuleAccept,\n canDrop: dragging =>\n canDropOnRule({\n dragging,\n path: params.path,\n schema: params.schema,\n canDrop: params.canDrop,\n groupModeModifierKey: params.groupModeModifierKey,\n disabled: params.disabled,\n rule: params.rule,\n }),\n collect: monitor => ({\n dropNotAllowed: monitor.isOver() && !monitor.canDrop(),\n isOver: monitor.canDrop() && monitor.isOver(),\n dropMonitorId: monitor.getHandlerId() ?? '',\n dropEffect: isHotkeyPressed(params.copyModeModifierKey) ? 'copy' : 'move',\n groupItems: isHotkeyPressed(params.groupModeModifierKey),\n }),\n drop: () =>\n buildDropResult({\n type: 'rule',\n path: params.path,\n schema: params.schema,\n copyModeModifierKey: params.copyModeModifierKey,\n groupModeModifierKey: params.groupModeModifierKey,\n }),\n }),\n [\n params.disabled,\n params.actions.moveRule,\n params.path,\n params.canDrop,\n params.rule,\n params.schema,\n ]\n );\n\n React.useEffect(() => {\n drag(dragRef);\n drop(dndRef);\n preview(params.hideDefaultDragPreview ? getEmptyImage() : dndRef);\n }, [drag, drop, params.hideDefaultDragPreview, preview]);\n\n return {\n isDragging,\n dragMonitorId,\n isOver,\n dropMonitorId,\n dndRef,\n dragRef,\n dropEffect,\n groupItems,\n dropNotAllowed,\n };\n };\n\n const useRuleGroupDnD = (params: DndAdapterRuleGroupDnDParams): AdapterUseRuleGroupDnDResult => {\n const previewRef = useRef<HTMLDivElement>(null);\n const dragRef = useRef<HTMLSpanElement>(null);\n const dropRef = useRef<HTMLDivElement>(null);\n\n const [{ isDragging, dragMonitorId }, drag, preview] = useRuleDragCommon(\n params,\n 'ruleGroup',\n useDrag\n );\n\n const [{ isOver, dropMonitorId, dropEffect, groupItems, dropNotAllowed }, drop] = useDrop<\n DraggedItem,\n DropResult,\n DropCollection\n >(\n () => ({\n accept: ruleGroupAndRuleAccept,\n canDrop: dragging =>\n canDropOnRuleGroup({\n dragging,\n path: params.path,\n schema: params.schema,\n canDrop: params.canDrop,\n disabled: params.disabled,\n ruleGroup: params.ruleGroup,\n }),\n collect: monitor => ({\n dropNotAllowed: monitor.isOver() && !monitor.canDrop(),\n isOver: monitor.canDrop() && monitor.isOver(),\n dropMonitorId: monitor.getHandlerId() ?? '',\n dropEffect: isHotkeyPressed(params.copyModeModifierKey) ? 'copy' : 'move',\n groupItems: isHotkeyPressed(params.groupModeModifierKey),\n }),\n drop: () =>\n buildDropResult({\n type: 'ruleGroup',\n path: params.path,\n schema: params.schema,\n copyModeModifierKey: params.copyModeModifierKey,\n groupModeModifierKey: params.groupModeModifierKey,\n }),\n }),\n [\n params.disabled,\n params.actions.groupRule,\n params.actions.moveRule,\n params.path,\n params.canDrop,\n params.ruleGroup,\n params.schema,\n ]\n );\n\n React.useEffect(() => {\n if (params.path.length > 0) {\n drag(dragRef);\n preview(params.hideDefaultDragPreview ? getEmptyImage() : previewRef);\n }\n drop(dropRef);\n }, [drag, drop, params.hideDefaultDragPreview, params.path.length, preview]);\n\n return {\n isDragging,\n dragMonitorId,\n isOver,\n dropMonitorId,\n previewRef,\n dragRef,\n dropRef,\n dropEffect,\n groupItems,\n dropNotAllowed,\n };\n };\n\n const useInlineCombinatorDnD = (\n params: DndAdapterInlineCombinatorDnDParams\n ): AdapterUseInlineCombinatorDnDResult => {\n const dropRef = useRef<HTMLDivElement>(null);\n\n // The \"hovering\" item is the rule or group which precedes this inline combinator.\n const hoveringItem = (params.rules ??\n /* v8 ignore start -- @preserve */ []) /* v8 ignore stop -- @preserve */[\n params.path.at(-1)! - 1\n ] as RuleType | RuleGroupTypeAny;\n\n const [{ isOver, dropMonitorId, dropEffect, dropNotAllowed }, drop] = useDrop<\n DraggedItem,\n DropResult,\n DropCollection\n >(\n () => ({\n accept: ['rule', 'ruleGroup'] as DndDropTargetType[],\n canDrop: dragging =>\n canDropOnInlineCombinator({\n dragging,\n path: params.path,\n schema: params.schema,\n canDrop: params.canDrop,\n groupModeModifierKey: params.groupModeModifierKey,\n hoveringItem,\n }),\n collect: monitor => ({\n dropNotAllowed: monitor.isOver() && !monitor.canDrop(),\n isOver: monitor.canDrop() && monitor.isOver(),\n dropMonitorId: monitor.getHandlerId() ?? '',\n dropEffect: isHotkeyPressed(params.copyModeModifierKey) ? 'copy' : 'move',\n groupItems: isHotkeyPressed(params.groupModeModifierKey),\n }),\n drop: () =>\n buildDropResult({\n type: 'inlineCombinator',\n path: params.path,\n schema: params.schema,\n copyModeModifierKey: params.copyModeModifierKey,\n groupModeModifierKey: params.groupModeModifierKey,\n }),\n }),\n [params.canDrop, hoveringItem, params.path, params.schema]\n );\n\n drop(dropRef);\n\n return { dropRef, dropMonitorId, isOver, dropEffect, dropNotAllowed };\n };\n\n return {\n DndProvider,\n useRuleDnD,\n useRuleGroupDnD,\n useInlineCombinatorDnD,\n };\n};\n"],"mappings":"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"}