+
@@ -355,14 +347,16 @@ init()
-
+
+
+
@@ -372,43 +366,49 @@ init()
-
+
+
+
{{ t('chart.textColor') }}
-
+
+
+
{{ t('chart.backgroundColor') }}
-
+
+
+
{
'tooltip-selector',
'y-axis-selector',
'title-selector',
+ 'function-cfg',
'jump-set',
'linkage'
]
@@ -45,10 +47,11 @@ export class ProgressBar extends G2PlotChartView {
...BAR_EDITOR_PROPERTY_INNER,
'legend-selector': null,
'background-overall-component': ['all'],
- 'basic-style-selector': ['colors', 'gradient'],
+ 'basic-style-selector': ['colors', 'alpha', 'gradient'],
'label-selector': ['hPosition', 'color', 'fontSize'],
'tooltip-selector': ['fontSize', 'color', 'backgroundColor', 'tooltipFormatter'],
- 'y-axis-selector': ['name', 'color', 'fontSize', 'axisForm', 'axisLabel', 'position']
+ 'y-axis-selector': ['name', 'color', 'fontSize', 'axisForm', 'axisLabel', 'position'],
+ 'function-cfg': ['emptyDataStrategy']
}
axis: AxisType[] = [...BAR_AXIS_TYPE, 'yAxisExt']
protected baseOptions: BarOptions = {
@@ -133,18 +136,14 @@ export class ProgressBar extends G2PlotChartView {
const basicStyle = parseJson(chart.customAttr).basicStyle
let color1 = basicStyle.colors?.map((ele, index) => {
if (index === 1) {
- return hexColorToRGBA(ele, 10)
+ return hexColorToRGBA(ele, basicStyle.alpha > 10 ? 10 : basicStyle.alpha)
} else {
- return ele
+ return hexColorToRGBA(ele, basicStyle.alpha)
}
})
if (basicStyle.gradient) {
- color1 = color1.map((ele, index) => {
- if (index === 1) {
- return ele
- }
- const tmp = hexColorToRGBA(ele, basicStyle.alpha)
- return setGradientColor(tmp, true, 0)
+ color1 = color1.map((ele, _index) => {
+ return setGradientColor(ele, true, 0)
})
}
options = {
@@ -186,7 +185,7 @@ export class ProgressBar extends G2PlotChartView {
const result = []
originalItems.forEach(item => {
if (item.data) {
- const value = valueFormatter(item.data.originalValue, tooltipAttr.tooltipFormatter)
+ const value = valueFormatter(item.data.value, tooltipAttr.tooltipFormatter)
if (item.data.id === yAxis.id) {
result.push({
...item,
@@ -275,6 +274,41 @@ export class ProgressBar extends G2PlotChartView {
}
}
+ protected configEmptyDataStrategy(chart: Chart, options: BarOptions): BarOptions {
+ const { data } = options as unknown as Options
+ if (!data?.length) {
+ return options
+ }
+ const strategy = parseJson(chart.senior).functionCfg.emptyDataStrategy
+ if (strategy === 'ignoreData') {
+ const emptyFields = data.filter(obj => obj['value'] === null).map(obj => obj['field'])
+ return {
+ ...options,
+ data: data.filter(obj => {
+ if (emptyFields.includes(obj['field'])) {
+ return false
+ }
+ return true
+ })
+ }
+ }
+ if (strategy === 'breakLine') {
+ data.forEach(obj => {
+ if (obj['value'] === null) {
+ obj['value'] = null
+ }
+ })
+ }
+ if (strategy === 'setZero') {
+ data.forEach(obj => {
+ if (obj['value'] === null) {
+ obj['value'] = 0
+ }
+ })
+ }
+ return options
+ }
+
protected setupOptions(chart: Chart, options: BarOptions): BarOptions {
return flow(
this.configTheme,
@@ -282,7 +316,8 @@ export class ProgressBar extends G2PlotChartView {
this.configLabel,
this.configTooltip,
this.configLegend,
- this.configYAxis
+ this.configYAxis,
+ this.configEmptyDataStrategy
)(chart, options)
}
diff --git a/core/core-frontend/src/views/chart/components/js/panel/common/common_table.ts b/core/core-frontend/src/views/chart/components/js/panel/common/common_table.ts
index fad100cce5..a3afdc168b 100644
--- a/core/core-frontend/src/views/chart/components/js/panel/common/common_table.ts
+++ b/core/core-frontend/src/views/chart/components/js/panel/common/common_table.ts
@@ -393,28 +393,51 @@ export function getConditions(chart: Chart) {
}
const conditions = threshold.tableThreshold ?? []
+ const dimFields = [...chart.xAxis, ...chart.xAxisExt].map(i => i.dataeaseName)
if (conditions?.length > 0) {
- const { tableCell, basicStyle } = parseJson(chart.customAttr)
- const valueColor = tableCell.tableFontColor
- let valueBgColor = hexColorToRGBA(tableCell.tableItemBgColor, basicStyle.alpha)
+ const { tableCell, basicStyle, tableHeader } = parseJson(chart.customAttr)
const enableTableCrossBG = tableCell.enableTableCrossBG
- if (enableTableCrossBG) {
- valueBgColor = null
- }
+ const valueColor = tableCell.tableFontColor
+ const valueBgColor = enableTableCrossBG
+ ? null
+ : hexColorToRGBA(tableCell.tableItemBgColor, basicStyle.alpha)
+ const headerValueColor = tableHeader.tableHeaderFontColor
+ const headerValueBgColor = hexColorToRGBA(tableHeader.tableHeaderBgColor, basicStyle.alpha)
for (let i = 0; i < conditions.length; i++) {
const field = conditions[i]
+ let defaultValueColor = valueColor
+ let defaultBgColor = valueBgColor
+ // 透视表表头颜色配置
+ if (chart.type === 'table-pivot' && dimFields.includes(field.field.dataeaseName)) {
+ defaultValueColor = headerValueColor
+ defaultBgColor = headerValueBgColor
+ }
res.text.push({
field: field.field.dataeaseName,
- mapping(value) {
+ mapping(value, rowData) {
+ // 总计小计
+ if (rowData?.isTotals) {
+ return null
+ }
+ // 表头
+ if (rowData?.id && rowData?.field === rowData.id) {
+ return null
+ }
return {
- fill: mappingColor(value, valueColor, field, 'color')
+ fill: mappingColor(value, defaultValueColor, field, 'color')
}
}
})
res.background.push({
field: field.field.dataeaseName,
- mapping(value) {
- const fill = mappingColor(value, valueBgColor, field, 'backgroundColor')
+ mapping(value, rowData) {
+ if (rowData?.isTotals) {
+ return null
+ }
+ if (rowData?.id && rowData?.field === rowData.id) {
+ return null
+ }
+ const fill = mappingColor(value, defaultBgColor, field, 'backgroundColor')
return fill ? { fill } : null
}
})
diff --git a/core/core-frontend/src/views/common/DeResourceTree.vue b/core/core-frontend/src/views/common/DeResourceTree.vue
index 2f85eb4625..63b9bc0ed3 100644
--- a/core/core-frontend/src/views/common/DeResourceTree.vue
+++ b/core/core-frontend/src/views/common/DeResourceTree.vue
@@ -3,6 +3,7 @@ import { onMounted, reactive, ref, toRefs, watch, nextTick, computed } from 'vue
import { copyResource, deleteLogic, ResourceOrFolder } from '@/api/visualization/dataVisualization'
import { ElIcon, ElMessage, ElMessageBox, ElScrollbar } from 'element-plus-secondary'
import { Icon } from '@/components/icon-custom'
+import { useEmitt } from '@/hooks/web/useEmitt'
import { HandleMore } from '@/components/handle-more'
import DeResourceGroupOpt from '@/views/common/DeResourceGroupOpt.vue'
import { useEmbedded } from '@/store/modules/embedded'
@@ -283,11 +284,23 @@ const operation = (cmd: string, data: BusiTreeNode, nodeType: string) => {
curCanvasType.value === 'dataV'
? `#/dvCanvas?opt=copy&pid=${params.pid}&dvId=${data.data}`
: `#/dashboard?opt=copy&pid=${params.pid}&resourceId=${data.data}`
- let embeddedBaseUrl = ''
if (isDataEaseBi.value) {
- embeddedBaseUrl = embeddedStore.baseUrl
+ embeddedStore.clearState()
+ embeddedStore.setPid(params.pid as string)
+ embeddedStore.setOpt('copy')
+ if (curCanvasType.value === 'dataV') {
+ embeddedStore.setDvId(data.data)
+ } else {
+ embeddedStore.setResourceId(data.data)
+ }
+ useEmitt().emitter.emit(
+ 'changeCurrentComponent',
+ curCanvasType.value === 'dataV' ? 'VisualizationEditor' : 'Dashboard'
+ )
+ return
}
- const newWindow = window.open(embeddedBaseUrl + baseUrl, '_blank')
+
+ const newWindow = window.open(baseUrl, '_blank')
initOpenHandler(newWindow)
})
} else {
@@ -306,14 +319,22 @@ const addOperation = (
const baseUrl =
curCanvasType.value === 'dataV' ? '#/dvCanvas?opt=create' : '#/dashboard?opt=create'
let newWindow = null
- let embeddedBaseUrl = ''
if (isDataEaseBi.value) {
- embeddedBaseUrl = embeddedStore.baseUrl
+ embeddedStore.clearState()
+ embeddedStore.setOpt('create')
+ if (data?.id) {
+ embeddedStore.setPid(data?.id as string)
+ }
+ useEmitt().emitter.emit(
+ 'changeCurrentComponent',
+ curCanvasType.value === 'dataV' ? 'VisualizationEditor' : 'Dashboard'
+ )
+ return
}
if (data?.id) {
- newWindow = window.open(embeddedBaseUrl + baseUrl + `&pid=${data.id}`, '_blank')
+ newWindow = window.open(baseUrl + `&pid=${data.id}`, '_blank')
} else {
- newWindow = window.open(embeddedBaseUrl + baseUrl, '_blank')
+ newWindow = window.open(baseUrl, '_blank')
}
initOpenHandler(newWindow)
} else if (cmd === 'newFromTemplate') {
@@ -334,11 +355,20 @@ function createNewObject() {
const resourceEdit = resourceId => {
const baseUrl = curCanvasType.value === 'dataV' ? '#/dvCanvas?dvId=' : '#/dashboard?resourceId='
- let embeddedBaseUrl = ''
if (isDataEaseBi.value) {
- embeddedBaseUrl = embeddedStore.baseUrl
+ embeddedStore.clearState()
+ if (curCanvasType.value === 'dataV') {
+ embeddedStore.setDvId(resourceId)
+ } else {
+ embeddedStore.setResourceId(resourceId)
+ }
+ useEmitt().emitter.emit(
+ 'changeCurrentComponent',
+ curCanvasType.value === 'dataV' ? 'VisualizationEditor' : 'Dashboard'
+ )
+ return
}
- const newWindow = window.open(embeddedBaseUrl + baseUrl + resourceId, '_blank')
+ const newWindow = window.open(baseUrl + resourceId, '_blank')
initOpenHandler(newWindow)
}
@@ -354,14 +384,23 @@ const resourceCreateFinish = templateData => {
? '#/dvCanvas?opt=create&createType=template'
: '#/dashboard?opt=create&createType=template'
let newWindow = null
- let embeddedBaseUrl = ''
if (isDataEaseBi.value) {
- embeddedBaseUrl = embeddedStore.baseUrl
+ embeddedStore.clearState()
+ embeddedStore.setOpt('create')
+ embeddedStore.setCreateType('template')
+ if (state.templateCreatePid) {
+ embeddedStore.setPid(state.templateCreatePid as unknown as string)
+ }
+ useEmitt().emitter.emit(
+ 'changeCurrentComponent',
+ curCanvasType.value === 'dataV' ? 'VisualizationEditor' : 'Dashboard'
+ )
+ return
}
if (state.templateCreatePid) {
- newWindow = window.open(embeddedBaseUrl + baseUrl + `&pid=${state.templateCreatePid}`, '_blank')
+ newWindow = window.open(baseUrl + `&pid=${state.templateCreatePid}`, '_blank')
} else {
- newWindow = window.open(embeddedBaseUrl + baseUrl, '_blank')
+ newWindow = window.open(baseUrl, '_blank')
}
initOpenHandler(newWindow)
}
diff --git a/core/core-frontend/src/views/dashboard/index.vue b/core/core-frontend/src/views/dashboard/index.vue
index ac9d33590d..dde79b2d71 100644
--- a/core/core-frontend/src/views/dashboard/index.vue
+++ b/core/core-frontend/src/views/dashboard/index.vue
@@ -34,7 +34,7 @@ const canvasCacheOutRef = ref(null)
const eventCheck = e => {
if (e.key === 'panel-weight' && !compareStorage(e.oldValue, e.newValue)) {
const resourceId = embeddedStore.resourceId || router.currentRoute.value.query.resourceId
- const { opt } = router.currentRoute.value.query
+ const opt = embeddedStore.opt || router.currentRoute.value.query.opt
if (!(opt && opt === 'create')) {
check(wsCache.get('panel-weight'), resourceId as string, 4)
}
@@ -163,7 +163,10 @@ onMounted(async () => {
window.addEventListener('storage', eventCheck)
const resourceId = embeddedStore.resourceId || router.currentRoute.value.query.resourceId
const pid = embeddedStore.pid || router.currentRoute.value.query.pid
- const { opt, createType, templateParams } = router.currentRoute.value.query
+ const opt = embeddedStore.opt || router.currentRoute.value.query.opt
+ const createType = embeddedStore.createType || router.currentRoute.value.query.createType
+ const templateParams =
+ embeddedStore.templateParams || router.currentRoute.value.query.templateParams
const checkResult = await checkPer(resourceId)
if (!checkResult) {
return
diff --git a/core/core-frontend/src/views/data-visualization/index.vue b/core/core-frontend/src/views/data-visualization/index.vue
index ee7a2b40c6..fc3775cbda 100644
--- a/core/core-frontend/src/views/data-visualization/index.vue
+++ b/core/core-frontend/src/views/data-visualization/index.vue
@@ -43,7 +43,7 @@ const embeddedStore = useEmbedded()
const { wsCache } = useCache()
const eventCheck = e => {
if (e.key === 'screen-weight' && !compareStorage(e.oldValue, e.newValue)) {
- const { opt } = router.currentRoute.value.query
+ const opt = embeddedStore.opt || router.currentRoute.value.query.opt
if (!(opt && opt === 'create')) {
check(
wsCache.get('screen-weight'),
@@ -270,7 +270,10 @@ onMounted(async () => {
}
const dvId = embeddedStore.dvId || router.currentRoute.value.query.dvId
const pid = embeddedStore.pid || router.currentRoute.value.query.pid
- const { opt, createType, templateParams } = router.currentRoute.value.query
+ const templateParams =
+ embeddedStore.templateParams || router.currentRoute.value.query.templateParams
+ const createType = embeddedStore.createType || router.currentRoute.value.query.createType
+ const opt = embeddedStore.opt || router.currentRoute.value.query.opt
const checkResult = await checkPer(dvId)
if (!checkResult) {
return
diff --git a/core/core-frontend/src/views/template-market/index.vue b/core/core-frontend/src/views/template-market/index.vue
index 1e3e961141..2c9a70c032 100644
--- a/core/core-frontend/src/views/template-market/index.vue
+++ b/core/core-frontend/src/views/template-market/index.vue
@@ -174,6 +174,7 @@ import { imgUrlTrans } from '@/utils/imgUtils'
import CategoryTemplateV2 from '@/views/template-market/component/CategoryTemplateV2.vue'
import { interactiveStoreWithOut } from '@/store/modules/interactive'
import { XpackComponent } from '@/components/plugin'
+import { useEmitt } from '@/hooks/web/useEmitt'
import { Base64 } from 'js-base64'
const { t } = useI18n()
const { wsCache } = useCache()
@@ -434,14 +435,29 @@ const apply = template => {
'&templateParams=' +
encodeURIComponent(Base64.encode(JSON.stringify(templateTemplate)))
let newWindow = null
- let embeddedBaseUrl = ''
if (isDataEaseBi.value) {
- embeddedBaseUrl = embeddedStore.baseUrl
+ embeddedStore.clearState()
+ embeddedStore.setCreateType('template')
+ embeddedStore.setTemplateParams(
+ encodeURIComponent(Base64.encode(JSON.stringify(templateTemplate)))
+ )
+ embeddedStore.setOpt('create')
+
+ if (state.pid) {
+ embeddedStore.setPid(state.pid)
+ }
+ useEmitt().emitter.emit(
+ 'changeCurrentComponent',
+ ['dataV', 'SCREEN'].includes(state.dvCreateForm.nodeType)
+ ? 'VisualizationEditor'
+ : 'Dashboard'
+ )
+ return
}
if (state.pid) {
- newWindow = window.open(embeddedBaseUrl + baseUrl + `&pid=${state.pid}`, '_blank')
+ newWindow = window.open(baseUrl + `&pid=${state.pid}`, '_blank')
} else {
- newWindow = window.open(embeddedBaseUrl + baseUrl, '_blank')
+ newWindow = window.open(baseUrl, '_blank')
}
initOpenHandler(newWindow)
}
diff --git a/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue b/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue
index 21bcf77727..9566f685aa 100644
--- a/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue
+++ b/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue
@@ -693,7 +693,10 @@ defineExpose({
-
+