Blame view

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