react-arborist 0.1.1 → 0.1.5

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.
Files changed (38) hide show
  1. package/README.md +16 -2
  2. package/dist/lib/components/drop-cursor.js +11 -7
  3. package/dist/lib/components/preview.d.ts +0 -1
  4. package/dist/lib/components/preview.js +12 -8
  5. package/dist/lib/components/row.d.ts +2 -2
  6. package/dist/lib/components/row.js +27 -24
  7. package/dist/lib/components/tree.d.ts +2 -0
  8. package/dist/lib/components/tree.js +37 -0
  9. package/dist/lib/context.d.ts +3 -4
  10. package/dist/lib/context.js +47 -37
  11. package/dist/lib/data/enrich-tree.d.ts +2 -0
  12. package/dist/lib/data/enrich-tree.js +34 -0
  13. package/dist/lib/data/flatten-tree.d.ts +2 -0
  14. package/dist/lib/data/flatten-tree.js +20 -0
  15. package/dist/lib/data/make-tree.d.ts +5 -0
  16. package/dist/lib/data/make-tree.js +40 -0
  17. package/dist/lib/data/visible-nodes-hook.d.ts +2 -0
  18. package/dist/lib/data/visible-nodes-hook.js +13 -0
  19. package/dist/lib/dnd/compute-drop.js +11 -7
  20. package/dist/lib/dnd/drag-hook.js +17 -13
  21. package/dist/lib/dnd/drop-hook.js +17 -13
  22. package/dist/lib/dnd/measure-hover.js +7 -3
  23. package/dist/lib/dnd/outer-drop-hook.d.ts +1 -0
  24. package/dist/lib/dnd/outer-drop-hook.js +49 -0
  25. package/dist/lib/index.d.ts +1 -1
  26. package/dist/lib/index.js +5 -1
  27. package/dist/lib/reducer.js +26 -14
  28. package/dist/lib/selection/range.js +4 -1
  29. package/dist/lib/selection/selection-hook.js +10 -6
  30. package/dist/lib/selection/selection.js +6 -3
  31. package/dist/lib/selection/selection.test.js +4 -2
  32. package/dist/lib/types.d.ts +47 -43
  33. package/dist/lib/types.js +2 -1
  34. package/dist/lib/utils.d.ts +1 -5
  35. package/dist/lib/utils.js +13 -46
  36. package/package.json +6 -6
  37. package/dist/lib/components/tree-list.d.ts +0 -3
  38. package/dist/lib/components/tree-list.js +0 -75
@@ -1,3 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Range = void 0;
1
4
  var Range = /** @class */ (function () {
2
5
  function Range(start, end) {
3
6
  this.start = start;
@@ -39,4 +42,4 @@ var Range = /** @class */ (function () {
39
42
  };
40
43
  return Range;
41
44
  }());
42
- export { Range };
45
+ exports.Range = Range;
@@ -1,17 +1,20 @@
1
- import { useEffect } from "react";
2
- import { stepDown, stepUp } from "../reducer";
3
- export function useSelectionKeys(ref, dispatch, ids) {
4
- useEffect(function () {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useSelectionKeys = void 0;
4
+ var react_1 = require("react");
5
+ var reducer_1 = require("../reducer");
6
+ function useSelectionKeys(ref, dispatch, ids) {
7
+ (0, react_1.useEffect)(function () {
5
8
  var el = ref.current;
6
9
  el === null || el === void 0 ? void 0 : el.setAttribute("tabindex", "0");
7
10
  var cb = function (e) {
8
11
  if (e.code === "ArrowDown") {
9
12
  e.preventDefault();
10
- dispatch(stepDown(e.shiftKey, ids));
13
+ dispatch((0, reducer_1.stepDown)(e.shiftKey, ids));
11
14
  }
12
15
  else if (e.code === "ArrowUp") {
13
16
  e.preventDefault();
14
- dispatch(stepUp(e.shiftKey, ids));
17
+ dispatch((0, reducer_1.stepUp)(e.shiftKey, ids));
15
18
  }
16
19
  };
17
20
  el === null || el === void 0 ? void 0 : el.addEventListener("keydown", cb);
@@ -20,3 +23,4 @@ export function useSelectionKeys(ref, dispatch, ids) {
20
23
  };
21
24
  }, [ref, dispatch, ids]);
22
25
  }
26
+ exports.useSelectionKeys = useSelectionKeys;
@@ -1,4 +1,7 @@
1
- import { Range } from "./range";
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Selection = void 0;
4
+ var range_1 = require("./range");
2
5
  var Selection = /** @class */ (function () {
3
6
  function Selection(ranges, currentIndex, direction, items) {
4
7
  var _this = this;
@@ -123,7 +126,7 @@ var Selection = /** @class */ (function () {
123
126
  return true;
124
127
  };
125
128
  Selection.prototype.addRange = function (start, end) {
126
- var r = new Range(start, end);
129
+ var r = new range_1.Range(start, end);
127
130
  // Keep ranges sorted by start
128
131
  var index = this.ranges.findIndex(function (r) { return r.start >= start; });
129
132
  if (index === -1)
@@ -186,4 +189,4 @@ var Selection = /** @class */ (function () {
186
189
  };
187
190
  return Selection;
188
191
  }());
189
- export { Selection };
192
+ exports.Selection = Selection;
@@ -1,10 +1,12 @@
1
- import { Selection } from "./selection";
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var selection_1 = require("./selection");
2
4
  var createSelection = function () {
3
5
  var ranges = [];
4
6
  for (var _i = 0; _i < arguments.length; _i++) {
5
7
  ranges[_i] = arguments[_i];
6
8
  }
7
- return new Selection(ranges);
9
+ return new selection_1.Selection(ranges);
8
10
  };
9
11
  describe("select", function () {
10
12
  test("select one after end", function () {
@@ -1,27 +1,28 @@
1
- import { ComponentType, ForwardedRef, MouseEvent, MouseEventHandler, MutableRefObject, ReactElement } from "react";
1
+ import { ComponentType, CSSProperties, MouseEvent, MouseEventHandler, MutableRefObject, ReactElement, Ref } from "react";
2
2
  import { Action } from "./reducer";
3
3
  import { SelectionData } from "./selection/selection";
4
- export declare type Node<M extends NodeModel = NodeModel> = {
4
+ export declare type Node<T = unknown> = {
5
5
  id: string;
6
- model: M;
6
+ model: T;
7
7
  level: number;
8
- children: Node<M>[] | null;
9
- parent: Node<M> | null;
8
+ children: Node<T>[] | null;
9
+ parent: Node<T> | null;
10
10
  isOpen: boolean;
11
11
  rowIndex: number | null;
12
12
  };
13
- export declare type NodesById = {
14
- [id: string]: Node;
13
+ export declare type NodesById<T> = {
14
+ [id: string]: Node<T>;
15
15
  };
16
- export declare type NodeModel = {
16
+ export interface IdObj {
17
17
  id: string;
18
- children?: NodeModel[];
19
- isOpen?: boolean;
20
- };
21
- export declare type NodeRendererProps<M extends NodeModel> = {
18
+ }
19
+ export declare type NodeRendererProps<T> = {
22
20
  preview: boolean;
23
- node: Node<M>;
24
- props: object;
21
+ node: Node<T>;
22
+ props: {
23
+ style: CSSProperties;
24
+ ref: Ref<any>;
25
+ };
25
26
  indent: number;
26
27
  state: NodeState;
27
28
  handlers: NodeHandlers;
@@ -38,67 +39,70 @@ export declare type NodeHandlers = {
38
39
  toggleIsEditing: () => void;
39
40
  rename: (name: string) => void;
40
41
  };
41
- export declare type NodeRenderer<M extends NodeModel = NodeModel> = ComponentType<NodeRendererProps<M>>;
42
+ export declare type NodeRenderer<T> = ComponentType<NodeRendererProps<T>>;
42
43
  export declare type OnMove = (dragIds: string[], parentId: string | null, index: number) => void;
43
44
  export declare type IdHandler = (id: string) => void;
44
45
  export declare type RenameHandler = (id: string, name: string) => void;
45
- export declare type NodeClickHandler = (e: MouseEvent, n: Node) => void;
46
+ export declare type NodeClickHandler<T> = (e: MouseEvent, n: Node<T>) => void;
46
47
  export declare type IndexClickHandler = (e: MouseEvent, index: number) => void;
47
48
  export declare type SelectedCheck = (index: number) => boolean;
48
49
  export declare type CursorLocation = {
49
- parentId: string | null;
50
50
  index: number | null;
51
51
  level: number | null;
52
+ parentId: string | null;
52
53
  };
53
54
  export declare type DragItem = {
54
- id: string;
55
55
  dragIds: string[];
56
+ id: string;
56
57
  };
57
58
  export declare type SelectionState = {
58
- ids: string[];
59
59
  data: SelectionData | null;
60
+ ids: string[];
60
61
  };
61
62
  export declare type StateContext = {
62
- visibleIds: string[];
63
- editingId: string | null;
64
63
  cursorLocation: CursorLocation | null;
64
+ editingId: string | null;
65
65
  selection: SelectionState;
66
+ visibleIds: string[];
66
67
  };
67
- export declare type TreeViewProps = {
68
- children: NodeRenderer<any>;
69
- data: NodeModel;
70
- width: number;
68
+ export interface TreeProps<T> {
69
+ children: NodeRenderer<T>;
70
+ data: T;
71
71
  height: number;
72
+ width: number;
73
+ className?: string | undefined;
74
+ getChildren?: (model: T) => T[] | undefined;
75
+ getIsOpen?: (model: T) => boolean;
76
+ handle?: Ref<TreeHandle>;
77
+ hideRoot?: boolean;
72
78
  indent?: number;
73
- rowHeight?: number;
79
+ onClose?: IdHandler;
74
80
  onMove?: OnMove;
75
81
  onOpen?: IdHandler;
76
- onClose?: IdHandler;
77
82
  onRename?: RenameHandler;
78
- className?: string | undefined;
79
- hideRoot?: boolean;
80
- };
81
- export declare type TreeViewProviderProps = {
82
- handle: ForwardedRef<TreeViewHandle>;
83
- renderer: NodeRenderer<any>;
84
- visibleNodes: Node[];
85
- listRef: MutableRefObject<HTMLDivElement | null>;
83
+ rowHeight?: number;
84
+ }
85
+ export declare type TreeProviderProps<T> = {
86
86
  children: ReactElement;
87
- indent: number;
88
- rowHeight: number;
89
- width: number;
87
+ handle?: Ref<TreeHandle>;
90
88
  height: number;
89
+ indent: number;
90
+ listRef: MutableRefObject<HTMLDivElement | null>;
91
+ onClose: IdHandler;
91
92
  onMove: OnMove;
92
93
  onOpen: IdHandler;
93
- onClose: IdHandler;
94
94
  onRename: RenameHandler;
95
+ renderer: NodeRenderer<any>;
96
+ rowHeight: number;
97
+ visibleNodes: Node<T>[];
98
+ width: number;
95
99
  };
96
- export declare type StaticContext = TreeViewProviderProps & {
100
+ export declare type StaticContext<T> = TreeProviderProps<T> & {
97
101
  dispatch: (a: Action) => void;
98
- getNode: (id: string) => Node | null;
102
+ getNode: (id: string) => Node<T> | null;
99
103
  };
100
- export declare type TreeViewHandle = {
104
+ export declare type TreeHandle = {
105
+ edit: (id: string) => void;
101
106
  selectedIds: string[];
102
107
  selectId: (id: string) => void;
103
- edit: (id: string) => void;
104
108
  };
package/dist/lib/types.js CHANGED
@@ -1 +1,2 @@
1
- export {};
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,13 +1,9 @@
1
- import { Node, NodeModel } from "./types";
1
+ import { Node } from "./types";
2
2
  export declare function bound(n: number, min: number, max: number): number;
3
3
  export declare const isFolder: (node: Node<any>) => boolean;
4
- export declare const isHiddenRoot: (node: Node) => boolean;
5
4
  /**
6
5
  * Is first param a decendent of the second param
7
6
  */
8
7
  export declare const isDecendent: (a: Node, b: Node) => boolean;
9
8
  export declare const indexOf: (node: Node) => number;
10
- export declare function enrichTree(model: NodeModel, hideRoot?: boolean): Node;
11
- export declare function flattenTree(root: Node): Node[];
12
- export declare function createNode(model: NodeModel, level: number, parent: Node | null, children: Node[] | null): Node;
13
9
  export declare function noop(): void;
package/dist/lib/utils.js CHANGED
@@ -1,12 +1,16 @@
1
- export function bound(n, min, max) {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.noop = exports.indexOf = exports.isDecendent = exports.isFolder = exports.bound = void 0;
4
+ function bound(n, min, max) {
2
5
  return Math.max(Math.min(n, max), min);
3
6
  }
4
- export var isFolder = function (node) { return !!node.children; };
5
- export var isHiddenRoot = function (node) { return node.id === "HIDDEN"; };
7
+ exports.bound = bound;
8
+ var isFolder = function (node) { return !!node.children; };
9
+ exports.isFolder = isFolder;
6
10
  /**
7
11
  * Is first param a decendent of the second param
8
12
  */
9
- export var isDecendent = function (a, b) {
13
+ var isDecendent = function (a, b) {
10
14
  var n = a;
11
15
  while (n) {
12
16
  if (n.id === b.id)
@@ -15,49 +19,12 @@ export var isDecendent = function (a, b) {
15
19
  }
16
20
  return false;
17
21
  };
18
- export var indexOf = function (node) {
22
+ exports.isDecendent = isDecendent;
23
+ var indexOf = function (node) {
19
24
  if (!node.parent)
20
25
  throw Error("Node does not have a parent");
21
26
  return node.parent.children.findIndex(function (c) { return c.id === node.id; });
22
27
  };
23
- export function enrichTree(model, hideRoot) {
24
- if (hideRoot === void 0) { hideRoot = false; }
25
- function visitSelfAndChildren(m, level, parent) {
26
- var n = createNode(m, level, parent, null);
27
- if (m.children) {
28
- n.children = m.children.map(function (child) {
29
- return visitSelfAndChildren(child, level + 1, n);
30
- });
31
- }
32
- return n;
33
- }
34
- return visitSelfAndChildren(model, hideRoot ? -1 : 0, null);
35
- }
36
- export function flattenTree(root) {
37
- var list = [];
38
- var index = 0;
39
- function collect(node) {
40
- var _a;
41
- if (node.level >= 0) {
42
- node.rowIndex = index++;
43
- list.push(node);
44
- }
45
- if (node.isOpen) {
46
- (_a = node.children) === null || _a === void 0 ? void 0 : _a.forEach(collect);
47
- }
48
- }
49
- collect(root);
50
- return list;
51
- }
52
- export function createNode(model, level, parent, children) {
53
- return {
54
- id: model.id,
55
- level: level,
56
- parent: parent,
57
- children: children,
58
- isOpen: !!model.isOpen,
59
- model: model,
60
- rowIndex: null,
61
- };
62
- }
63
- export function noop() { }
28
+ exports.indexOf = indexOf;
29
+ function noop() { }
30
+ exports.noop = noop;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-arborist",
3
- "version": "0.1.1",
3
+ "version": "0.1.5",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "dist/lib"
@@ -14,7 +14,7 @@
14
14
  },
15
15
  "scripts": {
16
16
  "start": "react-scripts start",
17
- "build": "tsc --noEmit false --outDir dist --declaration",
17
+ "build": "tsc --noEmit false --outDir dist --declaration --module CommonJS",
18
18
  "test": "react-scripts test",
19
19
  "eject": "react-scripts eject"
20
20
  },
@@ -37,8 +37,8 @@
37
37
  ]
38
38
  },
39
39
  "peerDependencies": {
40
- "react": "^17.0.2",
41
- "react-dom": "^17.0.2"
40
+ "react": ">= 16.14",
41
+ "react-dom": ">= 16.14"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@testing-library/jest-dom": "^5.11.4",
@@ -46,8 +46,8 @@
46
46
  "@testing-library/user-event": "^12.1.10",
47
47
  "@types/jest": "^26.0.15",
48
48
  "@types/node": "^12.0.0",
49
- "@types/react": "^17.0.0",
50
- "@types/react-dom": "^17.0.0",
49
+ "@types/react": "^16.8.0",
50
+ "@types/react-dom": "^16.8.0",
51
51
  "@types/react-window": "^1.8.5",
52
52
  "classnames": "^2.3.1",
53
53
  "react": "^17.0.2",
@@ -1,3 +0,0 @@
1
- /// <reference types="react" />
2
- import { TreeViewHandle, TreeViewProps } from "../types";
3
- export declare const TreeList: import("react").ForwardRefExoticComponent<TreeViewProps & import("react").RefAttributes<TreeViewHandle>>;
@@ -1,75 +0,0 @@
1
- var __assign = (this && this.__assign) || function () {
2
- __assign = Object.assign || function(t) {
3
- for (var s, i = 1, n = arguments.length; i < n; i++) {
4
- s = arguments[i];
5
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
- t[p] = s[p];
7
- }
8
- return t;
9
- };
10
- return __assign.apply(this, arguments);
11
- };
12
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
- import { forwardRef, useMemo, useRef } from "react";
14
- import { DndProvider, useDrop } from "react-dnd";
15
- import { HTML5Backend } from "react-dnd-html5-backend";
16
- import { FixedSizeList } from "react-window";
17
- import { TreeViewProvider, useStaticContext } from "../context";
18
- import { computeDrop } from "../dnd/compute-drop";
19
- import { setCursorLocation } from "../reducer";
20
- import { enrichTree, flattenTree, noop } from "../utils";
21
- import { Preview } from "./preview";
22
- import { Row } from "./row";
23
- function TreeListComponent(props, ref) {
24
- var root = useMemo(function () { return enrichTree(props.data, props.hideRoot); }, [props.data, props.hideRoot]);
25
- var visibleNodes = useMemo(function () { return flattenTree(root); }, [root]);
26
- var listRef = useRef(null);
27
- return (_jsx(TreeViewProvider, __assign({ handle: ref, visibleNodes: visibleNodes, listRef: listRef, renderer: props.children, width: props.width, height: props.height, indent: props.indent || 12, rowHeight: props.rowHeight || 24, onClose: props.onClose || noop, onMove: props.onMove || noop, onOpen: props.onOpen || noop, onRename: props.onRename || noop }, { children: _jsxs(DndProvider, __assign({ backend: HTML5Backend }, { children: [_jsx(OuterDrop, { children: _jsx(List, { className: props.className }, void 0) }, void 0), _jsx(Preview, {}, void 0)] }), void 0) }), void 0));
28
- }
29
- function OuterDrop(props) {
30
- var treeList = useStaticContext();
31
- // In case we drop an item at the bottom of the list
32
- var _a = useDrop(function () { return ({
33
- accept: "NODE",
34
- hover: function (item, m) {
35
- if (!m.isOver({ shallow: true }))
36
- return;
37
- var offset = m.getClientOffset();
38
- if (!treeList.listRef.current || !offset)
39
- return;
40
- var cursor = computeDrop({
41
- element: treeList.listRef.current,
42
- offset: offset,
43
- indent: treeList.indent,
44
- node: null,
45
- prevNode: treeList.visibleNodes[treeList.visibleNodes.length - 1],
46
- nextNode: null,
47
- }).cursor;
48
- treeList.dispatch(setCursorLocation(cursor));
49
- },
50
- drop: function (item, m) {
51
- if (m.didDrop())
52
- return;
53
- console.log("drop!!");
54
- var offset = m.getClientOffset();
55
- if (!treeList.listRef.current || !offset)
56
- return;
57
- var _a = computeDrop({
58
- element: treeList.listRef.current,
59
- offset: offset,
60
- indent: treeList.indent,
61
- node: null,
62
- prevNode: treeList.visibleNodes[treeList.visibleNodes.length - 1],
63
- nextNode: null,
64
- }), parentId = _a.parentId, index = _a.index;
65
- return { parentId: parentId, index: index };
66
- },
67
- }); }, [treeList]), drop = _a[1];
68
- drop(treeList.listRef);
69
- return props.children;
70
- }
71
- function List(props) {
72
- var treeList = useStaticContext();
73
- return (_jsx(FixedSizeList, __assign({ className: props.className, outerRef: treeList.listRef, itemCount: treeList.visibleNodes.length, height: treeList.height, width: treeList.width, itemSize: treeList.rowHeight }, { children: Row }), void 0));
74
- }
75
- export var TreeList = forwardRef(TreeListComponent);