Blame view

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