Files
cidwa-components/src/components/tabs.tsx
T

88 lines
2.5 KiB
TypeScript
Raw Normal View History

import React, { useState, JSX } from 'react';
2025-03-25 08:46:06 -06:00
interface Tab {
id: string;
title: string | JSX.Element;
titleText?: string;
2025-03-25 08:46:06 -06:00
content: JSX.Element;
disabled?: boolean;
}
interface TabsProps {
tabs: Tab[];
style?: 'default' | 'box';
2025-03-25 08:46:06 -06:00
className?: {
container?: string;
tab?: string;
content?: string;
};
defaultActiveTab?: string;
2025-03-25 08:46:06 -06:00
}
export default function Tabs({
tabs,
style = 'default',
2025-03-25 08:46:06 -06:00
className,
defaultActiveTab,
2025-03-25 08:46:06 -06:00
}: TabsProps) {
const [activeTab, setActiveTab] = useState<string>(() => {
// 1) si se pasó defaultActiveTab y existe en tabs (y no está disabled), úsala
if (defaultActiveTab) {
const found = tabs.find((t) => t.id === defaultActiveTab && !t.disabled);
if (found) return found.id;
}
// 2) si no, buscar el primer tab habilitado
const firstEnabled = tabs.find((t) => !t.disabled);
return firstEnabled ? firstEnabled.id : tabs[0]?.id || '';
});
2025-03-25 08:46:06 -06:00
return (
<>
<ul className={`nav nav-tabs style-${style}`} id='myTab' role='tablist'>
2025-03-25 08:46:06 -06:00
{tabs.map((tab) => (
<li
key={tab.id}
className='nav-item'
role='presentation'
title={
typeof tab.title === 'string' ? tab.title : tab.titleText || ''
}
2025-03-25 08:46:06 -06:00
>
<button
className={`nav-link ${tab.disabled ? 'disabled' : ''} ${
activeTab === tab.id ? 'active' : ''
2025-03-25 08:46:06 -06:00
}`}
id={`tab-${tab.id}`}
data-bs-toggle='tab'
2025-03-25 08:46:06 -06:00
data-bs-target={`#tab-pane-${tab.id}`}
type='button'
role='tab'
2025-03-25 08:46:06 -06:00
aria-controls={`tab-pane-${tab.id}`}
aria-selected={activeTab === tab.id}
onClick={() => !tab.disabled && setActiveTab(tab.id)}
>
{tab.title.toString().length > 35
? `${tab.title.toString().slice(0, 35)}...`
: tab.title}
</button>
</li>
))}
</ul>
<div className='tab-content mt-3' id='myTabContent'>
2025-03-25 08:46:06 -06:00
{tabs.map((tab) => (
<div
key={tab.id}
className={`tab-pane fade ${
activeTab === tab.id ? 'show active' : ''
2025-03-25 08:46:06 -06:00
} ${className?.content}`}
id={`tab-pane-${tab.id}`}
role='tabpanel'
2025-03-25 08:46:06 -06:00
aria-labelledby={`tab-${tab.id}`}
>
{activeTab === tab.id && tab.content}
</div>
))}
</div>
</>
);
}