Blame view

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