@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
74 lines (73 loc) • 3.1 kB
JavaScript
"use client";
import { useCallback, useContext, useEffect, useState } from 'react';
import clsx from 'clsx';
import IconPrimary from "../icon/IconPrimary.js";
import { TableAccordionContentSingle } from "./table-accordion/TableAccordionContent.js";
import { TableTrContext } from "./TableTrContext.js";
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
export default function Td(componentProps) {
const {
className,
children,
noSpacing,
spacing,
verticalAlign,
highlight: highlightProp,
selected: selectedProp,
onClick,
icon = true,
...props
} = componentProps;
const trContext = useContext(TableTrContext);
const highlight = highlightProp || (trContext === null || trContext === void 0 ? void 0 : trContext.highlight);
const hasOnClick = typeof onClick === 'function';
const isSelectable = selectedProp !== undefined;
const [selectedState, setSelectedState] = useState(selectedProp !== null && selectedProp !== void 0 ? selectedProp : false);
const isSelected = isSelectable ? selectedState : false;
useEffect(() => {
if (selectedProp !== undefined) {
setSelectedState(selectedProp);
}
}, [selectedProp]);
const setSelected = useCallback(value => {
if (isSelectable) {
setSelectedState(value);
}
return value;
}, [isSelectable]);
const resolvedIcon = icon === true ? 'chevron_right' : icon;
return _jsx("td", {
role: "cell",
className: clsx('dnb-table__td', className, noSpacing && 'dnb-table__td--no-spacing', spacing && `dnb-table__td--spacing-${spacing}`, verticalAlign && `dnb-table__td--vertical-align-${verticalAlign}`, hasOnClick && 'dnb-table__td--clickable', isSelected && 'dnb-table__td--selected', highlight && 'dnb-table__td--highlight'),
...props,
children: hasOnClick ? _jsxs("button", {
type: "button",
className: "dnb-table__td__button",
"aria-pressed": isSelectable ? isSelected : undefined,
onClick: event => {
const tdElement = event.currentTarget.parentElement;
const trElement = (tdElement === null || tdElement === void 0 ? void 0 : tdElement.parentElement) || null;
const columnIndex = tdElement ? Array.from((trElement === null || trElement === void 0 ? void 0 : trElement.children) || []).indexOf(tdElement) : -1;
const table = trElement === null || trElement === void 0 ? void 0 : trElement.closest('table');
const thElement = table === null || table === void 0 ? void 0 : table.querySelector(`thead tr th:nth-child(${columnIndex + 1})`);
onClick(event, {
trElement,
tdElement,
thElement,
isSelected,
setSelected
});
},
children: [_jsx("span", {
className: "dnb-table__td__button__content",
children: children
}), resolvedIcon && _jsx(IconPrimary, {
className: "dnb-table__td__button__icon",
icon: resolvedIcon,
size: "basis"
})]
}) : children
});
}
Td.AccordionContent = TableAccordionContentSingle;
//# sourceMappingURL=TableTd.js.map