VbTreeTable.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <script setup lang="ts">
  2. import { ref, withDefaults } from "vue"
  3. import VbDataTable from "./VbDataTable.vue"
  4. import type { Sort, Header, Scroll } from "@/components/Table/table-partials/models"
  5. import type { AxiosRequestConfig } from "axios"
  6. const props = withDefaults(
  7. defineProps<{
  8. expandDepth?: number
  9. intervalLeft?: number
  10. iconField?: string
  11. keyField?: string
  12. parentField?: string
  13. childrenField?: string
  14. header: Array<Header>
  15. url?: string
  16. method?: string
  17. configs?: AxiosRequestConfig
  18. queryParams?: any
  19. data?: Array<any>
  20. total?: number //总数
  21. selectedItems?: Array<any>
  22. scroll?: Scroll
  23. pagination?: boolean //是否分页
  24. currentPage?: number //当前页数
  25. //itemsPerPage?: number //每页数量
  26. pageArray?: Array<number> //下拉选择每页数量
  27. pageDropdown?: boolean //是否下拉选择
  28. maxVisibleButtons?: number // 显示分页按钮数量
  29. hasCheckbox?: boolean //是否有选择框
  30. checkboxField?: string //选择框字段
  31. checkMultiple?: boolean //是否多选
  32. sortField?: string //排序字段
  33. sortOrder?: "asc" | "desc"
  34. loading?: boolean //加载中
  35. fixedColumn?: boolean //固定列
  36. fixedNumber?: number //左边固定列数
  37. fixedRightNumber?: number //右边固定列数
  38. emptyTableText?: string
  39. tableBoxClass?: string
  40. tableClass?: string
  41. headerClass?: string
  42. bodyClass?: string
  43. thTrClass?: string
  44. tdTrClass?: string
  45. rowSpanSuffix?: string //rowsapn 的字段后缀 后台应该组成 `${字段}${后缀}`
  46. }>(),
  47. {
  48. currentPage: 1,
  49. method: "get",
  50. selectedItems: () => {
  51. return []
  52. },
  53. hasCheckbox: false,
  54. checkMultiple: false,
  55. sortOrder: "asc",
  56. pagination: false,
  57. }
  58. )
  59. const emits = defineEmits<{
  60. (e: "update:selectedItems", v: Array<any>): void
  61. (e: "update:currentPage", v: number): void
  62. (e: "page-change", v: number): void
  63. (e: "on-items-per-page-change", v: number): void
  64. (e: "on-sort", v: Sort): void
  65. (e: "on-items-change", isChecked: boolean, v: any, row: any): void
  66. (e: "on-items-select", row: any): void
  67. (e: "on-items-all-change", isChecked: boolean, rows: Array<any>): void
  68. }>()
  69. const selectedItems = ref(props.selectedItems)
  70. const currentPage = ref(props.currentPage)
  71. const pageChange = (page: number) => {
  72. emits("update:currentPage", page)
  73. emits("page-change", page)
  74. }
  75. const onSort = (sort: Sort) => {
  76. emits("on-sort", sort)
  77. }
  78. const onSelectAll = (isChecked: boolean, rows: Array<any>) => {
  79. emits("on-items-all-change", isChecked, rows)
  80. }
  81. const onItemChange = (isChecked: boolean, v: any, row: any) => {
  82. emits("update:selectedItems", selectedItems.value)
  83. emits("on-items-change", isChecked, v, row)
  84. }
  85. const onItemSelect = (row: any) => {
  86. emits("on-items-select", row)
  87. }
  88. const onItemsPerPageChange = (v: number) => {
  89. emits("on-items-per-page-change", v)
  90. }
  91. const treeTable = ref()
  92. function search() {
  93. treeTable.value.search()
  94. }
  95. defineExpose({ search })
  96. </script>
  97. <template>
  98. <VbDataTable
  99. ref="treeTable"
  100. v-model:selected-items="selectedItems"
  101. :isTree="true"
  102. :header="header"
  103. :interval-left="intervalLeft"
  104. :icon-field="iconField"
  105. :key-field="keyField"
  106. :children-field="childrenField"
  107. :parent-field="parentField"
  108. :expand-depth="expandDepth"
  109. :data="data"
  110. :url="url"
  111. :configs="configs"
  112. :method="method"
  113. :query-params="queryParams"
  114. :scroll="scroll"
  115. :loading="loading"
  116. :pagination="pagination"
  117. v-model:current-page="currentPage"
  118. :max-visible-buttons="maxVisibleButtons"
  119. :items-per-page-dropdown-enabled="pageDropdown"
  120. :items-per-page-dropdown-array="pageArray"
  121. :hasCheckbox="hasCheckbox"
  122. :checkboxField="checkboxField"
  123. :checkMultiple="checkMultiple"
  124. :sortField="sortField"
  125. :sortOrder="sortOrder"
  126. :fixedColumn="fixedColumn"
  127. :fixedNumber="fixedNumber"
  128. :fixedRightNumber="fixedRightNumber"
  129. :emptyTableText="emptyTableText"
  130. :tableBoxClass="tableBoxClass"
  131. :tableClass="tableClass"
  132. :headerClass="headerClass"
  133. :bodyClass="bodyClass"
  134. :thTrClass="thTrClass"
  135. :tdTrClass="tdTrClass"
  136. :rowSpanSuffix="rowSpanSuffix"
  137. @page-change="pageChange"
  138. @on-items-change="onItemChange"
  139. @on-items-all-change="onSelectAll"
  140. @on-sort="onSort"
  141. @on-items-select="onItemSelect"
  142. @on-items-per-page-change="onItemsPerPageChange"
  143. v-bind="$attrs"
  144. >
  145. <template v-for="(_, name) in $slots" #[name]="{ row: item }">
  146. <slot :name="name" :row="item" />
  147. </template>
  148. </VbDataTable>
  149. </template>