zrlibs
2025-03-17 7ae689ef9495232756023f0177683e80615e13aa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
<template>
  <div class="data-table">
    <Table
      class="ivu-table-mini"
      :row-class-name="() => ['no-wrap', 'col-gap-none']"
      :columns="columns"
      :data="data"
      :height="paged ? tableHeight - 70 : tableHeight"
      border
      ref="refTable"
    ></Table>
    <Page
      v-if="paged"
      class="text-center"
      :model-value="page"
      :total="total"
      :page-size="limit"
      :page-size-opts="limits"
      show-sizer
      show-total
      show-elevator
      transfer
      @on-change="onPageChange"
      @on-page-size-change="onPageSizeChange"
      @on-prev="onPrev"
      @on-next="onNext"
      ref="refPage"
    />
  </div>
</template>
 
<script>
import { ref } from "vue";
export default {
  name: "DataTable",
  props: {
    tableHeight: Number | String,
    paged: {
      type: Boolean,
      default: () => true,
    },
    columns: {
      type: Array,
      default: () => [],
    },
    data: {
      type: Array,
      default: () => [],
    },
    total: {
      type: Number,
      default: () => 0,
    },
    page: {
      type: Number,
      default: () => 1,
    },
    limit: {
      type: Number,
      default: () => 10,
    },
    limits: {
      type: Array,
      default: () => [10, 20, 30, 40],
    },
  },
  data() {
    return {};
  },
  methods: {
    onPageChange(page) {
      this.$emit("on-change", page);
    },
    onPageSizeChange(limit) {
      this.$emit("on-page-size-change", limit);
    },
    onPrev(page) {
      this.$emit("on-prev", page);
    },
    onNext(page) {
      this.$emit("on-next", page);
    },
    onSortChange(param) {
      if (param.order == "normal") param.order = "asc";
      this.columns
        .filter((c) => c.sortType)
        .forEach((c) => (c.sortType = undefined));
      this.columns.find((c) => c.key == param.key).sortType = param.order;
      this.$emit("on-sort-change", param);
    },
    onSelectionChange(selection) {
      this.$emit("on-selection-change", selection);
    },
    onCurrentChange(currentRow) {
      this.$emit("on-current-change", currentRow);
    },
    onRowClick(row, index, emit = true) {
      this.clickedRowIndex = index;
      this.onCurrentChange(row);
      if (emit) this.$emit("on-row-click", row, index);
    },
    onCellClick(row, column, data, event) {
      event.stopPropagation();
      let index = row._index;
      if (index === undefined) index = this.rows.find((r) => r.id == row.id);
      if (column.key == "row_button") this.onRowClick(row, index, false);
      else this.onRowClick(row, index, true);
    },
    onSelect(selection, row) {
      this.$emit("on-select", selection, row);
    },
    onSelectCancel(selection, row) {
      this.$emit("on-select-cancel", selection, row);
    },
    onSelectAll(selection) {
      this.$emit("on-select-all", selection);
    },
    onSelectAllCancel(selection) {
      this.$emit("on-select-all-cancel", selection);
    },
    onColumnWidthResize(newWidth, oldWidth, column, event) {
      this.$emit("on-column-width-resize", newWidth, oldWidth, column, event);
    },
  },
  setup() {
    const refTable = ref(null);
    const refPage = ref(null);
    return { refTable, refPage };
  },
};
</script>
 
<style lang="less" scoped>
.data-table {
  height: 100%;
  .text-center {
    text-align: center;
  }
}
</style>