/* Copyright 2026 Marimo. All rights reserved. */ import type { Schema } from "compassql/build/src/schema"; import { BarChartBigIcon } from "lucide-react"; import React, { useState } from "react"; import { useDateFormatter, useNumberFormatter } from "react-aria"; import { Button } from "@/components/ui/button"; import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { cn } from "@/utils/cn"; import { PRIMITIVE_TYPE_ICON } from "./icons"; interface Props { schema: Schema; } const COLUMN_LIMIT = 12; /** * Display component that show the columns in a Compass schema * and related stats */ export const ColumnSummary: React.FC = ({ schema }) => { const [selectedField, setSelectedField] = useState(); const [showMore, setShowMore] = useState(); const fields = schema.fieldNames(); const stats = selectedField ? schema.stats({ field: selectedField, channel: "x" }) : undefined; const icon = ( ); const fieldsToShow = showMore ? fields : fields.slice(0, COLUMN_LIMIT); const hasMore = fields.length > COLUMN_LIMIT; return (
{icon} {fields.length > 0 ? fields.length : "No"} fields
{fieldsToShow.map((field) => { const cardinality = schema.cardinality({ channel: "x", field: field, }); return ( { if (selectedField === field) { setSelectedField(undefined); return; } setSelectedField(field); }} > {PRIMITIVE_TYPE_ICON[schema.primitiveType(field)]} {field} {cardinality > 1 && ( ({cardinality}) )} ); })} {hasMore && ( )}
{selectedField && (
{STAT_KEYS.map((key) => (
{key}
))}
)}
); }; const STAT_KEYS = [ "distinct", "min", "max", "mean", "median", "q1", "q3", "stdev", ]; const FormatStat = ({ value }: { value: unknown }) => { // Decimal .2 const numberFormatter = useNumberFormatter({ maximumFractionDigits: 2, }); // Just day, month, year const dateFormatter = useDateFormatter({ year: "numeric", month: "short", day: "numeric", }); if (typeof value === "number") { return numberFormatter.format(value); } if (typeof value === "string") { return value; } if (typeof value === "object" && value instanceof Date) { return dateFormatter.format(value); } return String(value); };