UNPKG

@airplane/views

Version:

A React library for building Airplane views. Views components are optimized in style and functionality to produce internal apps that are easy to build and maintain.

324 lines (323 loc) 11.7 kB
/// <reference types="react" /> import { ButtonConfirmOptions, ButtonPreset, ButtonVariant } from "../../components/button/Button.types"; import { CommonLayoutProps } from "../../components/layout/layout.types"; import { CommonStylingProps } from "../../components/styling.types"; import { Color } from "../../components/theme/colors"; import { NavigateParams } from "../../routing"; import type { UseCustomCellProps } from "../../@types/react-table-config.types"; import { DefaultOutput, DefaultParams, ParamValues } from "../../client"; import { AirplaneFunc, TaskMutation, TaskQuery } from "../query"; /** * Column type for the table. * * The type makes the `value` type in `Component` and `EditComponent` in `UseCustomCellProps` dependent * on the type in TRowData indexed by the `accessor` prop. * * Example: * type User = { * name: string; * age: number; * } * * const columns: Column<User>[] = [ * { accessor: "name", Component: ({ value }) => <div>{value}</div> }, // value is string * { accessor: "age", Component: ({ value }) => <div>{value}</div> }, // value is number * ]; */ export type Column<TRowData extends object = Record<string, any>> = { [K in keyof TRowData]-?: Column_<TRowData, K>; }[keyof TRowData]; type Column_<TRowData extends object, K extends keyof TRowData> = { /** * Maps data to this column. e.g. if your accessor is "firstName", the column will display data at row["firstName"]. * * This field uniquely identifies this column and allows you to reference it in the Table `columns` prop. * * If you are using a task backed table, accessors are automatically inferred from the task output. */ accessor: K; } & UseCustomCellProps<TRowData[K], TRowData>; export type RowSelectionMode = "single" | "checkbox"; export type ComponentRowAction<TRowData extends object> = (props: { row: TRowData; }) => JSX.Element; /** * Props that are shared among all table components */ export type SharedTableProps<TRowData extends object> = { /** * "single" enables selection of single row while "checkbox" adds a checkbox one each row and enables selection * of multiple rows. */ rowSelection?: RowSelectionMode; /** * If true, a select all checkbox is shown that allows selecting all rows. * Only applicable if rowSelection="checkbox". * @default true */ selectAll?: boolean; /** * Renders a loading indicator when true. */ loading?: boolean; /** * Sets the page size on initial render. * @default 10 */ defaultPageSize?: number; /** * Renders an error message. */ error?: string; /** * The message to display when the table has no data. */ noData?: string; /** * Sets the title above the table. */ title?: string; /** * Columns to hide in the table. Reference columns using the column accessor, or the * inferred output field for task backed tables. */ hiddenColumns?: string[]; /** * Allows for global filtering when true. * @default true */ showFilter?: boolean; /** * A consistent, unique field used to identify a row. This is used to ensure that * row selection is consistent even when the data changes (e.g. when a row is added or deleted). * * If not provided, defaults to an "id" field on the row, or the index of the row if there is no id. * @default id or the index of the row */ rowID?: string; /** * Function to choose selected rows on initial render. */ isDefaultSelectedRow?: (row: TRowData, rowIndex: number) => boolean; /** * Function for controlled row selection. */ isSelectedRow?: (row: TRowData, rowIndex: number) => boolean; /** * Freezes the row actions column when true. * @default true */ freezeRowActions?: boolean; /** * If set, the row actions column will be set to this width, in pixels. */ rowActionsWidth?: number; /** * Adds a "download as CSV button" to the table footer. * If a string is provided, it will be used as the file name with a `.csv` extension appended. */ enableCSVDownload?: boolean | string; /** * This is called when the selection state of a row is toggled. Passes in the row data * as well as the index of the row in the table. */ onToggleRow?: (row: TRowData, idx: number) => void; /** * This is called when the toggle-all-selected-rows checkbox is pressed when * rowSelection is set to "checkbox", with the value of the resulting checkbox. * * If isSelectedRow is set, and this is not provided, the * toggle-all-selected-rows checkbox will not be shown. */ onToggleAllRows?: (value: boolean) => void; } & CommonLayoutProps & CommonStylingProps; /** * Props for the presentational table component */ export type TableComponentProps<TRowData extends object> = { /** * The columns to display in the table. */ columns: Column<TRowData>[]; /** * The data, or rows, to display in the table. */ data: TRowData[]; /** * Adds custom components to the end of each row. */ rowActions?: ComponentRowAction<TRowData>[]; /** * Adds custom components to an overflow menu at the end of each row. */ rowActionsMenu?: ComponentRowAction<TRowData>[]; /** * The computed width of the row actions menu dropdown. */ rowActionsMenuWidth?: number; /** * Callback on final row selection state. Note that this is an internal prop used for * updating component state. To catch changes in row selection from our public-facing * API, users should be using onToggleRow. */ onRowSelectionChanged?: (rows: TRowData[]) => void; } & SharedTableProps<TRowData>; export type RowActionButtonProps = { /** * Built in button appearances that apply a set variant and color. The variant and/or * color can be overriden by specifying a custom variant or color. * * primary: The primary page action. Usually there should only be one of these that * represents the single most important thing a user can do. * secondary: Secondary actions on a page. These are important, but not as important * as the primary. * tertiary: Supplmental actions that can be done on a page. * danger: Actions that delete or do otherwise dangerous actions. */ preset?: ButtonPreset; /** * Fine grained button appearance. Prefer using preset. * * filled: Filled with a color * outline: White button outlined with a color. * light: Filled with a light shade of a color. * subtle: Creates a text button with no fill or outline. * * @default subtle */ variant?: ButtonVariant; /** * Button disabled state. */ disabled?: boolean; /** * Button color. */ color?: Color; }; export type BasicRowAction<TRowData extends object> = ({ /** * Custom label of the row action button. */ label: string; /** * Callback to run when the button is clicked. */ onClick: (row: TRowData) => void; /** * Show a confirmation dialog before completing the button action. * * If the user confirms, the dialog will close and the action will complete. * * If the user cancels, the dialog will close and the action will not complete. * * Set to true for a default confirmation dialog or customize the dialog title, * body, and buttons. */ confirm?: ButtonConfirmOptions | ((row: TRowData) => ButtonConfirmOptions) | boolean; href?: never; } | { /** * Custom label of the row action button. */ label: string; /** * A function of the row data that returns either a string URL to navigate to * when the button is clicked, or a task or view to navigate to in the form of * { task: "task_slug", params: ... } or { view: "view_slug", params: ... }. */ href: (row: TRowData) => string | NavigateParams; /** * Whether the href URL should open in a new tab. * @default true */ newTab?: boolean; onClick?: never; }) & RowActionButtonProps; export type TaskRowAction<TRowData extends object, TParams extends ParamValues | undefined = DefaultParams> = { /** * Custom label of the row action button. * @default task slug */ label?: string; /** * Transforms the row data before it is passed into the task. * Useful when the model of the row does not equal the model of the task parameters. */ getParamsFromRow?: (row: TRowData) => TParams; rowTransform?: (row: TRowData) => TParams; /** * Show a confirmation dialog before completing the button action. * * If the user confirms, the dialog will close and the action will complete. * * If the user cancels, the dialog will close and the action will not complete. * * Set to true for a default confirmation dialog or customize the dialog title, body, * and buttons. */ confirm?: ButtonConfirmOptions | ((row: TRowData) => ButtonConfirmOptions) | boolean; onClick?: never; href?: never; } & RowActionButtonProps & Exclude<TaskMutation<TParams>, AirplaneFunc>; /** * Base props for task-aware and connected tables */ type BaseTableProps<TRowData extends object> = { /** * The ID referenced by the global component state. */ id?: string; /** * Adds custom components to the end of each row. */ rowActions?: ComponentRowAction<TRowData> | TaskRowAction<TRowData> | BasicRowAction<TRowData> | (ComponentRowAction<TRowData> | TaskRowAction<TRowData> | BasicRowAction<TRowData>)[]; /** * Adds custom components to an overflow menu at the end of each row. */ rowActionsMenu?: TaskRowAction<TRowData> | BasicRowAction<TRowData> | (TaskRowAction<TRowData> | BasicRowAction<TRowData>)[]; /** * Sets the table columns. If the table is task-backed, this field overrides the * columns inferred from the data. */ columns?: (Column<TRowData> | keyof TRowData)[]; /** * Callback used to modify the table columns. * * @example * columnsTransform={(cols) => * // Capitalize all the column labels * cols.map((c) => ({ ...c, label: c.label?.toUpperCase() })) * } */ columnsTransform?: (columns: TableComponentProps<TRowData>["columns"]) => TableComponentProps<TRowData>["columns"]; } & SharedTableProps<TRowData>; /** * Props for the task-aware table component */ export type TableWithTaskProps<TRowData extends object, TParams extends ParamValues | undefined = DefaultParams, TOutput = DefaultOutput> = { /** * The task query to execute. The table data will be populated by the task's output. */ task: TaskQuery<TParams, TOutput>; /** * Callback to transform the task output. */ outputTransform?: (output: TOutput) => TableComponentProps<TRowData>["data"]; data?: never; } & BaseTableProps<TRowData>; /** * Props for the table connected to the global component state */ export type ConnectedTableProps<TRowData extends object> = { /** * The data, or rows, to display in the table. */ data: TRowData[]; task?: never; } & BaseTableProps<TRowData>; /** * Props for the public magic table component */ export type TableProps<TRowData extends object = Record<string, any>, TParams extends ParamValues | undefined = DefaultParams, TOutput = DefaultOutput> = TableWithTaskProps<TRowData, TParams, TOutput> | ConnectedTableProps<TRowData>; export {};