@availity/mui-tree 0.1.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.
- package/CHANGELOG.md +15 -0
- package/README.md +65 -0
- package/dist/index.d.mts +17 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +102 -0
- package/dist/index.mjs +76 -0
- package/introduction.stories.mdx +7 -0
- package/jest.config.js +7 -0
- package/package.json +54 -0
- package/project.json +41 -0
- package/src/index.ts +3 -0
- package/src/lib/DynamicTreeView.stories.tsx +72 -0
- package/src/lib/DynamicTreeView.test.tsx +43 -0
- package/src/lib/DynamicTreeView.tsx +13 -0
- package/src/lib/TreeItem.stories.tsx +61 -0
- package/src/lib/TreeItem.test.tsx +39 -0
- package/src/lib/TreeItem.tsx +25 -0
- package/src/lib/TreeView.stories.tsx +52 -0
- package/src/lib/TreeView.test.tsx +18 -0
- package/src/lib/TreeView.tsx +7 -0
- package/tsconfig.json +5 -0
- package/tsconfig.spec.json +10 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
|
|
4
|
+
|
|
5
|
+
## 0.1.0 (2024-09-09)
|
|
6
|
+
|
|
7
|
+
### Dependency Updates
|
|
8
|
+
|
|
9
|
+
* `mui-icon` updated to version `0.1.0`
|
|
10
|
+
* `mui-layout` updated to version `0.1.0`
|
|
11
|
+
|
|
12
|
+
### Features
|
|
13
|
+
|
|
14
|
+
* **mui-tree:** add truncate props ([fef6fff](https://github.com/Availity/element/commit/fef6fffc317280d81d7521358e4f23383d607a74))
|
|
15
|
+
* **mui-tree:** initial commit ([de6c23b](https://github.com/Availity/element/commit/de6c23bfdd01d58ee0ddac116ed80c3d8942ad1e))
|
package/README.md
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# @availity/mui-tree
|
|
2
|
+
|
|
3
|
+
> Availity MUI Tree component to be used with @availity/element design system.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@availity/mui-tree)
|
|
6
|
+
[](https://www.npmjs.com/package/@availity/mui-tree)
|
|
7
|
+
[](https://github.com/Availity/element/blob/main/packages/mui-tree/package.json)
|
|
8
|
+
|
|
9
|
+
## Documentation
|
|
10
|
+
|
|
11
|
+
This package extends the MUI Tree component: [MUI Tree Docs](https://mui.com/x/react-tree-view/)
|
|
12
|
+
|
|
13
|
+
Live demo and documentation in our [Storybook](https://availity.github.io/element/?path=/docs/components-tree-introduction--docs)
|
|
14
|
+
|
|
15
|
+
Availity standards for design and usage can be found in the [Availity Design Guide](https://zeroheight.com/2e36e50c7)
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
### Import Through @availity/element (Recommended)
|
|
20
|
+
|
|
21
|
+
#### NPM
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install @availity/element
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
#### Yarn
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
yarn add @availity/element
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Direct Import
|
|
34
|
+
|
|
35
|
+
#### NPM
|
|
36
|
+
|
|
37
|
+
_This package has a few peer dependencies. Add `@mui/material`, `@emotion/react`, & `@availity/mui-icon` to your project if not already installed._
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm install @availity/mui-tree
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
#### Yarn
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
yarn add @availity/mui-tree
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Usage
|
|
50
|
+
|
|
51
|
+
#### Import through @availity/element
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
import { DynamicTreeView, TreeView, TreeItem } from '@availity/element';
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
#### Direct import
|
|
58
|
+
|
|
59
|
+
```tsx
|
|
60
|
+
import { DynamicTreeView, TreeView, TreeItem } from '@availity/mui-tree';
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
#### DynamicTreeView vs TreeView
|
|
64
|
+
|
|
65
|
+
TreeView receives its items as JSX Children. DynamicTreeView receives its items via an items prop making it easier to dynamically load them from an external source. Furthermore, DynamicTreeView includes the ability to make the TreeItem's editable.
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SimpleTreeViewProps } from '@mui/x-tree-view/SimpleTreeView';
|
|
2
|
+
import { RichTreeViewProps } from '@mui/x-tree-view/RichTreeView';
|
|
3
|
+
import { TreeViewBaseItem } from '@mui/x-tree-view/models';
|
|
4
|
+
import { TreeItem2Props } from '@mui/x-tree-view/TreeItem2';
|
|
5
|
+
|
|
6
|
+
type TreeViewProps = SimpleTreeViewProps<true>;
|
|
7
|
+
declare const TreeView: ({ children, ...rest }: TreeViewProps) => JSX.Element;
|
|
8
|
+
|
|
9
|
+
type DynamicTreeViewProps = RichTreeViewProps<TreeViewBaseItem, true>;
|
|
10
|
+
declare const DynamicTreeView: ({ children, slots, ...rest }: DynamicTreeViewProps) => JSX.Element;
|
|
11
|
+
|
|
12
|
+
interface TreeItemProps extends TreeItem2Props {
|
|
13
|
+
truncate?: boolean;
|
|
14
|
+
}
|
|
15
|
+
declare const TreeItem: ({ children, slots, slotProps, truncate, ...rest }: TreeItemProps) => JSX.Element;
|
|
16
|
+
|
|
17
|
+
export { DynamicTreeView, type DynamicTreeViewProps, TreeItem, type TreeItemProps, TreeView, type TreeViewProps };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SimpleTreeViewProps } from '@mui/x-tree-view/SimpleTreeView';
|
|
2
|
+
import { RichTreeViewProps } from '@mui/x-tree-view/RichTreeView';
|
|
3
|
+
import { TreeViewBaseItem } from '@mui/x-tree-view/models';
|
|
4
|
+
import { TreeItem2Props } from '@mui/x-tree-view/TreeItem2';
|
|
5
|
+
|
|
6
|
+
type TreeViewProps = SimpleTreeViewProps<true>;
|
|
7
|
+
declare const TreeView: ({ children, ...rest }: TreeViewProps) => JSX.Element;
|
|
8
|
+
|
|
9
|
+
type DynamicTreeViewProps = RichTreeViewProps<TreeViewBaseItem, true>;
|
|
10
|
+
declare const DynamicTreeView: ({ children, slots, ...rest }: DynamicTreeViewProps) => JSX.Element;
|
|
11
|
+
|
|
12
|
+
interface TreeItemProps extends TreeItem2Props {
|
|
13
|
+
truncate?: boolean;
|
|
14
|
+
}
|
|
15
|
+
declare const TreeItem: ({ children, slots, slotProps, truncate, ...rest }: TreeItemProps) => JSX.Element;
|
|
16
|
+
|
|
17
|
+
export { DynamicTreeView, type DynamicTreeViewProps, TreeItem, type TreeItemProps, TreeView, type TreeViewProps };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __defProps = Object.defineProperties;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
10
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
11
|
+
var __spreadValues = (a, b) => {
|
|
12
|
+
for (var prop in b || (b = {}))
|
|
13
|
+
if (__hasOwnProp.call(b, prop))
|
|
14
|
+
__defNormalProp(a, prop, b[prop]);
|
|
15
|
+
if (__getOwnPropSymbols)
|
|
16
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
17
|
+
if (__propIsEnum.call(b, prop))
|
|
18
|
+
__defNormalProp(a, prop, b[prop]);
|
|
19
|
+
}
|
|
20
|
+
return a;
|
|
21
|
+
};
|
|
22
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
23
|
+
var __objRest = (source, exclude) => {
|
|
24
|
+
var target = {};
|
|
25
|
+
for (var prop in source)
|
|
26
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
27
|
+
target[prop] = source[prop];
|
|
28
|
+
if (source != null && __getOwnPropSymbols)
|
|
29
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
30
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
31
|
+
target[prop] = source[prop];
|
|
32
|
+
}
|
|
33
|
+
return target;
|
|
34
|
+
};
|
|
35
|
+
var __export = (target, all) => {
|
|
36
|
+
for (var name in all)
|
|
37
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
38
|
+
};
|
|
39
|
+
var __copyProps = (to, from, except, desc) => {
|
|
40
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
41
|
+
for (let key of __getOwnPropNames(from))
|
|
42
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
43
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
44
|
+
}
|
|
45
|
+
return to;
|
|
46
|
+
};
|
|
47
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
48
|
+
|
|
49
|
+
// src/index.ts
|
|
50
|
+
var src_exports = {};
|
|
51
|
+
__export(src_exports, {
|
|
52
|
+
DynamicTreeView: () => DynamicTreeView,
|
|
53
|
+
TreeItem: () => TreeItem,
|
|
54
|
+
TreeView: () => TreeView
|
|
55
|
+
});
|
|
56
|
+
module.exports = __toCommonJS(src_exports);
|
|
57
|
+
|
|
58
|
+
// src/lib/TreeView.tsx
|
|
59
|
+
var import_SimpleTreeView = require("@mui/x-tree-view/SimpleTreeView");
|
|
60
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
61
|
+
var TreeView = (_a) => {
|
|
62
|
+
var _b = _a, { children } = _b, rest = __objRest(_b, ["children"]);
|
|
63
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_SimpleTreeView.SimpleTreeView, __spreadProps(__spreadValues({}, rest), { children }));
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// src/lib/DynamicTreeView.tsx
|
|
67
|
+
var import_RichTreeView = require("@mui/x-tree-view/RichTreeView");
|
|
68
|
+
|
|
69
|
+
// src/lib/TreeItem.tsx
|
|
70
|
+
var import_TreeItem2 = require("@mui/x-tree-view/TreeItem2");
|
|
71
|
+
var import_mui_icon = require("@availity/mui-icon");
|
|
72
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
73
|
+
var TreeItem = (_a) => {
|
|
74
|
+
var _b = _a, { children, slots, slotProps, truncate } = _b, rest = __objRest(_b, ["children", "slots", "slotProps", "truncate"]);
|
|
75
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
76
|
+
import_TreeItem2.TreeItem2,
|
|
77
|
+
__spreadProps(__spreadValues({}, rest), {
|
|
78
|
+
slots: __spreadProps(__spreadValues({}, slots), { expandIcon: import_mui_icon.TriangleRightIcon, collapseIcon: import_mui_icon.TriangleExpandIcon }),
|
|
79
|
+
slotProps: __spreadProps(__spreadValues({}, slotProps), {
|
|
80
|
+
expandIcon: { fontSize: "Xsmall" },
|
|
81
|
+
collapseIcon: { fontSize: "Xsmall" },
|
|
82
|
+
label: {
|
|
83
|
+
style: truncate ? { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" } : {}
|
|
84
|
+
}
|
|
85
|
+
}),
|
|
86
|
+
children
|
|
87
|
+
})
|
|
88
|
+
);
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// src/lib/DynamicTreeView.tsx
|
|
92
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
93
|
+
var DynamicTreeView = (_a) => {
|
|
94
|
+
var _b = _a, { children, slots } = _b, rest = __objRest(_b, ["children", "slots"]);
|
|
95
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_RichTreeView.RichTreeView, __spreadProps(__spreadValues({}, rest), { slots: __spreadProps(__spreadValues({}, slots), { item: TreeItem }), children }));
|
|
96
|
+
};
|
|
97
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
98
|
+
0 && (module.exports = {
|
|
99
|
+
DynamicTreeView,
|
|
100
|
+
TreeItem,
|
|
101
|
+
TreeView
|
|
102
|
+
});
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
var __objRest = (source, exclude) => {
|
|
21
|
+
var target = {};
|
|
22
|
+
for (var prop in source)
|
|
23
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
24
|
+
target[prop] = source[prop];
|
|
25
|
+
if (source != null && __getOwnPropSymbols)
|
|
26
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
27
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
28
|
+
target[prop] = source[prop];
|
|
29
|
+
}
|
|
30
|
+
return target;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// src/lib/TreeView.tsx
|
|
34
|
+
import { SimpleTreeView } from "@mui/x-tree-view/SimpleTreeView";
|
|
35
|
+
import { jsx } from "react/jsx-runtime";
|
|
36
|
+
var TreeView = (_a) => {
|
|
37
|
+
var _b = _a, { children } = _b, rest = __objRest(_b, ["children"]);
|
|
38
|
+
return /* @__PURE__ */ jsx(SimpleTreeView, __spreadProps(__spreadValues({}, rest), { children }));
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// src/lib/DynamicTreeView.tsx
|
|
42
|
+
import { RichTreeView } from "@mui/x-tree-view/RichTreeView";
|
|
43
|
+
|
|
44
|
+
// src/lib/TreeItem.tsx
|
|
45
|
+
import { TreeItem2 } from "@mui/x-tree-view/TreeItem2";
|
|
46
|
+
import { TriangleRightIcon, TriangleExpandIcon } from "@availity/mui-icon";
|
|
47
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
48
|
+
var TreeItem = (_a) => {
|
|
49
|
+
var _b = _a, { children, slots, slotProps, truncate } = _b, rest = __objRest(_b, ["children", "slots", "slotProps", "truncate"]);
|
|
50
|
+
return /* @__PURE__ */ jsx2(
|
|
51
|
+
TreeItem2,
|
|
52
|
+
__spreadProps(__spreadValues({}, rest), {
|
|
53
|
+
slots: __spreadProps(__spreadValues({}, slots), { expandIcon: TriangleRightIcon, collapseIcon: TriangleExpandIcon }),
|
|
54
|
+
slotProps: __spreadProps(__spreadValues({}, slotProps), {
|
|
55
|
+
expandIcon: { fontSize: "Xsmall" },
|
|
56
|
+
collapseIcon: { fontSize: "Xsmall" },
|
|
57
|
+
label: {
|
|
58
|
+
style: truncate ? { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" } : {}
|
|
59
|
+
}
|
|
60
|
+
}),
|
|
61
|
+
children
|
|
62
|
+
})
|
|
63
|
+
);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// src/lib/DynamicTreeView.tsx
|
|
67
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
68
|
+
var DynamicTreeView = (_a) => {
|
|
69
|
+
var _b = _a, { children, slots } = _b, rest = __objRest(_b, ["children", "slots"]);
|
|
70
|
+
return /* @__PURE__ */ jsx3(RichTreeView, __spreadProps(__spreadValues({}, rest), { slots: __spreadProps(__spreadValues({}, slots), { item: TreeItem }), children }));
|
|
71
|
+
};
|
|
72
|
+
export {
|
|
73
|
+
DynamicTreeView,
|
|
74
|
+
TreeItem,
|
|
75
|
+
TreeView
|
|
76
|
+
};
|
package/jest.config.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@availity/mui-tree",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Availity MUI Tree Component - part of the @availity/element design system",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"react",
|
|
7
|
+
"typescript",
|
|
8
|
+
"availity",
|
|
9
|
+
"mui"
|
|
10
|
+
],
|
|
11
|
+
"homepage": "https://availity.github.io/element/?path=/docs/components-tree-introduction--docs",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/Availity/element/issues"
|
|
14
|
+
},
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "https://github.com/Availity/element.git",
|
|
18
|
+
"directory": "packages/tree"
|
|
19
|
+
},
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"author": "Availity Developers <AVOSS@availity.com>",
|
|
22
|
+
"browser": "./dist/index.js",
|
|
23
|
+
"main": "./dist/index.js",
|
|
24
|
+
"module": "./dist/index.mjs",
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsup src/index.ts --format esm,cjs --dts",
|
|
28
|
+
"dev": "tsup src/index.ts --format esm,cjs --watch --dts",
|
|
29
|
+
"clean": "rm -rf dist",
|
|
30
|
+
"clean:nm": "rm -rf node_modules",
|
|
31
|
+
"publish": "yarn npm publish --tolerate-republish --access public",
|
|
32
|
+
"publish:canary": "yarn npm publish --access public --tag canary"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@availity/mui-icon": "^0.10.1",
|
|
36
|
+
"@availity/mui-layout": "^0.1.6",
|
|
37
|
+
"@mui/material": "^5.15.15",
|
|
38
|
+
"react": "18.2.0",
|
|
39
|
+
"react-dom": "18.2.0",
|
|
40
|
+
"tsup": "^8.0.2",
|
|
41
|
+
"typescript": "^5.4.5"
|
|
42
|
+
},
|
|
43
|
+
"peerDependencies": {
|
|
44
|
+
"@availity/mui-icon": "^0.10.1",
|
|
45
|
+
"@mui/material": "^5.11.9",
|
|
46
|
+
"react": ">=16.3.0"
|
|
47
|
+
},
|
|
48
|
+
"publishConfig": {
|
|
49
|
+
"access": "public"
|
|
50
|
+
},
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"@mui/x-tree-view": "^7.15.0"
|
|
53
|
+
}
|
|
54
|
+
}
|
package/project.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mui-tree",
|
|
3
|
+
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
+
"sourceRoot": "packages/tree/src",
|
|
5
|
+
"projectType": "library",
|
|
6
|
+
"tags": [],
|
|
7
|
+
"targets": {
|
|
8
|
+
"lint": {
|
|
9
|
+
"executor": "@nx/eslint:lint",
|
|
10
|
+
"options": {
|
|
11
|
+
"eslintConfig": ".eslintrc.json",
|
|
12
|
+
"silent": false,
|
|
13
|
+
"fix": false,
|
|
14
|
+
"cache": true,
|
|
15
|
+
"cacheLocation": "./node_modules/.cache/tree/.eslintcache",
|
|
16
|
+
"maxWarnings": -1,
|
|
17
|
+
"quiet": false,
|
|
18
|
+
"noEslintrc": false,
|
|
19
|
+
"hasTypeAwareRules": true,
|
|
20
|
+
"cacheStrategy": "metadata"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"test": {
|
|
24
|
+
"executor": "@nx/jest:jest",
|
|
25
|
+
"outputs": ["{workspaceRoot}/coverage/tree"],
|
|
26
|
+
"options": {
|
|
27
|
+
"jestConfig": "packages/tree/jest.config.js"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"version": {
|
|
31
|
+
"executor": "@jscutlery/semver:version",
|
|
32
|
+
"options": {
|
|
33
|
+
"preset": "conventional",
|
|
34
|
+
"commitMessageFormat": "chore({projectName}): release version ${version} [skip ci]",
|
|
35
|
+
"tagPrefix": "@availity/{projectName}@",
|
|
36
|
+
"trackDeps": true,
|
|
37
|
+
"skipCommitTypes": ["docs"]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// Each exported component in the package should have its own stories file
|
|
2
|
+
|
|
3
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
4
|
+
import type { TreeViewBaseItem } from '@mui/x-tree-view/models';
|
|
5
|
+
import { DynamicTreeView, DynamicTreeViewProps } from './DynamicTreeView';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The `DynamicTreeView` receives its items via an `items` prop, making it easier
|
|
9
|
+
* to dynamically load them from an external source. Furthermore,
|
|
10
|
+
* `DynamicTreeView` includes the ability to make the `TreeItem`'s editable.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const meta: Meta<typeof DynamicTreeView> = {
|
|
14
|
+
title: 'Components/TreeView/DynamicTreeView',
|
|
15
|
+
component: DynamicTreeView,
|
|
16
|
+
tags: ['autodocs'],
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export default meta;
|
|
20
|
+
|
|
21
|
+
const items: TreeViewBaseItem[] = [
|
|
22
|
+
{
|
|
23
|
+
id: 'tree-1',
|
|
24
|
+
label: 'Tree 1',
|
|
25
|
+
children: [
|
|
26
|
+
{ id: 'sub-tree-1.1', label: 'Sub Tree 1.1' },
|
|
27
|
+
{ id: 'sub-tree-1.2', label: 'Sub Tree 1.2' },
|
|
28
|
+
{ id: 'sub-tree-1.3', label: 'Sub Tree 1.3' },
|
|
29
|
+
],
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: 'tree-2',
|
|
33
|
+
label: 'Tree 2',
|
|
34
|
+
children: [
|
|
35
|
+
{ id: 'sub-tree-2.1', label: 'Sub Tree 2.1' },
|
|
36
|
+
{ id: 'sub-tree-2.2', label: 'Sub Tree 2.2' },
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
id: 'tree-3',
|
|
41
|
+
label: 'Tree 3',
|
|
42
|
+
children: [{ id: 'sub-tree-3.1', label: 'Sub Tree 3.1' }],
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: 'tree-4',
|
|
46
|
+
label: 'Tree 4',
|
|
47
|
+
children: [{ id: 'sub-tree-4.1', label: 'Sub Tree 4.1' }],
|
|
48
|
+
},
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
export const _DynamicTreeView: StoryObj<typeof DynamicTreeView> = {
|
|
52
|
+
render: (args: DynamicTreeViewProps) => <DynamicTreeView {...args} />,
|
|
53
|
+
args: {
|
|
54
|
+
items,
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
export const _DynamicTreeViewCheckbox: StoryObj<typeof DynamicTreeView> = {
|
|
58
|
+
render: (args: DynamicTreeViewProps) => <DynamicTreeView {...args} />,
|
|
59
|
+
args: {
|
|
60
|
+
items,
|
|
61
|
+
checkboxSelection: true,
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export const _DynamicTreeViewEditable: StoryObj<typeof DynamicTreeView> = {
|
|
66
|
+
render: (args: DynamicTreeViewProps) => <DynamicTreeView {...args} />,
|
|
67
|
+
args: {
|
|
68
|
+
items,
|
|
69
|
+
isItemEditable: true,
|
|
70
|
+
experimentalFeatures: { labelEditing: true },
|
|
71
|
+
},
|
|
72
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { fireEvent, render } from '@testing-library/react';
|
|
2
|
+
import { DynamicTreeView } from './DynamicTreeView';
|
|
3
|
+
|
|
4
|
+
describe('Tree', () => {
|
|
5
|
+
test('should render successfully', () => {
|
|
6
|
+
const items = [
|
|
7
|
+
{
|
|
8
|
+
id: 'tree-1',
|
|
9
|
+
label: 'Tree 1',
|
|
10
|
+
children: [
|
|
11
|
+
{ id: 'sub-tree-1.1', label: 'Sub Tree 1.1' },
|
|
12
|
+
{ id: 'sub-tree-1.2', label: 'Sub Tree 1.2' },
|
|
13
|
+
{ id: 'sub-tree-1.3', label: 'Sub Tree 1.3' },
|
|
14
|
+
],
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
id: 'tree-2',
|
|
18
|
+
label: 'Tree 2',
|
|
19
|
+
children: [
|
|
20
|
+
{ id: 'sub-tree-2.1', label: 'Sub Tree 2.1' },
|
|
21
|
+
{ id: 'sub-tree-2.2', label: 'Sub Tree 2.2' },
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: 'tree-3',
|
|
26
|
+
label: 'Tree 3',
|
|
27
|
+
children: [{ id: 'sub-tree-3.1', label: 'Sub Tree 3.1' }],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: 'tree-4',
|
|
31
|
+
label: 'Tree 4',
|
|
32
|
+
children: [{ id: 'sub-tree-4.1', label: 'Sub Tree 4.1' }],
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
const { getByText } = render(<DynamicTreeView items={items} />);
|
|
36
|
+
|
|
37
|
+
const Tree1 = getByText('Tree 1');
|
|
38
|
+
|
|
39
|
+
fireEvent.click(Tree1);
|
|
40
|
+
|
|
41
|
+
expect(getByText('Sub Tree 1.1')).toBeTruthy();
|
|
42
|
+
});
|
|
43
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { RichTreeView, RichTreeViewProps as MuiDynamicTreeViewProps } from '@mui/x-tree-view/RichTreeView';
|
|
2
|
+
import type { TreeViewBaseItem } from '@mui/x-tree-view/models';
|
|
3
|
+
import { TreeItem } from './TreeItem';
|
|
4
|
+
|
|
5
|
+
export type DynamicTreeViewProps = MuiDynamicTreeViewProps<TreeViewBaseItem, true>;
|
|
6
|
+
|
|
7
|
+
export const DynamicTreeView = ({ children, slots, ...rest }: DynamicTreeViewProps): JSX.Element => {
|
|
8
|
+
return (
|
|
9
|
+
<RichTreeView {...rest} slots={{ ...slots, item: TreeItem }}>
|
|
10
|
+
{children}
|
|
11
|
+
</RichTreeView>
|
|
12
|
+
);
|
|
13
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Each exported component in the package should have its own stories file
|
|
2
|
+
|
|
3
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
4
|
+
import { TreeItem, TreeItemProps } from './TreeItem';
|
|
5
|
+
import { TreeView } from './TreeView';
|
|
6
|
+
import { FolderIcon } from '@availity/mui-icon';
|
|
7
|
+
import { Grid } from '@availity/mui-layout';
|
|
8
|
+
|
|
9
|
+
const meta: Meta<typeof TreeItem> = {
|
|
10
|
+
title: 'Components/TreeView/TreeItem',
|
|
11
|
+
component: TreeItem,
|
|
12
|
+
tags: ['autodocs'],
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default meta;
|
|
16
|
+
|
|
17
|
+
export const _Tree: StoryObj<typeof TreeItem> = {
|
|
18
|
+
render: (args: TreeItemProps) => (
|
|
19
|
+
<TreeView>
|
|
20
|
+
<TreeItem {...args} />
|
|
21
|
+
</TreeView>
|
|
22
|
+
),
|
|
23
|
+
args: {
|
|
24
|
+
truncate: true,
|
|
25
|
+
itemId: 'Tree Item Label',
|
|
26
|
+
label: 'Tree Item Label',
|
|
27
|
+
children: <TreeItem itemId="This text is a child of TreeItem" label="This text is a child of TreeItem" />,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const _TreeCheckboxSelection: StoryObj<typeof TreeItem> = {
|
|
32
|
+
render: (args: TreeItemProps) => (
|
|
33
|
+
<TreeView checkboxSelection>
|
|
34
|
+
<TreeItem {...args} />
|
|
35
|
+
</TreeView>
|
|
36
|
+
),
|
|
37
|
+
args: {
|
|
38
|
+
itemId: 'Tree Item Label',
|
|
39
|
+
label: 'Tree Item Label',
|
|
40
|
+
children: <TreeItem itemId="This text is a child of TreeItem" label="This text is a child of TreeItem" />,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export const _TreeIcon: StoryObj<typeof TreeItem> = {
|
|
45
|
+
render: (args: TreeItemProps) => (
|
|
46
|
+
<TreeView checkboxSelection>
|
|
47
|
+
<TreeItem {...args} />
|
|
48
|
+
</TreeView>
|
|
49
|
+
),
|
|
50
|
+
args: {
|
|
51
|
+
itemId: 'tree-item',
|
|
52
|
+
label: (
|
|
53
|
+
<Grid container alignItems="center">
|
|
54
|
+
<FolderIcon sx={{ marginRight: 1 }} />
|
|
55
|
+
Tree Item
|
|
56
|
+
</Grid>
|
|
57
|
+
),
|
|
58
|
+
// slots: { icon: FolderIcon },
|
|
59
|
+
children: <TreeItem itemId="sub-tree-item" label="Sub Tree Item" />,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { fireEvent, render } from '@testing-library/react';
|
|
2
|
+
import { TreeItem } from './TreeItem';
|
|
3
|
+
import { TreeView } from './TreeView';
|
|
4
|
+
import { TriangleRightIcon, TriangleExpandIcon } from '@availity/mui-icon';
|
|
5
|
+
|
|
6
|
+
describe('TreeView', () => {
|
|
7
|
+
test('should render successfully', () => {
|
|
8
|
+
const { getByText } = render(
|
|
9
|
+
<TreeView>
|
|
10
|
+
<TreeItem itemId="test-tree-item" label="Test" />
|
|
11
|
+
</TreeView>
|
|
12
|
+
);
|
|
13
|
+
expect(getByText('Test')).toBeTruthy();
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
test('should use correct command and collapse icons', () => {
|
|
17
|
+
const { container, getByText } = render(
|
|
18
|
+
<TreeView>
|
|
19
|
+
<TreeItem
|
|
20
|
+
itemId="test-tree-item"
|
|
21
|
+
label="Test"
|
|
22
|
+
children={<TreeItem itemId="test-sub-tree-item" label="Sub Item Test" />}
|
|
23
|
+
/>
|
|
24
|
+
</TreeView>
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
const expandIcon = container.getElementsByTagName('path');
|
|
28
|
+
|
|
29
|
+
const { container: RenderedTriangleRightIcon } = render(<TriangleRightIcon />);
|
|
30
|
+
expect(expandIcon[0]).toStrictEqual(RenderedTriangleRightIcon.getElementsByTagName('path')[0]);
|
|
31
|
+
|
|
32
|
+
fireEvent.click(getByText('Test'));
|
|
33
|
+
|
|
34
|
+
const collapseIcon = container.getElementsByTagName('path');
|
|
35
|
+
|
|
36
|
+
const { container: RenderedTriangleExpandIcon } = render(<TriangleExpandIcon />);
|
|
37
|
+
expect(collapseIcon[0]).toStrictEqual(RenderedTriangleExpandIcon.getElementsByTagName('path')[0]);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { TreeItem2, TreeItem2Props as MuiTreeItem2Props } from '@mui/x-tree-view/TreeItem2';
|
|
2
|
+
import { TriangleRightIcon, TriangleExpandIcon } from '@availity/mui-icon';
|
|
3
|
+
|
|
4
|
+
export interface TreeItemProps extends MuiTreeItem2Props {
|
|
5
|
+
truncate?: boolean;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const TreeItem = ({ children, slots, slotProps, truncate, ...rest }: TreeItemProps): JSX.Element => {
|
|
9
|
+
return (
|
|
10
|
+
<TreeItem2
|
|
11
|
+
{...rest}
|
|
12
|
+
slots={{ ...slots, expandIcon: TriangleRightIcon, collapseIcon: TriangleExpandIcon }}
|
|
13
|
+
slotProps={{
|
|
14
|
+
...slotProps,
|
|
15
|
+
expandIcon: { fontSize: 'Xsmall' },
|
|
16
|
+
collapseIcon: { fontSize: 'Xsmall' },
|
|
17
|
+
label: {
|
|
18
|
+
style: truncate ? { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' } : {},
|
|
19
|
+
},
|
|
20
|
+
}}
|
|
21
|
+
>
|
|
22
|
+
{children}
|
|
23
|
+
</TreeItem2>
|
|
24
|
+
);
|
|
25
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Each exported component in the package should have its own stories file
|
|
2
|
+
|
|
3
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
4
|
+
import { TreeView, TreeViewProps } from './TreeView';
|
|
5
|
+
import { TreeItem } from './TreeItem';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The `TreeView` component receives its items as JSX Children. This makes it
|
|
9
|
+
* a good option for hardcoded items.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const meta: Meta<typeof TreeView> = {
|
|
13
|
+
title: 'Components/TreeView/TreeView',
|
|
14
|
+
component: TreeView,
|
|
15
|
+
tags: ['autodocs'],
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export default meta;
|
|
19
|
+
|
|
20
|
+
const items = (
|
|
21
|
+
<>
|
|
22
|
+
<TreeItem itemId="tree-1" label="Tree 1">
|
|
23
|
+
<TreeItem itemId="sub-tree-1.1" label="Sub Tree 1.1" />
|
|
24
|
+
<TreeItem itemId="sub-tree-1.2" label="Sub Tree 1.2" />
|
|
25
|
+
<TreeItem itemId="sub-tree-1.3" label="Sub Tree 1.3" />
|
|
26
|
+
</TreeItem>
|
|
27
|
+
<TreeItem itemId="tree-2" label="Tree 2">
|
|
28
|
+
<TreeItem itemId="sub-tree-2.1" label="Sub Tree 2.1" />
|
|
29
|
+
<TreeItem itemId="sub-tree-2.2" label="Sub Tree 2.2" />
|
|
30
|
+
</TreeItem>
|
|
31
|
+
<TreeItem itemId="tree-3" label="Tree 3">
|
|
32
|
+
<TreeItem itemId="sub-tree-3.1" label="Sub Tree 3.1" />
|
|
33
|
+
</TreeItem>
|
|
34
|
+
<TreeItem itemId="tree-4" label="Tree 4">
|
|
35
|
+
<TreeItem itemId="sub-tree-4.1" label="Sub Tree 4.1" />
|
|
36
|
+
</TreeItem>
|
|
37
|
+
</>
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
export const _TreeView: StoryObj<typeof TreeView> = {
|
|
41
|
+
render: (args: TreeViewProps) => <TreeView {...args} />,
|
|
42
|
+
args: {
|
|
43
|
+
children: items,
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export const _TreeViewCheckbox: StoryObj<typeof TreeView> = {
|
|
48
|
+
render: (args: TreeViewProps) => <TreeView checkboxSelection {...args} />,
|
|
49
|
+
args: {
|
|
50
|
+
children: items,
|
|
51
|
+
},
|
|
52
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { fireEvent, render } from '@testing-library/react';
|
|
2
|
+
import { TreeView } from './TreeView';
|
|
3
|
+
import { TreeItem } from './TreeItem';
|
|
4
|
+
|
|
5
|
+
describe('TreeView', () => {
|
|
6
|
+
test('should render successfully', () => {
|
|
7
|
+
const { getByText } = render(
|
|
8
|
+
<TreeView>
|
|
9
|
+
<TreeItem itemId="test" label="Test" children={<TreeItem itemId="sub-test" label="Sub Test" />} />
|
|
10
|
+
</TreeView>
|
|
11
|
+
);
|
|
12
|
+
const Tree1 = getByText('Test');
|
|
13
|
+
|
|
14
|
+
fireEvent.click(Tree1);
|
|
15
|
+
|
|
16
|
+
expect('Sub Test').toBeTruthy();
|
|
17
|
+
});
|
|
18
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { SimpleTreeView, SimpleTreeViewProps } from '@mui/x-tree-view/SimpleTreeView';
|
|
2
|
+
|
|
3
|
+
export type TreeViewProps = SimpleTreeViewProps<true>;
|
|
4
|
+
|
|
5
|
+
export const TreeView = ({ children, ...rest }: TreeViewProps): JSX.Element => {
|
|
6
|
+
return <SimpleTreeView {...rest}>{children}</SimpleTreeView>;
|
|
7
|
+
};
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"outDir": "../../dist/out-tsc",
|
|
5
|
+
"module": "commonjs",
|
|
6
|
+
"types": ["jest", "node", "@testing-library/jest-dom"],
|
|
7
|
+
"allowJs": true
|
|
8
|
+
},
|
|
9
|
+
"include": ["**/*.test.js", "**/*.test.ts", "**/*.test.tsx", "**/*.d.ts"]
|
|
10
|
+
}
|