Blame view

src/components/table/table.vue 23.5 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
86
87
88
89
90
91
92
93
94
95
96
          props: {
              data: {
                  type: Array,
                  default () {
                      return []
                  }
              },
              columns: {
                  type: Array,
                  default () {
                      return []
                  }
              },
              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
2cb8a6d9   梁灏   commit Table comp...
145
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
156
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
167
                      }
                  ]
0d136465   梁灏   update Table
168
              },
e7e8c8ff   梁灏   update Table
169
170
171
              styles () {
                  let style = {};
                  if (!!this.height) style.height = `${this.height}px`;
3ef4dfb9   梁灏   update Table
172
                  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
272
                                  columnsWidth[column._index] = {
                                      width: width
                                  }
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
300
301
              },
              getSelection () {
                  let selectionIndexes = [];
d3dfdb26   梁灏   update Table
302
303
304
                  for (let i in this.objData) {
                      if (this.objData[i]._isChecked) selectionIndexes.push(parseInt(i));
                  }
0d136465   梁灏   update Table
305
306
                  return JSON.parse(JSON.stringify(this.data.filter((data, index) => selectionIndexes.indexOf(index) > -1)));
              },
d3dfdb26   梁灏   update Table
307
              toggleSelect (_index) {
741b987a   梁灏   update Table
308
309
                  let data = {};
                  let index = -1;
d3dfdb26   梁灏   update Table
310
311
312
313
  
                  for (let i in this.objData) {
                      if (parseInt(i) === _index) {
                          data = this.objData[i];
741b987a   梁灏   update Table
314
                          index = i;
741b987a   梁灏   update Table
315
316
317
                      }
                  }
                  const status = !data._isChecked;
d3dfdb26   梁灏   update Table
318
319
  
                  this.objData[_index]._isChecked = status;
0d136465   梁灏   update Table
320
321
322
  
                  const selection = this.getSelection();
                  if (status) {
741b987a   梁灏   update Table
323
                      this.$emit('on-select', selection, JSON.parse(JSON.stringify(this.data[_index])));
0d136465   梁灏   update Table
324
325
326
                  }
                  this.$emit('on-selection-change', selection);
              },
3d9e4f20   梁灏   update Table
327
              selectAll (status) {
6c99b9fe   梁灏   update Table
328
329
330
                  this.rebuildData.forEach((data) => {
                      this.objData[data._index]._isChecked = status;
                  });
3d9e4f20   梁灏   update Table
331
  
52874e27   梁灏   update Table
332
                  const selection = this.getSelection();
3d9e4f20   梁灏   update Table
333
                  if (status) {
52874e27   梁灏   update Table
334
                      this.$emit('on-select-all', selection);
3d9e4f20   梁灏   update Table
335
                  }
52874e27   梁灏   update Table
336
                  this.$emit('on-selection-change', selection);
e7e8c8ff   梁灏   update Table
337
338
339
340
341
342
343
344
345
              },
              fixedHeader () {
                  if (!!this.height) {
                      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;
                      })
f2a051a1   梁灏   publish 0.9.9-rc-6
346
347
                  } else {
                      this.bodyHeight = 0;
e7e8c8ff   梁灏   update Table
348
                  }
abdec99d   梁灏   update Table
349
              },
99f80db0   梁灏   update Table
350
351
352
              hideColumnFilter () {
                  this.cloneColumns.forEach((col) => col._filterVisible = false);
              },
192e2cb8   梁灏   update Table
353
              handleBodyScroll (event) {
b8a43000   梁灏   update Table
354
                  if (this.showHeader) this.$els.header.scrollLeft = event.target.scrollLeft;
a81dc06c   梁灏   publish 0.9.9-rc-4
355
356
                  if (this.isLeftFixed) this.$els.fixedBody.scrollTop = event.target.scrollTop;
                  if (this.isRightFixed) this.$els.fixedRightBody.scrollTop = event.target.scrollTop;
99f80db0   梁灏   update Table
357
                  this.hideColumnFilter();
192e2cb8   梁灏   update Table
358
              },
3ef4dfb9   梁灏   update Table
359
360
361
362
363
364
365
366
367
              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
368
              },
9f853e3e   梁灏   update Table
369
370
371
372
373
374
              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
375
376
377
378
379
                          if (type === 'asc') {
                              return a[key] > b[key] ? 1 : -1;
                          } else if (type === 'desc') {
                              return a[key] < b[key] ? 1 : -1;
                          }
9f853e3e   梁灏   update Table
380
381
382
383
                      }
                  });
                  return data;
              },
52874e27   梁灏   update Table
384
              handleSort (index, type) {
35ad3764   梁灏   update Table
385
386
387
                  this.cloneColumns.forEach((col) => col._sortType = 'normal');
  
                  const key = this.cloneColumns[index].key;
642299b9   梁灏   update Table
388
                  if (this.cloneColumns[index].sortable !== 'custom') {    // custom is for remote sort
9f853e3e   梁灏   update Table
389
                      if (type === 'normal') {
97edb2eb   梁灏   update Table
390
                          this.rebuildData = this.makeDataWithFilter();
9f853e3e   梁灏   update Table
391
392
                      } else {
                          this.rebuildData = this.sortData(this.rebuildData, type, index);
642299b9   梁灏   update Table
393
                      }
52874e27   梁灏   update Table
394
                  }
35ad3764   梁灏   update Table
395
396
397
398
399
400
                  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
401
                  });
741b987a   梁灏   update Table
402
              },
adaeca88   梁灏   update Table
403
404
405
              handleFilterHide (index) {    // clear checked that not filter now
                  if (!this.cloneColumns[index]._isFiltered) this.cloneColumns[index]._filterChecked = [];
              },
cb31ede0   梁灏   update Table
406
407
408
              filterData (data, column) {
                  return data.filter((row) => {
                      let status = !column._filterChecked.length;
adaeca88   梁灏   update Table
409
410
411
412
413
414
                      for (let i = 0; i < column._filterChecked.length; i++) {
                          status = column.filterMethod(column._filterChecked[i], row);
                          if (status) break;
                      }
                      return status;
                  });
cb31ede0   梁灏   update Table
415
416
417
418
419
420
421
422
423
424
425
              },
              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
426
                  let filterData = this.makeDataWithSort();
cb31ede0   梁灏   update Table
427
428
429
430
431
  
                  // filter others first, after filter this column
                  filterData = this.filterOtherData(filterData, index);
                  this.rebuildData = this.filterData(filterData, column);
  
adaeca88   梁灏   update Table
432
433
434
                  this.cloneColumns[index]._isFiltered = true;
                  this.cloneColumns[index]._filterVisible = false;
              },
45e7ed7e   梁灏   update Table
435
436
437
438
              handleFilterSelect (index, value) {
                  this.cloneColumns[index]._filterChecked = [value];
                  this.handleFilter(index);
              },
adaeca88   梁灏   update Table
439
440
              handleFilterReset (index) {
                  this.cloneColumns[index]._isFiltered = false;
45e7ed7e   梁灏   update Table
441
442
                  this.cloneColumns[index]._filterVisible = false;
                  this.cloneColumns[index]._filterChecked = [];
cb31ede0   梁灏   update Table
443
  
9f853e3e   梁灏   update Table
444
                  let filterData = this.makeDataWithSort();
cb31ede0   梁灏   update Table
445
446
                  filterData = this.filterOtherData(filterData, index);
                  this.rebuildData = filterData;
adaeca88   梁灏   update Table
447
              },
741b987a   梁灏   update Table
448
449
450
451
              makeData () {
                  let data = deepCopy(this.data);
                  data.forEach((row, index) => row._index = index);
                  return data;
d3dfdb26   梁灏   update Table
452
              },
9f853e3e   梁灏   update Table
453
454
455
456
457
458
459
460
461
462
463
464
465
466
              makeDataWithSort () {
                  let data = this.makeData();
                  let sortType = 'normal';
                  let sortIndex = -1;
                  for (let i = 0; i < this.cloneColumns.length; i++) {
                      if (this.cloneColumns[i]._sortType !== 'normal') {
                          sortType = this.cloneColumns[i]._sortType;
                          sortIndex = i;
                          break;
                      }
                  }
                  if (sortType !== 'normal') data =  this.sortData(data, sortType, sortIndex);
                  return data;
              },
97edb2eb   梁灏   update Table
467
468
469
470
471
472
473
474
475
476
              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
477
478
479
480
481
482
483
484
485
486
              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
487
488
489
490
491
492
493
494
              },
              makeColumns () {
                  let columns = deepCopy(this.columns);
                  let left = [];
                  let right = [];
                  let center = [];
  
                  columns.forEach((column, index) => {
35ad3764   梁灏   update Table
495
                      column._index = index;
224a3ae5   梁灏   publish 0.9.9-rc-3
496
                      column._width = column.width ? column.width : '';    // update in handleResize()
99f80db0   梁灏   update Table
497
498
499
500
                      column._sortType = 'normal';
                      column._filterVisible = false;
                      column._isFiltered = false;
                      column._filterChecked = [];
35ad3764   梁灏   update Table
501
  
adaeca88   梁灏   update Table
502
503
504
505
506
                      if ('filterMultiple' in column) {
                          column._filterMultiple = column.filterMultiple;
                      } else {
                          column._filterMultiple = true;
                      }
5d0499ce   梁灏   update Table
507
508
509
510
                      if ('filteredValue' in column) {
                          column._filterChecked = column.filteredValue;
                          column._isFiltered = true;
                      }
adaeca88   梁灏   update Table
511
  
35ad3764   梁灏   update Table
512
513
514
515
516
517
518
519
520
                      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...
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
              },
              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...
547
548
              }
          },
e7e8c8ff   梁灏   update Table
549
          compiled () {
d0e206c5   梁灏   Table add content...
550
              if (!this.content) this.content = this.$parent;
e7e8c8ff   梁灏   update Table
551
552
              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
553
              this.rebuildData = this.makeDataWithSortAndFilter();
e7e8c8ff   梁灏   update Table
554
          },
2cb8a6d9   梁灏   commit Table comp...
555
          ready () {
a3547c1b   梁灏   update Table
556
              this.handleResize();
e7e8c8ff   梁灏   update Table
557
              this.fixedHeader();
adaeca88   梁灏   update Table
558
              this.$nextTick(() => this.ready = true);
744eb0af   梁灏   update Table comp...
559
560
561
562
              window.addEventListener('resize', this.handleResize, false);
          },
          beforeDestroy () {
              window.removeEventListener('resize', this.handleResize, false);
2cb8a6d9   梁灏   commit Table comp...
563
564
565
566
          },
          watch: {
              data: {
                  handler () {
d3dfdb26   梁灏   update Table
567
                      this.objData = this.makeObjData();
97edb2eb   梁灏   update Table
568
                      this.rebuildData = this.makeDataWithSortAndFilter();
a3547c1b   梁灏   update Table
569
                      this.handleResize();
2cb8a6d9   梁灏   commit Table comp...
570
571
572
573
574
                  },
                  deep: true
              },
              columns: {
                  handler () {
f2a051a1   梁灏   publish 0.9.9-rc-6
575
                      // todo 这里有性能问题,可能是左右固定计算属性影响的
35ad3764   梁灏   update Table
576
                      this.cloneColumns = this.makeColumns();
97edb2eb   梁灏   update Table
577
                      this.rebuildData = this.makeDataWithSortAndFilter();
a3547c1b   梁灏   update Table
578
                      this.handleResize();
2cb8a6d9   梁灏   commit Table comp...
579
580
                  },
                  deep: true
e7e8c8ff   梁灏   update Table
581
582
583
              },
              height () {
                  this.fixedHeader();
2cb8a6d9   梁灏   commit Table comp...
584
585
586
587
              }
          }
      }
  </script>