Blame view

src/components/table/table.vue 31.7 KB
2cb8a6d9   梁灏   commit Table comp...
1
  <template>
45e7ed7e   梁灏   update Table
2
      <div :class="wrapClasses" :style="styles">
39311a50   梁灏   update Table
3
          <div :class="classes">
486d4fda   梁灏   update Table
4
5
              <div :class="[prefixCls + '-title']" v-if="showSlotHeader" ref="title"><slot name="header"></slot></div>
              <div :class="[prefixCls + '-header']" v-if="showHeader" ref="header" @mousewheel="handleMouseWheel">
b8a43000   梁灏   update Table
6
                  <table-head
39311a50   梁灏   update Table
7
                      :prefix-cls="prefixCls"
486d4fda   梁灏   update Table
8
                      :styleObject="tableStyle"
39311a50   梁灏   update Table
9
10
                      :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>
486d4fda   梁灏   update Table
14
              <div :class="[prefixCls + '-body']" :style="bodyStyle" ref="body" @scroll="handleBodyScroll"
e5337c81   梁灏   fixed some compon...
15
                  v-show="!((!!localeNoDataText && (!data || data.length === 0)) || (!!localeNoFilteredDataText && (!rebuildData || rebuildData.length === 0)))">
b8a43000   梁灏   update Table
16
                  <table-body
486d4fda   梁灏   update Table
17
                      ref="tbody"
39311a50   梁灏   update Table
18
                      :prefix-cls="prefixCls"
486d4fda   梁灏   update Table
19
                      :styleObject="tableStyle"
39311a50   梁灏   update Table
20
21
                      :columns="cloneColumns"
                      :data="rebuildData"
224a3ae5   梁灏   publish 0.9.9-rc-3
22
                      :columns-width="columnsWidth"
39311a50   梁灏   update Table
23
                      :obj-data="objData"></table-body>
b8a43000   梁灏   update Table
24
              </div>
2f7660b4   Rijn   fade table body w...
25
26
              <div
                  :class="[prefixCls + '-tip']"
e5337c81   梁灏   fixed some compon...
27
                  v-show="((!!localeNoDataText && (!data || data.length === 0)) || (!!localeNoFilteredDataText && (!rebuildData || rebuildData.length === 0)))">
2f7660b4   Rijn   fade table body w...
28
29
30
31
                  <table cellspacing="0" cellpadding="0" border="0">
                      <tbody>
                          <tr>
                              <td :style="{ 'height': bodyStyle.height }">
e5337c81   梁灏   fixed some compon...
32
33
                                  <span v-html="localeNoDataText" v-if="!data || data.length === 0"></span>
                                  <span v-html="localeNoFilteredDataText" v-else></span>
2f7660b4   Rijn   fade table body w...
34
35
36
37
38
                              </td>
                          </tr>
                      </tbody>
                  </table>
              </div>
a81dc06c   梁灏   publish 0.9.9-rc-4
39
              <div :class="[prefixCls + '-fixed']" :style="fixedTableStyle" v-if="isLeftFixed">
548eac43   梁灏   fixed #1387 and u...
40
                  <div :class="fixedHeaderClasses" v-if="showHeader">
45e7ed7e   梁灏   update Table
41
                      <table-head
5d0499ce   梁灏   update Table
42
                          fixed="left"
39311a50   梁灏   update Table
43
                          :prefix-cls="prefixCls"
486d4fda   梁灏   update Table
44
                          :styleObject="fixedTableStyle"
39311a50   梁灏   update Table
45
46
                          :columns="leftFixedColumns"
                          :obj-data="objData"
68b308ee   梁灏   fixex #1353
47
                          :columns-width="columnsWidth"
39311a50   梁灏   update Table
48
                          :data="rebuildData"></table-head>
45e7ed7e   梁灏   update Table
49
                  </div>
486d4fda   梁灏   update Table
50
                  <div :class="[prefixCls + '-fixed-body']" :style="fixedBodyStyle" ref="fixedBody">
45e7ed7e   梁灏   update Table
51
                      <table-body
5d0499ce   梁灏   update Table
52
                          fixed="left"
39311a50   梁灏   update Table
53
                          :prefix-cls="prefixCls"
486d4fda   梁灏   update Table
54
                          :styleObject="fixedTableStyle"
39311a50   梁灏   update Table
55
56
                          :columns="leftFixedColumns"
                          :data="rebuildData"
224a3ae5   梁灏   publish 0.9.9-rc-3
57
                          :columns-width="columnsWidth"
39311a50   梁灏   update Table
58
                          :obj-data="objData"></table-body>
45e7ed7e   梁灏   update Table
59
                  </div>
b8a43000   梁灏   update Table
60
              </div>
a81dc06c   梁灏   publish 0.9.9-rc-4
61
              <div :class="[prefixCls + '-fixed-right']" :style="fixedRightTableStyle" v-if="isRightFixed">
548eac43   梁灏   fixed #1387 and u...
62
                  <div :class="fixedHeaderClasses" v-if="showHeader">
45e7ed7e   梁灏   update Table
63
                      <table-head
5d0499ce   梁灏   update Table
64
                          fixed="right"
39311a50   梁灏   update Table
65
                          :prefix-cls="prefixCls"
486d4fda   梁灏   update Table
66
                          :styleObject="fixedRightTableStyle"
39311a50   梁灏   update Table
67
68
                          :columns="rightFixedColumns"
                          :obj-data="objData"
486d4fda   梁灏   update Table
69
                          :columns-width="columnsWidth"
39311a50   梁灏   update Table
70
                          :data="rebuildData"></table-head>
45e7ed7e   梁灏   update Table
71
                  </div>
486d4fda   梁灏   update Table
72
                  <div :class="[prefixCls + '-fixed-body']" :style="fixedBodyStyle" ref="fixedRightBody">
45e7ed7e   梁灏   update Table
73
                      <table-body
5d0499ce   梁灏   update Table
74
                          fixed="right"
39311a50   梁灏   update Table
75
                          :prefix-cls="prefixCls"
486d4fda   梁灏   update Table
76
                          :styleObject="fixedRightTableStyle"
39311a50   梁灏   update Table
77
78
                          :columns="rightFixedColumns"
                          :data="rebuildData"
224a3ae5   梁灏   publish 0.9.9-rc-3
79
                          :columns-width="columnsWidth"
39311a50   梁灏   update Table
80
                          :obj-data="objData"></table-body>
45e7ed7e   梁灏   update Table
81
                  </div>
b8a43000   梁灏   update Table
82
              </div>
486d4fda   梁灏   update Table
83
              <div :class="[prefixCls + '-footer']" v-if="showSlotFooter" ref="footer"><slot name="footer"></slot></div>
abdec99d   梁灏   update Table
84
          </div>
300bd662   梁灏   fixed #704
85
86
87
          <Spin fix size="large" v-if="loading">
              <slot name="loading"></slot>
          </Spin>
2cb8a6d9   梁灏   commit Table comp...
88
89
90
      </div>
  </template>
  <script>
7f34c510   梁灏   update Table
91
92
      import tableHead from './table-head.vue';
      import tableBody from './table-body.vue';
300bd662   梁灏   fixed #704
93
      import Spin from '../spin/spin.vue';
3d6fa54b   梁灏   update Table
94
      import { oneOf, getStyle, deepCopy, getScrollBarSize } from '../../utils/assist';
f00b5343   梁灏   update Table
95
      import { on, off } from '../../utils/dom';
43509ad8   梁灏   Table support exp...
96
97
      import Csv from '../../utils/csv';
      import ExportCsv from './export-csv';
e5337c81   梁灏   fixed some compon...
98
99
      import Locale from '../../mixins/locale';
  
2cb8a6d9   梁灏   commit Table comp...
100
101
      const prefixCls = 'ivu-table';
  
68b308ee   梁灏   fixex #1353
102
103
104
      let rowKey = 1;
      let columnKey = 1;
  
2cb8a6d9   梁灏   commit Table comp...
105
      export default {
486d4fda   梁灏   update Table
106
          name: 'Table',
e5337c81   梁灏   fixed some compon...
107
          mixins: [ Locale ],
300bd662   梁灏   fixed #704
108
          components: { tableHead, tableBody, Spin },
2cb8a6d9   梁灏   commit Table comp...
109
110
111
112
          props: {
              data: {
                  type: Array,
                  default () {
b0893113   jingsam   :art: add eslint
113
                      return [];
2cb8a6d9   梁灏   commit Table comp...
114
115
116
117
118
                  }
              },
              columns: {
                  type: Array,
                  default () {
b0893113   jingsam   :art: add eslint
119
                      return [];
2cb8a6d9   梁灏   commit Table comp...
120
121
122
123
                  }
              },
              size: {
                  validator (value) {
f2a051a1   梁灏   publish 0.9.9-rc-6
124
                      return oneOf(value, ['small', 'large', 'default']);
2cb8a6d9   梁灏   commit Table comp...
125
126
                  }
              },
3ef4dfb9   梁灏   update Table
127
128
129
              width: {
                  type: [Number, String]
              },
e7e8c8ff   梁灏   update Table
130
131
132
              height: {
                  type: [Number, String]
              },
2cb8a6d9   梁灏   commit Table comp...
133
134
135
136
137
138
139
140
              stripe: {
                  type: Boolean,
                  default: false
              },
              border: {
                  type: Boolean,
                  default: false
              },
2cb8a6d9   梁灏   commit Table comp...
141
142
143
144
              showHeader: {
                  type: Boolean,
                  default: true
              },
0d136465   梁灏   update Table
145
              highlightRow: {
2cb8a6d9   梁灏   commit Table comp...
146
147
                  type: Boolean,
                  default: false
e7e8c8ff   梁灏   update Table
148
149
150
151
152
153
              },
              rowClassName: {
                  type: Function,
                  default () {
                      return '';
                  }
d0e206c5   梁灏   Table add content...
154
              },
d8892603   梁灏   Table prop: conte...
155
              context: {
d0e206c5   梁灏   Table add content...
156
                  type: Object
cf7887ba   Rijn   Fixed #151
157
158
              },
              noDataText: {
e5337c81   梁灏   fixed some compon...
159
                  type: String
cf7887ba   Rijn   Fixed #151
160
161
              },
              noFilteredDataText: {
e5337c81   梁灏   fixed some compon...
162
                  type: String
2474ee59   Lawrence Lee   add hover-highlig...
163
              },
174158b1   Lawrence Lee   change disable-ho...
164
              disabledHover: {
2474ee59   Lawrence Lee   add hover-highlig...
165
                  type: Boolean
300bd662   梁灏   fixed #704
166
167
168
169
              },
              loading: {
                  type: Boolean,
                  default: false
2cb8a6d9   梁灏   commit Table comp...
170
171
172
173
              }
          },
          data () {
              return {
adaeca88   梁灏   update Table
174
                  ready: false,
744eb0af   梁灏   update Table comp...
175
                  tableWidth: 0,
224a3ae5   梁灏   publish 0.9.9-rc-3
176
                  columnsWidth: {},
2cb8a6d9   梁灏   commit Table comp...
177
                  prefixCls: prefixCls,
0d136465   梁灏   update Table
178
                  compiledUids: [],
35ad3764   梁灏   update Table
179
                  objData: this.makeObjData(),     // checkbox or highlight-row
5d0499ce   梁灏   update Table
180
                  rebuildData: [],    // for sort or filter
35ad3764   梁灏   update Table
181
                  cloneColumns: this.makeColumns(),
e7e8c8ff   梁灏   update Table
182
183
                  showSlotHeader: true,
                  showSlotFooter: true,
3d6fa54b   梁灏   update Table
184
                  bodyHeight: 0,
d16dce64   梁灏   fixed #193
185
                  bodyRealHeight: 0,
486d4fda   梁灏   update Table
186
                  scrollBarWidth: getScrollBarSize(),
d8892603   梁灏   Table prop: conte...
187
                  currentContext: this.context,
63f2e0f4   梁灏   fixed Table bug w...
188
                  cloneData: deepCopy(this.data)    // when Cell has a button to delete row data, clickCurrentRow will throw an error, so clone a data
b0893113   jingsam   :art: add eslint
189
              };
2cb8a6d9   梁灏   commit Table comp...
190
191
          },
          computed: {
e5337c81   梁灏   fixed some compon...
192
193
194
195
196
197
198
199
200
201
202
203
204
205
              localeNoDataText () {
                  if (this.noDataText === undefined) {
                      return this.t('i.table.noDataText');
                  } else {
                      return this.noDataText;
                  }
              },
              localeNoFilteredDataText () {
                  if (this.noFilteredDataText === undefined) {
                      return this.t('i.table.noFilteredDataText');
                  } else {
                      return this.noFilteredDataText;
                  }
              },
45e7ed7e   梁灏   update Table
206
207
208
209
              wrapClasses () {
                  return [
                      `${prefixCls}-wrapper`,
                      {
0f4ccf44   梁灏   release 0.9.9
210
211
212
                          [`${prefixCls}-hide`]: !this.ready,
                          [`${prefixCls}-with-header`]: this.showSlotHeader,
                          [`${prefixCls}-with-footer`]: this.showSlotFooter
45e7ed7e   梁灏   update Table
213
                      }
b0893113   jingsam   :art: add eslint
214
                  ];
45e7ed7e   梁灏   update Table
215
              },
2cb8a6d9   梁灏   commit Table comp...
216
217
218
219
              classes () {
                  return [
                      `${prefixCls}`,
                      {
0d136465   梁灏   update Table
220
221
                          [`${prefixCls}-${this.size}`]: !!this.size,
                          [`${prefixCls}-border`]: this.border,
e7e8c8ff   梁灏   update Table
222
                          [`${prefixCls}-stripe`]: this.stripe,
e7e8c8ff   梁灏   update Table
223
                          [`${prefixCls}-with-fixed-top`]: !!this.height
2cb8a6d9   梁灏   commit Table comp...
224
                      }
b0893113   jingsam   :art: add eslint
225
                  ];
0d136465   梁灏   update Table
226
              },
548eac43   梁灏   fixed #1387 and u...
227
228
229
230
231
232
233
234
              fixedHeaderClasses () {
                  return [
                      `${prefixCls}-fixed-header`,
                      {
                          [`${prefixCls}-fixed-header-with-empty`]: !this.rebuildData.length
                      }
                  ];
              },
e7e8c8ff   梁灏   update Table
235
236
              styles () {
                  let style = {};
3d6fa54b   梁灏   update Table
237
238
239
240
                  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
241
                  if (this.width) style.width = `${this.width}px`;
e7e8c8ff   梁灏   update Table
242
243
                  return style;
              },
0d136465   梁灏   update Table
244
245
              tableStyle () {
                  let style = {};
3d6fa54b   梁灏   update Table
246
                  if (this.tableWidth !== 0) {
d16dce64   梁灏   fixed #193
247
248
249
250
251
252
253
254
255
256
257
                      let width = '';
                      if (this.bodyHeight === 0) {
                          width = this.tableWidth;
                      } else {
                          if (this.bodyHeight > this.bodyRealHeight) {
                              width = this.tableWidth;
                          } else {
                              width = this.tableWidth - this.scrollBarWidth;
                          }
                      }
  //                    const width = this.bodyHeight === 0 ? this.tableWidth : this.tableWidth - this.scrollBarWidth;
3d6fa54b   梁灏   update Table
258
259
                      style.width = `${width}px`;
                  }
0d136465   梁灏   update Table
260
                  return style;
e7e8c8ff   梁灏   update Table
261
              },
7f34c510   梁灏   update Table
262
263
              fixedTableStyle () {
                  let style = {};
5d0499ce   梁灏   update Table
264
265
                  let width = 0;
                  this.leftFixedColumns.forEach((col) => {
224a3ae5   梁灏   publish 0.9.9-rc-3
266
                      if (col.fixed && col.fixed === 'left') width += col._width;
5d0499ce   梁灏   update Table
267
268
                  });
                  style.width = `${width}px`;
7f34c510   梁灏   update Table
269
270
271
272
                  return style;
              },
              fixedRightTableStyle () {
                  let style = {};
5d0499ce   梁灏   update Table
273
274
                  let width = 0;
                  this.rightFixedColumns.forEach((col) => {
224a3ae5   梁灏   publish 0.9.9-rc-3
275
                      if (col.fixed && col.fixed === 'right') width += col._width;
5d0499ce   梁灏   update Table
276
                  });
3d6fa54b   梁灏   update Table
277
                  width += this.scrollBarWidth;
5d0499ce   梁灏   update Table
278
                  style.width = `${width}px`;
7f34c510   梁灏   update Table
279
280
                  return style;
              },
e7e8c8ff   梁灏   update Table
281
282
              bodyStyle () {
                  let style = {};
3d6fa54b   梁灏   update Table
283
284
285
286
287
                  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
288
                  return style;
b8a43000   梁灏   update Table
289
290
291
              },
              fixedBodyStyle () {
                  let style = {};
3d6fa54b   梁灏   update Table
292
                  if (this.bodyHeight !== 0) {
d16dce64   梁灏   fixed #193
293
294
295
296
297
298
299
                      let height = this.bodyHeight + this.scrollBarWidth - 1;
  
                      if (this.width && this.width < this.tableWidth){
                          height = this.bodyHeight;
                      }
  //                    style.height = this.scrollBarWidth > 0 ? `${this.bodyHeight}px` : `${this.bodyHeight - 1}px`;
                      style.height = this.scrollBarWidth > 0 ? `${height}px` : `${height - 1}px`;
3d6fa54b   梁灏   update Table
300
                  }
b8a43000   梁灏   update Table
301
                  return style;
35ad3764   梁灏   update Table
302
303
304
              },
              leftFixedColumns () {
                  let left = [];
5d0499ce   梁灏   update Table
305
                  let other = [];
35ad3764   梁灏   update Table
306
307
308
                  this.cloneColumns.forEach((col) => {
                      if (col.fixed && col.fixed === 'left') {
                          left.push(col);
5d0499ce   梁灏   update Table
309
310
                      } else {
                          other.push(col);
35ad3764   梁灏   update Table
311
312
                      }
                  });
5d0499ce   梁灏   update Table
313
                  return left.concat(other);
35ad3764   梁灏   update Table
314
315
316
              },
              rightFixedColumns () {
                  let right = [];
5d0499ce   梁灏   update Table
317
                  let other = [];
35ad3764   梁灏   update Table
318
319
320
                  this.cloneColumns.forEach((col) => {
                      if (col.fixed && col.fixed === 'right') {
                          right.push(col);
5d0499ce   梁灏   update Table
321
322
                      } else {
                          other.push(col);
35ad3764   梁灏   update Table
323
324
                      }
                  });
5d0499ce   梁灏   update Table
325
                  return right.concat(other);
a81dc06c   梁灏   publish 0.9.9-rc-4
326
327
328
329
330
331
              },
              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...
332
333
334
              }
          },
          methods: {
e7e8c8ff   梁灏   update Table
335
336
337
              rowClsName (index) {
                  return this.rowClassName(this.data[index], index);
              },
a3547c1b   梁灏   update Table
338
              handleResize () {
2cb8a6d9   梁灏   commit Table comp...
339
                  this.$nextTick(() => {
224a3ae5   梁灏   publish 0.9.9-rc-3
340
                      const allWidth = !this.columns.some(cell => !cell.width);    // each column set a width
a3547c1b   梁灏   update Table
341
                      if (allWidth) {
6a248176   Sergio Crisostomo   Add counter start...
342
                          this.tableWidth = this.columns.map(cell => cell.width).reduce((a, b) => a + b, 0);
a3547c1b   梁灏   update Table
343
344
                      } else {
                          this.tableWidth = parseInt(getStyle(this.$el, 'width')) - 1;
2cb8a6d9   梁灏   commit Table comp...
345
                      }
224a3ae5   梁灏   publish 0.9.9-rc-3
346
                      this.columnsWidth = {};
a3547c1b   梁灏   update Table
347
                      this.$nextTick(() => {
224a3ae5   梁灏   publish 0.9.9-rc-3
348
                          let columnsWidth = {};
192e2cb8   梁灏   update Table
349
                          let autoWidthIndex = -1;
224a3ae5   梁灏   publish 0.9.9-rc-3
350
                          if (allWidth) autoWidthIndex = this.cloneColumns.findIndex(cell => !cell.width);//todo 这行可能有问题
192e2cb8   梁灏   update Table
351
  
d0e206c5   梁灏   Table add content...
352
353
354
355
                          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
356
  
d0e206c5   梁灏   Table add content...
357
358
359
360
361
                                  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
362
  
d0e206c5   梁灏   Table add content...
363
                                  this.cloneColumns[i]._width = width;
224a3ae5   梁灏   publish 0.9.9-rc-3
364
  
d0e206c5   梁灏   Table add content...
365
366
                                  columnsWidth[column._index] = {
                                      width: width
b0893113   jingsam   :art: add eslint
367
                                  };
2cb8a6d9   梁灏   commit Table comp...
368
                              }
d0e206c5   梁灏   Table add content...
369
                              this.columnsWidth = columnsWidth;
192e2cb8   梁灏   update Table
370
                          }
744eb0af   梁灏   update Table comp...
371
                      });
d16dce64   梁灏   fixed #193
372
373
                      // get table real height,for fixed when set height prop,but height < table's height,show scrollBarWidth
                      this.bodyRealHeight = parseInt(getStyle(this.$refs.tbody.$el, 'height'));
744eb0af   梁灏   update Table comp...
374
375
                  });
              },
d3dfdb26   梁灏   update Table
376
              handleMouseIn (_index) {
174158b1   Lawrence Lee   change disable-ho...
377
                  if (this.disabledHover) return;
d3dfdb26   梁灏   update Table
378
379
                  if (this.objData[_index]._isHover) return;
                  this.objData[_index]._isHover = true;
abdec99d   梁灏   update Table
380
              },
d3dfdb26   梁灏   update Table
381
              handleMouseOut (_index) {
174158b1   Lawrence Lee   change disable-ho...
382
                  if (this.disabledHover) return;
d3dfdb26   梁灏   update Table
383
                  this.objData[_index]._isHover = false;
abdec99d   梁灏   update Table
384
              },
3aca3d56   梁灏   fixed #1372
385
386
              // 通用处理 highlightCurrentRow 和 clearCurrentRow
              handleCurrentRow (type, _index) {
0d136465   梁灏   update Table
387
                  let oldIndex = -1;
d3dfdb26   梁灏   update Table
388
389
390
391
                  for (let i in this.objData) {
                      if (this.objData[i]._isHighlight) {
                          oldIndex = parseInt(i);
                          this.objData[i]._isHighlight = false;
0d136465   梁灏   update Table
392
                      }
d3dfdb26   梁灏   update Table
393
                  }
3aca3d56   梁灏   fixed #1372
394
                  if (type === 'highlight') this.objData[_index]._isHighlight = true;
63f2e0f4   梁灏   fixed Table bug w...
395
                  const oldData = oldIndex < 0 ? null : JSON.parse(JSON.stringify(this.cloneData[oldIndex]));
3aca3d56   梁灏   fixed #1372
396
397
398
399
400
401
402
403
404
405
                  const newData = type === 'highlight' ? JSON.parse(JSON.stringify(this.cloneData[_index])) : null;
                  this.$emit('on-current-change', newData, oldData);
              },
              highlightCurrentRow (_index) {
                  if (!this.highlightRow || this.objData[_index]._isHighlight) return;
                  this.handleCurrentRow('highlight', _index);
              },
              clearCurrentRow () {
                  if (!this.highlightRow) return;
                  this.handleCurrentRow('clear');
0d136465   梁灏   update Table
406
              },
da55375f   Rijn   Added click and d...
407
408
              clickCurrentRow (_index) {
                  this.highlightCurrentRow (_index);
ade5dbba   梁灏   fixed #693
409
                  this.$emit('on-row-click', JSON.parse(JSON.stringify(this.cloneData[_index])), _index);
da55375f   Rijn   Added click and d...
410
411
412
              },
              dblclickCurrentRow (_index) {
                  this.highlightCurrentRow (_index);
ade5dbba   梁灏   fixed #693
413
                  this.$emit('on-row-dblclick', JSON.parse(JSON.stringify(this.cloneData[_index])), _index);
da55375f   Rijn   Added click and d...
414
              },
0d136465   梁灏   update Table
415
416
              getSelection () {
                  let selectionIndexes = [];
d3dfdb26   梁灏   update Table
417
418
419
                  for (let i in this.objData) {
                      if (this.objData[i]._isChecked) selectionIndexes.push(parseInt(i));
                  }
0d136465   梁灏   update Table
420
421
                  return JSON.parse(JSON.stringify(this.data.filter((data, index) => selectionIndexes.indexOf(index) > -1)));
              },
d3dfdb26   梁灏   update Table
422
              toggleSelect (_index) {
741b987a   梁灏   update Table
423
                  let data = {};
d3dfdb26   梁灏   update Table
424
425
426
427
  
                  for (let i in this.objData) {
                      if (parseInt(i) === _index) {
                          data = this.objData[i];
741b987a   梁灏   update Table
428
429
430
                      }
                  }
                  const status = !data._isChecked;
d3dfdb26   梁灏   update Table
431
432
  
                  this.objData[_index]._isChecked = status;
0d136465   梁灏   update Table
433
434
  
                  const selection = this.getSelection();
b0f1c61f   Rijn   add a event @on-s...
435
                  this.$emit(status ? 'on-select' : 'on-select-cancel', selection, JSON.parse(JSON.stringify(this.data[_index])));
0d136465   梁灏   update Table
436
437
                  this.$emit('on-selection-change', selection);
              },
08fd628d   Aresn   Table support expand
438
439
440
441
442
443
444
445
446
447
448
449
              toggleExpand (_index) {
                  let data = {};
  
                  for (let i in this.objData) {
                      if (parseInt(i) === _index) {
                          data = this.objData[i];
                      }
                  }
                  const status = !data._isExpanded;
                  this.objData[_index]._isExpanded = status;
                  this.$emit('on-expand', JSON.parse(JSON.stringify(this.cloneData[_index])), status);
              },
3d9e4f20   梁灏   update Table
450
              selectAll (status) {
cd85c675   leonine   修改_checked=true 时...
451
452
453
454
455
456
                  // this.rebuildData.forEach((data) => {
                  //     if(this.objData[data._index]._isDisabled){
                  //         this.objData[data._index]._isChecked = false;
                  //     }else{
                  //         this.objData[data._index]._isChecked = status;
                  //     }
6a248176   Sergio Crisostomo   Add counter start...
457
  
cd85c675   leonine   修改_checked=true 时...
458
459
                  // });
                  for(const data of this.rebuildData){
0dcc9482   leonine   itable 添加禁用某行选中的功能
460
                      if(this.objData[data._index]._isDisabled){
cd85c675   leonine   修改_checked=true 时...
461
                          continue;
0dcc9482   leonine   itable 添加禁用某行选中的功能
462
463
464
                      }else{
                          this.objData[data._index]._isChecked = status;
                      }
cd85c675   leonine   修改_checked=true 时...
465
                  }
52874e27   梁灏   update Table
466
                  const selection = this.getSelection();
3d9e4f20   梁灏   update Table
467
                  if (status) {
52874e27   梁灏   update Table
468
                      this.$emit('on-select-all', selection);
3d9e4f20   梁灏   update Table
469
                  }
52874e27   梁灏   update Table
470
                  this.$emit('on-selection-change', selection);
e7e8c8ff   梁灏   update Table
471
472
              },
              fixedHeader () {
b0893113   jingsam   :art: add eslint
473
                  if (this.height) {
e7e8c8ff   梁灏   update Table
474
                      this.$nextTick(() => {
486d4fda   梁灏   update Table
475
476
477
                          const titleHeight = parseInt(getStyle(this.$refs.title, 'height')) || 0;
                          const headerHeight = parseInt(getStyle(this.$refs.header, 'height')) || 0;
                          const footerHeight = parseInt(getStyle(this.$refs.footer, 'height')) || 0;
e7e8c8ff   梁灏   update Table
478
                          this.bodyHeight = this.height - titleHeight - headerHeight - footerHeight;
b0893113   jingsam   :art: add eslint
479
                      });
f2a051a1   梁灏   publish 0.9.9-rc-6
480
481
                  } else {
                      this.bodyHeight = 0;
e7e8c8ff   梁灏   update Table
482
                  }
abdec99d   梁灏   update Table
483
              },
99f80db0   梁灏   update Table
484
485
486
              hideColumnFilter () {
                  this.cloneColumns.forEach((col) => col._filterVisible = false);
              },
192e2cb8   梁灏   update Table
487
              handleBodyScroll (event) {
486d4fda   梁灏   update Table
488
489
490
                  if (this.showHeader) this.$refs.header.scrollLeft = event.target.scrollLeft;
                  if (this.isLeftFixed) this.$refs.fixedBody.scrollTop = event.target.scrollTop;
                  if (this.isRightFixed) this.$refs.fixedRightBody.scrollTop = event.target.scrollTop;
99f80db0   梁灏   update Table
491
                  this.hideColumnFilter();
192e2cb8   梁灏   update Table
492
              },
3ef4dfb9   梁灏   update Table
493
494
              handleMouseWheel (event) {
                  const deltaX = event.deltaX;
486d4fda   梁灏   update Table
495
                  const $body = this.$refs.body;
3ef4dfb9   梁灏   update Table
496
497
498
499
500
501
  
                  if (deltaX > 0) {
                      $body.scrollLeft = $body.scrollLeft + 10;
                  } else {
                      $body.scrollLeft = $body.scrollLeft - 10;
                  }
52874e27   梁灏   update Table
502
              },
9f853e3e   梁灏   update Table
503
504
505
506
              sortData (data, type, index) {
                  const key = this.cloneColumns[index].key;
                  data.sort((a, b) => {
                      if (this.cloneColumns[index].sortMethod) {
da020a63   Rijn   Changed parameter...
507
                          return this.cloneColumns[index].sortMethod(a[key], b[key], type);
9f853e3e   梁灏   update Table
508
                      } else {
89670198   梁灏   publish 0.9.9-rc-5
509
510
511
512
513
                          if (type === 'asc') {
                              return a[key] > b[key] ? 1 : -1;
                          } else if (type === 'desc') {
                              return a[key] < b[key] ? 1 : -1;
                          }
9f853e3e   梁灏   update Table
514
515
516
517
                      }
                  });
                  return data;
              },
52874e27   梁灏   update Table
518
              handleSort (index, type) {
35ad3764   梁灏   update Table
519
520
521
                  this.cloneColumns.forEach((col) => col._sortType = 'normal');
  
                  const key = this.cloneColumns[index].key;
642299b9   梁灏   update Table
522
                  if (this.cloneColumns[index].sortable !== 'custom') {    // custom is for remote sort
9f853e3e   梁灏   update Table
523
                      if (type === 'normal') {
97edb2eb   梁灏   update Table
524
                          this.rebuildData = this.makeDataWithFilter();
9f853e3e   梁灏   update Table
525
526
                      } else {
                          this.rebuildData = this.sortData(this.rebuildData, type, index);
642299b9   梁灏   update Table
527
                      }
52874e27   梁灏   update Table
528
                  }
35ad3764   梁灏   update Table
529
530
531
532
533
534
                  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
535
                  });
741b987a   梁灏   update Table
536
              },
adaeca88   梁灏   update Table
537
538
539
              handleFilterHide (index) {    // clear checked that not filter now
                  if (!this.cloneColumns[index]._isFiltered) this.cloneColumns[index]._filterChecked = [];
              },
cb31ede0   梁灏   update Table
540
541
              filterData (data, column) {
                  return data.filter((row) => {
73ae27d8   梁灏   update Table filt...
542
                      //如果定义了远程过滤方法则忽略此方法
257bc4e6   H   filterRemote过滤时,单...
543
                      if (typeof column.filterRemote === 'function') return true;
73ae27d8   梁灏   update Table filt...
544
  
cb31ede0   梁灏   update Table
545
                      let status = !column._filterChecked.length;
adaeca88   梁灏   update Table
546
547
548
549
550
551
                      for (let i = 0; i < column._filterChecked.length; i++) {
                          status = column.filterMethod(column._filterChecked[i], row);
                          if (status) break;
                      }
                      return status;
                  });
cb31ede0   梁灏   update Table
552
553
              },
              filterOtherData (data, index) {
12bcf7bd   H   添加 remoteFilter方法...
554
                  let column = this.cloneColumns[index];
73ae27d8   梁灏   update Table filt...
555
556
                  if (typeof column.filterRemote === 'function') {
                      column.filterRemote.call(this.$parent, column._filterChecked, column.key, column);
12bcf7bd   H   添加 remoteFilter方法...
557
558
                  }
  
cb31ede0   梁灏   update Table
559
560
561
562
563
564
565
566
567
                  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
568
                  let filterData = this.makeDataWithSort();
cb31ede0   梁灏   update Table
569
570
571
572
573
  
                  // filter others first, after filter this column
                  filterData = this.filterOtherData(filterData, index);
                  this.rebuildData = this.filterData(filterData, column);
  
adaeca88   梁灏   update Table
574
575
576
                  this.cloneColumns[index]._isFiltered = true;
                  this.cloneColumns[index]._filterVisible = false;
              },
45e7ed7e   梁灏   update Table
577
578
579
580
              handleFilterSelect (index, value) {
                  this.cloneColumns[index]._filterChecked = [value];
                  this.handleFilter(index);
              },
adaeca88   梁灏   update Table
581
582
              handleFilterReset (index) {
                  this.cloneColumns[index]._isFiltered = false;
45e7ed7e   梁灏   update Table
583
584
                  this.cloneColumns[index]._filterVisible = false;
                  this.cloneColumns[index]._filterChecked = [];
cb31ede0   梁灏   update Table
585
  
9f853e3e   梁灏   update Table
586
                  let filterData = this.makeDataWithSort();
cb31ede0   梁灏   update Table
587
588
                  filterData = this.filterOtherData(filterData, index);
                  this.rebuildData = filterData;
adaeca88   梁灏   update Table
589
              },
741b987a   梁灏   update Table
590
591
              makeData () {
                  let data = deepCopy(this.data);
68b308ee   梁灏   fixex #1353
592
593
594
595
                  data.forEach((row, index) => {
                      row._index = index;
                      row._rowKey = rowKey++;
                  });
741b987a   梁灏   update Table
596
                  return data;
d3dfdb26   梁灏   update Table
597
              },
9f853e3e   梁灏   update Table
598
599
600
601
              makeDataWithSort () {
                  let data = this.makeData();
                  let sortType = 'normal';
                  let sortIndex = -1;
2533a192   梁灏   update DatePicker
602
603
                  let isCustom = false;
  
9f853e3e   梁灏   update Table
604
605
606
607
                  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
608
                          isCustom = this.cloneColumns[i].sortable === 'custom';
9f853e3e   梁灏   update Table
609
610
611
                          break;
                      }
                  }
2533a192   梁灏   update DatePicker
612
                  if (sortType !== 'normal' && !isCustom) data =  this.sortData(data, sortType, sortIndex);
9f853e3e   梁灏   update Table
613
614
                  return data;
              },
97edb2eb   梁灏   update Table
615
616
617
618
619
620
621
622
623
624
              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
625
626
627
628
629
              makeObjData () {
                  let data = {};
                  this.data.forEach((row, index) => {
                      const newRow = deepCopy(row);// todo 直接替换
                      newRow._isHover = false;
08fd628d   Aresn   Table support expand
630
                      if (newRow._disabled) {
c7315098   leonine   修复两个问题:
631
                          newRow._isDisabled = newRow._disabled;
08fd628d   Aresn   Table support expand
632
                      } else {
c7315098   leonine   修复两个问题:
633
634
                          newRow._isDisabled = false;
                      }
2404849c   leonine   合并原作者更新
635
                      if (newRow._checked) {
03773f7e   梁灏   update
636
                          newRow._isChecked = newRow._checked;
2404849c   leonine   合并原作者更新
637
                      } else {
1594942f   leonine   itable 添加设置默认选中行的功能
638
639
                          newRow._isChecked = false;
                      }
08fd628d   Aresn   Table support expand
640
641
642
643
644
                      if (newRow._expanded) {
                          newRow._isExpanded = newRow._expanded;
                      } else {
                          newRow._isExpanded = false;
                      }
2404849c   leonine   合并原作者更新
645
646
647
648
649
                      if (newRow._highlight) {
                          newRow._isHighlight = newRow._highlight;
                      } else {
                          newRow._isHighlight = false;
                      }
d3dfdb26   梁灏   update Table
650
651
652
                      data[index] = newRow;
                  });
                  return data;
35ad3764   梁灏   update Table
653
654
655
656
657
658
659
660
              },
              makeColumns () {
                  let columns = deepCopy(this.columns);
                  let left = [];
                  let right = [];
                  let center = [];
  
                  columns.forEach((column, index) => {
35ad3764   梁灏   update Table
661
                      column._index = index;
68b308ee   梁灏   fixex #1353
662
                      column._columnKey = columnKey++;
224a3ae5   梁灏   publish 0.9.9-rc-3
663
                      column._width = column.width ? column.width : '';    // update in handleResize()
99f80db0   梁灏   update Table
664
665
666
667
                      column._sortType = 'normal';
                      column._filterVisible = false;
                      column._isFiltered = false;
                      column._filterChecked = [];
35ad3764   梁灏   update Table
668
  
adaeca88   梁灏   update Table
669
670
671
672
673
                      if ('filterMultiple' in column) {
                          column._filterMultiple = column.filterMultiple;
                      } else {
                          column._filterMultiple = true;
                      }
5d0499ce   梁灏   update Table
674
675
676
677
                      if ('filteredValue' in column) {
                          column._filterChecked = column.filteredValue;
                          column._isFiltered = true;
                      }
adaeca88   梁灏   update Table
678
  
835b37ff   梁灏   fixed #1403
679
680
681
682
                      if ('sortType' in column) {
                          column._sortType = column.sortType;
                      }
  
35ad3764   梁灏   update Table
683
684
685
686
687
688
689
690
691
                      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...
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
              },
              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...
718
719
              }
          },
486d4fda   梁灏   update Table
720
          created () {
d8892603   梁灏   Table prop: conte...
721
              if (!this.context) this.currentContext = this.$parent;
7409cb3c   梁灏   fixed #549
722
723
              this.showSlotHeader = this.$slots.header !== undefined;
              this.showSlotFooter = this.$slots.footer !== undefined;
5d0499ce   梁灏   update Table
724
              this.rebuildData = this.makeDataWithSortAndFilter();
e7e8c8ff   梁灏   update Table
725
          },
486d4fda   梁灏   update Table
726
          mounted () {
a3547c1b   梁灏   update Table
727
              this.handleResize();
e7e8c8ff   梁灏   update Table
728
              this.fixedHeader();
adaeca88   梁灏   update Table
729
              this.$nextTick(() => this.ready = true);
f00b5343   梁灏   update Table
730
731
  //            window.addEventListener('resize', this.handleResize, false);
              on(window, 'resize', this.handleResize);
67c9b1c8   梁灏   fixed #591
732
              this.$on('on-visible-change', (val) => {
a6eee4e5   梁灏   update Table
733
734
735
736
                  if (val) {
                      this.handleResize();
                      this.fixedHeader();
                  }
67c9b1c8   梁灏   fixed #591
737
              });
744eb0af   梁灏   update Table comp...
738
739
          },
          beforeDestroy () {
f00b5343   梁灏   update Table
740
741
  //            window.removeEventListener('resize', this.handleResize, false);
              off(window, 'resize', this.handleResize);
2cb8a6d9   梁灏   commit Table comp...
742
743
744
745
          },
          watch: {
              data: {
                  handler () {
119eeafe   梁灏   fixed a Table bug
746
                      const oldDataLen = this.rebuildData.length;
d3dfdb26   梁灏   update Table
747
                      this.objData = this.makeObjData();
97edb2eb   梁灏   update Table
748
                      this.rebuildData = this.makeDataWithSortAndFilter();
a3547c1b   梁灏   update Table
749
                      this.handleResize();
119eeafe   梁灏   fixed a Table bug
750
751
752
                      if (!oldDataLen) {
                          this.fixedHeader();
                      }
63f2e0f4   梁灏   fixed Table bug w...
753
754
755
756
                      // here will trigger before clickCurrentRow, so use async
                      setTimeout(() => {
                          this.cloneData = deepCopy(this.data);
                      }, 0);
2cb8a6d9   梁灏   commit Table comp...
757
758
759
760
761
                  },
                  deep: true
              },
              columns: {
                  handler () {
f2a051a1   梁灏   publish 0.9.9-rc-6
762
                      // todo 这里有性能问题,可能是左右固定计算属性影响的
35ad3764   梁灏   update Table
763
                      this.cloneColumns = this.makeColumns();
97edb2eb   梁灏   update Table
764
                      this.rebuildData = this.makeDataWithSortAndFilter();
a3547c1b   梁灏   update Table
765
                      this.handleResize();
2cb8a6d9   梁灏   commit Table comp...
766
767
                  },
                  deep: true
e7e8c8ff   梁灏   update Table
768
769
770
              },
              height () {
                  this.fixedHeader();
2cb8a6d9   梁灏   commit Table comp...
771
772
              }
          }
b0893113   jingsam   :art: add eslint
773
774
      };
  </script>