UNPKG

@opendatasoft/visualizations

Version:

Opendatasoft's components to easily build dashboards and visualizations.

95 lines (94 loc) 3.81 kB
import type { Async, DataFrame, Source } from 'types'; import type { Readable, Writable } from 'svelte/store'; import type { BooleanFormatProps, DateFormatProps, GeoFormatProps, TextFormatProps, NumberFormatProps, URLFormatProps } from '../Format/types'; import type { Pagination } from '../Pagination/types'; import type { DATA_FORMAT, HOVER_COLUMN_KEY } from './constants'; export type GenericRecord = Record<string, unknown>; type DataFormatKey = keyof typeof DATA_FORMAT; export type DataFormat = typeof DATA_FORMAT[DataFormatKey]; export type TableData = DataFrame; export declare const ColumnSort: { readonly asc: "ASC"; readonly desc: "DESC"; }; export type ColumnSortValues = typeof ColumnSort[keyof typeof ColumnSort]; export type BaseColumn = { key: string; title: string; /** Wtether the column is sorted ascendimg, descending or not */ sorted?: ColumnSortValues; sticky?: boolean; sortLabels?: { asc: string; desc: string; }; onClick?: () => void; }; export type ValueOrAccessor<T, R = GenericRecord> = T | ((r: R) => T); export type FormatPropsTypeMap = { [DATA_FORMAT.boolean]: BooleanFormatProps; [DATA_FORMAT.date]: DateFormatProps; [DATA_FORMAT.geo]: GeoFormatProps; [DATA_FORMAT.shortText]: TextFormatProps; [DATA_FORMAT.longText]: TextFormatProps; [DATA_FORMAT.number]: NumberFormatProps; [DATA_FORMAT.url]: URLFormatProps; }; /** Columns have to be typed with the record type if using an accessor. * They can also be used without a record, nor accessor */ export type ColumnOfType<F extends DataFormat> = BaseColumn & { dataFormat: F; accessor?: (r: GenericRecord) => FormatPropsTypeMap[F]['value']; options?: ValueOrAccessor<Omit<FormatPropsTypeMap[F], 'value'>>; }; export type BooleanColumn = ColumnOfType<typeof DATA_FORMAT.boolean>; export type DateColumn = ColumnOfType<typeof DATA_FORMAT.date>; export type GeoColumn = ColumnOfType<typeof DATA_FORMAT.geo>; export type ShortTextColumn = ColumnOfType<typeof DATA_FORMAT.shortText>; export type LongTextColumn = ColumnOfType<typeof DATA_FORMAT.longText>; export type NumberColumn = ColumnOfType<typeof DATA_FORMAT.number>; export type URLColumn = ColumnOfType<typeof DATA_FORMAT.url>; export type Column = BooleanColumn | DateColumn | GeoColumn | ShortTextColumn | LongTextColumn | NumberColumn | URLColumn; export type HoverEvent<T extends HTMLElement> = (MouseEvent | FocusEvent) & { currentTarget: EventTarget & T; }; export type RowProps = { onClick?: (record?: GenericRecord, e?: HoverEvent<HTMLButtonElement>) => void; onMouseEnter?: (record?: GenericRecord, e?: HoverEvent<HTMLTableRowElement>) => void; onMouseLeave?: (record?: GenericRecord, e?: HoverEvent<HTMLTableRowElement>) => void; actionAriaLabel?: string; }; export type TableOptions = { columns: Column[]; rowProps?: RowProps; title?: string; subtitle?: string; description?: string; emptyStateLabel?: string; source?: Source; /** To format date and number with the right locale. Default is from browser language */ locale?: string; /** * Removes all the presentational styles. * Default is `false`. */ unstyled?: boolean; pagination?: Pagination; debugWarnings?: boolean; }; export type TableProps = { data: Async<TableData>; options: TableOptions; }; export type ColumnKey = string | typeof HOVER_COLUMN_KEY; export type StickyStores = { stickyColumnsWidth: Writable<Map<ColumnKey, number>> & { updateColumn: (key: ColumnKey, width: number) => void; reset: () => void; }; stickyColumnsOffset: Readable<Map<ColumnKey, number>>; lastStickyColumn: Readable<ColumnKey | undefined>; isHorizontallyScrolled: Writable<boolean>; }; export {};