UNPKG

magner

Version:

Universal admin panel magnetic to any backend

115 lines (114 loc) 5.25 kB
import type { RouteLocation, RouteLocationRaw } from 'vue-router'; import type { TranslateData } from '../../utils/core/translate'; import { ActionButton, CustomAction } from '../../types/utils/actions'; import { TableActions } from '../../types/configs/pages/table'; import { RouteComponent } from 'vue-router'; import { RequestWrap } from '../../types'; interface ViewTag { text: string; backgroundColor: string; textColor: string; } interface ViewBase<ENTITY extends {}, FORMATTER_OUTPUT> { /** Using this key, the value displayed in the table will use `entity.[prop].[nestedKey]` content */ nestedKey?: keyof ENTITY; /** A function that formats the content of the column's cells */ formatter?: (cellValue: unknown, row: ENTITY, column: this, index: number) => FORMATTER_OUTPUT; } interface ViewText<ENTITY extends {}> extends ViewBase<ENTITY, string> { type: 'text'; } interface ViewTags<ENTITY extends {}> extends ViewBase<ENTITY, string | string[] | ViewTag[]> { type: 'tags'; } interface ViewImage<ENTITY extends {}> extends ViewBase<ENTITY, string | string[]> { type: 'image'; } interface ViewActions<ENTITY extends {}> extends ViewBase<ENTITY, string> { type: 'actions'; /** Action to perform when 'remove button' is done on selection */ actions?: ActionButton<TableActions, ENTITY>[]; } interface ViewCustom<ENTITY extends {}> extends ViewBase<ENTITY, unknown> { type: 'custom'; /** Custom cell component */ component: () => RouteComponent; } interface ViewHtml<ENTITY extends {}> extends ViewBase<ENTITY, string> { type: 'html'; } export type ColumnView<ENTITY extends {}> = ViewText<ENTITY> | ViewTags<ENTITY> | ViewImage<ENTITY> | ViewActions<ENTITY> | ViewCustom<ENTITY> | ViewHtml<ENTITY>; export interface TableColumn<ENTITY extends {}> { /** Property name of the field in the row data for specific column */ prop: keyof ENTITY; /** Label to display in the header cell */ label?: TranslateData; /** * How to display the contents of the prop: * * `text` – as a plain text that can be trimmed with `showOverflowTooltip` and formatted with `formatter` * * `image` – can be an image URL or an array of URLs. Displayed in lazy-loaded squares with <el-image> component * * `tags` – list of tags with <el-tag> */ view?: ColumnView<ENTITY>; /** Makes column cells links */ columnLink?: (row: ENTITY, route: RouteLocation) => RouteLocationRaw; /** Column fixed width */ width?: number | string; /** Minimal width that is distributed in proportion */ minWidth?: number | string; /** Fix the whole column in some corner of the screen */ fixed?: 'left' | 'right' | boolean; /** Whether the ASC|DESC sorting is available for this field */ sortable?: boolean; /** Whether the column can be resized */ resizable?: boolean; /** If the content's width is more than in the column, hide the rest of the width and display in the tooltip */ showOverflowTooltip?: boolean; /** Alignment of the content in the cell */ align?: 'left' | 'center' | 'right'; /** Alignment of the table header. If omitted, the value of the above 'align' attribute will be applied */ headerAlign?: 'left' | 'center' | 'right'; /** Class name of cells in the column */ className?: string; /** Class name of the label of this column */ labelClassName?: string; } export interface Table<ENTITY extends {} = {}> { columns: TableColumn<ENTITY>[]; getColumnsRequest?: RequestWrap<TableColumn<ENTITY>[], null>; /** Whether the Table is striped – each odd row is colored */ stripe?: boolean; /** Whether the Table has a vertical border */ border?: boolean; /** Whether the width of column automatically fits its container */ fit?: boolean; /** Sets the algorithm used to lay out table cells, rows, and columns */ tableLayout?: 'fixed' | 'auto'; /** Always show scrollbar. Default is `true` */ scrollbarAlwaysOn?: boolean; /** Ensure main axis minimum-size doesn't follow the content */ flexible?: boolean; /** Text to display in the table when no data is available */ emptyText?: TranslateData; /** If present, table row becomes a link (doesn't work on columns with 'columnLink' property) */ rowLink?: (row: ENTITY, route: RouteLocation) => RouteLocationRaw; /** Add the select-row checkbox into the first column of a table */ rowSelectable?: { /** The unique key in your row used to identify which row is selected */ rowIdKey: keyof ENTITY; /** Action to perform on selected rows */ actions?: ActionButton<TableActions, ENTITY>[]; /** Custom action to perform on selected rows */ customActions?: CustomAction<TableActions>[]; /** Whether to reserve selection after data refreshing, works when type is 'selection'. * Note that row-key is required for this to work */ reserveSelection?: boolean; }; /** For rendering nested data */ rowTree?: { /** https://element-plus.org/en-US/component/table.html#tree-data-and-lazy-mode */ key: string; childrenListKey: string; }; } export {};