@dktunited-techoff/techoff-suite-ui 1.10.8 → 1.10.10

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 (27) hide show
  1. package/esm/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.css +2 -0
  2. package/esm/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.js +2 -2
  3. package/esm/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.js.map +1 -1
  4. package/esm/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.tsx +3 -2
  5. package/esm/components/TsTabs/TsTabs.css +11 -0
  6. package/esm/components/TsTabs/TsTabs.d.ts +1 -1
  7. package/esm/components/TsTabs/TsTabs.js +37 -11
  8. package/esm/components/TsTabs/TsTabs.js.map +1 -1
  9. package/esm/components/TsTabs/TsTabs.types.d.ts +3 -2
  10. package/esm/components/TsTabs/__stories__/TsTabs.stories.mdx +18 -9
  11. package/lib/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.css +2 -0
  12. package/lib/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.js +2 -2
  13. package/lib/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.js.map +1 -1
  14. package/lib/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.tsx +3 -2
  15. package/lib/components/TsTabs/TsTabs.css +11 -0
  16. package/lib/components/TsTabs/TsTabs.d.ts +1 -1
  17. package/lib/components/TsTabs/TsTabs.js +37 -11
  18. package/lib/components/TsTabs/TsTabs.js.map +1 -1
  19. package/lib/components/TsTabs/TsTabs.types.d.ts +3 -2
  20. package/lib/components/TsTabs/__stories__/TsTabs.stories.mdx +18 -9
  21. package/package.json +1 -1
  22. package/src/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.css +2 -0
  23. package/src/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.tsx +3 -2
  24. package/src/components/TsTabs/TsTabs.css +11 -0
  25. package/src/components/TsTabs/TsTabs.tsx +44 -10
  26. package/src/components/TsTabs/TsTabs.types.ts +3 -2
  27. package/src/components/TsTabs/__stories__/TsTabs.stories.mdx +18 -9
@@ -23,7 +23,9 @@
23
23
  display: flex;
24
24
  align-items: center;
25
25
  justify-content: center;
26
+ width: 32px;
26
27
  height: 32px;
28
+ padding: 4px;
27
29
  }
28
30
  .ts-dropdown-filter-menu-container {
29
31
  position: absolute;
@@ -2,7 +2,6 @@ import * as React from 'react';
2
2
  import { useEffect, useState } from 'react';
3
3
  import { useClickOutside } from '../../../hooks/use-click-outside';
4
4
  import { capitalize } from '../../../utils/string.utils';
5
- import { TsIcon } from '../../TsIcon/TsIcon';
6
5
  import { TsInput } from '../../TsInput/TsInput/TsInput';
7
6
  import { TsLoader } from '../../TsLoader/TsLoader';
8
7
  import './TsDropdownFilter.css';
@@ -50,7 +49,8 @@ export const TsDropdownFilter = ({ label, searchPlaceholder, loadOptions, getOpt
50
49
  React.createElement("div", { className: "ts-dropdown-filter-input", onClick: () => setShowDropdown(!showDropdown) },
51
50
  React.createElement("div", { className: "ts-dropdown-filter-label" }, label),
52
51
  React.createElement("div", { className: "ts-dropdown-filter-input--chevron" },
53
- React.createElement(TsIcon, { name: showDropdown ? 'chevron-up' : 'chevron-down' }))),
52
+ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor" },
53
+ React.createElement("path", { d: "M11.9999 13.1714L16.9497 8.22168L18.3639 9.63589L11.9999 15.9999L5.63599 9.63589L7.0502 8.22168L11.9999 13.1714Z" })))),
54
54
  showDropdown && (React.createElement("div", { className: "ts-dropdown-filter-menu-container" },
55
55
  React.createElement("div", { className: "ts-dropdown-filter-search" },
56
56
  React.createElement(TsInput, { icon: "search", placeholder: searchPlaceholder, value: searchValue, autoFocus: true, onChange: setSearchValue })),
@@ -1 +1 @@
1
- {"version":3,"file":"TsDropdownFilter.js","sourceRoot":"","sources":["../../../../src/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TsDropdownFilter.js","sourceRoot":"","sources":["../../../../src/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.tsx"],"names":[],"mappings":"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"}
@@ -2,7 +2,6 @@ import * as React from 'react';
2
2
  import { useEffect, useState } from 'react';
3
3
  import { useClickOutside } from '../../../hooks/use-click-outside';
4
4
  import { capitalize } from '../../../utils/string.utils';
5
- import { TsIcon } from '../../TsIcon/TsIcon';
6
5
  import { TsInput } from '../../TsInput/TsInput/TsInput';
7
6
  import { TsLoader } from '../../TsLoader/TsLoader';
8
7
  import { TsDropdownFilterProps } from './TsDropdownFilter.types';
@@ -63,7 +62,9 @@ export const TsDropdownFilter = <T,>({
63
62
  <div className="ts-dropdown-filter-input" onClick={() => setShowDropdown(!showDropdown)}>
64
63
  <div className="ts-dropdown-filter-label">{label}</div>
65
64
  <div className="ts-dropdown-filter-input--chevron">
66
- <TsIcon name={showDropdown ? 'chevron-up' : 'chevron-down'} />
65
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
66
+ <path d="M11.9999 13.1714L16.9497 8.22168L18.3639 9.63589L11.9999 15.9999L5.63599 9.63589L7.0502 8.22168L11.9999 13.1714Z"></path>
67
+ </svg>
67
68
  </div>
68
69
  </div>
69
70
 
@@ -45,6 +45,17 @@
45
45
  border-radius: 50%;
46
46
  background: #3643ba;
47
47
  }
48
+ .ts-tabs-sub-item {
49
+ display: flex;
50
+ margin-left: 8px;
51
+ }
52
+ .ts-tabs-sub-item--label {
53
+ margin-left: 4px;
54
+ color: #101010;
55
+ }
56
+ .ts-tabs-sub-item--selected {
57
+ color: #3643ba;
58
+ }
48
59
  .ts-tabs-actions {
49
60
  display: flex;
50
61
  align-items: center;
@@ -1,4 +1,4 @@
1
1
  import * as React from 'react';
2
2
  import { TsTabsProps } from './TsTabs.types';
3
3
  import './TsTabs.css';
4
- export declare const TsTabs: ({ defaultSelectedTabId, tabs }: TsTabsProps) => React.JSX.Element;
4
+ export declare const TsTabs: ({ value, tabs }: TsTabsProps) => React.JSX.Element;
@@ -2,20 +2,38 @@ import * as React from 'react';
2
2
  import { useEffect, useState } from 'react';
3
3
  import { TsIcon } from '../TsIcon/TsIcon';
4
4
  import './TsTabs.css';
5
- export const TsTabs = ({ defaultSelectedTabId, tabs }) => {
6
- const [selectedTab, setSelectedTab] = useState(tabs.find(t => t.id === defaultSelectedTabId) ?? tabs[0]);
5
+ export const TsTabs = ({ value, tabs }) => {
6
+ const [selectedTab, setSelectedTab] = useState(tabs.find(t => t.id === value) ?? tabs[0]);
7
+ const [selectedSubTab, setSelectedSubTab] = useState();
8
+ const [renderedElement, setRenderedElement] = useState();
7
9
  // ########
8
10
  // Handlers
9
- const handleSelectTab = (tab) => {
10
- setSelectedTab(tab);
11
+ const handleSelectTab = (tab, type) => {
12
+ if (type === 'main')
13
+ setSelectedTab(tab);
14
+ else if (type === 'sub')
15
+ setSelectedSubTab(tab);
11
16
  tab.onClick?.();
12
17
  };
13
18
  // #########
14
19
  // Wathchers
15
20
  useEffect(() => {
16
- if (defaultSelectedTabId)
17
- setSelectedTab(tabs.find(t => t.id === defaultSelectedTabId) ?? tabs[0]);
18
- }, [defaultSelectedTabId]);
21
+ if (value)
22
+ setSelectedTab(tabs.find(t => t.id === value) ?? tabs[0]);
23
+ }, [value]);
24
+ useEffect(() => {
25
+ if (selectedTab.subTabs) {
26
+ setSelectedSubTab(selectedTab.subTabs[0]);
27
+ }
28
+ else {
29
+ setSelectedSubTab(undefined);
30
+ setRenderedElement(selectedTab.element);
31
+ }
32
+ }, [selectedTab]);
33
+ useEffect(() => {
34
+ if (selectedSubTab)
35
+ setRenderedElement(selectedSubTab.element);
36
+ }, [selectedSubTab]);
19
37
  // #########
20
38
  // Rendering
21
39
  return (React.createElement("div", { className: "ts-tabs" },
@@ -24,13 +42,21 @@ export const TsTabs = ({ defaultSelectedTabId, tabs }) => {
24
42
  React.createElement("div", { className: "ts-tabs-items" }, tabs.map(tab => (React.createElement("div", { key: tab.id, className: `
25
43
  ts-tabs-item
26
44
  ${tab.id === selectedTab.id ? 'ts-tabs-item--selected' : ''}
27
- ${tab.disabled ? 'ts-tabs-item--disabled' : ''}
28
- `, onClick: () => !tab.disabled && handleSelectTab(tab) },
45
+ ${tab.disabled ? 'ts-tabs-item--disabled' : ''}
46
+ `, onClick: () => !tab.disabled && handleSelectTab(tab, 'main') },
29
47
  tab.icon && (React.createElement("div", { className: "ts-tabs-item--icon" },
30
48
  React.createElement(TsIcon, { name: tab.icon }))),
31
49
  React.createElement("div", { className: "ts-tabs-item--label" }, tab.label),
32
- tab.id === selectedTab.id && React.createElement("div", { className: "ts-tabs-item--selected-pin" })))))),
50
+ tab.id === selectedTab.id && React.createElement("div", { className: "ts-tabs-item--selected-pin" }),
51
+ tab.id === selectedTab.id &&
52
+ tab.subTabs?.map(subTab => (React.createElement("div", { key: subTab.id, className: "ts-tabs-sub-item", onClick: () => !subTab.disabled && handleSelectTab(subTab, 'sub') },
53
+ React.createElement(TsIcon, { name: "chevron-right" }),
54
+ React.createElement("div", { className: `
55
+ ts-tabs-sub-item--label
56
+ ${subTab.id === selectedSubTab?.id ? 'ts-tabs-sub-item--selected' : ''}
57
+ ${subTab.disabled ? 'ts-tabs-item--disabled' : ''}
58
+ ` }, subTab.label))))))))),
33
59
  selectedTab?.actions && React.createElement("div", { className: "ts-tabs-actions" }, selectedTab?.actions)),
34
- React.createElement("div", { className: "ts-tabs-container" }, selectedTab?.element)));
60
+ React.createElement("div", { className: "ts-tabs-container" }, renderedElement)));
35
61
  };
36
62
  //# sourceMappingURL=TsTabs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TsTabs.js","sourceRoot":"","sources":["../../../src/components/TsTabs/TsTabs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,cAAc,CAAC;AAEtB,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,EAAE,oBAAoB,EAAE,IAAI,EAAe,EAAE,EAAE;IACpE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAU,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,oBAAoB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAElH,WAAW;IACX,WAAW;IACX,MAAM,eAAe,GAAG,CAAC,GAAY,EAAE,EAAE;QACvC,cAAc,CAAC,GAAG,CAAC,CAAC;QACpB,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;IAClB,CAAC,CAAC;IAEF,YAAY;IACZ,YAAY;IACZ,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,oBAAoB;YAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,oBAAoB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACrG,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAE3B,YAAY;IACZ,YAAY;IACZ,OAAO,CACL,6BAAK,SAAS,EAAC,SAAS;QACtB,6BAAK,SAAS,EAAC,gBAAgB;YAC7B,6BAAK,SAAS,EAAC,yBAAyB;gBACtC,6BAAK,SAAS,EAAC,eAAe,IAC3B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CACf,6BACE,GAAG,EAAE,GAAG,CAAC,EAAE,EACX,SAAS,EAAE;;oBAEP,GAAG,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE;oBACzD,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE;iBAC/C,EACD,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,IAAI,eAAe,CAAC,GAAG,CAAC;oBAEnD,GAAG,CAAC,IAAI,IAAI,CACX,6BAAK,SAAS,EAAC,oBAAoB;wBACjC,oBAAC,MAAM,IAAC,IAAI,EAAE,GAAG,CAAC,IAAI,GAAI,CACtB,CACP;oBACD,6BAAK,SAAS,EAAC,qBAAqB,IAAE,GAAG,CAAC,KAAK,CAAO;oBACrD,GAAG,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE,IAAI,6BAAK,SAAS,EAAC,4BAA4B,GAAG,CACxE,CACP,CAAC,CACE,CACF;YAEL,WAAW,EAAE,OAAO,IAAI,6BAAK,SAAS,EAAC,iBAAiB,IAAE,WAAW,EAAE,OAAO,CAAO,CAClF;QAEN,6BAAK,SAAS,EAAC,mBAAmB,IAAE,WAAW,EAAE,OAAO,CAAO,CAC3D,CACP,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"TsTabs.js","sourceRoot":"","sources":["../../../src/components/TsTabs/TsTabs.tsx"],"names":[],"mappings":"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"}
@@ -4,11 +4,12 @@ export type TabItem = {
4
4
  id: string;
5
5
  label: string;
6
6
  disabled?: boolean;
7
- element: ReactElement;
7
+ element?: ReactElement;
8
+ subTabs?: TabItem[];
8
9
  actions?: ReactElement;
9
10
  onClick?: () => void;
10
11
  };
11
12
  export type TsTabsProps = {
12
- defaultSelectedTabId?: string;
13
+ value?: string;
13
14
  tabs: TabItem[];
14
15
  };
@@ -22,6 +22,20 @@ Tabs are used to move from one content to another within the same context.
22
22
  id: '1',
23
23
  label: 'Tab item 1',
24
24
  element: <p>Tab item 1 content</p>,
25
+ },
26
+ {
27
+ id: '2',
28
+ label: 'Tab item 2',
29
+ subTabs: [
30
+ { id: '2.1', label: 'Sub tab item 2.1', element: <p>Sub tab item 2.1 content</p> },
31
+ { id: '2.2', label: 'Sub tab item 2.2', element: <p>Sub tab item 2.2 content</p> },
32
+ ],
33
+ },
34
+ { id: 'disabled', label: 'Tab item disabled', disabled: true, element: <></> },
35
+ {
36
+ id: '3',
37
+ label: 'Tab item with actions',
38
+ element: <p>Tab item 3 content</p>,
25
39
  actions: (
26
40
  <>
27
41
  <TsButton>Action 1</TsButton>
@@ -29,19 +43,14 @@ Tabs are used to move from one content to another within the same context.
29
43
  </>
30
44
  ),
31
45
  },
32
- { id: '2', label: 'Tab item 2', element: <p>Tab item 2 content</p> },
33
- { id: 'disabled', label: 'Tab item disabled', disabled: true, element: <></> },
34
- {
35
- id: '3',
36
- label: 'Tab item 3',
37
- element: <p>Tab item 3 content</p>,
38
- actions: <TsButton icon="add">Action</TsButton>,
39
- },
40
46
  ],
41
47
  }}
42
48
  argTypes={tabsArgTypes}
43
- >
49
+
50
+ >
51
+
44
52
  {args => <TsTabs {...args} />}
53
+
45
54
  </Story>
46
55
  </Canvas>
47
56
 
@@ -23,7 +23,9 @@
23
23
  display: flex;
24
24
  align-items: center;
25
25
  justify-content: center;
26
+ width: 32px;
26
27
  height: 32px;
28
+ padding: 4px;
27
29
  }
28
30
  .ts-dropdown-filter-menu-container {
29
31
  position: absolute;
@@ -5,7 +5,6 @@ const React = require("react");
5
5
  const react_1 = require("react");
6
6
  const use_click_outside_1 = require("../../../hooks/use-click-outside");
7
7
  const string_utils_1 = require("../../../utils/string.utils");
8
- const TsIcon_1 = require("../../TsIcon/TsIcon");
9
8
  const TsInput_1 = require("../../TsInput/TsInput/TsInput");
10
9
  const TsLoader_1 = require("../../TsLoader/TsLoader");
11
10
  require("./TsDropdownFilter.css");
@@ -53,7 +52,8 @@ const TsDropdownFilter = ({ label, searchPlaceholder, loadOptions, getOptionLabe
53
52
  React.createElement("div", { className: "ts-dropdown-filter-input", onClick: () => setShowDropdown(!showDropdown) },
54
53
  React.createElement("div", { className: "ts-dropdown-filter-label" }, label),
55
54
  React.createElement("div", { className: "ts-dropdown-filter-input--chevron" },
56
- React.createElement(TsIcon_1.TsIcon, { name: showDropdown ? 'chevron-up' : 'chevron-down' }))),
55
+ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor" },
56
+ React.createElement("path", { d: "M11.9999 13.1714L16.9497 8.22168L18.3639 9.63589L11.9999 15.9999L5.63599 9.63589L7.0502 8.22168L11.9999 13.1714Z" })))),
57
57
  showDropdown && (React.createElement("div", { className: "ts-dropdown-filter-menu-container" },
58
58
  React.createElement("div", { className: "ts-dropdown-filter-search" },
59
59
  React.createElement(TsInput_1.TsInput, { icon: "search", placeholder: searchPlaceholder, value: searchValue, autoFocus: true, onChange: setSearchValue })),
@@ -1 +1 @@
1
- {"version":3,"file":"TsDropdownFilter.js","sourceRoot":"","sources":["../../../../src/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TsDropdownFilter.js","sourceRoot":"","sources":["../../../../src/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.tsx"],"names":[],"mappings":"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"}
@@ -2,7 +2,6 @@ import * as React from 'react';
2
2
  import { useEffect, useState } from 'react';
3
3
  import { useClickOutside } from '../../../hooks/use-click-outside';
4
4
  import { capitalize } from '../../../utils/string.utils';
5
- import { TsIcon } from '../../TsIcon/TsIcon';
6
5
  import { TsInput } from '../../TsInput/TsInput/TsInput';
7
6
  import { TsLoader } from '../../TsLoader/TsLoader';
8
7
  import { TsDropdownFilterProps } from './TsDropdownFilter.types';
@@ -63,7 +62,9 @@ export const TsDropdownFilter = <T,>({
63
62
  <div className="ts-dropdown-filter-input" onClick={() => setShowDropdown(!showDropdown)}>
64
63
  <div className="ts-dropdown-filter-label">{label}</div>
65
64
  <div className="ts-dropdown-filter-input--chevron">
66
- <TsIcon name={showDropdown ? 'chevron-up' : 'chevron-down'} />
65
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
66
+ <path d="M11.9999 13.1714L16.9497 8.22168L18.3639 9.63589L11.9999 15.9999L5.63599 9.63589L7.0502 8.22168L11.9999 13.1714Z"></path>
67
+ </svg>
67
68
  </div>
68
69
  </div>
69
70
 
@@ -45,6 +45,17 @@
45
45
  border-radius: 50%;
46
46
  background: #3643ba;
47
47
  }
48
+ .ts-tabs-sub-item {
49
+ display: flex;
50
+ margin-left: 8px;
51
+ }
52
+ .ts-tabs-sub-item--label {
53
+ margin-left: 4px;
54
+ color: #101010;
55
+ }
56
+ .ts-tabs-sub-item--selected {
57
+ color: #3643ba;
58
+ }
48
59
  .ts-tabs-actions {
49
60
  display: flex;
50
61
  align-items: center;
@@ -1,4 +1,4 @@
1
1
  import * as React from 'react';
2
2
  import { TsTabsProps } from './TsTabs.types';
3
3
  import './TsTabs.css';
4
- export declare const TsTabs: ({ defaultSelectedTabId, tabs }: TsTabsProps) => React.JSX.Element;
4
+ export declare const TsTabs: ({ value, tabs }: TsTabsProps) => React.JSX.Element;
@@ -5,20 +5,38 @@ const React = require("react");
5
5
  const react_1 = require("react");
6
6
  const TsIcon_1 = require("../TsIcon/TsIcon");
7
7
  require("./TsTabs.css");
8
- const TsTabs = ({ defaultSelectedTabId, tabs }) => {
9
- const [selectedTab, setSelectedTab] = (0, react_1.useState)(tabs.find(t => t.id === defaultSelectedTabId) ?? tabs[0]);
8
+ const TsTabs = ({ value, tabs }) => {
9
+ const [selectedTab, setSelectedTab] = (0, react_1.useState)(tabs.find(t => t.id === value) ?? tabs[0]);
10
+ const [selectedSubTab, setSelectedSubTab] = (0, react_1.useState)();
11
+ const [renderedElement, setRenderedElement] = (0, react_1.useState)();
10
12
  // ########
11
13
  // Handlers
12
- const handleSelectTab = (tab) => {
13
- setSelectedTab(tab);
14
+ const handleSelectTab = (tab, type) => {
15
+ if (type === 'main')
16
+ setSelectedTab(tab);
17
+ else if (type === 'sub')
18
+ setSelectedSubTab(tab);
14
19
  tab.onClick?.();
15
20
  };
16
21
  // #########
17
22
  // Wathchers
18
23
  (0, react_1.useEffect)(() => {
19
- if (defaultSelectedTabId)
20
- setSelectedTab(tabs.find(t => t.id === defaultSelectedTabId) ?? tabs[0]);
21
- }, [defaultSelectedTabId]);
24
+ if (value)
25
+ setSelectedTab(tabs.find(t => t.id === value) ?? tabs[0]);
26
+ }, [value]);
27
+ (0, react_1.useEffect)(() => {
28
+ if (selectedTab.subTabs) {
29
+ setSelectedSubTab(selectedTab.subTabs[0]);
30
+ }
31
+ else {
32
+ setSelectedSubTab(undefined);
33
+ setRenderedElement(selectedTab.element);
34
+ }
35
+ }, [selectedTab]);
36
+ (0, react_1.useEffect)(() => {
37
+ if (selectedSubTab)
38
+ setRenderedElement(selectedSubTab.element);
39
+ }, [selectedSubTab]);
22
40
  // #########
23
41
  // Rendering
24
42
  return (React.createElement("div", { className: "ts-tabs" },
@@ -27,14 +45,22 @@ const TsTabs = ({ defaultSelectedTabId, tabs }) => {
27
45
  React.createElement("div", { className: "ts-tabs-items" }, tabs.map(tab => (React.createElement("div", { key: tab.id, className: `
28
46
  ts-tabs-item
29
47
  ${tab.id === selectedTab.id ? 'ts-tabs-item--selected' : ''}
30
- ${tab.disabled ? 'ts-tabs-item--disabled' : ''}
31
- `, onClick: () => !tab.disabled && handleSelectTab(tab) },
48
+ ${tab.disabled ? 'ts-tabs-item--disabled' : ''}
49
+ `, onClick: () => !tab.disabled && handleSelectTab(tab, 'main') },
32
50
  tab.icon && (React.createElement("div", { className: "ts-tabs-item--icon" },
33
51
  React.createElement(TsIcon_1.TsIcon, { name: tab.icon }))),
34
52
  React.createElement("div", { className: "ts-tabs-item--label" }, tab.label),
35
- tab.id === selectedTab.id && React.createElement("div", { className: "ts-tabs-item--selected-pin" })))))),
53
+ tab.id === selectedTab.id && React.createElement("div", { className: "ts-tabs-item--selected-pin" }),
54
+ tab.id === selectedTab.id &&
55
+ tab.subTabs?.map(subTab => (React.createElement("div", { key: subTab.id, className: "ts-tabs-sub-item", onClick: () => !subTab.disabled && handleSelectTab(subTab, 'sub') },
56
+ React.createElement(TsIcon_1.TsIcon, { name: "chevron-right" }),
57
+ React.createElement("div", { className: `
58
+ ts-tabs-sub-item--label
59
+ ${subTab.id === selectedSubTab?.id ? 'ts-tabs-sub-item--selected' : ''}
60
+ ${subTab.disabled ? 'ts-tabs-item--disabled' : ''}
61
+ ` }, subTab.label))))))))),
36
62
  selectedTab?.actions && React.createElement("div", { className: "ts-tabs-actions" }, selectedTab?.actions)),
37
- React.createElement("div", { className: "ts-tabs-container" }, selectedTab?.element)));
63
+ React.createElement("div", { className: "ts-tabs-container" }, renderedElement)));
38
64
  };
39
65
  exports.TsTabs = TsTabs;
40
66
  //# sourceMappingURL=TsTabs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TsTabs.js","sourceRoot":"","sources":["../../../src/components/TsTabs/TsTabs.tsx"],"names":[],"mappings":";;;AAAA,+BAA+B;AAC/B,iCAA4C;AAC5C,6CAA0C;AAE1C,wBAAsB;AAEf,MAAM,MAAM,GAAG,CAAC,EAAE,oBAAoB,EAAE,IAAI,EAAe,EAAE,EAAE;IACpE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,IAAA,gBAAQ,EAAU,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,oBAAoB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAElH,WAAW;IACX,WAAW;IACX,MAAM,eAAe,GAAG,CAAC,GAAY,EAAE,EAAE;QACvC,cAAc,CAAC,GAAG,CAAC,CAAC;QACpB,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;IAClB,CAAC,CAAC;IAEF,YAAY;IACZ,YAAY;IACZ,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,oBAAoB;YAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,oBAAoB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACrG,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAE3B,YAAY;IACZ,YAAY;IACZ,OAAO,CACL,6BAAK,SAAS,EAAC,SAAS;QACtB,6BAAK,SAAS,EAAC,gBAAgB;YAC7B,6BAAK,SAAS,EAAC,yBAAyB;gBACtC,6BAAK,SAAS,EAAC,eAAe,IAC3B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CACf,6BACE,GAAG,EAAE,GAAG,CAAC,EAAE,EACX,SAAS,EAAE;;oBAEP,GAAG,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE;oBACzD,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE;iBAC/C,EACD,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,IAAI,eAAe,CAAC,GAAG,CAAC;oBAEnD,GAAG,CAAC,IAAI,IAAI,CACX,6BAAK,SAAS,EAAC,oBAAoB;wBACjC,oBAAC,eAAM,IAAC,IAAI,EAAE,GAAG,CAAC,IAAI,GAAI,CACtB,CACP;oBACD,6BAAK,SAAS,EAAC,qBAAqB,IAAE,GAAG,CAAC,KAAK,CAAO;oBACrD,GAAG,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE,IAAI,6BAAK,SAAS,EAAC,4BAA4B,GAAG,CACxE,CACP,CAAC,CACE,CACF;YAEL,WAAW,EAAE,OAAO,IAAI,6BAAK,SAAS,EAAC,iBAAiB,IAAE,WAAW,EAAE,OAAO,CAAO,CAClF;QAEN,6BAAK,SAAS,EAAC,mBAAmB,IAAE,WAAW,EAAE,OAAO,CAAO,CAC3D,CACP,CAAC;AACJ,CAAC,CAAC;AAnDW,QAAA,MAAM,UAmDjB"}
1
+ {"version":3,"file":"TsTabs.js","sourceRoot":"","sources":["../../../src/components/TsTabs/TsTabs.tsx"],"names":[],"mappings":"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"}
@@ -4,11 +4,12 @@ export type TabItem = {
4
4
  id: string;
5
5
  label: string;
6
6
  disabled?: boolean;
7
- element: ReactElement;
7
+ element?: ReactElement;
8
+ subTabs?: TabItem[];
8
9
  actions?: ReactElement;
9
10
  onClick?: () => void;
10
11
  };
11
12
  export type TsTabsProps = {
12
- defaultSelectedTabId?: string;
13
+ value?: string;
13
14
  tabs: TabItem[];
14
15
  };
@@ -22,6 +22,20 @@ Tabs are used to move from one content to another within the same context.
22
22
  id: '1',
23
23
  label: 'Tab item 1',
24
24
  element: <p>Tab item 1 content</p>,
25
+ },
26
+ {
27
+ id: '2',
28
+ label: 'Tab item 2',
29
+ subTabs: [
30
+ { id: '2.1', label: 'Sub tab item 2.1', element: <p>Sub tab item 2.1 content</p> },
31
+ { id: '2.2', label: 'Sub tab item 2.2', element: <p>Sub tab item 2.2 content</p> },
32
+ ],
33
+ },
34
+ { id: 'disabled', label: 'Tab item disabled', disabled: true, element: <></> },
35
+ {
36
+ id: '3',
37
+ label: 'Tab item with actions',
38
+ element: <p>Tab item 3 content</p>,
25
39
  actions: (
26
40
  <>
27
41
  <TsButton>Action 1</TsButton>
@@ -29,19 +43,14 @@ Tabs are used to move from one content to another within the same context.
29
43
  </>
30
44
  ),
31
45
  },
32
- { id: '2', label: 'Tab item 2', element: <p>Tab item 2 content</p> },
33
- { id: 'disabled', label: 'Tab item disabled', disabled: true, element: <></> },
34
- {
35
- id: '3',
36
- label: 'Tab item 3',
37
- element: <p>Tab item 3 content</p>,
38
- actions: <TsButton icon="add">Action</TsButton>,
39
- },
40
46
  ],
41
47
  }}
42
48
  argTypes={tabsArgTypes}
43
- >
49
+
50
+ >
51
+
44
52
  {args => <TsTabs {...args} />}
53
+
45
54
  </Story>
46
55
  </Canvas>
47
56
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dktunited-techoff/techoff-suite-ui",
3
- "version": "1.10.8",
3
+ "version": "1.10.10",
4
4
  "main": "lib/index.js",
5
5
  "types": "./lib",
6
6
  "module": "esm/index.js",
@@ -23,7 +23,9 @@
23
23
  display: flex;
24
24
  align-items: center;
25
25
  justify-content: center;
26
+ width: 32px;
26
27
  height: 32px;
28
+ padding: 4px;
27
29
  }
28
30
  .ts-dropdown-filter-menu-container {
29
31
  position: absolute;
@@ -2,7 +2,6 @@ import * as React from 'react';
2
2
  import { useEffect, useState } from 'react';
3
3
  import { useClickOutside } from '../../../hooks/use-click-outside';
4
4
  import { capitalize } from '../../../utils/string.utils';
5
- import { TsIcon } from '../../TsIcon/TsIcon';
6
5
  import { TsInput } from '../../TsInput/TsInput/TsInput';
7
6
  import { TsLoader } from '../../TsLoader/TsLoader';
8
7
  import { TsDropdownFilterProps } from './TsDropdownFilter.types';
@@ -63,7 +62,9 @@ export const TsDropdownFilter = <T,>({
63
62
  <div className="ts-dropdown-filter-input" onClick={() => setShowDropdown(!showDropdown)}>
64
63
  <div className="ts-dropdown-filter-label">{label}</div>
65
64
  <div className="ts-dropdown-filter-input--chevron">
66
- <TsIcon name={showDropdown ? 'chevron-up' : 'chevron-down'} />
65
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
66
+ <path d="M11.9999 13.1714L16.9497 8.22168L18.3639 9.63589L11.9999 15.9999L5.63599 9.63589L7.0502 8.22168L11.9999 13.1714Z"></path>
67
+ </svg>
67
68
  </div>
68
69
  </div>
69
70
 
@@ -45,6 +45,17 @@
45
45
  border-radius: 50%;
46
46
  background: #3643ba;
47
47
  }
48
+ .ts-tabs-sub-item {
49
+ display: flex;
50
+ margin-left: 8px;
51
+ }
52
+ .ts-tabs-sub-item--label {
53
+ margin-left: 4px;
54
+ color: #101010;
55
+ }
56
+ .ts-tabs-sub-item--selected {
57
+ color: #3643ba;
58
+ }
48
59
  .ts-tabs-actions {
49
60
  display: flex;
50
61
  align-items: center;
@@ -1,24 +1,38 @@
1
1
  import * as React from 'react';
2
- import { useEffect, useState } from 'react';
2
+ import { ReactElement, useEffect, useState } from 'react';
3
3
  import { TsIcon } from '../TsIcon/TsIcon';
4
4
  import { TabItem, TsTabsProps } from './TsTabs.types';
5
5
  import './TsTabs.css';
6
6
 
7
- export const TsTabs = ({ defaultSelectedTabId, tabs }: TsTabsProps) => {
8
- const [selectedTab, setSelectedTab] = useState<TabItem>(tabs.find(t => t.id === defaultSelectedTabId) ?? tabs[0]);
7
+ export const TsTabs = ({ value, tabs }: TsTabsProps) => {
8
+ const [selectedTab, setSelectedTab] = useState<TabItem>(tabs.find(t => t.id === value) ?? tabs[0]);
9
+ const [selectedSubTab, setSelectedSubTab] = useState<TabItem>();
10
+ const [renderedElement, setRenderedElement] = useState<ReactElement>();
9
11
 
10
12
  // ########
11
13
  // Handlers
12
- const handleSelectTab = (tab: TabItem) => {
13
- setSelectedTab(tab);
14
+ const handleSelectTab = (tab: TabItem, type: 'main' | 'sub') => {
15
+ if (type === 'main') setSelectedTab(tab);
16
+ else if (type === 'sub') setSelectedSubTab(tab);
14
17
  tab.onClick?.();
15
18
  };
16
19
 
17
20
  // #########
18
21
  // Wathchers
19
22
  useEffect(() => {
20
- if (defaultSelectedTabId) setSelectedTab(tabs.find(t => t.id === defaultSelectedTabId) ?? tabs[0]);
21
- }, [defaultSelectedTabId]);
23
+ if (value) setSelectedTab(tabs.find(t => t.id === value) ?? tabs[0]);
24
+ }, [value]);
25
+ useEffect(() => {
26
+ if (selectedTab.subTabs) {
27
+ setSelectedSubTab(selectedTab.subTabs[0]);
28
+ } else {
29
+ setSelectedSubTab(undefined);
30
+ setRenderedElement(selectedTab.element);
31
+ }
32
+ }, [selectedTab]);
33
+ useEffect(() => {
34
+ if (selectedSubTab) setRenderedElement(selectedSubTab.element);
35
+ }, [selectedSubTab]);
22
36
 
23
37
  // #########
24
38
  // Rendering
@@ -33,9 +47,9 @@ export const TsTabs = ({ defaultSelectedTabId, tabs }: TsTabsProps) => {
33
47
  className={`
34
48
  ts-tabs-item
35
49
  ${tab.id === selectedTab.id ? 'ts-tabs-item--selected' : ''}
36
- ${tab.disabled ? 'ts-tabs-item--disabled' : ''}
50
+ ${tab.disabled ? 'ts-tabs-item--disabled' : ''}
37
51
  `}
38
- onClick={() => !tab.disabled && handleSelectTab(tab)}
52
+ onClick={() => !tab.disabled && handleSelectTab(tab, 'main')}
39
53
  >
40
54
  {tab.icon && (
41
55
  <div className="ts-tabs-item--icon">
@@ -44,6 +58,26 @@ export const TsTabs = ({ defaultSelectedTabId, tabs }: TsTabsProps) => {
44
58
  )}
45
59
  <div className="ts-tabs-item--label">{tab.label}</div>
46
60
  {tab.id === selectedTab.id && <div className="ts-tabs-item--selected-pin" />}
61
+
62
+ {tab.id === selectedTab.id &&
63
+ tab.subTabs?.map(subTab => (
64
+ <div
65
+ key={subTab.id}
66
+ className="ts-tabs-sub-item"
67
+ onClick={() => !subTab.disabled && handleSelectTab(subTab, 'sub')}
68
+ >
69
+ <TsIcon name="chevron-right" />
70
+ <div
71
+ className={`
72
+ ts-tabs-sub-item--label
73
+ ${subTab.id === selectedSubTab?.id ? 'ts-tabs-sub-item--selected' : ''}
74
+ ${subTab.disabled ? 'ts-tabs-item--disabled' : ''}
75
+ `}
76
+ >
77
+ {subTab.label}
78
+ </div>
79
+ </div>
80
+ ))}
47
81
  </div>
48
82
  ))}
49
83
  </div>
@@ -52,7 +86,7 @@ export const TsTabs = ({ defaultSelectedTabId, tabs }: TsTabsProps) => {
52
86
  {selectedTab?.actions && <div className="ts-tabs-actions">{selectedTab?.actions}</div>}
53
87
  </div>
54
88
 
55
- <div className="ts-tabs-container">{selectedTab?.element}</div>
89
+ <div className="ts-tabs-container">{renderedElement}</div>
56
90
  </div>
57
91
  );
58
92
  };
@@ -5,8 +5,9 @@ export type TabItem = {
5
5
  id: string;
6
6
  label: string;
7
7
  disabled?: boolean;
8
- element: ReactElement;
8
+ element?: ReactElement;
9
+ subTabs?: TabItem[];
9
10
  actions?: ReactElement;
10
11
  onClick?: () => void;
11
12
  };
12
- export type TsTabsProps = { defaultSelectedTabId?: string; tabs: TabItem[] };
13
+ export type TsTabsProps = { value?: string; tabs: TabItem[] };
@@ -22,6 +22,20 @@ Tabs are used to move from one content to another within the same context.
22
22
  id: '1',
23
23
  label: 'Tab item 1',
24
24
  element: <p>Tab item 1 content</p>,
25
+ },
26
+ {
27
+ id: '2',
28
+ label: 'Tab item 2',
29
+ subTabs: [
30
+ { id: '2.1', label: 'Sub tab item 2.1', element: <p>Sub tab item 2.1 content</p> },
31
+ { id: '2.2', label: 'Sub tab item 2.2', element: <p>Sub tab item 2.2 content</p> },
32
+ ],
33
+ },
34
+ { id: 'disabled', label: 'Tab item disabled', disabled: true, element: <></> },
35
+ {
36
+ id: '3',
37
+ label: 'Tab item with actions',
38
+ element: <p>Tab item 3 content</p>,
25
39
  actions: (
26
40
  <>
27
41
  <TsButton>Action 1</TsButton>
@@ -29,19 +43,14 @@ Tabs are used to move from one content to another within the same context.
29
43
  </>
30
44
  ),
31
45
  },
32
- { id: '2', label: 'Tab item 2', element: <p>Tab item 2 content</p> },
33
- { id: 'disabled', label: 'Tab item disabled', disabled: true, element: <></> },
34
- {
35
- id: '3',
36
- label: 'Tab item 3',
37
- element: <p>Tab item 3 content</p>,
38
- actions: <TsButton icon="add">Action</TsButton>,
39
- },
40
46
  ],
41
47
  }}
42
48
  argTypes={tabsArgTypes}
43
- >
49
+
50
+ >
51
+
44
52
  {args => <TsTabs {...args} />}
53
+
45
54
  </Story>
46
55
  </Canvas>
47
56