z-table.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <script lang="tsx">
  2. import { computed, defineComponent, onMounted, reactive, ref, toRaw, unref } from 'vue';
  3. import { useAppStore } from '@/store/modules/app';
  4. import { defaultTransform, useNaivePaginatedTable, useTableOperate } from '@/hooks/common/table';
  5. import { useForm } from '../Form/hooks/useForm';
  6. import type { FormProps } from '../Form/types/form';
  7. import type { TableMethods } from './hooks/useTable';
  8. import type { tableProp } from './types';
  9. import { basicProps } from './props';
  10. export default defineComponent({
  11. name: 'ZTable',
  12. props: {
  13. ...basicProps
  14. },
  15. emits: ['register', 'add', 'delete'],
  16. setup(props, { emit, slots }) {
  17. const appStore = useAppStore();
  18. const propsData = toRaw(props);
  19. const searchProps = ref<FormProps>();
  20. const tableProps = ref<tableProp>();
  21. const getFormSearch = computed(() => {
  22. return {
  23. labelWidth: 120,
  24. layout: 'horizontal',
  25. gridProps: {
  26. cols: '1 xl:4 s:1 l:3',
  27. itemResponsive: true
  28. },
  29. collapsedRows: 1,
  30. ...unref(searchProps)
  31. };
  32. });
  33. const getTableProps = computed(() => {
  34. return {
  35. ...propsData.tableConfig,
  36. ...unref(tableProps)
  37. };
  38. });
  39. const NTableProps = computed(() => {
  40. return {
  41. ...unref(tableProps)
  42. };
  43. });
  44. const [registerSearchForm, { getFieldsValue: getSeachForm, setFormProps: setSearchProps }] = useForm(
  45. getFormSearch.value
  46. );
  47. const searchPage = reactive({
  48. current: 1,
  49. size: 10
  50. });
  51. const getForm = ref();
  52. const { columns, columnChecks, data, getData, loading, mobilePagination } = useNaivePaginatedTable({
  53. api: () => propsData.api({ ...searchPage, ...getForm.value }),
  54. transform: response => defaultTransform(response),
  55. onPaginationParamsChange: params => {
  56. searchPage.current = Number(params.page);
  57. searchPage.size = Number(params.pageSize);
  58. },
  59. paginationProps: {
  60. pageSizes: [10, 20, 50, 100, 150, 200]
  61. },
  62. columns: () => handleGetColumns()
  63. });
  64. const { checkedRowKeys } = useTableOperate(data, getTableProps.value.keyField, getData);
  65. function handleGetColumns() {
  66. const columnsData = [...propsData.columns];
  67. if (propsData.showTableAction) {
  68. columnsData.push({
  69. key: 'operate',
  70. title: '操作',
  71. align: 'center',
  72. width: getTableProps.value.opWdith,
  73. fixed: 'right',
  74. render: row => <div class="flex-center gap-8px">{slots.op ? slots.op({ row }) : ''}</div>
  75. });
  76. }
  77. return columnsData;
  78. }
  79. function setTableConfig(config: tableProp) {
  80. tableProps.value = config;
  81. }
  82. function getTableCheckedRowKeys() {
  83. return checkedRowKeys.value;
  84. }
  85. function getTableData() {
  86. return data.value;
  87. }
  88. const TableMethod: TableMethods = {
  89. refresh: getData,
  90. setSearchProps,
  91. setTableLoading,
  92. setTableConfig,
  93. getTableCheckedRowKeys,
  94. getTableData
  95. };
  96. function setTableLoading(flage: boolean) {
  97. loading.value = flage;
  98. }
  99. onMounted(() => {
  100. emit('register', TableMethod);
  101. });
  102. function handleAdd() {
  103. emit('add');
  104. }
  105. function handleDelete() {
  106. emit('delete', checkedRowKeys.value);
  107. }
  108. function handleReset() {
  109. getForm.value = getSeachForm();
  110. getData();
  111. }
  112. function handleSearch() {
  113. const form = getSeachForm();
  114. if (getTableProps.value.fieldMapToTime && form[getTableProps.value.fieldMapToTime[0][0] as unknown as string]) {
  115. const [startTimeKey, endTimeKey] = getTableProps.value.fieldMapToTime[0][1];
  116. form[startTimeKey] = form.Time[0];
  117. form[endTimeKey] = form.Time[1];
  118. delete form.Time;
  119. }
  120. console.log(form, '请求参数');
  121. getForm.value = form;
  122. getData();
  123. }
  124. return {
  125. registerSearchForm,
  126. handleDelete,
  127. checkedRowKeys,
  128. appStore,
  129. loading,
  130. mobilePagination,
  131. data,
  132. columns,
  133. tableProps,
  134. columnChecks,
  135. getTableProps,
  136. handleAdd,
  137. getData,
  138. handleReset,
  139. handleSearch,
  140. NTableProps
  141. };
  142. }
  143. });
  144. </script>
  145. <template>
  146. <NCard v-if="getTableProps.showSearch" :bordered="false" size="small">
  147. <NCollapse display-directive="show" :default-expanded-names="['role-search']">
  148. <NCollapseItem title="搜索" name="role-search">
  149. <BasicForm @register-form="registerSearchForm" @submit="handleSearch" @reset="handleReset" />
  150. </NCollapseItem>
  151. </NCollapse>
  152. </NCard>
  153. <NCard :bordered="false" :title="getTableProps.title" size="small" class="card-wrapper sm:flex-1-hidden">
  154. <template #header-extra>
  155. <TableHeaderOperation
  156. v-if="getTableProps.showTableHeaderAction"
  157. v-model:columns="columnChecks"
  158. :disabled-delete="checkedRowKeys.length === 0"
  159. :loading="loading"
  160. :is-add="getTableProps.showAddButton"
  161. :is-delete="getTableProps.showDeleteButton"
  162. @add="handleAdd"
  163. @delete="handleDelete"
  164. @refresh="getData"
  165. >
  166. <template #prefix>
  167. <slot name="prefix"></slot>
  168. </template>
  169. </TableHeaderOperation>
  170. </template>
  171. <NDataTable
  172. v-bind="NTableProps"
  173. v-model:checked-row-keys="checkedRowKeys"
  174. :columns="columns"
  175. :data="data"
  176. size="small"
  177. :flex-height="!appStore.isMobile"
  178. :scroll-x="getTableProps.scrollX"
  179. :loading="loading"
  180. remote
  181. :row-key="row => row[getTableProps.keyField]"
  182. :pagination="mobilePagination"
  183. class="sm:h-full"
  184. />
  185. </NCard>
  186. </template>
  187. <style scoped></style>