Blame view

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