Blame view

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