|
@ -3,7 +3,6 @@ |
|
|
<q-table |
|
|
<q-table |
|
|
ref="tableRef" |
|
|
ref="tableRef" |
|
|
v-model:pagination="state.pagination" |
|
|
v-model:pagination="state.pagination" |
|
|
v-model:selected="table.selected" |
|
|
|
|
|
flat |
|
|
flat |
|
|
binary-state-sort |
|
|
binary-state-sort |
|
|
:no-data-label="state.noDataLabel" |
|
|
:no-data-label="state.noDataLabel" |
|
@ -29,15 +28,7 @@ |
|
|
<div class="pt-2.5 flex flex-nowrap items-end"> |
|
|
<div class="pt-2.5 flex flex-nowrap items-end"> |
|
|
<div class="flex-none">{{ title }}</div> |
|
|
<div class="flex-none">{{ title }}</div> |
|
|
<div class="flex-1"> |
|
|
<div class="flex-1"> |
|
|
<w-toolbar |
|
|
<w-toolbar :dense="denseToolbarComputed" v-bind="toolbarConfigure" :buttons="buttons_" :grid="instance"></w-toolbar> |
|
|
:dense="denseToolbarComputed" |
|
|
|
|
|
v-bind="toolbarConfigure" |
|
|
|
|
|
:buttons="buttons_" |
|
|
|
|
|
:grid-props="{ |
|
|
|
|
|
selected: getSelectedRowsComputed, |
|
|
|
|
|
grid: instance, |
|
|
|
|
|
}" |
|
|
|
|
|
></w-toolbar> |
|
|
|
|
|
</div> |
|
|
</div> |
|
|
<div v-if="configButton" class="flex-none pl-1"> |
|
|
<div v-if="configButton" class="flex-none pl-1"> |
|
|
<q-btn round dense :size="denseToolbarComputed ? '13px' : '14px'" :icon="IconEnum.设置" unelevated outline> |
|
|
<q-btn round dense :size="denseToolbarComputed ? '13px' : '14px'" :icon="IconEnum.设置" unelevated outline> |
|
@ -102,11 +93,17 @@ |
|
|
</template> |
|
|
</template> |
|
|
<template #body="scope"> |
|
|
<template #body="scope"> |
|
|
<template v-if="tree"> |
|
|
<template v-if="tree"> |
|
|
<TreeGridRow :columns-map="tableColumnsMap" :row="scope.row" :cols="scope.cols" :grid-props="props" :row-key="rowKey_"></TreeGridRow> |
|
|
<TreeGridRow :columns-map="tableColumnsMap" :row="scope.row" :cols="scope.cols" :grid-props="props" :row-key="rowKey_" :grid="instance"></TreeGridRow> |
|
|
</template> |
|
|
</template> |
|
|
<q-tr v-else :props="scope" @click="rowClick($event, scope.row, scope.rowIndex)" @dblclick="rowDbClick($el, scope.row, scope.rowIndex)"> |
|
|
<q-tr |
|
|
|
|
|
v-else |
|
|
|
|
|
:class="scope.row[table.selectedField] ? 'selected' : ''" |
|
|
|
|
|
:props="scope" |
|
|
|
|
|
@click.stop="rowClick($event, scope.row, scope.rowIndex)" |
|
|
|
|
|
@dblclick.stop="rowDbClick($event, scope.row, scope.rowIndex)" |
|
|
|
|
|
> |
|
|
<q-td v-if="table.checkboxSelection" class="text-center" style="padding: 0; width: 50px"> |
|
|
<q-td v-if="table.checkboxSelection" class="text-center" style="padding: 0; width: 50px"> |
|
|
<q-checkbox v-model="scope.selected" flat :dense="denseBodyComputed" /> |
|
|
<q-checkbox v-model="scope.row[table.tickedField]" flat :dense="denseBodyComputed" @update:model-value="updateTicked($event, scope.row)" /> |
|
|
</q-td> |
|
|
</q-td> |
|
|
<template v-if="draggable"> |
|
|
<template v-if="draggable"> |
|
|
<q-td |
|
|
<q-td |
|
@ -247,10 +244,12 @@ const props = defineProps({ |
|
|
sortNo: { type: Boolean, default: false }, // 是否显示排序号 |
|
|
sortNo: { type: Boolean, default: false }, // 是否显示排序号 |
|
|
stickyNum: { type: Number, default: 0 }, // 从左侧开始冻结列数,复选框与排序列不计算在内,目前支持1-10列。,暂时不提供了以后放到列属性中,参考el |
|
|
stickyNum: { type: Number, default: 0 }, // 从左侧开始冻结列数,复选框与排序列不计算在内,目前支持1-10列。,暂时不提供了以后放到列属性中,参考el |
|
|
checkboxSelection: { type: Boolean, default: true }, // checkbox选择模式,默认启用 |
|
|
checkboxSelection: { type: Boolean, default: true }, // checkbox选择模式,默认启用 |
|
|
|
|
|
tickedField: { type: String, default: 'ticked' }, // 行数据中记录checkbox勾选状态的字段名 |
|
|
|
|
|
selectedField: { type: String, default: 'selected' }, // 行数据中记录行点击选中状态的字段名 |
|
|
tree: { type: Boolean, default: false }, // 树形表格模式,按照层级关系构建数据并以树形展现 |
|
|
tree: { type: Boolean, default: false }, // 树形表格模式,按照层级关系构建数据并以树形展现 |
|
|
treeIcon: { type: Function, default: undefined }, // 树形表格模式,图标函数,带有一个参数,行数据 |
|
|
treeIcon: { type: Function, default: undefined }, // 树形表格模式,图标函数,带有一个参数,行数据 |
|
|
treeExpand: { type: Boolean, default: false }, // 树形表格数据加载后是否全部展开 |
|
|
treeDefaultExpandAll: { type: Boolean, default: false }, // 树形表格模式,树形表格数据加载后是否全部展开 |
|
|
treeExpandChildren: { type: Boolean, default: false }, // 树形表格父节点被选中时是否展开所有的子节点 |
|
|
treeTickStrategy: { type: String, default: 'leaf' }, // 树形表格模式,树勾选策略,strict:节点自己,leaf:包含子节点 |
|
|
treeRelationship: { type: String, default: 'parent' }, // 树形表格模式的数据关系,包括:parent, children,当为parent时组件根据数据主键与数据外键构建树形数据,否则需要自己构建好树形数据放到children属性中。 |
|
|
treeRelationship: { type: String, default: 'parent' }, // 树形表格模式的数据关系,包括:parent, children,当为parent时组件根据数据主键与数据外键构建树形数据,否则需要自己构建好树形数据放到children属性中。 |
|
|
primaryKey: { type: String, default: 'id' }, // 数据主键(常规表格模式时,该字段可用作内置的编辑删除等功能对应的后端API入参,如:继承RestCrudController的update所需的入参。树形表格模式时,该字段为构建树数据的主键) |
|
|
primaryKey: { type: String, default: 'id' }, // 数据主键(常规表格模式时,该字段可用作内置的编辑删除等功能对应的后端API入参,如:继承RestCrudController的update所需的入参。树形表格模式时,该字段为构建树数据的主键) |
|
|
foreignKey: { type: String, default: 'parent' }, // 数据外键(常规表格模式时,该字段暂时无用,将来可用作多个表格的数据关系字段。树形表格模式时,该字段为构建树数据的关系字段) |
|
|
foreignKey: { type: String, default: 'parent' }, // 数据外键(常规表格模式时,该字段暂时无用,将来可用作多个表格的数据关系字段。树形表格模式时,该字段为构建树数据的关系字段) |
|
@ -327,26 +326,24 @@ const props = defineProps({ |
|
|
}, |
|
|
}, |
|
|
onRowClick: { |
|
|
onRowClick: { |
|
|
type: Function, |
|
|
type: Function, |
|
|
default: null, |
|
|
default: undefined, |
|
|
}, // 监听使用,不要传递覆盖!!! |
|
|
}, |
|
|
onRowDbClick: { |
|
|
onRowDbClick: { |
|
|
type: Function, |
|
|
type: Function, |
|
|
default: null, |
|
|
default: undefined, |
|
|
}, // 监听使用,不要传递覆盖!!! |
|
|
}, |
|
|
|
|
|
onUpdateTicked: { |
|
|
|
|
|
type: Function, |
|
|
|
|
|
default: undefined, |
|
|
|
|
|
}, |
|
|
}); |
|
|
}); |
|
|
const emit = defineEmits<{ |
|
|
const emit = defineEmits<{ |
|
|
( |
|
|
// 行点击事件 |
|
|
e: 'rowClick', // 行点击事件 |
|
|
(e: 'rowClick', evt: Event, row: any, index: number): void; |
|
|
evt: Event, // 第一个参数,JS 事件对象 |
|
|
// 行双击事件 |
|
|
row: any, // 第二个参数, 点击的行对象 |
|
|
(e: 'rowDbClick', evt: Event, row: any, index: number): void; |
|
|
index: number, // 第三个参数, 当前页中行的索引 |
|
|
// 行数据checkbox勾选状态改变事件 |
|
|
): void; |
|
|
(e: 'updateTicked', evt: Event, row: any): void; |
|
|
( |
|
|
|
|
|
e: 'rowDbClick', // 行双击事件 |
|
|
|
|
|
evt: Event, // 第一个参数,JS 事件对象 |
|
|
|
|
|
row: any, // 第二个参数, 点击的行对象 |
|
|
|
|
|
index: number, // 第三个参数, 当前页中行的索引 |
|
|
|
|
|
): void; |
|
|
|
|
|
( |
|
|
( |
|
|
e: 'requestDataBefore', // 表格请求数据前触发事件 |
|
|
e: 'requestDataBefore', // 表格请求数据前触发事件 |
|
|
requestParams: URLSearchParams | any, // 第一个参数,请求参数 |
|
|
requestParams: URLSearchParams | any, // 第一个参数,请求参数 |
|
@ -395,9 +392,7 @@ const dialogFormRef = ref(); |
|
|
const infoRef = ref(); |
|
|
const infoRef = ref(); |
|
|
const tableColumnsMap = arrayToMap('name', props.columns); |
|
|
const tableColumnsMap = arrayToMap('name', props.columns); |
|
|
const queryFormFieldsMap = arrayToMap('name', props.queryFormFields); |
|
|
const queryFormFieldsMap = arrayToMap('name', props.queryFormFields); |
|
|
const rowKey_ = '_rowKey_'; |
|
|
const rowKey_ = '_rowKey_'; // 行数据中前端附加的UUID字段名 |
|
|
const selected_ = '_selected_'; |
|
|
|
|
|
const ticked_ = '_ticked_'; |
|
|
|
|
|
const url = { |
|
|
const url = { |
|
|
dataUrl: props.dataUrl, |
|
|
dataUrl: props.dataUrl, |
|
|
fetchDataUrl: props.fetchDataUrl, |
|
|
fetchDataUrl: props.fetchDataUrl, |
|
@ -406,6 +401,47 @@ const url = { |
|
|
removeDataUrl: props.removeDataUrl, |
|
|
removeDataUrl: props.removeDataUrl, |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
const extractTableColumns = extractTableColumnsProps(props); |
|
|
|
|
|
// 多表头插槽传入的 props 处理 |
|
|
|
|
|
const titleScopeHandler = (column: any, scope: any) => { |
|
|
|
|
|
if (extractTableColumns && extractTableColumns.length > 0) { |
|
|
|
|
|
const i = extractTableColumns.findIndex((item) => item.name === column.name); |
|
|
|
|
|
if (i > -1) { |
|
|
|
|
|
return scope; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return undefined; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
const table = reactive({ |
|
|
|
|
|
tickedField: props.tickedField, |
|
|
|
|
|
selectedField: props.selectedField, |
|
|
|
|
|
spaceHeight: 4, |
|
|
|
|
|
gridConfig: false, |
|
|
|
|
|
stickyNum: props.stickyNum, |
|
|
|
|
|
columns: extractTableColumns, |
|
|
|
|
|
treeExpand: props.treeDefaultExpandAll, |
|
|
|
|
|
checkboxSelection: props.checkboxSelection, |
|
|
|
|
|
sortNo: props.sortNo, |
|
|
|
|
|
dense: props.dense !== undefined ? props.dense : false, |
|
|
|
|
|
denseToolbar: props.denseToolbar !== undefined ? props.denseToolbar : false, |
|
|
|
|
|
denseHeader: props.denseHeader !== undefined ? props.denseHeader : false, |
|
|
|
|
|
denseBody: props.denseBody !== undefined ? props.denseBody : false, |
|
|
|
|
|
denseBottom: props.denseBottom !== undefined ? props.denseBottom : false, |
|
|
|
|
|
queryFormFields: [], |
|
|
|
|
|
moreQueryStatus: false, // 当前更多查询状态是否激活 |
|
|
|
|
|
rows: <any>[], |
|
|
|
|
|
inFullscreen: false, // 表格当前是否为全屏模式 |
|
|
|
|
|
}); |
|
|
|
|
|
provide('table', table); |
|
|
|
|
|
|
|
|
|
|
|
const expandIcon = computed(() => { |
|
|
|
|
|
return table.treeExpand ? 'expand_less' : 'expand_more'; |
|
|
|
|
|
}); |
|
|
|
|
|
const expandLabel = computed(() => { |
|
|
|
|
|
return table.treeExpand ? '收起所有节点' : '展开所有节点'; |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 内置按钮枚举 |
|
|
* 内置按钮枚举 |
|
|
*/ |
|
|
*/ |
|
@ -421,6 +457,9 @@ enum ButtonEnum { |
|
|
removeAll = 'removeAll', //删除全部 |
|
|
removeAll = 'removeAll', //删除全部 |
|
|
view = 'view', //查看 |
|
|
view = 'view', //查看 |
|
|
export = 'export', //导出 |
|
|
export = 'export', //导出 |
|
|
|
|
|
addTop = 'addTop', // 新增顶级节点 |
|
|
|
|
|
addChild = 'addChild', // 新增子节点 |
|
|
|
|
|
expand = 'expand', // 展开?收起 所有节点 |
|
|
} |
|
|
} |
|
|
/** |
|
|
/** |
|
|
* 内置按钮 |
|
|
* 内置按钮 |
|
@ -431,7 +470,7 @@ const buttonObj = { |
|
|
name: ButtonEnum.query, |
|
|
name: ButtonEnum.query, |
|
|
icon: IconEnum.查询, |
|
|
icon: IconEnum.查询, |
|
|
label: '查询', |
|
|
label: '查询', |
|
|
click: (selected, context) => { |
|
|
click: () => { |
|
|
refresh(); |
|
|
refresh(); |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
}, |
|
@ -446,7 +485,7 @@ const buttonObj = { |
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
click: (selected, context) => { |
|
|
click: () => { |
|
|
table.moreQueryStatus = !table.moreQueryStatus; |
|
|
table.moreQueryStatus = !table.moreQueryStatus; |
|
|
handlerQueryFormShowField(); |
|
|
handlerQueryFormShowField(); |
|
|
}, |
|
|
}, |
|
@ -455,7 +494,7 @@ const buttonObj = { |
|
|
name: ButtonEnum.reset, |
|
|
name: ButtonEnum.reset, |
|
|
icon: IconEnum.重置, |
|
|
icon: IconEnum.重置, |
|
|
label: '重置', |
|
|
label: '重置', |
|
|
click: (selected, context) => { |
|
|
click: () => { |
|
|
queryFormRef.value.reset(); |
|
|
queryFormRef.value.reset(); |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
}, |
|
@ -463,7 +502,7 @@ const buttonObj = { |
|
|
name: ButtonEnum.refresh, |
|
|
name: ButtonEnum.refresh, |
|
|
icon: IconEnum.刷新, |
|
|
icon: IconEnum.刷新, |
|
|
label: '刷新', |
|
|
label: '刷新', |
|
|
click: (selected, context) => { |
|
|
click: () => { |
|
|
refresh(); |
|
|
refresh(); |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
}, |
|
@ -471,7 +510,7 @@ const buttonObj = { |
|
|
name: ButtonEnum.add, |
|
|
name: ButtonEnum.add, |
|
|
icon: IconEnum.新增, |
|
|
icon: IconEnum.新增, |
|
|
label: '新增', |
|
|
label: '新增', |
|
|
click: (selected, context) => { |
|
|
click: () => { |
|
|
dialog.dialogTitle = '新增'; |
|
|
dialog.dialogTitle = '新增'; |
|
|
dialogRef.value.show(); |
|
|
dialogRef.value.show(); |
|
|
nextTick(() => { |
|
|
nextTick(() => { |
|
@ -484,13 +523,13 @@ const buttonObj = { |
|
|
name: ButtonEnum.edit, |
|
|
name: ButtonEnum.edit, |
|
|
icon: IconEnum.编辑, |
|
|
icon: IconEnum.编辑, |
|
|
label: '编辑', |
|
|
label: '编辑', |
|
|
enableIf: (selected) => { |
|
|
enableIf: (selected, ticked, grid) => { |
|
|
if (selected && selected.length > 0) { |
|
|
if (selected && selected.length > 0) { |
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
return false; |
|
|
return false; |
|
|
}, |
|
|
}, |
|
|
click: (selected, context) => { |
|
|
click: (selected) => { |
|
|
if (!selected || selected.length <= 0) { |
|
|
if (!selected || selected.length <= 0) { |
|
|
NotifyManager.warn('请选择要编辑的记录'); |
|
|
NotifyManager.warn('请选择要编辑的记录'); |
|
|
} else { |
|
|
} else { |
|
@ -514,7 +553,7 @@ const buttonObj = { |
|
|
} |
|
|
} |
|
|
return false; |
|
|
return false; |
|
|
}, |
|
|
}, |
|
|
click: (selected, context) => { |
|
|
click: (selected) => { |
|
|
if (!selected || selected.length <= 0) { |
|
|
if (!selected || selected.length <= 0) { |
|
|
NotifyManager.warn('请选择要复制的记录'); |
|
|
NotifyManager.warn('请选择要复制的记录'); |
|
|
} else { |
|
|
} else { |
|
@ -531,8 +570,10 @@ const buttonObj = { |
|
|
name: ButtonEnum.remove, |
|
|
name: ButtonEnum.remove, |
|
|
icon: IconEnum.删除, |
|
|
icon: IconEnum.删除, |
|
|
label: '删除', |
|
|
label: '删除', |
|
|
enableIf: (selected) => { |
|
|
enableIf: (selected, ticked, grid) => { |
|
|
if (selected && selected.length > 0) { |
|
|
if (ticked && ticked.length > 0) { |
|
|
|
|
|
return true; |
|
|
|
|
|
} else if (selected && selected.length > 0) { |
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
return false; |
|
|
return false; |
|
@ -553,7 +594,6 @@ const buttonObj = { |
|
|
}; |
|
|
}; |
|
|
axios(requestParams) |
|
|
axios(requestParams) |
|
|
.then((resp) => { |
|
|
.then((resp) => { |
|
|
table.selected = []; |
|
|
|
|
|
NotifyManager.info('操作成功'); |
|
|
NotifyManager.info('操作成功'); |
|
|
onRequest({ pagination: state.pagination }); |
|
|
onRequest({ pagination: state.pagination }); |
|
|
}) |
|
|
}) |
|
@ -576,7 +616,7 @@ const buttonObj = { |
|
|
return false; |
|
|
return false; |
|
|
}, |
|
|
}, |
|
|
click: (selected, context) => { |
|
|
click: (selected, context) => { |
|
|
onView(); |
|
|
view(); |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
export: { |
|
|
export: { |
|
@ -605,6 +645,55 @@ const buttonObj = { |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
|
|
|
addTop: { |
|
|
|
|
|
name: ButtonEnum.addTop, |
|
|
|
|
|
icon: IconEnum.新增, |
|
|
|
|
|
label: '新增顶级节点', |
|
|
|
|
|
click: (selected, context) => { |
|
|
|
|
|
dialog.dialogTitle = '新增顶级节点'; |
|
|
|
|
|
dialogRef.value.show(); |
|
|
|
|
|
nextTick(() => { |
|
|
|
|
|
dialogFormRef.value.setStatus('addTop'); |
|
|
|
|
|
emit('addDialogOpenAfter'); |
|
|
|
|
|
}); |
|
|
|
|
|
}, |
|
|
|
|
|
}, |
|
|
|
|
|
addChild: { |
|
|
|
|
|
name: ButtonEnum.addChild, |
|
|
|
|
|
icon: 'playlist_add', |
|
|
|
|
|
label: '新增子节点', |
|
|
|
|
|
enableIf: (selected) => { |
|
|
|
|
|
if (selected && selected.length > 0) { |
|
|
|
|
|
return true; |
|
|
|
|
|
} |
|
|
|
|
|
return false; |
|
|
|
|
|
}, |
|
|
|
|
|
click: (selected, context) => { |
|
|
|
|
|
dialog.dialogTitle = '新增子节点'; |
|
|
|
|
|
dialogRef.value.show(); |
|
|
|
|
|
nextTick(() => { |
|
|
|
|
|
dialogFormRef.value.setStatus('addChild'); |
|
|
|
|
|
emit('addDialogOpenAfter'); |
|
|
|
|
|
}); |
|
|
|
|
|
}, |
|
|
|
|
|
}, |
|
|
|
|
|
expand: { |
|
|
|
|
|
name: ButtonEnum.expand, |
|
|
|
|
|
icon: expandIcon.value, |
|
|
|
|
|
label: expandLabel.value, |
|
|
|
|
|
click: (selected, context) => { |
|
|
|
|
|
expandFun(table.rows, table.treeExpand); |
|
|
|
|
|
table.treeExpand = !table.treeExpand; |
|
|
|
|
|
}, |
|
|
|
|
|
}, |
|
|
|
|
|
}; |
|
|
|
|
|
const expandFun = (arr, treeExpand) => { |
|
|
|
|
|
arr.forEach((item) => { |
|
|
|
|
|
if (props.tree && item.children && item.children.length > 0) { |
|
|
|
|
|
item.expand = !treeExpand; |
|
|
|
|
|
expandFun(item.children, treeExpand); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
// 处理toobar |
|
|
// 处理toobar |
|
@ -641,39 +730,6 @@ props.toolbarActions.forEach((btn, index) => { |
|
|
} |
|
|
} |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
const extractTableColumns = extractTableColumnsProps(props); |
|
|
|
|
|
// 多表头插槽传入的 props 处理 |
|
|
|
|
|
const titleScopeHandler = (column: any, scope: any) => { |
|
|
|
|
|
if (extractTableColumns && extractTableColumns.length > 0) { |
|
|
|
|
|
const i = extractTableColumns.findIndex((item) => item.name === column.name); |
|
|
|
|
|
if (i > -1) { |
|
|
|
|
|
return scope; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return undefined; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
const table = reactive({ |
|
|
|
|
|
selected: <any>[], |
|
|
|
|
|
ticked: <any>[], |
|
|
|
|
|
spaceHeight: 4, |
|
|
|
|
|
gridConfig: false, |
|
|
|
|
|
stickyNum: props.stickyNum, |
|
|
|
|
|
columns: extractTableColumns, |
|
|
|
|
|
checkboxSelection: props.checkboxSelection, |
|
|
|
|
|
sortNo: props.sortNo, |
|
|
|
|
|
dense: props.dense !== undefined ? props.dense : false, |
|
|
|
|
|
denseToolbar: props.denseToolbar !== undefined ? props.denseToolbar : false, |
|
|
|
|
|
denseHeader: props.denseHeader !== undefined ? props.denseHeader : false, |
|
|
|
|
|
denseBody: props.denseBody !== undefined ? props.denseBody : false, |
|
|
|
|
|
denseBottom: props.denseBottom !== undefined ? props.denseBottom : false, |
|
|
|
|
|
queryFormFields: [], |
|
|
|
|
|
moreQueryStatus: false, // 当前更多查询状态是否激活 |
|
|
|
|
|
rows: <any>[], |
|
|
|
|
|
inFullscreen: false, // 表格当前是否为全屏模式 |
|
|
|
|
|
}); |
|
|
|
|
|
provide('table', table); |
|
|
|
|
|
|
|
|
|
|
|
const denseToolbarComputed = computed(() => { |
|
|
const denseToolbarComputed = computed(() => { |
|
|
if (table.denseToolbar) { |
|
|
if (table.denseToolbar) { |
|
|
return true; |
|
|
return true; |
|
@ -996,20 +1052,28 @@ const tableFullscreenFun = (value) => { |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
const rowClick = (evt: any, row: any, index: any) => { |
|
|
const rowClick = (evt: any, row: any, index: any) => { |
|
|
|
|
|
// 非树形表格行点击选中与checkbox绑定,即行选中时checkbox也勾选,checkbox勾选时行选中。 |
|
|
if (!evt.ctrlKey) { |
|
|
if (!evt.ctrlKey) { |
|
|
table.selected = []; |
|
|
cleanSelected(); |
|
|
|
|
|
cleanTicked(); |
|
|
} |
|
|
} |
|
|
table.selected.push(row); |
|
|
row[table.selectedField] = true; |
|
|
|
|
|
row[table.tickedField] = true; |
|
|
if (props.onRowClick) { |
|
|
if (props.onRowClick) { |
|
|
emit('rowClick', evt, row, index); |
|
|
emit('rowClick', evt, row, index); |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
const rowDbClick = (evt, row, index) => { |
|
|
const rowDbClick = (evt, row, index) => { |
|
|
if (props.onRowDbClick) { |
|
|
if (props.onRowDbClick) { |
|
|
emit('rowDbClick', evt, row, index); |
|
|
emit('rowDbClick', evt, row, index); |
|
|
} else { |
|
|
} else { |
|
|
onView(); |
|
|
view(); |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
const updateTicked = (evt: Event, row: any) => { |
|
|
|
|
|
row[table.selectedField] = row[table.tickedField]; |
|
|
|
|
|
if (props.onUpdateTicked) { |
|
|
|
|
|
emit('updateTicked', evt, row); |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
@ -1158,9 +1222,13 @@ const onRequest = async (ops: any) => { |
|
|
|
|
|
|
|
|
const addRowKey = (rows: []) => { |
|
|
const addRowKey = (rows: []) => { |
|
|
if (rows && rows.length > 0) { |
|
|
if (rows && rows.length > 0) { |
|
|
rows.forEach((item) => { |
|
|
rows.forEach((item: any) => { |
|
|
item[rowKey_] = Tools.uuid(); |
|
|
item[rowKey_] = Tools.uuid(); |
|
|
item['_']; |
|
|
item[table.tickedField] = item[table.tickedField] || false; |
|
|
|
|
|
item[table.selectedField] = item[table.selectedField] || false; |
|
|
|
|
|
if (props.tree) { |
|
|
|
|
|
item['expand'] = false; |
|
|
|
|
|
} |
|
|
if (props.tree && item.children && item.children.length > 0) { |
|
|
if (props.tree && item.children && item.children.length > 0) { |
|
|
addRowKey(item.children); |
|
|
addRowKey(item.children); |
|
|
} |
|
|
} |
|
@ -1174,7 +1242,7 @@ const save = async () => { |
|
|
const validate = await dialogFormRef.value.validate(); |
|
|
const validate = await dialogFormRef.value.validate(); |
|
|
if (validate) { |
|
|
if (validate) { |
|
|
let dialogFormData = dialogFormRef.value.getData(); |
|
|
let dialogFormData = dialogFormRef.value.getData(); |
|
|
if (getSelectedRowsComputed.value && getSelectedRowsComputed.value.length > 0) { |
|
|
if (formStatus === PageStatusEnum.编辑 && getSelectedRowsComputed.value && getSelectedRowsComputed.value.length > 0) { |
|
|
dialogFormData[props.primaryKey] = getSelectedRowsComputed.value[0][props.primaryKey]; |
|
|
dialogFormData[props.primaryKey] = getSelectedRowsComputed.value[0][props.primaryKey]; |
|
|
} |
|
|
} |
|
|
let submitFlag = true; |
|
|
let submitFlag = true; |
|
@ -1186,12 +1254,17 @@ const save = async () => { |
|
|
} |
|
|
} |
|
|
}); |
|
|
}); |
|
|
if (submitFlag) { |
|
|
if (submitFlag) { |
|
|
|
|
|
if (formStatus === 'addTop') { |
|
|
|
|
|
dialogFormData[props.foreignKey] = null; |
|
|
|
|
|
} else if (formStatus === 'addChild') { |
|
|
|
|
|
dialogFormData[props.foreignKey] = getSelectedRowsComputed.value[0][props.primaryKey]; |
|
|
|
|
|
} |
|
|
let requestParams = { |
|
|
let requestParams = { |
|
|
method: formStatus === PageStatusEnum.新增 ? 'POST' : 'PUT', |
|
|
method: formStatus === PageStatusEnum.新增 || formStatus === 'addTop' || formStatus === 'addChild' ? 'POST' : 'PUT', |
|
|
headers: { 'content-type': 'application/json;charset=utf-8;' }, |
|
|
headers: { 'content-type': 'application/json;charset=utf-8;' }, |
|
|
data: dialogFormData, |
|
|
data: dialogFormData, |
|
|
url: |
|
|
url: |
|
|
formStatus === PageStatusEnum.新增 |
|
|
formStatus === PageStatusEnum.新增 || formStatus === 'addTop' || formStatus === 'addChild' |
|
|
? url.addDataUrl |
|
|
? url.addDataUrl |
|
|
? url.addDataUrl |
|
|
? url.addDataUrl |
|
|
: url.dataUrl |
|
|
: url.dataUrl |
|
@ -1205,7 +1278,6 @@ const save = async () => { |
|
|
NotifyManager.info('操作成功'); |
|
|
NotifyManager.info('操作成功'); |
|
|
dialogRef.value.hide(); |
|
|
dialogRef.value.hide(); |
|
|
onRequest({ pagination: state.pagination }); |
|
|
onRequest({ pagination: state.pagination }); |
|
|
table.selected = []; |
|
|
|
|
|
}) |
|
|
}) |
|
|
.catch((error) => { |
|
|
.catch((error) => { |
|
|
console.info('error====', error); |
|
|
console.info('error====', error); |
|
@ -1219,7 +1291,7 @@ const save = async () => { |
|
|
dialog.dialogButtons[0].loading = false; |
|
|
dialog.dialogButtons[0].loading = false; |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|
const onView = () => { |
|
|
const view = () => { |
|
|
if (!getSelectedRowsComputed.value || getSelectedRowsComputed.value.length <= 0) { |
|
|
if (!getSelectedRowsComputed.value || getSelectedRowsComputed.value.length <= 0) { |
|
|
NotifyManager.warn('请选择要查看的记录'); |
|
|
NotifyManager.warn('请选择要查看的记录'); |
|
|
} else { |
|
|
} else { |
|
@ -1320,34 +1392,34 @@ const addRow = (row, index) => { |
|
|
stickyHeaderColumn(); |
|
|
stickyHeaderColumn(); |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
const getSelectedRowsHandler = (arr, selectedRows) => { |
|
|
const getSelectRowsByFieldName = (arr, selectedRows, fieldName) => { |
|
|
arr.forEach((item) => { |
|
|
arr.forEach((item) => { |
|
|
if (table.selected.findIndex((tmp) => tmp[rowKey_] === item[rowKey_]) > -1) { |
|
|
if (item[fieldName]) { |
|
|
selectedRows.push(item); |
|
|
selectedRows.push(item); |
|
|
} |
|
|
} |
|
|
if (props.tree && item.children && item.children.length > 0) { |
|
|
if (props.tree && item.children && item.children.length > 0) { |
|
|
getSelectedRowsHandler(item.children, selectedRows); |
|
|
getSelectRowsByFieldName(item.children, selectedRows, fieldName); |
|
|
} |
|
|
} |
|
|
}); |
|
|
}); |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
const getSelectedRowsComputed = computed(() => { |
|
|
const getSelectedRowsComputed = computed(() => { |
|
|
const selectedRows = <any>[]; |
|
|
return getSelectedRows(); |
|
|
getSelectedRowsHandler(table.rows, selectedRows); |
|
|
|
|
|
return selectedRows; |
|
|
|
|
|
}); |
|
|
}); |
|
|
|
|
|
const getTickedRowsComputed = computed(() => { |
|
|
// 获得选中的所有记录 |
|
|
return getTickedRows(); |
|
|
|
|
|
}); |
|
|
|
|
|
// 获得行选中的所有记录 |
|
|
const getSelectedRows = () => { |
|
|
const getSelectedRows = () => { |
|
|
if (props.tree) { |
|
|
const selectedRows = []; |
|
|
return getSelectedRowsComputed.value; |
|
|
getSelectRowsByFieldName(table.rows, selectedRows, table.selectedField); |
|
|
} else { |
|
|
return toRaw(selectedRows); |
|
|
return getSelectedRowsComputed.value; |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
}; |
|
|
// 获得勾选的所有记录 |
|
|
// 获得checkbox勾选的所有记录 |
|
|
const getTickedRows = () => { |
|
|
const getTickedRows = () => { |
|
|
return getSelectedRowsComputed.value; |
|
|
const tickedRows = []; |
|
|
|
|
|
getSelectRowsByFieldName(table.rows, tickedRows, table.tickedField); |
|
|
|
|
|
return toRaw(tickedRows); |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
const getRows = () => { |
|
|
const getRows = () => { |
|
@ -1915,6 +1987,24 @@ const setEditDataUrl = (url_) => { |
|
|
const setRemoveDataUrl = (url_) => { |
|
|
const setRemoveDataUrl = (url_) => { |
|
|
url.removeDataUrl = url_; |
|
|
url.removeDataUrl = url_; |
|
|
}; |
|
|
}; |
|
|
|
|
|
// 清空行选中记录 |
|
|
|
|
|
const cleanSelected = (arr = table.rows) => { |
|
|
|
|
|
arr.forEach((item) => { |
|
|
|
|
|
item[table.selectedField] = false; |
|
|
|
|
|
if (props.tree && item.children && item.children.length > 0) { |
|
|
|
|
|
cleanSelected(item.children); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
}; |
|
|
|
|
|
// 清空checkbox勾选记录 |
|
|
|
|
|
const cleanTicked = (arr = table.rows) => { |
|
|
|
|
|
arr.forEach((item) => { |
|
|
|
|
|
item[table.tickedField] = false; |
|
|
|
|
|
if (props.tree && item.children && item.children.length > 0) { |
|
|
|
|
|
cleanTicked(item.children); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
defineExpose({ |
|
|
defineExpose({ |
|
|
getSelectedRows, |
|
|
getSelectedRows, |
|
@ -1938,6 +2028,9 @@ defineExpose({ |
|
|
setEditDataUrl, |
|
|
setEditDataUrl, |
|
|
setRemoveDataUrl, |
|
|
setRemoveDataUrl, |
|
|
stickyHeaderColumn, |
|
|
stickyHeaderColumn, |
|
|
|
|
|
cleanSelected, |
|
|
|
|
|
cleanTicked, |
|
|
|
|
|
view, |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
const instance = getCurrentInstance(); |
|
|
const instance = getCurrentInstance(); |
|
|