phx-react
Version:
PHX REACT
163 lines • 9.62 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const react_1 = tslib_1.__importDefault(require("react"));
const types_1 = require("../../types");
const TruncatedTooltip_1 = tslib_1.__importDefault(require("./TruncatedTooltip"));
const animatedContentClassName = 'block min-w-0 overflow-hidden text-ellipsis motion-safe:animate-phx-table-report-expanded-cell';
/**
* Builds class names for an expanded child table cell.
*
* @param config - Visual table options shared by expanded cells.
* @param absoluteIdx - Cell index in the full parent table grid.
* @param isHeader - Whether the cell belongs to the expanded header row.
* @returns Tailwind class names for the expanded cell.
*/
function getExpandedCellClassName(config, absoluteIdx, isHeader = false) {
return (0, types_1.classNames)('max-w-0 min-w-0 overflow-hidden text-ellipsis text-xs whitespace-nowrap text-gray-900', isHeader ? 'bg-gray-100 font-medium text-gray-800' : 'bg-gray-50', config.textCenter ? 'text-center' : 'pl-8 text-left', config.spacing ? (isHeader ? 'px-3 py-2.5' : 'px-2 py-2.5') : '', absoluteIdx !== 0 && config.border && 'border-l');
}
/**
* Builds class names for the expanded placeholder cell under the select column.
*
* @param config - Visual table options shared by expanded cells.
* @param isHeader - Whether the placeholder belongs to the expanded header row.
* @returns Tailwind class names for the selection placeholder cell.
*/
function getSelectionCellClassName(config, isHeader = false) {
return (0, types_1.classNames)('border-t p-0', isHeader ? 'bg-gray-100' : 'bg-gray-50', config.border && 'border-r');
}
/**
* Renders empty expanded cells before or after the child columns.
*
* @param props - Empty-cell count, position, and visual configuration.
* @returns Placeholder cells that preserve alignment with the parent table.
*/
function EmptyCells({ config, count, isHeader = false, keyPrefix, selectedColumnAtStart = false, startIndex = 0, }) {
return (react_1.default.createElement(react_1.default.Fragment, null, Array.from({ length: count }).map((_, emptyIdx) => (react_1.default.createElement("td", { key: `expanded-${keyPrefix}-${config.dataIdx}-${emptyIdx}`, className: selectedColumnAtStart && emptyIdx === 0
? getSelectionCellClassName(config, isHeader)
: (0, types_1.classNames)(getExpandedCellClassName(config, startIndex + emptyIdx, isHeader), 'border-t') })))));
}
/**
* Builds props for placeholder cells that appear before child columns.
*
* @param sharedProps - Shared expanded row layout and visual configuration.
* @param keyPrefix - Key prefix for the generated placeholder cells.
* @param isHeader - Whether the placeholders belong to the expanded header row.
* @returns Props for the EmptyCells component.
*/
function getBeforeEmptyCellsProps(sharedProps, keyPrefix, isHeader = false) {
const { layoutConfig, visualConfig } = sharedProps;
return {
config: visualConfig,
count: layoutConfig.emptyCellsBefore,
isHeader,
keyPrefix,
selectedColumnAtStart: layoutConfig.hasSelectionColumn,
};
}
/**
* Builds props for placeholder cells that appear after child columns.
*
* @param sharedProps - Shared expanded row layout and visual configuration.
* @param keyPrefix - Key prefix for the generated placeholder cells.
* @param isHeader - Whether the placeholders belong to the expanded header row.
* @returns Props for the EmptyCells component.
*/
function getAfterEmptyCellsProps(sharedProps, keyPrefix, isHeader = false) {
const { layoutConfig, visualConfig } = sharedProps;
return {
startIndex: layoutConfig.childStartIndex + layoutConfig.childCellLength,
keyPrefix,
config: visualConfig,
isHeader,
count: layoutConfig.emptyCellsAfter,
};
}
/**
* Renders the child header cells for the expanded row.
*
* @param childHeaders - Header labels for the child data columns.
* @param layoutConfig - Column alignment information for the parent table grid.
* @param visualConfig - Visual table options shared by expanded cells.
* @returns Expanded child header cells.
*/
function ChildHeaderCells({ childHeaders, layoutConfig, visualConfig }) {
return (react_1.default.createElement(react_1.default.Fragment, null, childHeaders.map((header, headerIdx) => (react_1.default.createElement("th", { key: `expanded-header-${visualConfig.dataIdx}-${headerIdx}`, className: (0, types_1.classNames)(getExpandedCellClassName(visualConfig, layoutConfig.childStartIndex + headerIdx, true), 'border-t') },
react_1.default.createElement("span", { className: animatedContentClassName }, header))))));
}
/**
* Renders the expanded header row aligned with the parent table columns.
*
* @param childHeaders - Header labels for the child data columns.
* @param layoutConfig - Column alignment information for the parent table grid.
* @param visualConfig - Visual table options shared by expanded cells.
* @returns Header row for the expanded child data.
*/
function ExpandedHeaderRow({ childHeaders, layoutConfig, visualConfig }) {
const sharedProps = { layoutConfig, visualConfig };
return (react_1.default.createElement("tr", null,
react_1.default.createElement(EmptyCells, { ...getBeforeEmptyCellsProps(sharedProps, 'empty-header-before', true) }),
react_1.default.createElement(ChildHeaderCells, { childHeaders: childHeaders, layoutConfig: layoutConfig, visualConfig: visualConfig }),
react_1.default.createElement(EmptyCells, { ...getAfterEmptyCellsProps(sharedProps, 'empty-header-after', true) })));
}
/**
* Renders the child data cells for one expanded data row.
*
* @param childBody - Data keys for child cells.
* @param childData - Child row source data.
* @param childDataIdx - Child row index.
* @param layoutConfig - Column alignment information for the parent table grid.
* @param visualConfig - Visual table options shared by expanded cells.
* @returns Expanded child data cells.
*/
function ChildDataCells({ childBody, childData, childDataIdx, layoutConfig, visualConfig }) {
return (react_1.default.createElement(react_1.default.Fragment, null, childBody.map((bodyKey, bodyIdx) => {
var _a;
return (react_1.default.createElement("td", { key: `expanded-cell-${visualConfig.dataIdx}-${childDataIdx}-${bodyIdx}`, className: (0, types_1.classNames)(getExpandedCellClassName(visualConfig, layoutConfig.childStartIndex + bodyIdx), 'border-t') },
react_1.default.createElement(TruncatedTooltip_1.default, { className: animatedContentClassName }, (_a = childData[bodyKey]) !== null && _a !== void 0 ? _a : '')));
})));
}
/**
* Renders one expanded child data row aligned with the parent table columns.
*
* @param childBody - Data keys for child cells.
* @param childData - Child row source data.
* @param childDataIdx - Child row index.
* @param layoutConfig - Column alignment information for the parent table grid.
* @param visualConfig - Visual table options shared by expanded cells.
* @returns One expanded child data row.
*/
function ExpandedDataRow({ childBody, childData, childDataIdx, layoutConfig, visualConfig }) {
const sharedProps = { layoutConfig, visualConfig };
return (react_1.default.createElement("tr", { key: `expanded-row-${visualConfig.dataIdx}-${childDataIdx}` },
react_1.default.createElement(EmptyCells, { ...getBeforeEmptyCellsProps(sharedProps, `empty-before-${childDataIdx}`) }),
react_1.default.createElement(ChildDataCells, { childData: childData, layoutConfig: layoutConfig, childDataIdx: childDataIdx, visualConfig: visualConfig, childBody: childBody }),
react_1.default.createElement(EmptyCells, { ...getAfterEmptyCellsProps(sharedProps, `empty-after-${childDataIdx}`) })));
}
/**
* Renders expanded child rows below a parent table row.
*
* @param props - Child row data and parent table alignment options.
* @returns Expanded header and data rows.
*/
function ExpandedRows({ rowChildren, dataIdx, thBody, selectedAllPeople, border, spacing, textCenter, }) {
const { children, columnIndex } = rowChildren;
const childCellLength = Math.min(children.body.length, thBody.length - columnIndex);
const hasSelectionColumn = !!(selectedAllPeople === null || selectedAllPeople === void 0 ? void 0 : selectedAllPeople.enable);
const layoutConfig = {
childCellLength,
childStartIndex: columnIndex + (hasSelectionColumn ? 1 : 0),
emptyCellsAfter: Math.max(thBody.length - columnIndex - childCellLength, 0),
emptyCellsBefore: columnIndex + (hasSelectionColumn ? 1 : 0),
hasSelectionColumn,
};
const visualConfig = { border, dataIdx, spacing, textCenter };
const childHeaders = Array.from({ length: childCellLength }, (_, headerIdx) => { var _a; return (_a = children.headers[headerIdx]) !== null && _a !== void 0 ? _a : ''; });
const childBody = children.body.slice(0, childCellLength);
const sharedProps = { layoutConfig, visualConfig };
return (react_1.default.createElement(react_1.default.Fragment, null,
react_1.default.createElement(ExpandedHeaderRow, { childHeaders: childHeaders, ...sharedProps }),
children.data.map((childData, childDataIdx) => (react_1.default.createElement(ExpandedDataRow, { key: `expanded-row-${dataIdx}-${childDataIdx}`, childBody: childBody, childData: childData, childDataIdx: childDataIdx, ...sharedProps })))));
}
exports.default = ExpandedRows;
//# sourceMappingURL=ExpandedRows.js.map