| | |
| | | class="flex" |
| | | :class="`space-x-[${THICK_BORDER_WIDTH}px]`" |
| | | :style="{ |
| | | backgroundColor: COL_HEADER_CELL_BG_COLOR, |
| | | backgroundColor: BORDER_COLOR, |
| | | }" |
| | | > |
| | | <div |
| | |
| | | :key="item" |
| | | :class="COL_HEADER_CELL_CLASS" |
| | | :style="{ |
| | | width: `${CELL_WIDTH}px`, |
| | | width: `${index === 0 ? firstColWidth : restColWidth}px`, |
| | | height: `${CELL_HEIGHT}px`, |
| | | backgroundColor: COL_HEADER_CELL_BG_COLOR, |
| | | }" |
| | |
| | | {{ index === 0 ? '' : rowChunk[index - 1]?.OTITLE }} |
| | | </div> |
| | | </div> |
| | | <MonitorContent v-if="firstRow" :title="firstRow.title" :type="firstRow.id" :values="rowChunk" /> |
| | | <MonitorContent |
| | | v-if="firstRow" |
| | | :firstColWidth="firstColWidth" |
| | | :restColWidth="restColWidth" |
| | | :title="firstRow.title" |
| | | :type="firstRow.id" |
| | | :values="rowChunk" |
| | | /> |
| | | </div> |
| | | <!-- å©ä½è¡ --> |
| | | <MonitorContent v-for="(row, index) in restRows" :key="index" :title="row.title" :type="row.id" :values="rowChunk" /> |
| | | <MonitorContent |
| | | v-for="(row, index) in restRows" |
| | | :key="index" |
| | | :firstColWidth="firstColWidth" |
| | | :restColWidth="restColWidth" |
| | | :title="row.title" |
| | | :type="row.id" |
| | | :values="rowChunk" |
| | | /> |
| | | </div> |
| | | </div> |
| | | <el-pagination |
| | | style="margin-bottom: 0 !important" |
| | | small |
| | | hide-on-single-page |
| | | v-model:current-page="pageIndex" |
| | |
| | | import _ from 'lodash'; |
| | | import { computed, onMounted, ref } from 'vue'; |
| | | import MonitorContent from './MonitorContent.vue'; |
| | | import { debounce } from '/@/utils/util'; |
| | | import { debounce, getTextWidth } from '/@/utils/util'; |
| | | |
| | | import { chatComProps } from '../../../common'; |
| | | import { |
| | | BORDER_COLOR, |
| | | CELL_HEIGHT, |
| | | CELL_WIDTH, |
| | | CELL_MAX_WIDTH, |
| | | COL_HEADER_CELL_BG_COLOR, |
| | | COL_HEADER_CELL_CLASS, |
| | | PAGE_HEIGHT, |
| | | ROW_HEADER_CELL_MAX_WIDTH, |
| | | THICK_BORDER_WIDTH, |
| | | THIN_BORDER_WIDTH, |
| | | } from './constants'; |
| | |
| | | const pageSize = ref(null); |
| | | |
| | | const containerRef = ref<HTMLDivElement>(null); |
| | | const measureWidthOffset = 2; |
| | | /** @description æµéé¦åå
容宽度 */ |
| | | const rowHeaderCellContentWidth = computed(() => { |
| | | if (!props.data.rows || props.data.rows.length === 0) return 0; |
| | | let maxLen = 0; |
| | | let maxTitle = ''; |
| | | for (const item of props.data.rows) { |
| | | const { title } = item; |
| | | const len = title.gblen(); |
| | | if (len > maxLen) { |
| | | maxLen = len; |
| | | maxTitle = title; |
| | | } |
| | | } |
| | | let maxWidth = getTextWidth(maxTitle, { |
| | | size: '0.875rem', |
| | | }); |
| | | |
| | | maxWidth += measureWidthOffset; |
| | | |
| | | if (maxWidth > ROW_HEADER_CELL_MAX_WIDTH) { |
| | | maxWidth = ROW_HEADER_CELL_MAX_WIDTH; |
| | | } |
| | | |
| | | return maxWidth; |
| | | }); |
| | | /** @description æµéå
¶ä»åå
容宽度 */ |
| | | const colHeaderCellContentWidth = computed(() => { |
| | | if (!props.data.values || props.data.values.length === 0) return 0; |
| | | let maxLen = 0; |
| | | let maxTitle = ''; |
| | | for (const item of props.data.values) { |
| | | const { OTITLE } = item; |
| | | const len = OTITLE.gblen(); |
| | | if (len > maxLen) { |
| | | maxLen = len; |
| | | maxTitle = OTITLE; |
| | | } |
| | | } |
| | | |
| | | let maxWidth = getTextWidth(maxTitle, { |
| | | size: '0.875rem', |
| | | }); |
| | | maxWidth += measureWidthOffset; |
| | | |
| | | if (maxWidth > CELL_MAX_WIDTH) { |
| | | maxWidth = CELL_MAX_WIDTH; |
| | | } |
| | | |
| | | return maxWidth; |
| | | }); |
| | | |
| | | const firstColWidth = ref(rowHeaderCellContentWidth.value); |
| | | const restColWidth = ref(colHeaderCellContentWidth.value); |
| | | const calcMaxRowsNum = (groupCount: number, height, extraHeight = 0) => { |
| | | return Math.floor( |
| | | (height - THICK_BORDER_WIDTH - extraHeight) / |
| | | (CELL_HEIGHT * groupCount + 2 * THICK_BORDER_WIDTH + THIN_BORDER_WIDTH * (groupCount - 2)) |
| | | ); |
| | | }; |
| | | let maxColsNum = ref<number>(null); |
| | | const resizeEvent = ({ width, height }) => { |
| | | // ææå¤§å®½åº¦ç®æå¤§åæ° |
| | | maxColsNum.value = Math.floor((width - THICK_BORDER_WIDTH) / (CELL_WIDTH + THICK_BORDER_WIDTH)); |
| | | maxColsNum.value = Math.floor( |
| | | (width - THICK_BORDER_WIDTH + colHeaderCellContentWidth.value - rowHeaderCellContentWidth.value) / |
| | | (colHeaderCellContentWidth.value + THICK_BORDER_WIDTH) |
| | | ); |
| | | |
| | | const currentWidth = |
| | | (maxColsNum.value - 1) * colHeaderCellContentWidth.value + |
| | | rowHeaderCellContentWidth.value + |
| | | THICK_BORDER_WIDTH * (maxColsNum.value - 1) + |
| | | THICK_BORDER_WIDTH * 2; |
| | | let restWidth = width - currentWidth; |
| | | |
| | | // å°½å¯è½åç»ç¬¬ä¸å |
| | | if (rowHeaderCellContentWidth.value + restWidth > ROW_HEADER_CELL_MAX_WIDTH) { |
| | | restWidth = rowHeaderCellContentWidth.value - ROW_HEADER_CELL_MAX_WIDTH; |
| | | firstColWidth.value = ROW_HEADER_CELL_MAX_WIDTH; |
| | | } else { |
| | | firstColWidth.value = rowHeaderCellContentWidth.value + restWidth; |
| | | restWidth = 0; |
| | | } |
| | | |
| | | // å
¶ä½åç»å
¶ä»å |
| | | if (restWidth !== 0) { |
| | | const currentWidth = colHeaderCellContentWidth.value + restWidth; |
| | | restColWidth.value = currentWidth > CELL_MAX_WIDTH ? CELL_MAX_WIDTH : currentWidth; |
| | | } |
| | | |
| | | const groupCount = (props.data?.rows?.length ?? 0) + 1; |
| | | |
| | | const calcMaxRowsNum = (height, extraHeight = 0) => { |
| | | return Math.floor( |
| | | (height - THICK_BORDER_WIDTH - extraHeight) / |
| | | (CELL_HEIGHT * groupCount + 2 * THICK_BORDER_WIDTH + THIN_BORDER_WIDTH * (groupCount - 2)) |
| | | ); |
| | | }; |
| | | // ææå¤§é«åº¦ç®æå¤§è¡æ° |
| | | let rowsNum = calcMaxRowsNum(height); |
| | | let rowsNum = calcMaxRowsNum(groupCount, height); |
| | | |
| | | // ææå¤§åæ°éº |
| | | const maxColsRowsNum = Math.ceil(total / maxColsNum.value); |
| | | const isNeedPage = maxColsRowsNum > rowsNum; |
| | | rowsNum = isNeedPage ? calcMaxRowsNum(height, PAGE_HEIGHT) : maxColsRowsNum; |
| | | rowsNum = isNeedPage ? calcMaxRowsNum(groupCount, height, PAGE_HEIGHT) : maxColsRowsNum; |
| | | // rowsNum è¡ï¼maxColsNumåï¼ç¬¬ä¸åä¸ç® |
| | | pageSize.value = isNeedPage ? rowsNum * (maxColsNum.value - 1) : total; |
| | | pageIndex.value = 1; |
| | |
| | | }); |
| | | |
| | | // è®¡ç®æå¤§åæ° |
| | | // x* cellWidth+thickBorderWidth*(x-1)+thickBorderWidth*2 <= width; |
| | | // (x-1)* cellWidth + rowHeaderCellContentWidth.value+thickBorderWidth*(x-1)+thickBorderWidth*2 <= width; |
| | | |
| | | // x*(cellWidth+thickBorderWidth)+thickBorderWidth<=width; |
| | | // x<= (width-thickBorderWidth)/(cellWidth+thickBorderWidth); |
| | | // x*(cellWidth+thickBorderWidth)+thickBorderWidth - cellWidth + rowHeaderCellContentWidth.value<=width; |
| | | // x<= (width-thickBorderWidth + cellWidth-rowHeaderCellContentWidth.value)/(cellWidth+thickBorderWidth); |
| | | |
| | | // const groupCount = (TEST_DATA?.rows?.length ?? 0) + 1; |
| | | // è®¡ç®æå¤§è¡æ° |
| | |
| | | // y * (groupCount - 2) * thinBorderWidth <= |
| | | // height; |
| | | |
| | | // (cellHeight * groupCount + 2 * thickBorderWidth + thinBorderWidth(groupCount - 2) * groupCount) * y + thickBorderWidth <=height; |
| | | // (cellHeight * groupCount + 2 * thickBorderWidth + thinBorderWidth(groupCount - 2) * y + thickBorderWidth <=height; |
| | | |
| | | // y<= (height-thickBorderWidth)/(cellHeight * groupCount + 2 * thickBorderWidth + thinBorderWidth(groupCount - 2) * groupCount) |
| | | // y<= (height-thickBorderWidth)/(cellHeight * groupCount + 2 * thickBorderWidth + thinBorderWidth(groupCount - 2) ) |
| | | |
| | | onMounted(() => { |
| | | resizeEvent({ |