Blame view

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