diff --git a/README.md b/README.md index 09d75a224b..9a475b5822 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ curl -sSL https://dataease.oss-cn-hangzhou.aliyuncs.com/quick_start_v2.sh | bash - [MaxKB](https://github.com/1panel-dev/MaxKB/) - 基于 LLM 大语言模型的开源知识库问答系统 - [JumpServer](https://github.com/jumpserver/jumpserver/) - 广受欢迎的开源堡垒机 - [Halo](https://github.com/halo-dev/halo/) - 强大易用的开源建站工具 -- [MeterSphere](https://github.com/metersphere/metersphere/) - 开源的测试管理和接口测试工具 +- [MeterSphere](https://github.com/metersphere/metersphere/) - 新一代的开源持续测试工具 ## License diff --git a/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java b/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java index e53d980086..27461a0363 100644 --- a/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java +++ b/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java @@ -576,12 +576,19 @@ public class DataVisualizationServer implements DataVisualizationApi { // 模板市场记录 coreOptRecentManage.saveOpt(request.getResourceName(), OptConstants.OPT_RESOURCE_TYPE.TEMPLATE, OptConstants.OPT_TYPE.NEW); } - if(StringUtils.isNotEmpty(appDataStr)){ - VisualizationExport2AppVO appDataFormat = JsonUtil.parseObject(appDataStr,VisualizationExport2AppVO.class); - String dvInfo = appDataFormat.getVisualizationInfo(); - VisualizationBaseInfoVO baseInfoVO = JsonUtil.parseObject(dvInfo,VisualizationBaseInfoVO.class); - Long sourceDvId = baseInfoVO.getId(); - appDataStr = appDataStr.replaceAll(sourceDvId.toString(), newDvId.toString()); + if(StringUtils.isNotEmpty(appDataStr) && appDataStr.length()>10){ + try{ + VisualizationExport2AppVO appDataFormat = JsonUtil.parseObject(appDataStr,VisualizationExport2AppVO.class); + String dvInfo = appDataFormat.getVisualizationInfo(); + VisualizationBaseInfoVO baseInfoVO = JsonUtil.parseObject(dvInfo,VisualizationBaseInfoVO.class); + Long sourceDvId = baseInfoVO.getId(); + appDataStr = appDataStr.replaceAll(sourceDvId.toString(), newDvId.toString()); + }catch (Exception e){ + LogUtil.error(e); + appDataStr = null; + } + }else{ + appDataStr = null; } // 解析动态数据 Map dynamicDataMap = JsonUtil.parseObject(dynamicData, Map.class); diff --git a/core/core-frontend/src/components/plugin/src/index.vue b/core/core-frontend/src/components/plugin/src/index.vue index d412975937..3f0aeaae0d 100644 --- a/core/core-frontend/src/components/plugin/src/index.vue +++ b/core/core-frontend/src/components/plugin/src/index.vue @@ -117,12 +117,12 @@ onMounted(async () => { plugin.value = xpack.default } else if (!window._de_xpack_not_loaded) { window._de_xpack_not_loaded = true - window['Vue'] = Vue - window['Axios'] = axios - window['Pinia'] = Pinia - window['vueRouter'] = router - window['MittAll'] = useEmitt().emitter.all - window['I18n'] = i18n + window['VueDe'] = Vue + window['AxiosDe'] = axios + window['PiniaDe'] = Pinia + window['vueRouterDe'] = router + window['MittAllDe'] = useEmitt().emitter.all + window['I18nDe'] = i18n if (!window.tinymce) { window.tinymce = tinymce } diff --git a/core/core-frontend/src/models/chart/editor.d.ts b/core/core-frontend/src/models/chart/editor.d.ts index 7196366466..58b3bd8a86 100644 --- a/core/core-frontend/src/models/chart/editor.d.ts +++ b/core/core-frontend/src/models/chart/editor.d.ts @@ -1,6 +1,7 @@ declare type EditorProperty = | 'background-overall-component' | 'basic-style-selector' + | 'dual-basic-style-selector' | 'label-selector' | 'tooltip-selector' | 'x-axis-selector' diff --git a/core/core-frontend/src/utils/imgUtils.ts b/core/core-frontend/src/utils/imgUtils.ts index 0aa5825cde..f824dda73a 100644 --- a/core/core-frontend/src/utils/imgUtils.ts +++ b/core/core-frontend/src/utils/imgUtils.ts @@ -56,7 +56,7 @@ export function download2AppTemplate(downloadType, canvasDom, name, attachParams componentData: JSON.stringify(componentData.value), dynamicData: JSON.stringify(canvasViewDataTemplate), staticResource: JSON.stringify(staticResource || {}), - appData: JSON.stringify(attachParams || {}) + appData: attachParams ? JSON.stringify(attachParams) : null } const blob = new Blob([JSON.stringify(templateInfo)], { type: '' }) if (downloadType === 'template') { diff --git a/core/core-frontend/src/views/chart/components/editor/editor-style/ChartStyle.vue b/core/core-frontend/src/views/chart/components/editor/editor-style/ChartStyle.vue index 4596694f2b..dfe016730d 100644 --- a/core/core-frontend/src/views/chart/components/editor/editor-style/ChartStyle.vue +++ b/core/core-frontend/src/views/chart/components/editor/editor-style/ChartStyle.vue @@ -14,6 +14,7 @@ import { storeToRefs } from 'pinia' import CollapseSwitchItem from '@/components/collapse-switch-item/src/CollapseSwitchItem.vue' import { ElCollapse, ElCollapseItem } from 'element-plus-secondary' import BasicStyleSelector from '@/views/chart/components/editor/editor-style/components/BasicStyleSelector.vue' +import DualBasicStyleSelector from '@/views/chart/components/editor/editor-style/components/DualBasicStyleSelector.vue' import ComponentPosition from '@/components/visualization/common/ComponentPosition.vue' import BackgroundOverallCommon from '@/components/visualization/component-background/BackgroundOverallCommon.vue' import TableHeaderSelector from '@/views/chart/components/editor/editor-style/components/table/TableHeaderSelector.vue' @@ -242,6 +243,20 @@ watch( @onMiscChange="onMiscChange" /> + + + chart: ChartObj + sub?: boolean }>(), { - themes: 'light' + themes: 'light', + sub: false } ) const dvMainStore = dvMainStoreWithOut() @@ -34,7 +36,7 @@ const { batchOptStatus } = storeToRefs(dvMainStore) const emits = defineEmits(['update:modelValue', 'changeBasicStyle']) const changeChartType = () => { if (isColorGradient.value) { - state.value.basicStyleForm.colorScheme = 'default' + state.value.basicStyleForm[colorSchemeName.value] = 'default' changeColorOption({ value: 'default' }) } } @@ -50,28 +52,79 @@ const seriesColorState = reactive({ curColorIndex: 0, seriesColorPickerId: 'body' }) + +const instance = ref() + +const colorsName = computed(() => { + return props.sub ? 'subColors' : 'colors' +}) +const colorSchemeName = computed(() => { + return props.sub ? 'subColorScheme' : 'colorScheme' +}) +const seriesColorName = computed(() => { + return props.sub ? 'subSeriesColor' : 'seriesColor' +}) + +const needSetSeriesColor = computed(() => { + return ( + instance.value?.propertyInner?.['basic-style-selector']?.includes('seriesColor') || + instance.value?.propertyInner?.['dual-basic-style-selector']?.includes('seriesColor') + ) +}) + +const needSetSubSeriesColor = computed(() => { + return instance.value?.propertyInner?.['dual-basic-style-selector']?.includes('subSeriesColor') +}) + const setupSeriesColor = () => { if (batchOptStatus.value || !props.chart) { return } - const instance = chartViewManager.getChartView( + + instance.value = chartViewManager.getChartView( props.chart.render, props.chart.type ) as G2PlotChartView - if (!instance?.propertyInner?.['basic-style-selector'].includes('seriesColor')) { - return + + if (!props.sub) { + if (!needSetSeriesColor.value) { + return + } + } else { + if (!needSetSubSeriesColor.value) { + return + } } - const viewData = dvMainStore.getViewOriginData(props.chart.id) + let viewData = dvMainStore.getViewOriginData(props.chart.id) if (!viewData) { return } - const newSeriesColor = instance.setupSeriesColor(props.chart, viewData.data) + + if (props.chart.type.includes('chart-mix')) { + if (props.sub) { + viewData = viewData.right?.data?.[0] + } else { + viewData = viewData.left?.data?.[0] + } + } + if (!viewData) { + return + } + + const sFunction = props.sub + ? instance.value?.setupSubSeriesColor + : instance.value.setupSeriesColor + if (!sFunction) { + return + } + const newSeriesColor = sFunction(props.chart, viewData.data) const oldSeriesColor = - props.chart.customAttr.basicStyle.seriesColor?.reduce((p, n) => { + props.chart.customAttr.basicStyle[seriesColorName.value]?.reduce((p, n) => { p[n.id] = n return p }, {}) || {} + newSeriesColor?.forEach(item => { const oldColorItem = oldSeriesColor[item.id] if (oldColorItem) { @@ -116,7 +169,7 @@ const changeSeriesColor = () => { } }) if (changed) { - state.value.basicStyleForm.seriesColor = seriesColorState.seriesColor + state.value.basicStyleForm[seriesColorName.value] = seriesColorState.seriesColor changeBasicStyle('seriesColor') } } @@ -154,7 +207,7 @@ const colorCaseSelectorRef = ref>() const customColorPickerRef = ref>() function selectColorCase(option) { - state.value.basicStyleForm.colorScheme = option.value + state.value.basicStyleForm[colorSchemeName.value] = option.value colorCaseSelectorRef.value?.hide() changeColorOption(option) } @@ -162,13 +215,14 @@ function selectColorCase(option) { const changeColorOption = (option?) => { let isGradient = option?.value?.endsWith('_split_gradient') || isColorGradient.value const getColorItems = isGradient ? getMapColorCases(colorCases) : colorCases - const items = getColorItems.filter(ele => ele.value === state.value.basicStyleForm.colorScheme) - + const items = getColorItems.filter( + ele => ele.value === state.value.basicStyleForm[colorSchemeName.value] + ) if (items.length > 0) { - state.value.basicStyleForm.colors = [...items[0].colors] - state.value.customColor = state.value.basicStyleForm.colors[0] + state.value.basicStyleForm[colorsName.value] = [...items[0].colors] + state.value.customColor = state.value.basicStyleForm[colorsName.value][0] state.value.colorIndex = 0 - state.value.basicStyleForm.seriesColor?.forEach((c, i) => { + state.value.basicStyleForm[seriesColorName.value]?.forEach((c, i) => { const length = items[0].colors.length c.color = items[0].colors[i % length] }) @@ -181,22 +235,22 @@ const resetCustomColor = () => { const switchColorCase = () => { const { colorIndex, customColor, basicStyleForm } = state.value - const colors = basicStyleForm.colors + const colors = basicStyleForm[colorsName.value] if (isColorGradient.value) { let startColor = colorIndex === 0 ? customColor : colors[0] let endColor = colorIndex === 0 ? colors[8] : customColor - basicStyleForm.colors = stepsColor(startColor, endColor, 9, 1) + basicStyleForm[colorsName.value] = stepsColor(startColor, endColor, 9, 1) } else { colors[colorIndex] = customColor } changeBasicStyle() } const isColorGradient = computed(() => - state.value.basicStyleForm.colorScheme.endsWith('_split_gradient') + state.value.basicStyleForm[colorSchemeName.value].endsWith('_split_gradient') ) const showColorGradientIndex = index => { - return index === 0 || index === state.value.basicStyleForm.colors.length - 1 + return index === 0 || index === state.value.basicStyleForm[colorsName.value].length - 1 } const switchColor = (index, c) => { if (isColorGradient.value && !showColorGradientIndex(index)) { @@ -279,7 +333,7 @@ const colorItemBorderColor = (index, state) => {