@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.
@@ -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
- collapseAllNodes
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
- collapseAllNodes
55
- });
56
- return /* @__PURE__ */ jsx("div", { className: "treeview", children: /* @__PURE__ */ jsx("ul", { role: "tree", className: "m-0 p-0", children: /* @__PURE__ */ jsxs(DndContext, { accessibility: {
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) && items.map((node) => /* @__PURE__ */ jsx(TreeNode, { node, showIcon, expandedNodes, selectedNodeId, renderNode, disabled: isDisabled(node.id), onTreeItemClick: handleItemClick, onToggleNode: handleFoldUnfold, depth: node.id === activeId && projected ? projected.depth : 0, indentationWidth, projected }, node.id)) }),
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
- }, ref) => {
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__ */ jsxs("div", { className: treeItemClasses.action, children: [
118
- /* @__PURE__ */ jsx("div", { className: treeItemClasses.arrow, 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: {
119
- transform: expanded ? "rotate(90deg)" : ""
120
- } }) }),
121
- node.children && showIcon ? /* @__PURE__ */ jsx(SvgIconFolder, { title: "folder", width: 20, height: 20 }) : null,
122
- /* @__PURE__ */ jsx("div", { tabIndex: 0, role: "button", className: treeItemClasses.button, onClick: () => onTreeItemClick(node.id), onKeyDown: handleItemKeyDown, children: renderNode ? renderNode({
123
- node,
124
- hasChildren: Array.isArray(node.children) && !!node.children.length,
125
- isChild
126
- }) : /* @__PURE__ */ jsx("div", { className: "text-truncate", children: node.name }) })
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
- collapseAllNodes: () => void;
30
+ handleCollapseNode: (nodeId: string) => void;
31
31
  };
@@ -77,9 +77,7 @@ const useTree = ({
77
77
  draggedNodeId,
78
78
  handleItemClick,
79
79
  handleFoldUnfold,
80
- collapseAllNodes: () => {
81
- setExpandedNodes(/* @__PURE__ */ new Set());
82
- }
80
+ handleCollapseNode
83
81
  };
84
82
  };
85
83
  export {
@@ -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, collapseAllNodes, }: {
3
+ export declare const useTreeSortable: ({ nodes, onSortable, handleCollapseNode, }: {
4
4
  nodes: TreeItem[];
5
5
  onSortable: (updateArray: UpdateTreeData[]) => void;
6
- collapseAllNodes: () => void;
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
- collapseAllNodes
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 || collapseAllNodes(), setActiveId(active.id), setOverId(active.id);
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-rc.26",
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/utilities": "2.0.0-develop-rc.26",
123
- "@edifice.io/tiptap-extensions": "2.0.0-develop-rc.26",
124
- "@edifice.io/bootstrap": "2.0.0-develop-rc.26"
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-rc.26"
150
+ "@edifice.io/client": "2.0.0-develop-pedago.0"
151
151
  },
152
152
  "peerDependencies": {
153
153
  "@react-spring/web": "^9.7.5",