@dktunited-techoff/techoff-suite-ui 1.6.13 → 1.6.15
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/esm/components/TsDropdown/TsDropdown.d.ts +1 -1
- package/esm/components/TsDropdown/TsDropdown.js +24 -9
- package/esm/components/TsDropdown/TsDropdown.js.map +1 -1
- package/esm/components/TsDropdown/TsDropdown.types.d.ts +2 -0
- package/lib/components/TsDropdown/TsDropdown.d.ts +1 -1
- package/lib/components/TsDropdown/TsDropdown.js +23 -8
- package/lib/components/TsDropdown/TsDropdown.js.map +1 -1
- package/lib/components/TsDropdown/TsDropdown.types.d.ts +2 -0
- package/package.json +1 -1
- package/src/components/TsDropdown/TsDropdown.tsx +24 -8
- package/src/components/TsDropdown/TsDropdown.types.ts +3 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { TsDropdownProps } from './TsDropdown.types';
|
|
3
3
|
import './TsDropdown.css';
|
|
4
|
-
export declare const TsDropdown: <T extends unknown>({ label, options, placeholder, searchPlaceholder, value, disabled, searchable, getOptionLabel, getOptionValue, loadOptions, onChange, }: TsDropdownProps<T>) => React.JSX.Element;
|
|
4
|
+
export declare const TsDropdown: <T extends unknown>({ containerRef, label, options, placeholder, searchPlaceholder, value, disabled, searchable, getOptionLabel, getOptionValue, loadOptions, onChange, }: TsDropdownProps<T>) => React.JSX.Element;
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { useEffect, useState } from 'react';
|
|
2
|
+
import { useEffect, useRef, useState } from 'react';
|
|
3
3
|
import { TsIcon } from '../TsIcon/TsIcon';
|
|
4
4
|
import { TsInput } from '../TsInput/TsInput/TsInput';
|
|
5
5
|
import { useClickOutside } from '../../hooks/use-click-outside';
|
|
6
|
-
import { capitalize } from '../../utils/string.utils';
|
|
7
|
-
import './TsDropdown.css';
|
|
8
6
|
import { TsLoader } from '../TsLoader/TsLoader';
|
|
9
|
-
|
|
7
|
+
import './TsDropdown.css';
|
|
8
|
+
export const TsDropdown = ({ containerRef, label, options, placeholder, searchPlaceholder, value, disabled, searchable, getOptionLabel, getOptionValue, loadOptions, onChange, }) => {
|
|
10
9
|
const [showDropdownMenu, setShowDropdownMenu] = useState(false);
|
|
11
10
|
const [searchValue, setSearchValue] = useState('');
|
|
12
11
|
const [items, setItems] = useState(options ?? []);
|
|
13
12
|
const [loading, setLoading] = useState(false);
|
|
14
13
|
const [isFetchError, setIsFetchError] = useState(false);
|
|
15
|
-
const
|
|
14
|
+
const dropdownRef = useClickOutside(() => setShowDropdownMenu(false));
|
|
15
|
+
const dropdownMenuRef = useRef(null);
|
|
16
16
|
// ########
|
|
17
17
|
// Fetchers
|
|
18
18
|
const fetchOptions = () => {
|
|
@@ -50,18 +50,33 @@ export const TsDropdown = ({ label, options, placeholder, searchPlaceholder, val
|
|
|
50
50
|
useEffect(() => {
|
|
51
51
|
if (searchable && !showDropdownMenu)
|
|
52
52
|
setSearchValue('');
|
|
53
|
+
console.log('INITIALIZE', showDropdownMenu, containerRef?.current, dropdownMenuRef.current);
|
|
54
|
+
if (showDropdownMenu && containerRef?.current && dropdownMenuRef.current) {
|
|
55
|
+
const dropdownMenuRect = dropdownMenuRef.current.getBoundingClientRect();
|
|
56
|
+
const containerRect = containerRef.current.getBoundingClientRect();
|
|
57
|
+
console.log('DIMENSIONS DROPDOWN', dropdownMenuRect.bottom);
|
|
58
|
+
console.log('DIMENSIONS CONTAINER', containerRect.bottom);
|
|
59
|
+
if (dropdownMenuRect.bottom > containerRect.bottom) {
|
|
60
|
+
console.log('STYLE', 'bottom', 'calc(100%+8px)');
|
|
61
|
+
dropdownMenuRef.current.style.bottom = 'calc(100%+8px)';
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.log('STYLE', 'top', 'calc(100%+8px)');
|
|
65
|
+
dropdownMenuRef.current.style.top = 'calc(100%+8px)';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
53
68
|
}, [showDropdownMenu]);
|
|
54
69
|
// #########
|
|
55
70
|
// Rendering
|
|
56
|
-
return (React.createElement("div", { className: "ts-dropdown-container", ref:
|
|
71
|
+
return (React.createElement("div", { className: "ts-dropdown-container", ref: dropdownRef },
|
|
57
72
|
React.createElement("div", { className: "ts-dropdown-input-container" },
|
|
58
73
|
label && React.createElement("div", { className: "ts-dropdown-label" }, label),
|
|
59
74
|
React.createElement("div", { className: `ts-dropdown-input ${disabled ? 'ts-dropdown-input--disabled' : ''}`, onClick: handleShowDropdownMenu },
|
|
60
75
|
!value && placeholder && React.createElement("div", { className: "ts-dropdown-input--placeholder" }, placeholder),
|
|
61
|
-
value && React.createElement("div", { className: "ts-dropdown-input--value" },
|
|
76
|
+
value && React.createElement("div", { className: "ts-dropdown-input--value" }, getOptionLabel(value)),
|
|
62
77
|
React.createElement("div", { className: "ts-dropdown-input--chevron" },
|
|
63
78
|
React.createElement(TsIcon, { name: showDropdownMenu ? 'chevron-up' : 'chevron-down' })))),
|
|
64
|
-
!disabled && showDropdownMenu && (React.createElement("div", { className: "ts-dropdown-menu-container" },
|
|
79
|
+
!disabled && showDropdownMenu && (React.createElement("div", { className: "ts-dropdown-menu-container", ref: dropdownMenuRef },
|
|
65
80
|
searchable && (React.createElement("div", { className: "ts-dropdown-search" },
|
|
66
81
|
React.createElement(TsInput, { icon: "search", placeholder: searchPlaceholder, value: searchValue, autoFocus: true, onChange: setSearchValue }))),
|
|
67
82
|
React.createElement("div", { className: "ts-dropdown-menu" },
|
|
@@ -72,6 +87,6 @@ export const TsDropdown = ({ label, options, placeholder, searchPlaceholder, val
|
|
|
72
87
|
!loading &&
|
|
73
88
|
!isFetchError &&
|
|
74
89
|
items.length > 0 &&
|
|
75
|
-
items.map(item => (React.createElement("div", { key: getOptionValue(item), className: "ts-dropdown-menu-item", onClick: () => handleSelectItem(item) },
|
|
90
|
+
items.map(item => (React.createElement("div", { key: getOptionValue(item), className: "ts-dropdown-menu-item", onClick: () => handleSelectItem(item) }, getOptionLabel(item)))))))));
|
|
76
91
|
};
|
|
77
92
|
//# sourceMappingURL=TsDropdown.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TsDropdown.js","sourceRoot":"","sources":["../../../src/components/TsDropdown/TsDropdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"TsDropdown.js","sourceRoot":"","sources":["../../../src/components/TsDropdown/TsDropdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,kBAAkB,CAAC;AAE1B,MAAM,CAAC,MAAM,UAAU,GAAG,CAAoB,EAC5C,YAAY,EACZ,KAAK,EACL,OAAO,EACP,WAAW,EACX,iBAAiB,EACjB,KAAK,EACL,QAAQ,EACR,UAAU,EACV,cAAc,EACd,cAAc,EACd,WAAW,EACX,QAAQ,GACW,EAAE,EAAE;IACvB,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IACzE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAC3D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAM,OAAO,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IACvD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,MAAM,eAAe,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAErD,WAAW;IACX,WAAW;IACX,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,CAAC,OAAO,IAAI,WAAW,EAAE;YAC3B,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,eAAe,CAAC,KAAK,CAAC,CAAC;YACvB,WAAW,CAAC,WAAW,CAAC;iBACrB,IAAI,CAAC,QAAQ,CAAC;iBACd,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;iBAClC,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;SACrC;IACH,CAAC,CAAC;IAEF,WAAW;IACX,WAAW;IACX,MAAM,gBAAgB,GAAG,CAAC,IAAO,EAAE,EAAE;QACnC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,CAAC;IACF,MAAM,sBAAsB,GAAG,GAAG,EAAE,CAAC,CAAC,QAAQ,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAE5E,WAAW;IACX,WAAW;IACX,SAAS,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAC5B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,UAAU,IAAI,OAAO,EAAE;YACzB,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;SAC9G;QAED,IAAI,UAAU,IAAI,CAAC,OAAO,IAAI,WAAW,EAAE;YACzC,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,eAAe,CAAC,KAAK,CAAC,CAAC;YACvB,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;YAChD,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;SACtC;QAED,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAClB,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAClB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,UAAU,IAAI,CAAC,gBAAgB;YAAE,cAAc,CAAC,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;QAC5F,IAAI,gBAAgB,IAAI,YAAY,EAAE,OAAO,IAAI,eAAe,CAAC,OAAO,EAAE;YACxE,MAAM,gBAAgB,GAAG,eAAe,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;YACzE,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;YAE1D,IAAI,gBAAgB,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE;gBAClD,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;gBACjD,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,gBAAgB,CAAC;aACzD;iBAAM;gBACL,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;gBAC9C,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,gBAAgB,CAAC;aACtD;SACF;IACH,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB,YAAY;IACZ,YAAY;IACZ,OAAO,CACL,6BAAK,SAAS,EAAC,uBAAuB,EAAC,GAAG,EAAE,WAAW;QACrD,6BAAK,SAAS,EAAC,6BAA6B;YACzC,KAAK,IAAI,6BAAK,SAAS,EAAC,mBAAmB,IAAE,KAAK,CAAO;YAC1D,6BACE,SAAS,EAAE,qBAAqB,QAAQ,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,EAAE,EAC/E,OAAO,EAAE,sBAAsB;gBAE9B,CAAC,KAAK,IAAI,WAAW,IAAI,6BAAK,SAAS,EAAC,gCAAgC,IAAE,WAAW,CAAO;gBAC5F,KAAK,IAAI,6BAAK,SAAS,EAAC,0BAA0B,IAAE,cAAc,CAAC,KAAK,CAAC,CAAO;gBACjF,6BAAK,SAAS,EAAC,4BAA4B;oBACzC,oBAAC,MAAM,IAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,GAAI,CAC9D,CACF,CACF;QAEL,CAAC,QAAQ,IAAI,gBAAgB,IAAI,CAChC,6BAAK,SAAS,EAAC,4BAA4B,EAAC,GAAG,EAAE,eAAe;YAC7D,UAAU,IAAI,CACb,6BAAK,SAAS,EAAC,oBAAoB;gBACjC,oBAAC,OAAO,IACN,IAAI,EAAC,QAAQ,EACb,WAAW,EAAE,iBAAiB,EAC9B,KAAK,EAAE,WAAW,EAClB,SAAS,QACT,QAAQ,EAAE,cAAc,GACxB,CACE,CACP;YAED,6BAAK,SAAS,EAAC,kBAAkB;gBAC9B,OAAO,IAAI,CACV,6BAAK,SAAS,EAAC,yBAAyB;oBACtC,oBAAC,QAAQ,IAAC,IAAI,EAAC,IAAI,GAAG,CAClB,CACP;gBACA,CAAC,OAAO,IAAI,YAAY,IAAI,CAC3B,6BAAK,SAAS,EAAC,6BAA6B,yCAAyC,CACtF;gBACA,CAAC,OAAO,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAClD,6BAAK,SAAS,EAAC,6BAA6B,wBAAwB,CACrE;gBACA,CAAC,OAAO;oBACP,CAAC,YAAY;oBACb,KAAK,CAAC,MAAM,GAAG,CAAC;oBAChB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAChB,6BACE,GAAG,EAAE,cAAc,CAAC,IAAI,CAAC,EACzB,SAAS,EAAC,uBAAuB,EACjC,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAEpC,cAAc,CAAC,IAAI,CAAC,CACjB,CACP,CAAC,CACA,CACF,CACP,CACG,CACP,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { TsDropdownProps } from './TsDropdown.types';
|
|
3
3
|
import './TsDropdown.css';
|
|
4
|
-
export declare const TsDropdown: <T extends unknown>({ label, options, placeholder, searchPlaceholder, value, disabled, searchable, getOptionLabel, getOptionValue, loadOptions, onChange, }: TsDropdownProps<T>) => React.JSX.Element;
|
|
4
|
+
export declare const TsDropdown: <T extends unknown>({ containerRef, label, options, placeholder, searchPlaceholder, value, disabled, searchable, getOptionLabel, getOptionValue, loadOptions, onChange, }: TsDropdownProps<T>) => React.JSX.Element;
|
|
@@ -6,16 +6,16 @@ const react_1 = require("react");
|
|
|
6
6
|
const TsIcon_1 = require("../TsIcon/TsIcon");
|
|
7
7
|
const TsInput_1 = require("../TsInput/TsInput/TsInput");
|
|
8
8
|
const use_click_outside_1 = require("../../hooks/use-click-outside");
|
|
9
|
-
const string_utils_1 = require("../../utils/string.utils");
|
|
10
|
-
require("./TsDropdown.css");
|
|
11
9
|
const TsLoader_1 = require("../TsLoader/TsLoader");
|
|
12
|
-
|
|
10
|
+
require("./TsDropdown.css");
|
|
11
|
+
const TsDropdown = ({ containerRef, label, options, placeholder, searchPlaceholder, value, disabled, searchable, getOptionLabel, getOptionValue, loadOptions, onChange, }) => {
|
|
13
12
|
const [showDropdownMenu, setShowDropdownMenu] = (0, react_1.useState)(false);
|
|
14
13
|
const [searchValue, setSearchValue] = (0, react_1.useState)('');
|
|
15
14
|
const [items, setItems] = (0, react_1.useState)(options ?? []);
|
|
16
15
|
const [loading, setLoading] = (0, react_1.useState)(false);
|
|
17
16
|
const [isFetchError, setIsFetchError] = (0, react_1.useState)(false);
|
|
18
|
-
const
|
|
17
|
+
const dropdownRef = (0, use_click_outside_1.useClickOutside)(() => setShowDropdownMenu(false));
|
|
18
|
+
const dropdownMenuRef = (0, react_1.useRef)(null);
|
|
19
19
|
// ########
|
|
20
20
|
// Fetchers
|
|
21
21
|
const fetchOptions = () => {
|
|
@@ -53,18 +53,33 @@ const TsDropdown = ({ label, options, placeholder, searchPlaceholder, value, dis
|
|
|
53
53
|
(0, react_1.useEffect)(() => {
|
|
54
54
|
if (searchable && !showDropdownMenu)
|
|
55
55
|
setSearchValue('');
|
|
56
|
+
console.log('INITIALIZE', showDropdownMenu, containerRef?.current, dropdownMenuRef.current);
|
|
57
|
+
if (showDropdownMenu && containerRef?.current && dropdownMenuRef.current) {
|
|
58
|
+
const dropdownMenuRect = dropdownMenuRef.current.getBoundingClientRect();
|
|
59
|
+
const containerRect = containerRef.current.getBoundingClientRect();
|
|
60
|
+
console.log('DIMENSIONS DROPDOWN', dropdownMenuRect.bottom);
|
|
61
|
+
console.log('DIMENSIONS CONTAINER', containerRect.bottom);
|
|
62
|
+
if (dropdownMenuRect.bottom > containerRect.bottom) {
|
|
63
|
+
console.log('STYLE', 'bottom', 'calc(100%+8px)');
|
|
64
|
+
dropdownMenuRef.current.style.bottom = 'calc(100%+8px)';
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
console.log('STYLE', 'top', 'calc(100%+8px)');
|
|
68
|
+
dropdownMenuRef.current.style.top = 'calc(100%+8px)';
|
|
69
|
+
}
|
|
70
|
+
}
|
|
56
71
|
}, [showDropdownMenu]);
|
|
57
72
|
// #########
|
|
58
73
|
// Rendering
|
|
59
|
-
return (React.createElement("div", { className: "ts-dropdown-container", ref:
|
|
74
|
+
return (React.createElement("div", { className: "ts-dropdown-container", ref: dropdownRef },
|
|
60
75
|
React.createElement("div", { className: "ts-dropdown-input-container" },
|
|
61
76
|
label && React.createElement("div", { className: "ts-dropdown-label" }, label),
|
|
62
77
|
React.createElement("div", { className: `ts-dropdown-input ${disabled ? 'ts-dropdown-input--disabled' : ''}`, onClick: handleShowDropdownMenu },
|
|
63
78
|
!value && placeholder && React.createElement("div", { className: "ts-dropdown-input--placeholder" }, placeholder),
|
|
64
|
-
value && React.createElement("div", { className: "ts-dropdown-input--value" },
|
|
79
|
+
value && React.createElement("div", { className: "ts-dropdown-input--value" }, getOptionLabel(value)),
|
|
65
80
|
React.createElement("div", { className: "ts-dropdown-input--chevron" },
|
|
66
81
|
React.createElement(TsIcon_1.TsIcon, { name: showDropdownMenu ? 'chevron-up' : 'chevron-down' })))),
|
|
67
|
-
!disabled && showDropdownMenu && (React.createElement("div", { className: "ts-dropdown-menu-container" },
|
|
82
|
+
!disabled && showDropdownMenu && (React.createElement("div", { className: "ts-dropdown-menu-container", ref: dropdownMenuRef },
|
|
68
83
|
searchable && (React.createElement("div", { className: "ts-dropdown-search" },
|
|
69
84
|
React.createElement(TsInput_1.TsInput, { icon: "search", placeholder: searchPlaceholder, value: searchValue, autoFocus: true, onChange: setSearchValue }))),
|
|
70
85
|
React.createElement("div", { className: "ts-dropdown-menu" },
|
|
@@ -75,7 +90,7 @@ const TsDropdown = ({ label, options, placeholder, searchPlaceholder, value, dis
|
|
|
75
90
|
!loading &&
|
|
76
91
|
!isFetchError &&
|
|
77
92
|
items.length > 0 &&
|
|
78
|
-
items.map(item => (React.createElement("div", { key: getOptionValue(item), className: "ts-dropdown-menu-item", onClick: () => handleSelectItem(item) },
|
|
93
|
+
items.map(item => (React.createElement("div", { key: getOptionValue(item), className: "ts-dropdown-menu-item", onClick: () => handleSelectItem(item) }, getOptionLabel(item)))))))));
|
|
79
94
|
};
|
|
80
95
|
exports.TsDropdown = TsDropdown;
|
|
81
96
|
//# sourceMappingURL=TsDropdown.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TsDropdown.js","sourceRoot":"","sources":["../../../src/components/TsDropdown/TsDropdown.tsx"],"names":[],"mappings":";;;AAAA,+BAA+B;AAC/B,
|
|
1
|
+
{"version":3,"file":"TsDropdown.js","sourceRoot":"","sources":["../../../src/components/TsDropdown/TsDropdown.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { useEffect, useState } from 'react';
|
|
2
|
+
import { useEffect, useRef, useState } from 'react';
|
|
3
3
|
import { TsDropdownProps } from './TsDropdown.types';
|
|
4
4
|
import { TsIcon } from '../TsIcon/TsIcon';
|
|
5
5
|
import { TsInput } from '../TsInput/TsInput/TsInput';
|
|
6
6
|
import { useClickOutside } from '../../hooks/use-click-outside';
|
|
7
|
-
import { capitalize } from '../../utils/string.utils';
|
|
8
|
-
import './TsDropdown.css';
|
|
9
7
|
import { TsLoader } from '../TsLoader/TsLoader';
|
|
8
|
+
import './TsDropdown.css';
|
|
10
9
|
|
|
11
10
|
export const TsDropdown = <T extends unknown>({
|
|
11
|
+
containerRef,
|
|
12
12
|
label,
|
|
13
13
|
options,
|
|
14
14
|
placeholder,
|
|
@@ -26,7 +26,8 @@ export const TsDropdown = <T extends unknown>({
|
|
|
26
26
|
const [items, setItems] = useState<T[]>(options ?? []);
|
|
27
27
|
const [loading, setLoading] = useState<boolean>(false);
|
|
28
28
|
const [isFetchError, setIsFetchError] = useState<boolean>(false);
|
|
29
|
-
const
|
|
29
|
+
const dropdownRef = useClickOutside(() => setShowDropdownMenu(false));
|
|
30
|
+
const dropdownMenuRef = useRef<HTMLDivElement>(null);
|
|
30
31
|
|
|
31
32
|
// ########
|
|
32
33
|
// Fetchers
|
|
@@ -68,12 +69,27 @@ export const TsDropdown = <T extends unknown>({
|
|
|
68
69
|
}, [searchValue]);
|
|
69
70
|
useEffect(() => {
|
|
70
71
|
if (searchable && !showDropdownMenu) setSearchValue('');
|
|
72
|
+
console.log('INITIALIZE', showDropdownMenu, containerRef?.current, dropdownMenuRef.current);
|
|
73
|
+
if (showDropdownMenu && containerRef?.current && dropdownMenuRef.current) {
|
|
74
|
+
const dropdownMenuRect = dropdownMenuRef.current.getBoundingClientRect();
|
|
75
|
+
const containerRect = containerRef.current.getBoundingClientRect();
|
|
76
|
+
console.log('DIMENSIONS DROPDOWN', dropdownMenuRect.bottom);
|
|
77
|
+
console.log('DIMENSIONS CONTAINER', containerRect.bottom);
|
|
78
|
+
|
|
79
|
+
if (dropdownMenuRect.bottom > containerRect.bottom) {
|
|
80
|
+
console.log('STYLE', 'bottom', 'calc(100%+8px)');
|
|
81
|
+
dropdownMenuRef.current.style.bottom = 'calc(100%+8px)';
|
|
82
|
+
} else {
|
|
83
|
+
console.log('STYLE', 'top', 'calc(100%+8px)');
|
|
84
|
+
dropdownMenuRef.current.style.top = 'calc(100%+8px)';
|
|
85
|
+
}
|
|
86
|
+
}
|
|
71
87
|
}, [showDropdownMenu]);
|
|
72
88
|
|
|
73
89
|
// #########
|
|
74
90
|
// Rendering
|
|
75
91
|
return (
|
|
76
|
-
<div className="ts-dropdown-container" ref={
|
|
92
|
+
<div className="ts-dropdown-container" ref={dropdownRef}>
|
|
77
93
|
<div className="ts-dropdown-input-container">
|
|
78
94
|
{label && <div className="ts-dropdown-label">{label}</div>}
|
|
79
95
|
<div
|
|
@@ -81,7 +97,7 @@ export const TsDropdown = <T extends unknown>({
|
|
|
81
97
|
onClick={handleShowDropdownMenu}
|
|
82
98
|
>
|
|
83
99
|
{!value && placeholder && <div className="ts-dropdown-input--placeholder">{placeholder}</div>}
|
|
84
|
-
{value && <div className="ts-dropdown-input--value">{
|
|
100
|
+
{value && <div className="ts-dropdown-input--value">{getOptionLabel(value)}</div>}
|
|
85
101
|
<div className="ts-dropdown-input--chevron">
|
|
86
102
|
<TsIcon name={showDropdownMenu ? 'chevron-up' : 'chevron-down'} />
|
|
87
103
|
</div>
|
|
@@ -89,7 +105,7 @@ export const TsDropdown = <T extends unknown>({
|
|
|
89
105
|
</div>
|
|
90
106
|
|
|
91
107
|
{!disabled && showDropdownMenu && (
|
|
92
|
-
<div className="ts-dropdown-menu-container">
|
|
108
|
+
<div className="ts-dropdown-menu-container" ref={dropdownMenuRef}>
|
|
93
109
|
{searchable && (
|
|
94
110
|
<div className="ts-dropdown-search">
|
|
95
111
|
<TsInput
|
|
@@ -123,7 +139,7 @@ export const TsDropdown = <T extends unknown>({
|
|
|
123
139
|
className="ts-dropdown-menu-item"
|
|
124
140
|
onClick={() => handleSelectItem(item)}
|
|
125
141
|
>
|
|
126
|
-
{
|
|
142
|
+
{getOptionLabel(item)}
|
|
127
143
|
</div>
|
|
128
144
|
))}
|
|
129
145
|
</div>
|