@edifice.io/react 2.0.0-develop-rc.26 → 2.0.0-develop-pedago.0
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/dist/components/Tree/components/SortableTree.js +23 -28
- package/dist/components/Tree/hooks/useTree.d.ts +1 -1
- package/dist/components/Tree/hooks/useTree.js +1 -3
- package/dist/components/Tree/hooks/useTreeSortable.d.ts +2 -2
- package/dist/components/Tree/hooks/useTreeSortable.js +2 -2
- package/dist/components/Tree/types/index.d.ts +4 -0
- package/dist/components/Tree/utilities/tree-sortable.d.ts +2 -1
- package/dist/components/Tree/utilities/tree-sortable.js +16 -0
- package/dist/index.js +2 -1
- package/package.json +5 -5
|
@@ -10,6 +10,7 @@ import SvgIconFolder from "../../../modules/icons/components/IconFolder.js";
|
|
|
10
10
|
import SvgIconRafterRight from "../../../modules/icons/components/IconRafterRight.js";
|
|
11
11
|
import { useTree } from "../hooks/useTree.js";
|
|
12
12
|
import { useTreeSortable } from "../hooks/useTreeSortable.js";
|
|
13
|
+
import { flattenNodes } from "../utilities/tree-sortable.js";
|
|
13
14
|
const SortableTree = ({
|
|
14
15
|
nodes,
|
|
15
16
|
selectedNodeId: externalSelectedNodeId,
|
|
@@ -25,7 +26,7 @@ const SortableTree = ({
|
|
|
25
26
|
expandedNodes,
|
|
26
27
|
handleItemClick,
|
|
27
28
|
handleFoldUnfold,
|
|
28
|
-
|
|
29
|
+
handleCollapseNode
|
|
29
30
|
} = useTree({
|
|
30
31
|
data: nodes,
|
|
31
32
|
externalSelectedNodeId,
|
|
@@ -51,12 +52,12 @@ const SortableTree = ({
|
|
|
51
52
|
} = useTreeSortable({
|
|
52
53
|
nodes,
|
|
53
54
|
onSortable,
|
|
54
|
-
|
|
55
|
-
});
|
|
56
|
-
return /* @__PURE__ */ jsx("div", { className: "treeview", children: /* @__PURE__ */ jsx("
|
|
55
|
+
handleCollapseNode
|
|
56
|
+
}), newNodes = flattenNodes(items, expandedNodes);
|
|
57
|
+
return /* @__PURE__ */ jsx("div", { className: "treeview", children: /* @__PURE__ */ jsx("div", { role: "tree", className: "m-0 p-0", children: /* @__PURE__ */ jsxs(DndContext, { accessibility: {
|
|
57
58
|
announcements
|
|
58
59
|
}, sensors, measuring, onDragStart: handleDragStart, onDragEnd: handleDragEnd, onDragOver: handleDragOver, onDragMove: handleDragMove, children: [
|
|
59
|
-
/* @__PURE__ */ jsx(SortableContext, { items: sortedIds, strategy: verticalListSortingStrategy, children: Array.isArray(items) &&
|
|
60
|
+
/* @__PURE__ */ jsx(SortableContext, { items: sortedIds, strategy: verticalListSortingStrategy, children: Array.isArray(items) && newNodes.map((node) => node.parentExpanded ? /* @__PURE__ */ jsx(TreeNode, { node, showIcon, expandedNodes, selectedNodeId, renderNode, disabled: isDisabled(node.id), onTreeItemClick: handleItemClick, onToggleNode: handleFoldUnfold, depth: node.id === activeId && projected ? projected.depth : 0, isChild: node.isChild, indentationWidth, projected }, node.id) : null) }),
|
|
60
61
|
/* @__PURE__ */ createPortal(/* @__PURE__ */ jsx(DragOverlay, { dropAnimation: dropAnimationConfig, modifiers: indicator ? [adjustTranslate] : void 0, children: activeId && activeItem ? /* @__PURE__ */ jsx(DragOverlayItem, { activeItem }) : null }), document.body)
|
|
61
62
|
] }) }) });
|
|
62
63
|
}, TreeNode = /* @__PURE__ */ forwardRef(({
|
|
@@ -69,12 +70,10 @@ const SortableTree = ({
|
|
|
69
70
|
indentationWidth,
|
|
70
71
|
depth,
|
|
71
72
|
isChild,
|
|
72
|
-
projected,
|
|
73
73
|
renderNode,
|
|
74
74
|
onTreeItemClick,
|
|
75
75
|
onToggleNode
|
|
76
|
-
}
|
|
77
|
-
var _a;
|
|
76
|
+
}) => {
|
|
78
77
|
const {
|
|
79
78
|
t
|
|
80
79
|
} = useTranslation(), selected = selectedNodeId === node.id, expanded = expandedNodes.has(node.id), animateLayoutChanges = ({
|
|
@@ -96,37 +95,33 @@ const SortableTree = ({
|
|
|
96
95
|
}, treeItemClasses = {
|
|
97
96
|
action: clsx("action-container d-flex align-items-center gap-8 px-2", {
|
|
98
97
|
"drag-focus": focused,
|
|
99
|
-
"border border-secondary rounded rounded-2 shadow bg-white": isDragging
|
|
100
|
-
|
|
101
|
-
arrow: clsx({
|
|
102
|
-
invisible: !Array.isArray(node.children) || node.children.length === 0
|
|
98
|
+
"border border-secondary rounded rounded-2 shadow bg-white": isDragging,
|
|
99
|
+
display: expanded ? "block" : "none"
|
|
103
100
|
}),
|
|
104
101
|
button: clsx("flex-fill d-flex align-items-center text-truncate gap-8", {
|
|
105
102
|
"py-8": depth === 0,
|
|
106
|
-
"py-4": depth === 1
|
|
103
|
+
"py-4": depth === 1,
|
|
104
|
+
"ps-8": isChild
|
|
107
105
|
})
|
|
108
106
|
}, handleItemKeyDown = (event) => {
|
|
109
107
|
(event.code === "Enter" || event.code === "Space") && (event.preventDefault(), event.stopPropagation(), onTreeItemClick == null || onTreeItemClick(node.id));
|
|
110
108
|
}, handleItemToggleKeyDown = (event) => {
|
|
111
109
|
(event.code === "Enter" || event.code === "Space") && (event.preventDefault(), event.stopPropagation(), onToggleNode == null || onToggleNode(node.id));
|
|
112
|
-
}, spaceGestion = () => isDragging ? isChild ? depth === 1 ? `${indentationWidth * depth}px` : "0px" : `${indentationWidth * depth}px` : null;
|
|
110
|
+
}, spaceGestion = () => isDragging ? isChild ? depth === 1 ? `${indentationWidth * depth}px` : "0px" : `${indentationWidth * depth}px` : isChild ? "20px" : null;
|
|
113
111
|
return /* @__PURE__ */ jsx("li", { ref: setNodeRef, id: `treeitem-${node.id}`, role: "treeitem", "aria-selected": selected, "aria-expanded": expanded, style: {
|
|
114
112
|
...style,
|
|
115
113
|
marginLeft: spaceGestion()
|
|
116
|
-
}, ...listeners, children: /* @__PURE__ */ jsxs("div", { children: [
|
|
117
|
-
/* @__PURE__ */
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
] }),
|
|
128
|
-
expanded && node.children && !!node.children.length && /* @__PURE__ */ jsx("ul", { role: "group", children: (_a = node.children) == null ? void 0 : _a.map((node2) => /* @__PURE__ */ jsx(TreeNode, { ref, node: node2, showIcon, selectedNodeId, expandedNodes, onTreeItemClick, onToggleNode, renderNode, indentationWidth, depth: node2.id === (projected == null ? void 0 : projected.activeId) && projected ? projected.depth : 0, isChild: !0, projected }, node2.id)) })
|
|
129
|
-
] }) }, node.id);
|
|
114
|
+
}, ...listeners, children: /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsxs("div", { className: treeItemClasses.action, children: [
|
|
115
|
+
node.haveChilds && /* @__PURE__ */ jsx("div", { tabIndex: 0, role: "button", onClick: () => onToggleNode == null ? void 0 : onToggleNode(node.id), onKeyDown: handleItemToggleKeyDown, "aria-label": t("foldUnfold"), children: /* @__PURE__ */ jsx(SvgIconRafterRight, { width: 16, style: {
|
|
116
|
+
transform: expanded ? "rotate(90deg)" : ""
|
|
117
|
+
} }) }),
|
|
118
|
+
node.children && showIcon ? /* @__PURE__ */ jsx(SvgIconFolder, { title: "folder", width: 20, height: 20 }) : null,
|
|
119
|
+
/* @__PURE__ */ jsx("div", { tabIndex: 0, role: "button", className: treeItemClasses.button, onClick: () => onTreeItemClick(node.id), onKeyDown: handleItemKeyDown, children: renderNode ? renderNode({
|
|
120
|
+
node,
|
|
121
|
+
hasChildren: Array.isArray(node.children) && !!node.children.length,
|
|
122
|
+
isChild
|
|
123
|
+
}) : /* @__PURE__ */ jsx("div", { className: "text-truncate", children: node.name }) })
|
|
124
|
+
] }) }) }, node.id);
|
|
130
125
|
}), DragOverlayItem = /* @__PURE__ */ forwardRef(({
|
|
131
126
|
activeItem,
|
|
132
127
|
...props
|
|
@@ -27,5 +27,5 @@ export declare const useTree: ({ data, externalSelectedNodeId, draggedNode, shou
|
|
|
27
27
|
draggedNodeId: string | undefined;
|
|
28
28
|
handleItemClick: (nodeId: string) => void;
|
|
29
29
|
handleFoldUnfold: (nodeId: string) => void;
|
|
30
|
-
|
|
30
|
+
handleCollapseNode: (nodeId: string) => void;
|
|
31
31
|
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Announcements, DragEndEvent, DragMoveEvent, DragOverEvent, DragStartEvent, MeasuringStrategy, Modifier, UniqueIdentifier } from '@dnd-kit/core';
|
|
2
2
|
import { FlattenedItem, TreeItem, UpdateTreeData } from '../types';
|
|
3
|
-
export declare const useTreeSortable: ({ nodes, onSortable,
|
|
3
|
+
export declare const useTreeSortable: ({ nodes, onSortable, handleCollapseNode, }: {
|
|
4
4
|
nodes: TreeItem[];
|
|
5
5
|
onSortable: (updateArray: UpdateTreeData[]) => void;
|
|
6
|
-
|
|
6
|
+
handleCollapseNode: (nodeId: string) => void;
|
|
7
7
|
}) => {
|
|
8
8
|
handleDragStart: (event: DragStartEvent) => void;
|
|
9
9
|
handleDragMove: ({ delta }: DragMoveEvent) => void;
|
|
@@ -6,7 +6,7 @@ import { flattenTree, getProjection, getActiveAndOverNodes, determineNewParentId
|
|
|
6
6
|
const useTreeSortable = ({
|
|
7
7
|
nodes,
|
|
8
8
|
onSortable,
|
|
9
|
-
|
|
9
|
+
handleCollapseNode
|
|
10
10
|
}) => {
|
|
11
11
|
const [items, setItems] = useState(() => nodes), [activeId, setActiveId] = useState(null), [overId, setOverId] = useState(null), [offsetLeft, setOffsetLeft] = useState(0), [currentPosition, setCurrentPosition] = useState(null);
|
|
12
12
|
useEffect(() => {
|
|
@@ -28,7 +28,7 @@ const useTreeSortable = ({
|
|
|
28
28
|
} = event, {
|
|
29
29
|
activeNode
|
|
30
30
|
} = getActiveAndOverNodes(flattenedTree, active.id);
|
|
31
|
-
activeNode.parentId ||
|
|
31
|
+
activeNode.parentId || handleCollapseNode(activeNode.id), setActiveId(active.id), setOverId(active.id);
|
|
32
32
|
const activeItem2 = flattenedTree.find(({
|
|
33
33
|
id
|
|
34
34
|
}) => id === activeId);
|
|
@@ -159,6 +159,10 @@ export interface FlattenedItem extends TreeItem {
|
|
|
159
159
|
parentId: string | null;
|
|
160
160
|
depth: number;
|
|
161
161
|
}
|
|
162
|
+
export interface FlattendedNodes extends TreeItem {
|
|
163
|
+
expandNode: boolean;
|
|
164
|
+
parentExpanded: boolean;
|
|
165
|
+
}
|
|
162
166
|
export interface TreeViewHandlers {
|
|
163
167
|
unselect: () => void;
|
|
164
168
|
select: (nodeId: string) => void;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Active, Over, UniqueIdentifier } from '@dnd-kit/core';
|
|
2
|
-
import { FlattenedItem, Projected, TreeItem } from '../types';
|
|
2
|
+
import { FlattendedNodes, FlattenedItem, Projected, TreeItem } from '../types';
|
|
3
3
|
export declare function getDragDepth(offset: number, indentationWidth: number): number;
|
|
4
4
|
export declare function determineNewParentId(active: Active, over: Over | null, activeNode: FlattenedItem, overNode: FlattenedItem | null, projected: Projected): string | null | undefined;
|
|
5
5
|
export declare function getActiveAndOverNodes(tree: FlattenedItem[], activeId: UniqueIdentifier, overId?: UniqueIdentifier | undefined): {
|
|
@@ -10,6 +10,7 @@ export declare function getActiveAndOverNodes(tree: FlattenedItem[], activeId: U
|
|
|
10
10
|
};
|
|
11
11
|
export declare function getIndicesToUpdate(activeNode: FlattenedItem, activeNodeIndex: number, flattenedTree: FlattenedItem[], projected: Projected): number[];
|
|
12
12
|
export declare function flattenTree(tree: TreeItem[], parentId: string | null, depth?: number): FlattenedItem[];
|
|
13
|
+
export declare function flattenNodes(nodes: TreeItem[], expandedNodes: Set<string>): FlattendedNodes[];
|
|
13
14
|
export declare function updateParentIds(flattenedTree: any[], indices: number[], newParentId: string | null | undefined): void;
|
|
14
15
|
export declare function findItemIndexInTree(tree: any[], itemId: string): number | null;
|
|
15
16
|
export declare function generateUpdateData(updatedFlattenedTree: FlattenedItem[], tree: TreeItem[]): {
|
|
@@ -43,6 +43,21 @@ function flattenTree(tree, parentId, depth = 0) {
|
|
|
43
43
|
isVisible: node.isVisible
|
|
44
44
|
}), node.children && node.children.length > 0 && (acc = acc.concat(flattenTree(node.children, node.id, depth + 1))), acc), []);
|
|
45
45
|
}
|
|
46
|
+
function flattenNodes(nodes, expandedNodes) {
|
|
47
|
+
const flatten = (nodes2, isChild = !1, parentExpanded = !0) => nodes2.reduce((acc, node) => {
|
|
48
|
+
var _a;
|
|
49
|
+
const isExpanded = expandedNodes.has(node.id) && node.children && node.children.length > 0;
|
|
50
|
+
return acc.push({
|
|
51
|
+
id: node.id,
|
|
52
|
+
name: node.name,
|
|
53
|
+
isChild,
|
|
54
|
+
haveChilds: !!((_a = node.children) != null && _a.length),
|
|
55
|
+
expandNode: isExpanded ?? !1,
|
|
56
|
+
parentExpanded
|
|
57
|
+
}), node.children && isExpanded && (acc = acc.concat(flatten(node.children, !0, isExpanded))), acc;
|
|
58
|
+
}, []);
|
|
59
|
+
return flatten(nodes);
|
|
60
|
+
}
|
|
46
61
|
function updateParentIds(flattenedTree, indices, newParentId) {
|
|
47
62
|
indices.forEach((index) => {
|
|
48
63
|
flattenedTree[index] = {
|
|
@@ -134,6 +149,7 @@ export {
|
|
|
134
149
|
buildTree,
|
|
135
150
|
determineNewParentId,
|
|
136
151
|
findItemIndexInTree,
|
|
152
|
+
flattenNodes,
|
|
137
153
|
flattenTree,
|
|
138
154
|
generateUpdateData,
|
|
139
155
|
getActiveAndOverNodes,
|
package/dist/index.js
CHANGED
|
@@ -79,7 +79,7 @@ import { default as default70 } from "./components/TextArea/TextArea.js";
|
|
|
79
79
|
import { Toolbar } from "./components/Toolbar/Toolbar.js";
|
|
80
80
|
import { default as default71 } from "./components/Tooltip/Tooltip.js";
|
|
81
81
|
import { useTreeSortable } from "./components/Tree/hooks/useTreeSortable.js";
|
|
82
|
-
import { buildTree, determineNewParentId, findItemIndexInTree, flattenTree, generateUpdateData, getActiveAndOverNodes, getDragDepth, getIndicesToUpdate, getProjection, updateParentIds } from "./components/Tree/utilities/tree-sortable.js";
|
|
82
|
+
import { buildTree, determineNewParentId, findItemIndexInTree, flattenNodes, flattenTree, generateUpdateData, getActiveAndOverNodes, getDragDepth, getIndicesToUpdate, getProjection, updateParentIds } from "./components/Tree/utilities/tree-sortable.js";
|
|
83
83
|
import { useTreeView } from "./components/TreeView/hooks/useTreeView.js";
|
|
84
84
|
import { TreeNode } from "./components/TreeView/TreeNode.js";
|
|
85
85
|
import { TreeNodeFolderWrapper, addNode, arrayUnique, deleteNode, findNodeById, findParentNode, findPathById, findTreeNode, getAncestors, hasChildren, modifyNode, moveNode, updateNode, wrapTreeNode } from "./components/TreeView/utilities/treeview.js";
|
|
@@ -173,6 +173,7 @@ export {
|
|
|
173
173
|
findParentNode,
|
|
174
174
|
findPathById,
|
|
175
175
|
findTreeNode,
|
|
176
|
+
flattenNodes,
|
|
176
177
|
flattenTree,
|
|
177
178
|
generateUpdateData,
|
|
178
179
|
getActiveAndOverNodes,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@edifice.io/react",
|
|
3
|
-
"version": "2.0.0-develop-
|
|
3
|
+
"version": "2.0.0-develop-pedago.0",
|
|
4
4
|
"description": "Edifice React Library",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -119,9 +119,9 @@
|
|
|
119
119
|
"react-slugify": "^3.0.3",
|
|
120
120
|
"swiper": "^10.1.0",
|
|
121
121
|
"ua-parser-js": "^1.0.36",
|
|
122
|
-
"@edifice.io/
|
|
123
|
-
"@edifice.io/tiptap-extensions": "2.0.0-develop-
|
|
124
|
-
"@edifice.io/
|
|
122
|
+
"@edifice.io/bootstrap": "2.0.0-develop-pedago.0",
|
|
123
|
+
"@edifice.io/tiptap-extensions": "2.0.0-develop-pedago.0",
|
|
124
|
+
"@edifice.io/utilities": "2.0.0-develop-pedago.0"
|
|
125
125
|
},
|
|
126
126
|
"devDependencies": {
|
|
127
127
|
"@babel/plugin-transform-react-pure-annotations": "^7.23.3",
|
|
@@ -147,7 +147,7 @@
|
|
|
147
147
|
"typescript-eslint": "^8.8.1",
|
|
148
148
|
"vite": "^5.4.11",
|
|
149
149
|
"vite-plugin-dts": "^4.1.0",
|
|
150
|
-
"@edifice.io/client": "2.0.0-develop-
|
|
150
|
+
"@edifice.io/client": "2.0.0-develop-pedago.0"
|
|
151
151
|
},
|
|
152
152
|
"peerDependencies": {
|
|
153
153
|
"@react-spring/web": "^9.7.5",
|