Blame view

src/components/table/table.vue 26.8 KB
2cb8a6d9   梁灏   commit Table comp...
1
  <template>
45e7ed7e   梁灏   update Table
2
      <div :class="wrapClasses" :style="styles">
39311a50   梁灏   update Table
3
          <div :class="classes">
45e7ed7e   梁灏   update Table
4
5
              <div :class="[prefixCls + '-title']" v-if="showSlotHeader" v-el:title><slot name="header"></slot></div>
              <div :class="[prefixCls + '-header']" v-if="showHeader" v-el:header @mousewheel="handleMouseWheel">
b8a43000   梁灏   update Table
6
                  <table-head
39311a50   梁灏   update Table
7
8
9
10
                      :prefix-cls="prefixCls"
                      :style="tableStyle"
                      :columns="cloneColumns"
                      :obj-data="objData"
224a3ae5   梁灏   publish 0.9.9-rc-3
11
                      :columns-width="columnsWidth"
39311a50   梁灏   update Table
12
                      :data="rebuildData"></table-head>
b8a43000   梁灏   update Table
13
              </div>
2f7660b4   Rijn   fade table body w...
14
15
              <div :class="[prefixCls + '-body']" :style="bodyStyle" v-el:body @scroll="handleBodyScroll"
                  v-show="!((!!noDataText && (!data || data.length === 0)) || (!!noFilteredDataText && (!rebuildData || rebuildData.length === 0)))">
b8a43000   梁灏   update Table
16
                  <table-body
39311a50   梁灏   update Table
17
18
19
20
21
                      v-ref:tbody
                      :prefix-cls="prefixCls"
                      :style="tableStyle"
                      :columns="cloneColumns"
                      :data="rebuildData"
224a3ae5   梁灏   publish 0.9.9-rc-3
22
                      :columns-width="columnsWidth"
39311a50   梁灏   update Table
23
                      :obj-data="objData"></table-body>
b8a43000   梁灏   update Table
24
              </div>
2f7660b4   Rijn   fade table body w...
25
26
27
28
29
30
31
32
33
34
35
36
37
              <div
                  :class="[prefixCls + '-tip']"
                  v-else>
                  <table cellspacing="0" cellpadding="0" border="0">
                      <tbody>
                          <tr>
                              <td :style="{ 'height': bodyStyle.height }">
                                {{{!data || data.length === 0 ? noDataText : noFilteredDataText}}}
                              </td>
                          </tr>
                      </tbody>
                  </table>
              </div>
a81dc06c   梁灏   publish 0.9.9-rc-4
38
              <div :class="[prefixCls + '-fixed']" :style="fixedTableStyle" v-if="isLeftFixed">
45e7ed7e   梁灏   update Table
39
40
                  <div :class="[prefixCls + '-fixed-header']" v-if="showHeader">
                      <table-head
5d0499ce   梁灏   update Table
41
                          fixed="left"
39311a50   梁灏   update Table
42
43
44
45
                          :prefix-cls="prefixCls"
                          :style="fixedTableStyle"
                          :columns="leftFixedColumns"
                          :obj-data="objData"
5e7a3b29   梁灏   publish 0.9.9-rc-2
46
                          :columns-width.sync="columnsWidth"
39311a50   梁灏   update Table
47
                          :data="rebuildData"></table-head>
45e7ed7e   梁灏   update Table
48
49
50
                  </div>
                  <div :class="[prefixCls + '-fixed-body']" :style="fixedBodyStyle" v-el:fixed-body>
                      <table-body
5d0499ce   梁灏   update Table
51
                          fixed="left"
39311a50   梁灏   update Table
52
53
54
55
                          :prefix-cls="prefixCls"
                          :style="fixedTableStyle"
                          :columns="leftFixedColumns"
                          :data="rebuildData"
224a3ae5   梁灏   publish 0.9.9-rc-3
56
                          :columns-width="columnsWidth"
39311a50   梁灏   update Table
57
                          :obj-data="objData"></table-body>
45e7ed7e   梁灏   update Table
58
                  </div>
b8a43000   梁灏   update Table
59
              </div>
a81dc06c   梁灏   publish 0.9.9-rc-4
60
              <div :class="[prefixCls + '-fixed-right']" :style="fixedRightTableStyle" v-if="isRightFixed">
45e7ed7e   梁灏   update Table
61
62
                  <div :class="[prefixCls + '-fixed-header']" v-if="showHeader">
                      <table-head
5d0499ce   梁灏   update Table
63
                          fixed="right"
39311a50   梁灏   update Table
64
65
66
67
                          :prefix-cls="prefixCls"
                          :style="fixedRightTableStyle"
                          :columns="rightFixedColumns"
                          :obj-data="objData"
5e7a3b29   梁灏   publish 0.9.9-rc-2
68
                          :columns-width.sync="columnsWidth"
39311a50   梁灏   update Table
69
                          :data="rebuildData"></table-head>
45e7ed7e   梁灏   update Table
70
71
72
                  </div>
                  <div :class="[prefixCls + '-fixed-body']" :style="fixedBodyStyle" v-el:fixed-right-body>
                      <table-body
5d0499ce   梁灏   update Table
73
                          fixed="right"
39311a50   梁灏   update Table
74
75
76
77
                          :prefix-cls="prefixCls"
                          :style="fixedRightTableStyle"
                          :columns="rightFixedColumns"
                          :data="rebuildData"
224a3ae5   梁灏   publish 0.9.9-rc-3
78
                          :columns-width="columnsWidth"
39311a50   梁灏   update Table
79
                          :obj-data="objData"></table-body>
45e7ed7e   梁灏   update Table
80
                  </div>
b8a43000   梁灏   update Table
81
              </div>
45e7ed7e   梁灏   update Table
82
              <div :class="[prefixCls + '-footer']" v-if="showSlotFooter" v-el:footer><slot name="footer"></slot></div>
abdec99d   梁灏   update Table
83
          </div>
2cb8a6d9   梁灏   commit Table comp...
84
85
86
      </div>
  </template>
  <script>
7f34c510   梁灏   update Table
87
88
      import tableHead from './table-head.vue';
      import tableBody from './table-body.vue';
3d6fa54b   梁灏   update Table
89
      import { oneOf, getStyle, deepCopy, getScrollBarSize } from '../../utils/assist';
4ab11811   梁灏   some component su...
90
      import { t } from '../../locale';
43509ad8   梁灏   Table support exp...
91
92
      import Csv from '../../utils/csv';
      import ExportCsv from './export-csv';
2cb8a6d9   梁灏   commit Table comp...
93
94
95
      const prefixCls = 'ivu-table';
  
      export default {
7f34c510   梁灏   update Table
96
          components: { tableHead, tableBody },
2cb8a6d9   梁灏   commit Table comp...
97
98
99
100
          props: {
              data: {
                  type: Array,
                  default () {
b0893113   jingsam   :art: add eslint
101
                      return [];
2cb8a6d9   梁灏   commit Table comp...
102
103
104
105
106
                  }
              },
              columns: {
                  type: Array,
                  default () {
b0893113   jingsam   :art: add eslint
107
                      return [];
2cb8a6d9   梁灏   commit Table comp...
108
109
110
111
                  }
              },
              size: {
                  validator (value) {
f2a051a1   梁灏   publish 0.9.9-rc-6
112
                      return oneOf(value, ['small', 'large', 'default']);
2cb8a6d9   梁灏   commit Table comp...
113
114
                  }
              },
3ef4dfb9   梁灏   update Table
115
116
117
              width: {
                  type: [Number, String]
              },
e7e8c8ff   梁灏   update Table
118
119
120
              height: {
                  type: [Number, String]
              },
2cb8a6d9   梁灏   commit Table comp...
121
122
123
124
125
126
127
128
              stripe: {
                  type: Boolean,
                  default: false
              },
              border: {
                  type: Boolean,
                  default: false
              },
2cb8a6d9   梁灏   commit Table comp...
129
130
131
132
              showHeader: {
                  type: Boolean,
                  default: true
              },
0d136465   梁灏   update Table
133
              highlightRow: {
2cb8a6d9   梁灏   commit Table comp...
134
135
                  type: Boolean,
                  default: false
e7e8c8ff   梁灏   update Table
136
137
138
139
140
141
              },
              rowClassName: {
                  type: Function,
                  default () {
                      return '';
                  }
d0e206c5   梁灏   Table add content...
142
143
144
              },
              content: {
                  type: Object
cf7887ba   Rijn   Fixed #151
145
146
147
              },
              noDataText: {
                  type: String,
4ab11811   梁灏   some component su...
148
149
150
                  default () {
                      return t('i.table.noDataText');
                  }
cf7887ba   Rijn   Fixed #151
151
152
153
              },
              noFilteredDataText: {
                  type: String,
4ab11811   梁灏   some component su...
154
155
156
                  default () {
                      return t('i.table.noFilteredDataText');
                  }
2cb8a6d9   梁灏   commit Table comp...
157
158
159
160
              }
          },
          data () {
              return {
adaeca88   梁灏   update Table
161
                  ready: false,
744eb0af   梁灏   update Table comp...
162
                  tableWidth: 0,
224a3ae5   梁灏   publish 0.9.9-rc-3
163
                  columnsWidth: {},
2cb8a6d9   梁灏   commit Table comp...
164
                  prefixCls: prefixCls,
0d136465   梁灏   update Table
165
                  compiledUids: [],
35ad3764   梁灏   update Table
166
                  objData: this.makeObjData(),     // checkbox or highlight-row
5d0499ce   梁灏   update Table
167
                  rebuildData: [],    // for sort or filter
35ad3764   梁灏   update Table
168
                  cloneColumns: this.makeColumns(),
e7e8c8ff   梁灏   update Table
169
170
                  showSlotHeader: true,
                  showSlotFooter: true,
3d6fa54b   梁灏   update Table
171
                  bodyHeight: 0,
d16dce64   梁灏   fixed #193
172
                  bodyRealHeight: 0,
3d6fa54b   梁灏   update Table
173
                  scrollBarWidth: getScrollBarSize()
b0893113   jingsam   :art: add eslint
174
              };
2cb8a6d9   梁灏   commit Table comp...
175
176
          },
          computed: {
45e7ed7e   梁灏   update Table
177
178
179
180
              wrapClasses () {
                  return [
                      `${prefixCls}-wrapper`,
                      {
0f4ccf44   梁灏   release 0.9.9
181
182
183
                          [`${prefixCls}-hide`]: !this.ready,
                          [`${prefixCls}-with-header`]: this.showSlotHeader,
                          [`${prefixCls}-with-footer`]: this.showSlotFooter
45e7ed7e   梁灏   update Table
184
                      }
b0893113   jingsam   :art: add eslint
185
                  ];
45e7ed7e   梁灏   update Table
186
              },
2cb8a6d9   梁灏   commit Table comp...
187
188
189
190
              classes () {
                  return [
                      `${prefixCls}`,
                      {
0d136465   梁灏   update Table
191
192
                          [`${prefixCls}-${this.size}`]: !!this.size,
                          [`${prefixCls}-border`]: this.border,
e7e8c8ff   梁灏   update Table
193
                          [`${prefixCls}-stripe`]: this.stripe,
e7e8c8ff   梁灏   update Table
194
                          [`${prefixCls}-with-fixed-top`]: !!this.height
2cb8a6d9   梁灏   commit Table comp...
195
                      }
b0893113   jingsam   :art: add eslint
196
                  ];
0d136465   梁灏   update Table
197
              },
e7e8c8ff   梁灏   update Table
198
199
              styles () {
                  let style = {};
3d6fa54b   梁灏   update Table
200
201
202
203
                  if (this.height) {
                      const height = (this.isLeftFixed || this.isRightFixed) ? parseInt(this.height) + this.scrollBarWidth : parseInt(this.height);
                      style.height = `${height}px`;
                  }
b0893113   jingsam   :art: add eslint
204
                  if (this.width) style.width = `${this.width}px`;
e7e8c8ff   梁灏   update Table
205
206
                  return style;
              },
0d136465   梁灏   update Table
207
208
              tableStyle () {
                  let style = {};
3d6fa54b   梁灏   update Table
209
                  if (this.tableWidth !== 0) {
d16dce64   梁灏   fixed #193
210
211
212
213
214
215
216
217
218
219
220
                      let width = '';
                      if (this.bodyHeight === 0) {
                          width = this.tableWidth;
                      } else {
                          if (this.bodyHeight > this.bodyRealHeight) {
                              width = this.tableWidth;
                          } else {
                              width = this.tableWidth - this.scrollBarWidth;
                          }
                      }
  //                    const width = this.bodyHeight === 0 ? this.tableWidth : this.tableWidth - this.scrollBarWidth;
3d6fa54b   梁灏   update Table
221
222
                      style.width = `${width}px`;
                  }
0d136465   梁灏   update Table
223
                  return style;
e7e8c8ff   梁灏   update Table
224
              },
7f34c510   梁灏   update Table
225
226
              fixedTableStyle () {
                  let style = {};
5d0499ce   梁灏   update Table
227
228
                  let width = 0;
                  this.leftFixedColumns.forEach((col) => {
224a3ae5   梁灏   publish 0.9.9-rc-3
229
                      if (col.fixed && col.fixed === 'left') width += col._width;
5d0499ce   梁灏   update Table
230
231
                  });
                  style.width = `${width}px`;
7f34c510   梁灏   update Table
232
233
234
235
                  return style;
              },
              fixedRightTableStyle () {
                  let style = {};
5d0499ce   梁灏   update Table
236
237
                  let width = 0;
                  this.rightFixedColumns.forEach((col) => {
224a3ae5   梁灏   publish 0.9.9-rc-3
238
                      if (col.fixed && col.fixed === 'right') width += col._width;
5d0499ce   梁灏   update Table
239
                  });
3d6fa54b   梁灏   update Table
240
                  width += this.scrollBarWidth;
5d0499ce   梁灏   update Table
241
                  style.width = `${width}px`;
7f34c510   梁灏   update Table
242
243
                  return style;
              },
e7e8c8ff   梁灏   update Table
244
245
              bodyStyle () {
                  let style = {};
3d6fa54b   梁灏   update Table
246
247
248
249
250
                  if (this.bodyHeight !== 0) {
                      // add a height to resolve scroll bug when browser has a scrollBar in fixed type and height prop
                      const height = (this.isLeftFixed || this.isRightFixed) ? this.bodyHeight + this.scrollBarWidth : this.bodyHeight;
                      style.height = `${height}px`;
                  }
e7e8c8ff   梁灏   update Table
251
                  return style;
b8a43000   梁灏   update Table
252
253
254
              },
              fixedBodyStyle () {
                  let style = {};
3d6fa54b   梁灏   update Table
255
                  if (this.bodyHeight !== 0) {
d16dce64   梁灏   fixed #193
256
257
258
259
260
261
262
                      let height = this.bodyHeight + this.scrollBarWidth - 1;
  
                      if (this.width && this.width < this.tableWidth){
                          height = this.bodyHeight;
                      }
  //                    style.height = this.scrollBarWidth > 0 ? `${this.bodyHeight}px` : `${this.bodyHeight - 1}px`;
                      style.height = this.scrollBarWidth > 0 ? `${height}px` : `${height - 1}px`;
3d6fa54b   梁灏   update Table
263
                  }
b8a43000   梁灏   update Table
264
                  return style;
35ad3764   梁灏   update Table
265
266
267
              },
              leftFixedColumns () {
                  let left = [];
5d0499ce   梁灏   update Table
268
                  let other = [];
35ad3764   梁灏   update Table
269
270
271
                  this.cloneColumns.forEach((col) => {
                      if (col.fixed && col.fixed === 'left') {
                          left.push(col);
5d0499ce   梁灏   update Table
272
273
                      } else {
                          other.push(col);
35ad3764   梁灏   update Table
274
275
                      }
                  });
5d0499ce   梁灏   update Table
276
                  return left.concat(other);
35ad3764   梁灏   update Table
277
278
279
              },
              rightFixedColumns () {
                  let right = [];
5d0499ce   梁灏   update Table
280
                  let other = [];
35ad3764   梁灏   update Table
281
282
283
                  this.cloneColumns.forEach((col) => {
                      if (col.fixed && col.fixed === 'right') {
                          right.push(col);
5d0499ce   梁灏   update Table
284
285
                      } else {
                          other.push(col);
35ad3764   梁灏   update Table
286
287
                      }
                  });
5d0499ce   梁灏   update Table
288
                  return right.concat(other);
a81dc06c   梁灏   publish 0.9.9-rc-4
289
290
291
292
293
294
              },
              isLeftFixed () {
                  return this.columns.some(col => col.fixed && col.fixed === 'left');
              },
              isRightFixed () {
                  return this.columns.some(col => col.fixed && col.fixed === 'right');
2cb8a6d9   梁灏   commit Table comp...
295
296
297
              }
          },
          methods: {
e7e8c8ff   梁灏   update Table
298
299
300
              rowClsName (index) {
                  return this.rowClassName(this.data[index], index);
              },
a3547c1b   梁灏   update Table
301
              handleResize () {
2cb8a6d9   梁灏   commit Table comp...
302
                  this.$nextTick(() => {
224a3ae5   梁灏   publish 0.9.9-rc-3
303
                      const allWidth = !this.columns.some(cell => !cell.width);    // each column set a width
a3547c1b   梁灏   update Table
304
305
306
307
                      if (allWidth) {
                          this.tableWidth = this.columns.map(cell => cell.width).reduce((a, b) => a + b);
                      } else {
                          this.tableWidth = parseInt(getStyle(this.$el, 'width')) - 1;
2cb8a6d9   梁灏   commit Table comp...
308
                      }
224a3ae5   梁灏   publish 0.9.9-rc-3
309
                      this.columnsWidth = {};
a3547c1b   梁灏   update Table
310
                      this.$nextTick(() => {
224a3ae5   梁灏   publish 0.9.9-rc-3
311
                          let columnsWidth = {};
192e2cb8   梁灏   update Table
312
                          let autoWidthIndex = -1;
224a3ae5   梁灏   publish 0.9.9-rc-3
313
                          if (allWidth) autoWidthIndex = this.cloneColumns.findIndex(cell => !cell.width);//todo 这行可能有问题
192e2cb8   梁灏   update Table
314
  
d0e206c5   梁灏   Table add content...
315
316
317
318
                          if (this.data.length) {
                              const $td = this.$refs.tbody.$el.querySelectorAll('tbody tr')[0].querySelectorAll('td');
                              for (let i = 0; i < $td.length; i++) {    // can not use forEach in Firefox
                                  const column = this.cloneColumns[i];
224a3ae5   梁灏   publish 0.9.9-rc-3
319
  
d0e206c5   梁灏   Table add content...
320
321
322
323
324
                                  let width = parseInt(getStyle($td[i], 'width'));
                                  if (i === autoWidthIndex) {
                                      width = parseInt(getStyle($td[i], 'width')) - 1;
                                  }
                                  if (column.width) width = column.width;
224a3ae5   梁灏   publish 0.9.9-rc-3
325
  
d0e206c5   梁灏   Table add content...
326
                                  this.cloneColumns[i]._width = width;
224a3ae5   梁灏   publish 0.9.9-rc-3
327
  
d0e206c5   梁灏   Table add content...
328
329
                                  columnsWidth[column._index] = {
                                      width: width
b0893113   jingsam   :art: add eslint
330
                                  };
2cb8a6d9   梁灏   commit Table comp...
331
                              }
d0e206c5   梁灏   Table add content...
332
                              this.columnsWidth = columnsWidth;
192e2cb8   梁灏   update Table
333
                          }
744eb0af   梁灏   update Table comp...
334
                      });
d16dce64   梁灏   fixed #193
335
336
                      // get table real height,for fixed when set height prop,but height < table's height,show scrollBarWidth
                      this.bodyRealHeight = parseInt(getStyle(this.$refs.tbody.$el, 'height'));
744eb0af   梁灏   update Table comp...
337
338
                  });
              },
d3dfdb26   梁灏   update Table
339
340
341
              handleMouseIn (_index) {
                  if (this.objData[_index]._isHover) return;
                  this.objData[_index]._isHover = true;
abdec99d   梁灏   update Table
342
              },
d3dfdb26   梁灏   update Table
343
344
              handleMouseOut (_index) {
                  this.objData[_index]._isHover = false;
abdec99d   梁灏   update Table
345
              },
d3dfdb26   梁灏   update Table
346
347
              highlightCurrentRow (_index) {
                  if (!this.highlightRow || this.objData[_index]._isHighlight) return;
0d136465   梁灏   update Table
348
349
  
                  let oldIndex = -1;
d3dfdb26   梁灏   update Table
350
351
352
353
                  for (let i in this.objData) {
                      if (this.objData[i]._isHighlight) {
                          oldIndex = parseInt(i);
                          this.objData[i]._isHighlight = false;
0d136465   梁灏   update Table
354
                      }
d3dfdb26   梁灏   update Table
355
356
357
358
                  }
                  this.objData[_index]._isHighlight = true;
                  const oldData = oldIndex < 0 ? null : JSON.parse(JSON.stringify(this.data[oldIndex]));
                  this.$emit('on-current-change', JSON.parse(JSON.stringify(this.data[_index])), oldData);
0d136465   梁灏   update Table
359
              },
da55375f   Rijn   Added click and d...
360
361
              clickCurrentRow (_index) {
                  this.highlightCurrentRow (_index);
ee975cd4   梁灏   update Table event
362
                  this.$emit('on-row-click', JSON.parse(JSON.stringify(this.data[_index])));
da55375f   Rijn   Added click and d...
363
364
365
              },
              dblclickCurrentRow (_index) {
                  this.highlightCurrentRow (_index);
ee975cd4   梁灏   update Table event
366
                  this.$emit('on-row-dblclick', JSON.parse(JSON.stringify(this.data[_index])));
da55375f   Rijn   Added click and d...
367
              },
0d136465   梁灏   update Table
368
369
              getSelection () {
                  let selectionIndexes = [];
d3dfdb26   梁灏   update Table
370
371
372
                  for (let i in this.objData) {
                      if (this.objData[i]._isChecked) selectionIndexes.push(parseInt(i));
                  }
0d136465   梁灏   update Table
373
374
                  return JSON.parse(JSON.stringify(this.data.filter((data, index) => selectionIndexes.indexOf(index) > -1)));
              },
d3dfdb26   梁灏   update Table
375
              toggleSelect (_index) {
741b987a   梁灏   update Table
376
                  let data = {};
d3dfdb26   梁灏   update Table
377
378
379
380
  
                  for (let i in this.objData) {
                      if (parseInt(i) === _index) {
                          data = this.objData[i];
741b987a   梁灏   update Table
381
382
383
                      }
                  }
                  const status = !data._isChecked;
d3dfdb26   梁灏   update Table
384
385
  
                  this.objData[_index]._isChecked = status;
0d136465   梁灏   update Table
386
387
388
  
                  const selection = this.getSelection();
                  if (status) {
741b987a   梁灏   update Table
389
                      this.$emit('on-select', selection, JSON.parse(JSON.stringify(this.data[_index])));
0d136465   梁灏   update Table
390
391
392
                  }
                  this.$emit('on-selection-change', selection);
              },
3d9e4f20   梁灏   update Table
393
              selectAll (status) {
6c99b9fe   梁灏   update Table
394
395
396
                  this.rebuildData.forEach((data) => {
                      this.objData[data._index]._isChecked = status;
                  });
3d9e4f20   梁灏   update Table
397
  
52874e27   梁灏   update Table
398
                  const selection = this.getSelection();
3d9e4f20   梁灏   update Table
399
                  if (status) {
52874e27   梁灏   update Table
400
                      this.$emit('on-select-all', selection);
3d9e4f20   梁灏   update Table
401
                  }
52874e27   梁灏   update Table
402
                  this.$emit('on-selection-change', selection);
e7e8c8ff   梁灏   update Table
403
404
              },
              fixedHeader () {
b0893113   jingsam   :art: add eslint
405
                  if (this.height) {
e7e8c8ff   梁灏   update Table
406
407
408
409
410
                      this.$nextTick(() => {
                          const titleHeight = parseInt(getStyle(this.$els.title, 'height')) || 0;
                          const headerHeight = parseInt(getStyle(this.$els.header, 'height')) || 0;
                          const footerHeight = parseInt(getStyle(this.$els.footer, 'height')) || 0;
                          this.bodyHeight = this.height - titleHeight - headerHeight - footerHeight;
b0893113   jingsam   :art: add eslint
411
                      });
f2a051a1   梁灏   publish 0.9.9-rc-6
412
413
                  } else {
                      this.bodyHeight = 0;
e7e8c8ff   梁灏   update Table
414
                  }
abdec99d   梁灏   update Table
415
              },
99f80db0   梁灏   update Table
416
417
418
              hideColumnFilter () {
                  this.cloneColumns.forEach((col) => col._filterVisible = false);
              },
192e2cb8   梁灏   update Table
419
              handleBodyScroll (event) {
b8a43000   梁灏   update Table
420
                  if (this.showHeader) this.$els.header.scrollLeft = event.target.scrollLeft;
a81dc06c   梁灏   publish 0.9.9-rc-4
421
422
                  if (this.isLeftFixed) this.$els.fixedBody.scrollTop = event.target.scrollTop;
                  if (this.isRightFixed) this.$els.fixedRightBody.scrollTop = event.target.scrollTop;
99f80db0   梁灏   update Table
423
                  this.hideColumnFilter();
192e2cb8   梁灏   update Table
424
              },
3ef4dfb9   梁灏   update Table
425
426
427
428
429
430
431
432
433
              handleMouseWheel (event) {
                  const deltaX = event.deltaX;
                  const $body = this.$els.body;
  
                  if (deltaX > 0) {
                      $body.scrollLeft = $body.scrollLeft + 10;
                  } else {
                      $body.scrollLeft = $body.scrollLeft - 10;
                  }
52874e27   梁灏   update Table
434
              },
9f853e3e   梁灏   update Table
435
436
437
438
439
440
              sortData (data, type, index) {
                  const key = this.cloneColumns[index].key;
                  data.sort((a, b) => {
                      if (this.cloneColumns[index].sortMethod) {
                          return this.cloneColumns[index].sortMethod(a, b);
                      } else {
89670198   梁灏   publish 0.9.9-rc-5
441
442
443
444
445
                          if (type === 'asc') {
                              return a[key] > b[key] ? 1 : -1;
                          } else if (type === 'desc') {
                              return a[key] < b[key] ? 1 : -1;
                          }
9f853e3e   梁灏   update Table
446
447
448
449
                      }
                  });
                  return data;
              },
52874e27   梁灏   update Table
450
              handleSort (index, type) {
35ad3764   梁灏   update Table
451
452
453
                  this.cloneColumns.forEach((col) => col._sortType = 'normal');
  
                  const key = this.cloneColumns[index].key;
642299b9   梁灏   update Table
454
                  if (this.cloneColumns[index].sortable !== 'custom') {    // custom is for remote sort
9f853e3e   梁灏   update Table
455
                      if (type === 'normal') {
97edb2eb   梁灏   update Table
456
                          this.rebuildData = this.makeDataWithFilter();
9f853e3e   梁灏   update Table
457
458
                      } else {
                          this.rebuildData = this.sortData(this.rebuildData, type, index);
642299b9   梁灏   update Table
459
                      }
52874e27   梁灏   update Table
460
                  }
35ad3764   梁灏   update Table
461
462
463
464
465
466
                  this.cloneColumns[index]._sortType = type;
  
                  this.$emit('on-sort-change', {
                      column: JSON.parse(JSON.stringify(this.columns[this.cloneColumns[index]._index])),
                      key: key,
                      order: type
9f853e3e   梁灏   update Table
467
                  });
741b987a   梁灏   update Table
468
              },
adaeca88   梁灏   update Table
469
470
471
              handleFilterHide (index) {    // clear checked that not filter now
                  if (!this.cloneColumns[index]._isFiltered) this.cloneColumns[index]._filterChecked = [];
              },
cb31ede0   梁灏   update Table
472
473
474
              filterData (data, column) {
                  return data.filter((row) => {
                      let status = !column._filterChecked.length;
adaeca88   梁灏   update Table
475
476
477
478
479
480
                      for (let i = 0; i < column._filterChecked.length; i++) {
                          status = column.filterMethod(column._filterChecked[i], row);
                          if (status) break;
                      }
                      return status;
                  });
cb31ede0   梁灏   update Table
481
482
483
484
485
486
487
488
489
490
491
              },
              filterOtherData (data, index) {
                  this.cloneColumns.forEach((col, colIndex) => {
                      if (colIndex !== index) {
                          data = this.filterData(data, col);
                      }
                  });
                  return data;
              },
              handleFilter (index) {
                  const column = this.cloneColumns[index];
9f853e3e   梁灏   update Table
492
                  let filterData = this.makeDataWithSort();
cb31ede0   梁灏   update Table
493
494
495
496
497
  
                  // filter others first, after filter this column
                  filterData = this.filterOtherData(filterData, index);
                  this.rebuildData = this.filterData(filterData, column);
  
adaeca88   梁灏   update Table
498
499
500
                  this.cloneColumns[index]._isFiltered = true;
                  this.cloneColumns[index]._filterVisible = false;
              },
45e7ed7e   梁灏   update Table
501
502
503
504
              handleFilterSelect (index, value) {
                  this.cloneColumns[index]._filterChecked = [value];
                  this.handleFilter(index);
              },
adaeca88   梁灏   update Table
505
506
              handleFilterReset (index) {
                  this.cloneColumns[index]._isFiltered = false;
45e7ed7e   梁灏   update Table
507
508
                  this.cloneColumns[index]._filterVisible = false;
                  this.cloneColumns[index]._filterChecked = [];
cb31ede0   梁灏   update Table
509
  
9f853e3e   梁灏   update Table
510
                  let filterData = this.makeDataWithSort();
cb31ede0   梁灏   update Table
511
512
                  filterData = this.filterOtherData(filterData, index);
                  this.rebuildData = filterData;
adaeca88   梁灏   update Table
513
              },
741b987a   梁灏   update Table
514
515
516
517
              makeData () {
                  let data = deepCopy(this.data);
                  data.forEach((row, index) => row._index = index);
                  return data;
d3dfdb26   梁灏   update Table
518
              },
9f853e3e   梁灏   update Table
519
520
521
522
              makeDataWithSort () {
                  let data = this.makeData();
                  let sortType = 'normal';
                  let sortIndex = -1;
2533a192   梁灏   update DatePicker
523
524
                  let isCustom = false;
  
9f853e3e   梁灏   update Table
525
526
527
528
                  for (let i = 0; i < this.cloneColumns.length; i++) {
                      if (this.cloneColumns[i]._sortType !== 'normal') {
                          sortType = this.cloneColumns[i]._sortType;
                          sortIndex = i;
2533a192   梁灏   update DatePicker
529
                          isCustom = this.cloneColumns[i].sortable === 'custom';
9f853e3e   梁灏   update Table
530
531
532
                          break;
                      }
                  }
2533a192   梁灏   update DatePicker
533
                  if (sortType !== 'normal' && !isCustom) data =  this.sortData(data, sortType, sortIndex);
9f853e3e   梁灏   update Table
534
535
                  return data;
              },
97edb2eb   梁灏   update Table
536
537
538
539
540
541
542
543
544
545
              makeDataWithFilter () {
                  let data = this.makeData();
                  this.cloneColumns.forEach(col => data = this.filterData(data, col));
                  return data;
              },
              makeDataWithSortAndFilter () {
                  let data = this.makeDataWithSort();
                  this.cloneColumns.forEach(col => data = this.filterData(data, col));
                  return data;
              },
d3dfdb26   梁灏   update Table
546
547
548
549
550
551
552
553
554
555
              makeObjData () {
                  let data = {};
                  this.data.forEach((row, index) => {
                      const newRow = deepCopy(row);// todo 直接替换
                      newRow._isHover = false;
                      newRow._isChecked = false;
                      newRow._isHighlight = false;
                      data[index] = newRow;
                  });
                  return data;
35ad3764   梁灏   update Table
556
557
558
559
560
561
562
563
              },
              makeColumns () {
                  let columns = deepCopy(this.columns);
                  let left = [];
                  let right = [];
                  let center = [];
  
                  columns.forEach((column, index) => {
35ad3764   梁灏   update Table
564
                      column._index = index;
224a3ae5   梁灏   publish 0.9.9-rc-3
565
                      column._width = column.width ? column.width : '';    // update in handleResize()
99f80db0   梁灏   update Table
566
567
568
569
                      column._sortType = 'normal';
                      column._filterVisible = false;
                      column._isFiltered = false;
                      column._filterChecked = [];
35ad3764   梁灏   update Table
570
  
adaeca88   梁灏   update Table
571
572
573
574
575
                      if ('filterMultiple' in column) {
                          column._filterMultiple = column.filterMultiple;
                      } else {
                          column._filterMultiple = true;
                      }
5d0499ce   梁灏   update Table
576
577
578
579
                      if ('filteredValue' in column) {
                          column._filterChecked = column.filteredValue;
                          column._isFiltered = true;
                      }
adaeca88   梁灏   update Table
580
  
35ad3764   梁灏   update Table
581
582
583
584
585
586
587
588
589
                      if (column.fixed && column.fixed === 'left') {
                          left.push(column);
                      } else if (column.fixed && column.fixed === 'right') {
                          right.push(column);
                      } else {
                          center.push(column);
                      }
                  });
                  return left.concat(center).concat(right);
43509ad8   梁灏   Table support exp...
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
              },
              exportCsv (params) {
                  if (params.filename) {
                      if (params.filename.indexOf('.csv') === -1) {
                          params.filename += '.csv';
                      }
                  } else {
                      params.filename = 'table.csv';
                  }
  
                  let columns = [];
                  let datas = [];
                  if (params.columns && params.data) {
                      columns = params.columns;
                      datas = params.data;
                  } else {
                      columns = this.columns;
                      if (!('original' in params)) params.original = true;
                      datas = params.original ? this.data : this.rebuildData;
                  }
  
                  let noHeader = false;
                  if ('noHeader' in params) noHeader = params.noHeader;
  
                  const data = Csv(columns, datas, ',', noHeader);
                  ExportCsv.download(params.filename, data);
2cb8a6d9   梁灏   commit Table comp...
616
617
              }
          },
e7e8c8ff   梁灏   update Table
618
          compiled () {
d0e206c5   梁灏   Table add content...
619
              if (!this.content) this.content = this.$parent;
e7e8c8ff   梁灏   update Table
620
621
              this.showSlotHeader = this.$els.title.innerHTML.replace(/\n/g, '').replace(/<!--[\w\W\r\n]*?-->/gmi, '') !== '';
              this.showSlotFooter = this.$els.footer.innerHTML.replace(/\n/g, '').replace(/<!--[\w\W\r\n]*?-->/gmi, '') !== '';
5d0499ce   梁灏   update Table
622
              this.rebuildData = this.makeDataWithSortAndFilter();
e7e8c8ff   梁灏   update Table
623
          },
2cb8a6d9   梁灏   commit Table comp...
624
          ready () {
a3547c1b   梁灏   update Table
625
              this.handleResize();
e7e8c8ff   梁灏   update Table
626
              this.fixedHeader();
adaeca88   梁灏   update Table
627
              this.$nextTick(() => this.ready = true);
744eb0af   梁灏   update Table comp...
628
629
630
631
              window.addEventListener('resize', this.handleResize, false);
          },
          beforeDestroy () {
              window.removeEventListener('resize', this.handleResize, false);
2cb8a6d9   梁灏   commit Table comp...
632
633
634
635
          },
          watch: {
              data: {
                  handler () {
d3dfdb26   梁灏   update Table
636
                      this.objData = this.makeObjData();
97edb2eb   梁灏   update Table
637
                      this.rebuildData = this.makeDataWithSortAndFilter();
a3547c1b   梁灏   update Table
638
                      this.handleResize();
2cb8a6d9   梁灏   commit Table comp...
639
640
641
642
643
                  },
                  deep: true
              },
              columns: {
                  handler () {
f2a051a1   梁灏   publish 0.9.9-rc-6
644
                      // todo 这里有性能问题,可能是左右固定计算属性影响的
35ad3764   梁灏   update Table
645
                      this.cloneColumns = this.makeColumns();
97edb2eb   梁灏   update Table
646
                      this.rebuildData = this.makeDataWithSortAndFilter();
a3547c1b   梁灏   update Table
647
                      this.handleResize();
2cb8a6d9   梁灏   commit Table comp...
648
649
                  },
                  deep: true
e7e8c8ff   梁灏   update Table
650
651
652
              },
              height () {
                  this.fixedHeader();
2cb8a6d9   梁灏   commit Table comp...
653
654
              }
          }
b0893113   jingsam   :art: add eslint
655
656
      };
  </script>