@underverse-ui/underverse 1.0.113 → 1.0.115
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api-reference.json +1 -1
- package/dist/index.cjs +324 -91
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +25 -1
- package/dist/index.d.ts +25 -1
- package/dist/index.js +340 -107
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -17475,6 +17475,7 @@ function OverlayControls({
|
|
|
17475
17475
|
|
|
17476
17476
|
// src/components/CategoryTreeSelect.tsx
|
|
17477
17477
|
var import_react22 = require("react");
|
|
17478
|
+
var import_react_virtual3 = require("@tanstack/react-virtual");
|
|
17478
17479
|
var import_lucide_react26 = require("lucide-react");
|
|
17479
17480
|
var import_jsx_runtime49 = require("react/jsx-runtime");
|
|
17480
17481
|
var defaultLabels = {
|
|
@@ -17488,6 +17489,7 @@ var TREE_NODE_INDENT_REM = 1;
|
|
|
17488
17489
|
var TREE_BRANCH_OFFSET_CLASS = "ml-1.5 pl-1.5";
|
|
17489
17490
|
var TREE_NODE_GAP_CLASS = "gap-1.5";
|
|
17490
17491
|
var TREE_EXPANDER_PLACEHOLDER_CLASS = "w-5";
|
|
17492
|
+
var CATEGORY_TREE_DROPDOWN_MAX_HEIGHT = 320;
|
|
17491
17493
|
function getAncestorPathIds(categories, targetId) {
|
|
17492
17494
|
const byId = new Map(categories.map((category) => [category.id, category]));
|
|
17493
17495
|
const expanded = /* @__PURE__ */ new Set();
|
|
@@ -17566,6 +17568,24 @@ function pruneAncestorSelection(categories, childrenMap, selected, fromCategoryI
|
|
|
17566
17568
|
function toCategoryOrderSelection(categories, selected) {
|
|
17567
17569
|
return categories.map((category) => category.id).filter((categoryId) => selected.has(categoryId));
|
|
17568
17570
|
}
|
|
17571
|
+
function flattenVisibleCategories(roots, childrenMap, expandedNodes, expandAllVisibleBranches) {
|
|
17572
|
+
const rows = [];
|
|
17573
|
+
const stack = roots.map((category) => ({ category, level: 0, path: /* @__PURE__ */ new Set() })).reverse();
|
|
17574
|
+
while (stack.length > 0) {
|
|
17575
|
+
const { category, level, path } = stack.pop();
|
|
17576
|
+
if (path.has(category.id)) continue;
|
|
17577
|
+
rows.push({ category, level });
|
|
17578
|
+
const children = childrenMap.get(category.id) ?? [];
|
|
17579
|
+
const isExpanded = children.length > 0 && (expandAllVisibleBranches || expandedNodes.has(category.id));
|
|
17580
|
+
if (!isExpanded) continue;
|
|
17581
|
+
const nextPath = new Set(path);
|
|
17582
|
+
nextPath.add(category.id);
|
|
17583
|
+
for (let index = children.length - 1; index >= 0; index -= 1) {
|
|
17584
|
+
stack.push({ category: children[index], level: level + 1, path: nextPath });
|
|
17585
|
+
}
|
|
17586
|
+
}
|
|
17587
|
+
return rows;
|
|
17588
|
+
}
|
|
17569
17589
|
function CategoryTreeSelect(props) {
|
|
17570
17590
|
const tv = useSmartTranslations("ValidationInput");
|
|
17571
17591
|
const {
|
|
@@ -17594,6 +17614,15 @@ function CategoryTreeSelect(props) {
|
|
|
17594
17614
|
className,
|
|
17595
17615
|
useOverlayScrollbar = false,
|
|
17596
17616
|
leafOnlySelect = false,
|
|
17617
|
+
virtualized = false,
|
|
17618
|
+
estimatedItemHeight = 44,
|
|
17619
|
+
overscan = 8,
|
|
17620
|
+
maxInitialOptions,
|
|
17621
|
+
searchMode = "auto",
|
|
17622
|
+
onSearchChange,
|
|
17623
|
+
searchDebounceMs = 0,
|
|
17624
|
+
minSearchLength = 0,
|
|
17625
|
+
showSearchPromptWhenEmptyQuery = false,
|
|
17597
17626
|
singleSelect = false
|
|
17598
17627
|
} = props;
|
|
17599
17628
|
const [isOpen, setIsOpen] = (0, import_react22.useState)(false);
|
|
@@ -17601,10 +17630,13 @@ function CategoryTreeSelect(props) {
|
|
|
17601
17630
|
() => getInitialExpandedNodes(categories, { defaultExpanded, defaultExpandedIds, expandToId, viewOnly, inline })
|
|
17602
17631
|
);
|
|
17603
17632
|
const [query, setQuery] = (0, import_react22.useState)("");
|
|
17633
|
+
const [activeIndex, setActiveIndex] = (0, import_react22.useState)(null);
|
|
17604
17634
|
const [localRequiredError, setLocalRequiredError] = (0, import_react22.useState)();
|
|
17605
17635
|
const searchInputRef = (0, import_react22.useRef)(null);
|
|
17606
17636
|
const dropdownViewportRef = (0, import_react22.useRef)(null);
|
|
17607
|
-
useOverlayScrollbarTarget(dropdownViewportRef, {
|
|
17637
|
+
useOverlayScrollbarTarget(dropdownViewportRef, {
|
|
17638
|
+
enabled: isOpen && useOverlayScrollbar && !virtualized && !inline && !viewOnly
|
|
17639
|
+
});
|
|
17608
17640
|
const autoId = (0, import_react22.useId)();
|
|
17609
17641
|
const resolvedId = id ? String(id) : `category-tree-select-${autoId}`;
|
|
17610
17642
|
const labelId = label ? `${resolvedId}-label` : void 0;
|
|
@@ -17624,7 +17656,7 @@ function CategoryTreeSelect(props) {
|
|
|
17624
17656
|
const parentCategories2 = [];
|
|
17625
17657
|
for (const cat of categories) byId2.set(cat.id, cat);
|
|
17626
17658
|
for (const cat of categories) {
|
|
17627
|
-
if (cat.parent_id == null) {
|
|
17659
|
+
if (cat.parent_id == null || !byId2.has(cat.parent_id)) {
|
|
17628
17660
|
parentCategories2.push(cat);
|
|
17629
17661
|
continue;
|
|
17630
17662
|
}
|
|
@@ -17633,12 +17665,19 @@ function CategoryTreeSelect(props) {
|
|
|
17633
17665
|
}
|
|
17634
17666
|
return { parentCategories: parentCategories2, childrenMap: childrenMap2, byId: byId2 };
|
|
17635
17667
|
}, [categories]);
|
|
17636
|
-
const isSearchEnabled = (0, import_react22.useMemo)(
|
|
17637
|
-
|
|
17668
|
+
const isSearchEnabled = (0, import_react22.useMemo)(
|
|
17669
|
+
() => enableSearch ?? (categories.length > 10 || searchMode === "manual" || minSearchLength > 0 || !!onSearchChange),
|
|
17670
|
+
[categories.length, enableSearch, minSearchLength, onSearchChange, searchMode]
|
|
17671
|
+
);
|
|
17672
|
+
const trimmedQuery = (0, import_react22.useMemo)(() => query.trim(), [query]);
|
|
17673
|
+
const normalizedQuery = (0, import_react22.useMemo)(() => trimmedQuery.toLowerCase(), [trimmedQuery]);
|
|
17674
|
+
const queryMeetsMinimum = trimmedQuery.length >= minSearchLength;
|
|
17675
|
+
const shouldPromptForSearch = minSearchLength > 0 && !queryMeetsMinimum && (searchMode === "manual" || showSearchPromptWhenEmptyQuery);
|
|
17638
17676
|
const isSearchMode = isSearchEnabled && normalizedQuery.length > 0;
|
|
17677
|
+
const shouldAutoExpandSearchResults = searchMode === "auto" && isSearchMode;
|
|
17639
17678
|
const effectiveExpandedNodes = (0, import_react22.useMemo)(() => getExpandedNodesState(expandedIds, expandedNodes), [expandedIds, expandedNodes]);
|
|
17640
17679
|
const visibleIds = (0, import_react22.useMemo)(() => {
|
|
17641
|
-
if (!isSearchMode) return null;
|
|
17680
|
+
if (shouldPromptForSearch || !isSearchMode || searchMode === "manual") return null;
|
|
17642
17681
|
const matches = categories.filter((c) => c.name.toLowerCase().includes(normalizedQuery));
|
|
17643
17682
|
if (matches.length === 0) return /* @__PURE__ */ new Set();
|
|
17644
17683
|
const visible = /* @__PURE__ */ new Set();
|
|
@@ -17675,7 +17714,14 @@ function CategoryTreeSelect(props) {
|
|
|
17675
17714
|
addDescendants(m.id);
|
|
17676
17715
|
}
|
|
17677
17716
|
return visible;
|
|
17678
|
-
}, [byId, categories, childrenMap, isSearchMode, normalizedQuery]);
|
|
17717
|
+
}, [byId, categories, childrenMap, isSearchMode, normalizedQuery, searchMode, shouldPromptForSearch]);
|
|
17718
|
+
(0, import_react22.useEffect)(() => {
|
|
17719
|
+
if (!onSearchChange) return;
|
|
17720
|
+
const timeoutId = window.setTimeout(() => {
|
|
17721
|
+
onSearchChange(trimmedQuery);
|
|
17722
|
+
}, Math.max(0, searchDebounceMs));
|
|
17723
|
+
return () => window.clearTimeout(timeoutId);
|
|
17724
|
+
}, [onSearchChange, searchDebounceMs, trimmedQuery]);
|
|
17679
17725
|
(0, import_react22.useEffect)(() => {
|
|
17680
17726
|
if (!isOpen) return;
|
|
17681
17727
|
if (!isSearchEnabled) return;
|
|
@@ -17688,7 +17734,7 @@ function CategoryTreeSelect(props) {
|
|
|
17688
17734
|
}
|
|
17689
17735
|
}, [disabled, required, valueArray.length]);
|
|
17690
17736
|
const toggleExpand = (id2) => {
|
|
17691
|
-
if (
|
|
17737
|
+
if (shouldAutoExpandSearchResults) return;
|
|
17692
17738
|
const newExpanded = new Set(effectiveExpandedNodes);
|
|
17693
17739
|
if (newExpanded.has(id2)) {
|
|
17694
17740
|
newExpanded.delete(id2);
|
|
@@ -17739,27 +17785,137 @@ function CategoryTreeSelect(props) {
|
|
|
17739
17785
|
onChange(toCategoryOrderSelection(categories, newSelected));
|
|
17740
17786
|
}
|
|
17741
17787
|
};
|
|
17742
|
-
const
|
|
17788
|
+
const effectiveParentCategories = (0, import_react22.useMemo)(() => {
|
|
17789
|
+
if (shouldPromptForSearch) return [];
|
|
17790
|
+
if (!isSearchMode || searchMode === "manual") return parentCategories;
|
|
17791
|
+
return parentCategories.filter((c) => visibleIds?.has(c.id));
|
|
17792
|
+
}, [isSearchMode, parentCategories, searchMode, shouldPromptForSearch, visibleIds]);
|
|
17793
|
+
const effectiveChildrenMap = (0, import_react22.useMemo)(() => {
|
|
17794
|
+
if (shouldPromptForSearch || !isSearchMode || !visibleIds || searchMode === "manual") return childrenMap;
|
|
17795
|
+
const nextChildrenMap = /* @__PURE__ */ new Map();
|
|
17796
|
+
for (const [parentId, children] of childrenMap.entries()) {
|
|
17797
|
+
nextChildrenMap.set(
|
|
17798
|
+
parentId,
|
|
17799
|
+
children.filter((child) => visibleIds.has(child.id))
|
|
17800
|
+
);
|
|
17801
|
+
}
|
|
17802
|
+
return nextChildrenMap;
|
|
17803
|
+
}, [childrenMap, isSearchMode, searchMode, shouldPromptForSearch, visibleIds]);
|
|
17804
|
+
const flattenedRows = (0, import_react22.useMemo)(() => {
|
|
17805
|
+
if (shouldPromptForSearch) return [];
|
|
17806
|
+
const rows = flattenVisibleCategories(effectiveParentCategories, effectiveChildrenMap, effectiveExpandedNodes, shouldAutoExpandSearchResults);
|
|
17807
|
+
if (trimmedQuery || maxInitialOptions === void 0 || maxInitialOptions < 1) {
|
|
17808
|
+
return rows;
|
|
17809
|
+
}
|
|
17810
|
+
const limitedRows = rows.slice(0, maxInitialOptions);
|
|
17811
|
+
const includedIds = new Set(limitedRows.map((row) => row.category.id));
|
|
17812
|
+
const pinnedIds = /* @__PURE__ */ new Set();
|
|
17813
|
+
for (const selectedId of selectedIds) {
|
|
17814
|
+
for (const ancestorId of getAncestorPathIds(categories, selectedId)) {
|
|
17815
|
+
pinnedIds.add(ancestorId);
|
|
17816
|
+
}
|
|
17817
|
+
}
|
|
17818
|
+
if (typeof expandToId === "number") {
|
|
17819
|
+
for (const ancestorId of getAncestorPathIds(categories, expandToId)) {
|
|
17820
|
+
pinnedIds.add(ancestorId);
|
|
17821
|
+
}
|
|
17822
|
+
}
|
|
17823
|
+
for (const row of rows) {
|
|
17824
|
+
if (!pinnedIds.has(row.category.id) || includedIds.has(row.category.id)) continue;
|
|
17825
|
+
limitedRows.push(row);
|
|
17826
|
+
includedIds.add(row.category.id);
|
|
17827
|
+
}
|
|
17828
|
+
return limitedRows;
|
|
17829
|
+
}, [
|
|
17830
|
+
categories,
|
|
17831
|
+
effectiveChildrenMap,
|
|
17832
|
+
effectiveExpandedNodes,
|
|
17833
|
+
effectiveParentCategories,
|
|
17834
|
+
expandToId,
|
|
17835
|
+
maxInitialOptions,
|
|
17836
|
+
selectedIds,
|
|
17837
|
+
shouldAutoExpandSearchResults,
|
|
17838
|
+
shouldPromptForSearch,
|
|
17839
|
+
trimmedQuery
|
|
17840
|
+
]);
|
|
17841
|
+
const canVirtualize = virtualized && !inline && !viewOnly;
|
|
17842
|
+
const treeVirtualizer = (0, import_react_virtual3.useVirtualizer)({
|
|
17843
|
+
count: canVirtualize ? flattenedRows.length : 0,
|
|
17844
|
+
getScrollElement: () => dropdownViewportRef.current,
|
|
17845
|
+
estimateSize: () => estimatedItemHeight,
|
|
17846
|
+
initialRect: { width: 0, height: CATEGORY_TREE_DROPDOWN_MAX_HEIGHT },
|
|
17847
|
+
overscan,
|
|
17848
|
+
enabled: canVirtualize
|
|
17849
|
+
});
|
|
17850
|
+
const virtualRows = canVirtualize ? treeVirtualizer.getVirtualItems() : [];
|
|
17851
|
+
const scrollVirtualTreeToStart = () => {
|
|
17852
|
+
if (!canVirtualize || flattenedRows.length === 0) return;
|
|
17853
|
+
treeVirtualizer.scrollToIndex(0, { align: "start" });
|
|
17854
|
+
};
|
|
17855
|
+
const moveActiveVirtualRow = (direction) => {
|
|
17856
|
+
if (!canVirtualize || flattenedRows.length === 0) return;
|
|
17857
|
+
const nextIndex = activeIndex === null ? direction === 1 ? 0 : flattenedRows.length - 1 : (activeIndex + direction + flattenedRows.length) % flattenedRows.length;
|
|
17858
|
+
setActiveIndex(nextIndex);
|
|
17859
|
+
treeVirtualizer.scrollToIndex(nextIndex, { align: "auto" });
|
|
17860
|
+
};
|
|
17861
|
+
const handleVirtualTreeKeyDown = (event) => {
|
|
17862
|
+
if (!canVirtualize) return;
|
|
17863
|
+
if (event.key === "ArrowDown") {
|
|
17864
|
+
event.preventDefault();
|
|
17865
|
+
moveActiveVirtualRow(1);
|
|
17866
|
+
return;
|
|
17867
|
+
}
|
|
17868
|
+
if (event.key === "ArrowUp") {
|
|
17869
|
+
event.preventDefault();
|
|
17870
|
+
moveActiveVirtualRow(-1);
|
|
17871
|
+
return;
|
|
17872
|
+
}
|
|
17873
|
+
if (event.key === "Enter" && activeIndex !== null) {
|
|
17874
|
+
const row = flattenedRows[activeIndex];
|
|
17875
|
+
if (!row) return;
|
|
17876
|
+
event.preventDefault();
|
|
17877
|
+
handleSelect(row.category.id, row.category);
|
|
17878
|
+
}
|
|
17879
|
+
};
|
|
17880
|
+
(0, import_react22.useEffect)(() => {
|
|
17881
|
+
setActiveIndex(null);
|
|
17882
|
+
}, [flattenedRows]);
|
|
17883
|
+
const renderCategoryRow = (category, level = 0, virtualItem) => {
|
|
17743
17884
|
const children = effectiveChildrenMap.get(category.id) || [];
|
|
17744
17885
|
const hasChildren = children.length > 0;
|
|
17745
|
-
const isExpanded = hasChildren && (
|
|
17886
|
+
const isExpanded = hasChildren && (shouldAutoExpandSearchResults || effectiveExpandedNodes.has(category.id));
|
|
17746
17887
|
const isSelected = selectedIds.has(category.id);
|
|
17747
17888
|
const isSelectable = !viewOnly && (!leafOnlySelect || !hasChildren);
|
|
17889
|
+
const isActive = virtualItem?.index === activeIndex;
|
|
17890
|
+
const rowStyle = virtualItem ? {
|
|
17891
|
+
position: "absolute",
|
|
17892
|
+
top: 0,
|
|
17893
|
+
left: 0,
|
|
17894
|
+
width: "100%",
|
|
17895
|
+
transform: `translateY(${virtualItem.start}px)`
|
|
17896
|
+
} : void 0;
|
|
17748
17897
|
return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(
|
|
17749
17898
|
"div",
|
|
17750
17899
|
{
|
|
17751
|
-
|
|
17752
|
-
|
|
17900
|
+
ref: virtualItem ? treeVirtualizer.measureElement : void 0,
|
|
17901
|
+
"data-index": virtualItem?.index,
|
|
17902
|
+
className: cn("min-w-0 [content-visibility:auto] [contain-intrinsic-size:44px]", !virtualItem && "animate-in fade-in-50 duration-200"),
|
|
17903
|
+
style: { animationDelay: virtualItem ? void 0 : `${level * 30}ms`, ...rowStyle },
|
|
17753
17904
|
children: [
|
|
17754
17905
|
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(
|
|
17755
17906
|
"div",
|
|
17756
17907
|
{
|
|
17908
|
+
role: "treeitem",
|
|
17909
|
+
"aria-level": level + 1,
|
|
17910
|
+
"aria-expanded": hasChildren ? isExpanded : void 0,
|
|
17911
|
+
"aria-selected": viewOnly ? void 0 : isSelected,
|
|
17757
17912
|
onClick: () => !viewOnly && handleSelect(category.id, category),
|
|
17758
17913
|
className: cn(
|
|
17759
17914
|
"relative flex min-w-0 items-center px-3 py-2.5 min-h-11 transition-all duration-200 rounded-3xl",
|
|
17760
17915
|
TREE_NODE_GAP_CLASS,
|
|
17761
17916
|
!viewOnly && (isSelectable ? "cursor-pointer" : "cursor-default"),
|
|
17762
17917
|
isSelectable && !isSelected && "hover:bg-accent/50",
|
|
17918
|
+
canVirtualize && isActive && "bg-accent/50",
|
|
17763
17919
|
// Selected state - đồng bộ cho tất cả
|
|
17764
17920
|
!viewOnly && isSelected && "bg-accent/40"
|
|
17765
17921
|
),
|
|
@@ -17769,6 +17925,7 @@ function CategoryTreeSelect(props) {
|
|
|
17769
17925
|
"button",
|
|
17770
17926
|
{
|
|
17771
17927
|
type: "button",
|
|
17928
|
+
"aria-label": isExpanded ? `Collapse ${category.name}` : `Expand ${category.name}`,
|
|
17772
17929
|
onClick: (e) => {
|
|
17773
17930
|
e.stopPropagation();
|
|
17774
17931
|
toggleExpand(category.id);
|
|
@@ -17778,9 +17935,9 @@ function CategoryTreeSelect(props) {
|
|
|
17778
17935
|
"hover:scale-110 active:scale-95",
|
|
17779
17936
|
"focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50",
|
|
17780
17937
|
isExpanded && "text-primary",
|
|
17781
|
-
|
|
17938
|
+
shouldAutoExpandSearchResults && "opacity-60 cursor-not-allowed hover:scale-100 active:scale-100"
|
|
17782
17939
|
),
|
|
17783
|
-
disabled:
|
|
17940
|
+
disabled: shouldAutoExpandSearchResults,
|
|
17784
17941
|
children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: cn("transition-transform duration-200", isExpanded && "rotate-90"), children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lucide_react26.ChevronRight, { className: "w-4 h-4" }) })
|
|
17785
17942
|
}
|
|
17786
17943
|
) : /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { className: TREE_EXPANDER_PLACEHOLDER_CLASS }),
|
|
@@ -17811,15 +17968,16 @@ function CategoryTreeSelect(props) {
|
|
|
17811
17968
|
]
|
|
17812
17969
|
}
|
|
17813
17970
|
),
|
|
17814
|
-
hasChildren && isExpanded && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
17971
|
+
!virtualItem && hasChildren && isExpanded && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
17815
17972
|
"div",
|
|
17816
17973
|
{
|
|
17974
|
+
role: "group",
|
|
17817
17975
|
className: cn(
|
|
17818
17976
|
TREE_BRANCH_OFFSET_CLASS,
|
|
17819
17977
|
"border-l-2 border-dashed border-border/50",
|
|
17820
17978
|
"animate-in slide-in-from-top-2 fade-in-50 duration-200"
|
|
17821
17979
|
),
|
|
17822
|
-
children: children.map((child) =>
|
|
17980
|
+
children: children.map((child) => renderCategoryRow(child, level + 1))
|
|
17823
17981
|
}
|
|
17824
17982
|
)
|
|
17825
17983
|
]
|
|
@@ -17836,7 +17994,11 @@ function CategoryTreeSelect(props) {
|
|
|
17836
17994
|
{
|
|
17837
17995
|
ref: searchInputRef,
|
|
17838
17996
|
value: query,
|
|
17839
|
-
onChange: (e) =>
|
|
17997
|
+
onChange: (e) => {
|
|
17998
|
+
setQuery(e.target.value);
|
|
17999
|
+
scrollVirtualTreeToStart();
|
|
18000
|
+
},
|
|
18001
|
+
onKeyDown: handleVirtualTreeKeyDown,
|
|
17840
18002
|
placeholder: mergedLabels.searchPlaceholder,
|
|
17841
18003
|
className: cn(
|
|
17842
18004
|
"peer w-full rounded-full bg-background/90 py-2.5 pl-10 pr-10 text-sm shadow-sm",
|
|
@@ -17853,6 +18015,7 @@ function CategoryTreeSelect(props) {
|
|
|
17853
18015
|
type: "button",
|
|
17854
18016
|
onClick: () => {
|
|
17855
18017
|
setQuery("");
|
|
18018
|
+
scrollVirtualTreeToStart();
|
|
17856
18019
|
searchInputRef.current?.focus();
|
|
17857
18020
|
},
|
|
17858
18021
|
className: cn(
|
|
@@ -17867,24 +18030,40 @@ function CategoryTreeSelect(props) {
|
|
|
17867
18030
|
)
|
|
17868
18031
|
] }) });
|
|
17869
18032
|
};
|
|
17870
|
-
const
|
|
17871
|
-
|
|
17872
|
-
|
|
17873
|
-
|
|
17874
|
-
|
|
17875
|
-
|
|
17876
|
-
|
|
17877
|
-
|
|
17878
|
-
effectiveChildrenMap.set(
|
|
17879
|
-
parentId,
|
|
17880
|
-
children.filter((child) => visibleIds.has(child.id))
|
|
17881
|
-
);
|
|
17882
|
-
}
|
|
17883
|
-
}
|
|
17884
|
-
const renderTreeContent = () => /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "space-y-0.5 overflow-x-hidden", children: effectiveParentCategories.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex flex-col items-center justify-center py-8 text-center", children: [
|
|
18033
|
+
const renderTreeContent = () => /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "space-y-0.5 overflow-x-hidden", children: shouldPromptForSearch ? /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex flex-col items-center justify-center py-8 text-center", children: [
|
|
18034
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "w-12 h-12 rounded-2xl bg-muted/50 flex items-center justify-center mb-3", children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lucide_react26.Search, { className: "w-6 h-6 text-muted-foreground/50" }) }),
|
|
18035
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("span", { className: "text-sm text-muted-foreground", children: [
|
|
18036
|
+
"Type at least ",
|
|
18037
|
+
minSearchLength,
|
|
18038
|
+
" characters to search"
|
|
18039
|
+
] })
|
|
18040
|
+
] }) : effectiveParentCategories.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex flex-col items-center justify-center py-8 text-center", children: [
|
|
17885
18041
|
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "w-12 h-12 rounded-2xl bg-muted/50 flex items-center justify-center mb-3", children: isSearchMode ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lucide_react26.SearchX, { className: "w-6 h-6 text-muted-foreground/50" }) : /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lucide_react26.Layers, { className: "w-6 h-6 text-muted-foreground/50" }) }),
|
|
17886
18042
|
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { className: "text-sm text-muted-foreground", children: isSearchMode ? mergedLabels.noResultsText : mergedLabels.emptyText })
|
|
17887
|
-
] }) : effectiveParentCategories.map((cat) =>
|
|
18043
|
+
] }) : effectiveParentCategories.map((cat) => renderCategoryRow(cat)) });
|
|
18044
|
+
const renderVirtualTreeContent = () => {
|
|
18045
|
+
if (shouldPromptForSearch) {
|
|
18046
|
+
return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex flex-col items-center justify-center py-8 text-center", children: [
|
|
18047
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "w-12 h-12 rounded-2xl bg-muted/50 flex items-center justify-center mb-3", children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lucide_react26.Search, { className: "w-6 h-6 text-muted-foreground/50" }) }),
|
|
18048
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("span", { className: "text-sm text-muted-foreground", children: [
|
|
18049
|
+
"Type at least ",
|
|
18050
|
+
minSearchLength,
|
|
18051
|
+
" characters to search"
|
|
18052
|
+
] })
|
|
18053
|
+
] });
|
|
18054
|
+
}
|
|
18055
|
+
if (flattenedRows.length === 0) {
|
|
18056
|
+
return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex flex-col items-center justify-center py-8 text-center", children: [
|
|
18057
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "w-12 h-12 rounded-2xl bg-muted/50 flex items-center justify-center mb-3", children: isSearchMode ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lucide_react26.SearchX, { className: "w-6 h-6 text-muted-foreground/50" }) : /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lucide_react26.Layers, { className: "w-6 h-6 text-muted-foreground/50" }) }),
|
|
18058
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { className: "text-sm text-muted-foreground", children: isSearchMode ? mergedLabels.noResultsText : mergedLabels.emptyText })
|
|
18059
|
+
] });
|
|
18060
|
+
}
|
|
18061
|
+
return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "relative overflow-x-hidden", style: { height: `${treeVirtualizer.getTotalSize()}px` }, children: virtualRows.map((virtualRow) => {
|
|
18062
|
+
const row = flattenedRows[virtualRow.index];
|
|
18063
|
+
if (!row) return null;
|
|
18064
|
+
return renderCategoryRow(row.category, row.level, virtualRow);
|
|
18065
|
+
}) });
|
|
18066
|
+
};
|
|
17888
18067
|
const renderLabel = () => label ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "flex items-center justify-between", children: /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(
|
|
17889
18068
|
Label,
|
|
17890
18069
|
{
|
|
@@ -17927,8 +18106,10 @@ function CategoryTreeSelect(props) {
|
|
|
17927
18106
|
"div",
|
|
17928
18107
|
{
|
|
17929
18108
|
id: resolvedId,
|
|
18109
|
+
role: "tree",
|
|
17930
18110
|
"aria-labelledby": labelId,
|
|
17931
18111
|
"aria-describedby": describedBy,
|
|
18112
|
+
"aria-multiselectable": singleSelect ? void 0 : true,
|
|
17932
18113
|
className: cn("rounded-2xl border border-border/60 bg-card/50 backdrop-blur-sm p-3 shadow-sm", disabled && "opacity-50"),
|
|
17933
18114
|
children: [
|
|
17934
18115
|
renderSearch(),
|
|
@@ -17963,8 +18144,10 @@ function CategoryTreeSelect(props) {
|
|
|
17963
18144
|
"div",
|
|
17964
18145
|
{
|
|
17965
18146
|
id: resolvedId,
|
|
18147
|
+
role: "tree",
|
|
17966
18148
|
"aria-labelledby": labelId,
|
|
17967
18149
|
"aria-describedby": describedBy,
|
|
18150
|
+
"aria-multiselectable": singleSelect ? void 0 : true,
|
|
17968
18151
|
className: cn("rounded-2xl border border-border/60 bg-card/50 backdrop-blur-sm p-3 shadow-sm", disabled && "opacity-50 pointer-events-none"),
|
|
17969
18152
|
children: [
|
|
17970
18153
|
renderSearch(),
|
|
@@ -18029,6 +18212,7 @@ function CategoryTreeSelect(props) {
|
|
|
18029
18212
|
setIsOpen(nextOpen);
|
|
18030
18213
|
if (!nextOpen) {
|
|
18031
18214
|
setQuery("");
|
|
18215
|
+
scrollVirtualTreeToStart();
|
|
18032
18216
|
}
|
|
18033
18217
|
};
|
|
18034
18218
|
let displayText;
|
|
@@ -18044,15 +18228,20 @@ function CategoryTreeSelect(props) {
|
|
|
18044
18228
|
displayText = mergedLabels.selectedText(selectedCount);
|
|
18045
18229
|
}
|
|
18046
18230
|
}
|
|
18047
|
-
const dropdownBody = /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex
|
|
18231
|
+
const dropdownBody = /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex flex-col overflow-hidden", style: { maxHeight: CATEGORY_TREE_DROPDOWN_MAX_HEIGHT }, children: [
|
|
18048
18232
|
renderSearch({ sticky: false, className: "border-b border-border/30 p-2 pb-2" }),
|
|
18049
18233
|
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
18050
18234
|
"div",
|
|
18051
18235
|
{
|
|
18052
18236
|
ref: dropdownViewportRef,
|
|
18053
18237
|
id: `${resolvedId}-tree`,
|
|
18238
|
+
role: "tree",
|
|
18239
|
+
"aria-multiselectable": singleSelect ? void 0 : true,
|
|
18240
|
+
"data-os-ignore": virtualized ? "" : void 0,
|
|
18241
|
+
tabIndex: canVirtualize ? 0 : void 0,
|
|
18242
|
+
onKeyDown: handleVirtualTreeKeyDown,
|
|
18054
18243
|
className: cn("min-h-0 flex-1 overflow-auto overflow-x-hidden p-2 pt-2"),
|
|
18055
|
-
children: renderTreeContent()
|
|
18244
|
+
children: canVirtualize ? renderVirtualTreeContent() : renderTreeContent()
|
|
18056
18245
|
}
|
|
18057
18246
|
)
|
|
18058
18247
|
] });
|
|
@@ -18107,6 +18296,10 @@ function CategoryTreeSelect(props) {
|
|
|
18107
18296
|
if (event.key === "Enter" || event.key === " " || event.key === "ArrowDown") {
|
|
18108
18297
|
event.preventDefault();
|
|
18109
18298
|
handleOpenChange(!isOpen);
|
|
18299
|
+
if (event.key === "ArrowDown" && canVirtualize && flattenedRows.length > 0) {
|
|
18300
|
+
setActiveIndex(0);
|
|
18301
|
+
treeVirtualizer.scrollToIndex(0, { align: "start" });
|
|
18302
|
+
}
|
|
18110
18303
|
}
|
|
18111
18304
|
},
|
|
18112
18305
|
className: cn(
|
|
@@ -21726,6 +21919,7 @@ var TableCaption = import_react28.default.forwardRef(({ className, ...props }, r
|
|
|
21726
21919
|
TableCaption.displayName = "TableCaption";
|
|
21727
21920
|
|
|
21728
21921
|
// src/components/DataTable/DataTable.tsx
|
|
21922
|
+
var import_react_virtual4 = require("@tanstack/react-virtual");
|
|
21729
21923
|
var import_react38 = __toESM(require("react"), 1);
|
|
21730
21924
|
|
|
21731
21925
|
// src/components/DataTable/components/DataTableBody.tsx
|
|
@@ -21798,8 +21992,17 @@ function DataTableBodyRows({
|
|
|
21798
21992
|
getStickyColumnStyle,
|
|
21799
21993
|
getStickyCellClass,
|
|
21800
21994
|
t,
|
|
21801
|
-
labels
|
|
21995
|
+
labels,
|
|
21996
|
+
virtualRows,
|
|
21997
|
+
virtualPaddingTop = 0,
|
|
21998
|
+
virtualPaddingBottom = 0,
|
|
21999
|
+
measureVirtualRow
|
|
21802
22000
|
}) {
|
|
22001
|
+
const rowsToRender = virtualRows ? virtualRows.map((virtualRow) => ({
|
|
22002
|
+
row: displayedData[virtualRow.index],
|
|
22003
|
+
idx: virtualRow.index,
|
|
22004
|
+
virtualRow
|
|
22005
|
+
})).filter((item) => Boolean(item.row)) : displayedData.map((row, idx) => ({ row, idx, virtualRow: void 0 }));
|
|
21803
22006
|
return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(TableBody, { children: loading2 ? /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(TableRow, { children: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(TableCell, { colSpan: leafColumns.length, className: "text-center py-8", children: /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)("div", { className: "flex items-center justify-center gap-2 text-muted-foreground", children: [
|
|
21804
22007
|
/* @__PURE__ */ (0, import_jsx_runtime63.jsxs)("svg", { className: "animate-spin h-4 w-4", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", children: [
|
|
21805
22008
|
/* @__PURE__ */ (0, import_jsx_runtime63.jsx)("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
|
|
@@ -21816,42 +22019,48 @@ function DataTableBodyRows({
|
|
|
21816
22019
|
t("loading"),
|
|
21817
22020
|
"\u2026"
|
|
21818
22021
|
] })
|
|
21819
|
-
] }) }) }) : displayedData.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(TableRow, { children: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(TableCell, { colSpan: leafColumns.length, className: "text-center py-6 text-muted-foreground", children: labels?.noData || t("noData") }) }) :
|
|
21820
|
-
|
|
21821
|
-
|
|
21822
|
-
|
|
21823
|
-
|
|
21824
|
-
|
|
21825
|
-
|
|
21826
|
-
|
|
21827
|
-
|
|
22022
|
+
] }) }) }) : displayedData.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(TableRow, { children: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(TableCell, { colSpan: leafColumns.length, className: "text-center py-6 text-muted-foreground", children: labels?.noData || t("noData") }) }) : /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_jsx_runtime63.Fragment, { children: [
|
|
22023
|
+
virtualPaddingTop > 0 && /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(TableRow, { "aria-hidden": "true", className: "border-0 hover:bg-transparent hover:shadow-none", children: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(TableCell, { colSpan: leafColumns.length, className: "p-0", style: { height: virtualPaddingTop } }) }),
|
|
22024
|
+
rowsToRender.map(({ row, idx, virtualRow }) => {
|
|
22025
|
+
const isStripedRow = striped && idx % 2 === 0;
|
|
22026
|
+
return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
|
|
22027
|
+
TableRow,
|
|
22028
|
+
{
|
|
22029
|
+
ref: virtualRow ? measureVirtualRow : void 0,
|
|
22030
|
+
"data-index": virtualRow?.index,
|
|
22031
|
+
className: cn(densityRowClass, isStripedRow ? "bg-surface-1" : "bg-surface-0"),
|
|
22032
|
+
style: {
|
|
22033
|
+
contentVisibility: "auto",
|
|
22034
|
+
containIntrinsicSize: density === "compact" ? "0 36px" : density === "comfortable" ? "0 56px" : "0 48px"
|
|
22035
|
+
},
|
|
22036
|
+
children: leafColumns.map((col, colIdx) => {
|
|
22037
|
+
const value = col.dataIndex ? row[col.dataIndex] : void 0;
|
|
22038
|
+
const prevCol = colIdx > 0 ? leafColumns[colIdx - 1] : null;
|
|
22039
|
+
const isAfterFixedLeft = prevCol?.fixed === "left";
|
|
22040
|
+
const showBorderLeft = columnDividers && colIdx > 0 && !isAfterFixedLeft && !col.fixed;
|
|
22041
|
+
return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
|
|
22042
|
+
TableCell,
|
|
22043
|
+
{
|
|
22044
|
+
"data-underverse-column-key": col.key,
|
|
22045
|
+
style: getStickyColumnStyle(col),
|
|
22046
|
+
className: cn(
|
|
22047
|
+
cellPadding,
|
|
22048
|
+
col.align === "right" && "text-right",
|
|
22049
|
+
col.align === "center" && "text-center",
|
|
22050
|
+
showBorderLeft && "border-l border-border/60",
|
|
22051
|
+
getStickyCellClass(col, isStripedRow)
|
|
22052
|
+
),
|
|
22053
|
+
children: col.render ? col.render(value, row, idx) : /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(DataTableOverflowText, { text: String(value ?? ""), align: col.align })
|
|
22054
|
+
},
|
|
22055
|
+
col.key
|
|
22056
|
+
);
|
|
22057
|
+
})
|
|
21828
22058
|
},
|
|
21829
|
-
|
|
21830
|
-
|
|
21831
|
-
|
|
21832
|
-
|
|
21833
|
-
|
|
21834
|
-
return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
|
|
21835
|
-
TableCell,
|
|
21836
|
-
{
|
|
21837
|
-
"data-underverse-column-key": col.key,
|
|
21838
|
-
style: getStickyColumnStyle(col),
|
|
21839
|
-
className: cn(
|
|
21840
|
-
cellPadding,
|
|
21841
|
-
col.align === "right" && "text-right",
|
|
21842
|
-
col.align === "center" && "text-center",
|
|
21843
|
-
showBorderLeft && "border-l border-border/60",
|
|
21844
|
-
getStickyCellClass(col, isStripedRow)
|
|
21845
|
-
),
|
|
21846
|
-
children: col.render ? col.render(value, row, idx) : /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(DataTableOverflowText, { text: String(value ?? ""), align: col.align })
|
|
21847
|
-
},
|
|
21848
|
-
col.key
|
|
21849
|
-
);
|
|
21850
|
-
})
|
|
21851
|
-
},
|
|
21852
|
-
getRowKey(row, idx)
|
|
21853
|
-
);
|
|
21854
|
-
}) });
|
|
22059
|
+
getRowKey(row, idx)
|
|
22060
|
+
);
|
|
22061
|
+
}),
|
|
22062
|
+
virtualPaddingBottom > 0 && /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(TableRow, { "aria-hidden": "true", className: "border-0 hover:bg-transparent hover:shadow-none", children: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(TableCell, { colSpan: leafColumns.length, className: "p-0", style: { height: virtualPaddingBottom } }) })
|
|
22063
|
+
] }) });
|
|
21855
22064
|
}
|
|
21856
22065
|
|
|
21857
22066
|
// src/components/DataTable/components/DataTableHeader.tsx
|
|
@@ -22918,6 +23127,9 @@ function DataTable({
|
|
|
22918
23127
|
horizontalMode = "auto",
|
|
22919
23128
|
overflowHidden = true,
|
|
22920
23129
|
useOverlayScrollbar = false,
|
|
23130
|
+
virtualizedRows = false,
|
|
23131
|
+
estimatedRowHeight,
|
|
23132
|
+
overscan = 8,
|
|
22921
23133
|
enableHeaderAutoFit = true,
|
|
22922
23134
|
labels
|
|
22923
23135
|
}) {
|
|
@@ -22973,6 +23185,7 @@ function DataTable({
|
|
|
22973
23185
|
console.warn("[DataTable] `rowKey` should be provided when using sort/filter/pagination to keep row identity stable.");
|
|
22974
23186
|
}, [columns, isServerMode, pageSizeOptions, rowKey]);
|
|
22975
23187
|
const densityRowClass = density === "compact" ? "h-9" : density === "comfortable" ? "h-14" : "h-12";
|
|
23188
|
+
const defaultEstimatedRowHeight = density === "compact" ? 36 : density === "comfortable" ? 56 : 48;
|
|
22976
23189
|
const cellPadding = density === "compact" ? "py-1.5 px-3" : density === "comfortable" ? "py-3 px-4" : "py-2.5 px-4";
|
|
22977
23190
|
const headerTitleClass = size === "sm" ? "text-xs" : size === "lg" ? "text-[15px]" : "text-sm";
|
|
22978
23191
|
const headerMinHeightClass = size === "sm" ? "min-h-9" : size === "lg" ? "min-h-11" : "min-h-10";
|
|
@@ -23000,8 +23213,23 @@ function DataTable({
|
|
|
23000
23213
|
};
|
|
23001
23214
|
const viewportRef = import_react38.default.useRef(null);
|
|
23002
23215
|
const tableRef = import_react38.default.useRef(null);
|
|
23216
|
+
const canVirtualizeRows = virtualizedRows && !loading2 && displayedData.length > 0;
|
|
23217
|
+
const rowVirtualizer = (0, import_react_virtual4.useVirtualizer)({
|
|
23218
|
+
count: canVirtualizeRows ? displayedData.length : 0,
|
|
23219
|
+
getScrollElement: () => viewportRef.current,
|
|
23220
|
+
estimateSize: () => estimatedRowHeight ?? defaultEstimatedRowHeight,
|
|
23221
|
+
initialRect: {
|
|
23222
|
+
width: 0,
|
|
23223
|
+
height: typeof maxHeight === "number" ? maxHeight : 500
|
|
23224
|
+
},
|
|
23225
|
+
overscan,
|
|
23226
|
+
enabled: canVirtualizeRows
|
|
23227
|
+
});
|
|
23228
|
+
const virtualRows = canVirtualizeRows ? rowVirtualizer.getVirtualItems() : [];
|
|
23229
|
+
const virtualPaddingTop = canVirtualizeRows && virtualRows.length > 0 ? virtualRows[0]?.start ?? 0 : 0;
|
|
23230
|
+
const virtualPaddingBottom = canVirtualizeRows && virtualRows.length > 0 ? Math.max(0, rowVirtualizer.getTotalSize() - (virtualRows[virtualRows.length - 1]?.end ?? 0)) : 0;
|
|
23003
23231
|
useOverlayScrollbarTarget(viewportRef, {
|
|
23004
|
-
enabled: useOverlayScrollbar,
|
|
23232
|
+
enabled: useOverlayScrollbar && !canVirtualizeRows,
|
|
23005
23233
|
overflowX: overlayOverflowX
|
|
23006
23234
|
});
|
|
23007
23235
|
const autoFitColumn = import_react38.default.useCallback((columnKey) => {
|
|
@@ -23065,6 +23293,7 @@ function DataTable({
|
|
|
23065
23293
|
"div",
|
|
23066
23294
|
{
|
|
23067
23295
|
ref: viewportRef,
|
|
23296
|
+
"data-os-ignore": canVirtualizeRows ? "" : void 0,
|
|
23068
23297
|
className: cn("w-full", viewportOverflowXClass, stickyHeader && "overflow-y-auto"),
|
|
23069
23298
|
style: stickyHeader ? { maxHeight: typeof maxHeight === "number" ? `${maxHeight}px` : maxHeight } : void 0,
|
|
23070
23299
|
children: /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(
|
|
@@ -23116,7 +23345,11 @@ function DataTable({
|
|
|
23116
23345
|
getStickyColumnStyle,
|
|
23117
23346
|
getStickyCellClass,
|
|
23118
23347
|
t,
|
|
23119
|
-
labels
|
|
23348
|
+
labels,
|
|
23349
|
+
virtualRows: canVirtualizeRows ? virtualRows : void 0,
|
|
23350
|
+
virtualPaddingTop: canVirtualizeRows ? virtualPaddingTop : void 0,
|
|
23351
|
+
virtualPaddingBottom: canVirtualizeRows ? virtualPaddingBottom : void 0,
|
|
23352
|
+
measureVirtualRow: canVirtualizeRows ? rowVirtualizer.measureElement : void 0
|
|
23120
23353
|
}
|
|
23121
23354
|
)
|
|
23122
23355
|
]
|
|
@@ -27054,7 +27287,7 @@ function findDiffEnd(a, b, posA, posB) {
|
|
|
27054
27287
|
posB -= size;
|
|
27055
27288
|
}
|
|
27056
27289
|
}
|
|
27057
|
-
var
|
|
27290
|
+
var Fragment27 = class _Fragment {
|
|
27058
27291
|
/**
|
|
27059
27292
|
@internal
|
|
27060
27293
|
*/
|
|
@@ -27346,7 +27579,7 @@ var Fragment26 = class _Fragment {
|
|
|
27346
27579
|
throw new RangeError("Can not convert " + nodes + " to a Fragment" + (nodes.nodesBetween ? " (looks like multiple versions of prosemirror-model were loaded)" : ""));
|
|
27347
27580
|
}
|
|
27348
27581
|
};
|
|
27349
|
-
|
|
27582
|
+
Fragment27.empty = new Fragment27([], 0);
|
|
27350
27583
|
var found = { index: 0, offset: 0 };
|
|
27351
27584
|
function retIndex(index, offset) {
|
|
27352
27585
|
found.index = index;
|
|
@@ -27571,7 +27804,7 @@ var Slice = class _Slice {
|
|
|
27571
27804
|
let openStart = json.openStart || 0, openEnd = json.openEnd || 0;
|
|
27572
27805
|
if (typeof openStart != "number" || typeof openEnd != "number")
|
|
27573
27806
|
throw new RangeError("Invalid input for Slice.fromJSON");
|
|
27574
|
-
return new _Slice(
|
|
27807
|
+
return new _Slice(Fragment27.fromJSON(schema, json.content), openStart, openEnd);
|
|
27575
27808
|
}
|
|
27576
27809
|
/**
|
|
27577
27810
|
Create a slice from a fragment by taking the maximum possible
|
|
@@ -27586,7 +27819,7 @@ var Slice = class _Slice {
|
|
|
27586
27819
|
return new _Slice(fragment, openStart, openEnd);
|
|
27587
27820
|
}
|
|
27588
27821
|
};
|
|
27589
|
-
Slice.empty = new Slice(
|
|
27822
|
+
Slice.empty = new Slice(Fragment27.empty, 0, 0);
|
|
27590
27823
|
function removeRange(content, from, to) {
|
|
27591
27824
|
let { index, offset } = content.findIndex(from), child = content.maybeChild(index);
|
|
27592
27825
|
let { index: indexTo, offset: offsetTo } = content.findIndex(to);
|
|
@@ -27684,7 +27917,7 @@ function replaceThreeWay($from, $start, $end, $to, depth) {
|
|
|
27684
27917
|
addNode(close(openEnd, replaceTwoWay($end, $to, depth + 1)), content);
|
|
27685
27918
|
}
|
|
27686
27919
|
addRange($to, null, depth, content);
|
|
27687
|
-
return new
|
|
27920
|
+
return new Fragment27(content);
|
|
27688
27921
|
}
|
|
27689
27922
|
function replaceTwoWay($from, $to, depth) {
|
|
27690
27923
|
let content = [];
|
|
@@ -27694,13 +27927,13 @@ function replaceTwoWay($from, $to, depth) {
|
|
|
27694
27927
|
addNode(close(type, replaceTwoWay($from, $to, depth + 1)), content);
|
|
27695
27928
|
}
|
|
27696
27929
|
addRange($to, null, depth, content);
|
|
27697
|
-
return new
|
|
27930
|
+
return new Fragment27(content);
|
|
27698
27931
|
}
|
|
27699
27932
|
function prepareSliceForReplace(slice, $along) {
|
|
27700
27933
|
let extra = $along.depth - slice.openStart, parent = $along.node(extra);
|
|
27701
27934
|
let node = parent.copy(slice.content);
|
|
27702
27935
|
for (let i = extra - 1; i >= 0; i--)
|
|
27703
|
-
node = $along.node(i).copy(
|
|
27936
|
+
node = $along.node(i).copy(Fragment27.from(node));
|
|
27704
27937
|
return {
|
|
27705
27938
|
start: node.resolveNoCache(slice.openStart + extra),
|
|
27706
27939
|
end: node.resolveNoCache(node.content.size - slice.openEnd - extra)
|
|
@@ -28039,7 +28272,7 @@ var Node2 = class _Node {
|
|
|
28039
28272
|
this.type = type;
|
|
28040
28273
|
this.attrs = attrs;
|
|
28041
28274
|
this.marks = marks;
|
|
28042
|
-
this.content = content ||
|
|
28275
|
+
this.content = content || Fragment27.empty;
|
|
28043
28276
|
}
|
|
28044
28277
|
/**
|
|
28045
28278
|
The array of this node's child nodes.
|
|
@@ -28344,7 +28577,7 @@ var Node2 = class _Node {
|
|
|
28344
28577
|
can optionally pass `start` and `end` indices into the
|
|
28345
28578
|
replacement fragment.
|
|
28346
28579
|
*/
|
|
28347
|
-
canReplace(from, to, replacement =
|
|
28580
|
+
canReplace(from, to, replacement = Fragment27.empty, start = 0, end = replacement.childCount) {
|
|
28348
28581
|
let one = this.contentMatchAt(from).matchFragment(replacement, start, end);
|
|
28349
28582
|
let two = one && one.matchFragment(this.content, to);
|
|
28350
28583
|
if (!two || !two.validEnd)
|
|
@@ -28426,7 +28659,7 @@ var Node2 = class _Node {
|
|
|
28426
28659
|
throw new RangeError("Invalid text node in JSON");
|
|
28427
28660
|
return schema.text(json.text, marks);
|
|
28428
28661
|
}
|
|
28429
|
-
let content =
|
|
28662
|
+
let content = Fragment27.fromJSON(schema, json.content);
|
|
28430
28663
|
let node = schema.nodeType(json.type).create(json.attrs, content, marks);
|
|
28431
28664
|
node.type.checkAttrs(node.attrs);
|
|
28432
28665
|
return node;
|
|
@@ -28522,7 +28755,7 @@ var ContentMatch = class _ContentMatch {
|
|
|
28522
28755
|
function search(match, types) {
|
|
28523
28756
|
let finished = match.matchFragment(after, startIndex);
|
|
28524
28757
|
if (finished && (!toEnd || finished.validEnd))
|
|
28525
|
-
return
|
|
28758
|
+
return Fragment27.from(types.map((tp) => tp.createAndFill()));
|
|
28526
28759
|
for (let i = 0; i < match.next.length; i++) {
|
|
28527
28760
|
let { type, next } = match.next[i];
|
|
28528
28761
|
if (!(type.isText || type.hasRequiredAttrs()) && seen.indexOf(next) == -1) {
|
|
@@ -29090,7 +29323,7 @@ function mapFragment(fragment, f, parent) {
|
|
|
29090
29323
|
child = f(child, parent, i);
|
|
29091
29324
|
mapped.push(child);
|
|
29092
29325
|
}
|
|
29093
|
-
return
|
|
29326
|
+
return Fragment27.fromArray(mapped);
|
|
29094
29327
|
}
|
|
29095
29328
|
var AddMarkStep = class _AddMarkStep extends Step {
|
|
29096
29329
|
/**
|
|
@@ -29207,7 +29440,7 @@ var AddNodeMarkStep = class _AddNodeMarkStep extends Step {
|
|
|
29207
29440
|
if (!node)
|
|
29208
29441
|
return StepResult.fail("No node at mark step's position");
|
|
29209
29442
|
let updated = node.type.create(node.attrs, null, this.mark.addToSet(node.marks));
|
|
29210
|
-
return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(
|
|
29443
|
+
return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment27.from(updated), 0, node.isLeaf ? 0 : 1));
|
|
29211
29444
|
}
|
|
29212
29445
|
invert(doc) {
|
|
29213
29446
|
let node = doc.nodeAt(this.pos);
|
|
@@ -29253,7 +29486,7 @@ var RemoveNodeMarkStep = class _RemoveNodeMarkStep extends Step {
|
|
|
29253
29486
|
if (!node)
|
|
29254
29487
|
return StepResult.fail("No node at mark step's position");
|
|
29255
29488
|
let updated = node.type.create(node.attrs, null, this.mark.removeFromSet(node.marks));
|
|
29256
|
-
return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(
|
|
29489
|
+
return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment27.from(updated), 0, node.isLeaf ? 0 : 1));
|
|
29257
29490
|
}
|
|
29258
29491
|
invert(doc) {
|
|
29259
29492
|
let node = doc.nodeAt(this.pos);
|
|
@@ -29454,7 +29687,7 @@ var AttrStep = class _AttrStep extends Step {
|
|
|
29454
29687
|
attrs[name] = node.attrs[name];
|
|
29455
29688
|
attrs[this.attr] = this.value;
|
|
29456
29689
|
let updated = node.type.create(attrs, null, node.marks);
|
|
29457
|
-
return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(
|
|
29690
|
+
return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment27.from(updated), 0, node.isLeaf ? 0 : 1));
|
|
29458
29691
|
}
|
|
29459
29692
|
getMap() {
|
|
29460
29693
|
return StepMap.empty;
|
|
@@ -29838,7 +30071,7 @@ var NodeSelection2 = class _NodeSelection extends Selection {
|
|
|
29838
30071
|
return new _NodeSelection($pos);
|
|
29839
30072
|
}
|
|
29840
30073
|
content() {
|
|
29841
|
-
return new Slice(
|
|
30074
|
+
return new Slice(Fragment27.from(this.node), 0, 0);
|
|
29842
30075
|
}
|
|
29843
30076
|
eq(other) {
|
|
29844
30077
|
return other instanceof _NodeSelection && other.anchor == this.anchor;
|
|
@@ -30566,10 +30799,10 @@ var CellSelection = class CellSelection2 extends Selection {
|
|
|
30566
30799
|
}
|
|
30567
30800
|
rowContent.push(cell);
|
|
30568
30801
|
}
|
|
30569
|
-
rows.push(table.child(row).copy(
|
|
30802
|
+
rows.push(table.child(row).copy(Fragment27.from(rowContent)));
|
|
30570
30803
|
}
|
|
30571
30804
|
const fragment = this.isColSelection() && this.isRowSelection() ? table : rows;
|
|
30572
|
-
return new Slice(
|
|
30805
|
+
return new Slice(Fragment27.from(fragment), 1, 1);
|
|
30573
30806
|
}
|
|
30574
30807
|
replace(tr, content = Slice.empty) {
|
|
30575
30808
|
const mapFrom = tr.steps.length, ranges = this.ranges;
|
|
@@ -30581,7 +30814,7 @@ var CellSelection = class CellSelection2 extends Selection {
|
|
|
30581
30814
|
if (sel) tr.setSelection(sel);
|
|
30582
30815
|
}
|
|
30583
30816
|
replaceWith(tr, node) {
|
|
30584
|
-
this.replace(tr, new Slice(
|
|
30817
|
+
this.replace(tr, new Slice(Fragment27.from(node), 0, 0));
|
|
30585
30818
|
}
|
|
30586
30819
|
forEachCell(f) {
|
|
30587
30820
|
const table = this.$anchorCell.node(-1);
|