VbTreeTable.vue 4.4 KB

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