committed by
GitHub
70 changed files with 2209 additions and 104 deletions
@ -0,0 +1,12 @@ |
|||
import { withInstall } from '/@/utils'; |
|||
import vxeBasicTable from './src/VxeBasicTable'; |
|||
import { VXETable } from 'vxe-table'; |
|||
import VXETablePluginAntd from './src/components'; |
|||
import VXETablePluginExportXLSX from 'vxe-table-plugin-export-xlsx'; |
|||
import './src/setting'; |
|||
|
|||
export const VxeBasicTable = withInstall(vxeBasicTable); |
|||
export * from 'vxe-table'; |
|||
export * from './src/types'; |
|||
|
|||
VXETable.use(VXETablePluginAntd).use(VXETablePluginExportXLSX); |
|||
@ -0,0 +1,108 @@ |
|||
import { defineComponent } from 'vue'; |
|||
import { computed, ref } from 'vue'; |
|||
import { BasicTableProps } from './types'; |
|||
import { omit } from 'lodash-es'; |
|||
import { basicProps } from './props'; |
|||
import { ignorePropKeys } from './const'; |
|||
import { basicEmits } from './emits'; |
|||
import XEUtils from 'xe-utils'; |
|||
import type { VxeGridInstance, VxeGridEventProps, GridMethods, TableMethods } from 'vxe-table'; |
|||
import { Grid as VxeGrid } from 'vxe-table'; |
|||
|
|||
import { extendSlots } from '/@/utils/helper/tsxHelper'; |
|||
import { gridComponentMethodKeys } from './methods'; |
|||
|
|||
export default defineComponent({ |
|||
name: 'VxeBasicTable', |
|||
props: basicProps, |
|||
emits: basicEmits, |
|||
setup(props, { emit, attrs }) { |
|||
const tableElRef = ref<VxeGridInstance>(); |
|||
const emitEvents: VxeGridEventProps = {}; |
|||
|
|||
const extendTableMethods = (methodKeys) => { |
|||
const funcs: any = {}; |
|||
methodKeys.forEach((name) => { |
|||
funcs[name] = (...args: any[]) => { |
|||
const $vxegrid: any = tableElRef.value; |
|||
if ($vxegrid && $vxegrid[name]) { |
|||
return $vxegrid[name](...args); |
|||
} |
|||
}; |
|||
}); |
|||
|
|||
return funcs; |
|||
}; |
|||
|
|||
const gridExtendTableMethods = extendTableMethods(gridComponentMethodKeys) as GridMethods & |
|||
TableMethods; |
|||
|
|||
basicEmits.forEach((name) => { |
|||
const type = XEUtils.camelCase(`on-${name}`) as keyof VxeGridEventProps; |
|||
|
|||
emitEvents[type] = (...args: any[]) => emit(name, ...args); |
|||
}); |
|||
|
|||
/** |
|||
* @description: 二次封装需要的所有属性 |
|||
* 1.部分属性需要和全局属性进行合并 |
|||
*/ |
|||
const getBindValues = computed<BasicTableProps>(() => { |
|||
const propsData: BasicTableProps = { |
|||
...attrs, |
|||
...props, |
|||
}; |
|||
|
|||
return propsData; |
|||
}); |
|||
|
|||
/** |
|||
* @description: Table 所有属性 |
|||
*/ |
|||
const getBindGridValues = computed(() => { |
|||
const omitProps = omit(getBindValues.value, ignorePropKeys); |
|||
|
|||
return { |
|||
...omitProps, |
|||
...getBindGridEvent, |
|||
}; |
|||
}); |
|||
|
|||
/** |
|||
* @description: 组件外层class |
|||
*/ |
|||
const getWrapperClass = computed(() => { |
|||
return [attrs.class]; |
|||
}); |
|||
|
|||
/** |
|||
* @description: 重写Vxe-table 方法 |
|||
*/ |
|||
const getBindGridEvent: VxeGridEventProps = { |
|||
...emitEvents, |
|||
}; |
|||
|
|||
return { |
|||
getWrapperClass, |
|||
getBindGridValues, |
|||
tableElRef, |
|||
...gridExtendTableMethods, |
|||
}; |
|||
}, |
|||
render() { |
|||
const { tableClass, tableStyle } = this.$props; |
|||
|
|||
return ( |
|||
<div class={`h-full flex flex-col bg-white ${this.getWrapperClass}`}> |
|||
<VxeGrid |
|||
ref="tableElRef" |
|||
class={`vxe-grid_scrollbar px-6 py-4 ${tableClass}`} |
|||
style={tableStyle} |
|||
{...this.getBindGridValues} |
|||
> |
|||
{extendSlots(this.$slots)} |
|||
</VxeGrid> |
|||
</div> |
|||
); |
|||
}, |
|||
}); |
|||
@ -0,0 +1,59 @@ |
|||
import type { Component } from 'vue'; |
|||
|
|||
import type { ComponentType } from './componentType'; |
|||
import { ApiSelect, ApiTreeSelect } from '/@/components/Form'; |
|||
import { |
|||
Input, |
|||
Select, |
|||
Radio, |
|||
Checkbox, |
|||
AutoComplete, |
|||
Cascader, |
|||
DatePicker, |
|||
InputNumber, |
|||
Switch, |
|||
TimePicker, |
|||
TreeSelect, |
|||
Rate, |
|||
Button, |
|||
Empty, |
|||
} from 'ant-design-vue'; |
|||
|
|||
const componentMap = new Map<ComponentType, Component>(); |
|||
|
|||
componentMap.set('AButton', Button); |
|||
|
|||
componentMap.set('AInput', Input); |
|||
componentMap.set('AInputSearch', Input.Search); |
|||
componentMap.set('AInputNumber', InputNumber); |
|||
componentMap.set('AAutoComplete', AutoComplete); |
|||
|
|||
componentMap.set('ASelect', Select); |
|||
componentMap.set('ATreeSelect', TreeSelect); |
|||
componentMap.set('ASwitch', Switch); |
|||
componentMap.set('ARadioGroup', Radio.Group); |
|||
componentMap.set('ACheckboxGroup', Checkbox.Group); |
|||
componentMap.set('ACascader', Cascader); |
|||
componentMap.set('ARate', Rate); |
|||
|
|||
componentMap.set('ADatePicker', DatePicker); |
|||
componentMap.set('AMonthPicker', DatePicker.MonthPicker); |
|||
componentMap.set('ARangePicker', DatePicker.RangePicker); |
|||
componentMap.set('AWeekPicker', DatePicker.WeekPicker); |
|||
componentMap.set('AYearPicker', DatePicker.YearPicker); |
|||
componentMap.set('ATimePicker', TimePicker); |
|||
|
|||
componentMap.set('AApiSelect', ApiSelect); |
|||
componentMap.set('AApiTreeSelect', ApiTreeSelect); |
|||
|
|||
componentMap.set('AEmpty', Empty); |
|||
|
|||
export function add(compName: ComponentType, component: Component) { |
|||
componentMap.set(compName, component); |
|||
} |
|||
|
|||
export function del(compName: ComponentType) { |
|||
componentMap.delete(compName); |
|||
} |
|||
|
|||
export { componentMap }; |
|||
@ -0,0 +1,22 @@ |
|||
export type ComponentType = |
|||
| 'AInput' |
|||
| 'AInputNumber' |
|||
| 'ASelect' |
|||
| 'AApiSelect' |
|||
| 'ATreeSelect' |
|||
| 'AApiTreeSelect' |
|||
| 'ARadioGroup' |
|||
| 'ACheckboxGroup' |
|||
| 'AAutoComplete' |
|||
| 'ACascader' |
|||
| 'ADatePicker' |
|||
| 'AMonthPicker' |
|||
| 'ARangePicker' |
|||
| 'AWeekPicker' |
|||
| 'ATimePicker' |
|||
| 'AYearPicker' |
|||
| 'ASwitch' |
|||
| 'ARate' |
|||
| 'AInputSearch' |
|||
| 'AButton' |
|||
| 'AEmpty'; |
|||
@ -0,0 +1,20 @@ |
|||
import XEUtils from 'xe-utils'; |
|||
import { createDefaultRender, createEditRender, createFormItemRender } from './common'; |
|||
|
|||
export default { |
|||
renderDefault: createDefaultRender({}, (_, params) => { |
|||
return { |
|||
params: XEUtils.get(params, 'row'), |
|||
}; |
|||
}), |
|||
renderEdit: createEditRender({}, (_, params) => { |
|||
return { |
|||
params: XEUtils.get(params, 'row'), |
|||
}; |
|||
}), |
|||
renderItemContent: createFormItemRender({}, (_, params) => { |
|||
return { |
|||
params: XEUtils.get(params, 'row'), |
|||
}; |
|||
}), |
|||
}; |
|||
@ -0,0 +1,16 @@ |
|||
import { |
|||
createEditRender, |
|||
createDefaultRender, |
|||
createFilterRender, |
|||
createDefaultFilterRender, |
|||
createFormItemRender, |
|||
} from './common'; |
|||
|
|||
export default { |
|||
autofocus: 'input.ant-input', |
|||
renderDefault: createDefaultRender(), |
|||
renderEdit: createEditRender(), |
|||
renderFilter: createFilterRender(), |
|||
defaultFilterMethod: createDefaultFilterRender(), |
|||
renderItemContent: createFormItemRender(), |
|||
}; |
|||
@ -0,0 +1,120 @@ |
|||
import { h } from 'vue'; |
|||
import { |
|||
FormItemContentRenderParams, |
|||
FormItemRenderOptions, |
|||
VxeGlobalRendererHandles, |
|||
} from 'vxe-table'; |
|||
import XEUtils from 'xe-utils'; |
|||
import { cellText, createEvents, createProps, getComponent } from './common'; |
|||
|
|||
const COMPONENT_NAME = 'AButton'; |
|||
|
|||
export function createEditRender() { |
|||
return function ( |
|||
renderOpts: VxeGlobalRendererHandles.RenderEditOptions, |
|||
params: VxeGlobalRendererHandles.RenderEditParams, |
|||
) { |
|||
const { attrs } = renderOpts; |
|||
const Component = getComponent(COMPONENT_NAME); |
|||
|
|||
return [ |
|||
h(Component, { |
|||
...attrs, |
|||
...createProps(renderOpts, null), |
|||
...createEvents(renderOpts, params), |
|||
}), |
|||
]; |
|||
}; |
|||
} |
|||
|
|||
export function createDefaultRender() { |
|||
return function ( |
|||
renderOpts: VxeGlobalRendererHandles.RenderEditOptions, |
|||
params: VxeGlobalRendererHandles.RenderEditParams, |
|||
) { |
|||
const { attrs } = renderOpts; |
|||
const Component = getComponent(COMPONENT_NAME); |
|||
|
|||
return [ |
|||
h( |
|||
Component, |
|||
{ |
|||
...attrs, |
|||
...createProps(renderOpts, null), |
|||
...createEvents(renderOpts, params), |
|||
}, |
|||
cellText(renderOpts.content), |
|||
), |
|||
]; |
|||
}; |
|||
} |
|||
|
|||
export function createFormItemRender() { |
|||
return function (renderOpts: FormItemRenderOptions, params: FormItemContentRenderParams) { |
|||
const { attrs, content } = renderOpts; |
|||
const { property, $form, data } = params; |
|||
const props = createProps(renderOpts, null); |
|||
const Component = getComponent(COMPONENT_NAME); |
|||
|
|||
return [ |
|||
h( |
|||
Component, |
|||
{ |
|||
...attrs, |
|||
...props, |
|||
...createEvents( |
|||
renderOpts, |
|||
params, |
|||
(value: any) => { |
|||
// 处理 model 值双向绑定
|
|||
XEUtils.set(data, property, value); |
|||
}, |
|||
() => { |
|||
// 处理 change 事件相关逻辑
|
|||
$form.updateStatus({ |
|||
...params, |
|||
field: property, |
|||
}); |
|||
}, |
|||
), |
|||
}, |
|||
{ |
|||
default: () => cellText(content || props.content), |
|||
}, |
|||
), |
|||
]; |
|||
}; |
|||
} |
|||
|
|||
function createToolbarButtonRender() { |
|||
return function ( |
|||
renderOpts: VxeGlobalRendererHandles.RenderToolOptions, |
|||
params: VxeGlobalRendererHandles.RenderButtonParams, |
|||
) { |
|||
const { attrs } = renderOpts; |
|||
const { button } = params; |
|||
const props = createProps(renderOpts, null); |
|||
const Component = getComponent(COMPONENT_NAME); |
|||
|
|||
return [ |
|||
h( |
|||
Component, |
|||
{ |
|||
...attrs, |
|||
...props, |
|||
...createEvents(renderOpts, params), |
|||
}, |
|||
{ |
|||
default: () => cellText(button?.content || props.content), |
|||
}, |
|||
), |
|||
]; |
|||
}; |
|||
} |
|||
|
|||
export default { |
|||
renderEdit: createEditRender(), |
|||
renderDefault: createDefaultRender(), |
|||
renderItemContent: createFormItemRender(), |
|||
renderToolbarButton: createToolbarButtonRender(), |
|||
}; |
|||
@ -0,0 +1,59 @@ |
|||
import { |
|||
FormItemContentRenderParams, |
|||
FormItemRenderOptions, |
|||
VxeGlobalRendererHandles, |
|||
} from 'vxe-table'; |
|||
import { createDefaultRender, createEditRender, createFormItemRender } from './AButton'; |
|||
|
|||
function createEditButtonRender() { |
|||
return function ( |
|||
renderOpts: VxeGlobalRendererHandles.RenderEditOptions, |
|||
params: VxeGlobalRendererHandles.RenderEditParams, |
|||
) { |
|||
const buttonEditRender = createEditRender(); |
|||
const { children } = renderOpts; |
|||
if (children) { |
|||
return children.map( |
|||
(childRenderOpts: VxeGlobalRendererHandles.RenderEditOptions) => |
|||
buttonEditRender(childRenderOpts, params)[0], |
|||
); |
|||
} |
|||
return []; |
|||
}; |
|||
} |
|||
|
|||
function createDefaultButtonRender() { |
|||
return function ( |
|||
renderOpts: VxeGlobalRendererHandles.RenderDefaultOptions, |
|||
params: VxeGlobalRendererHandles.RenderDefaultParams, |
|||
) { |
|||
const buttonDefaultRender = createDefaultRender(); |
|||
const { children } = renderOpts; |
|||
if (children) { |
|||
return children.map( |
|||
(childRenderOpts: VxeGlobalRendererHandles.RenderDefaultOptions) => |
|||
buttonDefaultRender(childRenderOpts, params)[0], |
|||
); |
|||
} |
|||
return []; |
|||
}; |
|||
} |
|||
|
|||
function createButtonItemRender() { |
|||
return function (renderOpts: FormItemRenderOptions, params: FormItemContentRenderParams) { |
|||
const buttonItemRender = createFormItemRender(); |
|||
const { children } = renderOpts; |
|||
if (children) { |
|||
return children.map( |
|||
(childRenderOpts: FormItemRenderOptions) => buttonItemRender(childRenderOpts, params)[0], |
|||
); |
|||
} |
|||
return []; |
|||
}; |
|||
} |
|||
|
|||
export default { |
|||
renderEdit: createEditButtonRender(), |
|||
renderDefault: createDefaultButtonRender(), |
|||
renderItemContent: createButtonItemRender(), |
|||
}; |
|||
@ -0,0 +1,42 @@ |
|||
import { VxeGlobalRendererHandles } from 'vxe-table'; |
|||
import XEUtils from 'xe-utils'; |
|||
import { |
|||
createEditRender, |
|||
createCellRender, |
|||
createFormItemRender, |
|||
createExportMethod, |
|||
} from './common'; |
|||
|
|||
function matchCascaderData(index: number, list: any[], values: any[], labels: any[]) { |
|||
const val = values[index]; |
|||
if (list && values.length > index) { |
|||
XEUtils.each(list, (item) => { |
|||
if (item.value === val) { |
|||
labels.push(item.label); |
|||
matchCascaderData(++index, item.children, values, labels); |
|||
} |
|||
}); |
|||
} |
|||
} |
|||
|
|||
function getCascaderCellValue( |
|||
renderOpts: VxeGlobalRendererHandles.RenderOptions, |
|||
params: VxeGlobalRendererHandles.RenderCellParams, |
|||
) { |
|||
const { props = {} } = renderOpts; |
|||
const { row, column } = params; |
|||
const cellValue = XEUtils.get(row, column.field as string); |
|||
const values = cellValue || []; |
|||
const labels: Array<any> = []; |
|||
matchCascaderData(0, props.options, values, labels); |
|||
return ( |
|||
props.showAllLevels === false ? labels.slice(labels.length - 1, labels.length) : labels |
|||
).join(` ${props.separator || '/'} `); |
|||
} |
|||
|
|||
export default { |
|||
renderEdit: createEditRender(), |
|||
renderCell: createCellRender(getCascaderCellValue), |
|||
renderItemContent: createFormItemRender(), |
|||
exportMethod: createExportMethod(getCascaderCellValue), |
|||
}; |
|||
@ -0,0 +1,5 @@ |
|||
import { createFormItemRender } from './common'; |
|||
|
|||
export default { |
|||
renderItemContent: createFormItemRender(), |
|||
}; |
|||
@ -0,0 +1,33 @@ |
|||
import { VxeGlobalRendererHandles } from 'vxe-table'; |
|||
import XEUtils from 'xe-utils'; |
|||
import { |
|||
createCellRender, |
|||
createEditRender, |
|||
createExportMethod, |
|||
createFormItemRender, |
|||
} from './common'; |
|||
|
|||
export function getDatePickerCellValue( |
|||
renderOpts: VxeGlobalRendererHandles.RenderOptions, |
|||
params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.ExportMethodParams, |
|||
defaultFormat: string, |
|||
) { |
|||
const { props = {} } = renderOpts; |
|||
const { row, column } = params; |
|||
let cellValue = XEUtils.get(row, column.field as string); |
|||
if (cellValue) { |
|||
cellValue = cellValue.format(props.format || defaultFormat); |
|||
} |
|||
return cellValue; |
|||
} |
|||
|
|||
export default { |
|||
renderEdit: createEditRender(), |
|||
renderCell: createCellRender(getDatePickerCellValue, () => { |
|||
return ['YYYY-MM-DD']; |
|||
}), |
|||
renderItemContent: createFormItemRender(), |
|||
exportMethod: createExportMethod(getDatePickerCellValue, () => { |
|||
return ['YYYY-MM-DD']; |
|||
}), |
|||
}; |
|||
@ -0,0 +1,27 @@ |
|||
import { h } from 'vue'; |
|||
import { VxeGlobalRendererHandles } from 'vxe-table'; |
|||
import { getComponent } from './common'; |
|||
|
|||
function createEmptyRender() { |
|||
return function (renderOpts: VxeGlobalRendererHandles.RenderEmptyOptions) { |
|||
const { name, attrs, props } = renderOpts; |
|||
|
|||
const Component = getComponent(name); |
|||
return [ |
|||
h( |
|||
'div', |
|||
{ |
|||
class: 'flex items-center justify-center', |
|||
}, |
|||
h(Component, { |
|||
...attrs, |
|||
...props, |
|||
}), |
|||
), |
|||
]; |
|||
}; |
|||
} |
|||
|
|||
export default { |
|||
renderEmpty: createEmptyRender(), |
|||
}; |
|||
@ -0,0 +1,16 @@ |
|||
import { |
|||
createEditRender, |
|||
createDefaultRender, |
|||
createFilterRender, |
|||
createDefaultFilterRender, |
|||
createFormItemRender, |
|||
} from './common'; |
|||
|
|||
export default { |
|||
autofocus: 'input.ant-input', |
|||
renderDefault: createDefaultRender(), |
|||
renderEdit: createEditRender(), |
|||
renderFilter: createFilterRender(), |
|||
defaultFilterMethod: createDefaultFilterRender(), |
|||
renderItemContent: createFormItemRender(), |
|||
}; |
|||
@ -0,0 +1,16 @@ |
|||
import { |
|||
createEditRender, |
|||
createFilterRender, |
|||
createFormItemRender, |
|||
createDefaultFilterRender, |
|||
createDefaultRender, |
|||
} from './common'; |
|||
|
|||
export default { |
|||
autofocus: 'input.ant-input-number-input', |
|||
renderDefault: createDefaultRender(), |
|||
renderEdit: createEditRender(), |
|||
renderFilter: createFilterRender(), |
|||
defaultFilterMethod: createDefaultFilterRender(), |
|||
renderItemContent: createFormItemRender(), |
|||
}; |
|||
@ -0,0 +1,17 @@ |
|||
import { |
|||
createEditRender, |
|||
createDefaultRender, |
|||
createFilterRender, |
|||
createDefaultFilterRender, |
|||
createFormItemRender, |
|||
createToolbarToolRender, |
|||
} from './common'; |
|||
|
|||
export default { |
|||
renderDefault: createDefaultRender(), |
|||
renderEdit: createEditRender(), |
|||
renderFilter: createFilterRender(), |
|||
defaultFilterMethod: createDefaultFilterRender(), |
|||
renderItemContent: createFormItemRender(), |
|||
renderToolbarTool: createToolbarToolRender(), |
|||
}; |
|||
@ -0,0 +1,18 @@ |
|||
import { getDatePickerCellValue } from './ADatePicker'; |
|||
import { |
|||
createCellRender, |
|||
createEditRender, |
|||
createExportMethod, |
|||
createFormItemRender, |
|||
} from './common'; |
|||
|
|||
export default { |
|||
renderEdit: createEditRender(), |
|||
renderCell: createCellRender(getDatePickerCellValue, () => { |
|||
return ['YYYY-MM']; |
|||
}), |
|||
renderItemContent: createFormItemRender(), |
|||
exportMethod: createExportMethod(getDatePickerCellValue, () => { |
|||
return ['YYYY-MM']; |
|||
}), |
|||
}; |
|||
@ -0,0 +1,5 @@ |
|||
import { createFormItemRender } from './common'; |
|||
|
|||
export default { |
|||
renderItemContent: createFormItemRender(), |
|||
}; |
|||
@ -0,0 +1,30 @@ |
|||
import { VxeColumnPropTypes, VxeGlobalRendererHandles } from 'vxe-table'; |
|||
import XEUtils from 'xe-utils'; |
|||
import { |
|||
createCellRender, |
|||
createEditRender, |
|||
createExportMethod, |
|||
createFormItemRender, |
|||
} from './common'; |
|||
|
|||
function getRangePickerCellValue( |
|||
renderOpts: VxeColumnPropTypes.EditRender, |
|||
params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.ExportMethodParams, |
|||
) { |
|||
const { props = {} } = renderOpts; |
|||
const { row, column } = params; |
|||
let cellValue = XEUtils.get(row, column.field as string); |
|||
if (cellValue) { |
|||
cellValue = XEUtils.map(cellValue, (date: any) => |
|||
date.format(props.format || 'YYYY-MM-DD'), |
|||
).join(' ~ '); |
|||
} |
|||
return cellValue; |
|||
} |
|||
|
|||
export default { |
|||
renderEdit: createEditRender(), |
|||
renderCell: createCellRender(getRangePickerCellValue), |
|||
renderItemContent: createFormItemRender(), |
|||
exportMethod: createExportMethod(getRangePickerCellValue), |
|||
}; |
|||
@ -0,0 +1,15 @@ |
|||
import { |
|||
createEditRender, |
|||
createDefaultRender, |
|||
createFilterRender, |
|||
createDefaultFilterRender, |
|||
createFormItemRender, |
|||
} from './common'; |
|||
|
|||
export default { |
|||
renderDefault: createDefaultRender(), |
|||
renderEdit: createEditRender(), |
|||
renderFilter: createFilterRender(), |
|||
defaultFilterMethod: createDefaultFilterRender(), |
|||
renderItemContent: createFormItemRender(), |
|||
}; |
|||
@ -0,0 +1,271 @@ |
|||
import { ComponentOptions, h, resolveComponent } from 'vue'; |
|||
import { VxeColumnPropTypes, VxeGlobalRendererHandles } from 'vxe-table'; |
|||
import XEUtils from 'xe-utils'; |
|||
import { |
|||
cellText, |
|||
createCellRender, |
|||
createEvents, |
|||
createProps, |
|||
isEmptyValue, |
|||
createExportMethod, |
|||
createFormItemRender, |
|||
} from './common'; |
|||
|
|||
function renderOptions(options: any[], optionProps: VxeGlobalRendererHandles.RenderOptionProps) { |
|||
const labelProp = optionProps.label || 'label'; |
|||
const valueProp = optionProps.value || 'value'; |
|||
return XEUtils.map(options, (item, oIndex) => { |
|||
return h( |
|||
resolveComponent('a-select-option') as ComponentOptions, |
|||
{ |
|||
key: oIndex, |
|||
value: item[valueProp], |
|||
disabled: item.disabled, |
|||
}, |
|||
{ |
|||
default: () => cellText(item[labelProp]), |
|||
}, |
|||
); |
|||
}); |
|||
} |
|||
|
|||
function createEditRender() { |
|||
return function ( |
|||
renderOpts: VxeColumnPropTypes.EditRender, |
|||
params: VxeGlobalRendererHandles.RenderEditParams, |
|||
) { |
|||
const { options = [], optionGroups, optionProps = {}, optionGroupProps = {} } = renderOpts; |
|||
const { row, column, $table } = params; |
|||
const { attrs } = renderOpts; |
|||
const cellValue = XEUtils.get(row, column.field as string); |
|||
const props = createProps(renderOpts, cellValue); |
|||
const ons = createEvents( |
|||
renderOpts, |
|||
params, |
|||
(value: any) => { |
|||
// 处理 model 值双向绑定
|
|||
XEUtils.set(row, column.field as string, value); |
|||
}, |
|||
() => { |
|||
// 处理 change 事件相关逻辑
|
|||
$table.updateStatus(params); |
|||
}, |
|||
); |
|||
if (optionGroups) { |
|||
const groupOptions = optionGroupProps.options || 'options'; |
|||
const groupLabel = optionGroupProps.label || 'label'; |
|||
return [ |
|||
h( |
|||
resolveComponent('a-select') as ComponentOptions, |
|||
{ |
|||
...attrs, |
|||
...props, |
|||
...ons, |
|||
}, |
|||
{ |
|||
default: () => { |
|||
return XEUtils.map(optionGroups, (group, gIndex) => { |
|||
return h( |
|||
resolveComponent('a-select-opt-group') as ComponentOptions, |
|||
{ |
|||
key: gIndex, |
|||
}, |
|||
{ |
|||
label: () => { |
|||
return h('span', {}, group[groupLabel]); |
|||
}, |
|||
default: () => renderOptions(group[groupOptions], optionProps), |
|||
}, |
|||
); |
|||
}); |
|||
}, |
|||
}, |
|||
), |
|||
]; |
|||
} |
|||
return [ |
|||
h( |
|||
resolveComponent('a-select') as ComponentOptions, |
|||
{ |
|||
...props, |
|||
...attrs, |
|||
...ons, |
|||
}, |
|||
{ |
|||
default: () => renderOptions(options, optionProps), |
|||
}, |
|||
), |
|||
]; |
|||
}; |
|||
} |
|||
|
|||
function getSelectCellValue( |
|||
renderOpts: VxeGlobalRendererHandles.RenderCellOptions, |
|||
params: VxeGlobalRendererHandles.RenderCellParams, |
|||
) { |
|||
const { |
|||
options = [], |
|||
optionGroups, |
|||
props = {}, |
|||
optionProps = {}, |
|||
optionGroupProps = {}, |
|||
} = renderOpts; |
|||
const { row, column } = params; |
|||
const labelProp = optionProps.label || 'label'; |
|||
const valueProp = optionProps.value || 'value'; |
|||
const groupOptions = optionGroupProps.options || 'options'; |
|||
const cellValue = XEUtils.get(row, column.field as string); |
|||
if (!isEmptyValue(cellValue)) { |
|||
return XEUtils.map( |
|||
props.mode === 'multiple' ? cellValue : [cellValue], |
|||
optionGroups |
|||
? (value) => { |
|||
let selectItem; |
|||
for (let index = 0; index < optionGroups.length; index++) { |
|||
selectItem = XEUtils.find( |
|||
optionGroups[index][groupOptions], |
|||
(item) => item[valueProp] === value, |
|||
); |
|||
if (selectItem) { |
|||
break; |
|||
} |
|||
} |
|||
return selectItem ? selectItem[labelProp] : value; |
|||
} |
|||
: (value) => { |
|||
const selectItem = XEUtils.find(options, (item) => item[valueProp] === value); |
|||
return selectItem ? selectItem[labelProp] : value; |
|||
}, |
|||
).join(', '); |
|||
} |
|||
return ''; |
|||
} |
|||
|
|||
function createFilterRender() { |
|||
return function ( |
|||
renderOpts: VxeColumnPropTypes.FilterRender, |
|||
params: VxeGlobalRendererHandles.RenderFilterParams, |
|||
) { |
|||
const { options = [], optionGroups, optionProps = {}, optionGroupProps = {} } = renderOpts; |
|||
const groupOptions = optionGroupProps.options || 'options'; |
|||
const groupLabel = optionGroupProps.label || 'label'; |
|||
const { column } = params; |
|||
const { attrs } = renderOpts; |
|||
|
|||
return [ |
|||
h( |
|||
'div', |
|||
{ |
|||
class: 'vxe-table--filter-antd-wrapper', |
|||
}, |
|||
optionGroups |
|||
? column.filters.map((option, oIndex) => { |
|||
const optionValue = option.data; |
|||
const props = createProps(renderOpts, optionValue); |
|||
|
|||
return h( |
|||
resolveComponent('a-select') as ComponentOptions, |
|||
{ |
|||
key: oIndex, |
|||
...attrs, |
|||
...props, |
|||
...createEvents( |
|||
renderOpts, |
|||
params, |
|||
(value: any) => { |
|||
// 处理 model 值双向绑定
|
|||
option.data = value; |
|||
}, |
|||
() => { |
|||
// 处理 change 事件相关逻辑
|
|||
const { $panel } = params; |
|||
$panel.changeOption( |
|||
null, |
|||
props.mode === 'multiple' |
|||
? option.data && option.data.length > 0 |
|||
: !XEUtils.eqNull(option.data), |
|||
option, |
|||
); |
|||
}, |
|||
), |
|||
}, |
|||
{ |
|||
default: () => { |
|||
return XEUtils.map(optionGroups, (group, gIndex) => { |
|||
return h( |
|||
resolveComponent('a-select-opt-group') as ComponentOptions, |
|||
{ |
|||
key: gIndex, |
|||
}, |
|||
{ |
|||
label: () => { |
|||
return h('span', {}, group[groupLabel]); |
|||
}, |
|||
default: () => renderOptions(group[groupOptions], optionProps), |
|||
}, |
|||
); |
|||
}); |
|||
}, |
|||
}, |
|||
); |
|||
}) |
|||
: column.filters.map((option, oIndex) => { |
|||
const optionValue = option.data; |
|||
const props = createProps(renderOpts, optionValue); |
|||
return h( |
|||
resolveComponent('a-select') as ComponentOptions, |
|||
{ |
|||
key: oIndex, |
|||
...attrs, |
|||
...props, |
|||
...createEvents( |
|||
renderOpts, |
|||
params, |
|||
(value: any) => { |
|||
// 处理 model 值双向绑定
|
|||
option.data = value; |
|||
}, |
|||
() => { |
|||
// 处理 change 事件相关逻辑
|
|||
const { $panel } = params; |
|||
$panel.changeOption( |
|||
null, |
|||
props.mode === 'multiple' |
|||
? option.data && option.data.length > 0 |
|||
: !XEUtils.eqNull(option.data), |
|||
option, |
|||
); |
|||
}, |
|||
), |
|||
}, |
|||
{ |
|||
default: () => renderOptions(options, optionProps), |
|||
}, |
|||
); |
|||
}), |
|||
), |
|||
]; |
|||
}; |
|||
} |
|||
|
|||
export default { |
|||
renderEdit: createEditRender(), |
|||
renderCell: createCellRender(getSelectCellValue), |
|||
renderFilter: createFilterRender(), |
|||
defaultFilterMethod(params) { |
|||
const { option, row, column } = params; |
|||
const { data } = option; |
|||
const { field, filterRender: renderOpts } = column; |
|||
const { props = {} } = renderOpts; |
|||
const cellValue = XEUtils.get(row, field); |
|||
if (props.mode === 'multiple') { |
|||
if (XEUtils.isArray(cellValue)) { |
|||
return XEUtils.includeArrays(cellValue, data); |
|||
} |
|||
return data.indexOf(cellValue) > -1; |
|||
} |
|||
return cellValue == data; |
|||
}, |
|||
renderItemContent: createFormItemRender(), |
|||
exportMethod: createExportMethod(getSelectCellValue), |
|||
}; |
|||
@ -0,0 +1,53 @@ |
|||
import { h } from 'vue'; |
|||
import XEUtils from 'xe-utils'; |
|||
import { |
|||
createEditRender, |
|||
createDefaultRender, |
|||
createProps, |
|||
createEvents, |
|||
createDefaultFilterRender, |
|||
createFormItemRender, |
|||
getComponent, |
|||
} from './common'; |
|||
|
|||
export default { |
|||
renderDefault: createDefaultRender(), |
|||
renderEdit: createEditRender(), |
|||
renderFilter(renderOpts, params) { |
|||
const { column } = params; |
|||
const { name, attrs } = renderOpts; |
|||
const Component = getComponent(name); |
|||
|
|||
return [ |
|||
h( |
|||
'div', |
|||
{ |
|||
class: 'vxe-table--filter-antd-wrapper', |
|||
}, |
|||
column.filters.map((option, oIndex) => { |
|||
const optionValue = option.data; |
|||
return h(Component, { |
|||
key: oIndex, |
|||
...attrs, |
|||
...createProps(renderOpts, optionValue), |
|||
...createEvents( |
|||
renderOpts, |
|||
params, |
|||
(value: any) => { |
|||
// 处理 model 值双向绑定
|
|||
option.data = value; |
|||
}, |
|||
() => { |
|||
// 处理 change 事件相关逻辑
|
|||
const { $panel } = params; |
|||
$panel.changeOption(null, XEUtils.isBoolean(option.data), option); |
|||
}, |
|||
), |
|||
}); |
|||
}), |
|||
), |
|||
]; |
|||
}, |
|||
defaultFilterMethod: createDefaultFilterRender(), |
|||
renderItemContent: createFormItemRender(), |
|||
}; |
|||
@ -0,0 +1,18 @@ |
|||
import { getDatePickerCellValue } from './ADatePicker'; |
|||
import { |
|||
createEditRender, |
|||
createCellRender, |
|||
createFormItemRender, |
|||
createExportMethod, |
|||
} from './common'; |
|||
|
|||
export default { |
|||
renderEdit: createEditRender(), |
|||
renderCell: createCellRender(getDatePickerCellValue, () => { |
|||
return ['HH:mm:ss']; |
|||
}), |
|||
renderItemContent: createFormItemRender(), |
|||
exportMethod: createExportMethod(getDatePickerCellValue, () => { |
|||
return ['HH:mm:ss']; |
|||
}), |
|||
}; |
|||
@ -0,0 +1,35 @@ |
|||
import { VxeGlobalRendererHandles } from 'vxe-table'; |
|||
import XEUtils from 'xe-utils'; |
|||
import { |
|||
createEditRender, |
|||
createCellRender, |
|||
isEmptyValue, |
|||
createFormItemRender, |
|||
createExportMethod, |
|||
} from './common'; |
|||
|
|||
function getTreeSelectCellValue( |
|||
renderOpts: VxeGlobalRendererHandles.RenderOptions, |
|||
params: VxeGlobalRendererHandles.RenderCellParams | VxeGlobalRendererHandles.ExportMethodParams, |
|||
) { |
|||
const { props = {} } = renderOpts; |
|||
const { treeData, treeCheckable } = props; |
|||
const { row, column } = params; |
|||
const cellValue = XEUtils.get(row, column.field as string); |
|||
if (!isEmptyValue(cellValue)) { |
|||
return XEUtils.map(treeCheckable ? cellValue : [cellValue], (value) => { |
|||
const matchObj = XEUtils.findTree(treeData, (item: any) => item.value === value, { |
|||
children: 'children', |
|||
}); |
|||
return matchObj ? matchObj.item.title : value; |
|||
}).join(', '); |
|||
} |
|||
return cellValue; |
|||
} |
|||
|
|||
export default { |
|||
renderEdit: createEditRender(), |
|||
renderCell: createCellRender(getTreeSelectCellValue), |
|||
renderItemContent: createFormItemRender(), |
|||
exportMethod: createExportMethod(getTreeSelectCellValue), |
|||
}; |
|||
@ -0,0 +1,18 @@ |
|||
import { getDatePickerCellValue } from './ADatePicker'; |
|||
import { |
|||
createEditRender, |
|||
createCellRender, |
|||
createFormItemRender, |
|||
createExportMethod, |
|||
} from './common'; |
|||
|
|||
export default { |
|||
renderEdit: createEditRender(), |
|||
renderCell: createCellRender(getDatePickerCellValue, () => { |
|||
return ['YYYY-WW周']; |
|||
}), |
|||
renderItemContent: createFormItemRender(), |
|||
exportMethod: createExportMethod(getDatePickerCellValue, () => { |
|||
return ['YYYY-WW周']; |
|||
}), |
|||
}; |
|||
@ -0,0 +1,18 @@ |
|||
import { getDatePickerCellValue } from './ADatePicker'; |
|||
import { |
|||
createEditRender, |
|||
createCellRender, |
|||
createFormItemRender, |
|||
createExportMethod, |
|||
} from './common'; |
|||
|
|||
export default { |
|||
renderEdit: createEditRender(), |
|||
renderCell: createCellRender(getDatePickerCellValue, () => { |
|||
return ['YYYY']; |
|||
}), |
|||
renderItemContent: createFormItemRender(), |
|||
exportMethod: createExportMethod(getDatePickerCellValue, () => { |
|||
return ['YYYY']; |
|||
}), |
|||
}; |
|||
@ -0,0 +1,427 @@ |
|||
import { ComponentOptions, h } from 'vue'; |
|||
import { |
|||
FormItemContentRenderParams, |
|||
FormItemRenderOptions, |
|||
VxeGlobalRendererHandles, |
|||
} from 'vxe-table'; |
|||
import XEUtils from 'xe-utils'; |
|||
import { componentMap } from '../componentMap'; |
|||
import { ComponentType } from '../componentType'; |
|||
import { createPlaceholderMessage } from '../helper'; |
|||
|
|||
/** |
|||
* @description: 获取组件 |
|||
*/ |
|||
export function getComponent(componentName) { |
|||
const Component = componentMap.get(componentName as ComponentType); |
|||
if (!Component) throw `您还没注册此组件 ${componentName}`; |
|||
return Component as ComponentOptions; |
|||
} |
|||
|
|||
export function isEmptyValue(cellValue: any) { |
|||
return cellValue === null || cellValue === undefined || cellValue === ''; |
|||
} |
|||
|
|||
export function formatText(cellValue: any) { |
|||
return '' + (isEmptyValue(cellValue) ? '' : cellValue); |
|||
} |
|||
|
|||
export function cellText(cellValue: any): string[] { |
|||
return [formatText(cellValue)]; |
|||
} |
|||
|
|||
/** |
|||
* @description: 方法名转换 |
|||
*/ |
|||
export function getOnName(type: string) { |
|||
return 'on' + type.substring(0, 1).toLocaleUpperCase() + type.substring(1); |
|||
} |
|||
|
|||
/** |
|||
* @description: 获取组件传值所接受的属性 |
|||
*/ |
|||
function getModelKey(renderOpts: VxeGlobalRendererHandles.RenderOptions) { |
|||
let prop = 'value'; |
|||
switch (renderOpts.name) { |
|||
case 'ASwitch': |
|||
prop = 'checked'; |
|||
break; |
|||
} |
|||
return prop; |
|||
} |
|||
|
|||
/** |
|||
* @description: 回去双向更新的方法 |
|||
*/ |
|||
function getModelEvent(renderOpts: VxeGlobalRendererHandles.RenderOptions) { |
|||
let type = 'update:value'; |
|||
switch (renderOpts.name) { |
|||
case 'ASwitch': |
|||
type = 'update:checked'; |
|||
break; |
|||
} |
|||
return type; |
|||
} |
|||
|
|||
/** |
|||
* @description: chang值改变方法 |
|||
* @param {} |
|||
* @return {*} |
|||
* @author: * |
|||
*/ |
|||
function getChangeEvent() { |
|||
return 'change'; |
|||
} |
|||
|
|||
function getClickEvent() { |
|||
return 'click'; |
|||
} |
|||
/** |
|||
* @description: 获取方法 |
|||
* @param {} |
|||
* @return {*} |
|||
* @author: * |
|||
*/ |
|||
export function createEvents( |
|||
renderOpts: VxeGlobalRendererHandles.RenderOptions, |
|||
params: VxeGlobalRendererHandles.RenderParams, |
|||
inputFunc?: Function, |
|||
changeFunc?: Function, |
|||
clickFunc?: Function, |
|||
) { |
|||
const { events } = renderOpts; |
|||
const modelEvent = getModelEvent(renderOpts); |
|||
const changeEvent = getChangeEvent(); |
|||
const clickEvent = getClickEvent(); |
|||
const isSameEvent = changeEvent === modelEvent; |
|||
const ons: { [type: string]: Function } = {}; |
|||
|
|||
XEUtils.objectEach(events, (func: Function, key: string) => { |
|||
ons[getOnName(key)] = function (...args: any[]) { |
|||
func(params, ...args); |
|||
}; |
|||
}); |
|||
if (inputFunc) { |
|||
ons[getOnName(modelEvent)] = function (targetEvnt: any) { |
|||
inputFunc(targetEvnt); |
|||
if (events && events[modelEvent]) { |
|||
events[modelEvent](params, targetEvnt); |
|||
} |
|||
if (isSameEvent && changeFunc) { |
|||
changeFunc(targetEvnt); |
|||
} |
|||
}; |
|||
} |
|||
if (!isSameEvent && changeFunc) { |
|||
ons[getOnName(changeEvent)] = function (...args: any[]) { |
|||
changeFunc(...args); |
|||
if (events && events[changeEvent]) { |
|||
events[changeEvent](params, ...args); |
|||
} |
|||
}; |
|||
} |
|||
if (clickFunc) { |
|||
ons[getOnName(clickEvent)] = function (...args: any[]) { |
|||
clickFunc(...args); |
|||
if (events && events[clickEvent]) { |
|||
events[clickEvent](params, ...args); |
|||
} |
|||
}; |
|||
} |
|||
return ons; |
|||
} |
|||
|
|||
/** |
|||
* @description: 获取属性 |
|||
*/ |
|||
export function createProps( |
|||
renderOpts: VxeGlobalRendererHandles.RenderOptions, |
|||
value: any, |
|||
defaultProps?: { [prop: string]: any }, |
|||
) { |
|||
const name = renderOpts.name as ComponentType; |
|||
return XEUtils.assign( |
|||
{ |
|||
placeholder: createPlaceholderMessage(name), |
|||
allowClear: true, |
|||
}, |
|||
defaultProps, |
|||
renderOpts.props, |
|||
{ |
|||
[getModelKey(renderOpts)]: value, |
|||
}, |
|||
); |
|||
} |
|||
|
|||
/** |
|||
* @description: 创建单元格默认显示内容 |
|||
*/ |
|||
export function createDefaultRender( |
|||
defaultProps?: { [key: string]: any }, |
|||
callBack?: ( |
|||
renderOpts: VxeGlobalRendererHandles.RenderDefaultOptions, |
|||
params: VxeGlobalRendererHandles.RenderDefaultParams, |
|||
) => Record<string, any>, |
|||
) { |
|||
return function ( |
|||
renderOpts: VxeGlobalRendererHandles.RenderDefaultOptions, |
|||
params: VxeGlobalRendererHandles.RenderDefaultParams, |
|||
) { |
|||
const { row, column, $table } = params; |
|||
const { name, attrs } = renderOpts; |
|||
const cellValue = XEUtils.get(row, column.field as string); |
|||
const args = (callBack && callBack(renderOpts, params)) ?? {}; |
|||
|
|||
const Component = getComponent(name); |
|||
return [ |
|||
h(Component, { |
|||
...attrs, |
|||
...createProps(renderOpts, cellValue, defaultProps), |
|||
...args, |
|||
...createEvents( |
|||
renderOpts, |
|||
params, |
|||
(value: any) => XEUtils.set(row, column.field as string, value), |
|||
() => $table.updateStatus(params), |
|||
), |
|||
}), |
|||
]; |
|||
}; |
|||
} |
|||
|
|||
/** |
|||
* @description: 创建编辑单元格 |
|||
*/ |
|||
export function createEditRender( |
|||
defaultProps?: { [key: string]: any }, |
|||
callBack?: ( |
|||
renderOpts: VxeGlobalRendererHandles.RenderEditOptions, |
|||
params: VxeGlobalRendererHandles.RenderEditParams, |
|||
) => Record<string, any>, |
|||
) { |
|||
return function ( |
|||
renderOpts: VxeGlobalRendererHandles.RenderEditOptions, |
|||
params: VxeGlobalRendererHandles.RenderEditParams, |
|||
) { |
|||
const { row, column, $table } = params; |
|||
const { name, attrs } = renderOpts; |
|||
const cellValue = XEUtils.get(row, column.field as string); |
|||
const args = (callBack && callBack(renderOpts, params)) ?? {}; |
|||
|
|||
const Component = getComponent(name); |
|||
return [ |
|||
h(Component, { |
|||
...attrs, |
|||
...createProps(renderOpts, cellValue, defaultProps), |
|||
...args, |
|||
...createEvents( |
|||
renderOpts, |
|||
params, |
|||
(value: any) => XEUtils.set(row, column.field as string, value), |
|||
() => $table.updateStatus(params), |
|||
), |
|||
}), |
|||
]; |
|||
}; |
|||
} |
|||
|
|||
/** |
|||
* @description: 创建筛选渲染内容 |
|||
*/ |
|||
export function createFilterRender( |
|||
defaultProps?: { [key: string]: any }, |
|||
callBack?: ( |
|||
renderOpts: VxeGlobalRendererHandles.RenderFilterOptions, |
|||
params: VxeGlobalRendererHandles.RenderFilterParams, |
|||
) => Record<string, any>, |
|||
) { |
|||
return function ( |
|||
renderOpts: VxeGlobalRendererHandles.RenderFilterOptions, |
|||
params: VxeGlobalRendererHandles.RenderFilterParams, |
|||
) { |
|||
const { column } = params; |
|||
const { name, attrs } = renderOpts; |
|||
const args = (callBack && callBack(renderOpts, params)) ?? {}; |
|||
|
|||
const Component = getComponent(name); |
|||
return [ |
|||
h( |
|||
'div', |
|||
{ |
|||
class: 'vxe-table--filter-antd-wrapper', |
|||
}, |
|||
column.filters.map((option, oIndex) => { |
|||
const optionValue = option.data; |
|||
const checked = !!option.data; |
|||
|
|||
return h(Component, { |
|||
key: oIndex, |
|||
...attrs, |
|||
...createProps(renderOpts, optionValue, defaultProps), |
|||
...args, |
|||
...createEvents( |
|||
renderOpts, |
|||
params, |
|||
(value: any) => { |
|||
// 处理 model 值双向绑定
|
|||
option.data = value; |
|||
}, |
|||
() => { |
|||
// 处理 change 事件相关逻辑
|
|||
const { $panel } = params; |
|||
$panel.changeOption(null, checked, option); |
|||
}, |
|||
), |
|||
}); |
|||
}), |
|||
), |
|||
]; |
|||
}; |
|||
} |
|||
|
|||
/** |
|||
* @description: 默认过滤 |
|||
* @param {} |
|||
* @return {*} |
|||
* @author: * |
|||
*/ |
|||
|
|||
export function createDefaultFilterRender() { |
|||
return function (params: VxeGlobalRendererHandles.FilterMethodParams) { |
|||
const { option, row, column } = params; |
|||
const { data } = option; |
|||
const cellValue = XEUtils.get(row, column.field as string); |
|||
return cellValue === data; |
|||
}; |
|||
} |
|||
|
|||
/** |
|||
* @description: 创建 form表单渲染 |
|||
*/ |
|||
export function createFormItemRender( |
|||
defaultProps?: { [key: string]: any }, |
|||
callBack?: ( |
|||
renderOpts: FormItemRenderOptions, |
|||
params: FormItemContentRenderParams, |
|||
) => Record<string, any>, |
|||
) { |
|||
return function (renderOpts: FormItemRenderOptions, params: FormItemContentRenderParams) { |
|||
const args = (callBack && callBack(renderOpts, params)) ?? {}; |
|||
const { data, property, $form } = params; |
|||
const { name } = renderOpts; |
|||
const { attrs } = renderOpts; |
|||
const itemValue = XEUtils.get(data, property); |
|||
|
|||
const Component = getComponent(name); |
|||
return [ |
|||
h(Component, { |
|||
...attrs, |
|||
...createProps(renderOpts, itemValue, defaultProps), |
|||
...args, |
|||
...createEvents( |
|||
renderOpts, |
|||
params, |
|||
(value: any) => { |
|||
// 处理 model 值双向绑定
|
|||
XEUtils.set(data, property, value); |
|||
}, |
|||
() => { |
|||
// 处理 change 事件相关逻辑
|
|||
$form.updateStatus({ |
|||
...params, |
|||
field: property, |
|||
}); |
|||
}, |
|||
), |
|||
}), |
|||
]; |
|||
}; |
|||
} |
|||
|
|||
/** |
|||
* @description: cell渲染 |
|||
*/ |
|||
export function createCellRender( |
|||
getSelectCellValue: Function, |
|||
callBack?: ( |
|||
renderOpts: VxeGlobalRendererHandles.RenderCellOptions, |
|||
params: VxeGlobalRendererHandles.RenderCellParams, |
|||
) => Array<any>, |
|||
) { |
|||
return function ( |
|||
renderOpts: VxeGlobalRendererHandles.RenderCellOptions, |
|||
params: VxeGlobalRendererHandles.RenderCellParams, |
|||
) { |
|||
const args = (callBack && callBack(renderOpts, params)) ?? []; |
|||
const cellLabel = getSelectCellValue && getSelectCellValue(renderOpts, params, ...args); |
|||
const { placeholder } = renderOpts; |
|||
|
|||
return [ |
|||
h( |
|||
'span', |
|||
{ |
|||
class: 'vxe-cell--label', |
|||
}, |
|||
placeholder && isEmptyValue(cellLabel) |
|||
? [ |
|||
h( |
|||
'span', |
|||
{ |
|||
class: 'vxe-cell--placeholder', |
|||
}, |
|||
formatText(placeholder), |
|||
), |
|||
] |
|||
: formatText(cellLabel), |
|||
), |
|||
]; |
|||
}; |
|||
} |
|||
|
|||
/** |
|||
* @description: 创建 导出渲染 |
|||
* @param {} |
|||
* @return {*} |
|||
* @author: * |
|||
*/ |
|||
export function createExportMethod( |
|||
getExportCellValue: Function, |
|||
callBack?: (params: VxeGlobalRendererHandles.ExportMethodParams) => Array<any>, |
|||
) { |
|||
return function (params: VxeGlobalRendererHandles.ExportMethodParams) { |
|||
const { row, column, options } = params; |
|||
const args = (callBack && callBack(params)) ?? []; |
|||
return options && options.original |
|||
? XEUtils.get(row, column.field as string) |
|||
: getExportCellValue(column.editRender || column.cellRender, params, ...args); |
|||
}; |
|||
} |
|||
|
|||
/** |
|||
* @description: 创建单元格默认显示内容 |
|||
*/ |
|||
export function createToolbarToolRender( |
|||
defaultProps?: { [key: string]: any }, |
|||
callBack?: ( |
|||
renderOpts: VxeGlobalRendererHandles.RenderToolOptions, |
|||
params: VxeGlobalRendererHandles.RenderToolParams, |
|||
) => Record<string, any>, |
|||
) { |
|||
return function ( |
|||
renderOpts: VxeGlobalRendererHandles.RenderToolOptions, |
|||
params: VxeGlobalRendererHandles.RenderToolParams, |
|||
) { |
|||
const { name, attrs } = renderOpts; |
|||
const args = (callBack && callBack(renderOpts, params)) ?? {}; |
|||
|
|||
const Component = getComponent(name); |
|||
return [ |
|||
h(Component, { |
|||
...attrs, |
|||
...createProps(renderOpts, null, defaultProps), |
|||
...args, |
|||
...createEvents(renderOpts, params), |
|||
}), |
|||
]; |
|||
}; |
|||
} |
|||
@ -0,0 +1,112 @@ |
|||
import { VXETableCore, VxeGlobalInterceptorHandles } from 'vxe-table'; |
|||
import AAutoComplete from './AAutoComplete'; |
|||
import AInput from './AInput'; |
|||
import AInputNumber from './AInputNumber'; |
|||
import ASelect from './ASelect'; |
|||
import ACascader from './ACascader'; |
|||
import ADatePicker from './ADatePicker'; |
|||
import AMonthPicker from './AMonthPicker'; |
|||
import ARangePicker from './ARangePicker'; |
|||
import AWeekPicker from './AWeekPicker'; |
|||
import ATreeSelect from './ATreeSelect'; |
|||
import ATimePicker from './ATimePicker'; |
|||
import ARate from './ARate'; |
|||
import ASwitch from './ASwitch'; |
|||
import ARadioGroup from './ARadioGroup'; |
|||
import ACheckboxGroup from './ACheckboxGroup'; |
|||
import AButton from './AButton'; |
|||
import AButtonGroup from './AButtonGroup'; |
|||
import AApiSelect from './AApiSelect'; |
|||
import AEmpty from './AEmpty'; |
|||
import AInputSearch from './AInputSearch'; |
|||
import AYearPicker from './AYearPicker'; |
|||
|
|||
/** |
|||
* 检查触发源是否属于目标节点 |
|||
*/ |
|||
function getEventTargetNode(evnt: any, container: HTMLElement, className: string) { |
|||
let targetElem; |
|||
let target = evnt.target; |
|||
while (target && target.nodeType && target !== document) { |
|||
if ( |
|||
className && |
|||
target.className && |
|||
target.className.split && |
|||
target.className.split(' ').indexOf(className) > -1 |
|||
) { |
|||
targetElem = target; |
|||
} else if (target === container) { |
|||
return { flag: className ? !!targetElem : true, container, targetElem: targetElem }; |
|||
} |
|||
target = target.parentNode; |
|||
} |
|||
return { flag: false }; |
|||
} |
|||
|
|||
/** |
|||
* 事件兼容性处理 |
|||
*/ |
|||
function handleClearEvent( |
|||
params: |
|||
| VxeGlobalInterceptorHandles.InterceptorClearFilterParams |
|||
| VxeGlobalInterceptorHandles.InterceptorClearActivedParams |
|||
| VxeGlobalInterceptorHandles.InterceptorClearAreasParams, |
|||
) { |
|||
const { $event } = params; |
|||
const bodyElem = document.body; |
|||
if ( |
|||
// 下拉框
|
|||
getEventTargetNode($event, bodyElem, 'ant-select-dropdown').flag || |
|||
// 级联
|
|||
getEventTargetNode($event, bodyElem, 'ant-cascader-menus').flag || |
|||
// 日期
|
|||
getEventTargetNode($event, bodyElem, 'ant-calendar-picker-container').flag || |
|||
// 时间选择
|
|||
getEventTargetNode($event, bodyElem, 'ant-time-picker-panel').flag |
|||
) { |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 基于 vxe-table 表格的适配插件,用于兼容 ant-design-vue 组件库 |
|||
*/ |
|||
export const VXETablePluginAntd = { |
|||
install(vxetablecore: VXETableCore) { |
|||
const { interceptor, renderer } = vxetablecore; |
|||
|
|||
renderer.mixin({ |
|||
AAutoComplete, |
|||
AInput, |
|||
AInputNumber, |
|||
ASelect, |
|||
ACascader, |
|||
ADatePicker, |
|||
AMonthPicker, |
|||
ARangePicker, |
|||
AWeekPicker, |
|||
ATimePicker, |
|||
ATreeSelect, |
|||
ARate, |
|||
ASwitch, |
|||
ARadioGroup, |
|||
ACheckboxGroup, |
|||
AButton, |
|||
AButtonGroup, |
|||
AApiSelect, |
|||
AEmpty, |
|||
AInputSearch, |
|||
AYearPicker, |
|||
}); |
|||
|
|||
interceptor.add('event.clearFilter', handleClearEvent); |
|||
interceptor.add('event.clearActived', handleClearEvent); |
|||
interceptor.add('event.clearAreas', handleClearEvent); |
|||
}, |
|||
}; |
|||
|
|||
if (typeof window !== 'undefined' && window.VXETable && window.VXETable.use) { |
|||
window.VXETable.use(VXETablePluginAntd); |
|||
} |
|||
|
|||
export default VXETablePluginAntd; |
|||
@ -0,0 +1,4 @@ |
|||
/** |
|||
* @description: 传给vxe-table 时需要忽略的prop |
|||
*/ |
|||
export const ignorePropKeys = ['tableClass', 'tableStyle']; |
|||
@ -0,0 +1,8 @@ |
|||
*, |
|||
::before, |
|||
::after { |
|||
box-sizing: border-box; |
|||
border-width: 0; |
|||
border-style: solid; |
|||
border-color: initial; |
|||
} |
|||
@ -0,0 +1,105 @@ |
|||
%ResetBorder { |
|||
border: 0; |
|||
box-shadow: none; |
|||
} |
|||
|
|||
%CompWidth { |
|||
& > .ant-input, |
|||
& > .ant-input-number, |
|||
& > .ant-select, |
|||
& > .ant-cascader-picker, |
|||
& > .ant-calendar-picker, |
|||
& > .ant-time-picker { |
|||
width: 100%; |
|||
} |
|||
} |
|||
.vxe-form { |
|||
.vxe-form--item-content { |
|||
@extend %CompWidth; |
|||
} |
|||
} |
|||
.vxe-table--filter-antd-wrapper { |
|||
& > .ant-input, |
|||
& > .ant-input-number, |
|||
& > .ant-select, |
|||
& > .ant-rate { |
|||
width: 180px; |
|||
} |
|||
} |
|||
.vxe-cell, |
|||
.vxe-tree-cell { |
|||
@extend %CompWidth; |
|||
& > .ant-rate { |
|||
vertical-align: bottom; |
|||
.anticon-star { |
|||
display: block; |
|||
} |
|||
} |
|||
} |
|||
.col--valid-error { |
|||
& > .vxe-cell, |
|||
& > .vxe-tree-cell { |
|||
& > .ant-input, |
|||
& > .ant-select .ant-input, |
|||
& > .ant-select .ant-select-selection, |
|||
& > .ant-input-number, |
|||
& > .ant-cascader-picker .ant-cascader-input, |
|||
& > .ant-calendar-picker .ant-calendar-picker-input { |
|||
// border-color: $vxe-table-validate-error-color; |
|||
box-shadow: none; |
|||
} |
|||
} |
|||
} |
|||
.vxe-table.cell--highlight { |
|||
.vxe-cell, |
|||
.vxe-tree-cell { |
|||
& > .ant-input, |
|||
& > .ant-input-number { |
|||
padding: 0; |
|||
@extend %ResetBorder; |
|||
} |
|||
& > .ant-select { |
|||
.ant-input { |
|||
padding: 0; |
|||
@extend %ResetBorder; |
|||
} |
|||
} |
|||
& > .ant-input-number { |
|||
.ant-input-number-input { |
|||
padding: 0; |
|||
} |
|||
.ant-input-number-handler-wrap, |
|||
.ant-input-number-handler-down { |
|||
@extend %ResetBorder; |
|||
} |
|||
} |
|||
& > .ant-select { |
|||
.ant-select-selection { |
|||
@extend %ResetBorder; |
|||
.ant-select-selection__rendered { |
|||
margin: 0; |
|||
} |
|||
} |
|||
} |
|||
& > .ant-cascader-picker { |
|||
.ant-input { |
|||
@extend %ResetBorder; |
|||
} |
|||
.ant-cascader-picker-label { |
|||
padding: 0; |
|||
} |
|||
} |
|||
& > .ant-calendar-picker { |
|||
.ant-calendar-picker-input { |
|||
padding: 0; |
|||
@extend %ResetBorder; |
|||
} |
|||
} |
|||
& > .ant-time-picker { |
|||
.ant-time-picker-input { |
|||
padding: 0; |
|||
@extend %ResetBorder; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,6 @@ |
|||
@import './common.scss'; |
|||
@import './variable.scss'; |
|||
@import './scrollbar.scss'; |
|||
@import './toolbar.scss'; |
|||
@import './component.scss'; |
|||
@import 'vxe-table/styles/index.scss'; |
|||
@ -0,0 +1,24 @@ |
|||
.vxe-grid_scrollbar { |
|||
::-webkit-scrollbar { |
|||
width: 8px; |
|||
height: 8px; |
|||
} |
|||
::-webkit-scrollbar-track { |
|||
background-color: #ffffff; |
|||
} |
|||
::-webkit-scrollbar-thumb { |
|||
background-color: rgba(0, 0, 0, 0.1); |
|||
border-radius: 5px; |
|||
border: 1px solid #f1f1f1; |
|||
box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); |
|||
} |
|||
::-webkit-scrollbar-thumb:hover { |
|||
background-color: #a8a8a8; |
|||
} |
|||
::-webkit-scrollbar-thumb:active { |
|||
background-color: #a8a8a8; |
|||
} |
|||
::-webkit-scrollbar-corner { |
|||
background-color: #ffffff; |
|||
} |
|||
} |
|||
@ -0,0 +1,30 @@ |
|||
.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--footer { |
|||
display: flex; |
|||
} |
|||
|
|||
.vxe-toolbar .vxe-tools--wrapper, |
|||
.vxe-toolbar .vxe-tools--operate button:first-child { |
|||
margin: 0; |
|||
} |
|||
|
|||
.vxe-toolbar .vxe-tools--wrapper, |
|||
.vxe-toolbar .vxe-tools--operate .vxe-button { |
|||
margin-left: 1px; |
|||
border-radius: 0 !important; |
|||
} |
|||
|
|||
.vxe-toolbar .vxe-tools--wrapper, |
|||
.vxe-toolbar .vxe-tools--operate button:first-child { |
|||
margin-left: 10px; |
|||
} |
|||
|
|||
.vxe-toolbar .vxe-tools--wrapper, |
|||
.vxe-toolbar .vxe-tools--operate .vxe-custom--wrapper { |
|||
margin-left: 1px; |
|||
border-radius: 0 !important; |
|||
} |
|||
|
|||
.vxe-toolbar .vxe-tools--wrapper, |
|||
.vxe-toolbar .vxe-tools--operate .vxe-custom--wrapper .vxe-button { |
|||
margin-left: 1px; |
|||
} |
|||
@ -0,0 +1,6 @@ |
|||
$vxe-primary-color: rgb(9, 96, 189) !default; |
|||
$vxe-table-row-current-background-color: rgba(9, 96, 189, 0.3); |
|||
$vxe-table-row-hover-current-background-color: rgba(9, 96, 189, 0.2); |
|||
$vxe-table-column-hover-background-color: rgba(9, 96, 189, 0.3); |
|||
$vxe-table-column-current-background-color: rgba(9, 96, 189, 0.2); |
|||
$vxe-table-validate-error-color: #f56c6c; |
|||
@ -0,0 +1,17 @@ |
|||
import tableEmits from 'vxe-table/es/table/src/emits'; |
|||
|
|||
export const basicEmits = [ |
|||
...tableEmits, |
|||
'page-change', |
|||
'form-submit', |
|||
'form-submit-invalid', |
|||
'form-reset', |
|||
'form-collapse', |
|||
'form-toggle-collapse', |
|||
'toolbar-button-click', |
|||
'toolbar-tool-click', |
|||
'zoom', |
|||
|
|||
//... 如有缺少在此处追加
|
|||
// xxx
|
|||
]; |
|||
@ -0,0 +1,19 @@ |
|||
import { ComponentType } from './componentType'; |
|||
import { useI18n } from '/@/hooks/web/useI18n'; |
|||
|
|||
const { t } = useI18n(); |
|||
|
|||
/** |
|||
* @description: 生成placeholder |
|||
*/ |
|||
export function createPlaceholderMessage(component: ComponentType) { |
|||
if (!component) return; |
|||
if (component.includes('RangePicker')) { |
|||
return [t('common.chooseText'), t('common.chooseText')]; |
|||
} |
|||
if (component.includes('Input') || component.includes('Complete') || component.includes('Rate')) { |
|||
return t('common.inputText'); |
|||
} else { |
|||
return t('common.chooseText'); |
|||
} |
|||
} |
|||
@ -0,0 +1,131 @@ |
|||
import { GridMethods, TableMethods } from 'vxe-table'; |
|||
|
|||
export const gridComponentMethodKeys: (keyof GridMethods | keyof TableMethods)[] = [ |
|||
// vxe-grid 部分
|
|||
'dispatchEvent', |
|||
'commitProxy', |
|||
'getFormItems', |
|||
'getPendingRecords', |
|||
'zoom', |
|||
'isMaximized', |
|||
'maximize', |
|||
'revert', |
|||
'getProxyInfo', |
|||
|
|||
// vxe-table和vxe-grid公共部分
|
|||
'clearAll', |
|||
'syncData', |
|||
'updateData', |
|||
'loadData', |
|||
'reloadData', |
|||
'reloadRow', |
|||
'loadColumn', |
|||
'reloadColumn', |
|||
'getRowNode', |
|||
'getColumnNode', |
|||
'getRowIndex', |
|||
'getVTRowIndex', |
|||
'getVMRowIndex', |
|||
'getColumnIndex', |
|||
'getVTColumnIndex', |
|||
'getVMColumnIndex', |
|||
'createData', |
|||
'createRow', |
|||
'revertData', |
|||
'clearData', |
|||
'isInsertByRow', |
|||
'isUpdateByRow', |
|||
'getColumns', |
|||
'getColumnById', |
|||
'getColumnByField', |
|||
'getTableColumn', |
|||
'getData', |
|||
'getCheckboxRecords', |
|||
'getParentRow', |
|||
'getRowSeq', |
|||
'getRowById', |
|||
'getRowid', |
|||
'getTableData', |
|||
'hideColumn', |
|||
'showColumn', |
|||
'resetColumn', |
|||
'refreshColumn', |
|||
'refreshScroll', |
|||
'recalculate', |
|||
'closeTooltip', |
|||
'isAllCheckboxChecked', |
|||
'isAllCheckboxIndeterminate', |
|||
'getCheckboxIndeterminateRecords', |
|||
'setCheckboxRow', |
|||
'isCheckedByCheckboxRow', |
|||
'isIndeterminateByCheckboxRow', |
|||
'toggleCheckboxRow', |
|||
'setAllCheckboxRow', |
|||
'getRadioReserveRecord', |
|||
'clearRadioReserve', |
|||
'getCheckboxReserveRecords', |
|||
'clearCheckboxReserve', |
|||
'toggleAllCheckboxRow', |
|||
'clearCheckboxRow', |
|||
'setCurrentRow', |
|||
'isCheckedByRadioRow', |
|||
'setRadioRow', |
|||
'clearCurrentRow', |
|||
'clearRadioRow', |
|||
'getCurrentRecord', |
|||
'getRadioRecord', |
|||
'getCurrentColumn', |
|||
'setCurrentColumn', |
|||
'clearCurrentColumn', |
|||
'sort', |
|||
'clearSort', |
|||
'isSort', |
|||
'getSortColumns', |
|||
'closeFilter', |
|||
'isFilter', |
|||
'isRowExpandLoaded', |
|||
'clearRowExpandLoaded', |
|||
'reloadRowExpand', |
|||
'reloadRowExpand', |
|||
'toggleRowExpand', |
|||
'setAllRowExpand', |
|||
'setRowExpand', |
|||
'isExpandByRow', |
|||
'clearRowExpand', |
|||
'clearRowExpandReserve', |
|||
'getRowExpandRecords', |
|||
'getTreeExpandRecords', |
|||
'isTreeExpandLoaded', |
|||
'clearTreeExpandLoaded', |
|||
'reloadTreeExpand', |
|||
'reloadTreeChilds', |
|||
'toggleTreeExpand', |
|||
'setAllTreeExpand', |
|||
'setTreeExpand', |
|||
'isTreeExpandByRow', |
|||
'clearTreeExpand', |
|||
'clearTreeExpandReserve', |
|||
'getScroll', |
|||
'scrollTo', |
|||
'scrollToRow', |
|||
'scrollToColumn', |
|||
'clearScroll', |
|||
'updateFooter', |
|||
'updateStatus', |
|||
'setMergeCells', |
|||
'removeInsertRow', |
|||
'removeMergeCells', |
|||
'getMergeCells', |
|||
'clearMergeCells', |
|||
'setMergeFooterItems', |
|||
'removeMergeFooterItems', |
|||
'getMergeFooterItems', |
|||
'clearMergeFooterItems', |
|||
'openTooltip', |
|||
'focus', |
|||
'blur', |
|||
'connect', |
|||
|
|||
//... 如有缺少在此处追加
|
|||
// xxx
|
|||
]; |
|||
@ -0,0 +1,52 @@ |
|||
import { VxeGridPropTypes, VxeTablePropTypes } from 'vxe-table'; |
|||
import tableProps from 'vxe-table/es/table/src/props'; |
|||
import { CSSProperties } from 'vue'; |
|||
|
|||
/** |
|||
* @description: table二次开发需要后,需要接受的所有prop属性 |
|||
*/ |
|||
export const basicProps = { |
|||
...tableProps, |
|||
columns: Array as PropType<VxeGridPropTypes.Columns>, |
|||
pagerConfig: { |
|||
type: Object as PropType<VxeGridPropTypes.PagerConfig>, |
|||
default: () => ({}), |
|||
}, |
|||
proxyConfig: { |
|||
type: Object as PropType<VxeGridPropTypes.ProxyConfig>, |
|||
default: () => ({}), |
|||
}, |
|||
toolbarConfig: { |
|||
type: Object as PropType<VxeGridPropTypes.ToolbarConfig>, |
|||
default: () => ({}), |
|||
}, |
|||
formConfig: { |
|||
type: Object as PropType<VxeGridPropTypes.FormConfig>, |
|||
default: () => ({}), |
|||
}, |
|||
zoomConfig: { |
|||
type: Object as PropType<VxeGridPropTypes.ZoomConfig>, |
|||
default: () => ({}), |
|||
}, |
|||
printConfig: { |
|||
type: Object as PropType<VxeTablePropTypes.PrintConfig>, |
|||
default: () => ({}), |
|||
}, |
|||
exportConfig: { |
|||
type: Object as PropType<VxeTablePropTypes.ExportConfig>, |
|||
default: () => ({}), |
|||
}, |
|||
importConfig: { |
|||
type: Object as PropType<VxeTablePropTypes.ImportConfig>, |
|||
default: () => ({}), |
|||
}, |
|||
size: String as PropType<VxeGridPropTypes.Size>, |
|||
tableClass: { |
|||
type: String, |
|||
default: '', |
|||
}, |
|||
tableStyle: { |
|||
type: Object as PropType<CSSProperties>, |
|||
default: () => ({}), |
|||
}, |
|||
}; |
|||
@ -0,0 +1,4 @@ |
|||
import { VXETable } from '..'; |
|||
import componentSetting from '/@/settings/componentSetting'; |
|||
|
|||
VXETable.setup(componentSetting.vxeTable); |
|||
@ -0,0 +1,7 @@ |
|||
import { CSSProperties } from 'vue'; |
|||
import { VxeGridProps } from 'vxe-table'; |
|||
|
|||
export type BasicTableProps = VxeGridProps & { |
|||
tableClass?: string; |
|||
tableStyle?: CSSProperties; |
|||
}; |
|||
Loading…
Reference in new issue