groovinads-ui 1.2.37 → 1.2.39
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/index.es.js +2 -2
- package/dist/index.js +2 -2
- package/package.json +1 -1
- package/src/components/Dropdowns/DropdownMultiSelect.jsx +3 -1
- package/src/components/Navigation/Sidebar.jsx +7 -5
- package/src/components/Navigation/Tabnav.jsx +38 -25
- package/src/stories/Sidebar.stories.jsx +1 -1
- package/src/stories/Tabnav.stories.jsx +41 -6
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.39",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"css",
|
|
7
7
|
"sass",
|
|
@@ -30,6 +30,7 @@ const DropdownMultiSelect = ({
|
|
|
30
30
|
showStatus = '',
|
|
31
31
|
focus = false,
|
|
32
32
|
buttonVariant = 'input',
|
|
33
|
+
nowrap = false,
|
|
33
34
|
}) => {
|
|
34
35
|
const [query, setQuery] = useState('');
|
|
35
36
|
|
|
@@ -76,7 +77,7 @@ const DropdownMultiSelect = ({
|
|
|
76
77
|
onToggle={onToggle}
|
|
77
78
|
drop={drop}
|
|
78
79
|
>
|
|
79
|
-
<Dropdown.Toggle as={'div'} className={`btn btn-${buttonVariant} w-100`}>
|
|
80
|
+
<Dropdown.Toggle as={'div'} className={`btn btn-${buttonVariant} w-100 ${nowrap ? 'nowrap' : ''}`}>
|
|
80
81
|
{( valuesSelected.length > 0 && buttonVariant === 'input' ) && (
|
|
81
82
|
<div className='wrapper'>
|
|
82
83
|
{valuesSelected.map((value, index) => {
|
|
@@ -193,6 +194,7 @@ DropdownMultiSelect.propTypes = {
|
|
|
193
194
|
'terciary',
|
|
194
195
|
'outline',
|
|
195
196
|
]),
|
|
197
|
+
nowrap: PropTypes.bool,
|
|
196
198
|
};
|
|
197
199
|
|
|
198
200
|
export default DropdownMultiSelect;
|
|
@@ -11,17 +11,18 @@ import PropTypes from 'prop-types';
|
|
|
11
11
|
// COMPONENTES
|
|
12
12
|
import { Icon } from '../Labels';
|
|
13
13
|
|
|
14
|
-
const Sidebar = ({ api, customLinks, defaultOpened =
|
|
14
|
+
const Sidebar = ({ api, customLinks, defaultOpened = true, show, setShow}) => {
|
|
15
15
|
const isMobile = useMediaQuery({ query: '(max-width: 992px)' })
|
|
16
16
|
|
|
17
17
|
const url = window.location.pathname; // to get current url
|
|
18
18
|
|
|
19
19
|
const [sidebarLinks, setSidebarLinks] = useState([]);
|
|
20
20
|
const [openIndex, setOpenIndex] = useState(null);
|
|
21
|
-
|
|
22
|
-
const [innerShow, setInnerShow] = useState(false);
|
|
21
|
+
console.log('defaultOpened', defaultOpened, isMobile? false : defaultOpened);
|
|
22
|
+
const [innerShow, setInnerShow] = useState(isMobile? false : defaultOpened);
|
|
23
23
|
|
|
24
24
|
const sidebarRef = useRef(null);
|
|
25
|
+
const firstOpen = useRef(true);
|
|
25
26
|
|
|
26
27
|
const handleToggle = (index) => {
|
|
27
28
|
setOpenIndex(openIndex === index ? null : index);
|
|
@@ -37,12 +38,13 @@ const Sidebar = ({ api, customLinks, defaultOpened = false, show, setShow}) => {
|
|
|
37
38
|
}, [api]);
|
|
38
39
|
|
|
39
40
|
useEffect(() => {
|
|
40
|
-
setInnerShow(show);
|
|
41
|
+
setInnerShow(firstOpen.current ? defaultOpened : show);
|
|
41
42
|
}, [show]);
|
|
42
43
|
|
|
43
44
|
useEffect(() => {
|
|
44
45
|
if (isMobile && setShow) setShow(innerShow);
|
|
45
|
-
setInnerShow(isMobile ? false :
|
|
46
|
+
setInnerShow(isMobile ? false : firstOpen.current ? defaultOpened : show)
|
|
47
|
+
firstOpen.current = false;
|
|
46
48
|
}, []);
|
|
47
49
|
|
|
48
50
|
return (
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useState } from 'react';
|
|
1
|
+
import React, { useEffect, useState } from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
import { Nav } from 'react-bootstrap';
|
|
4
4
|
|
|
@@ -8,19 +8,27 @@ import { Icon } from '../Labels';
|
|
|
8
8
|
// HOOKS
|
|
9
9
|
import useTextFormatter from '../../hooks/useTextFormatter';
|
|
10
10
|
|
|
11
|
-
function Tabnav({
|
|
11
|
+
function Tabnav({
|
|
12
|
+
tabs = [],
|
|
13
|
+
activeTab = 1,
|
|
14
|
+
navigateTab= false,
|
|
15
|
+
setActiveTab,
|
|
16
|
+
}) {
|
|
12
17
|
const { toCamelCase } = useTextFormatter();
|
|
13
18
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
console.log('custom function');
|
|
17
|
-
}else{
|
|
18
|
-
const tabIndex = tabs.findIndex((tab) => toCamelCase(tab.tab) === k);
|
|
19
|
-
console.log(tabs[tabIndex].url);
|
|
20
|
-
|
|
21
|
-
window.location.href = tabs[tabIndex].url;
|
|
22
|
-
}
|
|
19
|
+
// initial activeTab (in case it's not sent, it has a default value)
|
|
20
|
+
const [activeTabState, setActiveTabState] = useState(activeTab);
|
|
23
21
|
|
|
22
|
+
const handleSelect = (k) => {
|
|
23
|
+
if (navigateTab) {
|
|
24
|
+
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);
|
|
29
|
+
const tabIndex = tabs.findIndex((tab) => toCamelCase(tab.tab) === k) + 1;
|
|
30
|
+
setActiveTab ? setActiveTab(tabIndex) : setActiveTabState(tabIndex);
|
|
31
|
+
}
|
|
24
32
|
};
|
|
25
33
|
|
|
26
34
|
const formatTabsName = (tab) => {
|
|
@@ -31,24 +39,27 @@ function Tabnav({ tabs = [], activeTab = 1, customFunction = false}) {
|
|
|
31
39
|
return tabReplace.charAt(0).toUpperCase() + tabReplace.slice(1);
|
|
32
40
|
};
|
|
33
41
|
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
setActiveTabState(activeTab);
|
|
44
|
+
}, [activeTab]);
|
|
45
|
+
|
|
34
46
|
return (
|
|
35
47
|
<Nav
|
|
36
48
|
variant='tabs'
|
|
37
|
-
activeKey={toCamelCase(tabs[
|
|
49
|
+
activeKey={toCamelCase(tabs[activeTabState - 1].tab)}
|
|
38
50
|
onSelect={handleSelect}
|
|
39
51
|
>
|
|
40
|
-
{tabs.map(({ tab, badgeNumber, warningIcon }, index) =>
|
|
41
|
-
|
|
42
|
-
<Nav.
|
|
43
|
-
eventKey={toCamelCase(tab)}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
))}
|
|
52
|
+
{tabs.map(({ tab, badgeNumber, warningIcon }, index) => {
|
|
53
|
+
return (
|
|
54
|
+
<Nav.Item key={`tabs.tab: ${index}`}>
|
|
55
|
+
<Nav.Link eventKey={toCamelCase(tab)}>
|
|
56
|
+
{warningIcon && <Icon iconName='triangle-exclamation' />}
|
|
57
|
+
{formatTabsName(tab)}
|
|
58
|
+
{badgeNumber && <span className='tab-badge'>{badgeNumber}</span>}
|
|
59
|
+
</Nav.Link>
|
|
60
|
+
</Nav.Item>
|
|
61
|
+
);
|
|
62
|
+
})}
|
|
52
63
|
</Nav>
|
|
53
64
|
);
|
|
54
65
|
}
|
|
@@ -56,7 +67,9 @@ function Tabnav({ tabs = [], activeTab = 1, customFunction = false}) {
|
|
|
56
67
|
Tabnav.propTypes = {
|
|
57
68
|
tabs: PropTypes.array,
|
|
58
69
|
activeTab: PropTypes.number,
|
|
59
|
-
|
|
70
|
+
customFunction: PropTypes.bool,
|
|
71
|
+
navigateTab: PropTypes.bool,
|
|
72
|
+
setExternalTab: PropTypes.func,
|
|
60
73
|
};
|
|
61
74
|
|
|
62
75
|
export default Tabnav;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
2
|
import Tabnav from '../components/Navigation/Tabnav';
|
|
3
|
+
import { Button } from 'react-bootstrap';
|
|
3
4
|
|
|
4
5
|
export default {
|
|
5
6
|
title: 'Navigation/Tabnav',
|
|
@@ -8,13 +9,47 @@ export default {
|
|
|
8
9
|
|
|
9
10
|
const Template = (args) => {
|
|
10
11
|
const tabs = [
|
|
11
|
-
{ tab: '
|
|
12
|
-
{ tab: '
|
|
13
|
-
{ tab: '
|
|
12
|
+
{ tab: 'Tab', badgeNumber: '', url: '/com', warningIcon: true },
|
|
13
|
+
{ tab: 'Tab 1', badgeNumber: '1', url: '/abc', warningIcon: false },
|
|
14
|
+
{ tab: 'Tab 2', badgeNumber: '2', url: '/www', warningIcon: false },
|
|
14
15
|
];
|
|
15
|
-
|
|
16
|
+
|
|
17
|
+
const [activeTab, setActiveTab] = useState(1);
|
|
16
18
|
|
|
17
|
-
return
|
|
19
|
+
return (
|
|
20
|
+
<>
|
|
21
|
+
{/* test: external Buttons to change */}
|
|
22
|
+
<Button onClick={() => setActiveTab(1)}>1</Button>
|
|
23
|
+
<Button onClick={() => setActiveTab(2)}>2</Button>
|
|
24
|
+
<Button onClick={() => setActiveTab(3)}>3</Button>
|
|
25
|
+
|
|
26
|
+
<Tabnav
|
|
27
|
+
{...args}
|
|
28
|
+
tabs={tabs}
|
|
29
|
+
activeTab={activeTab} // Send the external state
|
|
30
|
+
setActiveTab={setActiveTab} // Send the setter of the external state
|
|
31
|
+
/>
|
|
32
|
+
<Tabnav
|
|
33
|
+
{...args}
|
|
34
|
+
tabs={tabs}
|
|
35
|
+
activeTab={2} // Test with the activeTab prop
|
|
36
|
+
|
|
37
|
+
/>
|
|
38
|
+
|
|
39
|
+
<Tabnav
|
|
40
|
+
{...args}
|
|
41
|
+
tabs={tabs} // Test without the activeTab prop
|
|
42
|
+
/>
|
|
43
|
+
|
|
44
|
+
<Tabnav
|
|
45
|
+
{...args}
|
|
46
|
+
tabs={tabs}
|
|
47
|
+
activeTab={activeTab}
|
|
48
|
+
setActiveTab={setActiveTab}
|
|
49
|
+
navigateTab={true} // Test with navigateTab prop
|
|
50
|
+
/>
|
|
51
|
+
</>
|
|
52
|
+
);
|
|
18
53
|
};
|
|
19
54
|
|
|
20
55
|
export const Default = Template.bind({});
|