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.42",
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={false}
90
+ autoClose={autoClose}
91
+ show={innerShow}
92
+ ref={dropdownRef}
64
93
  >
65
- <Dropdown.Toggle variant='toggle-filter'>
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={show}
102
+ show={innerShow}
103
+ ref={dropdownRef}
77
104
  onToggle={onToggle}
78
105
  drop={drop}
79
106
  >
80
- <Dropdown.Toggle as={'div'} className={`btn btn-${buttonVariant} w-100 ${nowrap ? 'nowrap' : ''}`}>
81
- {( valuesSelected.length > 0 && buttonVariant === 'input' ) && (
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
- console.log(tab.url);
26
- window.location.href = tab.url;
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
- return 'API Keys';
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].tab)}
47
+ activeKey={toCamelCase(tabs[activeTabState - 1]?.tab)}
50
48
  onSelect={handleSelect}
51
49
  >
52
- {tabs.map(({ tab, badgeNumber, warningIcon }, index) => {
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
- customFunction: PropTypes.bool,
68
+ customFunction: PropTypes.bool,
71
69
  navigateTab: PropTypes.bool,
72
70
  setExternalTab: PropTypes.func,
73
71
  };