| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- import { ComponentStructure } from "./componentStructure";
- import { isHtmlTag, isTransition } from "../util/tags";
- import { resolveComponent, TransitionGroup } from "vue";
- function getSlot(slots, key) {
- const slotValue = slots[key];
- return slotValue ? slotValue() : [];
- }
- function computeNodes({ $slots, realList, getKey }) {
- const normalizedList = realList || [];
- const [header, footer] = ["header", "footer"].map(name =>
- getSlot($slots, name)
- );
- const { item } = $slots;
- if (!item) {
- throw new Error("draggable element must have an item slot");
- }
- const defaultNodes = normalizedList.flatMap((element, index) =>
- item({ element, index }).map(node => {
- node.key = getKey(element);
- node.props = { ...(node.props || {}), "data-draggable": true };
- return node;
- })
- );
- if (defaultNodes.length !== normalizedList.length) {
- throw new Error("Item slot must have only one child");
- }
- return {
- header,
- footer,
- default: defaultNodes
- };
- }
- function getRootInformation(tag) {
- const transition = isTransition(tag);
- const externalComponent = !isHtmlTag(tag) && !transition;
- return {
- transition,
- externalComponent,
- tag: externalComponent
- ? resolveComponent(tag)
- : transition
- ? TransitionGroup
- : tag
- };
- }
- function computeComponentStructure({ $slots, tag, realList, getKey }) {
- const nodes = computeNodes({ $slots, realList, getKey });
- const root = getRootInformation(tag);
- return new ComponentStructure({ nodes, root, realList });
- }
- export { computeComponentStructure };
|