sbwb-ds 1.0.63 → 1.0.65

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/dist/sbwb-ds.js CHANGED
@@ -52231,70 +52231,55 @@ F.p`
52231
52231
  color: ${({ disabled: e }) => e ? "#A6B0C4" : "#4E5666"};
52232
52232
  cursor: ${({ disabled: e }) => e ? "not-allowed" : "pointer"};
52233
52233
  `;
52234
- const khe = (e) => new CustomEvent("treeSelectionChanged", { detail: { selectedTitle: e } }), Wk = ({
52235
- node: e,
52236
- onClickNode: r,
52237
- onClickLeaf: t,
52238
- isOpenByDefault: n = !1
52239
- }) => {
52240
- const { title: a, childrens: i, disabled: o, isLeaf: s } = e, [l, c] = Ne(n), [u, h] = Ne(!1);
52234
+ const khe = (e) => new CustomEvent("treeSelectionChanged", { detail: { selectedTitle: e } }), Wk = ({ node: e }) => {
52235
+ const {
52236
+ title: r,
52237
+ childrens: t,
52238
+ disabled: n,
52239
+ isLeaf: a,
52240
+ onClickNode: i,
52241
+ onClickLeaf: o,
52242
+ isOpenByDefault: s,
52243
+ isSelectedByDefault: l
52244
+ } = e, c = (C) => {
52245
+ var y;
52246
+ return C.isSelectedByDefault ? !0 : ((y = C.childrens) == null ? void 0 : y.some(c)) ?? !1;
52247
+ }, u = s || c(e), [h, f] = Ne(u), [d, v] = Ne(l || !1);
52241
52248
  return It(() => {
52242
- const v = (p) => {
52243
- a !== p.detail.selectedTitle && h(!1);
52249
+ const C = (y) => {
52250
+ a && r !== y.detail.selectedTitle && v(!1);
52244
52251
  };
52245
- return window.addEventListener("treeSelectionChanged", v), () => {
52246
- window.removeEventListener("treeSelectionChanged", v);
52252
+ return window.addEventListener("treeSelectionChanged", C), () => {
52253
+ window.removeEventListener("treeSelectionChanged", C);
52247
52254
  };
52248
- }, [a]), /* @__PURE__ */ fe(Mhe, { children: [
52255
+ }, [r, a]), /* @__PURE__ */ fe(Mhe, { children: [
52249
52256
  /* @__PURE__ */ fe(Lhe, { onClick: () => {
52250
- o || (h(!0), window.dispatchEvent(khe(a)), s ? t && t(e) : (r && r(e), c(!l)));
52257
+ n || (a ? (v(!0), window.dispatchEvent(khe(r)), o && o(e)) : (i && i(e), f(!h)));
52251
52258
  }, children: [
52252
- (() => s ? /* @__PURE__ */ R(
52259
+ (() => a ? /* @__PURE__ */ R(
52253
52260
  Qa,
52254
52261
  {
52255
- iconName: u ? "FiberManualRecordFill1Sm" : "FiberManualRecordFILL0Sm",
52256
- color: o ? "#A6B0C4" : "#4E5666",
52257
- customStyles: o ? { cursor: "not-allowed" } : {},
52262
+ iconName: d ? "FiberManualRecordFill1Sm" : "FiberManualRecordFILL0Sm",
52263
+ color: n ? "#A6B0C4" : "#4E5666",
52264
+ customStyles: n ? { cursor: "not-allowed" } : {},
52258
52265
  width: "16px",
52259
52266
  height: "16px"
52260
52267
  }
52261
52268
  ) : /* @__PURE__ */ R(
52262
52269
  Qa,
52263
52270
  {
52264
- iconName: l ? "DoNotDisturbOnFill0Sm" : "AddCircleSm",
52265
- color: o ? "#A6B0C4" : "#4E5666",
52266
- customStyles: o ? { cursor: "not-allowed" } : {},
52271
+ iconName: h ? "DoNotDisturbOnFill0Sm" : "AddCircleSm",
52272
+ color: n ? "#A6B0C4" : "#4E5666",
52273
+ customStyles: n ? { cursor: "not-allowed" } : {},
52267
52274
  width: "16px",
52268
52275
  height: "16px"
52269
52276
  }
52270
52277
  ))(),
52271
- /* @__PURE__ */ R(Vhe, { disabled: o, children: a })
52278
+ /* @__PURE__ */ R(Vhe, { disabled: n, children: r })
52272
52279
  ] }),
52273
- l && i && /* @__PURE__ */ R(Ehe, { children: i.map((v, p) => /* @__PURE__ */ R(
52274
- Wk,
52275
- {
52276
- node: v,
52277
- onClickNode: r,
52278
- onClickLeaf: t
52279
- },
52280
- v.title + p
52281
- )) })
52280
+ h && t && /* @__PURE__ */ R(Ehe, { children: t.map((C, y) => /* @__PURE__ */ R(Wk, { node: C }, C.title + y)) })
52282
52281
  ] });
52283
- }, zme = ({
52284
- nodes: e,
52285
- onClickNode: r,
52286
- onClickLeaf: t,
52287
- isOpenByDefault: n = !1
52288
- }) => /* @__PURE__ */ R("div", { children: e.map((a, i) => /* @__PURE__ */ R(
52289
- Wk,
52290
- {
52291
- node: a,
52292
- onClickNode: r,
52293
- onClickLeaf: t,
52294
- isOpenByDefault: n
52295
- },
52296
- a.title + i
52297
- )) }), Dhe = (e, r, t) => (It(() => {
52282
+ }, zme = ({ nodes: e }) => /* @__PURE__ */ R("div", { children: e.map((r, t) => /* @__PURE__ */ R(Wk, { node: r }, r.title + t)) }), Dhe = (e, r, t) => (It(() => {
52298
52283
  let n;
52299
52284
  return r && e && (n = setTimeout(() => {
52300
52285
  t && t();
@@ -2290,7 +2290,7 @@ echarts.use([`+T+"]);":"Unknown series "+k))}return}if(h==="tooltip"){if(w){proc
2290
2290
  margin-left: 8px;
2291
2291
  color: ${({disabled:e})=>e?"#A6B0C4":"#4E5666"};
2292
2292
  cursor: ${({disabled:e})=>e?"not-allowed":"pointer"};
2293
- `;const p2e=e=>new CustomEvent("treeSelectionChanged",{detail:{selectedTitle:e}}),ZV=({node:e,onClickNode:r,onClickLeaf:t,isOpenByDefault:n=!1})=>{const{title:a,childrens:i,disabled:o,isLeaf:s}=e,[l,c]=$.useState(n),[u,h]=$.useState(!1);return $.useEffect(()=>{const v=p=>{a!==p.detail.selectedTitle&&h(!1)};return window.addEventListener("treeSelectionChanged",v),()=>{window.removeEventListener("treeSelectionChanged",v)}},[a]),he(h2e,{children:[he(f2e,{onClick:()=>{o||(h(!0),window.dispatchEvent(p2e(a)),s?t&&t(e):(r&&r(e),c(!l)))},children:[(()=>s?N(ra,{iconName:u?"FiberManualRecordFill1Sm":"FiberManualRecordFILL0Sm",color:o?"#A6B0C4":"#4E5666",customStyles:o?{cursor:"not-allowed"}:{},width:"16px",height:"16px"}):N(ra,{iconName:l?"DoNotDisturbOnFill0Sm":"AddCircleSm",color:o?"#A6B0C4":"#4E5666",customStyles:o?{cursor:"not-allowed"}:{},width:"16px",height:"16px"}))(),N(v2e,{disabled:o,children:a})]}),l&&i&&N(d2e,{children:i.map((v,p)=>N(ZV,{node:v,onClickNode:r,onClickLeaf:t},v.title+p))})]})},g2e=({nodes:e,onClickNode:r,onClickLeaf:t,isOpenByDefault:n=!1})=>N("div",{children:e.map((a,i)=>N(ZV,{node:a,onClickNode:r,onClickLeaf:t,isOpenByDefault:n},a.title+i))}),C2e=(e,r,t)=>($.useEffect(()=>{let n;return r&&e&&(n=setTimeout(()=>{t&&t()},r)),()=>{n&&clearTimeout(n)}},[e,r,t]),{}),m2e=z.div`
2293
+ `;const p2e=e=>new CustomEvent("treeSelectionChanged",{detail:{selectedTitle:e}}),ZV=({node:e})=>{const{title:r,childrens:t,disabled:n,isLeaf:a,onClickNode:i,onClickLeaf:o,isOpenByDefault:s,isSelectedByDefault:l}=e,c=C=>{var y;return C.isSelectedByDefault?!0:((y=C.childrens)==null?void 0:y.some(c))??!1},u=s||c(e),[h,f]=$.useState(u),[d,v]=$.useState(l||!1);return $.useEffect(()=>{const C=y=>{a&&r!==y.detail.selectedTitle&&v(!1)};return window.addEventListener("treeSelectionChanged",C),()=>{window.removeEventListener("treeSelectionChanged",C)}},[r,a]),he(h2e,{children:[he(f2e,{onClick:()=>{n||(a?(v(!0),window.dispatchEvent(p2e(r)),o&&o(e)):(i&&i(e),f(!h)))},children:[(()=>a?N(ra,{iconName:d?"FiberManualRecordFill1Sm":"FiberManualRecordFILL0Sm",color:n?"#A6B0C4":"#4E5666",customStyles:n?{cursor:"not-allowed"}:{},width:"16px",height:"16px"}):N(ra,{iconName:h?"DoNotDisturbOnFill0Sm":"AddCircleSm",color:n?"#A6B0C4":"#4E5666",customStyles:n?{cursor:"not-allowed"}:{},width:"16px",height:"16px"}))(),N(v2e,{disabled:n,children:r})]}),h&&t&&N(d2e,{children:t.map((C,y)=>N(ZV,{node:C},C.title+y))})]})},g2e=({nodes:e})=>N("div",{children:e.map((r,t)=>N(ZV,{node:r},r.title+t))}),C2e=(e,r,t)=>($.useEffect(()=>{let n;return r&&e&&(n=setTimeout(()=>{t&&t()},r)),()=>{n&&clearTimeout(n)}},[e,r,t]),{}),m2e=z.div`
2294
2294
  display: flex;
2295
2295
  flex-direction: row;
2296
2296
  justify-content: space-between;
@@ -4,18 +4,16 @@ export interface TreeItem {
4
4
  childrens?: TreeItem[];
5
5
  disabled?: boolean;
6
6
  isLeaf?: boolean;
7
- }
8
- export interface TreeProps {
9
- node: TreeItem;
10
7
  onClickNode?: (node: TreeItem) => void;
11
8
  onClickLeaf?: (node: TreeItem) => void;
12
9
  isOpenByDefault?: boolean;
10
+ isSelectedByDefault?: boolean;
11
+ }
12
+ export interface TreeProps {
13
+ node: TreeItem;
13
14
  }
14
15
  export interface TreeListProps {
15
16
  nodes: TreeItem[];
16
- onClickNode?: (node: TreeItem) => void;
17
- onClickLeaf?: (node: TreeItem) => void;
18
- isOpenByDefault?: boolean;
19
17
  }
20
18
  declare const TreeList: React.FC<TreeListProps>;
21
19
  export default TreeList;
@@ -1 +1 @@
1
- export {};
1
+ import '@testing-library/jest-dom';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sbwb-ds",
3
- "version": "1.0.63",
3
+ "version": "1.0.65",
4
4
  "type": "module",
5
5
  "description": "Sistema de design para padronização dos processos visuais do portal SUBWEB",
6
6
  "main": "dist/sbwb-ds.js",
@@ -22,9 +22,14 @@ export default {
22
22
  const treeDataArray = [
23
23
  {
24
24
  title: 'Root Node 1',
25
+ isOpenByDefault: true,
26
+ onClickNode: (node) => console.log('Clicked Node:', node.title),
27
+ onClickLeaf: (node) => console.log('Clicked Leaf:', node.title),
25
28
  childrens: [
26
29
  {
27
- title: 'Node 1 - Depth 1',
30
+ title: 'Node 1 - Depth 11',
31
+ onClickNode: (node) => console.log('Clicked Node:', node.title),
32
+
28
33
  childrens: [
29
34
  {
30
35
  title: 'Node 1 - Depth 2',
@@ -36,6 +41,7 @@ const treeDataArray = [
36
41
  {
37
42
  title: 'Node 2 - Depth 3',
38
43
  disabled: true,
44
+ isLeaf: true,
39
45
  },
40
46
  ],
41
47
  },
@@ -45,10 +51,20 @@ const treeDataArray = [
45
51
  },
46
52
  {
47
53
  title: 'Root Node 2',
54
+ isOpenByDefault: false,
55
+ onClickNode: (node) => console.log('Clicked Node:', node.title),
56
+ onClickLeaf: (node) => console.log('Clicked Leaf:', node.title),
48
57
  childrens: [
49
58
  {
50
59
  title: 'Node 1 - Depth 1 (Root 2)',
51
60
  isLeaf: true,
61
+ onClickLeaf: (node) => console.log('Clicked Leaf:', node.title),
62
+ isSelectedByDefault: true,
63
+ },
64
+ {
65
+ title: 'Node 2 - Depth 1 (Root 2)',
66
+ isLeaf: true,
67
+ onClickLeaf: (node) => console.log('Clicked Leaf:', node.title),
52
68
  },
53
69
  ],
54
70
  },
@@ -56,17 +72,7 @@ const treeDataArray = [
56
72
 
57
73
  const Tree = (args) => (
58
74
  <div>
59
- <TreeList
60
- {...args}
61
- nodes={treeDataArray}
62
- isOpenByDefault={true}
63
- onClickNode={(value) => {
64
- console.log('onClickNode', value);
65
- }}
66
- onClickLeaf={(value) => {
67
- console.log('onClickLeaf', value);
68
- }}
69
- />
75
+ <TreeList {...args} nodes={treeDataArray} />
70
76
  </div>
71
77
  );
72
78
 
@@ -1,30 +1,65 @@
1
1
  import React from 'react';
2
2
  import { render, fireEvent } from '@testing-library/react';
3
- import TreeList from './';
3
+ import TreeList, { TreeItem } from './';
4
+ import '@testing-library/jest-dom';
4
5
 
5
- test('Deve renderizar o componente TreeList', () => {
6
- const nodes = [
6
+ test('Should render multiple nodes in TreeList', () => {
7
+ const nodes: TreeItem[] = [{ title: 'Node 1' }, { title: 'Node 2' }];
8
+ const { getByText } = render(<TreeList nodes={nodes} />);
9
+
10
+ expect(getByText('Node 1')).toBeInTheDocument();
11
+ expect(getByText('Node 2')).toBeInTheDocument();
12
+ });
13
+
14
+ test('Should call onClickLeaf when a leaf node is clicked', () => {
15
+ const onClickLeaf = jest.fn();
16
+ const nodes: TreeItem[] = [{ title: 'Leaf Node', isLeaf: true, onClickLeaf }];
17
+ const { getByText } = render(<TreeList nodes={nodes} />);
18
+
19
+ fireEvent.click(getByText('Leaf Node'));
20
+
21
+ expect(onClickLeaf).toHaveBeenCalledWith(nodes[0]);
22
+ });
23
+
24
+ test('Should not call onClickNode or onClickLeaf when a disabled node is clicked', () => {
25
+ const onClickNode = jest.fn();
26
+ const onClickLeaf = jest.fn();
27
+ const nodes: TreeItem[] = [
28
+ { title: 'Disabled Node', disabled: true, onClickNode, onClickLeaf },
29
+ ];
30
+ const { getByText } = render(<TreeList nodes={nodes} />);
31
+
32
+ fireEvent.click(getByText('Disabled Node'));
33
+
34
+ expect(onClickNode).not.toHaveBeenCalled();
35
+ expect(onClickLeaf).not.toHaveBeenCalled();
36
+ });
37
+
38
+ test('Should render child nodes when a parent node is clicked', () => {
39
+ const nodes: TreeItem[] = [
7
40
  {
8
- title: ' de teste',
41
+ title: 'Parent Node',
42
+ childrens: [{ title: 'Child Node' }],
9
43
  },
10
44
  ];
11
- render(<TreeList nodes={nodes} />);
45
+ const { getByText } = render(<TreeList nodes={nodes} />);
46
+
47
+ fireEvent.click(getByText('Parent Node'));
48
+
49
+ expect(getByText('Child Node')).toBeInTheDocument();
12
50
  });
13
51
 
14
- test('Deve chamar a função onClickNode quando o for clicado', () => {
15
- const nodes = [
52
+ test('Should not render child nodes when a parent node is clicked if it is disabled', () => {
53
+ const nodes: TreeItem[] = [
16
54
  {
17
- title: ' de teste',
55
+ title: 'Parent Node',
56
+ disabled: true,
57
+ childrens: [{ title: 'Child Node' }],
18
58
  },
19
59
  ];
20
- const onClickNode = jest.fn();
21
- const { getByText } = render(
22
- <TreeList nodes={nodes} onClickNode={onClickNode} />
23
- );
24
-
25
- const titleElement = getByText('Nó de teste');
60
+ const { queryByText, getByText } = render(<TreeList nodes={nodes} />);
26
61
 
27
- fireEvent.click(titleElement);
62
+ fireEvent.click(getByText('Parent Node'));
28
63
 
29
- expect(onClickNode).toHaveBeenCalledWith(nodes[0]);
64
+ expect(queryByText('Child Node')).toBeNull();
30
65
  });
@@ -7,31 +7,46 @@ export interface TreeItem {
7
7
  childrens?: TreeItem[];
8
8
  disabled?: boolean;
9
9
  isLeaf?: boolean;
10
+ onClickNode?: (node: TreeItem) => void;
11
+ onClickLeaf?: (node: TreeItem) => void;
12
+ isOpenByDefault?: boolean;
13
+ isSelectedByDefault?: boolean;
10
14
  }
11
15
 
12
16
  export interface TreeProps {
13
17
  node: TreeItem;
14
- onClickNode?: (node: TreeItem) => void;
15
- onClickLeaf?: (node: TreeItem) => void;
16
- isOpenByDefault?: boolean;
17
18
  }
18
19
 
19
20
  const treeSelectionEvent = (selectedTitle) =>
20
21
  new CustomEvent('treeSelectionChanged', { detail: { selectedTitle } });
21
22
 
22
- const Tree: React.FC<TreeProps> = ({
23
- node,
24
- onClickNode,
25
- onClickLeaf,
26
- isOpenByDefault = false,
27
- }) => {
28
- const { title, childrens, disabled, isLeaf } = node;
29
- const [isOpen, setIsOpen] = useState(isOpenByDefault);
30
- const [isSelected, setIsSelected] = useState(false);
23
+ const Tree: React.FC<TreeProps> = ({ node }) => {
24
+ const {
25
+ title,
26
+ childrens,
27
+ disabled,
28
+ isLeaf,
29
+ onClickNode,
30
+ onClickLeaf,
31
+ isOpenByDefault,
32
+ isSelectedByDefault,
33
+ } = node;
34
+
35
+ const isAnyDescendantSelectedByDefault = (node) => {
36
+ if (node.isSelectedByDefault) {
37
+ return true;
38
+ }
39
+ return node.childrens?.some(isAnyDescendantSelectedByDefault) ?? false;
40
+ };
41
+
42
+ const initialIsOpen =
43
+ isOpenByDefault || isAnyDescendantSelectedByDefault(node);
44
+ const [isOpen, setIsOpen] = useState(initialIsOpen);
45
+ const [isSelected, setIsSelected] = useState(isSelectedByDefault || false);
31
46
 
32
47
  useEffect(() => {
33
48
  const handleSelectionChange = (event) => {
34
- if (title !== event.detail.selectedTitle) {
49
+ if (isLeaf && title !== event.detail.selectedTitle) {
35
50
  setIsSelected(false);
36
51
  }
37
52
  };
@@ -41,14 +56,13 @@ const Tree: React.FC<TreeProps> = ({
41
56
  return () => {
42
57
  window.removeEventListener('treeSelectionChanged', handleSelectionChange);
43
58
  };
44
- }, [title]);
59
+ }, [title, isLeaf]);
45
60
 
46
61
  const handleClick = () => {
47
62
  if (!disabled) {
48
- setIsSelected(true);
49
- window.dispatchEvent(treeSelectionEvent(title));
50
-
51
63
  if (isLeaf) {
64
+ setIsSelected(true);
65
+ window.dispatchEvent(treeSelectionEvent(title));
52
66
  if (onClickLeaf) onClickLeaf(node);
53
67
  } else {
54
68
  if (onClickNode) onClickNode(node);
@@ -92,12 +106,7 @@ const Tree: React.FC<TreeProps> = ({
92
106
  {isOpen && childrens && (
93
107
  <C.Content>
94
108
  {childrens.map((child, index) => (
95
- <Tree
96
- key={child.title + index}
97
- node={child}
98
- onClickNode={onClickNode}
99
- onClickLeaf={onClickLeaf}
100
- />
109
+ <Tree key={child.title + index} node={child} />
101
110
  ))}
102
111
  </C.Content>
103
112
  )}
@@ -107,27 +116,13 @@ const Tree: React.FC<TreeProps> = ({
107
116
 
108
117
  export interface TreeListProps {
109
118
  nodes: TreeItem[];
110
- onClickNode?: (node: TreeItem) => void;
111
- onClickLeaf?: (node: TreeItem) => void;
112
- isOpenByDefault?: boolean;
113
119
  }
114
120
 
115
- const TreeList: React.FC<TreeListProps> = ({
116
- nodes,
117
- onClickNode,
118
- onClickLeaf,
119
- isOpenByDefault = false,
120
- }) => {
121
+ const TreeList: React.FC<TreeListProps> = ({ nodes }) => {
121
122
  return (
122
123
  <div>
123
124
  {nodes.map((node, index) => (
124
- <Tree
125
- key={node.title + index}
126
- node={node}
127
- onClickNode={onClickNode}
128
- onClickLeaf={onClickLeaf}
129
- isOpenByDefault={isOpenByDefault}
130
- />
125
+ <Tree key={node.title + index} node={node} />
131
126
  ))}
132
127
  </div>
133
128
  );