groovinads-ui 1.2.42 → 1.2.44
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/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "groovinads-ui",
|
|
3
3
|
"description": "Groovinads UI is a React component library designed exclusively for Groovinads applications. It provides ready-to-use UI elements styled according to Groovinads design guidelines to facilitate rapid development.",
|
|
4
|
-
"version": "1.2.
|
|
4
|
+
"version": "1.2.44",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"css",
|
|
7
7
|
"sass",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useState } from 'react';
|
|
1
|
+
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
|
|
4
4
|
// BOOTSTRAP
|
|
@@ -18,12 +18,18 @@ const DropdownFilter = ({
|
|
|
18
18
|
locked = false,
|
|
19
19
|
onRemoveFilter,
|
|
20
20
|
show,
|
|
21
|
+
setShow,
|
|
21
22
|
onToggle,
|
|
22
23
|
overflow = false,
|
|
23
24
|
className = '',
|
|
25
|
+
autoClose,
|
|
24
26
|
}) => {
|
|
25
27
|
const [query, setQuery] = useState('');
|
|
26
28
|
|
|
29
|
+
const [innerShow, setInnerShow] = useState(!!show);
|
|
30
|
+
|
|
31
|
+
const dropdownRef = useRef(null);
|
|
32
|
+
|
|
27
33
|
const EmptySpace = () => {
|
|
28
34
|
return (
|
|
29
35
|
<div className='dropdown-filter-empty-space'>
|
|
@@ -55,14 +61,44 @@ const DropdownFilter = ({
|
|
|
55
61
|
const handlePill = (index) =>
|
|
56
62
|
setValuesSelected(valuesSelected.filter((item, i) => i !== index));
|
|
57
63
|
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
setInnerShow(show);
|
|
66
|
+
}, [show]);
|
|
67
|
+
|
|
68
|
+
const handleClickOutside = useCallback((event) => {
|
|
69
|
+
if (
|
|
70
|
+
dropdownRef?.current &&
|
|
71
|
+
!dropdownRef?.current.contains(event?.target) &&
|
|
72
|
+
(autoClose === true || autoClose === 'outside')
|
|
73
|
+
) {
|
|
74
|
+
setInnerShow(false);
|
|
75
|
+
setShow(false);
|
|
76
|
+
}
|
|
77
|
+
}, []);
|
|
78
|
+
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
document.addEventListener('click', handleClickOutside);
|
|
81
|
+
return () => {
|
|
82
|
+
document.removeEventListener('click', handleClickOutside);
|
|
83
|
+
};
|
|
84
|
+
}, []);
|
|
85
|
+
|
|
58
86
|
return (
|
|
59
87
|
<Dropdown
|
|
60
|
-
show={show}
|
|
61
88
|
onToggle={onToggle}
|
|
62
89
|
className={`dropdown-filter ${locked ? 'locked' : ''} ${className}`}
|
|
63
|
-
autoClose={
|
|
90
|
+
autoClose={autoClose}
|
|
91
|
+
show={innerShow}
|
|
92
|
+
ref={dropdownRef}
|
|
64
93
|
>
|
|
65
|
-
<Dropdown.Toggle
|
|
94
|
+
<Dropdown.Toggle
|
|
95
|
+
variant='toggle-filter'
|
|
96
|
+
onClick={(e) => {
|
|
97
|
+
e.stopPropagation(); // Detiene la propagación del clic
|
|
98
|
+
setInnerShow((prevShow) => !prevShow); // Alterna el estado interno del dropdown
|
|
99
|
+
setShow((prevShow) => !prevShow); // Alterna el estado del dropdown en el estado externo también
|
|
100
|
+
}}
|
|
101
|
+
>
|
|
66
102
|
<div className='filter-heading'>
|
|
67
103
|
<div className='filter-title'>
|
|
68
104
|
<span>{title}</span>
|
|
@@ -258,9 +294,11 @@ DropdownFilter.propTypes = {
|
|
|
258
294
|
locked: PropTypes.bool,
|
|
259
295
|
onRemoveFilter: PropTypes.func,
|
|
260
296
|
show: PropTypes.bool,
|
|
297
|
+
setShow: PropTypes.func,
|
|
261
298
|
onToggle: PropTypes.func,
|
|
262
299
|
overflow: PropTypes.bool,
|
|
263
300
|
className: PropTypes.string,
|
|
301
|
+
autoClose: PropTypes.bool,
|
|
264
302
|
};
|
|
265
303
|
|
|
266
304
|
export default DropdownFilter;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useEffect, useRef, useState } from 'react';
|
|
1
|
+
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
|
|
4
4
|
// BOOTSTRAP
|
|
@@ -26,6 +26,7 @@ const DropdownMultiSelect = ({
|
|
|
26
26
|
setValuesSelected,
|
|
27
27
|
values = [],
|
|
28
28
|
show,
|
|
29
|
+
setShow,
|
|
29
30
|
idInPill = false,
|
|
30
31
|
showStatus = '',
|
|
31
32
|
focus = false,
|
|
@@ -33,6 +34,9 @@ const DropdownMultiSelect = ({
|
|
|
33
34
|
nowrap = false,
|
|
34
35
|
}) => {
|
|
35
36
|
const [query, setQuery] = useState('');
|
|
37
|
+
const [innerShow, setInnerShow] = useState(!!show);
|
|
38
|
+
|
|
39
|
+
const dropdownRef = useRef(null);
|
|
36
40
|
|
|
37
41
|
const { highlightText } = useTextFormatter();
|
|
38
42
|
|
|
@@ -69,16 +73,47 @@ const DropdownMultiSelect = ({
|
|
|
69
73
|
(showStatus ? parseInt(item.status) === parseInt(showStatus) : true),
|
|
70
74
|
);
|
|
71
75
|
|
|
76
|
+
useEffect(() => {
|
|
77
|
+
setInnerShow(show);
|
|
78
|
+
}, [show]);
|
|
79
|
+
|
|
80
|
+
const handleClickOutside = useCallback((event) => {
|
|
81
|
+
if (
|
|
82
|
+
dropdownRef?.current &&
|
|
83
|
+
!dropdownRef?.current.contains(event?.target) &&
|
|
84
|
+
(autoClose === true || autoClose === 'outside')
|
|
85
|
+
) {
|
|
86
|
+
setInnerShow(false);
|
|
87
|
+
setShow(false);
|
|
88
|
+
}
|
|
89
|
+
}, []);
|
|
90
|
+
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
document.addEventListener('click', handleClickOutside);
|
|
93
|
+
return () => {
|
|
94
|
+
document.removeEventListener('click', handleClickOutside);
|
|
95
|
+
};
|
|
96
|
+
}, []);
|
|
97
|
+
|
|
72
98
|
return (
|
|
73
99
|
<Dropdown
|
|
74
100
|
className={className}
|
|
75
101
|
autoClose={autoClose}
|
|
76
|
-
show={
|
|
102
|
+
show={innerShow}
|
|
103
|
+
ref={dropdownRef}
|
|
77
104
|
onToggle={onToggle}
|
|
78
105
|
drop={drop}
|
|
79
106
|
>
|
|
80
|
-
<Dropdown.Toggle
|
|
81
|
-
{
|
|
107
|
+
<Dropdown.Toggle
|
|
108
|
+
as={'div'}
|
|
109
|
+
className={`btn btn-${buttonVariant} w-100 ${nowrap ? 'nowrap' : ''}`}
|
|
110
|
+
onClick={(e) => {
|
|
111
|
+
e.stopPropagation(); // Detiene la propagación del clic
|
|
112
|
+
setInnerShow((prevShow) => !prevShow); // Alterna el estado interno del dropdown
|
|
113
|
+
setShow((prevShow) => !prevShow); // Alterna el estado del dropdown en el estado externo también
|
|
114
|
+
}}
|
|
115
|
+
>
|
|
116
|
+
{valuesSelected.length > 0 && buttonVariant === 'input' && (
|
|
82
117
|
<div className='wrapper'>
|
|
83
118
|
{valuesSelected.map((value, index) => {
|
|
84
119
|
return (
|
|
@@ -181,6 +216,7 @@ DropdownMultiSelect.propTypes = {
|
|
|
181
216
|
setValuesSelected: PropTypes.func,
|
|
182
217
|
values: PropTypes.array,
|
|
183
218
|
show: PropTypes.bool,
|
|
219
|
+
setShow: PropTypes.func,
|
|
184
220
|
object: PropTypes.bool,
|
|
185
221
|
nameKey: PropTypes.string,
|
|
186
222
|
idKey: PropTypes.string,
|
|
@@ -11,8 +11,9 @@ import useTextFormatter from '../../hooks/useTextFormatter';
|
|
|
11
11
|
function Tabnav({
|
|
12
12
|
tabs = [],
|
|
13
13
|
activeTab = 1,
|
|
14
|
-
navigateTab= false,
|
|
14
|
+
navigateTab = false,
|
|
15
15
|
setActiveTab,
|
|
16
|
+
onNavigate,
|
|
16
17
|
}) {
|
|
17
18
|
const { toCamelCase } = useTextFormatter();
|
|
18
19
|
|
|
@@ -22,19 +23,16 @@ function Tabnav({
|
|
|
22
23
|
const handleSelect = (k) => {
|
|
23
24
|
if (navigateTab) {
|
|
24
25
|
const tab = tabs.find((tab) => toCamelCase(tab.tab) === k);
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}else{
|
|
28
|
-
// console.log('Valor de k:', k);
|
|
26
|
+
onNavigate(tab.url);
|
|
27
|
+
} else {
|
|
29
28
|
const tabIndex = tabs.findIndex((tab) => toCamelCase(tab.tab) === k) + 1;
|
|
30
29
|
setActiveTab ? setActiveTab(tabIndex) : setActiveTabState(tabIndex);
|
|
31
30
|
}
|
|
32
31
|
};
|
|
33
32
|
|
|
34
33
|
const formatTabsName = (tab) => {
|
|
35
|
-
if (tab === 'api_keys')
|
|
36
|
-
|
|
37
|
-
}
|
|
34
|
+
if (tab === 'api_keys') return 'API Keys';
|
|
35
|
+
|
|
38
36
|
const tabReplace = tab.replace('_', ' ');
|
|
39
37
|
return tabReplace.charAt(0).toUpperCase() + tabReplace.slice(1);
|
|
40
38
|
};
|
|
@@ -46,10 +44,10 @@ function Tabnav({
|
|
|
46
44
|
return (
|
|
47
45
|
<Nav
|
|
48
46
|
variant='tabs'
|
|
49
|
-
activeKey={toCamelCase(tabs[activeTabState - 1]
|
|
47
|
+
activeKey={toCamelCase(tabs[activeTabState - 1]?.tab)}
|
|
50
48
|
onSelect={handleSelect}
|
|
51
49
|
>
|
|
52
|
-
{tabs
|
|
50
|
+
{(tabs || [])?.map(({ tab, badgeNumber, warningIcon }, index) => {
|
|
53
51
|
return (
|
|
54
52
|
<Nav.Item key={`tabs.tab: ${index}`}>
|
|
55
53
|
<Nav.Link eventKey={toCamelCase(tab)}>
|
|
@@ -67,7 +65,7 @@ function Tabnav({
|
|
|
67
65
|
Tabnav.propTypes = {
|
|
68
66
|
tabs: PropTypes.array.isRequired,
|
|
69
67
|
activeTab: PropTypes.number,
|
|
70
|
-
|
|
68
|
+
customFunction: PropTypes.bool,
|
|
71
69
|
navigateTab: PropTypes.bool,
|
|
72
70
|
setExternalTab: PropTypes.func,
|
|
73
71
|
};
|