Blame view

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