elective-generation-table.vue 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <template>
  2. <mx-table ref="table" :prop-defines="resolvedTable.columns" :rows="resolvedTable.rows" border>
  3. <template #elective-cell="{value}">
  4. {{ value && value.value }}
  5. </template>
  6. </mx-table>
  7. </template>
  8. <script>
  9. import MxGroupTranslateMixin from '@/components/Cache/modules/mx-select-translate-mixin'
  10. export default {
  11. mixins: [MxGroupTranslateMixin],
  12. name: 'elective-generation-table',
  13. props: ['chartBinding'],
  14. computed: {
  15. resolvedTable() {
  16. console.log('resolvedTable called', this.listGroupsOptions, this.chartBinding)
  17. if (!this.listGroupsOptions.length) return {}
  18. const columns = { groupName: { label: '组合', fixed: true }, expectedCount: { label: '设置人数', fixed: true } }
  19. const rows = this.chartBinding.generation.status.roundGroups.map(rg => ({
  20. groupId: rg.groupId,
  21. groupName: this.translateGroup(rg.groupId),
  22. expectedCount: rg.personCount
  23. }))
  24. const mergedColumns = []
  25. this.chartBinding.tableData.forEach(item => {
  26. if (this.chartBinding.generation.hiddenGenerations.includes(item.generation)) return
  27. const ext = { roundId: item.roundId, generation: item.generation }
  28. const isPreference = item.categories.every(item => Array.isArray(item))
  29. if (isPreference) {
  30. item.categories.forEach((subItem, idx) => {
  31. const prefix = item.categories.length > 1 ? `第${idx + 1}志愿` : ''
  32. subItem.forEach(data => this.resolveTableGeneration(ext, data, columns, rows, mergedColumns, prefix))
  33. })
  34. } else {
  35. item.categories.forEach(data => this.resolveTableGeneration(ext, data, columns, rows, mergedColumns))
  36. }
  37. })
  38. this.$refs.table.scrollToRight()
  39. return {
  40. mergedColumns,
  41. columns,
  42. rows
  43. }
  44. }
  45. },
  46. mounted() {
  47. window.tableVue = this
  48. },
  49. provide() {
  50. return {
  51. mergeTable: this.mergeTable
  52. }
  53. },
  54. methods: {
  55. resolveTableGeneration(ext, data, columnsRef, rowsRef, mergedColumnsRef, prefix = '') {
  56. // resolve core
  57. const prop = prefix + ext.generation + '_' + data.category
  58. const name = prefix + data.displayName
  59. const shouldMerge = data.values.length != rowsRef.length
  60. || data.values.some(v => v.groupId == 0)
  61. columnsRef[prop] = { label: name, slot: 'elective-cell' }
  62. if (!shouldMerge) {
  63. data.values.forEach(val => {
  64. const row = rowsRef.find(row => row.groupId == val.groupId)
  65. if (row) {
  66. row[prop] = val
  67. }
  68. })
  69. } else {
  70. // mark for table rows merge
  71. mergedColumnsRef.push(prop)
  72. // keep value in display row
  73. const val = data.values.first()
  74. const row = rowsRef.first()
  75. row[prop] = val
  76. }
  77. },
  78. mergeTable({ row, column, rowIndex }) {
  79. if (this.resolvedTable.mergedColumns.includes(column.property)) {
  80. return rowIndex === 0 ? [this.resolvedTable.rows.length, 1] : [0, 0]
  81. }
  82. }
  83. }
  84. }
  85. </script>
  86. <style scoped>
  87. </style>