Blame view

src/components/table/table.vue 24.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>
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';
0d136465   梁灏   update Table
88
      import { oneOf, getStyle, deepCopy } 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
146
147
148
149
150
              },
              noDataText: {
                  type: String,
                  default: '无数据'
              },
              noFilteredDataText: {
                  type: String,
                  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
165
                  showSlotHeader: true,
                  showSlotFooter: true,
                  bodyHeight: 0
b0893113   jingsam   :art: add eslint
166
              };
2cb8a6d9   梁灏   commit Table comp...
167
168
          },
          computed: {
45e7ed7e   梁灏   update Table
169
170
171
172
              wrapClasses () {
                  return [
                      `${prefixCls}-wrapper`,
                      {
0f4ccf44   梁灏   release 0.9.9
173
174
175
                          [`${prefixCls}-hide`]: !this.ready,
                          [`${prefixCls}-with-header`]: this.showSlotHeader,
                          [`${prefixCls}-with-footer`]: this.showSlotFooter
45e7ed7e   梁灏   update Table
176
                      }
b0893113   jingsam   :art: add eslint
177
                  ];
45e7ed7e   梁灏   update Table
178
              },
2cb8a6d9   梁灏   commit Table comp...
179
180
181
182
              classes () {
                  return [
                      `${prefixCls}`,
                      {
0d136465   梁灏   update Table
183
184
                          [`${prefixCls}-${this.size}`]: !!this.size,
                          [`${prefixCls}-border`]: this.border,
e7e8c8ff   梁灏   update Table
185
                          [`${prefixCls}-stripe`]: this.stripe,
e7e8c8ff   梁灏   update Table
186
                          [`${prefixCls}-with-fixed-top`]: !!this.height
2cb8a6d9   梁灏   commit Table comp...
187
                      }
b0893113   jingsam   :art: add eslint
188
                  ];
0d136465   梁灏   update Table
189
              },
e7e8c8ff   梁灏   update Table
190
191
              styles () {
                  let style = {};
b0893113   jingsam   :art: add eslint
192
193
                  if (this.height) style.height = `${this.height}px`;
                  if (this.width) style.width = `${this.width}px`;
e7e8c8ff   梁灏   update Table
194
195
                  return style;
              },
0d136465   梁灏   update Table
196
197
198
199
              tableStyle () {
                  let style = {};
                  if (this.tableWidth !== 0) style.width = `${this.tableWidth}px`;
                  return style;
e7e8c8ff   梁灏   update Table
200
              },
7f34c510   梁灏   update Table
201
202
              fixedTableStyle () {
                  let style = {};
5d0499ce   梁灏   update Table
203
204
                  let width = 0;
                  this.leftFixedColumns.forEach((col) => {
224a3ae5   梁灏   publish 0.9.9-rc-3
205
                      if (col.fixed && col.fixed === 'left') width += col._width;
5d0499ce   梁灏   update Table
206
207
                  });
                  style.width = `${width}px`;
7f34c510   梁灏   update Table
208
209
210
211
                  return style;
              },
              fixedRightTableStyle () {
                  let style = {};
5d0499ce   梁灏   update Table
212
213
                  let width = 0;
                  this.rightFixedColumns.forEach((col) => {
224a3ae5   梁灏   publish 0.9.9-rc-3
214
                      if (col.fixed && col.fixed === 'right') width += col._width;
5d0499ce   梁灏   update Table
215
216
                  });
                  style.width = `${width}px`;
7f34c510   梁灏   update Table
217
218
                  return style;
              },
e7e8c8ff   梁灏   update Table
219
220
221
222
              bodyStyle () {
                  let style = {};
                  if (this.bodyHeight !== 0) style.height = `${this.bodyHeight}px`;
                  return style;
b8a43000   梁灏   update Table
223
224
225
226
227
              },
              fixedBodyStyle () {
                  let style = {};
                  if (this.bodyHeight !== 0) style.height = `${this.bodyHeight - 1}px`;
                  return style;
35ad3764   梁灏   update Table
228
229
230
              },
              leftFixedColumns () {
                  let left = [];
5d0499ce   梁灏   update Table
231
                  let other = [];
35ad3764   梁灏   update Table
232
233
234
                  this.cloneColumns.forEach((col) => {
                      if (col.fixed && col.fixed === 'left') {
                          left.push(col);
5d0499ce   梁灏   update Table
235
236
                      } else {
                          other.push(col);
35ad3764   梁灏   update Table
237
238
                      }
                  });
5d0499ce   梁灏   update Table
239
                  return left.concat(other);
35ad3764   梁灏   update Table
240
241
242
              },
              rightFixedColumns () {
                  let right = [];
5d0499ce   梁灏   update Table
243
                  let other = [];
35ad3764   梁灏   update Table
244
245
246
                  this.cloneColumns.forEach((col) => {
                      if (col.fixed && col.fixed === 'right') {
                          right.push(col);
5d0499ce   梁灏   update Table
247
248
                      } else {
                          other.push(col);
35ad3764   梁灏   update Table
249
250
                      }
                  });
5d0499ce   梁灏   update Table
251
                  return right.concat(other);
a81dc06c   梁灏   publish 0.9.9-rc-4
252
253
254
255
256
257
              },
              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...
258
259
260
              }
          },
          methods: {
e7e8c8ff   梁灏   update Table
261
262
263
              rowClsName (index) {
                  return this.rowClassName(this.data[index], index);
              },
a3547c1b   梁灏   update Table
264
              handleResize () {
2cb8a6d9   梁灏   commit Table comp...
265
                  this.$nextTick(() => {
224a3ae5   梁灏   publish 0.9.9-rc-3
266
                      const allWidth = !this.columns.some(cell => !cell.width);    // each column set a width
a3547c1b   梁灏   update Table
267
268
269
270
                      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...
271
                      }
224a3ae5   梁灏   publish 0.9.9-rc-3
272
                      this.columnsWidth = {};
a3547c1b   梁灏   update Table
273
                      this.$nextTick(() => {
224a3ae5   梁灏   publish 0.9.9-rc-3
274
                          let columnsWidth = {};
192e2cb8   梁灏   update Table
275
                          let autoWidthIndex = -1;
224a3ae5   梁灏   publish 0.9.9-rc-3
276
                          if (allWidth) autoWidthIndex = this.cloneColumns.findIndex(cell => !cell.width);//todo 这行可能有问题
192e2cb8   梁灏   update Table
277
  
d0e206c5   梁灏   Table add content...
278
279
280
281
                          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
282
  
d0e206c5   梁灏   Table add content...
283
284
285
286
287
                                  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
288
  
d0e206c5   梁灏   Table add content...
289
                                  this.cloneColumns[i]._width = width;
224a3ae5   梁灏   publish 0.9.9-rc-3
290
  
d0e206c5   梁灏   Table add content...
291
292
                                  columnsWidth[column._index] = {
                                      width: width
b0893113   jingsam   :art: add eslint
293
                                  };
2cb8a6d9   梁灏   commit Table comp...
294
                              }
d0e206c5   梁灏   Table add content...
295
                              this.columnsWidth = columnsWidth;
192e2cb8   梁灏   update Table
296
                          }
744eb0af   梁灏   update Table comp...
297
298
299
                      });
                  });
              },
d3dfdb26   梁灏   update Table
300
301
302
              handleMouseIn (_index) {
                  if (this.objData[_index]._isHover) return;
                  this.objData[_index]._isHover = true;
abdec99d   梁灏   update Table
303
              },
d3dfdb26   梁灏   update Table
304
305
              handleMouseOut (_index) {
                  this.objData[_index]._isHover = false;
abdec99d   梁灏   update Table
306
              },
d3dfdb26   梁灏   update Table
307
308
              highlightCurrentRow (_index) {
                  if (!this.highlightRow || this.objData[_index]._isHighlight) return;
0d136465   梁灏   update Table
309
310
  
                  let oldIndex = -1;
d3dfdb26   梁灏   update Table
311
312
313
314
                  for (let i in this.objData) {
                      if (this.objData[i]._isHighlight) {
                          oldIndex = parseInt(i);
                          this.objData[i]._isHighlight = false;
0d136465   梁灏   update Table
315
                      }
d3dfdb26   梁灏   update Table
316
317
318
319
                  }
                  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
320
              },
da55375f   Rijn   Added click and d...
321
322
              clickCurrentRow (_index) {
                  this.highlightCurrentRow (_index);
ee975cd4   梁灏   update Table event
323
                  this.$emit('on-row-click', JSON.parse(JSON.stringify(this.data[_index])));
da55375f   Rijn   Added click and d...
324
325
326
              },
              dblclickCurrentRow (_index) {
                  this.highlightCurrentRow (_index);
ee975cd4   梁灏   update Table event
327
                  this.$emit('on-row-dblclick', JSON.parse(JSON.stringify(this.data[_index])));
da55375f   Rijn   Added click and d...
328
              },
0d136465   梁灏   update Table
329
330
              getSelection () {
                  let selectionIndexes = [];
d3dfdb26   梁灏   update Table
331
332
333
                  for (let i in this.objData) {
                      if (this.objData[i]._isChecked) selectionIndexes.push(parseInt(i));
                  }
0d136465   梁灏   update Table
334
335
                  return JSON.parse(JSON.stringify(this.data.filter((data, index) => selectionIndexes.indexOf(index) > -1)));
              },
d3dfdb26   梁灏   update Table
336
              toggleSelect (_index) {
741b987a   梁灏   update Table
337
                  let data = {};
d3dfdb26   梁灏   update Table
338
339
340
341
  
                  for (let i in this.objData) {
                      if (parseInt(i) === _index) {
                          data = this.objData[i];
741b987a   梁灏   update Table
342
343
344
                      }
                  }
                  const status = !data._isChecked;
d3dfdb26   梁灏   update Table
345
346
  
                  this.objData[_index]._isChecked = status;
0d136465   梁灏   update Table
347
348
349
  
                  const selection = this.getSelection();
                  if (status) {
741b987a   梁灏   update Table
350
                      this.$emit('on-select', selection, JSON.parse(JSON.stringify(this.data[_index])));
0d136465   梁灏   update Table
351
352
353
                  }
                  this.$emit('on-selection-change', selection);
              },
3d9e4f20   梁灏   update Table
354
              selectAll (status) {
6c99b9fe   梁灏   update Table
355
356
357
                  this.rebuildData.forEach((data) => {
                      this.objData[data._index]._isChecked = status;
                  });
3d9e4f20   梁灏   update Table
358
  
52874e27   梁灏   update Table
359
                  const selection = this.getSelection();
3d9e4f20   梁灏   update Table
360
                  if (status) {
52874e27   梁灏   update Table
361
                      this.$emit('on-select-all', selection);
3d9e4f20   梁灏   update Table
362
                  }
52874e27   梁灏   update Table
363
                  this.$emit('on-selection-change', selection);
e7e8c8ff   梁灏   update Table
364
365
              },
              fixedHeader () {
b0893113   jingsam   :art: add eslint
366
                  if (this.height) {
e7e8c8ff   梁灏   update Table
367
368
369
370
371
                      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
372
                      });
f2a051a1   梁灏   publish 0.9.9-rc-6
373
374
                  } else {
                      this.bodyHeight = 0;
e7e8c8ff   梁灏   update Table
375
                  }
abdec99d   梁灏   update Table
376
              },
99f80db0   梁灏   update Table
377
378
379
              hideColumnFilter () {
                  this.cloneColumns.forEach((col) => col._filterVisible = false);
              },
192e2cb8   梁灏   update Table
380
              handleBodyScroll (event) {
b8a43000   梁灏   update Table
381
                  if (this.showHeader) this.$els.header.scrollLeft = event.target.scrollLeft;
a81dc06c   梁灏   publish 0.9.9-rc-4
382
383
                  if (this.isLeftFixed) this.$els.fixedBody.scrollTop = event.target.scrollTop;
                  if (this.isRightFixed) this.$els.fixedRightBody.scrollTop = event.target.scrollTop;
99f80db0   梁灏   update Table
384
                  this.hideColumnFilter();
192e2cb8   梁灏   update Table
385
              },
3ef4dfb9   梁灏   update Table
386
387
388
389
390
391
392
393
394
              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
395
              },
9f853e3e   梁灏   update Table
396
397
398
399
400
401
              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
402
403
404
405
406
                          if (type === 'asc') {
                              return a[key] > b[key] ? 1 : -1;
                          } else if (type === 'desc') {
                              return a[key] < b[key] ? 1 : -1;
                          }
9f853e3e   梁灏   update Table
407
408
409
410
                      }
                  });
                  return data;
              },
52874e27   梁灏   update Table
411
              handleSort (index, type) {
35ad3764   梁灏   update Table
412
413
414
                  this.cloneColumns.forEach((col) => col._sortType = 'normal');
  
                  const key = this.cloneColumns[index].key;
642299b9   梁灏   update Table
415
                  if (this.cloneColumns[index].sortable !== 'custom') {    // custom is for remote sort
9f853e3e   梁灏   update Table
416
                      if (type === 'normal') {
97edb2eb   梁灏   update Table
417
                          this.rebuildData = this.makeDataWithFilter();
9f853e3e   梁灏   update Table
418
419
                      } else {
                          this.rebuildData = this.sortData(this.rebuildData, type, index);
642299b9   梁灏   update Table
420
                      }
52874e27   梁灏   update Table
421
                  }
35ad3764   梁灏   update Table
422
423
424
425
426
427
                  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
428
                  });
741b987a   梁灏   update Table
429
              },
adaeca88   梁灏   update Table
430
431
432
              handleFilterHide (index) {    // clear checked that not filter now
                  if (!this.cloneColumns[index]._isFiltered) this.cloneColumns[index]._filterChecked = [];
              },
cb31ede0   梁灏   update Table
433
434
435
              filterData (data, column) {
                  return data.filter((row) => {
                      let status = !column._filterChecked.length;
adaeca88   梁灏   update Table
436
437
438
439
440
441
                      for (let i = 0; i < column._filterChecked.length; i++) {
                          status = column.filterMethod(column._filterChecked[i], row);
                          if (status) break;
                      }
                      return status;
                  });
cb31ede0   梁灏   update Table
442
443
444
445
446
447
448
449
450
451
452
              },
              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
453
                  let filterData = this.makeDataWithSort();
cb31ede0   梁灏   update Table
454
455
456
457
458
  
                  // filter others first, after filter this column
                  filterData = this.filterOtherData(filterData, index);
                  this.rebuildData = this.filterData(filterData, column);
  
adaeca88   梁灏   update Table
459
460
461
                  this.cloneColumns[index]._isFiltered = true;
                  this.cloneColumns[index]._filterVisible = false;
              },
45e7ed7e   梁灏   update Table
462
463
464
465
              handleFilterSelect (index, value) {
                  this.cloneColumns[index]._filterChecked = [value];
                  this.handleFilter(index);
              },
adaeca88   梁灏   update Table
466
467
              handleFilterReset (index) {
                  this.cloneColumns[index]._isFiltered = false;
45e7ed7e   梁灏   update Table
468
469
                  this.cloneColumns[index]._filterVisible = false;
                  this.cloneColumns[index]._filterChecked = [];
cb31ede0   梁灏   update Table
470
  
9f853e3e   梁灏   update Table
471
                  let filterData = this.makeDataWithSort();
cb31ede0   梁灏   update Table
472
473
                  filterData = this.filterOtherData(filterData, index);
                  this.rebuildData = filterData;
adaeca88   梁灏   update Table
474
              },
741b987a   梁灏   update Table
475
476
477
478
              makeData () {
                  let data = deepCopy(this.data);
                  data.forEach((row, index) => row._index = index);
                  return data;
d3dfdb26   梁灏   update Table
479
              },
9f853e3e   梁灏   update Table
480
481
482
483
              makeDataWithSort () {
                  let data = this.makeData();
                  let sortType = 'normal';
                  let sortIndex = -1;
2533a192   梁灏   update DatePicker
484
485
                  let isCustom = false;
  
9f853e3e   梁灏   update Table
486
487
488
489
                  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
490
                          isCustom = this.cloneColumns[i].sortable === 'custom';
9f853e3e   梁灏   update Table
491
492
493
                          break;
                      }
                  }
2533a192   梁灏   update DatePicker
494
                  if (sortType !== 'normal' && !isCustom) data =  this.sortData(data, sortType, sortIndex);
9f853e3e   梁灏   update Table
495
496
                  return data;
              },
97edb2eb   梁灏   update Table
497
498
499
500
501
502
503
504
505
506
              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
507
508
509
510
511
512
513
514
515
516
              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
517
518
519
520
521
522
523
524
              },
              makeColumns () {
                  let columns = deepCopy(this.columns);
                  let left = [];
                  let right = [];
                  let center = [];
  
                  columns.forEach((column, index) => {
35ad3764   梁灏   update Table
525
                      column._index = index;
224a3ae5   梁灏   publish 0.9.9-rc-3
526
                      column._width = column.width ? column.width : '';    // update in handleResize()
99f80db0   梁灏   update Table
527
528
529
530
                      column._sortType = 'normal';
                      column._filterVisible = false;
                      column._isFiltered = false;
                      column._filterChecked = [];
35ad3764   梁灏   update Table
531
  
adaeca88   梁灏   update Table
532
533
534
535
536
                      if ('filterMultiple' in column) {
                          column._filterMultiple = column.filterMultiple;
                      } else {
                          column._filterMultiple = true;
                      }
5d0499ce   梁灏   update Table
537
538
539
540
                      if ('filteredValue' in column) {
                          column._filterChecked = column.filteredValue;
                          column._isFiltered = true;
                      }
adaeca88   梁灏   update Table
541
  
35ad3764   梁灏   update Table
542
543
544
545
546
547
548
549
550
                      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...
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
              },
              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...
577
578
              }
          },
e7e8c8ff   梁灏   update Table
579
          compiled () {
d0e206c5   梁灏   Table add content...
580
              if (!this.content) this.content = this.$parent;
e7e8c8ff   梁灏   update Table
581
582
              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
583
              this.rebuildData = this.makeDataWithSortAndFilter();
e7e8c8ff   梁灏   update Table
584
          },
2cb8a6d9   梁灏   commit Table comp...
585
          ready () {
a3547c1b   梁灏   update Table
586
              this.handleResize();
e7e8c8ff   梁灏   update Table
587
              this.fixedHeader();
adaeca88   梁灏   update Table
588
              this.$nextTick(() => this.ready = true);
744eb0af   梁灏   update Table comp...
589
590
591
592
              window.addEventListener('resize', this.handleResize, false);
          },
          beforeDestroy () {
              window.removeEventListener('resize', this.handleResize, false);
2cb8a6d9   梁灏   commit Table comp...
593
594
595
596
          },
          watch: {
              data: {
                  handler () {
d3dfdb26   梁灏   update Table
597
                      this.objData = this.makeObjData();
97edb2eb   梁灏   update Table
598
                      this.rebuildData = this.makeDataWithSortAndFilter();
a3547c1b   梁灏   update Table
599
                      this.handleResize();
2cb8a6d9   梁灏   commit Table comp...
600
601
602
603
604
                  },
                  deep: true
              },
              columns: {
                  handler () {
f2a051a1   梁灏   publish 0.9.9-rc-6
605
                      // todo 这里有性能问题,可能是左右固定计算属性影响的
35ad3764   梁灏   update Table
606
                      this.cloneColumns = this.makeColumns();
97edb2eb   梁灏   update Table
607
                      this.rebuildData = this.makeDataWithSortAndFilter();
a3547c1b   梁灏   update Table
608
                      this.handleResize();
2cb8a6d9   梁灏   commit Table comp...
609
610
                  },
                  deep: true
e7e8c8ff   梁灏   update Table
611
612
613
              },
              height () {
                  this.fixedHeader();
2cb8a6d9   梁灏   commit Table comp...
614
615
              }
          }
b0893113   jingsam   :art: add eslint
616
617
      };
  </script>