declare global {
interface HTMLElement {
mozRequestFullScreen?(): void;
webkitRequestFullscreen?(): void;
msRequestFullscreen?(): void;
}
interface Document {
mozFullScreenElement?: HTMLElement;
webkitFullscreenElement?: HTMLElement;
mozCancelFullScreen?(): void;
webkitExitFullscreen?(): void;
msExitFullscreen?(): void;
}
}
import { RenderFunction, SetupContext, Ref, ComputedRef, ComponentPublicInstance, ComponentInternalInstance, VNode } from 'vue'
import { XComponent, XComponentBase, XEvent, SizeType, ValueOf } from './component'
/**
* 组件 - 表格
*/
export const XTable: XComponent, XTableEventProps, XTableSlots>
export type XTableDataRow = Record
export interface XTableConstructor extends XComponentBase, XHeaderMethods {
props: Readonly>
context: SetupContext
reactData: TableReactData
internalData: TableInternalData
getRefMaps(): TablePrivateRef
renderVN: RenderFunction
}
export interface TablePrivateRef {
refElem: Ref
refTableHeader: Ref
refTableFooter: Ref
refCellResizeBar: Ref
refTableRenderMain: Ref
refLeftFixedTable?: Ref
refRightFixedTable?: Ref
}
export interface XTablePrivateRef extends TablePrivateRef { }
export interface TableMethods extends TablePublicMethods {
dispatchEvent(type: ValueOf, params: any, evnt: Event | null | string): void
autoCellWidth(): any
loadData(): Promise
loadFields(): Promise
queryAction(params: any): void
addRows(data?: any): Promise
updateRows(data?: any): Promise
deleteRows(deleteIds?: any[]): Promise
submitData(data?: any[]): Promise
validateData(): any
calcuTableHeaderHeight(): any,
updateTheme(theme): void
}
export interface XHeaderMethods extends TableMethods {
}
export interface TablePublicMethods {
updateStyle(): any
}
export interface TablePrivateMethods {
init(): void
workInit(): void
mergeFields(): void
triggerCellClickEvent(row: any, column: any, $rowIndex: any): void
unactiveEditCell(): void
monitorTableBodyResize(): void
documentEvent(): void
fixedRightTableYscroll(evnt: any): void
globalCheckbox(): void // 校验当前页是否全选
}
export type XTableProps = {
id?: XTablePropTypes.ID
fields?: XTablePropTypes.Fields
data?: XTablePropTypes.Data
showHeader?: XTablePropTypes.ShowHeader
showFooter?: XTablePropTypes.ShowFooter
showTools?: XTablePropTypes.ShowTools
loading?: XTablePropTypes.Loading
checkedRow?: XTablePropTypes.CheckedRow
stripe?: XTablePropTypes.Stripe
ShowQueryPanel?: XTablePropTypes.ShowQueryPanel
queryMaxColumn?: XTablePropTypes.QueryMaxColumn
firstColumnType?: XTablePropTypes.FirstColumnType
fieldConfig?: XTablePropTypes.RqConfig
rowConfig?: XTablePropTypes.RowConfig
editConfig?: XTablePropTypes.EditConfig
addConfig?: XTablePropTypes.RqConfig
deleteConfig?: XTablePropTypes.RqConfig
updateConfig?: XTablePropTypes.RqConfig
selectConfig?: XTablePropTypes.RqConfig
downloadConfig?: XTablePropTypes.RqConfig
submitConfig?: XTablePropTypes.RqConfig
schema?: XTablePropTypes.Schema
defaultProp?: XTablePropTypes.DefaultProp
size?: XTablePropTypes.SizeType
toolbarAuth?: XTablePropTypes.ToolbarAuth
modalZindex?: XTablePropTypes.ModalZindex
authorization?: XTablePropTypes.Authorization
filterCondition?: XTablePropTypes.FilterCondition
filterNeqCondition?: XTablePropTypes.FilterNeqCondition
reqParams?: XTablePropTypes.ReqParams
showOverflow?: XTablePropTypes.ShowOverflow
mergeRow?: XTablePropTypes.MergeRow
camelOrUnderline?: XTablePropTypes.CamelOrUnderline
interceptor?: XTablePropTypes.Interceptor
treeConfig?: XTablePropTypes.TreeConfig
form?: XTablePropTypes.Form
theme?: XColumnPropTypes.Theme
frontPager?: XTablePropTypes.FrontPager
pageInfo?: XTablePropTypes.PageInfo
deepFieldNameLastKey?: XTablePropTypes.DeepFieldNameLastKey
_work?: XTablePropTypes.Work
_limitLoop?: XTablePropTypes.LimitLoop
}
export type ButtonTpye = {
enable: boolean,
title?: string,
type?: string,
leftIcon?: string,
circle?: boolean
}
export namespace XTablePropTypes {
export type ID = string
export type Fields = T[]
export type Data = T[]
export type ShowHeader = boolean
export type ShowFooter = boolean
export type ShowTools = boolean
export type Loading = boolean
export type CheckedRow = Array[]
export type Stripe = boolean
export type ShowQueryPanel = boolean
export type QueryMaxColumn = number
export type FirstColumnType = 'checkbox' | 'radio' | ''
export type LoadedAwaitTime = number
export type Theme = "dark" | "light" | ''
export type DeepFieldNameLastKey = boolean
export type FrontPager = boolean
export type PageInfo = XPagerProps
export type Schema = {
$schema?: string
title?: string
description?: string
type: string,
items: {
type: string
properties: object
}
required?: any[]
errorMessage?: object
}
export type Form = {
border?: boolean,
grid?: boolean,
labelSuffix?: string,
labelWidth?: string,
labelAlign?: string,
labelInline?: boolean,
layout?: any[]
}
export type Size = SizeType
export type ModalZindex = number
export type DefaultProp = {
totalRs?: string
dataRs?: string
pageNumRs?: string
pageSizeRs?: string
filterRq?: string
filterNeqRq?: string
orderRq?: string
loadRq?: string
fieldRs?: string
fieldRq?: string
addRq?: string
updateRq?: string
deleteRq?: string
submitRq?: string
}
export type RqConfig = {
url: string
method?: string
payload?: any
payloadType?: 'data' | 'params'
}
export type RowConfig = {
rowKey?: string // 行id的键值
isHover?: boolean // 当鼠标移到行时,是否要高亮当前行
isCurrent?: boolean // 当鼠标点击行时,是否要高亮当前行
}
export type EditConfig = {
trigger: null | 'dblclick' | 'click' | '',
mode: 'cell' | 'row',
addPos?: 'first' | 'last' | 'afterColumnType' | number,
}
export type ToolbarAuth = { // 工具栏权限
add: ButtonTpye,
delete: ButtonTpye,
update: ButtonTpye,
refresh: ButtonTpye,
upload: ButtonTpye,
export: ButtonTpye,
zoom: ButtonTpye,
batchUpdate: ButtonTpye,
menu: ButtonTpye,
submit: ButtonTpye,
download: ButtonTpye,
}
export type Authorization = {
key?: string,
value?: string,
codeKey?: string,
codeVal?: string,
msgkey?: string,
expireCode?: string | number
cookieKey?: string
}
export type FilterCondition = Object
export type FilterNeqCondition = Object
export type ReqParams = Object
export type ShowOverflow = string | boolean
export type MergeRow = Object
export type CamelOrUnderline = 'UnderlineToCamel' | 'CamelToUnderline' | ''
export type Work = boolean
export type LimitLoop = number
export type Interceptor = {
beforeAddRows(params?: any): boolean; // 返回true会触发http
beforeAddClick(params?: any): boolean;
beforeDeleteRows(params?: any): boolean;
beforeDeleteClick(params?: any): boolean;
beforeUpdateRows(params?: any): boolean;
beforeUpdateClick(params?: any): boolean;
beforeSubmit(params?: any): boolean;
beforeSubmitClick(params?: any): boolean;
}
export type TreeConfig = {
treeField?: string | '' // 有值则开启
expandAll?: Boolean
rowField?: string // id
parentField?: string // parentId
childrenField?: string // children
showLine?: Boolean
indent?: number
type?: 'checkbox' | '' | 'radio'
level?: 'level'
}
}
export interface XTableEventProps {
}
export interface XTableSlots {
leftToolbar: () => any
rightToolbar: () => any
}
export type XTableEmits = [
'paste',
'resizable-change',
'actions',
'scroll',
'checkbox-change',
]
export interface TableReactData {
// 表头字段
fields: D[]
// 渲染中的数据
tableData: D[],
// 纵向滚动条的宽度
yScrollbarWidth: number
// 横向滚动条的宽度
xScrollbarWidth: number
// 弹窗
modalVal: boolean
// 最小列宽
minColumnWidth: number
// 已经勾选
checkedRows: object
// 当前页操作信息
curPageCell: object
// 全选
checkedAll: {
value: boolean
}
// 查询过滤值
queryValues: object,
// 字段排序
orderCondition: object,
// 分页信息
pageInfo: any,
// 映射关系
defaultProp: any,
// 加载中
loading: boolean,
// 是否显示菜单
showMenus: boolean,
// 当前点击的行
activeRow: object
// 是否显示搜索
_showQueryPanel: boolean,
// 字段记录
_recordFields: object,
// x轴滚动条距离左侧的距离
_xScrollLeft: number,
// x轴滚动条距离右侧的距离
_xScrollRight: number,
// 全选item
_checkedAllItem: any
// 列最小宽度
_widgetColMinWidth: {
select: number,
datetimepicker: number,
input: number,
checkbox: number
},
}
export interface Button {
widget: string,
name: string,
circle: boolean,
leftIcon: string,
[string | number]: any,
}
export namespace XColumnPropTypes {
export type Widget = string
export type Name = string
export type Title = string
export type Width = number | string
export type Editable = boolean
export type Sortable = boolean | number
export type ShowFormItem = boolean
export type ShowField = boolean
export type Searchable = boolean
export type WidgetLayout = any
export type Sort = number
export type Align = 'center' | 'left' | 'right'
export type SlotName = string
export type Fixed = '' | 'left' | 'right'
export type ShowEditWidget = boolean
export type SlotCanBeClick = boolean
export type BatchUpdate = boolean
}
/**
* 列对象
*/
export class ColumnInfo {
widget: XColumnPropTypes.Type
name: XColumnPropTypes.Name
title: XColumnPropTypes.Title
width?: XColumnPropTypes.Width
editable?: XColumnPropTypes.Editable
sortable?: XColumnPropTypes.Sortable
showFormItem?: XColumnPropTypes.ShowFormItem
showField?: XColumnPropTypes.ShowField
searchable?: XColumnPropTypes.Searchable
widgetLayout?: XColumnPropTypes.WidgetLayout
sort?: XColumnPropTypes.Sort
align?: XColumnPropTypes.Align
slotName?: XColumnPropTypes.SlotName
fixed?: XColumnPropTypes.Fixed
showEditWidget?: XColumnPropTypes.ShowEditWidget
slotCanBeClick?: XColumnPropTypes.SlotCanByClick
batchUpdate?: XColumnPropTypes.BatchUpdate
/**
* 以下内部属性
* 内部属性随时都会调整,不应该被使用
*/
[String | Number]: any
}
export interface CellRenderHeaderParams {
$table: XTableConstructor
$rowIndex: number
column: ColumnInfo
}
export interface TableInternalData {
elemStore: {
[key: string]: Ref | null
},
// 搜索高度
queryPanelHeight: number,
// 搜索高度
toolsHeight: number,
// 表头高度
headerHeight: number
// 表尾高度
footerHeight: number
// 正在编辑的列
curEditColumns: any
// 记录cell的vn,提升性能
recordCellVN: object
// 点击单元格的键值
clickCellKey: string
// 记录触发的单元格,避免重复触发
recordCellActive: object
}