UNPKG

@formkit/drag-and-drop

Version:

Drag and drop package.

1 lines 5.39 kB
{"version":3,"sources":["../../src/solid/index.ts","../../src/solid/utils.ts"],"sourcesContent":["import {\n dragAndDrop as initParent,\n isBrowser,\n type ParentConfig,\n tearDown,\n} from \"../index\";\nimport {\n createSignal,\n type Accessor,\n type Setter,\n onCleanup,\n onMount,\n} from \"solid-js\";\nimport { createStore, Store } from \"solid-js/store\";\nimport type { SolidDragAndDropConfig, SolidState } from \"./types\";\nimport { handleSolidElements } from \"./utils\";\n\n/**\n * Global store for parent els to values.\n */\nconst parentValues: WeakMap<HTMLElement, SolidState<any>> = new WeakMap();\n\n/**\n * Returns the values of the parent element.\n *\n * @param parent - The parent element.\n *\n * @returns The values of the parent element.\n */\nfunction getValues<T>(parent: HTMLElement): Array<T> {\n const values = parentValues.get(parent);\n\n if (!values) {\n console.warn(\"No values found for parent element\");\n\n return [];\n }\n\n return (values[0] as Accessor<Array<T>>)();\n}\n\n/**\n * Sets the values of the parent element.\n *\n * @param parent - The parent element.\n *\n * @param newValues - The new values for the parent element.\n *\n * @returns void\n */\nfunction setValues(newValues: Array<any>, parent: HTMLElement): void {\n const currentValues = parentValues.get(parent);\n\n if (currentValues) currentValues[1](newValues);\n}\n\nfunction handleParent<E extends Accessor<HTMLElement | null> | HTMLElement, T>(\n config: Partial<SolidDragAndDropConfig<E, T[]>>,\n values: SolidState<T[]>\n) {\n return (el: HTMLElement) => {\n parentValues.set(el, values);\n\n initParent<T>({ parent: el, getValues, setValues, config });\n };\n}\n\nexport function dragAndDrop<E extends HTMLElement, I>(\n data:\n | SolidDragAndDropConfig<Accessor<E | null> | HTMLElement, I[]>\n | Array<SolidDragAndDropConfig<Accessor<E | null> | HTMLElement, I[]>>\n): void {\n if (!isBrowser) return;\n\n if (!Array.isArray(data)) data = [data];\n\n data.forEach((dnd) => {\n const { parent, state, ...rest } = dnd;\n\n handleSolidElements(parent, handleParent(rest, state));\n });\n}\n\n/**\n * Hook for adding drag and drop/sortable support to a list of items.\n *\n * @param initValues - Initial list of data.\n * @param options - The drag and drop configuration.\n * @returns\n */\nexport function useDragAndDrop<E extends HTMLElement, T = unknown>(\n initValues: T[],\n options: Partial<ParentConfig<T>> = {}\n): [\n Setter<E | null>,\n Accessor<Store<T[]>>,\n ReturnType<typeof createStore<T[]>>[1], // Return type of `createStore` will be changed in solid-js 2, so use `ReturnType` util here\n (config?: Partial<ParentConfig<T>>) => void\n] {\n const [parent, setParent] = createSignal<E | null>(null);\n\n const [values, setValues] = createStore(initValues);\n\n function updateConfig(config: Partial<ParentConfig<T>> = {}) {\n dragAndDrop({ parent, state: [() => values, setValues], ...config });\n }\n\n onMount(() =>\n dragAndDrop({ parent, state: [() => values, setValues], ...options })\n );\n onCleanup(() => {\n const p = parent();\n p && tearDown(p);\n });\n\n return [setParent, () => values, setValues, updateConfig];\n}\n","import { createEffect, on, type Accessor } from \"solid-js\";\n\n/**\n * Checks if the given parent is an HTMLElement.\n *\n * @param dnd - The drag and drop configuration.\n */\nexport function getEl<E>(\n parent: HTMLElement | Accessor<E | null>\n): HTMLElement | void {\n if (parent instanceof HTMLElement) return parent;\n else if (typeof parent !== 'function') return undefined;\n const p = parent();\n return p instanceof HTMLElement ? p : undefined;\n}\n\nexport function handleSolidElements<E>(\n element: HTMLElement | Accessor<E | null>,\n cb: (el: HTMLElement) => void\n): void {\n createEffect(on(() => getEl(element), (el) => el && cb(el)));\n}\n"],"mappings":";AAAA;AAAA,EACE,eAAe;AAAA,EACf;AAAA,EAEA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAGA;AAAA,EACA;AAAA,OACK;AACP,SAAS,mBAA0B;;;ACbnC,SAAS,cAAc,UAAyB;AAOzC,SAAS,MACd,QACoB;AACpB,MAAI,kBAAkB,YAAa,QAAO;AAAA,WACjC,OAAO,WAAW,WAAY,QAAO;AAC9C,QAAM,IAAI,OAAO;AACjB,SAAO,aAAa,cAAc,IAAI;AACxC;AAEO,SAAS,oBACd,SACA,IACM;AACN,eAAa,GAAG,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC;AAC7D;;;ADDA,IAAM,eAAsD,oBAAI,QAAQ;AASxE,SAAS,UAAa,QAA+B;AACnD,QAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,oCAAoC;AAEjD,WAAO,CAAC;AAAA,EACV;AAEA,SAAQ,OAAO,CAAC,EAAyB;AAC3C;AAWA,SAAS,UAAU,WAAuB,QAA2B;AACnE,QAAM,gBAAgB,aAAa,IAAI,MAAM;AAE7C,MAAI,cAAe,eAAc,CAAC,EAAE,SAAS;AAC/C;AAEA,SAAS,aACP,QACA,QACA;AACA,SAAO,CAAC,OAAoB;AAC1B,iBAAa,IAAI,IAAI,MAAM;AAE3B,eAAc,EAAE,QAAQ,IAAI,WAAW,WAAW,OAAO,CAAC;AAAA,EAC5D;AACF;AAEO,SAAS,YACd,MAGM;AACN,MAAI,CAAC,UAAW;AAEhB,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC,IAAI;AAEtC,OAAK,QAAQ,CAAC,QAAQ;AACpB,UAAM,EAAE,QAAQ,OAAO,GAAG,KAAK,IAAI;AAEnC,wBAAoB,QAAQ,aAAa,MAAM,KAAK,CAAC;AAAA,EACvD,CAAC;AACH;AASO,SAAS,eACd,YACA,UAAoC,CAAC,GAMrC;AACA,QAAM,CAAC,QAAQ,SAAS,IAAI,aAAuB,IAAI;AAEvD,QAAM,CAAC,QAAQA,UAAS,IAAI,YAAY,UAAU;AAElD,WAAS,aAAa,SAAmC,CAAC,GAAG;AAC3D,gBAAY,EAAE,QAAQ,OAAO,CAAC,MAAM,QAAQA,UAAS,GAAG,GAAG,OAAO,CAAC;AAAA,EACrE;AAEA;AAAA,IAAQ,MACN,YAAY,EAAE,QAAQ,OAAO,CAAC,MAAM,QAAQA,UAAS,GAAG,GAAG,QAAQ,CAAC;AAAA,EACtE;AACA,YAAU,MAAM;AACd,UAAM,IAAI,OAAO;AACjB,SAAK,SAAS,CAAC;AAAA,EACjB,CAAC;AAED,SAAO,CAAC,WAAW,MAAM,QAAQA,YAAW,YAAY;AAC1D;","names":["setValues"]}