diff --git a/core/core-frontend/package.json b/core/core-frontend/package.json index 87e2345d5b..e6d7f9b548 100644 --- a/core/core-frontend/package.json +++ b/core/core-frontend/package.json @@ -14,7 +14,7 @@ "preview": "vite preview" }, "dependencies": { - "@antv/g2": "^5.3.5", + "@antv/g2": "^5.4.0", "@antv/l7": "^2.22.0", "@antv/l7plot": "^0.5.5", "@antv/s2": "^2.4.5", diff --git a/core/core-frontend/src/views/chart/components/js/extremumUitl.ts b/core/core-frontend/src/views/chart/components/js/extremumUitl.ts index d13b711d74..744a4db5c1 100644 --- a/core/core-frontend/src/views/chart/components/js/extremumUitl.ts +++ b/core/core-frontend/src/views/chart/components/js/extremumUitl.ts @@ -90,7 +90,7 @@ export const extremumEvt = ( // 这里获取 y 字段 // 部分图表传过来的是options包含 children 的数组 // 部分图表是children数组中的对象,line or bar - const { y: yField } = options.encode + const { y: yField } = options.encode ? options.encode : options.children[0].encode const chartData = options.children ? options.children : [options] // 遍历所有 series,为标签注入 HTML 和样式 chartData @@ -119,35 +119,37 @@ export const extremumEvt = ( pointSize = Math.max(pointSize, item.encode?.size || 0) }) - const parentRect = parent?.getBoundingClientRect() - // 渲染后调整极值标签位置,防止溢出 - newChart.on('afterrender', () => { - document.querySelectorAll('.extremum-' + chart.container).forEach(item => { + const setExtremumPosition = () => { + document.querySelectorAll('.extremum-' + chart.container)?.forEach(item => { item.style.display = 'block' + item?.parentElement?.parentElement const itemRect = item.getBoundingClientRect() - const childNode = item.childNodes[1] as HTMLElement + const itemParentRect = item.parentElement?.getBoundingClientRect() + const spanElement = item.parentElement.querySelector('span' as string) as HTMLElement // 判断是否顶部溢出 - if (itemRect.top < parentRect.top) { - item.style.transform = `translate(-50%) translateY(${pointSize / scale + 10}px)` - childNode.style.cssText += 'transform: translateX(-50%) rotate(180deg); top: -5px;' + const itemParentParentRect = item.parentElement?.parentElement?.getBoundingClientRect() + // 顶部有足够空间 + if (itemParentRect.top - itemParentParentRect.top > itemParentRect.height) { + item.style.transform = `translateY(-${itemRect.height + 5}px)` + spanElement.style.cssText += 'transform: rotate(0deg);top: -6px;' + } else { + item.style.transform = `translateY(${pointSize / scale + 5 * 2}px)` + spanElement.style.cssText += `transform: rotate(180deg);top: ${pointSize / scale + 5}px;` } - // 判断是否右侧溢出 - if (itemRect.right > parentRect.right) { - const currentLeft = parseFloat(window.getComputedStyle(item).left) || 0 - const newLeft = currentLeft - (itemRect.right - parentRect.right) - item.style.left = `${newLeft}px` - // childNode 反向偏移,保持始终指向在数据点上 - childNode.style.left = itemRect.width / 2 + Math.abs(newLeft) + 'px' - } - // 判断是否左侧溢出 - if (itemRect.left < parentRect.left) { - const currentLeft = parseFloat(window.getComputedStyle(item).left) || 0 - const newLeft = currentLeft + (parentRect.left - itemRect.left) - item.style.left = `${newLeft}px` - // childNode 反向偏移,保持始终指向在数据点上 - childNode.style.left = itemRect.width / 2 - Math.abs(newLeft) + 'px' + // 判断右侧溢出 + const overflowRight = itemParentRect.right - itemParentParentRect.right + let newRight = itemRect.width / 2 + if (overflowRight > itemRect.width * 0.5) { + newRight = overflowRight } + item.style.right = newRight + 'px' }) + } + newChart.on('afterchangesize', () => { + setExtremumPosition() + }) + newChart.on('afterrender', () => { + setExtremumPosition() }) } @@ -244,18 +246,16 @@ const extremumHtml = (chart, yField, isSeriesLabel) => { background: rgba(${color}); "> ${textContent} - - ` } } diff --git a/core/core-frontend/src/views/chart/components/js/panel/charts/g2/bar/bar.ts b/core/core-frontend/src/views/chart/components/js/panel/charts/g2/bar/bar.ts index 00ccec46ab..993fe020b6 100644 --- a/core/core-frontend/src/views/chart/components/js/panel/charts/g2/bar/bar.ts +++ b/core/core-frontend/src/views/chart/components/js/panel/charts/g2/bar/bar.ts @@ -7,7 +7,7 @@ import { } from '@/views/chart/components/js/panel/charts/g2/bar/common' import { useI18n } from '@/hooks/web/useI18n' import { flow, hexColorToRGBA, hexToRgba, parseJson } from '@/views/chart/components/js/util' -import { cloneDeep, isEmpty } from 'lodash-es' +import { cloneDeep, defaultsDeep, isEmpty } from 'lodash-es' import { valueFormatter } from '@/views/chart/components/js/formatter' import { getLineDash, @@ -83,8 +83,7 @@ export class Bar extends G2ChartView { background: true } }, - transform: [{ type: 'dodgeX' } as Transform], - data: [] + transform: [{ type: 'dodgeX' } as Transform] } as ViewSpec async drawChart(drawOptions: G2DrawOptions): Promise { @@ -96,14 +95,11 @@ export class Bar extends G2ChartView { const data = cloneDeep(drawOptions.chart.data?.data) const initOptions: ViewSpec = { type: 'view', - data: { - value: data - }, + data: data, children: [ { ...this.intervalOptions, - transform: [].concat(this.intervalOptions.transform), - data + transform: [].concat(this.intervalOptions.transform) } ] } @@ -120,17 +116,6 @@ export class Bar extends G2ChartView { scale, this.name === 'bar' || this.name === 'bar-group' ) - newChart.afterRender = (c?: any) => { - extremumEvt( - c, - chart, - c.options(), - container, - scale, - this.name === 'bar' || this.name === 'bar-group' - ) - c.render() - } return newChart } @@ -155,12 +140,9 @@ export class Bar extends G2ChartView { const position = { position: l.position === 'middle' ? 'inside' : l.position, textAlign: 'center', - dy: l.position === 'top' ? -10 : 0, + dy: l.position === 'top' ? -15 : 0, dx: 0 } - const transform = { - transform: [{ type: 'exceedAdjust' }, { type: 'overlapHide' }] - } // 配置标签样式 const newLabel = { text: 'value', @@ -195,8 +177,10 @@ export class Bar extends G2ChartView { return '' } return valueFormatter(value, labelCfg.formatterCfg) - }, - ...(l.fullDisplay ? { transform: [{ type: 'exceedAdjust' }] } : transform) + } + } + if (!l.fullDisplay) { + newLabel.transform = [{ type: 'overlapHide' }] } return { ...options, @@ -712,6 +696,29 @@ export class Bar extends G2ChartView { } } + protected configSlider(chart: Chart, options: ViewSpec): ViewSpec { + const { functionCfg } = parseJson(chart.senior) + if (!functionCfg?.sliderShow) { + return options + } + const lineMark = options.children[0] + const sliderOpt = { + slider: { + x: { + values: [functionCfg.sliderRange[0] / 100, functionCfg.sliderRange[1] / 100], + style: { + trackFill: functionCfg.sliderBg, + selectionFill: functionCfg.sliderFillBg, + handleLabelFill: functionCfg.sliderTextColor, + sparklineLineStrokeOpacity: 0 + } + } + } + } + defaultsDeep(lineMark, sliderOpt) + return options + } + protected setupOptions(chart: Chart, options: ViewSpec): ViewSpec { return flow( this.configTheme, @@ -722,7 +729,8 @@ export class Bar extends G2ChartView { this.configXAxis, this.configYAxis, this.configAnalyse, - this.configBarConditions + this.configBarConditions, + this.configSlider )(chart, options, {}, this) } diff --git a/core/core-frontend/src/views/chart/components/js/panel/charts/g2/line/area.ts b/core/core-frontend/src/views/chart/components/js/panel/charts/g2/line/area.ts index 74494c8f1b..5b3b55f4d5 100644 --- a/core/core-frontend/src/views/chart/components/js/panel/charts/g2/line/area.ts +++ b/core/core-frontend/src/views/chart/components/js/panel/charts/g2/line/area.ts @@ -97,10 +97,7 @@ export class Area extends G2ChartView { // 开始渲染 newChart.options(options) newChart.on('point:click', action) - newChart.afterRender = (c?: any) => { - extremumEvt(c, chart, c.options(), container, scale, this.name === 'area') - c.render() - } + extremumEvt(newChart, chart, options, container, scale) // configPlotTooltipEvent(chart, newChart) return newChart } @@ -258,9 +255,7 @@ export class Area extends G2ChartView { } return labelCfg.position === 'top' ? 'bottom' : 'top' }, - transform: labelAttr.fullDisplay - ? [{ type: 'exceedAdjust' }] - : [{ type: 'exceedAdjust' }, { type: 'overlapHide' }], + ...(labelAttr.fullDisplay ? {} : { transform: [{ type: 'overlapHide' }] }), fontFamily: chart.fontFamily } ] @@ -736,9 +731,7 @@ export class StackArea extends Area { textBaseline: () => { return labelAttr.position === 'top' ? 'bottom' : 'top' }, - transform: labelAttr.fullDisplay - ? [{ type: 'exceedAdjust' }] - : [{ type: 'exceedAdjust' }, { type: 'overlapHide' }], + ...(labelAttr.fullDisplay ? {} : { transform: [{ type: 'overlapHide' }] }), fontFamily: chart.fontFamily } ] diff --git a/core/core-frontend/src/views/chart/components/js/panel/charts/g2/line/line.ts b/core/core-frontend/src/views/chart/components/js/panel/charts/g2/line/line.ts index c5874bdd62..38fde81cea 100644 --- a/core/core-frontend/src/views/chart/components/js/panel/charts/g2/line/line.ts +++ b/core/core-frontend/src/views/chart/components/js/panel/charts/g2/line/line.ts @@ -95,10 +95,7 @@ export class Line extends G2ChartView { const newChart = new G2Chart({ container }) newChart.options(options) newChart.on('point:click', action) - newChart.afterRender = (c?: any) => { - extremumEvt(c, chart, c.options(), container, scale) - c.render() - } + extremumEvt(newChart, chart, options, container, scale) // configPlotTooltipEvent(chart, newChart) return newChart } @@ -257,9 +254,7 @@ export class Line extends G2ChartView { } return labelCfg.position === 'top' ? 'bottom' : 'top' }, - transform: labelAttr.fullDisplay - ? [{ type: 'exceedAdjust' }] - : [{ type: 'exceedAdjust' }, { type: 'overlapHide' }], + ...(labelAttr.fullDisplay ? {} : { transform: [{ type: 'overlapHide' }] }), fontFamily: chart.fontFamily } ] diff --git a/core/core-frontend/src/views/chart/components/js/panel/charts/g2/relation/pie/common.ts b/core/core-frontend/src/views/chart/components/js/panel/charts/g2/relation/pie/common.ts index 6742db5255..ce8120c407 100644 --- a/core/core-frontend/src/views/chart/components/js/panel/charts/g2/relation/pie/common.ts +++ b/core/core-frontend/src/views/chart/components/js/panel/charts/g2/relation/pie/common.ts @@ -1,4 +1,4 @@ - import { useI18n } from '@/hooks/web/useI18n' +import { useI18n } from '@/hooks/web/useI18n' const { t } = useI18n()