@react-querybuilder/dnd
Version:
Drag-and-drop-enabled version of react-querybuilder (DnD-library-agnostic)
268 lines (267 loc) • 8.69 kB
JavaScript
import { c as isHotkeyPressed, i as canDropOnRuleGroup, n as canDropOnInlineCombinator, o as handleDrop, r as canDropOnRule, s as _objectSpread2, t as buildDropResult } from "./dndLogic-CX9kFh1l.js";
import * as React from "react";
import { useRef } from "react";
import { findPath } from "react-querybuilder";
//#region src/isTouchDevice.ts
/* v8 ignore file -- @preserve */
const isTouchDevice = () => typeof window !== "undefined" && "ontouchstart" in window || typeof navigator !== "undefined" && navigator.maxTouchPoints > 0;
//#endregion
//#region src/adapters/react-dnd.tsx
let emptyImage;
const getEmptyImage = () => {
if (!emptyImage) {
emptyImage = new Image();
emptyImage.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
}
return emptyImage;
};
const ruleGroupAndRuleAccept = ["rule", "ruleGroup"];
const useRuleDragCommon = (params, type, useDrag) => useDrag(() => ({
type,
item: () => _objectSpread2(_objectSpread2({}, findPath(params.path, params.schema.getQuery())), {}, {
path: params.path,
qbId: params.schema.qbId
}),
canDrag: !params.disabled,
previewOptions: { captureDraggingState: !!params.hideDefaultDragPreview },
collect: (monitor) => {
var _monitor$getHandlerId;
return {
isDragging: !params.disabled && monitor.isDragging(),
dragMonitorId: (_monitor$getHandlerId = monitor.getHandlerId()) !== null && _monitor$getHandlerId !== void 0 ? _monitor$getHandlerId : ""
};
},
end: (item, monitor) => {
handleDrop({
item,
dropResult: monitor.getDropResult(),
schema: params.schema,
actions: params.actions,
copyModeModifierKey: params.copyModeModifierKey,
groupModeModifierKey: params.groupModeModifierKey,
onRuleDrop: params.onRuleDrop
});
}
}), [
params.actions.groupRule,
params.actions.moveRule,
params.disabled,
params.path
]);
/**
* Creates a {@link DndAdapter} backed by `react-dnd`.
*
* @example
* ```tsx
* import { QueryBuilderDnD } from '@react-querybuilder/dnd';
* import { createReactDnDAdapter } from '@react-querybuilder/dnd/react-dnd';
* import * as ReactDnD from 'react-dnd';
* import * as ReactDnDHTML5Backend from 'react-dnd-html5-backend';
*
* const adapter = createReactDnDAdapter({ ...ReactDnD, ...ReactDnDHTML5Backend });
*
* <QueryBuilderDnD dnd={adapter}>
* <QueryBuilder />
* </QueryBuilderDnD>
* ```
*
* @group DnD
*/
const createReactDnDAdapter = (dndExports) => {
const { useDrag, useDrop, DndProvider: RDndProvider, DndContext } = dndExports;
let backend = dndExports.ReactDndBackend;
if (!backend) {
var _dndExports$TouchBack, _dndExports$HTML5Back;
// v8 ignore next -- jsdom unconditionally defines `window.ontouchstart`
backend = isTouchDevice() ? (_dndExports$TouchBack = dndExports.TouchBackend) !== null && _dndExports$TouchBack !== void 0 ? _dndExports$TouchBack : dndExports.HTML5Backend : (_dndExports$HTML5Back = dndExports.HTML5Backend) !== null && _dndExports$HTML5Back !== void 0 ? _dndExports$HTML5Back : dndExports.TouchBackend;
}
const DndProvider = ({ debugMode, children }) => /* @__PURE__ */ React.createElement(RDndProvider, {
backend,
debugMode
}, /* @__PURE__ */ React.createElement(DndContext.Consumer, null, () => /* @__PURE__ */ React.createElement(React.Fragment, null, children)));
const useRuleDnD = (params) => {
const dndRef = useRef(null);
const dragRef = useRef(null);
const [{ isDragging, dragMonitorId }, drag, preview] = useRuleDragCommon(params, "rule", useDrag);
const [{ isOver, dropMonitorId, dropEffect, groupItems, dropNotAllowed }, drop] = useDrop(() => ({
accept: ruleGroupAndRuleAccept,
canDrop: (dragging) => canDropOnRule({
dragging,
path: params.path,
schema: params.schema,
canDrop: params.canDrop,
groupModeModifierKey: params.groupModeModifierKey,
disabled: params.disabled,
rule: params.rule
}),
collect: (monitor) => {
var _monitor$getHandlerId2;
return {
dropNotAllowed: monitor.isOver() && !monitor.canDrop(),
isOver: monitor.canDrop() && monitor.isOver(),
dropMonitorId: (_monitor$getHandlerId2 = monitor.getHandlerId()) !== null && _monitor$getHandlerId2 !== void 0 ? _monitor$getHandlerId2 : "",
dropEffect: isHotkeyPressed(params.copyModeModifierKey) ? "copy" : "move",
groupItems: isHotkeyPressed(params.groupModeModifierKey)
};
},
drop: () => buildDropResult({
type: "rule",
path: params.path,
schema: params.schema,
copyModeModifierKey: params.copyModeModifierKey,
groupModeModifierKey: params.groupModeModifierKey
})
}), [
params.disabled,
params.actions.moveRule,
params.path,
params.canDrop,
params.rule,
params.schema
]);
React.useEffect(() => {
drag(dragRef);
drop(dndRef);
preview(params.hideDefaultDragPreview ? getEmptyImage() : dndRef);
}, [
drag,
drop,
params.hideDefaultDragPreview,
preview
]);
return {
isDragging,
dragMonitorId,
isOver,
dropMonitorId,
dndRef,
dragRef,
dropEffect,
groupItems,
dropNotAllowed
};
};
const useRuleGroupDnD = (params) => {
const previewRef = useRef(null);
const dragRef = useRef(null);
const dropRef = useRef(null);
const [{ isDragging, dragMonitorId }, drag, preview] = useRuleDragCommon(params, "ruleGroup", useDrag);
const [{ isOver, dropMonitorId, dropEffect, groupItems, dropNotAllowed }, drop] = useDrop(() => ({
accept: ruleGroupAndRuleAccept,
canDrop: (dragging) => canDropOnRuleGroup({
dragging,
path: params.path,
schema: params.schema,
canDrop: params.canDrop,
disabled: params.disabled,
ruleGroup: params.ruleGroup
}),
collect: (monitor) => {
var _monitor$getHandlerId3;
return {
dropNotAllowed: monitor.isOver() && !monitor.canDrop(),
isOver: monitor.canDrop() && monitor.isOver(),
dropMonitorId: (_monitor$getHandlerId3 = monitor.getHandlerId()) !== null && _monitor$getHandlerId3 !== void 0 ? _monitor$getHandlerId3 : "",
dropEffect: isHotkeyPressed(params.copyModeModifierKey) ? "copy" : "move",
groupItems: isHotkeyPressed(params.groupModeModifierKey)
};
},
drop: () => buildDropResult({
type: "ruleGroup",
path: params.path,
schema: params.schema,
copyModeModifierKey: params.copyModeModifierKey,
groupModeModifierKey: params.groupModeModifierKey
})
}), [
params.disabled,
params.actions.groupRule,
params.actions.moveRule,
params.path,
params.canDrop,
params.ruleGroup,
params.schema
]);
React.useEffect(() => {
if (params.path.length > 0) {
drag(dragRef);
preview(params.hideDefaultDragPreview ? getEmptyImage() : previewRef);
}
drop(dropRef);
}, [
drag,
drop,
params.hideDefaultDragPreview,
params.path.length,
preview
]);
return {
isDragging,
dragMonitorId,
isOver,
dropMonitorId,
previewRef,
dragRef,
dropRef,
dropEffect,
groupItems,
dropNotAllowed
};
};
const useInlineCombinatorDnD = (params) => {
var _params$rules;
const dropRef = useRef(null);
const hoveringItem = ((_params$rules = params.rules) !== null && _params$rules !== void 0 ? _params$rules :
/* v8 ignore start -- @preserve */ [])[params.path.at(-1) - 1];
const [{ isOver, dropMonitorId, dropEffect, dropNotAllowed }, drop] = useDrop(() => ({
accept: ["rule", "ruleGroup"],
canDrop: (dragging) => canDropOnInlineCombinator({
dragging,
path: params.path,
schema: params.schema,
canDrop: params.canDrop,
groupModeModifierKey: params.groupModeModifierKey,
hoveringItem
}),
collect: (monitor) => {
var _monitor$getHandlerId4;
return {
dropNotAllowed: monitor.isOver() && !monitor.canDrop(),
isOver: monitor.canDrop() && monitor.isOver(),
dropMonitorId: (_monitor$getHandlerId4 = monitor.getHandlerId()) !== null && _monitor$getHandlerId4 !== void 0 ? _monitor$getHandlerId4 : "",
dropEffect: isHotkeyPressed(params.copyModeModifierKey) ? "copy" : "move",
groupItems: isHotkeyPressed(params.groupModeModifierKey)
};
},
drop: () => buildDropResult({
type: "inlineCombinator",
path: params.path,
schema: params.schema,
copyModeModifierKey: params.copyModeModifierKey,
groupModeModifierKey: params.groupModeModifierKey
})
}), [
params.canDrop,
hoveringItem,
params.path,
params.schema
]);
drop(dropRef);
return {
dropRef,
dropMonitorId,
isOver,
dropEffect,
dropNotAllowed
};
};
return {
DndProvider,
useRuleDnD,
useRuleGroupDnD,
useInlineCombinatorDnD
};
};
//#endregion
export { isTouchDevice as n, createReactDnDAdapter as t };
//# sourceMappingURL=react-dnd-CuGO-Xxy.js.map