@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.
Files changed (44) hide show
  1. package/CHANGELOG.md +5 -18
  2. package/es/TreeBrowser/TreeButton/index.js +6 -6
  3. package/es/TreeBrowser/TreeButton/props.js +21 -1
  4. package/es/TreeBrowser/TreeCollection/index.js +6 -6
  5. package/es/TreeBrowser/TreeCollection/props.js +32 -1
  6. package/es/TreeBrowser/TreeNode/index.js +6 -6
  7. package/es/TreeBrowser/TreeNode/props.js +16 -1
  8. package/es/TreeBrowser/index.js +6 -6
  9. package/es/TreeBrowser/props.js +27 -1
  10. package/lib/TreeBrowser/TreeButton/index.js +5 -5
  11. package/lib/TreeBrowser/TreeButton/props.js +22 -1
  12. package/lib/TreeBrowser/TreeCollection/index.js +5 -5
  13. package/lib/TreeBrowser/TreeCollection/props.js +33 -1
  14. package/lib/TreeBrowser/TreeNode/index.js +5 -5
  15. package/lib/TreeBrowser/TreeNode/props.js +17 -1
  16. package/lib/TreeBrowser/index.js +5 -5
  17. package/lib/TreeBrowser/props.js +27 -1
  18. package/package.json +17 -14
  19. package/src/TreeBrowser/TreeButton/index.tsx +4 -2
  20. package/src/TreeBrowser/TreeButton/props.ts +28 -2
  21. package/src/TreeBrowser/TreeCollection/index.tsx +5 -3
  22. package/src/TreeBrowser/TreeCollection/props.ts +40 -2
  23. package/src/TreeBrowser/TreeNode/index.tsx +5 -7
  24. package/src/TreeBrowser/TreeNode/props.ts +23 -2
  25. package/src/TreeBrowser/index.tsx +4 -2
  26. package/src/TreeBrowser/props.ts +43 -4
  27. package/tsconfig.build.json +2 -0
  28. package/tsconfig.build.tsbuildinfo +1 -1
  29. package/types/TreeBrowser/TreeButton/index.d.ts +1 -0
  30. package/types/TreeBrowser/TreeButton/index.d.ts.map +1 -1
  31. package/types/TreeBrowser/TreeButton/props.d.ts +3 -2
  32. package/types/TreeBrowser/TreeButton/props.d.ts.map +1 -1
  33. package/types/TreeBrowser/TreeCollection/index.d.ts +10 -2
  34. package/types/TreeBrowser/TreeCollection/index.d.ts.map +1 -1
  35. package/types/TreeBrowser/TreeCollection/props.d.ts +3 -2
  36. package/types/TreeBrowser/TreeCollection/props.d.ts.map +1 -1
  37. package/types/TreeBrowser/TreeNode/index.d.ts +1 -0
  38. package/types/TreeBrowser/TreeNode/index.d.ts.map +1 -1
  39. package/types/TreeBrowser/TreeNode/props.d.ts +3 -2
  40. package/types/TreeBrowser/TreeNode/props.d.ts.map +1 -1
  41. package/types/TreeBrowser/index.d.ts +1 -0
  42. package/types/TreeBrowser/index.d.ts.map +1 -1
  43. package/types/TreeBrowser/props.d.ts +5 -4
  44. package/types/TreeBrowser/props.d.ts.map +1 -1
@@ -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;
@@ -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.1-snapshot-2",
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.1-snapshot-2",
27
- "@instructure/ui-babel-preset": "10.26.1-snapshot-2",
28
- "@instructure/ui-color-utils": "10.26.1-snapshot-2",
29
- "@instructure/ui-themes": "10.26.1-snapshot-2",
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": "15.0.7",
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.1-snapshot-2",
37
- "@instructure/shared-types": "10.26.1-snapshot-2",
38
- "@instructure/ui-icons": "10.26.1-snapshot-2",
39
- "@instructure/ui-img": "10.26.1-snapshot-2",
40
- "@instructure/ui-react-utils": "10.26.1-snapshot-2",
41
- "@instructure/ui-utils": "10.26.1-snapshot-2",
42
- "keycode": "^2"
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": ">=18 <=19"
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 { TreeBrowserButtonTheme } from '@instructure/shared-types'
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<any>,
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
- import type { TreeBrowserCollectionTheme } from '@instructure/shared-types'
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 type { TreeBrowserButtonTheme } from '@instructure/shared-types'
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>
@@ -22,9 +22,16 @@
22
22
  * SOFTWARE.
23
23
  */
24
24
 
25
- import type { TreeBrowserTheme } from '@instructure/shared-types'
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 React, { ReactElement } from 'react'
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) => React.JSX.Element
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 }
@@ -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
  }