lorehub
Version:
Capture and surface the collective wisdom of your codebase
49 lines • 2.09 kB
JavaScript
import React from 'react';
import { Box, Text } from 'ink';
export function Table({ data, columns, padding = 1 }) {
if (data.length === 0) {
return React.createElement(Text, { dimColor: true }, "No data");
}
// Get columns from first data item if not provided
const keys = columns || Object.keys(data[0] || {});
// Calculate column widths
const widths = {};
// Initialize with header widths
keys.forEach(key => {
widths[key] = String(key).length;
});
// Update with data widths
data.forEach(row => {
keys.forEach(key => {
const value = String(row[key] ?? '');
widths[key] = Math.max(widths[key], value.length);
});
});
// Add padding
const paddingStr = ' '.repeat(padding);
// Render header
const header = (React.createElement(Box, null, keys.map((key, index) => (React.createElement(Box, { key: String(key), width: widths[key] + padding * 2 },
React.createElement(Text, { bold: true },
index > 0 && paddingStr,
String(key).padEnd(widths[key]),
paddingStr))))));
// Render separator
const separator = (React.createElement(Box, null,
React.createElement(Text, { dimColor: true }, keys.map((key, index) => (index > 0 ? paddingStr : '') +
'─'.repeat(widths[key]) +
paddingStr).join(''))));
// Render rows
const rows = data.map((row, rowIndex) => {
const isSelected = row[''] === '→'; // Check if this row is selected
return (React.createElement(Box, { key: rowIndex }, keys.map((key, colIndex) => (React.createElement(Box, { key: String(key), width: widths[key] + padding * 2 },
React.createElement(Text, { color: isSelected ? 'cyan' : undefined },
colIndex > 0 && paddingStr,
String(row[key] ?? '').padEnd(widths[key]),
paddingStr))))));
});
return (React.createElement(Box, { flexDirection: "column" },
header,
separator,
rows));
}
//# sourceMappingURL=Table.js.map