UNPKG

dpkit

Version:

Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames

44 lines 12.1 kB
import { inferSchemaFromSample } from "@dpkit/all"; import { Box, Text } from "ink"; import { DataFrame } from "nodejs-polars"; import React from "react"; // TODO: Autocalculate geometry (e.g. row height etc) const MAX_COLUMNS = 10; const MIN_COLUMN_WIDTH = 15; export function DataGrid(props) { const { records, col, row, order, rowHeight, borderColor = "green" } = props; const schema = props.schema ?? inferSchemaFromSample(DataFrame(records)); const startCol = col ? Math.floor((col - 1) / MAX_COLUMNS) * MAX_COLUMNS : 0; const fields = schema.fields.slice(startCol, startCol + MAX_COLUMNS); const colWidth = Math.min(process.stdout.columns / fields.length, MIN_COLUMN_WIDTH); const tableWidth = fields.length * colWidth; const selectColIndex = col ? col - 1 - startCol : -1; const selectRowIndex = row ? row - 1 : -1; const orderIndex = order?.col ? order.col - 1 - startCol : -1; const orderSign = order?.dir === "desc" ? " ▼" : " ▲"; return (React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: borderColor, borderLeftColor: startCol < 1 ? borderColor : "gray", borderRightColor: startCol + MAX_COLUMNS >= schema.fields.length ? borderColor : "gray", width: tableWidth }, React.createElement(Box, null, fields.map((field, index) => (React.createElement(Box, { key: field.name, width: colWidth, paddingLeft: 1, justifyContent: "center", backgroundColor: index === selectColIndex ? "#777" : "#555" }, React.createElement(Text, { bold: true }, field.name, index === orderIndex ? orderSign : " "))))), props.withTypes && (React.createElement(Box, null, fields.map((field, index) => (React.createElement(Box, { key: field.name, width: colWidth, paddingLeft: 1, justifyContent: "center", backgroundColor: index === selectColIndex ? "#777" : "#555" }, React.createElement(Text, null, "(", field.type, ")")))))), records.map((record, rowIndex) => (React.createElement(Box, { key: rowIndex }, fields.map((field, colIndex) => (React.createElement(Box, { key: field.name, width: colWidth, paddingLeft: 1, justifyContent: "center", backgroundColor: rowIndex === selectRowIndex && colIndex === selectColIndex ? "#888" : rowIndex === selectRowIndex ? rowIndex % 2 === 0 ? "#666" : "#555" : colIndex === selectColIndex ? rowIndex % 2 === 0 ? "#555" : "#444" : rowIndex % 2 === 0 ? "#333" : undefined, height: rowHeight, overflow: "hidden" }, React.createElement(Text, null, String(record[field.name])))))))))); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YUdyaWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9jb21wb25lbnRzL0RhdGFHcmlkLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDbEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxLQUFLLENBQUE7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUN6QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7QUFFekIscURBQXFEO0FBRXJELE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQTtBQUN0QixNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQTtBQUczQixNQUFNLFVBQVUsUUFBUSxDQUFDLEtBU3hCO0lBQ0MsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsV0FBVyxHQUFHLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUU1RSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBQ3hFLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM1RSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsUUFBUSxHQUFHLFdBQVcsQ0FBQyxDQUFBO0lBRXBFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ3ZCLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQ3RDLGdCQUFnQixDQUNq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QUMsTUFBTTtnQkFDUixDQUFDLENBQUMsUUFBUSxLQUFLLGNBQWM7b0JBQzNCLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxLQUFLLENBQUM7d0JBQ2xCLENBQUMsQ0FBQyxNQUFNO3dCQUNSLENBQUMsQ0FBQyxNQUFNO29CQUNWLENBQUMsQ0FBQyxRQUFRLEtBQUssY0FBYzt3QkFDM0IsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQzs0QkFDbEIsQ0FBQyxDQUFDLE1BQU07NEJBQ1IsQ0FBQyxDQUFDLE1BQU07d0JBQ1YsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQzs0QkFDbEIsQ0FBQyxDQUFDLE1BQU07NEJBQ1IsQ0FBQyxDQUFDLFNBQVMsRUFFckIsTUFBTSxFQUFFLFNBQVMsRUFDakIsUUFBUSxFQUFDLFFBQVE7WUFFakIsb0JBQUMsSUFBSSxRQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQVEsQ0FDckMsQ0FDUCxDQUFDLENBQ0UsQ0FDUCxDQUFDLENBQ0UsQ0FDUCxDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRGF0YVJlY29yZCwgU2NoZW1hIH0gZnJvbSBcIkBkcGtpdC9hbGxcIlxuaW1wb3J0IHsgaW5mZXJTY2hlbWFGcm9tU2FtcGxlIH0gZnJvbSBcIkBkcGtpdC9hbGxcIlxuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSBcImlua1wiXG5pbXBvcnQgeyBEYXRhRnJhbWUgfSBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCJcblxuLy8gVE9ETzogQXV0b2NhbGN1bGF0ZSBnZW9tZXRyeSAoZS5nLiByb3cgaGVpZ2h0IGV0YylcblxuY29uc3QgTUFYX0NPTFVNTlMgPSAxMFxuY29uc3QgTUlOX0NPTFVNTl9XSURUSCA9IDE1XG5leHBvcnQgdHlwZSBPcmRlciA9IHsgY29sOiBudW1iZXI7IGRpcjogXCJhc2NcIiB8IFwiZGVzY1wiIH1cblxuZXhwb3J0IGZ1bmN0aW9uIERhdGFHcmlkKHByb3BzOiB7XG4gIHJlY29yZHM6IERhdGFSZWNvcmRbXVxuICBzY2hlbWE/OiBTY2hlbWFcbiAgY29sPzogbnVtYmVyXG4gIHJvdz86IG51bWJlclxuICBvcmRlcj86IE9yZGVyXG4gIHJvd0hlaWdodD86IG51bWJlclxuICBib3JkZXJDb2xvcj86IFwiZ3JlZW5cIiB8IFwicmVkXCJcbiAgd2l0aFR5cGVzPzogYm9vbGVhblxufSkge1xuICBjb25zdCB7IHJlY29yZHMsIGNvbCwgcm93LCBvcmRlciwgcm93SGVpZ2h0LCBib3JkZXJDb2xvciA9IFwiZ3JlZW5cIiB9ID0gcHJvcHNcblxuICBjb25zdCBzY2hlbWEgPSBwcm9wcy5zY2hlbWEgPz8gaW5mZXJTY2hlbWFGcm9tU2FtcGxlKERhdGFGcmFtZShyZWNvcmRzKSlcbiAgY29uc3Qgc3RhcnRDb2wgPSBjb2wgPyBNYXRoLmZsb29yKChjb2wgLSAxKSAvIE1BWF9DT0xVTU5TKSAqIE1BWF9DT0xVTU5TIDogMFxuICBjb25zdCBmaWVsZHMgPSBzY2hlbWEuZmllbGRzLnNsaWNlKHN0YXJ0Q29sLCBzdGFydENvbCArIE1BWF9DT0xVTU5TKVxuXG4gIGNvbnN0IGNvbFdpZHRoID0gTWF0aC5taW4oXG4gICAgcHJvY2Vzcy5zdGRvdXQuY29sdW1ucyAvIGZpZWxkcy5sZW5ndGgsXG4gICAgTUlOX0NPTFVNTl9XSURUSCxcbiAgKVxuXG4gIGNvbnN0IHRhYmxlV2lkdGggPSBmaWVsZHMubGVuZ3RoICogY29sV2lkdGhcbiAgY29uc3Qgc2VsZWN0Q29sSW5kZXggPSBjb2wgPyBjb2wgLSAxIC0gc3RhcnRDb2wgOiAtMVxuICBjb25zdCBzZWxlY3RSb3dJbmRleCA9IHJvdyA/IHJvdyAtIDEgOiAtMVxuICBjb25zdCBvcmRlckluZGV4ID0gb3JkZXI/LmNvbCA/IG9yZGVyLmNvbCAtIDEgLSBzdGFydENvbCA6IC0xXG4gIGNvbnN0IG9yZGVyU2lnbiA9IG9yZGVyPy5kaXIgPT09IFwiZGVzY1wiID8gXCIg4pa8XCIgOiBcIiDilrJcIlxuXG4gIHJldHVybiAoXG4gICAgPEJveFxuICAgICAgZmxleERpcmVjdGlvbj1cImNvbHVtblwiXG4gICAgICBib3JkZXJTdHlsZT1cInJvdW5kXCJcbiAgICAgIGJvcmRlckNvbG9yPXtib3JkZXJDb2xvcn1cbiAgICAgIGJvcmRlckxlZnRDb2xvcj17c3RhcnRDb2wgPCAxID8gYm9yZGVyQ29sb3IgOiBcImdyYXlcIn1cbiAgICAgIGJvcmRlclJpZ2h0Q29sb3I9e1xuICAgICAgICBzdGFydENvbCArIE1BWF9DT0xVTU5TID49IHNjaGVtYS5maWVsZHMubGVuZ3RoID8gYm9yZGVyQ29sb3IgOiBcImdyYXlcIlxuICAgICAgfVxuICAgICAgd2lkdGg9e3RhYmxlV2lkdGh9XG4gICAgPlxuICAgICAgPEJveD5cbiAgICAgICAge2ZpZWxkcy5tYXAoKGZpZWxkLCBpbmRleCkgPT4gKFxuICAgICAgICAgIDxCb3hcbiAgICAgICAgICAgIGtleT17ZmllbGQubmFtZX1cbiAgICAgICAgICAgIHdpZHRoPXtjb2xXaWR0aH1cbiAgICAgICAgICAgIHBhZGRpbmdMZWZ0PXsxfVxuICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ9XCJjZW50ZXJcIlxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yPXtpbmRleCA9PT0gc2VsZWN0Q29sSW5kZXggPyBcIiM3NzdcIiA6IFwiIzU1NVwifVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxUZXh0IGJvbGQ+XG4gICAgICAgICAgICAgIHtmaWVsZC5uYW1lfVxuICAgICAgICAgICAgICB7aW5kZXggPT09IG9yZGVySW5kZXggPyBvcmRlclNpZ24gOiBcIiAgXCJ9XG4gICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgICkpfVxuICAgICAgPC9Cb3g+XG5cbiAgICAgIHtwcm9wcy53aXRoVHlwZXMgJiYgKFxuICAgICAgICA8Qm94PlxuICAgICAgICAgIHtmaWVsZHMubWFwKChmaWVsZCwgaW5kZXgpID0+IChcbiAgICAgICAgICAgIDxCb3hcbiAgICAgICAgICAgICAga2V5PXtmaWVsZC5uYW1lfVxuICAgICAgICAgICAgICB3aWR0aD17Y29sV2lkdGh9XG4gICAgICAgICAgICAgIHBhZGRpbmdMZWZ0PXsxfVxuICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudD1cImNlbnRlclwiXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcj17aW5kZXggPT09IHNlbGVjdENvbEluZGV4ID8gXCIjNzc3XCIgOiBcIiM1NTVcIn1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPFRleHQ+KHtmaWVsZC50eXBlfSk8L1RleHQ+XG4gICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9Cb3g+XG4gICAgICApfVxuXG4gICAgICB7cmVjb3Jkcy5tYXAoKHJlY29yZCwgcm93SW5kZXgpID0+IChcbiAgICAgICAgPEJveCBrZXk9e3Jvd0luZGV4fT5cbiAgICAgICAgICB7ZmllbGRzLm1hcCgoZmllbGQsIGNvbEluZGV4KSA9PiAoXG4gICAgICAgICAgICA8Qm94XG4gICAgICAgICAgICAgIGtleT17ZmllbGQubmFtZX1cbiAgICAgICAgICAgICAgd2lkdGg9e2NvbFdpZHRofVxuICAgICAgICAgICAgICBwYWRkaW5nTGVmdD17MX1cbiAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ9XCJjZW50ZXJcIlxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I9e1xuICAgICAgICAgICAgICAgIHJvd0luZGV4ID09PSBzZWxlY3RSb3dJbmRleCAmJiBjb2xJbmRleCA9PT0gc2VsZWN0Q29sSW5kZXhcbiAgICAgICAgICAgICAgICAgID8gXCIjODg4XCJcbiAgICAgICAgICAgICAgICAgIDogcm93SW5kZXggPT09IHNlbGVjdFJvd0luZGV4XG4gICAgICAgICAgICAgICAgICAgID8gcm93SW5kZXggJSAyID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgPyBcIiM2NjZcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCIjNTU1XCJcbiAgICAgICAgICAgICAgICAgICAgOiBjb2xJbmRleCA9PT0gc2VsZWN0Q29sSW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICA/IHJvd0luZGV4ICUgMiA9PT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcIiM1NTVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcIiM0NDRcIlxuICAgICAgICAgICAgICAgICAgICAgIDogcm93SW5kZXggJSAyID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiIzMzM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGhlaWdodD17cm93SGVpZ2h0fVxuICAgICAgICAgICAgICBvdmVyZmxvdz1cImhpZGRlblwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxUZXh0PntTdHJpbmcocmVjb3JkW2ZpZWxkLm5hbWVdKX08L1RleHQ+XG4gICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9Cb3g+XG4gICAgICApKX1cbiAgICA8L0JveD5cbiAgKVxufVxuIl19