@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
TypeScript
/// <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 {};