mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2025-12-22 18:32:00 +00:00
* autoscale and manual radiobuutton fixes * alt text attribute for images * Revert "alt text attribute for images" This reverts commit5a660551c6. * alt text for decorative images * sev2 accessibilitydefects in data explorer * Revert "sev2 accessibilitydefects in data explorer" This reverts commitb84d5b572c. * Sev2 accessibilitydefects * Revert "Sev2 accessibilitydefects" This reverts commita4e60f106c. * accessibilitydefects-data explorer * Accessibility sev-2 defects-2 * corrections for 2278347,2278096 and fix for 2264174 * color for placeholder changed to 767474, margin is set to accommodate height between treeheader elements * padding added for databaseheader, removed margin and restored padding to treenodeheader
94 lines
2.4 KiB
TypeScript
94 lines
2.4 KiB
TypeScript
import * as React from "react";
|
|
import { AccessibleElement } from "../../Controls/AccessibleElement/AccessibleElement";
|
|
import "./TabComponent.less";
|
|
|
|
export interface TabContent {
|
|
render: () => JSX.Element;
|
|
className?: string;
|
|
}
|
|
|
|
export interface Tab {
|
|
title: string;
|
|
content: TabContent;
|
|
isVisible: () => boolean;
|
|
}
|
|
|
|
interface TabComponentProps {
|
|
tabs: Tab[];
|
|
currentTabIndex: number;
|
|
onTabIndexChange: (newIndex: number) => void;
|
|
hideHeader: boolean;
|
|
}
|
|
|
|
/**
|
|
* We assume there's at least one tab
|
|
*/
|
|
export class TabComponent extends React.Component<TabComponentProps> {
|
|
public constructor(props: TabComponentProps) {
|
|
super(props);
|
|
|
|
if (this.props.tabs.length < 1) {
|
|
const msg = "TabComponent must have at least one tab";
|
|
console.error(msg);
|
|
throw new Error(msg);
|
|
}
|
|
}
|
|
|
|
private setActiveTab(index: number): void {
|
|
this.setState({ activeTabIndex: index });
|
|
this.props.onTabIndexChange(index);
|
|
}
|
|
|
|
private renderTabTitles(): JSX.Element[] {
|
|
return this.props.tabs.map((tab: Tab, index: number) => {
|
|
if (!tab.isVisible()) {
|
|
return <React.Fragment key={index} />;
|
|
}
|
|
|
|
let className = "toggleSwitch";
|
|
let ariaselected;
|
|
if (index === this.props.currentTabIndex) {
|
|
className += " selectedToggle";
|
|
ariaselected = true;
|
|
} else {
|
|
className += " unselectedToggle";
|
|
ariaselected = false;
|
|
}
|
|
|
|
return (
|
|
<div className="tab" key={index}>
|
|
<AccessibleElement
|
|
as="span"
|
|
className={className}
|
|
role="tab"
|
|
onActivated={() => this.setActiveTab(index)}
|
|
aria-label={`Select tab: ${tab.title}`}
|
|
aria-selected={ariaselected}
|
|
>
|
|
{tab.title}
|
|
</AccessibleElement>
|
|
</div>
|
|
);
|
|
});
|
|
}
|
|
|
|
public render(): JSX.Element {
|
|
const currentTabContent = this.props.tabs[this.props.currentTabIndex].content;
|
|
let className = "tabComponentContent";
|
|
if (currentTabContent.className) {
|
|
className += ` ${currentTabContent.className}`;
|
|
}
|
|
|
|
return (
|
|
<div className="tabComponentContainer">
|
|
{!this.props.hideHeader && (
|
|
<div className="tabs tabSwitch" role="tablist">
|
|
{this.renderTabTitles()}
|
|
</div>
|
|
)}
|
|
<div className={className}>{currentTabContent.render()}</div>
|
|
</div>
|
|
);
|
|
}
|
|
}
|