Blame view

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