@instructure/ui-tree-browser 10.26.1-snapshot-2 → 10.26.2
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/CHANGELOG.md +5 -18
- package/es/TreeBrowser/TreeButton/index.js +6 -6
- package/es/TreeBrowser/TreeButton/props.js +21 -1
- package/es/TreeBrowser/TreeCollection/index.js +6 -6
- package/es/TreeBrowser/TreeCollection/props.js +32 -1
- package/es/TreeBrowser/TreeNode/index.js +6 -6
- package/es/TreeBrowser/TreeNode/props.js +16 -1
- package/es/TreeBrowser/index.js +6 -6
- package/es/TreeBrowser/props.js +27 -1
- package/lib/TreeBrowser/TreeButton/index.js +5 -5
- package/lib/TreeBrowser/TreeButton/props.js +22 -1
- package/lib/TreeBrowser/TreeCollection/index.js +5 -5
- package/lib/TreeBrowser/TreeCollection/props.js +33 -1
- package/lib/TreeBrowser/TreeNode/index.js +5 -5
- package/lib/TreeBrowser/TreeNode/props.js +17 -1
- package/lib/TreeBrowser/index.js +5 -5
- package/lib/TreeBrowser/props.js +27 -1
- package/package.json +17 -14
- package/src/TreeBrowser/TreeButton/index.tsx +4 -2
- package/src/TreeBrowser/TreeButton/props.ts +28 -2
- package/src/TreeBrowser/TreeCollection/index.tsx +5 -3
- package/src/TreeBrowser/TreeCollection/props.ts +40 -2
- package/src/TreeBrowser/TreeNode/index.tsx +5 -7
- package/src/TreeBrowser/TreeNode/props.ts +23 -2
- package/src/TreeBrowser/index.tsx +4 -2
- package/src/TreeBrowser/props.ts +43 -4
- package/tsconfig.build.json +2 -0
- package/tsconfig.build.tsbuildinfo +1 -1
- package/types/TreeBrowser/TreeButton/index.d.ts +1 -0
- package/types/TreeBrowser/TreeButton/index.d.ts.map +1 -1
- package/types/TreeBrowser/TreeButton/props.d.ts +3 -2
- package/types/TreeBrowser/TreeButton/props.d.ts.map +1 -1
- package/types/TreeBrowser/TreeCollection/index.d.ts +10 -2
- package/types/TreeBrowser/TreeCollection/index.d.ts.map +1 -1
- package/types/TreeBrowser/TreeCollection/props.d.ts +3 -2
- package/types/TreeBrowser/TreeCollection/props.d.ts.map +1 -1
- package/types/TreeBrowser/TreeNode/index.d.ts +1 -0
- package/types/TreeBrowser/TreeNode/index.d.ts.map +1 -1
- package/types/TreeBrowser/TreeNode/props.d.ts +3 -2
- package/types/TreeBrowser/TreeNode/props.d.ts.map +1 -1
- package/types/TreeBrowser/index.d.ts +1 -0
- package/types/TreeBrowser/index.d.ts.map +1 -1
- package/types/TreeBrowser/props.d.ts +5 -4
- package/types/TreeBrowser/props.d.ts.map +1 -1
package/lib/TreeBrowser/index.js
CHANGED
|
@@ -11,6 +11,7 @@ var _IconFolderLine = require("@instructure/ui-icons/lib/IconFolderLine.js");
|
|
|
11
11
|
var _IconDocumentLine = require("@instructure/ui-icons/lib/IconDocumentLine.js");
|
|
12
12
|
var _omitProps = require("@instructure/ui-react-utils/lib/omitProps.js");
|
|
13
13
|
var _pickProps = require("@instructure/ui-react-utils/lib/pickProps.js");
|
|
14
|
+
var _testable = require("@instructure/ui-testable/lib/testable.js");
|
|
14
15
|
var _emotion = require("@instructure/emotion");
|
|
15
16
|
var _TreeCollection = require("./TreeCollection");
|
|
16
17
|
var _TreeButton = require("./TreeButton");
|
|
@@ -20,7 +21,7 @@ var _theme = _interopRequireDefault(require("./theme"));
|
|
|
20
21
|
var _props = require("./props");
|
|
21
22
|
var _TreeBrowserContext = _interopRequireDefault(require("./TreeBrowserContext"));
|
|
22
23
|
var _jsxRuntime = require("@emotion/react/jsx-runtime");
|
|
23
|
-
var _dec, _class, _TreeBrowser;
|
|
24
|
+
var _dec, _dec2, _class, _TreeBrowser;
|
|
24
25
|
/*
|
|
25
26
|
* The MIT License (MIT)
|
|
26
27
|
*
|
|
@@ -49,7 +50,7 @@ var _dec, _class, _TreeBrowser;
|
|
|
49
50
|
category: components
|
|
50
51
|
---
|
|
51
52
|
**/
|
|
52
|
-
let TreeBrowser = exports.TreeBrowser = (_dec = (0, _emotion.withStyle)(_styles.default, _theme.default), _dec(_class = (_TreeBrowser = class TreeBrowser extends _react.Component {
|
|
53
|
+
let TreeBrowser = exports.TreeBrowser = (_dec = (0, _emotion.withStyle)(_styles.default, _theme.default), _dec2 = (0, _testable.testable)(), _dec(_class = _dec2(_class = (_TreeBrowser = class TreeBrowser extends _react.Component {
|
|
53
54
|
constructor(props) {
|
|
54
55
|
super(props);
|
|
55
56
|
this.ref = null;
|
|
@@ -293,12 +294,11 @@ let TreeBrowser = exports.TreeBrowser = (_dec = (0, _emotion.withStyle)(_styles.
|
|
|
293
294
|
this.ref = el;
|
|
294
295
|
},
|
|
295
296
|
"aria-label": this.props.treeLabel,
|
|
296
|
-
"data-cid": "TreeBrowser",
|
|
297
297
|
children: this.renderRoot()
|
|
298
298
|
})
|
|
299
299
|
});
|
|
300
300
|
}
|
|
301
|
-
}, _TreeBrowser.displayName = "TreeBrowser", _TreeBrowser.componentId = 'TreeBrowser', _TreeBrowser.allowedProps = _props.allowedProps, _TreeBrowser.defaultProps = {
|
|
301
|
+
}, _TreeBrowser.displayName = "TreeBrowser", _TreeBrowser.componentId = 'TreeBrowser', _TreeBrowser.allowedProps = _props.allowedProps, _TreeBrowser.propTypes = _props.propTypes, _TreeBrowser.defaultProps = {
|
|
302
302
|
size: 'medium',
|
|
303
303
|
variant: 'folderTree',
|
|
304
304
|
showRootCollection: true,
|
|
@@ -313,5 +313,5 @@ let TreeBrowser = exports.TreeBrowser = (_dec = (0, _emotion.withStyle)(_styles.
|
|
|
313
313
|
return 0;
|
|
314
314
|
},
|
|
315
315
|
animation: true
|
|
316
|
-
}, _TreeBrowser.Node = _TreeNode.TreeNode, _TreeBrowser.Collection = _TreeCollection.TreeCollection, _TreeBrowser.Button = _TreeButton.TreeButton, _TreeBrowser)) || _class);
|
|
316
|
+
}, _TreeBrowser.Node = _TreeNode.TreeNode, _TreeBrowser.Collection = _TreeCollection.TreeCollection, _TreeBrowser.Button = _TreeButton.TreeButton, _TreeBrowser)) || _class) || _class);
|
|
317
317
|
var _default = exports.default = TreeBrowser;
|
package/lib/TreeBrowser/props.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
3
4
|
Object.defineProperty(exports, "__esModule", {
|
|
4
5
|
value: true
|
|
5
6
|
});
|
|
6
|
-
exports.allowedProps = void 0;
|
|
7
|
+
exports.propTypes = exports.allowedProps = void 0;
|
|
8
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
9
|
+
var _controllable = require("@instructure/ui-prop-types/lib/controllable.js");
|
|
7
10
|
/*
|
|
8
11
|
* The MIT License (MIT)
|
|
9
12
|
*
|
|
@@ -37,4 +40,27 @@ exports.allowedProps = void 0;
|
|
|
37
40
|
|
|
38
41
|
// this is a sum type, so CompareObject is one of CompareCollection OR CompareItem
|
|
39
42
|
|
|
43
|
+
const propTypes = exports.propTypes = {
|
|
44
|
+
collections: _propTypes.default.object.isRequired,
|
|
45
|
+
items: _propTypes.default.object.isRequired,
|
|
46
|
+
rootId: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]),
|
|
47
|
+
expanded: (0, _controllable.controllable)(_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number])), 'onCollectionToggle'),
|
|
48
|
+
defaultExpanded: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number])),
|
|
49
|
+
selectionType: _propTypes.default.oneOf(['none', 'single']),
|
|
50
|
+
size: _propTypes.default.oneOf(['small', 'medium', 'large']),
|
|
51
|
+
variant: _propTypes.default.oneOf(['folderTree', 'indent']),
|
|
52
|
+
collectionIcon: _propTypes.default.oneOfType([_propTypes.default.node, _propTypes.default.func]),
|
|
53
|
+
collectionIconExpanded: _propTypes.default.oneOfType([_propTypes.default.node, _propTypes.default.func]),
|
|
54
|
+
itemIcon: _propTypes.default.oneOfType([_propTypes.default.node, _propTypes.default.func]),
|
|
55
|
+
getItemProps: _propTypes.default.func,
|
|
56
|
+
getCollectionProps: _propTypes.default.func,
|
|
57
|
+
showRootCollection: _propTypes.default.bool,
|
|
58
|
+
onCollectionClick: _propTypes.default.func,
|
|
59
|
+
onCollectionToggle: _propTypes.default.func,
|
|
60
|
+
onItemClick: _propTypes.default.func,
|
|
61
|
+
treeLabel: _propTypes.default.string,
|
|
62
|
+
renderContent: _propTypes.default.func,
|
|
63
|
+
sortOrder: _propTypes.default.func,
|
|
64
|
+
animation: _propTypes.default.bool
|
|
65
|
+
};
|
|
40
66
|
const allowedProps = exports.allowedProps = ['collections', 'items', 'rootId', 'expanded', 'defaultExpanded', 'selectionType', 'size', 'variant', 'collectionIcon', 'collectionIconExpanded', 'itemIcon', 'getItemProps', 'getCollectionProps', 'showRootCollection', 'onCollectionClick', 'onCollectionToggle', 'onItemClick', 'treeLabel', 'renderContent', 'sortOrder', 'animation'];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@instructure/ui-tree-browser",
|
|
3
|
-
"version": "10.26.
|
|
3
|
+
"version": "10.26.2",
|
|
4
4
|
"description": "A component for displaying a hierarchical view of information",
|
|
5
5
|
"author": "Instructure, Inc. Engineering and Product Design",
|
|
6
6
|
"module": "./es/index.js",
|
|
@@ -23,26 +23,29 @@
|
|
|
23
23
|
},
|
|
24
24
|
"license": "MIT",
|
|
25
25
|
"devDependencies": {
|
|
26
|
-
"@instructure/ui-axe-check": "10.26.
|
|
27
|
-
"@instructure/ui-babel-preset": "10.26.
|
|
28
|
-
"@instructure/ui-color-utils": "10.26.
|
|
29
|
-
"@instructure/ui-themes": "10.26.
|
|
26
|
+
"@instructure/ui-axe-check": "10.26.2",
|
|
27
|
+
"@instructure/ui-babel-preset": "10.26.2",
|
|
28
|
+
"@instructure/ui-color-utils": "10.26.2",
|
|
29
|
+
"@instructure/ui-themes": "10.26.2",
|
|
30
30
|
"@testing-library/jest-dom": "^6.6.3",
|
|
31
|
-
"@testing-library/react": "
|
|
31
|
+
"@testing-library/react": "^16.0.1",
|
|
32
32
|
"vitest": "^3.2.2"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@babel/runtime": "^7.27.6",
|
|
36
|
-
"@instructure/emotion": "10.26.
|
|
37
|
-
"@instructure/shared-types": "10.26.
|
|
38
|
-
"@instructure/ui-icons": "10.26.
|
|
39
|
-
"@instructure/ui-img": "10.26.
|
|
40
|
-
"@instructure/ui-
|
|
41
|
-
"@instructure/ui-utils": "10.26.
|
|
42
|
-
"
|
|
36
|
+
"@instructure/emotion": "10.26.2",
|
|
37
|
+
"@instructure/shared-types": "10.26.2",
|
|
38
|
+
"@instructure/ui-icons": "10.26.2",
|
|
39
|
+
"@instructure/ui-img": "10.26.2",
|
|
40
|
+
"@instructure/ui-prop-types": "10.26.2",
|
|
41
|
+
"@instructure/ui-react-utils": "10.26.2",
|
|
42
|
+
"@instructure/ui-testable": "10.26.2",
|
|
43
|
+
"@instructure/ui-utils": "10.26.2",
|
|
44
|
+
"keycode": "^2",
|
|
45
|
+
"prop-types": "^15.8.1"
|
|
43
46
|
},
|
|
44
47
|
"peerDependencies": {
|
|
45
|
-
"react": ">=
|
|
48
|
+
"react": ">=16.14 <=18"
|
|
46
49
|
},
|
|
47
50
|
"publishConfig": {
|
|
48
51
|
"access": "public"
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
|
|
25
25
|
import { Component, ContextType } from 'react'
|
|
26
26
|
|
|
27
|
+
import { testable } from '@instructure/ui-testable'
|
|
27
28
|
import { Img } from '@instructure/ui-img'
|
|
28
29
|
import { callRenderProp } from '@instructure/ui-react-utils'
|
|
29
30
|
import { withStyle } from '@instructure/emotion'
|
|
@@ -31,7 +32,7 @@ import { withStyle } from '@instructure/emotion'
|
|
|
31
32
|
import generateStyles from './styles'
|
|
32
33
|
import generateComponentTheme from './theme'
|
|
33
34
|
import type { TreeBrowserButtonProps } from './props'
|
|
34
|
-
import { allowedProps } from './props'
|
|
35
|
+
import { allowedProps, propTypes } from './props'
|
|
35
36
|
import TreeBrowserContext from '../TreeBrowserContext'
|
|
36
37
|
|
|
37
38
|
// Todo: merge TreeButton and TreeNode: TreeButton should be a special type of TreeNode
|
|
@@ -43,10 +44,12 @@ id: TreeBrowser.Button
|
|
|
43
44
|
---
|
|
44
45
|
**/
|
|
45
46
|
@withStyle(generateStyles, generateComponentTheme)
|
|
47
|
+
@testable()
|
|
46
48
|
class TreeButton extends Component<TreeBrowserButtonProps> {
|
|
47
49
|
static readonly componentId = 'TreeBrowser.Button'
|
|
48
50
|
|
|
49
51
|
static allowedProps = allowedProps
|
|
52
|
+
static propTypes = propTypes
|
|
50
53
|
|
|
51
54
|
static contextType = TreeBrowserContext
|
|
52
55
|
declare context: ContextType<typeof TreeBrowserContext>
|
|
@@ -148,7 +151,6 @@ class TreeButton extends Component<TreeBrowserButtonProps> {
|
|
|
148
151
|
tabIndex={-1}
|
|
149
152
|
type="button"
|
|
150
153
|
css={styles?.treeButton}
|
|
151
|
-
data-cid="TreeButton"
|
|
152
154
|
>
|
|
153
155
|
{buttonContent}
|
|
154
156
|
</button>
|
|
@@ -23,8 +23,13 @@
|
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
25
|
import React from 'react'
|
|
26
|
+
import PropTypes from 'prop-types'
|
|
27
|
+
|
|
26
28
|
import type { WithStyleProps, ComponentStyle } from '@instructure/emotion'
|
|
27
|
-
import type {
|
|
29
|
+
import type {
|
|
30
|
+
PropValidators,
|
|
31
|
+
TreeBrowserButtonTheme
|
|
32
|
+
} from '@instructure/shared-types'
|
|
28
33
|
import type { TreeBrowserCommonProps } from '../props'
|
|
29
34
|
|
|
30
35
|
type TreeBrowserButtonOwnProps = {
|
|
@@ -64,6 +69,27 @@ type TreeBrowserButtonStyle = ComponentStyle<
|
|
|
64
69
|
| 'thumbnail'
|
|
65
70
|
| 'node'
|
|
66
71
|
>
|
|
72
|
+
|
|
73
|
+
const propTypes: PropValidators<PropKeys> = {
|
|
74
|
+
id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
|
|
75
|
+
name: PropTypes.string,
|
|
76
|
+
descriptor: PropTypes.string,
|
|
77
|
+
type: PropTypes.string,
|
|
78
|
+
size: PropTypes.oneOf(['small', 'medium', 'large']),
|
|
79
|
+
variant: PropTypes.oneOf(['folderTree', 'indent']),
|
|
80
|
+
collectionIcon: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),
|
|
81
|
+
collectionIconExpanded: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),
|
|
82
|
+
itemIcon: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),
|
|
83
|
+
thumbnail: PropTypes.string,
|
|
84
|
+
onClick: PropTypes.func,
|
|
85
|
+
expanded: PropTypes.bool,
|
|
86
|
+
selected: PropTypes.bool,
|
|
87
|
+
focused: PropTypes.bool,
|
|
88
|
+
level: PropTypes.number,
|
|
89
|
+
containerRef: PropTypes.func,
|
|
90
|
+
renderContent: PropTypes.func
|
|
91
|
+
}
|
|
92
|
+
|
|
67
93
|
const allowedProps: AllowedPropKeys = [
|
|
68
94
|
'id',
|
|
69
95
|
'name',
|
|
@@ -85,4 +111,4 @@ const allowedProps: AllowedPropKeys = [
|
|
|
85
111
|
]
|
|
86
112
|
|
|
87
113
|
export type { TreeBrowserButtonProps, TreeBrowserButtonStyle }
|
|
88
|
-
export { allowedProps }
|
|
114
|
+
export { propTypes, allowedProps }
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
|
|
25
25
|
import { Component, ContextType, ReactElement, SyntheticEvent } from 'react'
|
|
26
26
|
|
|
27
|
+
import { testable } from '@instructure/ui-testable'
|
|
27
28
|
import { withStyle } from '@instructure/emotion'
|
|
28
29
|
import { safeCloneElement } from '@instructure/ui-react-utils'
|
|
29
30
|
|
|
@@ -33,7 +34,7 @@ import generateStyles from './styles'
|
|
|
33
34
|
import generateComponentTheme from './theme'
|
|
34
35
|
import type { TreeBrowserCollectionProps, TreeCollectionState } from './props'
|
|
35
36
|
import type { CompareObject } from '../props'
|
|
36
|
-
import { allowedProps } from './props'
|
|
37
|
+
import { allowedProps, propTypes } from './props'
|
|
37
38
|
import { CollectionItem, CollectionProps, CollectionData } from '../props'
|
|
38
39
|
import TreeBrowserContext from '../TreeBrowserContext'
|
|
39
40
|
|
|
@@ -46,6 +47,7 @@ id: TreeBrowser.Collection
|
|
|
46
47
|
---
|
|
47
48
|
**/
|
|
48
49
|
@withStyle(generateStyles, generateComponentTheme)
|
|
50
|
+
@testable()
|
|
49
51
|
class TreeCollection extends Component<
|
|
50
52
|
TreeBrowserCollectionProps,
|
|
51
53
|
TreeCollectionState
|
|
@@ -53,6 +55,7 @@ class TreeCollection extends Component<
|
|
|
53
55
|
static readonly componentId = 'TreeBrowser.Collection'
|
|
54
56
|
|
|
55
57
|
static allowedProps = allowedProps
|
|
58
|
+
static propTypes = propTypes
|
|
56
59
|
|
|
57
60
|
static contextType = TreeBrowserContext
|
|
58
61
|
declare context: ContextType<typeof TreeBrowserContext>
|
|
@@ -210,7 +213,7 @@ class TreeCollection extends Component<
|
|
|
210
213
|
|
|
211
214
|
renderCollectionChildren(
|
|
212
215
|
collectionId: string | number | undefined,
|
|
213
|
-
child: ReactElement
|
|
216
|
+
child: ReactElement,
|
|
214
217
|
position: number,
|
|
215
218
|
keyword: 'before' | 'after'
|
|
216
219
|
) {
|
|
@@ -398,7 +401,6 @@ class TreeCollection extends Component<
|
|
|
398
401
|
onFocus={(e) => this.handleFocus(e, { id: id, type: 'collection' })}
|
|
399
402
|
onBlur={(e) => this.handleBlur(e, { id: id, type: 'collection' })}
|
|
400
403
|
{...ariaSelected}
|
|
401
|
-
data-cid="TreeCollection"
|
|
402
404
|
>
|
|
403
405
|
<TreeButton {...collectionProps} />
|
|
404
406
|
{expanded && this.childCount > 0 && (
|
|
@@ -23,9 +23,17 @@
|
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
25
|
import React from 'react'
|
|
26
|
+
import PropTypes from 'prop-types'
|
|
26
27
|
|
|
28
|
+
import { Children } from '@instructure/ui-prop-types'
|
|
29
|
+
|
|
30
|
+
import { TreeNode } from '../TreeNode'
|
|
27
31
|
import type { CollectionData } from '../props'
|
|
28
|
-
|
|
32
|
+
|
|
33
|
+
import type {
|
|
34
|
+
PropValidators,
|
|
35
|
+
TreeBrowserCollectionTheme
|
|
36
|
+
} from '@instructure/shared-types'
|
|
29
37
|
import type { WithStyleProps, ComponentStyle } from '@instructure/emotion'
|
|
30
38
|
import { CollectionProps, TreeBrowserBaseProps } from '../props'
|
|
31
39
|
|
|
@@ -50,6 +58,36 @@ type TreeBrowserCollectionProps = TreeBrowserCollectionOwnProps &
|
|
|
50
58
|
type TreeBrowserCollectionStyle = ComponentStyle<
|
|
51
59
|
'treeCollection' | 'list' | 'item'
|
|
52
60
|
>
|
|
61
|
+
|
|
62
|
+
const propTypes: PropValidators<PropKeys> = {
|
|
63
|
+
id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
|
|
64
|
+
name: PropTypes.string,
|
|
65
|
+
descriptor: PropTypes.string,
|
|
66
|
+
items: PropTypes.array,
|
|
67
|
+
collections: PropTypes.array,
|
|
68
|
+
expanded: PropTypes.bool,
|
|
69
|
+
selection: PropTypes.string,
|
|
70
|
+
size: PropTypes.oneOf(['small', 'medium', 'large']),
|
|
71
|
+
variant: PropTypes.oneOf(['folderTree', 'indent']),
|
|
72
|
+
collectionIcon: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),
|
|
73
|
+
collectionIconExpanded: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),
|
|
74
|
+
itemIcon: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),
|
|
75
|
+
getItemProps: PropTypes.func,
|
|
76
|
+
getCollectionProps: PropTypes.func,
|
|
77
|
+
onItemClick: PropTypes.func,
|
|
78
|
+
onCollectionClick: PropTypes.func,
|
|
79
|
+
onKeyDown: PropTypes.func,
|
|
80
|
+
numChildren: PropTypes.number,
|
|
81
|
+
level: PropTypes.number.isRequired,
|
|
82
|
+
position: PropTypes.number,
|
|
83
|
+
renderBeforeItems: Children.oneOf([TreeNode]),
|
|
84
|
+
renderAfterItems: Children.oneOf([TreeNode]),
|
|
85
|
+
containerRef: PropTypes.func,
|
|
86
|
+
isCollectionFlattened: PropTypes.bool,
|
|
87
|
+
renderContent: PropTypes.func,
|
|
88
|
+
compareFunc: PropTypes.func
|
|
89
|
+
}
|
|
90
|
+
|
|
53
91
|
const allowedProps: AllowedPropKeys = [
|
|
54
92
|
'id',
|
|
55
93
|
'name',
|
|
@@ -85,4 +123,4 @@ export type {
|
|
|
85
123
|
TreeBrowserCollectionStyle,
|
|
86
124
|
TreeCollectionState
|
|
87
125
|
}
|
|
88
|
-
export { allowedProps }
|
|
126
|
+
export { propTypes, allowedProps }
|
|
@@ -26,12 +26,13 @@ import { Component, ContextType } from 'react'
|
|
|
26
26
|
|
|
27
27
|
import { Img } from '@instructure/ui-img'
|
|
28
28
|
import { callRenderProp } from '@instructure/ui-react-utils'
|
|
29
|
+
import { testable } from '@instructure/ui-testable'
|
|
29
30
|
import { withStyle } from '@instructure/emotion'
|
|
30
31
|
|
|
31
32
|
import generateStyles from '../TreeButton/styles'
|
|
32
33
|
import generateComponentTheme from '../TreeButton/theme'
|
|
33
34
|
import type { TreeBrowserNodeProps } from './props'
|
|
34
|
-
import { allowedProps } from './props'
|
|
35
|
+
import { allowedProps, propTypes } from './props'
|
|
35
36
|
import TreeBrowserContext from '../TreeBrowserContext'
|
|
36
37
|
|
|
37
38
|
// Todo: merge TreeButton and TreeNode: TreeButton should be a special type of TreeNode
|
|
@@ -45,10 +46,12 @@ A helper class used to render the :renderBeforeItems and :renderAfterItems
|
|
|
45
46
|
in the TreeBrowser.
|
|
46
47
|
**/
|
|
47
48
|
@withStyle(generateStyles, generateComponentTheme)
|
|
49
|
+
@testable()
|
|
48
50
|
class TreeNode extends Component<TreeBrowserNodeProps> {
|
|
49
51
|
static readonly componentId = 'TreeBrowser.Node'
|
|
50
52
|
|
|
51
53
|
static allowedProps = allowedProps
|
|
54
|
+
static propTypes = propTypes
|
|
52
55
|
|
|
53
56
|
static contextType = TreeBrowserContext
|
|
54
57
|
declare context: ContextType<typeof TreeBrowserContext>
|
|
@@ -95,12 +98,7 @@ class TreeNode extends Component<TreeBrowserNodeProps> {
|
|
|
95
98
|
render() {
|
|
96
99
|
const { children, styles } = this.props
|
|
97
100
|
return (
|
|
98
|
-
<div
|
|
99
|
-
ref={this.handleRef}
|
|
100
|
-
tabIndex={-1}
|
|
101
|
-
css={styles?.treeButton}
|
|
102
|
-
data-cid="TreeNode"
|
|
103
|
-
>
|
|
101
|
+
<div ref={this.handleRef} tabIndex={-1} css={styles?.treeButton}>
|
|
104
102
|
<span css={styles?.layout}>
|
|
105
103
|
{this.renderItemImage()}
|
|
106
104
|
<span css={styles?.node}>{children}</span>
|
|
@@ -23,7 +23,12 @@
|
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
25
|
import React from 'react'
|
|
26
|
-
import
|
|
26
|
+
import PropTypes from 'prop-types'
|
|
27
|
+
|
|
28
|
+
import type {
|
|
29
|
+
PropValidators,
|
|
30
|
+
TreeBrowserButtonTheme
|
|
31
|
+
} from '@instructure/shared-types'
|
|
27
32
|
import type { WithStyleProps } from '@instructure/emotion'
|
|
28
33
|
|
|
29
34
|
import type {
|
|
@@ -58,6 +63,22 @@ type AllowedPropKeys = Readonly<Array<PropKeys>>
|
|
|
58
63
|
|
|
59
64
|
type TreeBrowserNodeProps = TreeBrowserNodeOwnProps &
|
|
60
65
|
WithStyleProps<TreeBrowserButtonTheme, TreeBrowserButtonStyle>
|
|
66
|
+
|
|
67
|
+
const propTypes: PropValidators<PropKeys> = {
|
|
68
|
+
id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
|
|
69
|
+
size: PropTypes.oneOf(['small', 'medium', 'large']),
|
|
70
|
+
variant: PropTypes.oneOf(['folderTree', 'indent']),
|
|
71
|
+
selected: PropTypes.bool,
|
|
72
|
+
focused: PropTypes.bool,
|
|
73
|
+
itemIcon: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),
|
|
74
|
+
thumbnail: PropTypes.string,
|
|
75
|
+
level: PropTypes.number,
|
|
76
|
+
children: PropTypes.node,
|
|
77
|
+
containerRef: PropTypes.func,
|
|
78
|
+
onKeyDown: PropTypes.func,
|
|
79
|
+
onClick: PropTypes.func
|
|
80
|
+
}
|
|
81
|
+
|
|
61
82
|
const allowedProps: AllowedPropKeys = [
|
|
62
83
|
'id',
|
|
63
84
|
'size',
|
|
@@ -74,4 +95,4 @@ const allowedProps: AllowedPropKeys = [
|
|
|
74
95
|
]
|
|
75
96
|
|
|
76
97
|
export type { TreeBrowserNodeProps }
|
|
77
|
-
export { allowedProps }
|
|
98
|
+
export { propTypes, allowedProps }
|
|
@@ -28,6 +28,7 @@ import keycode from 'keycode'
|
|
|
28
28
|
import { IconFolderLine, IconDocumentLine } from '@instructure/ui-icons'
|
|
29
29
|
|
|
30
30
|
import { omitProps, pickProps } from '@instructure/ui-react-utils'
|
|
31
|
+
import { testable } from '@instructure/ui-testable'
|
|
31
32
|
import { withStyle } from '@instructure/emotion'
|
|
32
33
|
|
|
33
34
|
import { TreeCollection } from './TreeCollection'
|
|
@@ -43,7 +44,7 @@ import type {
|
|
|
43
44
|
TreeBrowserProps,
|
|
44
45
|
TreeBrowserState
|
|
45
46
|
} from './props'
|
|
46
|
-
import { allowedProps } from './props'
|
|
47
|
+
import { allowedProps, propTypes } from './props'
|
|
47
48
|
import TreeBrowserContext from './TreeBrowserContext'
|
|
48
49
|
|
|
49
50
|
/**
|
|
@@ -52,10 +53,12 @@ category: components
|
|
|
52
53
|
---
|
|
53
54
|
**/
|
|
54
55
|
@withStyle(generateStyles, generateComponentTheme)
|
|
56
|
+
@testable()
|
|
55
57
|
class TreeBrowser extends Component<TreeBrowserProps, TreeBrowserState> {
|
|
56
58
|
static readonly componentId = 'TreeBrowser'
|
|
57
59
|
|
|
58
60
|
static allowedProps = allowedProps
|
|
61
|
+
static propTypes = propTypes
|
|
59
62
|
|
|
60
63
|
static defaultProps = {
|
|
61
64
|
size: 'medium',
|
|
@@ -377,7 +380,6 @@ class TreeBrowser extends Component<TreeBrowserProps, TreeBrowserState> {
|
|
|
377
380
|
this.ref = el
|
|
378
381
|
}}
|
|
379
382
|
aria-label={this.props.treeLabel}
|
|
380
|
-
data-cid="TreeBrowser"
|
|
381
383
|
>
|
|
382
384
|
{this.renderRoot()}
|
|
383
385
|
</ul>
|
package/src/TreeBrowser/props.ts
CHANGED
|
@@ -22,9 +22,16 @@
|
|
|
22
22
|
* SOFTWARE.
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
-
import
|
|
25
|
+
import PropTypes from 'prop-types'
|
|
26
|
+
|
|
27
|
+
import { controllable } from '@instructure/ui-prop-types'
|
|
28
|
+
|
|
29
|
+
import type {
|
|
30
|
+
PropValidators,
|
|
31
|
+
TreeBrowserTheme
|
|
32
|
+
} from '@instructure/shared-types'
|
|
26
33
|
import type { WithStyleProps, ComponentStyle } from '@instructure/emotion'
|
|
27
|
-
import
|
|
34
|
+
import { ReactElement } from 'react'
|
|
28
35
|
import type { TreeBrowserButtonProps } from './TreeButton/props'
|
|
29
36
|
import { Renderable } from '@instructure/shared-types'
|
|
30
37
|
|
|
@@ -108,7 +115,7 @@ type TreeBrowserCommonProps = {
|
|
|
108
115
|
collectionIcon?: Renderable
|
|
109
116
|
collectionIconExpanded?: Renderable
|
|
110
117
|
itemIcon?: Renderable
|
|
111
|
-
renderContent?: (props: TreeBrowserButtonProps) =>
|
|
118
|
+
renderContent?: (props: TreeBrowserButtonProps) => JSX.Element
|
|
112
119
|
}
|
|
113
120
|
|
|
114
121
|
type PropKeys = keyof TreeBrowserOwnProps
|
|
@@ -173,6 +180,38 @@ type CollectionData = {
|
|
|
173
180
|
expanded?: boolean
|
|
174
181
|
type: 'child' | 'collection' | 'item'
|
|
175
182
|
}
|
|
183
|
+
|
|
184
|
+
const propTypes: PropValidators<PropKeys> = {
|
|
185
|
+
collections: PropTypes.object.isRequired,
|
|
186
|
+
items: PropTypes.object.isRequired,
|
|
187
|
+
rootId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
|
|
188
|
+
expanded: controllable(
|
|
189
|
+
PropTypes.arrayOf(
|
|
190
|
+
PropTypes.oneOfType([PropTypes.string, PropTypes.number])
|
|
191
|
+
),
|
|
192
|
+
'onCollectionToggle'
|
|
193
|
+
),
|
|
194
|
+
defaultExpanded: PropTypes.arrayOf(
|
|
195
|
+
PropTypes.oneOfType([PropTypes.string, PropTypes.number])
|
|
196
|
+
),
|
|
197
|
+
selectionType: PropTypes.oneOf(['none', 'single']),
|
|
198
|
+
size: PropTypes.oneOf(['small', 'medium', 'large']),
|
|
199
|
+
variant: PropTypes.oneOf(['folderTree', 'indent']),
|
|
200
|
+
collectionIcon: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),
|
|
201
|
+
collectionIconExpanded: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),
|
|
202
|
+
itemIcon: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),
|
|
203
|
+
getItemProps: PropTypes.func,
|
|
204
|
+
getCollectionProps: PropTypes.func,
|
|
205
|
+
showRootCollection: PropTypes.bool,
|
|
206
|
+
onCollectionClick: PropTypes.func,
|
|
207
|
+
onCollectionToggle: PropTypes.func,
|
|
208
|
+
onItemClick: PropTypes.func,
|
|
209
|
+
treeLabel: PropTypes.string,
|
|
210
|
+
renderContent: PropTypes.func,
|
|
211
|
+
sortOrder: PropTypes.func,
|
|
212
|
+
animation: PropTypes.bool
|
|
213
|
+
}
|
|
214
|
+
|
|
176
215
|
const allowedProps: AllowedPropKeys = [
|
|
177
216
|
'collections',
|
|
178
217
|
'items',
|
|
@@ -216,4 +255,4 @@ export type {
|
|
|
216
255
|
TreeBrowserBaseProps,
|
|
217
256
|
TreeBrowserCommonProps
|
|
218
257
|
}
|
|
219
|
-
export { allowedProps }
|
|
258
|
+
export { propTypes, allowedProps }
|
package/tsconfig.build.json
CHANGED
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
{ "path": "../shared-types/tsconfig.build.json" },
|
|
16
16
|
{ "path": "../ui-icons/tsconfig.build.json" },
|
|
17
17
|
{ "path": "../ui-img/tsconfig.build.json" },
|
|
18
|
+
{ "path": "../ui-prop-types/tsconfig.build.json" },
|
|
18
19
|
{ "path": "../ui-react-utils/tsconfig.build.json" },
|
|
20
|
+
{ "path": "../ui-testable/tsconfig.build.json" },
|
|
19
21
|
{ "path": "../ui-utils/tsconfig.build.json" }
|
|
20
22
|
]
|
|
21
23
|
}
|