|
|
@ -6,11 +6,11 @@ |
|
|
|
v-model:selected="table.selected" |
|
|
|
flat |
|
|
|
binary-state-sort |
|
|
|
selection="single" |
|
|
|
separator="cell" |
|
|
|
:no-data-label="table.noDataLabel" |
|
|
|
:loading-label="table.loadingLabel" |
|
|
|
v-bind="attrs" |
|
|
|
:selection="selectionComputed" |
|
|
|
separator="cell" |
|
|
|
:rows="table.rows" |
|
|
|
:columns="extractTableColumns" |
|
|
|
:rows-per-page-options="pagination.rowsPerPage && table.refHeightWidth.middleWidth > 600 ? table.pagination.rowsPerPageOptions : []" |
|
|
@ -30,15 +30,9 @@ |
|
|
|
<w-toolbar |
|
|
|
v-bind="toolbarConfigure" |
|
|
|
:buttons="buttons_" |
|
|
|
:grid-prop="{ |
|
|
|
gridSelected: table.selected, |
|
|
|
gridRefs: { |
|
|
|
gridRef: tableRef, |
|
|
|
queryFormRef: queryFormRef, |
|
|
|
addEditDialogRef: dialogRef, |
|
|
|
addEditFormRef: dialogFormRef, |
|
|
|
viewDrawerRef: drawerRef, |
|
|
|
}, |
|
|
|
:grid-props="{ |
|
|
|
selected: getSelectedRowsComputed, |
|
|
|
grid: instance, |
|
|
|
}" |
|
|
|
></w-toolbar> |
|
|
|
</div> |
|
|
@ -57,7 +51,7 @@ |
|
|
|
<template v-if="columnTitleState.columnTitleRowNum > 1"> |
|
|
|
<q-tr v-for="(r, rIndex) in columnTitleState.columnTitleArr" :key="rIndex"> |
|
|
|
<q-th |
|
|
|
v-if="rIndex === 0 && (!attrs.selection || attrs.selection === 'multiple')" |
|
|
|
v-if="rIndex === 0 && selectionComputed === 'multiple' && props.checkboxSelection && !props.tree" |
|
|
|
:rowspan="columnTitleState.columnTitleRowNum" |
|
|
|
:style="moreColumnTitleTableSelectionStyle" |
|
|
|
> |
|
|
@ -79,8 +73,10 @@ |
|
|
|
</template> |
|
|
|
<template v-else> |
|
|
|
<q-tr :props="scope"> |
|
|
|
<q-th v-if="attrs.selection || attrs.selection === 'multiple'" style="padding: 0; width: 50px"> <q-checkbox v-model="scope.selected" flat /></q-th> |
|
|
|
<q-th v-else-if="!attrs.selection || attrs.selection !== 'none'"></q-th> |
|
|
|
<q-th v-if="selectionComputed === 'multiple' && props.checkboxSelection && !props.tree" :style="props.tree ? '' : 'padding: 0; width: 50px'"> |
|
|
|
<q-checkbox v-model="scope.selected" flat |
|
|
|
/></q-th> |
|
|
|
<q-th v-else></q-th> |
|
|
|
<q-th v-for="col in scope.cols" :key="col.name" :props="scope" :style="col.style" :class="col.classes"> |
|
|
|
{{ col.label }} |
|
|
|
</q-th> |
|
|
@ -89,10 +85,16 @@ |
|
|
|
</template> |
|
|
|
<template #body="scope"> |
|
|
|
<template v-if="tree"> |
|
|
|
<TreeGridRow :props="scope" :columns-map="tableColumnsMap" @row-click="rowClick($el, scope.row, scope.rowIndex)"></TreeGridRow> |
|
|
|
<TreeGridRow |
|
|
|
:columns-map="tableColumnsMap" |
|
|
|
:row="scope.row" |
|
|
|
:cols="scope.cols" |
|
|
|
:checkbox-selection="props.checkboxSelection" |
|
|
|
:row-key="props.rowKey" |
|
|
|
></TreeGridRow> |
|
|
|
</template> |
|
|
|
<q-tr v-else :props="scope" @click="rowClick($el, scope.row, scope.rowIndex)" @dblclick="rowDbClick($el, scope.row, scope.rowIndex)"> |
|
|
|
<q-td v-if="!attrs.selection || attrs.selection !== 'none'" class="text-center" style="padding: 0; width: 50px"> |
|
|
|
<q-td v-if="props.checkboxSelection" class="text-center" style="padding: 0; width: 50px"> |
|
|
|
<q-checkbox v-model="scope.selected" flat /> |
|
|
|
</q-td> |
|
|
|
<template v-if="draggable"> |
|
|
@ -115,7 +117,7 @@ |
|
|
|
<component :is="col.value.componentType" v-bind="col.value.attrs"></component> |
|
|
|
</template> |
|
|
|
<template v-else> |
|
|
|
{{ col.value }} |
|
|
|
<span v-dompurify-html="col.value || ''"></span> |
|
|
|
</template> |
|
|
|
</q-td> |
|
|
|
</template> |
|
|
@ -128,7 +130,7 @@ |
|
|
|
<component :is="col.value.componentType" v-bind="col.value.attrs"></component> |
|
|
|
</template> |
|
|
|
<template v-else> |
|
|
|
{{ col.value }} |
|
|
|
<span v-dompurify-html="col.value || ''"></span> |
|
|
|
</template> |
|
|
|
</q-td> |
|
|
|
</template> |
|
|
@ -185,15 +187,15 @@ |
|
|
|
</w-dialog> |
|
|
|
<w-drawer ref="drawerRef" title="查看" v-bind="viewer.drawer"> |
|
|
|
<div class="p-2.5"> |
|
|
|
<w-info-panel v-bind="viewer.panel" :info="viewInfo.infoArray"></w-info-panel> |
|
|
|
<w-info-panel ref="infoRef" v-bind="viewer.panel" :info="viewInfo.infoArray"></w-info-panel> |
|
|
|
</div> |
|
|
|
</w-drawer> |
|
|
|
</div> |
|
|
|
</template> |
|
|
|
|
|
|
|
<script setup lang="ts"> |
|
|
|
import { ref, reactive, computed, onMounted, nextTick, toRaw, useAttrs } from 'vue'; |
|
|
|
import { axios, Environment, NotifyManager, TreeBuilder } from '@/platform'; |
|
|
|
import { ref, reactive, computed, onMounted, nextTick, toRaw, useAttrs, getCurrentInstance, provide } from 'vue'; |
|
|
|
import { axios, Environment, NotifyManager, TreeBuilder, VueTools } from '@/platform'; |
|
|
|
import { useQuasar, getCssVar, exportFile } from 'quasar'; |
|
|
|
import { IconEnum } from '@/platform/enums'; |
|
|
|
import { extractTableColumnsProps, arrayToMap, OperatorTypeEnum, isEmpty, PageStatusEnum } from '@/platform/components/utils'; |
|
|
@ -223,8 +225,10 @@ const props = defineProps({ |
|
|
|
denseBody: { type: Boolean, default: false }, // 表格行紧凑模式 |
|
|
|
sortNo: { type: Boolean, default: false }, // 是否显示排序号 |
|
|
|
leftColumnStickyNumber: { type: Number, default: 0 }, // 从左侧开始冻结列数,复选框与排序列不计算在内,目前支持1-10列。,暂时不提供了以后放到列属性中,参考el |
|
|
|
clickSelectedRow: { type: Boolean, default: true }, // 单击选中行,selection为'none'时无效。 |
|
|
|
checkboxSelection: { type: Boolean, default: true }, // checkbox选择模式,默认启用 |
|
|
|
tree: { type: Boolean, default: false }, // 树形表格模式,按照层级关系构建数据并以树形展现 |
|
|
|
treeExpand: { type: Boolean, default: false }, // 树形表格数据加载后是否全部展开 |
|
|
|
treeExpandChildren: { type: Boolean, default: false }, // 树形表格父节点被选中时是否展开所有的子节点 |
|
|
|
columns: { |
|
|
|
type: Array, |
|
|
|
default: () => { |
|
|
@ -356,6 +360,7 @@ const tableRef = ref(); |
|
|
|
const dialogRef = ref(); |
|
|
|
const drawerRef = ref(); |
|
|
|
const dialogFormRef = ref(); |
|
|
|
const infoRef = ref(); |
|
|
|
const tableColumnsMap = arrayToMap('name', props.columns); |
|
|
|
const queryFormFieldsMap = arrayToMap('name', props.queryFormFields); |
|
|
|
|
|
|
@ -444,15 +449,15 @@ const buttonObj = { |
|
|
|
return false; |
|
|
|
}, |
|
|
|
click: (selected, context) => { |
|
|
|
if (!table.selected || table.selected.length <= 0) { |
|
|
|
if (!selected || selected.length <= 0) { |
|
|
|
NotifyManager.warn('请选择要编辑的记录'); |
|
|
|
} else { |
|
|
|
dialogRef.value.show(); |
|
|
|
dialog.dialogTitle = '编辑'; |
|
|
|
nextTick(() => { |
|
|
|
dialogFormRef.value.setStatus(PageStatusEnum.编辑); |
|
|
|
dialogFormRef.value.setData(table.selected[0]); |
|
|
|
emit('editDialogOpenAfter', table.selected[0]); |
|
|
|
dialogFormRef.value.setData(selected[0]); |
|
|
|
emit('editDialogOpenAfter', selected[0]); |
|
|
|
}); |
|
|
|
} |
|
|
|
}, |
|
|
@ -468,14 +473,14 @@ const buttonObj = { |
|
|
|
return false; |
|
|
|
}, |
|
|
|
click: (selected, context) => { |
|
|
|
if (!table.selected || table.selected.length <= 0) { |
|
|
|
if (!selected || selected.length <= 0) { |
|
|
|
NotifyManager.warn('请选择要复制的记录'); |
|
|
|
} else { |
|
|
|
dialogRef.value.show(); |
|
|
|
dialog.dialogTitle = '复制'; |
|
|
|
nextTick(() => { |
|
|
|
dialogFormRef.value.setStatus(PageStatusEnum.新增); |
|
|
|
dialogFormRef.value.setData(table.selected[0]); |
|
|
|
dialogFormRef.value.setData(selected[0]); |
|
|
|
}); |
|
|
|
} |
|
|
|
}, |
|
|
@ -491,7 +496,7 @@ const buttonObj = { |
|
|
|
return false; |
|
|
|
}, |
|
|
|
click: (selected, context) => { |
|
|
|
if (!table.selected || table.selected.length <= 0) { |
|
|
|
if (!selected || selected.length <= 0) { |
|
|
|
NotifyManager.warn('请选择要删除的记录'); |
|
|
|
} else { |
|
|
|
$q.dialog({ |
|
|
@ -502,11 +507,11 @@ const buttonObj = { |
|
|
|
}).onOk(() => { |
|
|
|
let requestParams: any = { |
|
|
|
method: 'DELETE', |
|
|
|
url: (props.removeDataUrl ? props.removeDataUrl : props.dataUrl) + '/' + table.selected[0][props.rowKey], |
|
|
|
url: (props.removeDataUrl ? props.removeDataUrl : props.dataUrl) + '/' + selected[0][props.rowKey], |
|
|
|
}; |
|
|
|
if (props.templateGridId) { |
|
|
|
const data = <any>[]; |
|
|
|
table.selected.forEach((item) => { |
|
|
|
selected.forEach((item) => { |
|
|
|
data.push(item[props.rowKey]); |
|
|
|
}); |
|
|
|
requestParams = { |
|
|
@ -658,6 +663,7 @@ const table = reactive({ |
|
|
|
}, |
|
|
|
inFullscreen: false, // 表格当前是否为全屏模式 |
|
|
|
}); |
|
|
|
provide('table', table); |
|
|
|
|
|
|
|
const dialog = reactive({ |
|
|
|
dialogTitle: '新增', |
|
|
@ -822,6 +828,14 @@ const handlerMoreRowColumnTitle = () => { |
|
|
|
}); |
|
|
|
}; |
|
|
|
|
|
|
|
const selectionComputed = computed(() => { |
|
|
|
if (attrs.selection && attrs.selection === 'multiple') { |
|
|
|
return 'multiple'; |
|
|
|
} else { |
|
|
|
return 'single'; |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
const tableHeightComputed = computed(() => { |
|
|
|
// 浏览器可视区域高度 |
|
|
|
const screenHeight = $q.screen.height; |
|
|
@ -893,25 +907,24 @@ const tableFullscreenFun = (value) => { |
|
|
|
}; |
|
|
|
|
|
|
|
const rowClick = (evt: any, row: any, index: any) => { |
|
|
|
if (props.onRowClick) { |
|
|
|
if (props.clickSelectedRow && (!attrs.selection || attrs.selection !== 'none')) { |
|
|
|
rowClickFun(row); |
|
|
|
if (selectionComputed.value === 'multiple') { |
|
|
|
if (table.selected.findIndex((item) => item[props.rowKey] === row[props.rowKey]) < 0) { |
|
|
|
table.selected.push(row); |
|
|
|
} else { |
|
|
|
table.selected.splice( |
|
|
|
table.selected.findIndex((item) => item[props.rowKey] === row[props.rowKey]), |
|
|
|
1, |
|
|
|
); |
|
|
|
} |
|
|
|
emit('rowClick', evt, row, index); |
|
|
|
} else { |
|
|
|
rowClickFun(row); |
|
|
|
} |
|
|
|
}; |
|
|
|
const rowClickFun = (row: any) => { |
|
|
|
// 设置单击表格行选中记录 |
|
|
|
if (!attrs.selection || attrs.selection === 'single') { |
|
|
|
table.selected = []; |
|
|
|
table.selected.push(row); |
|
|
|
} else if (attrs.selection && attrs.selection === 'multiple') { |
|
|
|
table.selected = []; |
|
|
|
table.selected.push(row); |
|
|
|
} |
|
|
|
if (props.onRowClick) { |
|
|
|
emit('rowClick', evt, row, index); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
const rowDbClick = (evt, row, index) => { |
|
|
|
if (props.onRowDbClick) { |
|
|
|
emit('rowDbClick', evt, row, index); |
|
|
@ -957,7 +970,7 @@ const buildQueryCriterias = (reqParams) => { |
|
|
|
if (!isEmpty(queryFormData[item])) { |
|
|
|
const criteria = <CriteriaType>{ |
|
|
|
fieldName: item, |
|
|
|
operator: queryFormFieldsMap.get(item)?.hasOwnProperty.call('queryOperator') ? queryFormFieldsMap.get(item).queryOperator : OperatorTypeEnum.contains, |
|
|
|
operator: queryFormFieldsMap.get(item).queryOperator || OperatorTypeEnum.contains, |
|
|
|
value: queryFormData[item], |
|
|
|
}; |
|
|
|
urlSearchParams.append('criteria', JSON.stringify(criteria)); |
|
|
@ -1050,10 +1063,10 @@ const onRequest = async (ops: any) => { |
|
|
|
table.pagination.descending = ops.pagination.descending; |
|
|
|
table.rows = responseData.content; |
|
|
|
} else if (resp && resp.data && props.tree) { |
|
|
|
const treeData = TreeBuilder.build(resp.data); |
|
|
|
const treeRows = TreeBuilder.build(resp.data); |
|
|
|
table.pagination.rowsNumber = resp.data.length; |
|
|
|
console.info('treeData============', treeData); |
|
|
|
table.rows = treeData; |
|
|
|
table.pagination.rowsPerPage = 0; |
|
|
|
table.rows = treeRows; |
|
|
|
} |
|
|
|
stickyHeaderColumn(); |
|
|
|
}; |
|
|
@ -1064,8 +1077,8 @@ const save = async () => { |
|
|
|
const validate = await dialogFormRef.value.validate(); |
|
|
|
if (validate) { |
|
|
|
let dialogFormData = dialogFormRef.value.getData(); |
|
|
|
if (table.selected && table.selected.length > 0) { |
|
|
|
dialogFormData[props.rowKey] = table.selected[0][props.rowKey]; |
|
|
|
if (getSelectedRowsComputed.value && getSelectedRowsComputed.value.length > 0) { |
|
|
|
dialogFormData[props.rowKey] = getSelectedRowsComputed.value[0][props.rowKey]; |
|
|
|
} |
|
|
|
let submitFlag = true; |
|
|
|
emit('addEditDataSubmitBefore', dialogFormData, (handlerRequestParams: any | boolean) => { |
|
|
@ -1085,7 +1098,7 @@ const save = async () => { |
|
|
|
? props.addDataUrl |
|
|
|
? props.addDataUrl |
|
|
|
: props.dataUrl |
|
|
|
: (props.editDataUrl ? props.editDataUrl : props.dataUrl) + '/' + table.selected[0][props.rowKey], |
|
|
|
: (props.editDataUrl ? props.editDataUrl : props.dataUrl) + '/' + getSelectedRowsComputed.value[0][props.rowKey], |
|
|
|
}; |
|
|
|
if (props.templateGridId) { |
|
|
|
requestParams = { |
|
|
@ -1101,7 +1114,7 @@ const save = async () => { |
|
|
|
'/' + |
|
|
|
props.rowKey + |
|
|
|
'/' + |
|
|
|
table.selected[0][props.rowKey], |
|
|
|
getSelectedRowsComputed.value[0][props.rowKey], |
|
|
|
}; |
|
|
|
} |
|
|
|
dialog.dialogButtons[0].loading = false; |
|
|
@ -1127,20 +1140,20 @@ const save = async () => { |
|
|
|
} |
|
|
|
}; |
|
|
|
const onView = () => { |
|
|
|
if (!table.selected || table.selected.length <= 0) { |
|
|
|
if (!getSelectedRowsComputed.value || getSelectedRowsComputed.value.length <= 0) { |
|
|
|
NotifyManager.warn('请选择要查看的记录'); |
|
|
|
} else { |
|
|
|
viewInfo.infoArray = <any>[]; |
|
|
|
if (props.viewer.panel.fields && props.viewer.panel.fields.length > 0) { |
|
|
|
for (let item of props.viewer.panel.fields) { |
|
|
|
if (item.format) { |
|
|
|
viewInfo.infoArray.push({ label: item.label, value: item.format(table.selected[0][item.name]) }); |
|
|
|
viewInfo.infoArray.push({ label: item.label, value: item.format(getSelectedRowsComputed.value[0][item.name]) }); |
|
|
|
} else { |
|
|
|
let value = null; |
|
|
|
if (tableColumnsMap.get(item.name) && tableColumnsMap.get(item.name).format) { |
|
|
|
value = tableColumnsMap.get(item.name).format(table.selected[0][item.name]); |
|
|
|
value = tableColumnsMap.get(item.name).format(getSelectedRowsComputed.value[0][item.name]); |
|
|
|
} else { |
|
|
|
value = table.selected[0][item.name]; |
|
|
|
value = getSelectedRowsComputed.value[0][item.name]; |
|
|
|
} |
|
|
|
viewInfo.infoArray.push({ label: item.label, value: value }); |
|
|
|
} |
|
|
@ -1148,9 +1161,9 @@ const onView = () => { |
|
|
|
} else { |
|
|
|
for (let item of tableColumnsMap) { |
|
|
|
if (item[1].format) { |
|
|
|
viewInfo.infoArray.push({ label: item[1].label, value: item[1].format(table.selected[0][item[0]]) }); |
|
|
|
viewInfo.infoArray.push({ label: item[1].label, value: item[1].format(getSelectedRowsComputed.value[0][item[0]]) }); |
|
|
|
} else { |
|
|
|
viewInfo.infoArray.push({ label: item[1].label, value: table.selected[0][item[0]] }); |
|
|
|
viewInfo.infoArray.push({ label: item[1].label, value: getSelectedRowsComputed.value[0][item[0]] }); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -1186,7 +1199,7 @@ const replaceRow = (row) => { |
|
|
|
} |
|
|
|
}; |
|
|
|
// 删除选中数据 |
|
|
|
const deleteRows = (rows) => { |
|
|
|
const removeRows = (rows) => { |
|
|
|
rows.forEach((item) => { |
|
|
|
table.rows.splice( |
|
|
|
table.rows.findIndex((v) => { |
|
|
@ -1208,15 +1221,26 @@ const addRow = (row, index) => { |
|
|
|
stickyHeaderColumn(); |
|
|
|
}; |
|
|
|
|
|
|
|
const getSelectedRows = () => { |
|
|
|
return table.selected; |
|
|
|
const getSelectedRowsHandler = (arr, selectedRows) => { |
|
|
|
arr.forEach((item) => { |
|
|
|
if (table.selected.findIndex((tmp) => tmp[props.rowKey] === item[props.rowKey]) > -1) { |
|
|
|
selectedRows.push(item); |
|
|
|
} |
|
|
|
if (props.tree && item.children && item.children.length > 0) { |
|
|
|
getSelectedRowsHandler(item.children, selectedRows); |
|
|
|
} |
|
|
|
}); |
|
|
|
}; |
|
|
|
|
|
|
|
const getQueryFormRef = () => { |
|
|
|
return queryFormRef; |
|
|
|
}; |
|
|
|
const getAddEditFormRef = () => { |
|
|
|
return dialogFormRef; |
|
|
|
const getSelectedRowsComputed = computed(() => { |
|
|
|
const selectedRows = <any>[]; |
|
|
|
getSelectedRowsHandler(table.rows, selectedRows); |
|
|
|
return selectedRows; |
|
|
|
}); |
|
|
|
|
|
|
|
// 获得选择的所有记录 |
|
|
|
const getSelectedRows = () => { |
|
|
|
return getSelectedRowsComputed.value; |
|
|
|
}; |
|
|
|
|
|
|
|
const getRows = () => { |
|
|
@ -1326,10 +1350,7 @@ const stickyHeaderColumn = () => { |
|
|
|
}; |
|
|
|
|
|
|
|
const excludeColumnNum = computed(() => { |
|
|
|
let num = 0; |
|
|
|
if (!attrs.selection || attrs.selection !== 'none') { |
|
|
|
num += 1; |
|
|
|
} |
|
|
|
let num = 1; |
|
|
|
if (props.sortNo) { |
|
|
|
num += 1; |
|
|
|
} |
|
|
@ -1379,8 +1400,12 @@ const getStickyColumn = () => { |
|
|
|
const stickyColumnArr = getStickyColumn(); |
|
|
|
|
|
|
|
const moreColumnTitleTableSelectionStyle = computed(() => { |
|
|
|
if ((!attrs.selection || attrs.selection !== 'none') && props.leftColumnStickyNumber > 0) { |
|
|
|
return 'z-index: 3;position: sticky;left: 0px;'; |
|
|
|
if (props.leftColumnStickyNumber > 0) { |
|
|
|
if (props.tree) { |
|
|
|
return 'z-index: 3;position: sticky;left: 0px;'; |
|
|
|
} else { |
|
|
|
return 'z-index: 3;position: sticky;left: 0px;padding: 0; width: 50px;'; |
|
|
|
} |
|
|
|
} |
|
|
|
return ''; |
|
|
|
}); |
|
|
@ -1663,7 +1688,7 @@ const handlerQueryFormShowField = () => { |
|
|
|
table.queryFormFields.push(item); |
|
|
|
}); |
|
|
|
} else { |
|
|
|
const rowColsNum = queryFormRef.value.getRowColsNum() * (props.queryFormRowNum || 1); |
|
|
|
const rowColsNum = queryFormRef.value.getColsNum() * (props.queryFormRowNum || 1); |
|
|
|
let currRowColsNum = 0; |
|
|
|
props.queryFormFields.forEach((item) => { |
|
|
|
if (item.hasOwnProperty('colspan')) { |
|
|
@ -1692,17 +1717,39 @@ onMounted(() => { |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
const getQueryForm = () => { |
|
|
|
return queryFormRef.value; |
|
|
|
}; |
|
|
|
const getEditorDialog = () => { |
|
|
|
return dialogRef.value; |
|
|
|
}; |
|
|
|
const getEditorForm = () => { |
|
|
|
return dialogFormRef.value; |
|
|
|
}; |
|
|
|
const getViewerDrawer = () => { |
|
|
|
return drawerRef.value; |
|
|
|
}; |
|
|
|
const getViewerPanel = () => { |
|
|
|
return infoRef.value; |
|
|
|
}; |
|
|
|
|
|
|
|
defineExpose({ |
|
|
|
getSelectedRows, |
|
|
|
getRows, |
|
|
|
refresh, |
|
|
|
replaceRows, |
|
|
|
replaceRow, |
|
|
|
deleteRows, |
|
|
|
removeRows, |
|
|
|
addRow, |
|
|
|
getQueryFormRef, |
|
|
|
getAddEditFormRef, |
|
|
|
getQueryForm, |
|
|
|
getEditorDialog, |
|
|
|
getEditorForm, |
|
|
|
getViewerDrawer, |
|
|
|
getViewerPanel, |
|
|
|
}); |
|
|
|
|
|
|
|
const instance = getCurrentInstance(); |
|
|
|
VueTools.expose2Instance(instance); |
|
|
|
</script> |
|
|
|
|
|
|
|
<style scoped lang="css"> |
|
|
|