Blame view

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