Blame view

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