|
117 | 117 | error: errmsg[`id-${record.$id}-${item.name}`], |
118 | 118 | link: item.link && item.isLink && item.isLink(record), |
119 | 119 | select: item.options, |
| 120 | + grouping: item.grouping, |
120 | 121 | datepick: item.type == 'date', |
121 | 122 | stickyColumn: item.sticky, |
122 | | - hideDuplicate: item.hideDuplicate && rowPos > 0 && isSameSinceLeft(p, record, pagingTable[rowPos-1]) |
| 123 | + hideDuplicate: item.hideDuplicate && rowPos > 0 && isSameSinceLeft(p, record, pagingTable[rowPos-1]), |
123 | 124 | }" |
124 | 125 | :key="p" |
125 | 126 | :style="Object.assign(cellStyle(record, item), renderColumnCellStyle(item, record))" |
126 | 127 | @mouseover="cellMouseOver" |
127 | 128 | @mousemove="cellMouseMove"> |
128 | | - <template v-if="item.format=='html'"><span v-html="item.toText(record[item.name], record, item)" /></template> |
129 | | - <template v-else>{{ item.toText(record[item.name], record, item) }}</template> |
| 129 | + <template v-if="item.format=='html'"><span v-html="item.toText(record[item.name], record, item, p)" /></template> |
| 130 | + <template v-else>{{ item.toText(record[item.name], record, item, p) }}</template> |
130 | 131 | </td> |
131 | 132 | <td v-if="vScroller.buttonHeight < vScroller.height" class="last-col"></td> |
132 | 133 | </tr> |
@@ -478,7 +479,9 @@ export default defineComponent({ |
478 | 479 | summaryRow: false, |
479 | 480 | summary: {}, |
480 | 481 | showFilteredOnly: true, |
481 | | - showSelectedOnly: false |
| 482 | + showSelectedOnly: false, |
| 483 | +
|
| 484 | + ungroup: {} |
482 | 485 | } |
483 | 486 | return dataset |
484 | 487 | }, |
@@ -836,6 +839,7 @@ export default defineComponent({ |
836 | 839 | } |
837 | 840 | }) |
838 | 841 | this.filteredValue = this.modelValue.filter(record => this.recordFilter(record)) |
| 842 | + this.filteredValue = this.filteredValue.filter((record, i) => this.filterGrouping(record, i, this.modelValue)) |
839 | 843 | if (filterColumnList.length === 0) |
840 | 844 | this.table = this.filteredValue |
841 | 845 | else { |
@@ -908,6 +912,22 @@ export default defineComponent({ |
908 | 912 | } |
909 | 913 | this.calSummary() |
910 | 914 | }, |
| 915 | + filterGrouping (rec, i, table) { |
| 916 | + if (i === 0) return true |
| 917 | + const prec = table[i-1] |
| 918 | + let result = true |
| 919 | + this.fields.forEach(field => { |
| 920 | + const name = field.name |
| 921 | + if (field.grouping && rec[name] === prec[name]) { |
| 922 | + if (field.grouping === 'collapse' && this.ungroup[field.name + rec[name]] !== true) |
| 923 | + result = false |
| 924 | + else |
| 925 | + if (field.grouping === 'expand' && this.ungroup[field.name + rec[name]]) |
| 926 | + result = false |
| 927 | + } |
| 928 | + }) |
| 929 | + return result |
| 930 | + }, |
911 | 931 | calStickyLeft () { |
912 | 932 | let left = 0, n = 0 |
913 | 933 | this.leftMost = -1 |
@@ -2280,7 +2300,11 @@ export default defineComponent({ |
2280 | 2300 | this.currentField.cellClick(this.currentCell.textContent, this.currentRecord, rowPos, colPos, this.currentField, this) |
2281 | 2301 | if (this.currentField && this.currentField.link /* && e.altKey */ && this.currentCell.textContent) |
2282 | 2302 | return setTimeout(() => this.currentField.link(this.currentCell.textContent, this.currentRecord, rowPos, colPos, this.currentField, this)) |
2283 | | -
|
| 2303 | + if (this.currentField.grouping) { |
| 2304 | + this.ungroup[this.currentField.name + this.currentCell.textContent] = !this.ungroup[this.currentField.name + this.currentCell.textContent] |
| 2305 | + this.refresh() |
| 2306 | + return |
| 2307 | + } |
2284 | 2308 | setTimeout(() => this.inputBox.focus()) |
2285 | 2309 | this.focused = true |
2286 | 2310 | this.moveInputSquare(rowPos, colPos) |
@@ -2328,7 +2352,7 @@ export default defineComponent({ |
2328 | 2352 | const row = e.target.parentNode |
2329 | 2353 | const colPos = Array.from(row.children).indexOf(e.target) - 1 |
2330 | 2354 | const currentField = this.fields[colPos] |
2331 | | - if (currentField?.type === 'action') |
| 2355 | + if (currentField?.type === 'action' || currentField?.grouping) |
2332 | 2356 | cursor = 'pointer' |
2333 | 2357 | e.target.style.cursor = cursor |
2334 | 2358 | }, |
@@ -3063,6 +3087,12 @@ input:focus, input:active:focus, input.active:focus { |
3063 | 3087 | .systable td.first-col.focus { |
3064 | 3088 | border-right: 1px solid rgb(61, 85, 61) !important; |
3065 | 3089 | } |
| 3090 | +.systable tbody td.grouping { |
| 3091 | + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAlmVYSWZNTQAqAAAACAAFARIAAwAAAAEAAQAAARoABQAAAAEAAABKARsABQAAAAEAAABSATEAAgAAABEAAABah2kABAAAAAEAAABsAAAAAAAAAGAAAAABAAAAYAAAAAF3d3cuaW5rc2NhcGUub3JnAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAADaADAAQAAAABAAAADQAAAAC2lhxrAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADBGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj44MjwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj44MjwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj45NjwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+OTY8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+d3d3Lmlua3NjYXBlLm9yZzwveG1wOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K/79DmAAAARFJREFUKBWFks9KQkEUh70h9EdwY6abFhcUxK1P4EqsoKezB+gNjDDa1FO40YVoG7V1URDo940zUkT0g++ec+ecM85vrllhpyLhK+Z94gVU4RVG8AAq9B2khJjDGG7hDNYx+u66dTd2MMiFTxjsXn89b1j5APv2cicLKoNjaMfou7JuX5AePIpKDRXyBZy6iNK6HvueT9PPoI7gBBpwGOOG+AYe7wkuHdL0EtQ5PEIJyjCEd+jBBFZQc8ifrIN6gQ404Q6uYQoOqhrYX/jL05ya3tR3T9oJ8lYGMbdBXy3wFtOAdfv2ysn++07W7Qu76Msv7cI9VMHbDKaJXdDHFcygmPFQadBcj57bW13DCH7897YprztHz5xxRwAAAABJRU5ErkJggg=='); |
| 3092 | + background-repeat: no-repeat; |
| 3093 | + background-size: 8px 8px; |
| 3094 | + background-position: right 5px top 8px; |
| 3095 | +} |
3066 | 3096 | .systable tbody td.select:not(.readonly) { |
3067 | 3097 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAASUExURQAAANra2tfX19ra2tnZ2dnZ2c8lDs8AAAAFdFJOUwAwQL/PKlwehgAAAAlwSFlzAAAXEQAAFxEByibzPwAAAEdJREFUKFNdyskBACAIA8F49d+yiBEh+9rHYC5poPGiDmUDUGZI2EHCHBV2UWFEiT2UWKBgHwVLiCwjsoKcVeRMkDFFxoiADdH4AyvGhvOPAAAAAElFTkSuQmCC'); |
3068 | 3098 | background-repeat: no-repeat; |
|
0 commit comments