Commit 45e7ed7ef56c7a10772419760c5d641185778f71
1 parent
adaeca88
update Table
update Table
Showing
4 changed files
with
109 additions
and
71 deletions
Show diff stats
src/components/table/table-head.vue
| @@ -5,7 +5,7 @@ | @@ -5,7 +5,7 @@ | ||
| 5 | </colgroup> | 5 | </colgroup> |
| 6 | <thead> | 6 | <thead> |
| 7 | <tr> | 7 | <tr> |
| 8 | - <th v-for="column in columns" :class="alignCls(column)"> | 8 | + <th v-for="(index, column) in columns" :class="alignCls(column)"> |
| 9 | <div :class="cellClasses(column)"> | 9 | <div :class="cellClasses(column)"> |
| 10 | <template v-if="column.type === 'selection'"><Checkbox :checked="isSelectAll" @on-change="selectAll"></Checkbox></template> | 10 | <template v-if="column.type === 'selection'"><Checkbox :checked="isSelectAll" @on-change="selectAll"></Checkbox></template> |
| 11 | <template v-else> | 11 | <template v-else> |
| @@ -35,8 +35,13 @@ | @@ -35,8 +35,13 @@ | ||
| 35 | </div> | 35 | </div> |
| 36 | <div slot="content" :class="[prefixCls + '-filter-list']" v-else> | 36 | <div slot="content" :class="[prefixCls + '-filter-list']" v-else> |
| 37 | <ul> | 37 | <ul> |
| 38 | - <li :class="[prefixCls + '-filter-select-item', {[prefixCls + '-filter-select-item-selected']: !column._filterChecked.lengtg}]">全部</li> | ||
| 39 | - <li :class="[prefixCls + '-filter-select-item', {[prefixCls + '-filter-select-item-selected']: column._filterChecked[0] === item.value}]" v-for="item in column.filters">{{ item.label }}</li> | 38 | + <li |
| 39 | + :class="[prefixCls + '-filter-select-item', {[prefixCls + '-filter-select-item-selected']: !column._filterChecked.length}]" | ||
| 40 | + @click="handleReset($index)">全部</li> | ||
| 41 | + <li | ||
| 42 | + :class="[prefixCls + '-filter-select-item', {[prefixCls + '-filter-select-item-selected']: column._filterChecked[0] === item.value}]" | ||
| 43 | + v-for="item in column.filters" | ||
| 44 | + @click="handleSelect(index, item.value)">{{ item.label }}</li> | ||
| 40 | </ul> | 45 | </ul> |
| 41 | </div> | 46 | </div> |
| 42 | </Poptip> | 47 | </Poptip> |
| @@ -107,6 +112,9 @@ | @@ -107,6 +112,9 @@ | ||
| 107 | handleFilter (index) { | 112 | handleFilter (index) { |
| 108 | this.$parent.handleFilter(index); | 113 | this.$parent.handleFilter(index); |
| 109 | }, | 114 | }, |
| 115 | + handleSelect (index, value) { | ||
| 116 | + this.$parent.handleFilterSelect(index, value); | ||
| 117 | + }, | ||
| 110 | handleReset (index) { | 118 | handleReset (index) { |
| 111 | this.$parent.handleFilterReset(index); | 119 | this.$parent.handleFilterReset(index); |
| 112 | }, | 120 | }, |
src/components/table/table.vue
| 1 | <template> | 1 | <template> |
| 2 | - <div :class="classes" :style="styles"> | ||
| 3 | - <div :class="[prefixCls + '-title']" v-if="showSlotHeader" v-el:title><slot name="header"></slot></div> | ||
| 4 | - <div :class="[prefixCls + '-header']" v-if="showHeader" v-el:header @mousewheel="handleMouseWheel"> | ||
| 5 | - <table-head | ||
| 6 | - :prefix-cls="prefixCls" | ||
| 7 | - :style="tableStyle" | ||
| 8 | - :columns="cloneColumns" | ||
| 9 | - :obj-data="objData"></table-head> | ||
| 10 | - </div> | ||
| 11 | - <div :class="[prefixCls + '-body']" :style="bodyStyle" v-el:body @scroll="handleBodyScroll"> | ||
| 12 | - <table-body | ||
| 13 | - v-ref:tbody | ||
| 14 | - :prefix-cls="prefixCls" | ||
| 15 | - :style="tableStyle" | ||
| 16 | - :columns="cloneColumns" | ||
| 17 | - :data="rebuildData" | ||
| 18 | - :obj-data="objData"></table-body> | ||
| 19 | - </div> | ||
| 20 | - <div :class="[prefixCls + '-fixed']"> | ||
| 21 | - <div :class="[prefixCls + '-fixed-header']" v-if="showHeader"> | 2 | + <div :class="wrapClasses" :style="styles"> |
| 3 | + <div :class="classes" :style="styles"> | ||
| 4 | + <div :class="[prefixCls + '-title']" v-if="showSlotHeader" v-el:title><slot name="header"></slot></div> | ||
| 5 | + <div :class="[prefixCls + '-header']" v-if="showHeader" v-el:header @mousewheel="handleMouseWheel"> | ||
| 22 | <table-head | 6 | <table-head |
| 23 | - fixed | ||
| 24 | - :prefix-cls="prefixCls" | ||
| 25 | - :style="fixedTableStyle" | ||
| 26 | - :columns="leftFixedColumns" | ||
| 27 | - :obj-data="objData"></table-head> | 7 | + :prefix-cls="prefixCls" |
| 8 | + :style="tableStyle" | ||
| 9 | + :columns="cloneColumns" | ||
| 10 | + :obj-data="objData"></table-head> | ||
| 28 | </div> | 11 | </div> |
| 29 | - <div :class="[prefixCls + '-fixed-body']" :style="fixedBodyStyle" v-el:fixed-body> | 12 | + <div :class="[prefixCls + '-body']" :style="bodyStyle" v-el:body @scroll="handleBodyScroll"> |
| 30 | <table-body | 13 | <table-body |
| 31 | - fixed | ||
| 32 | - :prefix-cls="prefixCls" | ||
| 33 | - :style="fixedTableStyle" | ||
| 34 | - :columns="leftFixedColumns" | ||
| 35 | - :data="rebuildData" | ||
| 36 | - :obj-data="objData"></table-body> | 14 | + v-ref:tbody |
| 15 | + :prefix-cls="prefixCls" | ||
| 16 | + :style="tableStyle" | ||
| 17 | + :columns="cloneColumns" | ||
| 18 | + :data="rebuildData" | ||
| 19 | + :obj-data="objData"></table-body> | ||
| 37 | </div> | 20 | </div> |
| 38 | - </div> | ||
| 39 | - <div :class="[prefixCls + '-fixed-right']"> | ||
| 40 | - <div :class="[prefixCls + '-fixed-header']" v-if="showHeader"> | ||
| 41 | - <table-head | ||
| 42 | - fixed | ||
| 43 | - :prefix-cls="prefixCls" | ||
| 44 | - :style="fixedRightTableStyle" | ||
| 45 | - :columns="rightFixedColumns" | ||
| 46 | - :obj-data="objData"></table-head> | 21 | + <div :class="[prefixCls + '-fixed']"> |
| 22 | + <div :class="[prefixCls + '-fixed-header']" v-if="showHeader"> | ||
| 23 | + <table-head | ||
| 24 | + fixed | ||
| 25 | + :prefix-cls="prefixCls" | ||
| 26 | + :style="fixedTableStyle" | ||
| 27 | + :columns="leftFixedColumns" | ||
| 28 | + :obj-data="objData"></table-head> | ||
| 29 | + </div> | ||
| 30 | + <div :class="[prefixCls + '-fixed-body']" :style="fixedBodyStyle" v-el:fixed-body> | ||
| 31 | + <table-body | ||
| 32 | + fixed | ||
| 33 | + :prefix-cls="prefixCls" | ||
| 34 | + :style="fixedTableStyle" | ||
| 35 | + :columns="leftFixedColumns" | ||
| 36 | + :data="rebuildData" | ||
| 37 | + :obj-data="objData"></table-body> | ||
| 38 | + </div> | ||
| 47 | </div> | 39 | </div> |
| 48 | - <div :class="[prefixCls + '-fixed-body']" :style="fixedBodyStyle" v-el:fixed-right-body> | ||
| 49 | - <table-body | ||
| 50 | - fixed | ||
| 51 | - :prefix-cls="prefixCls" | ||
| 52 | - :style="fixedRightTableStyle" | ||
| 53 | - :columns="rightFixedColumns" | ||
| 54 | - :data="rebuildData" | ||
| 55 | - :obj-data="objData"></table-body> | 40 | + <div :class="[prefixCls + '-fixed-right']"> |
| 41 | + <div :class="[prefixCls + '-fixed-header']" v-if="showHeader"> | ||
| 42 | + <table-head | ||
| 43 | + fixed | ||
| 44 | + :prefix-cls="prefixCls" | ||
| 45 | + :style="fixedRightTableStyle" | ||
| 46 | + :columns="rightFixedColumns" | ||
| 47 | + :obj-data="objData"></table-head> | ||
| 48 | + </div> | ||
| 49 | + <div :class="[prefixCls + '-fixed-body']" :style="fixedBodyStyle" v-el:fixed-right-body> | ||
| 50 | + <table-body | ||
| 51 | + fixed | ||
| 52 | + :prefix-cls="prefixCls" | ||
| 53 | + :style="fixedRightTableStyle" | ||
| 54 | + :columns="rightFixedColumns" | ||
| 55 | + :data="rebuildData" | ||
| 56 | + :obj-data="objData"></table-body> | ||
| 57 | + </div> | ||
| 56 | </div> | 58 | </div> |
| 59 | + <div :class="[prefixCls + '-footer']" v-if="showSlotFooter" v-el:footer><slot name="footer"></slot></div> | ||
| 57 | </div> | 60 | </div> |
| 58 | - <div :class="[prefixCls + '-footer']" v-if="showSlotFooter" v-el:footer><slot name="footer"></slot></div> | ||
| 59 | </div> | 61 | </div> |
| 60 | </template> | 62 | </template> |
| 61 | <script> | 63 | <script> |
| @@ -129,11 +131,18 @@ | @@ -129,11 +131,18 @@ | ||
| 129 | } | 131 | } |
| 130 | }, | 132 | }, |
| 131 | computed: { | 133 | computed: { |
| 134 | + wrapClasses () { | ||
| 135 | + return [ | ||
| 136 | + `${prefixCls}-wrapper`, | ||
| 137 | + { | ||
| 138 | + [`${prefixCls}-hide`]: !this.ready | ||
| 139 | + } | ||
| 140 | + ] | ||
| 141 | + }, | ||
| 132 | classes () { | 142 | classes () { |
| 133 | return [ | 143 | return [ |
| 134 | `${prefixCls}`, | 144 | `${prefixCls}`, |
| 135 | { | 145 | { |
| 136 | - [`${prefixCls}-hide`]: !this.ready, | ||
| 137 | [`${prefixCls}-${this.size}`]: !!this.size, | 146 | [`${prefixCls}-${this.size}`]: !!this.size, |
| 138 | [`${prefixCls}-border`]: this.border, | 147 | [`${prefixCls}-border`]: this.border, |
| 139 | [`${prefixCls}-stripe`]: this.stripe, | 148 | [`${prefixCls}-stripe`]: this.stripe, |
| @@ -364,8 +373,15 @@ | @@ -364,8 +373,15 @@ | ||
| 364 | this.cloneColumns[index]._isFiltered = true; | 373 | this.cloneColumns[index]._isFiltered = true; |
| 365 | this.cloneColumns[index]._filterVisible = false; | 374 | this.cloneColumns[index]._filterVisible = false; |
| 366 | }, | 375 | }, |
| 376 | + handleFilterSelect (index, value) { | ||
| 377 | + this.cloneColumns[index]._filterChecked = [value]; | ||
| 378 | + this.handleFilter(index); | ||
| 379 | + }, | ||
| 367 | handleFilterReset (index) { | 380 | handleFilterReset (index) { |
| 368 | this.cloneColumns[index]._isFiltered = false; | 381 | this.cloneColumns[index]._isFiltered = false; |
| 382 | + this.cloneColumns[index]._filterVisible = false; | ||
| 383 | + this.cloneColumns[index]._filterChecked = []; | ||
| 384 | + this.rebuildData = this.makeData(); | ||
| 369 | }, | 385 | }, |
| 370 | makeData () { | 386 | makeData () { |
| 371 | let data = deepCopy(this.data); | 387 | let data = deepCopy(this.data); |
src/styles/components/table.less
| @@ -2,17 +2,21 @@ | @@ -2,17 +2,21 @@ | ||
| 2 | @table-select-item-prefix-cls: ~"@{table-prefix-cls}-filter-select-item"; | 2 | @table-select-item-prefix-cls: ~"@{table-prefix-cls}-filter-select-item"; |
| 3 | 3 | ||
| 4 | .@{table-prefix-cls} { | 4 | .@{table-prefix-cls} { |
| 5 | + &-wrapper{ | ||
| 6 | + position: relative; | ||
| 7 | + border: 1px solid @border-color-base; | ||
| 8 | + border-bottom: 0; | ||
| 9 | + border-right: 0; | ||
| 10 | + } | ||
| 5 | width: 100%; | 11 | width: 100%; |
| 6 | max-width: 100%; | 12 | max-width: 100%; |
| 7 | overflow: hidden; | 13 | overflow: hidden; |
| 8 | color: @text-color; | 14 | color: @text-color; |
| 9 | font-size: @font-size-small; | 15 | font-size: @font-size-small; |
| 10 | background-color: #fff; | 16 | background-color: #fff; |
| 11 | - border: 1px solid @border-color-base; | ||
| 12 | - border-bottom: 0; | ||
| 13 | - border-right: 0; | 17 | + |
| 14 | box-sizing: border-box; | 18 | box-sizing: border-box; |
| 15 | - position: relative; | 19 | + //position: relative; |
| 16 | 20 | ||
| 17 | &-hide{ | 21 | &-hide{ |
| 18 | opacity: 0; | 22 | opacity: 0; |
| @@ -202,7 +206,6 @@ | @@ -202,7 +206,6 @@ | ||
| 202 | top: 0; | 206 | top: 0; |
| 203 | left: 0; | 207 | left: 0; |
| 204 | box-shadow: @shadow-right; | 208 | box-shadow: @shadow-right; |
| 205 | - //overflow-x: hidden; | ||
| 206 | 209 | ||
| 207 | &::before { | 210 | &::before { |
| 208 | content: ''; | 211 | content: ''; |
test/routers/table.vue
| @@ -9,7 +9,6 @@ | @@ -9,7 +9,6 @@ | ||
| 9 | <br> | 9 | <br> |
| 10 | <i-table | 10 | <i-table |
| 11 | width="450" | 11 | width="450" |
| 12 | - :height="height" | ||
| 13 | stripe | 12 | stripe |
| 14 | border | 13 | border |
| 15 | highlight-row | 14 | highlight-row |
| @@ -40,6 +39,7 @@ | @@ -40,6 +39,7 @@ | ||
| 40 | { | 39 | { |
| 41 | type: 'selection', | 40 | type: 'selection', |
| 42 | width: 50, | 41 | width: 50, |
| 42 | + fixed: 'left', | ||
| 43 | align: 'center' | 43 | align: 'center' |
| 44 | }, | 44 | }, |
| 45 | { | 45 | { |
| @@ -55,15 +55,22 @@ | @@ -55,15 +55,22 @@ | ||
| 55 | width: 100, | 55 | width: 100, |
| 56 | filters: [ | 56 | filters: [ |
| 57 | { | 57 | { |
| 58 | - label: '家', | ||
| 59 | - value: 'home' | 58 | + label: '大于25岁', |
| 59 | + value: 1 | ||
| 60 | }, | 60 | }, |
| 61 | { | 61 | { |
| 62 | - label: '公司', | ||
| 63 | - value: 'company' | 62 | + label: '小于25岁', |
| 63 | + value: 2 | ||
| 64 | } | 64 | } |
| 65 | ], | 65 | ], |
| 66 | - filterMultiple: false | 66 | + filterMultiple: false, |
| 67 | + filterMethod (value, row) { | ||
| 68 | + if (value === 1) { | ||
| 69 | + return row.age >= 25; | ||
| 70 | + } else if (value === 2) { | ||
| 71 | + return row.age < 25; | ||
| 72 | + } | ||
| 73 | + } | ||
| 67 | }, | 74 | }, |
| 68 | { | 75 | { |
| 69 | title: '标签', | 76 | title: '标签', |
| @@ -128,8 +135,8 @@ | @@ -128,8 +135,8 @@ | ||
| 128 | fixed: 'right', | 135 | fixed: 'right', |
| 129 | width: 120, | 136 | width: 120, |
| 130 | render (row, column, index) { | 137 | render (row, column, index) { |
| 131 | - return `<i-button @click="edit(${index})">${row.name}${index}</i-button>` | ||
| 132 | -// return `<a>${row.name}</a>` | 138 | + return `<i-button @click="edit(${index})">${row.name}${index}</i-button>`; |
| 139 | + return `<a>${row.name}</a>`; | ||
| 133 | } | 140 | } |
| 134 | } | 141 | } |
| 135 | ], | 142 | ], |
| @@ -139,28 +146,32 @@ | @@ -139,28 +146,32 @@ | ||
| 139 | age: 25, | 146 | age: 25, |
| 140 | address: '北京市朝阳区', | 147 | address: '北京市朝阳区', |
| 141 | edit: false, | 148 | edit: false, |
| 142 | - tag: 'home' | 149 | + tag: 'home', |
| 150 | + action: 1 | ||
| 143 | }, | 151 | }, |
| 144 | { | 152 | { |
| 145 | name: '段模', | 153 | name: '段模', |
| 146 | age: 21, | 154 | age: 21, |
| 147 | address: '北京市海淀区', | 155 | address: '北京市海淀区', |
| 148 | edit: false, | 156 | edit: false, |
| 149 | - tag: 'company' | 157 | + tag: 'company', |
| 158 | + action: 2 | ||
| 150 | }, | 159 | }, |
| 151 | { | 160 | { |
| 152 | name: '刘天娇', | 161 | name: '刘天娇', |
| 153 | age: 27, | 162 | age: 27, |
| 154 | address: '北京市东城区', | 163 | address: '北京市东城区', |
| 155 | edit: false, | 164 | edit: false, |
| 156 | - tag: 'company' | 165 | + tag: 'company', |
| 166 | + action: 3 | ||
| 157 | }, | 167 | }, |
| 158 | { | 168 | { |
| 159 | name: '胡国伟', | 169 | name: '胡国伟', |
| 160 | age: 22, | 170 | age: 22, |
| 161 | address: '北京市西城区', | 171 | address: '北京市西城区', |
| 162 | edit: false, | 172 | edit: false, |
| 163 | - tag: 'home' | 173 | + tag: 'home', |
| 174 | + action: 4 | ||
| 164 | } | 175 | } |
| 165 | ], | 176 | ], |
| 166 | height: 200 | 177 | height: 200 |