n8n-editor-ui
Version:
Workflow Editor UI for n8n
106 lines (105 loc) • 4.53 kB
JavaScript
import { C as computed, It as ref, J as onBeforeUnmount, P as defineComponent, T as createBlock, at as renderSlot, b as Teleport, bn as normalizeStyle, bt as withCtx, ct as resolveDynamicComponent, et as openBlock, p as vShow, vn as normalizeClass, w as createBaseVNode, xt as withDirectives } from "./vue.runtime.esm-bundler-tP5dCd7J.js";
import { t as __plugin_vue_export_helper_default } from "./_plugin-vue_export-helper-BwBpWJRZ.js";
import { Gi as isPresent } from "./builder.store-sBTWwxRU.js";
var Draggable_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "Draggable",
props: {
type: {},
data: { default: null },
tag: { default: "div" },
targetDataKey: { default: null },
disabled: {
type: Boolean,
default: false
},
canDrop: {
type: Boolean,
default: false
},
stickyPosition: { default: null }
},
emits: [
"drag",
"dragstart",
"dragend"
],
setup(__props, { emit: __emit }) {
const props = __props;
const emit = __emit;
const isDragging = ref(false);
const draggingElement = ref();
const draggablePosition = ref([0, 0]);
const animationFrameId = ref();
const draggableStyle = computed(() => ({ transform: `translate(${draggablePosition.value[0]}px, ${draggablePosition.value[1]}px)` }));
const onDragStart = (event) => {
if (props.disabled || event.buttons !== 1) return;
draggingElement.value = event.target;
if (props.targetDataKey && draggingElement.value.dataset?.target !== props.targetDataKey) draggingElement.value = draggingElement.value.closest(`[data-target="${props.targetDataKey}"]`);
if (props.targetDataKey && draggingElement.value?.dataset?.target !== props.targetDataKey) return;
event.preventDefault();
event.stopPropagation();
isDragging.value = false;
draggablePosition.value = [event.pageX, event.pageY];
window.addEventListener("mousemove", onDrag);
window.addEventListener("mouseup", onDragEnd);
const activeElement = document.activeElement;
if (activeElement) activeElement.blur();
};
const onDrag = (event) => {
event.preventDefault();
event.stopPropagation();
if (props.disabled) return;
if (!isDragging.value && draggingElement.value) {
isDragging.value = true;
const data = props.targetDataKey ? draggingElement.value.dataset.value : props.data ?? "";
emit("dragstart", draggingElement.value, data);
document.body.style.cursor = "grabbing";
}
animationFrameId.value = window.requestAnimationFrame(() => {
if (props.canDrop && props.stickyPosition) draggablePosition.value = props.stickyPosition;
else draggablePosition.value = [event.pageX, event.pageY];
emit("drag", draggablePosition.value);
});
};
const onDragEnd = () => {
if (props.disabled) return;
document.body.style.cursor = "unset";
window.removeEventListener("mousemove", onDrag);
window.removeEventListener("mouseup", onDragEnd);
if (isPresent(animationFrameId.value)) window.cancelAnimationFrame(animationFrameId.value);
setTimeout(() => {
if (draggingElement.value) emit("dragend", draggingElement.value);
isDragging.value = false;
draggingElement.value = void 0;
});
};
onBeforeUnmount(() => {
if (draggingElement.value) emit("dragend", draggingElement.value);
});
return (_ctx, _cache) => {
return openBlock(), createBlock(resolveDynamicComponent(_ctx.tag), {
ref: "wrapper",
class: normalizeClass({ [_ctx.$style.dragging]: isDragging.value }),
"data-test-id": "draggable",
onMousedown: onDragStart
}, {
default: withCtx(() => [renderSlot(_ctx.$slots, "default", { isDragging: isDragging.value }), (openBlock(), createBlock(Teleport, { to: "body" }, [withDirectives(createBaseVNode("div", {
ref: "draggable",
class: normalizeClass(_ctx.$style.draggable),
style: normalizeStyle(draggableStyle.value)
}, [renderSlot(_ctx.$slots, "preview", {
canDrop: _ctx.canDrop,
el: draggingElement.value
})], 6), [[vShow, isDragging.value]])]))]),
_: 3
}, 40, ["class"]);
};
}
});
var Draggable_vue_vue_type_style_index_0_lang_module_default = {
dragging: "_dragging_io9pp_123",
draggable: "_draggable_io9pp_128",
"draggable-data-transfer": "_draggable-data-transfer_io9pp_136"
};
var Draggable_default = /* @__PURE__ */ __plugin_vue_export_helper_default(Draggable_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": Draggable_vue_vue_type_style_index_0_lang_module_default }]]);
export { Draggable_default as t };