UNPKG

alinea

Version:
1,216 lines (1,202 loc) 58.4 kB
import { dist_default } from "../../chunks/chunk-A5O3N2GS.js"; import { useAtomValue } from "../../chunks/chunk-TOJF2G3X.js"; import "../../chunks/chunk-WJ67RR7S.js"; import "../../chunks/chunk-NZLE2WMY.js"; // node_modules/@headless-tree/core/lib/esm/utils.js function functionalUpdate(updater, input) { return typeof updater === "function" ? updater(input) : updater; } function makeStateUpdater(key, instance) { return (updater) => { instance.setState((old) => { return Object.assign(Object.assign({}, old), { [key]: functionalUpdate(updater, old[key]) }); }); }; } var poll = (fn, interval = 100, timeout = 1e3) => new Promise((resolve) => { let clear; const i = setInterval(() => { if (fn()) { resolve(); clearInterval(i); clearTimeout(clear); } }, interval); clear = setTimeout(() => { clearInterval(i); }, timeout); }); // node_modules/@headless-tree/core/lib/esm/features/tree/feature.js var __awaiter = function(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function(resolve) { resolve(value); }); } return new (P || (P = Promise))(function(resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var treeFeature = { key: "tree", getInitialState: (initialState) => Object.assign({ expandedItems: [], focusedItem: null }, initialState), getDefaultConfig: (defaultConfig, tree) => Object.assign({ setExpandedItems: makeStateUpdater("expandedItems", tree), setFocusedItem: makeStateUpdater("focusedItem", tree) }, defaultConfig), stateHandlerNames: { expandedItems: "setExpandedItems", focusedItem: "setFocusedItem" }, treeInstance: { getItemsMeta: ({ tree }) => { const { rootItemId } = tree.getConfig(); const { expandedItems } = tree.getState(); const flatItems = []; const expandedItemsSet = new Set(expandedItems); const recursiveAdd = (itemId, parentId, level, setSize, posInSet) => { var _a; flatItems.push({ itemId, level, index: flatItems.length, parentId, setSize, posInSet }); if (expandedItemsSet.has(itemId)) { const children2 = (_a = tree.retrieveChildrenIds(itemId)) !== null && _a !== void 0 ? _a : []; let i2 = 0; for (const childId of children2) { recursiveAdd(childId, itemId, level + 1, children2.length, i2++); } } }; const children = tree.retrieveChildrenIds(rootItemId); let i = 0; for (const itemId of children) { recursiveAdd(itemId, rootItemId, 0, children.length, i++); } return flatItems; }, // TODO memo getFocusedItem: ({ tree }) => { var _a, _b; return (_b = tree.getItemInstance((_a = tree.getState().focusedItem) !== null && _a !== void 0 ? _a : "")) !== null && _b !== void 0 ? _b : tree.getItems()[0]; }, focusNextItem: ({ tree }) => { var _a; const { index } = tree.getFocusedItem().getItemMeta(); const nextIndex = Math.min(index + 1, tree.getItems().length - 1); (_a = tree.getItems()[nextIndex]) === null || _a === void 0 ? void 0 : _a.setFocused(); }, focusPreviousItem: ({ tree }) => { var _a; const { index } = tree.getFocusedItem().getItemMeta(); const nextIndex = Math.max(index - 1, 0); (_a = tree.getItems()[nextIndex]) === null || _a === void 0 ? void 0 : _a.setFocused(); }, updateDomFocus: ({ tree }) => { setTimeout(() => __awaiter(void 0, void 0, void 0, function* () { var _a, _b; const focusedItem = tree.getFocusedItem(); (_b = (_a = tree.getConfig()).scrollToItem) === null || _b === void 0 ? void 0 : _b.call(_a, focusedItem); yield poll(() => focusedItem.getElement() !== null, 20); const focusedElement = focusedItem.getElement(); if (!focusedElement) return; focusedElement.focus(); })); }, // TODO add label parameter getContainerProps: ({ prev, tree }, treeLabel) => Object.assign(Object.assign({}, prev === null || prev === void 0 ? void 0 : prev()), { role: "tree", "aria-label": treeLabel !== null && treeLabel !== void 0 ? treeLabel : "", ref: tree.registerElement }), // relevant for hotkeys of this feature isSearchOpen: () => false }, itemInstance: { scrollTo: (_a, scrollIntoViewArg_1) => __awaiter(void 0, [_a, scrollIntoViewArg_1], void 0, function* ({ tree, item }, scrollIntoViewArg) { var _b, _c, _d; (_c = (_b = tree.getConfig()).scrollToItem) === null || _c === void 0 ? void 0 : _c.call(_b, item); yield poll(() => item.getElement() !== null, 20); (_d = item.getElement()) === null || _d === void 0 ? void 0 : _d.scrollIntoView(scrollIntoViewArg); }), getId: ({ itemId }) => itemId, getProps: ({ item, prev }) => { const itemMeta = item.getItemMeta(); return Object.assign(Object.assign({}, prev === null || prev === void 0 ? void 0 : prev()), { ref: item.registerElement, role: "treeitem", "aria-setsize": itemMeta.setSize, "aria-posinset": itemMeta.posInSet, "aria-selected": "false", "aria-label": item.getItemName(), "aria-level": itemMeta.level, tabIndex: item.isFocused() ? 0 : -1, onClick: (e) => { item.setFocused(); item.primaryAction(); if (e.ctrlKey || e.shiftKey || e.metaKey) { return; } if (!item.isFolder()) { return; } if (item.isExpanded()) { item.collapse(); } else { item.expand(); } } }); }, expand: ({ tree, item, itemId }) => { var _a; if (!item.isFolder()) { return; } if ((_a = tree.getState().loadingItemChildrens) === null || _a === void 0 ? void 0 : _a.includes(itemId)) { return; } tree.applySubStateUpdate("expandedItems", (expandedItems) => [ ...expandedItems, itemId ]); tree.rebuildTree(); }, collapse: ({ tree, item, itemId }) => { if (!item.isFolder()) { return; } tree.applySubStateUpdate("expandedItems", (expandedItems) => expandedItems.filter((id) => id !== itemId)); tree.rebuildTree(); }, getItemData: ({ tree, itemId }) => tree.retrieveItemData(itemId), equals: ({ item }, other) => item.getId() === (other === null || other === void 0 ? void 0 : other.getId()), isExpanded: ({ tree, itemId }) => tree.getState().expandedItems.includes(itemId), isDescendentOf: ({ item }, parentId) => { const parent = item.getParent(); return Boolean((parent === null || parent === void 0 ? void 0 : parent.getId()) === parentId || (parent === null || parent === void 0 ? void 0 : parent.isDescendentOf(parentId))); }, isFocused: ({ tree, item, itemId }) => tree.getState().focusedItem === itemId || tree.getState().focusedItem === null && item.getItemMeta().index === 0, isFolder: ({ tree, item }) => item.getItemMeta().level === -1 || tree.getConfig().isItemFolder(item), getItemName: ({ tree, item }) => { const config = tree.getConfig(); return config.getItemName(item); }, setFocused: ({ tree, itemId }) => { tree.applySubStateUpdate("focusedItem", itemId); }, primaryAction: ({ tree, item }) => { var _a, _b; return (_b = (_a = tree.getConfig()).onPrimaryAction) === null || _b === void 0 ? void 0 : _b.call(_a, item); }, getParent: ({ tree, item }) => item.getItemMeta().parentId ? tree.getItemInstance(item.getItemMeta().parentId) : void 0, getIndexInParent: ({ item }) => item.getItemMeta().posInSet, getChildren: ({ tree, itemId }) => tree.retrieveChildrenIds(itemId).map((id) => tree.getItemInstance(id)), getTree: ({ tree }) => tree, getItemAbove: ({ tree, item }) => tree.getItems()[item.getItemMeta().index - 1], getItemBelow: ({ tree, item }) => tree.getItems()[item.getItemMeta().index + 1] }, hotkeys: { focusNextItem: { hotkey: "ArrowDown", canRepeat: true, preventDefault: true, isEnabled: (tree) => { var _a, _b; return !((_b = (_a = tree.isSearchOpen) === null || _a === void 0 ? void 0 : _a.call(tree)) !== null && _b !== void 0 ? _b : false) && !tree.getState().dnd; }, // TODO what happens when the feature doesnt exist? proxy method still claims to exist handler: (e, tree) => { tree.focusNextItem(); tree.updateDomFocus(); } }, focusPreviousItem: { hotkey: "ArrowUp", canRepeat: true, preventDefault: true, isEnabled: (tree) => { var _a, _b; return !((_b = (_a = tree.isSearchOpen) === null || _a === void 0 ? void 0 : _a.call(tree)) !== null && _b !== void 0 ? _b : false) && !tree.getState().dnd; }, handler: (e, tree) => { tree.focusPreviousItem(); tree.updateDomFocus(); } }, expandOrDown: { hotkey: "ArrowRight", canRepeat: true, handler: (e, tree) => { const item = tree.getFocusedItem(); if (item.isExpanded() || !item.isFolder()) { tree.focusNextItem(); tree.updateDomFocus(); } else { item.expand(); } } }, collapseOrUp: { hotkey: "ArrowLeft", canRepeat: true, handler: (e, tree) => { var _a; const item = tree.getFocusedItem(); if ((!item.isExpanded() || !item.isFolder()) && item.getItemMeta().level !== 0) { (_a = item.getParent()) === null || _a === void 0 ? void 0 : _a.setFocused(); tree.updateDomFocus(); } else { item.collapse(); } } }, focusFirstItem: { hotkey: "Home", handler: (e, tree) => { var _a; (_a = tree.getItems()[0]) === null || _a === void 0 ? void 0 : _a.setFocused(); tree.updateDomFocus(); } }, focusLastItem: { hotkey: "End", handler: (e, tree) => { var _a; (_a = tree.getItems()[tree.getItems().length - 1]) === null || _a === void 0 ? void 0 : _a.setFocused(); tree.updateDomFocus(); } } } }; // node_modules/@headless-tree/core/lib/esm/core/build-static-instance.js var buildStaticInstance = (features, instanceType, buildOpts) => { const instance = {}; const finalize = () => { const opts = buildOpts(instance); featureLoop: for (let i = 0; i < features.length; i++) { const definition = features[i][instanceType]; if (!definition) continue featureLoop; methodLoop: for (const [key, method] of Object.entries(definition)) { if (!method) continue methodLoop; const prev = instance[key]; instance[key] = (...args) => { return method(Object.assign(Object.assign({}, opts), { prev }), ...args); }; } } }; return [instance, finalize]; }; // node_modules/@headless-tree/core/lib/esm/utilities/errors.js var throwError = (message) => Error(`Headless Tree: ${message}`); // node_modules/@headless-tree/core/lib/esm/core/create-tree.js var verifyFeatures = (features) => { var _a; const loadedFeatures = features === null || features === void 0 ? void 0 : features.map((feature) => feature.key); for (const feature of features !== null && features !== void 0 ? features : []) { const missingDependency = (_a = feature.deps) === null || _a === void 0 ? void 0 : _a.find((dep) => !(loadedFeatures === null || loadedFeatures === void 0 ? void 0 : loadedFeatures.includes(dep))); if (missingDependency) { throw throwError(`${feature.key} needs ${missingDependency}`); } } }; var compareFeatures = (originalOrder) => (feature1, feature2) => { var _a, _b; if (feature2.key && ((_a = feature1.overwrites) === null || _a === void 0 ? void 0 : _a.includes(feature2.key))) { return 1; } if (feature1.key && ((_b = feature2.overwrites) === null || _b === void 0 ? void 0 : _b.includes(feature1.key))) { return -1; } return originalOrder.indexOf(feature1) - originalOrder.indexOf(feature2); }; var sortFeatures = (features = []) => features.sort(compareFeatures(features)); var createTree = (initialConfig) => { var _a, _b, _c, _d; const buildInstance = (_a = initialConfig.instanceBuilder) !== null && _a !== void 0 ? _a : buildStaticInstance; const additionalFeatures = [ treeFeature, ...sortFeatures(initialConfig.features) ]; verifyFeatures(additionalFeatures); const features = [...additionalFeatures]; const [treeInstance, finalizeTree] = buildInstance(features, "treeInstance", (tree) => ({ tree })); let state = additionalFeatures.reduce((acc, feature) => { var _a2, _b2; return (_b2 = (_a2 = feature.getInitialState) === null || _a2 === void 0 ? void 0 : _a2.call(feature, acc, treeInstance)) !== null && _b2 !== void 0 ? _b2 : acc; }, (_c = (_b = initialConfig.initialState) !== null && _b !== void 0 ? _b : initialConfig.state) !== null && _c !== void 0 ? _c : {}); let config = additionalFeatures.reduce((acc, feature) => { var _a2, _b2; return (_b2 = (_a2 = feature.getDefaultConfig) === null || _a2 === void 0 ? void 0 : _a2.call(feature, acc, treeInstance)) !== null && _b2 !== void 0 ? _b2 : acc; }, initialConfig); const stateHandlerNames = additionalFeatures.reduce((acc, feature) => Object.assign(Object.assign({}, acc), feature.stateHandlerNames), {}); let treeElement; const treeDataRef = { current: {} }; const itemInstancesMap = {}; let itemInstances = []; const itemElementsMap = {}; const itemDataRefs = {}; let itemMetaMap = {}; const hotkeyPresets = {}; const rebuildItemMeta = () => { itemInstances = []; itemMetaMap = {}; const [rootInstance, finalizeRootInstance] = buildInstance(features, "itemInstance", (item) => ({ item, tree: treeInstance, itemId: config.rootItemId })); finalizeRootInstance(); itemInstancesMap[config.rootItemId] = rootInstance; itemMetaMap[config.rootItemId] = { itemId: config.rootItemId, index: -1, parentId: null, level: -1, posInSet: 0, setSize: 1 }; for (const item of treeInstance.getItemsMeta()) { itemMetaMap[item.itemId] = item; if (!itemInstancesMap[item.itemId]) { const [instance, finalizeInstance] = buildInstance(features, "itemInstance", (instance2) => ({ item: instance2, tree: treeInstance, itemId: item.itemId })); finalizeInstance(); itemInstancesMap[item.itemId] = instance; itemInstances.push(instance); } else { itemInstances.push(itemInstancesMap[item.itemId]); } } }; const eachFeature = (fn) => { for (const feature of additionalFeatures) { fn(feature); } }; const mainFeature = { key: "main", treeInstance: { getState: () => state, setState: ({}, updater) => { var _a2; (_a2 = config.setState) === null || _a2 === void 0 ? void 0 : _a2.call(config, state); }, applySubStateUpdate: ({}, stateName, updater) => { state[stateName] = typeof updater === "function" ? updater(state[stateName]) : updater; const externalStateSetter = config[stateHandlerNames[stateName]]; externalStateSetter === null || externalStateSetter === void 0 ? void 0 : externalStateSetter(state[stateName]); }, // TODO rebuildSubTree: (itemId: string) => void; rebuildTree: () => { var _a2; rebuildItemMeta(); (_a2 = config.setState) === null || _a2 === void 0 ? void 0 : _a2.call(config, state); }, getConfig: () => config, setConfig: (_, updater) => { var _a2, _b2, _c2; const newConfig = typeof updater === "function" ? updater(config) : updater; const hasChangedExpandedItems = ((_a2 = newConfig.state) === null || _a2 === void 0 ? void 0 : _a2.expandedItems) && ((_b2 = newConfig.state) === null || _b2 === void 0 ? void 0 : _b2.expandedItems) !== state.expandedItems; config = newConfig; if (newConfig.state) { state = Object.assign(Object.assign({}, state), newConfig.state); } if (hasChangedExpandedItems) { rebuildItemMeta(); (_c2 = config.setState) === null || _c2 === void 0 ? void 0 : _c2.call(config, state); } }, getItemInstance: ({}, itemId) => itemInstancesMap[itemId], getItems: () => itemInstances, registerElement: ({}, element) => { if (treeElement === element) { return; } if (treeElement && !element) { eachFeature((feature) => { var _a2; return (_a2 = feature.onTreeUnmount) === null || _a2 === void 0 ? void 0 : _a2.call(feature, treeInstance, treeElement); }); } else if (!treeElement && element) { eachFeature((feature) => { var _a2; return (_a2 = feature.onTreeMount) === null || _a2 === void 0 ? void 0 : _a2.call(feature, treeInstance, element); }); } treeElement = element; }, getElement: () => treeElement, getDataRef: () => treeDataRef, getHotkeyPresets: () => hotkeyPresets }, itemInstance: { registerElement: ({ itemId, item }, element) => { if (itemElementsMap[itemId] === element) { return; } const oldElement = itemElementsMap[itemId]; if (oldElement && !element) { eachFeature((feature) => { var _a2; return (_a2 = feature.onItemUnmount) === null || _a2 === void 0 ? void 0 : _a2.call(feature, item, oldElement, treeInstance); }); } else if (!oldElement && element) { eachFeature((feature) => { var _a2; return (_a2 = feature.onItemMount) === null || _a2 === void 0 ? void 0 : _a2.call(feature, item, element, treeInstance); }); } itemElementsMap[itemId] = element; }, getElement: ({ itemId }) => itemElementsMap[itemId], // eslint-disable-next-line no-return-assign getDataRef: ({ itemId }) => { var _a2; return (_a2 = itemDataRefs[itemId]) !== null && _a2 !== void 0 ? _a2 : itemDataRefs[itemId] = { current: {} }; }, getItemMeta: ({ itemId }) => itemMetaMap[itemId] } }; features.unshift(mainFeature); for (const feature of features) { Object.assign(hotkeyPresets, (_d = feature.hotkeys) !== null && _d !== void 0 ? _d : {}); } finalizeTree(); rebuildItemMeta(); return treeInstance; }; // node_modules/@headless-tree/core/lib/esm/features/selection/feature.js var selectionFeature = { key: "selection", getInitialState: (initialState) => Object.assign({ selectedItems: [] }, initialState), getDefaultConfig: (defaultConfig, tree) => Object.assign({ setSelectedItems: makeStateUpdater("selectedItems", tree) }, defaultConfig), stateHandlerNames: { selectedItems: "setSelectedItems" }, treeInstance: { setSelectedItems: ({ tree }, selectedItems) => { tree.applySubStateUpdate("selectedItems", selectedItems); }, getSelectedItems: ({ tree }) => { return tree.getState().selectedItems.map(tree.getItemInstance); } }, itemInstance: { select: ({ tree, itemId }) => { const { selectedItems } = tree.getState(); tree.setSelectedItems(selectedItems.includes(itemId) ? selectedItems : [...selectedItems, itemId]); }, deselect: ({ tree, itemId }) => { const { selectedItems } = tree.getState(); tree.setSelectedItems(selectedItems.filter((id) => id !== itemId)); }, isSelected: ({ tree, item }) => { const { selectedItems } = tree.getState(); return selectedItems.includes(item.getItemMeta().itemId); }, selectUpTo: ({ tree, item }, ctrl) => { const indexA = item.getItemMeta().index; const indexB = tree.getFocusedItem().getItemMeta().index; const [a, b] = indexA < indexB ? [indexA, indexB] : [indexB, indexA]; const newSelectedItems = tree.getItems().slice(a, b + 1).map((treeItem) => treeItem.getItemMeta().itemId); if (!ctrl) { tree.setSelectedItems(newSelectedItems); return; } const { selectedItems } = tree.getState(); const uniqueSelectedItems = [ .../* @__PURE__ */ new Set([...selectedItems, ...newSelectedItems]) ]; tree.setSelectedItems(uniqueSelectedItems); }, toggleSelect: ({ item }) => { if (item.isSelected()) { item.deselect(); } else { item.select(); } }, getProps: ({ tree, item, prev }) => Object.assign(Object.assign({}, prev === null || prev === void 0 ? void 0 : prev()), { "aria-selected": item.isSelected() ? "true" : "false", onClick: (e) => { var _a, _b; if (e.shiftKey) { item.selectUpTo(e.ctrlKey || e.metaKey); } else if (e.ctrlKey || e.metaKey) { item.toggleSelect(); } else { tree.setSelectedItems([item.getItemMeta().itemId]); } (_b = (_a = prev === null || prev === void 0 ? void 0 : prev()) === null || _a === void 0 ? void 0 : _a.onClick) === null || _b === void 0 ? void 0 : _b.call(_a, e); } }) }, hotkeys: { // setSelectedItem: { // hotkey: "space", // handler: (e, tree) => { // tree.setSelectedItems([tree.getFocusedItem().getId()]); // }, // }, toggleSelectedItem: { hotkey: "Control+Space", preventDefault: true, handler: (_, tree) => { tree.getFocusedItem().toggleSelect(); } }, selectUpwards: { hotkey: "Shift+ArrowUp", handler: (e, tree) => { const focused = tree.getFocusedItem(); const above = focused.getItemAbove(); if (!above) return; if (focused.isSelected() && above.isSelected()) { focused.deselect(); } else { above.select(); } above.setFocused(); tree.updateDomFocus(); } }, selectDownwards: { hotkey: "Shift+ArrowDown", handler: (e, tree) => { const focused = tree.getFocusedItem(); const below = focused.getItemBelow(); if (!below) return; if (focused.isSelected() && below.isSelected()) { focused.deselect(); } else { below.select(); } below.setFocused(); tree.updateDomFocus(); } }, selectAll: { hotkey: "Control+a", preventDefault: true, handler: (e, tree) => { tree.setSelectedItems(tree.getItems().map((item) => item.getId())); } } } }; // node_modules/@headless-tree/core/lib/esm/features/async-data-loader/feature.js var __awaiter2 = function(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function(resolve) { resolve(value); }); } return new (P || (P = Promise))(function(resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var asyncDataLoaderFeature = { key: "async-data-loader", getInitialState: (initialState) => Object.assign({ loadingItemData: [], loadingItemChildrens: [] }, initialState), getDefaultConfig: (defaultConfig, tree) => Object.assign({ setLoadingItemData: makeStateUpdater("loadingItemData", tree), setLoadingItemChildrens: makeStateUpdater("loadingItemChildrens", tree) }, defaultConfig), stateHandlerNames: { loadingItemData: "setLoadingItemData", loadingItemChildrens: "setLoadingItemChildrens" }, treeInstance: { waitForItemDataLoaded: (_a, itemId_1) => __awaiter2(void 0, [_a, itemId_1], void 0, function* ({ tree }, itemId) { tree.retrieveItemData(itemId); if (!tree.getState().loadingItemData.includes(itemId)) { return; } yield new Promise((resolve) => { var _a2, _b; var _c, _d; const dataRef = tree.getDataRef(); (_a2 = (_c = dataRef.current).awaitingItemDataLoading) !== null && _a2 !== void 0 ? _a2 : _c.awaitingItemDataLoading = {}; (_b = (_d = dataRef.current.awaitingItemDataLoading)[itemId]) !== null && _b !== void 0 ? _b : _d[itemId] = []; dataRef.current.awaitingItemDataLoading[itemId].push(resolve); }); }), waitForItemChildrenLoaded: (_a, itemId_1) => __awaiter2(void 0, [_a, itemId_1], void 0, function* ({ tree }, itemId) { tree.retrieveChildrenIds(itemId); if (!tree.getState().loadingItemChildrens.includes(itemId)) { return; } yield new Promise((resolve) => { var _a2, _b; var _c, _d; const dataRef = tree.getDataRef(); (_a2 = (_c = dataRef.current).awaitingItemChildrensLoading) !== null && _a2 !== void 0 ? _a2 : _c.awaitingItemChildrensLoading = {}; (_b = (_d = dataRef.current.awaitingItemChildrensLoading)[itemId]) !== null && _b !== void 0 ? _b : _d[itemId] = []; dataRef.current.awaitingItemChildrensLoading[itemId].push(resolve); }); }), retrieveItemData: ({ tree }, itemId) => { var _a, _b, _c, _d; var _e, _f; const config = tree.getConfig(); const dataRef = tree.getDataRef(); (_a = (_e = dataRef.current).itemData) !== null && _a !== void 0 ? _a : _e.itemData = {}; (_b = (_f = dataRef.current).childrenIds) !== null && _b !== void 0 ? _b : _f.childrenIds = {}; if (dataRef.current.itemData[itemId]) { return dataRef.current.itemData[itemId]; } if (!tree.getState().loadingItemData.includes(itemId)) { tree.applySubStateUpdate("loadingItemData", (loadingItemData) => [ ...loadingItemData, itemId ]); (() => __awaiter2(void 0, void 0, void 0, function* () { var _a2, _b2, _c2; const item = yield config.dataLoader.getItem(itemId); dataRef.current.itemData[itemId] = item; (_a2 = config.onLoadedItem) === null || _a2 === void 0 ? void 0 : _a2.call(config, itemId, item); tree.applySubStateUpdate("loadingItemData", (loadingItemData) => loadingItemData.filter((id) => id !== itemId)); (_b2 = dataRef.current.awaitingItemDataLoading) === null || _b2 === void 0 ? void 0 : _b2[itemId].forEach((cb) => cb()); (_c2 = dataRef.current.awaitingItemDataLoading) === null || _c2 === void 0 ? true : delete _c2[itemId]; }))(); } return (_d = (_c = config.createLoadingItemData) === null || _c === void 0 ? void 0 : _c.call(config)) !== null && _d !== void 0 ? _d : null; }, retrieveChildrenIds: ({ tree }, itemId) => { var _a; var _b; const config = tree.getConfig(); const dataRef = tree.getDataRef(); (_a = (_b = dataRef.current).childrenIds) !== null && _a !== void 0 ? _a : _b.childrenIds = {}; if (dataRef.current.childrenIds[itemId]) { return dataRef.current.childrenIds[itemId]; } if (tree.getState().loadingItemChildrens.includes(itemId)) { return []; } tree.applySubStateUpdate("loadingItemChildrens", (loadingItemChildrens) => [...loadingItemChildrens, itemId]); (() => __awaiter2(void 0, void 0, void 0, function* () { var _a2, _b2, _c, _d; const childrenIds = yield config.dataLoader.getChildren(itemId); dataRef.current.childrenIds[itemId] = childrenIds; (_a2 = config.onLoadedChildren) === null || _a2 === void 0 ? void 0 : _a2.call(config, itemId, childrenIds); tree.applySubStateUpdate("loadingItemChildrens", (loadingItemChildrens) => loadingItemChildrens.filter((id) => id !== itemId)); tree.rebuildTree(); (_c = (_b2 = dataRef.current.awaitingItemChildrensLoading) === null || _b2 === void 0 ? void 0 : _b2[itemId]) === null || _c === void 0 ? void 0 : _c.forEach((cb) => cb()); (_d = dataRef.current.awaitingItemChildrensLoading) === null || _d === void 0 ? true : delete _d[itemId]; }))(); return []; } }, itemInstance: { isLoading: ({ tree, item }) => tree.getState().loadingItemData.includes(item.getItemMeta().itemId) || tree.getState().loadingItemChildrens.includes(item.getItemMeta().itemId), invalidateItemData: ({ tree, itemId }) => { var _a; const dataRef = tree.getDataRef(); (_a = dataRef.current.itemData) === null || _a === void 0 ? true : delete _a[itemId]; tree.retrieveItemData(itemId); }, invalidateChildrenIds: ({ tree, itemId }) => { var _a; const dataRef = tree.getDataRef(); (_a = dataRef.current.childrenIds) === null || _a === void 0 ? true : delete _a[itemId]; tree.retrieveChildrenIds(itemId); }, updateCachedChildrenIds: ({ tree, itemId }, childrenIds) => { const dataRef = tree.getDataRef(); dataRef.current.childrenIds[itemId] = childrenIds; tree.rebuildTree(); } } }; // node_modules/@headless-tree/core/lib/esm/features/drag-and-drop/utils.js var ItemDropCategory; (function(ItemDropCategory2) { ItemDropCategory2[ItemDropCategory2["Item"] = 0] = "Item"; ItemDropCategory2[ItemDropCategory2["ExpandedFolder"] = 1] = "ExpandedFolder"; ItemDropCategory2[ItemDropCategory2["LastInGroup"] = 2] = "LastInGroup"; })(ItemDropCategory || (ItemDropCategory = {})); var PlacementType; (function(PlacementType2) { PlacementType2[PlacementType2["ReorderAbove"] = 0] = "ReorderAbove"; PlacementType2[PlacementType2["ReorderBelow"] = 1] = "ReorderBelow"; PlacementType2[PlacementType2["MakeChild"] = 2] = "MakeChild"; PlacementType2[PlacementType2["Reparent"] = 3] = "Reparent"; })(PlacementType || (PlacementType = {})); var canDrop = (dataTransfer, target, tree) => { var _a, _b, _c; const draggedItems = (_a = tree.getState().dnd) === null || _a === void 0 ? void 0 : _a.draggedItems; const config = tree.getConfig(); if (draggedItems && !((_c = (_b = config.canDrop) === null || _b === void 0 ? void 0 : _b.call(config, draggedItems, target)) !== null && _c !== void 0 ? _c : true)) { return false; } if (draggedItems && draggedItems.some((draggedItem) => target.item.getId() === draggedItem.getId() || target.item.isDescendentOf(draggedItem.getId()))) { return false; } if (!draggedItems && dataTransfer && config.canDropForeignDragObject && !config.canDropForeignDragObject(dataTransfer, target)) { return false; } return true; }; var getItemDropCategory = (item) => { if (item.isExpanded()) { return ItemDropCategory.ExpandedFolder; } const parent = item.getParent(); if (parent && item.getIndexInParent() === item.getItemMeta().setSize - 1) { return ItemDropCategory.LastInGroup; } return ItemDropCategory.Item; }; var getInsertionIndex = (children, childIndex, draggedItems) => { var _a; const numberOfDragItemsBeforeTarget = (_a = children.slice(0, childIndex).reduce((counter, child) => child && (draggedItems === null || draggedItems === void 0 ? void 0 : draggedItems.some((i) => i.getId() === child.getId())) ? ++counter : counter, 0)) !== null && _a !== void 0 ? _a : 0; return childIndex - numberOfDragItemsBeforeTarget; }; var getTargetPlacement = (e, item, tree, canMakeChild) => { var _a, _b, _c, _d, _e; const config = tree.getConfig(); if (!config.canReorder) { return canMakeChild ? { type: PlacementType.MakeChild } : { type: PlacementType.ReorderBelow }; } const bb = (_a = item.getElement()) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect(); const topPercent = bb ? (e.clientY - bb.top) / bb.height : 0.5; const leftPixels = bb ? e.clientX - bb.left : 0; const targetDropCategory = getItemDropCategory(item); const reorderAreaPercentage = !canMakeChild ? 0.5 : (_b = config.reorderAreaPercentage) !== null && _b !== void 0 ? _b : 0.3; const indent = (_c = config.indent) !== null && _c !== void 0 ? _c : 20; const makeChildType = canMakeChild ? PlacementType.MakeChild : PlacementType.ReorderBelow; if (targetDropCategory === ItemDropCategory.ExpandedFolder) { if (topPercent < reorderAreaPercentage) { return { type: PlacementType.ReorderAbove }; } return { type: makeChildType }; } if (targetDropCategory === ItemDropCategory.LastInGroup) { if (leftPixels < item.getItemMeta().level * indent) { if (topPercent < 0.5) { return { type: PlacementType.ReorderAbove }; } const minLevel = (_e = (_d = item.getItemBelow()) === null || _d === void 0 ? void 0 : _d.getItemMeta().level) !== null && _e !== void 0 ? _e : 0; return { type: PlacementType.Reparent, reparentLevel: Math.max(minLevel, Math.floor(leftPixels / indent)) }; } } if (topPercent < reorderAreaPercentage) { return { type: PlacementType.ReorderAbove }; } if (topPercent > 1 - reorderAreaPercentage) { return { type: PlacementType.ReorderBelow }; } return { type: makeChildType }; }; var getDragCode = (e, item, tree) => { const placement = getTargetPlacement(e, item, tree, true); return [ item.getId(), placement.type, placement.type === PlacementType.Reparent ? placement.reparentLevel : 0 ].join("__"); }; var getNthParent = (item, n) => { if (n === item.getItemMeta().level) { return item; } return getNthParent(item.getParent(), n); }; var getReparentTarget = (item, reparentLevel, draggedItems) => { const itemMeta = item.getItemMeta(); const reparentedTarget = getNthParent(item, reparentLevel - 1); const targetItemAbove = getNthParent(item, reparentLevel); const targetIndex = targetItemAbove.getIndexInParent() + 1; return { item: reparentedTarget, childIndex: targetIndex, insertionIndex: getInsertionIndex(reparentedTarget.getChildren(), targetIndex, draggedItems), dragLineIndex: itemMeta.index + 1, dragLineLevel: reparentLevel }; }; var getDragTarget = (e, item, tree, canReorder = tree.getConfig().canReorder) => { var _a; const draggedItems = (_a = tree.getState().dnd) === null || _a === void 0 ? void 0 : _a.draggedItems; const itemMeta = item.getItemMeta(); const parent = item.getParent(); const itemTarget = { item }; const parentTarget = parent ? { item: parent } : null; const canBecomeSibling = parentTarget && canDrop(e.dataTransfer, parentTarget, tree); const canMakeChild = canDrop(e.dataTransfer, itemTarget, tree); const placement = getTargetPlacement(e, item, tree, canMakeChild); if (!canReorder && parent && canBecomeSibling && placement.type !== PlacementType.MakeChild) { return parentTarget; } if (!canReorder && parent && !canBecomeSibling) { return getDragTarget(e, parent, tree, false); } if (!parent) { return itemTarget; } if (placement.type === PlacementType.MakeChild) { return itemTarget; } if (!canBecomeSibling) { return getDragTarget(e, parent, tree, false); } if (placement.type === PlacementType.Reparent) { return getReparentTarget(item, placement.reparentLevel, draggedItems); } const maybeAddOneForBelow = placement.type === PlacementType.ReorderAbove ? 0 : 1; const childIndex = item.getIndexInParent() + maybeAddOneForBelow; return { item: parent, dragLineIndex: itemMeta.index + maybeAddOneForBelow, dragLineLevel: itemMeta.level, childIndex, // TODO performance could be improved by computing this only when dragcode changed insertionIndex: getInsertionIndex(parent.getChildren(), childIndex, draggedItems) }; }; // node_modules/@headless-tree/core/lib/esm/features/drag-and-drop/feature.js var __awaiter3 = function(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function(resolve) { resolve(value); }); } return new (P || (P = Promise))(function(resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var dragAndDropFeature = { key: "drag-and-drop", deps: ["selection"], getDefaultConfig: (defaultConfig, tree) => Object.assign({ canDrop: (_, target) => target.item.isFolder(), canDropForeignDragObject: () => false, setDndState: makeStateUpdater("dnd", tree), canReorder: true }, defaultConfig), stateHandlerNames: { dnd: "setDndState" }, treeInstance: { getDragTarget: ({ tree }) => { var _a, _b; return (_b = (_a = tree.getState().dnd) === null || _a === void 0 ? void 0 : _a.dragTarget) !== null && _b !== void 0 ? _b : null; }, getDragLineData: ({ tree }) => { var _a, _b, _c, _d, _e, _f; const target = tree.getDragTarget(); const indent = ((_a = target === null || target === void 0 ? void 0 : target.item.getItemMeta().level) !== null && _a !== void 0 ? _a : 0) + 1; const treeBb = (_b = tree.getElement()) === null || _b === void 0 ? void 0 : _b.getBoundingClientRect(); if (!target || !treeBb || !("childIndex" in target)) return null; const leftOffset = target.dragLineLevel * ((_c = tree.getConfig().indent) !== null && _c !== void 0 ? _c : 1); const targetItem = tree.getItems()[target.dragLineIndex]; if (!targetItem) { const bb2 = (_e = (_d = tree.getItems()[target.dragLineIndex - 1]) === null || _d === void 0 ? void 0 : _d.getElement()) === null || _e === void 0 ? void 0 : _e.getBoundingClientRect(); if (bb2) { return { indent, top: bb2.bottom - treeBb.top, left: bb2.left + leftOffset - treeBb.left, width: bb2.width - leftOffset }; } } const bb = (_f = targetItem.getElement()) === null || _f === void 0 ? void 0 : _f.getBoundingClientRect(); if (bb) { return { indent, top: bb.top - treeBb.top, left: bb.left + leftOffset - treeBb.left, width: bb.width - leftOffset }; } return null; }, getDragLineStyle: ({ tree }, topOffset = -1, leftOffset = -8) => { const dragLine = tree.getDragLineData(); return dragLine ? { top: `${dragLine.top + topOffset}px`, left: `${dragLine.left + leftOffset}px`, width: `${dragLine.width - leftOffset}px`, pointerEvents: "none" // important to prevent capturing drag events } : { display: "none" }; }, getContainerProps: ({ prev }, treeLabel) => { const prevProps = prev === null || prev === void 0 ? void 0 : prev(treeLabel); return Object.assign(Object.assign({}, prevProps), { style: Object.assign(Object.assign({}, prevProps === null || prevProps === void 0 ? void 0 : prevProps.style), { position: "relative" }) }); } }, itemInstance: { getProps: ({ tree, item, prev }) => Object.assign(Object.assign({}, prev === null || prev === void 0 ? void 0 : prev()), { draggable: true, onDragStart: (e) => { var _a, _b, _c; const selectedItems = tree.getSelectedItems(); const items = selectedItems.includes(item) ? selectedItems : [item]; const config = tree.getConfig(); if (!selectedItems.includes(item)) { tree.setSelectedItems([item.getItemMeta().itemId]); } if (!((_b = (_a = config.canDrag) === null || _a === void 0 ? void 0 : _a.call(config, items)) !== null && _b !== void 0 ? _b : true)) { e.preventDefault(); return; } if (config.createForeignDragObject) { const { format, data } = config.createForeignDragObject(items); (_c = e.dataTransfer) === null || _c === void 0 ? void 0 : _c.setData(format, data); } tree.applySubStateUpdate("dnd", { draggedItems: items, draggingOverItem: tree.getFocusedItem() }); }, onDragOver: (e) => { var _a, _b, _c; const dataRef = tree.getDataRef(); const nextDragCode = getDragCode(e, item, tree); if (nextDragCode === dataRef.current.lastDragCode) { if (dataRef.current.lastAllowDrop) { e.preventDefault(); } return; } dataRef.current.lastDragCode = nextDragCode; const target = getDragTarget(e, item, tree); if (!((_a = tree.getState().dnd) === null || _a === void 0 ? void 0 : _a.draggedItems) && (!e.dataTransfer || !((_c = (_b = tree.getConfig()).canDropForeignDragObject) === null || _c === void 0 ? void 0 : _c.call(_b, e.dataTransfer, target)))) { dataRef.current.lastAllowDrop = false; return; } if (!canDrop(e.dataTransfer, target, tree)) { dataRef.current.lastAllowDrop = false; return; } tree.applySubStateUpdate("dnd", (state) => Object.assign(Object.assign({}, state), { dragTarget: target, draggingOverItem: item })); dataRef.current.lastAllowDrop = true; e.preventDefault(); }, onDragLeave: () => { const dataRef = tree.getDataRef(); dataRef.current.lastDragCode = "no-drag"; tree.applySubStateUpdate("dnd", (state) => Object.assign(Object.assign({}, state), { draggingOverItem: void 0, dragTarget: void 0 })); }, onDragEnd: (e) => { var _a, _b, _c, _d; const draggedItems = (_a = tree.getState().dnd) === null || _a === void 0 ? void 0 : _a.draggedItems; tree.applySubStateUpdate("dnd", null); if (((_b = e.dataTransfer) === null || _b === void 0 ? void 0 : _b.dropEffect) === "none" || !draggedItems) { return; } (_d = (_c = tree.getConfig()).onCompleteForeignDrop) === null || _d === void 0 ? void 0 : _d.call(_c, draggedItems); }, onDrop: (e) => __awaiter3(void 0, void 0, void 0, function* () { var _a, _b, _c; const dataRef = tree.getDataRef(); const target = getDragTarget(e, item, tree); if (!canDrop(e.dataTransfer, target, tree)) { return; } e.preventDefault(); const config = tree.getConfig(); const draggedItems = (_a = tree.getState().dnd) === null || _a === void 0 ? void 0 : _a.draggedItems; dataRef.current.lastDragCode = void 0; tree.applySubStateUpdate("dnd", null); if (draggedItems) { yield (_b = config.onDrop) === null || _b === void 0 ? void 0 : _b.call(config, draggedItems, target); } else if (e.dataTransfer) { yield (_c = config.onDropForeignDragObject) === null || _c === void 0 ? void 0 : _c.call(config, e.dataTransfer, target); } }) }), isDragTarget: ({ tree, item }) => { const target = tree.getDragTarget(); return target ? target.item.getId() === item.getId() : false; }, isDragTargetAbove: ({ tree, item }) => { const target = tree.getDragTarget(); if (!target || !("childIndex" in target) || target.item !== item.getParent()) return false; return target.childIndex === item.getItemMeta().posInSet; }, isDragTargetBelow: ({ tree, item }) => { const target = tree.getDragTarget(); if (!target || !("childIndex" in target) || target.item !== item.getParent()) return false; return target.childIndex - 1 === item.getItemMeta().posInSet; }, isDraggingOver: ({ tree, item }) => { var _a, _b; return ((_b = (_a = tree.getState().dnd) === null || _a === void 0 ? void 0 : _a.draggingOverItem) === null || _b === void 0 ? void 0 : _b.getId()) === item.getId(); } } }; // node_modules/@headless-tree/core/lib/esm/features/prop-memoization/feature.js var memoize = (props, dataRef) => { var _a; (_a = dataRef.memoizedProps) !== null && _a !== void 0 ? _a : dataRef.memoizedProps = {}; for (const key in props) { if (typeof props[key] === "function") { if (key in dataRef.memoizedProps) { props[key] = dataRef.memoizedProps[key]; } else { dataRef.memoizedProps[key] = props[key]; } } } return props; }; var propMemoizationFeature = { key: "prop-memoization", overwrites: [ "main", "async-data-loader", "sync-data-loader", "drag-and-drop", "expand-all", "hotkeys-core", "renaming", "search", "selection" ], treeInstance: { getContainerProps: ({ tree, prev }, treeLabel) => { var _a; const dataRef = tree.getDataRef(); const props = (_a = prev === null || prev === void 0 ? void 0 : prev(treeLabel)) !== null && _a !== void 0 ? _a : {}; return memoize(props, dataRef.current); } }, itemInstance: { getProps: ({ item, prev }) => { var _a; const dataRef = item.getDataRef(); const props = (_a = prev === null || prev === void 0 ? void 0 : prev()) !== null && _a !== void 0 ? _a : {}; return memoize(props, dataRef.current); } } }; // node_modules/@headless-tree/react/lib/esm/use-tree.js import { useState } from "react"; var useTree = (config) => { const [tree] = useState(() => ({ current: createTree(config) })); const [state, setState] = useState(() => tree.current.getState()); tree.current.setConfig((prev) => Object.assign(Object.assign(Object.assign({}, prev), config), { state: Object.assign(Object.assign({}, state), config.state), setState: (state2) => { var _a; setState(state2); (_a = config.setState) === null || _a === void 0 ? void 0 : _a.call(config, state2); } })); return tree.current; }; // src/dashboard/view/EntryTree.tsx import { IndexEvent } from "alinea/core/db/IndexEvent"; import { getType } from "alinea/core/Internal"; import { assert } from "alinea/core/util/Assert"; import { debounce } from "alinea/core/util/Debounce"; import { Icon, px } from "alinea/ui"; import { IcOutlineArchive } from "alinea/ui/icons/IcOutlineArchive"; import { IcRoundEdit } from "alinea/ui/icons/IcRoundEdit"; import { IcRoundKeyboardArrowDown } from "alinea/ui/icons/IcRoundKeyboardArrowDown"; import { IcRoundKeyboardArrowRight } from "alinea/ui/icons/IcRoundKeyboardArrowRight"; import { IcRoundTranslate } from "alinea/ui/icons/IcRoundTranslate"; import { IcTwotoneDescription } from "alinea/ui/icons/IcTwotoneDescription"; import { IcTwotoneFolder } from "alinea/ui/icons/IcTwotoneFolder"; import { RiFlashlightFill } from "alinea/ui/icons/RiFlashlightFill"; import { forwardRef, memo, useEffect, useLayoutEffect, useMemo, useRef } from "react"; import { dbAtom } from "../atoms/DbAtoms.js"; import { ROOT_ID, useEntryTreeProvider } from "../atoms/EntryAtoms.js"; import { useConfig } from "../hook/UseConfig.js"; import { useLocale } from "../hook/UseLocale.js"; import { useNav } from "../hook/UseNav.js"; import { useRoot } from "../hook/UseRoot.js"; import { useNavigate } from "../util/HashRouter.js"; // src/dashboard/view/EntryTree.module.scss var EntryTree_module_default = { "tree": "alinea-EntryTree-tree", "tree-item": "alinea-EntryTree-tree-item", "treeItem": "alinea-EntryTree-tree-item", "tree-item-icon": "alinea-EntryTree-tree-item-icon", "treeItemIcon": "alinea-EntryTree-tree-item-icon", "is-drop": "alinea-EntryTree-is-drop", "isDrop": "alinea-EntryTree-is-drop", "is-dropAbove": "alinea-EntryTree-is-dropAbove", "isDropAbove": "alinea-EntryTree-is-dropAbove", "is-dropBelow": "alinea-EntryTree-is-dropBelow", "isDropBelow": "alinea-EntryTree-is-dropBelow", "is-selected": "alinea-EntryTree-is-selected", "isSelected": "alinea-EntryTree-is-selected", "tree-item-label-itemName": "alinea-EntryTree-tree-item-label-itemName", "treeItemLabelItemName": "alinea-EntryTree-tree-item-label-itemName", "is-parentSelected": "alinea-EntryTree-is-parentSelected", "isParentSelected": "alinea-EntryTree-is-parentSelected", "is-archived": "alinea-EntryTree-is-archived", "isArchived": "alinea-EntryTree-is-archived", "is-unpublished": "alinea-EntryTree-is-unpublished", "isUnpublished": "alinea-EntryTree-is-unpublished", "is-untranslated": "alinea-EntryTree-is-untranslated", "isUntranslated": "alinea-EntryTree-is-untranslated", "tree-item-label": "alinea-EntryTree-tree-item-label", "treeItemLabel": "alinea-EntryTree-tree-item-label", "tree-item-arrow": "alinea-EntryTree-tree-item-arrow", "treeItemArrow": "alinea-EntryTree-tree-item-arrow", "tree-title": "alinea-EntryTree-tree-title", "treeTitle": "alinea-EntryTree-tree-title", "tree-status": "alinea-EntryTree-tree-status", "treeStatus": "alinea-EntryTree-tree-status", "is-draft": "alinea-EntryTree-is-draft", "isDraft": "alinea-EntryTree-is-draft", "is-children": "alinea-EntryTree-is-children", "isChildren": "alinea-EntryTree-is-children" }; // src/dashboard/view/EntryTree.tsx import { Fragment, jsx, jsxs } from "react/jsx-runtime"; import { createElement } from "react"; var styles = dist_default(EntryTree_module_default); function selectedEntry(locale, item) { return item.entries.find((entry) => entry.locale === locale) ?? item.entries[0]; } var TreeItem