import type { Component, VNode } from 'vue'; import { h } from 'vue'; import type { ButtonProps, DataTableColumn, DataTableColumns } from 'naive-ui'; import { NButton, NSpace } from 'naive-ui'; import type { InternalRowData } from 'naive-ui/es/data-table/src/interface'; import type { safeClient } from '@/service/api'; import type TableBase from './table-base.vue'; export type TableBaseExpandColumn = { operations?: (row: T) => Array & { contentText: string }>; key: string; title: string; }; type TableBaseColumn = DataTableColumn & TableBaseExpandColumn; export type TableBaseColumns = Array>; export type TableInst = InstanceType; export interface Pagination { pageIndex: number; pageSize: number; total?: number; [key: string]: any; } export type TableFetchData = (query: { pagination: Pagination; filter?: Record; }) => ReturnType; export type TableFilterColumn = { key: string; title: string; component?: Component | VNode; componentProps?: Record; }; export type TableFilterColumns = Array; export function transformColumns(columns: TableBaseColumns): DataTableColumns { return columns.map(col => { return { ...col, ellipsis: { tooltip: true }, render: col.operations ? (row: T) => h(NSpace, null, { default: () => col.operations!(row).map(item => h(NButton, item, { default: () => item.contentText })) }) : (col as any).render } as TableBaseColumn; }); } export function transformHeaderColumns(columns: TableBaseColumns): NaiveUI.TableColumnCheck[] { return columns .filter(col => { return !col.fixed; }) .map(col => ({ key: col.key, title: col.title, checked: true, visible: true })); }