@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 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
+ [![Version](https://img.shields.io/npm/v/@availity/mui-tree.svg?style=for-the-badge)](https://www.npmjs.com/package/@availity/mui-tree)
6
+ [![NPM Downloads](https://img.shields.io/npm/dt/@availity/mui-tree.svg?style=for-the-badge)](https://www.npmjs.com/package/@availity/mui-tree)
7
+ [![Dependency Status](https://img.shields.io/librariesio/release/npm/@availity/mui-tree?style=for-the-badge)](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.
@@ -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 };
@@ -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
+ };
@@ -0,0 +1,7 @@
1
+ import { Markdown } from '@storybook/blocks';
2
+ import { Meta } from '@storybook/addon-docs';
3
+ import ReadMe from './README.md?raw';
4
+
5
+ <Meta title="Components/TreeView/Introduction" />
6
+
7
+ <Markdown>{ReadMe}</Markdown>
package/jest.config.js ADDED
@@ -0,0 +1,7 @@
1
+ const global = require('../../jest.config.global');
2
+
3
+ module.exports = {
4
+ ...global,
5
+ displayName: 'tree',
6
+ coverageDirectory: '../../coverage/tree',
7
+ };
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,3 @@
1
+ export * from './lib/TreeView';
2
+ export * from './lib/DynamicTreeView';
3
+ export * from './lib/TreeItem';
@@ -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,5 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "include": ["."],
4
+ "exclude": ["dist", "build", "node_modules"]
5
+ }
@@ -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
+ }