Blame view

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