Blame view

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