Skip to content

Commit 24e83fa

Browse files
committed
[WIP] Migration to TS.
1 parent 54df673 commit 24e83fa

14 files changed

+180
-102
lines changed

.eslintignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
/dist/*.ts
1+
dist/

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@nosferatu500/react-sortable-tree",
3-
"version": "4.0.0-alpha.3",
3+
"version": "4.0.0-beta.0",
44
"description": "Drag-and-drop sortable component for nested data and hierarchies",
55
"main": "./index.js",
66
"module": "./esm/index.js",
@@ -120,7 +120,7 @@
120120
]
121121
},
122122
"dependencies": {
123-
"@nosferatu500/react-dnd-scrollzone": "2.0.0-beta.0",
123+
"@nosferatu500/react-dnd-scrollzone": "^2.0.0",
124124
"lodash.isequal": "^4.5.0",
125125
"prop-types": "^15.7.2",
126126
"react-dnd": "^14.0.2",
@@ -148,14 +148,15 @@
148148
"@types/jest": "^26.0.24",
149149
"@types/react": "^17.0.16",
150150
"@types/react-dom": "^17.0.9",
151+
"@types/react-virtualized": "^9.21.13",
151152
"@typescript-eslint/eslint-plugin": "^4.29.0",
152153
"@typescript-eslint/parser": "^4.29.0",
153154
"@wojtekmaj/enzyme-adapter-react-17": "^0.6.3",
154155
"acorn-jsx": "^5.3.2",
155156
"babel-plugin-macros": "^3.1.0",
156157
"babel-plugin-tester": "^10.1.0",
157158
"enzyme": "^3.11.0",
158-
"esbuild": "^0.12.18",
159+
"esbuild": "^0.12.19",
159160
"eslint": "^7.32.0",
160161
"eslint-config-prettier": "^8.3.0",
161162
"eslint-plugin-import": "^2.23.4",

src/node-renderer-default.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import React, { Component } from 'react'
44
import PropTypes from 'prop-types'
55
import { isDescendant } from './utils/tree-data-utils'
6-
import classnames from './utils/classnames'
6+
import { classnames } from './utils/classnames'
77
import './node-renderer-default.css'
88

99
class NodeRendererDefault extends Component {

src/placeholder-renderer-default.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import React from 'react'
44
import PropTypes from 'prop-types'
5-
import classnames from './utils/classnames'
5+
import { classnames } from './utils/classnames'
66
import './placeholder-renderer-default.css'
77

88
const PlaceholderRendererDefault = ({ isOver, canDrop }) => (

src/react-sortable-tree.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import PlaceholderRendererDefault from './placeholder-renderer-default'
1818
import './react-sortable-tree.css'
1919
import TreeNode from './tree-node'
2020
import TreePlaceholder from './tree-placeholder'
21-
import classnames from './utils/classnames'
21+
import { classnames } from './utils/classnames'
2222
import {
2323
defaultGetNodeKey,
2424
defaultSearchMethod,

src/tree-node.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import React, { Component, Children, cloneElement } from 'react'
44
import PropTypes from 'prop-types'
5-
import classnames from './utils/classnames'
5+
import { classnames } from './utils/classnames'
66
import './tree-node.css'
77

88
class TreeNode extends Component {

src/utils/classnames.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,3 @@ export const classnames = (...classes: string[]) => {
1919
// Boolean("classname") === true;
2020
return classes.filter(Boolean).join(' ')
2121
}
22-
23-
export default classnames

src/utils/default-handlers.ts

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,49 @@
1-
// @ts-nocheck
1+
export interface GetTreeItemChildren {
2+
done: (children: TreeItem[]) => void
3+
node: TreeItem
4+
path: NumberOrStringArray
5+
lowerSiblingCounts: number[]
6+
treeIndex: number
7+
}
8+
9+
export type GetTreeItemChildrenFn = (data: GetTreeItemChildren) => void
210

3-
export const defaultGetNodeKey = ({ treeIndex }: { treeIndex: number }) => {
4-
return treeIndex
11+
export type GetNodeKeyFunction = (data: TreeIndex & TreeNode) => string | number
12+
13+
type NumberOrStringArray = Array<string | number>
14+
15+
export interface TreeItem {
16+
title?: React.ReactNode | undefined
17+
subtitle?: React.ReactNode | undefined
18+
expanded?: boolean | undefined
19+
children?: TreeItem[] | GetTreeItemChildrenFn | undefined
20+
[x: string]: any
521
}
622

23+
export interface TreeNode {
24+
node: TreeItem
25+
}
26+
27+
export interface TreePath {
28+
path: NumberOrStringArray | number
29+
}
30+
31+
export interface TreeIndex {
32+
treeIndex: number
33+
}
34+
35+
export interface FullTree {
36+
treeData: TreeItem[] | undefined | null
37+
}
38+
39+
export interface NodeData extends TreeNode, TreePath, TreeIndex {}
40+
41+
export interface SearchData extends NodeData {
42+
searchQuery: any
43+
}
44+
45+
export const defaultGetNodeKey = ({ treeIndex }: TreeIndex) => treeIndex
46+
747
// Cheap hack to get the text of a react object
848
const getReactElementText = (parent: any) => {
949
if (typeof parent === 'string') {
@@ -34,8 +74,8 @@ const getReactElementText = (parent: any) => {
3474
const stringSearch = (
3575
key: string,
3676
searchQuery: string,
37-
node,
38-
path,
77+
node: TreeItem,
78+
path: NumberOrStringArray | number,
3979
treeIndex: number
4080
) => {
4181
if (typeof node[key] === 'function') {
@@ -58,12 +98,7 @@ export const defaultSearchMethod = ({
5898
path,
5999
treeIndex,
60100
searchQuery,
61-
}: {
62-
node
63-
path
64-
treeIndex: number
65-
searchQuery: string
66-
}) => {
101+
}: SearchData): boolean => {
67102
return (
68103
stringSearch('title', searchQuery, node, path, treeIndex) ||
69104
stringSearch('subtitle', searchQuery, node, path, treeIndex)

src/utils/generic-utils.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
// @ts-nocheck
2-
31
/* eslint-disable import/prefer-default-export */
42

5-
export function slideRows(rows, fromIndex, toIndex, count = 1) {
3+
export function slideRows(
4+
rows: any[],
5+
fromIndex: number,
6+
toIndex: number,
7+
count = 1
8+
) {
69
const rowsWithoutMoved = [
710
...rows.slice(0, fromIndex),
811
...rows.slice(fromIndex + count),

src/utils/memoized-tree-data-utils.test.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
// @ts-nocheck
2-
31
import { insertNode } from './tree-data-utils'
42

53
import { memoizedInsertNode } from './memoized-tree-data-utils'
4+
import { TreeIndex } from '..'
65

76
describe('insertNode', () => {
87
it('should handle empty data', () => {
@@ -11,7 +10,7 @@ describe('insertNode', () => {
1110
depth: 0,
1211
minimumTreeIndex: 0,
1312
newNode: {},
14-
getNodeKey: ({ treeIndex }) => treeIndex,
13+
getNodeKey: ({ treeIndex }: TreeIndex) => treeIndex,
1514
}
1615

1716
let firstCall = insertNode(params)

src/utils/memoized-tree-data-utils.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
1-
// @ts-nocheck
2-
31
import {
42
insertNode,
53
getDescendantCount,
64
getFlatDataFromTree,
75
} from './tree-data-utils'
86

9-
const memoize = (f) => {
10-
let savedArgsArray = []
11-
let savedKeysArray = []
12-
let savedResult = null
7+
const memoize = (f: (...args: any) => void) => {
8+
let savedArgsArray: any = []
9+
let savedKeysArray: any = []
10+
let savedResult: any = null
1311

14-
return (args) => {
12+
return (args: any) => {
1513
const keysArray = Object.keys(args).sort()
1614
const argsArray = keysArray.map((key) => args[key])
1715

0 commit comments

Comments
 (0)