|
|
@@ -19,16 +19,16 @@ const props = withDefaults(
|
|
|
autoSearch?: boolean //参数变动时自动查询(深监听)
|
|
|
data?: Array<any>
|
|
|
total?: number //总数
|
|
|
- selectedItems?: Array<any>
|
|
|
+ selectedIds?: Array<any>
|
|
|
scroll?: Scroll
|
|
|
currentPage?: number //当前页数
|
|
|
//itemsPerPage?: number //每页数量
|
|
|
pageArray?: Array<number> //下拉选择每页数量
|
|
|
pageDropdown?: boolean //是否下拉选择
|
|
|
- hasCheckbox?: boolean //是否有选择框
|
|
|
checkboxField?: string //选择框字段
|
|
|
checkMultiple?: boolean //是否多选
|
|
|
checkPageMultiple?: boolean //是否跨页多选
|
|
|
+ hasCheckbox?: boolean //是否有选择框 (checkMultiple 和 checkPageMultiple 为true 时不起作用)
|
|
|
rowClickFun?: (r: any) => void
|
|
|
sortField?: string //排序字段
|
|
|
sortOrder?: "asc" | "desc"
|
|
|
@@ -54,6 +54,9 @@ const props = withDefaults(
|
|
|
keyField?: string
|
|
|
parentField?: string
|
|
|
childrenField?: string
|
|
|
+ leafField?: string
|
|
|
+ isLazy?: boolean
|
|
|
+ rootId?: string
|
|
|
searchFormRowItems?: Array<VbFormRowItem>
|
|
|
searchFormItems?: Array<VbFormItem>
|
|
|
searchFormSpan?: number
|
|
|
@@ -63,26 +66,6 @@ const props = withDefaults(
|
|
|
showRightColumnBtn?: boolean //是否显示右边toolbar的选择列按钮
|
|
|
customSearchFun?: () => void
|
|
|
resetSearchFormFun?: () => void
|
|
|
- // btnCreatePerm?: string
|
|
|
- // btnEditPerm?: string
|
|
|
- // btnDeletePerm?: string
|
|
|
- // btnImportPerm?: string
|
|
|
- // btnExportPerm?: string
|
|
|
- // btnCreateShow?: boolean
|
|
|
- // btnEditShow?: boolean
|
|
|
- // btnDeleteShow?: boolean
|
|
|
- // btnImportShow?: boolean
|
|
|
- // btnExportShow?: boolean
|
|
|
- // btnCreateFun?: () => void
|
|
|
- // btnEditFun?: () => void
|
|
|
- // btnDeleteFun?: () => void
|
|
|
- // btnImportFun?: () => void
|
|
|
- // btnExportFun?: () => void
|
|
|
- // btnCreateDisabledFun?: (selectedRows: number) => boolean
|
|
|
- // btnEditDisabledFun?: (selectedRows: number) => boolean
|
|
|
- // btnDeleteDisabledFun?: (selectedRows: number) => boolean
|
|
|
- // btnImportDisabledFun?: (selectedRows: number) => boolean
|
|
|
- // btnExportDisabledFun?: (selectedRows: number) => boolean
|
|
|
modal?: any
|
|
|
formData?: any
|
|
|
resetFormFun?: () => void
|
|
|
@@ -100,19 +83,18 @@ const props = withDefaults(
|
|
|
{
|
|
|
currentPage: 1,
|
|
|
method: "get",
|
|
|
- selectedItems: () => {
|
|
|
+ selectedIds: () => {
|
|
|
return []
|
|
|
},
|
|
|
queryParams: {},
|
|
|
total: 0,
|
|
|
- //itemsPerPage: 10,
|
|
|
pageDropdown: true,
|
|
|
pageArray: () => {
|
|
|
return [10, 25, 50]
|
|
|
},
|
|
|
initSearch: true,
|
|
|
autoSearch: false,
|
|
|
- hasCheckbox: true,
|
|
|
+ hasCheckbox: false,
|
|
|
checkMultiple: false,
|
|
|
sortOrder: "asc",
|
|
|
pagination: true,
|
|
|
@@ -139,13 +121,13 @@ const props = withDefaults(
|
|
|
}
|
|
|
)
|
|
|
const emits = defineEmits<{
|
|
|
- (e: "update:selectedItems", v: Array<any>): void
|
|
|
+ (e: "update:selectedIds", v: Array<any>): void
|
|
|
(e: "update:currentPage", v: number): void
|
|
|
(e: "update:formData", v: any): void
|
|
|
(e: "page-change", v: number): void
|
|
|
(e: "on-items-per-page-change", v: number): void
|
|
|
(e: "on-sort", v: Sort): void
|
|
|
- (e: "on-items-change", isChecked: boolean, v: any, row: any): void
|
|
|
+ (e: "on-items-change", isChecked: boolean, selectedValue: string, row: any): void
|
|
|
(e: "on-items-select", row: any): void
|
|
|
(e: "on-items-all-change", isChecked: boolean, rows: Array<any>): void
|
|
|
}>()
|
|
|
@@ -153,19 +135,11 @@ const id = ref("")
|
|
|
const checkboxField = ref(props.checkboxField ? props.checkboxField : props.header[0].field)
|
|
|
const currentPage = ref(props.currentPage)
|
|
|
const itemsInTable = ref(props.pagination ? props.pageArray[0] : 1000)
|
|
|
-const selectedItems = ref(props.selectedItems)
|
|
|
+const selectedIds = ref(props.selectedIds)
|
|
|
const remoteTotal = ref<number>(0)
|
|
|
const remoteData = ref<Array<any>>([])
|
|
|
const { data, queryParams, loading } = toRefs(props)
|
|
|
const tableLoading = ref(false)
|
|
|
-// const _loading: WritableComputedRef<boolean> = computed({
|
|
|
-// get(): boolean {
|
|
|
-// return loading.value || tableLoading.value
|
|
|
-// },
|
|
|
-// set(value: boolean): void {
|
|
|
-// tableLoading.value = value
|
|
|
-// },
|
|
|
-// })
|
|
|
const _loading = computed(() => {
|
|
|
return loading.value || tableLoading.value
|
|
|
})
|
|
|
@@ -209,7 +183,7 @@ const pageChange = (page: number) => {
|
|
|
emits("update:currentPage", page)
|
|
|
emits("page-change", page)
|
|
|
currentPage.value = page
|
|
|
- remote()
|
|
|
+ query()
|
|
|
}
|
|
|
const onSort = (sort: Sort) => {
|
|
|
if (sort.order) {
|
|
|
@@ -220,14 +194,14 @@ const onSort = (sort: Sort) => {
|
|
|
delete queryParams.value.isAsc
|
|
|
}
|
|
|
emits("on-sort", sort)
|
|
|
- remote()
|
|
|
+ query()
|
|
|
}
|
|
|
const onSelectAll = (isChecked: boolean, rows: Array<any>) => {
|
|
|
emits("on-items-all-change", isChecked, rows)
|
|
|
}
|
|
|
-const onItemChange = (isChecked: boolean, v: any, row: any) => {
|
|
|
- emits("update:selectedItems", selectedItems.value)
|
|
|
- emits("on-items-change", isChecked, v, row)
|
|
|
+const onItemChange = (isChecked: boolean, selectedValue: string, row: any) => {
|
|
|
+ emits("update:selectedIds", selectedIds.value)
|
|
|
+ emits("on-items-change", isChecked, selectedValue, row)
|
|
|
if (isChecked) {
|
|
|
emits("on-items-select", row)
|
|
|
}
|
|
|
@@ -236,13 +210,16 @@ const onItemsPerPageChange = (v: number) => {
|
|
|
allData.value = []
|
|
|
emits("on-items-per-page-change", v)
|
|
|
}
|
|
|
-// const onItemSelect = (selectedItems: any) => {
|
|
|
-// emits("on-items-select", selectedItems)
|
|
|
-// }
|
|
|
-
|
|
|
-function remote() {
|
|
|
- tableLoading.value = true
|
|
|
+let treeData: any = []
|
|
|
+let treeAllData: any = []
|
|
|
+function query() {
|
|
|
remoteData.value = []
|
|
|
+ treeData = []
|
|
|
+ treeAllData = []
|
|
|
+ remote(props.isLazy ? props.rootId : undefined)
|
|
|
+}
|
|
|
+
|
|
|
+function remote(id?: string) {
|
|
|
const params = props.noPage
|
|
|
? queryParams.value
|
|
|
: Object.assign(
|
|
|
@@ -253,12 +230,31 @@ function remote() {
|
|
|
},
|
|
|
queryParams.value
|
|
|
)
|
|
|
- const queryParam = props.method.toLocaleLowerCase() == "get" ? { params } : { data: params }
|
|
|
+ let curData: any = {}
|
|
|
+ if (props.isLazy) {
|
|
|
+ curData = treeAllData.find((v: any) => {
|
|
|
+ return v[checkboxField.value] == id
|
|
|
+ })
|
|
|
+ if (!id && !curData) {
|
|
|
+ throw new Error("懒加载模式,未获取到 parentId ,请检查")
|
|
|
+ }
|
|
|
+ if (curData?.children && curData?.children.length) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (!props.keyField) {
|
|
|
+ throw new Error("懒加载模式,请配置 keyField")
|
|
|
+ }
|
|
|
+ params[props.keyField] = id
|
|
|
+ }
|
|
|
+ tableLoading.value = true
|
|
|
+
|
|
|
if (props.remoteFun) {
|
|
|
props.remoteFun(params).then((res: any) => {
|
|
|
processData(res.rows || res.data, res.total)
|
|
|
})
|
|
|
} else if (props.url) {
|
|
|
+ const queryParam = props.method.toLocaleLowerCase() == "get" ? { params } : { data: params }
|
|
|
+
|
|
|
const configs = Object.assign(
|
|
|
{ url: props.url, method: props.method, successAlert: false },
|
|
|
props.configs,
|
|
|
@@ -272,10 +268,22 @@ function remote() {
|
|
|
tableLoading.value = false
|
|
|
})
|
|
|
}
|
|
|
+
|
|
|
function processData(data: any, total: number) {
|
|
|
- remoteData.value = data
|
|
|
remoteTotal.value = total || 0
|
|
|
tableLoading.value = false
|
|
|
+ if (props.isLazy) {
|
|
|
+ if (curData) {
|
|
|
+ curData.children = data
|
|
|
+ treeAllData.push(...curData.children)
|
|
|
+ } else {
|
|
|
+ treeData.push(...data)
|
|
|
+ treeAllData.push(...treeData)
|
|
|
+ }
|
|
|
+ remoteData.value = JSON.parse(JSON.stringify(treeData))
|
|
|
+ } else {
|
|
|
+ remoteData.value = data
|
|
|
+ }
|
|
|
if (props.checkPageMultiple) {
|
|
|
remoteData.value.forEach((v: any) => {
|
|
|
if (
|
|
|
@@ -289,12 +297,17 @@ function remote() {
|
|
|
} else {
|
|
|
allData.value = remoteData.value
|
|
|
}
|
|
|
+
|
|
|
nextTick(bindEvent)
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+function lazyLoad(id: string) {
|
|
|
+ return remote(id)
|
|
|
+}
|
|
|
+
|
|
|
const defaultHandleFuns = {
|
|
|
handleCreate: () => {
|
|
|
- console.log("TC")
|
|
|
props.resetFormFun && props.resetFormFun()
|
|
|
if (props.modal) {
|
|
|
props.modal.show()
|
|
|
@@ -307,8 +320,6 @@ const defaultHandleFuns = {
|
|
|
if (!row) {
|
|
|
return
|
|
|
}
|
|
|
- console.log("TU", e, row)
|
|
|
-
|
|
|
if (props.getEntiyFun) {
|
|
|
props.getEntiyFun(row[checkboxField.value]).then((res) => {
|
|
|
emits("update:formData", res.data)
|
|
|
@@ -318,7 +329,8 @@ const defaultHandleFuns = {
|
|
|
}
|
|
|
})
|
|
|
} else {
|
|
|
- emits("update:formData", row)
|
|
|
+ const _row = Object.assign({}, row)
|
|
|
+ emits("update:formData", _row)
|
|
|
if (props.modal) {
|
|
|
props.modal.show()
|
|
|
props.modal.changePrefixTitle("修改")
|
|
|
@@ -326,7 +338,6 @@ const defaultHandleFuns = {
|
|
|
}
|
|
|
},
|
|
|
handleDelete: (e?: any, rows?: any) => {
|
|
|
- console.log("TD")
|
|
|
rows = rows || getSelecteds()
|
|
|
if (!rows) {
|
|
|
return
|
|
|
@@ -409,7 +420,7 @@ function loadHandleBtns() {
|
|
|
|
|
|
function search() {
|
|
|
table.value.reset()
|
|
|
- remote()
|
|
|
+ query()
|
|
|
}
|
|
|
function bindEvent() {
|
|
|
if (props.rowClickFun) {
|
|
|
@@ -430,7 +441,7 @@ function bindEvent() {
|
|
|
}
|
|
|
}
|
|
|
function getSelectedIds() {
|
|
|
- return selectedItems.value
|
|
|
+ return selectedIds.value
|
|
|
}
|
|
|
function getSelected() {
|
|
|
const items = getSelecteds()
|
|
|
@@ -438,7 +449,7 @@ function getSelected() {
|
|
|
}
|
|
|
function getSelecteds() {
|
|
|
const selectedArr: Array<any> = []
|
|
|
- selectedItems.value.forEach((v) => {
|
|
|
+ selectedIds.value.forEach((v) => {
|
|
|
const item = allData.value.find((vv: any) => {
|
|
|
return vv[checkboxField.value] == v
|
|
|
})
|
|
|
@@ -460,7 +471,6 @@ function customSearch() {
|
|
|
watch(
|
|
|
() => itemsInTable.value,
|
|
|
(val) => {
|
|
|
- //console.log("WATCH_I")
|
|
|
currentPage.value = 1
|
|
|
emits("on-items-per-page-change", val)
|
|
|
search()
|
|
|
@@ -470,8 +480,6 @@ watch(
|
|
|
watch(
|
|
|
() => props.queryParams,
|
|
|
(val) => {
|
|
|
- //console.log("WATCH_Q")
|
|
|
-
|
|
|
currentPage.value = 1
|
|
|
queryParams.value = val
|
|
|
search()
|
|
|
@@ -481,18 +489,7 @@ watch(
|
|
|
deep: props.autoSearch,
|
|
|
}
|
|
|
)
|
|
|
-// watch(table, (val) => {
|
|
|
-// if (val) {
|
|
|
-// if (props.scroll?.x) {
|
|
|
-// val.value.style.width = Number(props.scroll.x) ? props.scroll.x + "px" : props.scroll.x
|
|
|
-// val.value.style.overflowX = "auto"
|
|
|
-// }
|
|
|
-// if (props.scroll?.y) {
|
|
|
-// val.value.style.height = Number(props.scroll.y) ? props.scroll.y + "px" : props.scroll.y
|
|
|
-// val.value.style.overflowY = "auto"
|
|
|
-// }
|
|
|
-// }
|
|
|
-// })
|
|
|
+
|
|
|
function init() {
|
|
|
id.value = Math.floor(Math.random() * 999999999) + ""
|
|
|
loadHandleBtns()
|
|
|
@@ -503,31 +500,12 @@ function init() {
|
|
|
bindEvent()
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
onMounted(init)
|
|
|
defineExpose({ search, getSelectedIds, getSelected, getSelecteds, getData, defaultHandleFuns })
|
|
|
</script>
|
|
|
|
|
|
<template>
|
|
|
- <!-- :btnCreateShow="btnCreateShow"
|
|
|
- :btnEditShow="btnEditShow"
|
|
|
- :btnDeleteShow="btnDeleteShow"
|
|
|
- :btnImportShow="btnImportShow"
|
|
|
- :btnExportShow="btnExportShow"
|
|
|
- :btnCreatePerm="btnCreatePerm"
|
|
|
- :btnEditPerm="btnEditPerm"
|
|
|
- :btnDeletePerm="btnDeletePerm"
|
|
|
- :btnImportPerm="btnImportPerm"
|
|
|
- :btnExportPerm="btnExportPerm"
|
|
|
- :btnCreateFun="btnCreateFun"
|
|
|
- :btnEditFun="btnEditFun"
|
|
|
- :btnDeleteFun="btnDeleteFun"
|
|
|
- :btnImportFun="btnImportFun"
|
|
|
- :btnExportFun="btnExportFun"
|
|
|
- :btnCreateDisabledFun="btnCreateDisabledFun"
|
|
|
- :btnEditDisabledFun="btnEditDisabledFun"
|
|
|
- :btnDeleteDisabledFun="btnDeleteDisabledFun"
|
|
|
- :btnImportDisabledFun="btnImportDisabledFun"
|
|
|
- :btnExportDisabledFun="btnExportDisabledFun" -->
|
|
|
<div
|
|
|
class="vb-table"
|
|
|
:id="id"
|
|
|
@@ -535,7 +513,7 @@ defineExpose({ search, getSelectedIds, getSelected, getSelecteds, getData, defau
|
|
|
>
|
|
|
<TableToolbar
|
|
|
v-if="showToolbar"
|
|
|
- :selected-rows="selectedItems.length"
|
|
|
+ :selected-rows="selectedIds.length"
|
|
|
:show-right-toolbar="showRightToolbar"
|
|
|
:show-right-search-btn="showRightSearchBtn"
|
|
|
:show-right-column-btn="showRightColumnBtn"
|
|
|
@@ -560,10 +538,10 @@ defineExpose({ search, getSelectedIds, getSelected, getSelecteds, getData, defau
|
|
|
@on-sort="onSort"
|
|
|
:header="displayColumns"
|
|
|
:data="dataToDisplay"
|
|
|
- v-model:selected-items="selectedItems"
|
|
|
- :has-checkbox="hasCheckbox"
|
|
|
+ v-model:selected-ids="selectedIds"
|
|
|
:checkbox-field="checkboxField"
|
|
|
:check-multiple="checkMultiple || checkPageMultiple"
|
|
|
+ :has-checkbox="checkMultiple || checkPageMultiple || hasCheckbox"
|
|
|
:empty-table-text="emptyTableText"
|
|
|
:sort-field="sortField"
|
|
|
:sort-order="sortOrder"
|
|
|
@@ -584,7 +562,9 @@ defineExpose({ search, getSelectedIds, getSelected, getSelecteds, getData, defau
|
|
|
:key-field="keyField"
|
|
|
:parent-field="parentField"
|
|
|
:children-field="childrenField"
|
|
|
+ :leaf-field="leafField"
|
|
|
:expand-depth="expandDepth"
|
|
|
+ :lazy-load="isLazy ? lazyLoad : undefined"
|
|
|
>
|
|
|
<template v-for="(_, name) in $slots" #[name]="{ row: item }">
|
|
|
<slot :name="name" :row="item" />
|