diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/PermissionManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/PermissionManage.java index 1d8a0bdd25..1cf32a21ed 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/PermissionManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/PermissionManage.java @@ -220,13 +220,15 @@ public class PermissionManage { private String handleSysVariable(UserFormVO userEntity, String sysVariable) { String value = null; + System.out.println(sysVariable); + System.out.println(JsonUtil.toJSONString(userEntity)); if (StringUtils.isNotBlank(sysVariable) && sysVariable.startsWith("${") && sysVariable.endsWith("}")) { String variableId = sysVariable.substring(2, sysVariable.length() - 1); for (SysVariableValueItem variable : userEntity.getVariables()) { - if (variableId.equalsIgnoreCase(variable.getVariableId())) { + if (variableId.equalsIgnoreCase(variable.getVariableId().toString())) { if (variable.getSysVariableDto().getType().equalsIgnoreCase("text")) { for (SysVariableValueDto sysVariableValueDto : variable.getValueList()) { - if (sysVariableValueDto.getId().toString().equals(variable.getVariableValueId())) { + if (sysVariableValueDto.getId().equals(variable.getVariableValueId())) { value = sysVariableValueDto.getValue(); } } diff --git a/core/core-frontend/package.json b/core/core-frontend/package.json index 9741a9d41d..673abee0e9 100644 --- a/core/core-frontend/package.json +++ b/core/core-frontend/package.json @@ -18,6 +18,7 @@ "@antv/l7plot": "^0.5.5", "@antv/s2": "^1.49.0", "@codemirror/lang-sql": "^6.4.0", + "@npkg/tinymce-plugins": "^0.0.7", "@tinymce/tinymce-vue": "^5.1.0", "@vueuse/core": "^9.13.0", "ace-builds": "^1.15.3", diff --git a/core/core-frontend/src/api/dataset.ts b/core/core-frontend/src/api/dataset.ts index b3f3dc0021..b491de7f14 100644 --- a/core/core-frontend/src/api/dataset.ts +++ b/core/core-frontend/src/api/dataset.ts @@ -16,6 +16,7 @@ export interface EnumValue { displayId?: string sortId?: string sort?: string + searchText: string } interface Fields { diff --git a/core/core-frontend/src/custom-component/rich-text/DeRichTextView.vue b/core/core-frontend/src/custom-component/rich-text/DeRichTextView.vue index bc2b408be1..19f2d33aed 100644 --- a/core/core-frontend/src/custom-component/rich-text/DeRichTextView.vue +++ b/core/core-frontend/src/custom-component/rich-text/DeRichTextView.vue @@ -47,6 +47,7 @@ import 'tinymce/plugins/contextmenu' // contextmenu import 'tinymce/plugins/directionality' import 'tinymce/plugins/nonbreaking' import 'tinymce/plugins/pagebreak' +import '@npkg/tinymce-plugins/letterspacing' import './plugins' //自定义插件 import { computed, nextTick, reactive, ref, toRefs, watch, onMounted, PropType } from 'vue' import { snapshotStoreWithOut } from '@/store/modules/data-visualization/snapshot' @@ -121,10 +122,10 @@ const init = ref({ skin_url: formatDataEaseBi('./tinymce-dataease-private/skins/ui/oxide'), // 皮肤 content_css: formatDataEaseBi('./tinymce-dataease-private/skins/content/default/content.css'), plugins: - 'vertical-content advlist autolink link image lists charmap media wordcount table contextmenu directionality pagebreak', // 插件 + 'vertical-content advlist autolink link image lists charmap media wordcount table contextmenu directionality pagebreak letterspacing', // 插件 // 工具栏 toolbar: - 'undo redo |fontselect fontsizeselect |forecolor backcolor bold italic |underline strikethrough link| formatselect |' + + 'undo redo | fontselect fontsizeselect |forecolor backcolor bold italic letterspacing |underline strikethrough link| formatselect |' + 'top-align center-align bottom-align | alignleft aligncenter alignright | bullist numlist |' + ' blockquote subscript superscript removeformat | table image | fullscreen ' + '| bdmap indent2em lineheight formatpainter axupimgs', diff --git a/core/core-frontend/src/custom-component/v-query/Select.vue b/core/core-frontend/src/custom-component/v-query/Select.vue index f809259329..87112317d2 100644 --- a/core/core-frontend/src/custom-component/v-query/Select.vue +++ b/core/core-frontend/src/custom-component/v-query/Select.vue @@ -9,6 +9,7 @@ import { nextTick, computed, inject, + onUnmounted, Ref } from 'vue' import { enumValueObj, type EnumValue, getEnumValue } from '@/api/dataset' @@ -84,11 +85,15 @@ const setDefaultMapValue = arr => { } }) Object.values(defaultMapValue).forEach(ele => { - defaultValue = [...defaultValue, ...(ele as unknown as string[])] + defaultValue = [...new Set([...defaultValue, ...(ele as unknown as string[])])] }) return defaultValue } +onUnmounted(() => { + enumValueArr = [] +}) + const handleValueChange = () => { const value = Array.isArray(selectValue.value) ? [...selectValue.value] : selectValue.value if (!props.isConfig) { @@ -144,27 +149,57 @@ const handleFieldIdDefaultChange = (val: string[]) => { }) } +const setOldMapValue = arr => { + const { displayId } = config.value + if (!displayId) { + return [] + } + let defaultMapValue = {} + let defaultValue = [] + arr.forEach(ele => { + defaultMapValue[ele] = [] + }) + enumValueArr.forEach(ele => { + if (defaultMapValue[ele[displayId]]) { + defaultMapValue[ele[displayId]].push(ele) + } + }) + Object.values(defaultMapValue).forEach(ele => { + defaultValue = [...defaultValue, ...(ele as unknown as string[])] + }) + return defaultValue +} + const handleFieldIdChange = (val: EnumValue) => { - enumValueArr = [] loading.value = true enumValueObj(val) .then(res => { - enumValueArr = res || [] + let oldArr = [] + let oldEnumValueArr = [] + if (selectValue.value?.length && config.value.multiple) { + oldArr = [...selectValue.value] + oldEnumValueArr = setOldMapValue(oldArr) + } + enumValueArr = [...res, ...oldEnumValueArr] || [] options.value = [ ...new Set( - (res || []).map(ele => { - return ele[val.displayId || val.queryId] - }) + (res || []) + .map(ele => { + return ele[val.displayId || val.queryId] + }) + .concat(oldArr) ) ].map(ele => { return { label: ele, - value: ele + value: ele, + checked: oldArr.includes(ele) } }) }) .finally(() => { loading.value = false + if (isFromRemote.value) return if (config.value.defaultValueCheck) { selectValue.value = Array.isArray(config.value.defaultValue) ? [...config.value.defaultValue] @@ -199,6 +234,11 @@ const visible = ref(false) const visibleChange = (val: boolean) => { setTimeout(() => { visible.value = !val + if (!val) { + isFromRemote.value = false + searchText.value = '' + remoteMethod('') + } }, 50) } @@ -310,6 +350,19 @@ watch( } ) +const searchText = ref('') +const isFromRemote = ref(false) +const clear = () => { + remoteMethod('') +} + +const remoteMethod = (query: string) => { + if (config.value.optionValueSource !== 1) return + isFromRemote.value = true + searchText.value = query + debounceOptions(1) +} + watch( () => config.value.valueSource, () => { @@ -342,7 +395,13 @@ const setOptions = (num: number) => { break case 1: if (field.id) { - handleFieldIdChange({ queryId: field.id, displayId: displayId || field.id, sort, sortId }) + handleFieldIdChange({ + queryId: field.id, + displayId: displayId || field.id, + sort, + sortId, + searchText: searchText.value + }) } else { options.value = [] } @@ -414,9 +473,10 @@ defineExpose({ multiple show-checked clearable - radio :style="selectStyle" collapse-tags + :remote="config.optionValueSource === 1" + :remote-method="remoteMethod" :options="options" collapse-tags-tooltip > @@ -430,6 +490,9 @@ defineExpose({ ref="single" :style="selectStyle" filterable + @clear="clear" + :remote="config.optionValueSource === 1" + :remote-method="remoteMethod" radio @visible-change="visibleChange" :popper-class=" diff --git a/core/core-frontend/src/views/chart/components/editor/editor-style/components/QuadrantSelector.vue b/core/core-frontend/src/views/chart/components/editor/editor-style/components/QuadrantSelector.vue index aa1e548edc..139861dc0c 100644 --- a/core/core-frontend/src/views/chart/components/editor/editor-style/components/QuadrantSelector.vue +++ b/core/core-frontend/src/views/chart/components/editor/editor-style/components/QuadrantSelector.vue @@ -3,13 +3,16 @@ import { computed, inject, onMounted, PropType, reactive, ref, watch } from 'vue import { useI18n } from '@/hooks/web/useI18n' import { COLOR_PANEL, DEFAULT_QUADRANT_STYLE } from '@/views/chart/components/editor/util/chart' import { useEmitt } from '@/hooks/web/useEmitt' +import { dvMainStoreWithOut } from '@/store/modules/data-visualization/dvMain' +import { storeToRefs } from 'pinia' +import { deepCopy } from '@/utils/utils' useEmitt({ name: 'quadrant-default-baseline', callback: args => quadrantDefaultBaseline(args) }) const quotaData = ref(inject('quotaData')) const { t } = useI18n() - +const dvMainStore = dvMainStoreWithOut() const props = defineProps({ chart: { type: Object, @@ -25,9 +28,29 @@ const props = defineProps({ }) const predefineColors = COLOR_PANEL - +const regionStyle = [] +const labels = [] +const isDashboard = dvMainStore.dvInfo.type === 'dashboard' +for (let i = 0; i < 4; i++) { + regionStyle.push({ + fill: isDashboard ? '#fdfcfc' : 'rgb(2,4,8,1)', + fillOpacity: 1 + }) + labels.push({ + content: '', + style: { + fill: isDashboard ? 'rgb(2,4,8,1)' : '#fdfcfc', + fillOpacity: 0.5, + fontSize: 14 + } + }) +} const state = reactive({ - quadrantForm: JSON.parse(JSON.stringify(DEFAULT_QUADRANT_STYLE)) + quadrantForm: { + ...JSON.parse(JSON.stringify(DEFAULT_QUADRANT_STYLE)), + regionStyle, + labels + } }) const toolTip = computed(() => { return props.themes === 'dark' ? 'ndark' : 'dark' @@ -84,19 +107,27 @@ const init = () => { } if (customAttr.quadrant) { state.quadrantForm = customAttr.quadrant + } else { + changeStyle() } } } const showProperty = prop => props.propertyInner?.includes(prop) - +const tabActive = ref(1) onMounted(() => { init() }) diff --git a/core/core-frontend/src/views/chart/components/editor/index.vue b/core/core-frontend/src/views/chart/components/editor/index.vue index 920f4a4940..ccfc534389 100644 --- a/core/core-frontend/src/views/chart/components/editor/index.vue +++ b/core/core-frontend/src/views/chart/components/editor/index.vue @@ -59,6 +59,9 @@ const snapshotStore = snapshotStoreWithOut() const dvMainStore = dvMainStoreWithOut() const { canvasCollapse, curComponent, componentData, editMode } = storeToRefs(dvMainStore) const router = useRouter() +let componentNameEdit = ref(false) +let inputComponentName = ref('') +let componentNameInput = ref(null) const { t } = useI18n() const loading = ref(false) @@ -92,6 +95,35 @@ const editCalcField = ref(false) const isCalcFieldAdd = ref(true) const calcEdit = ref() const route = useRoute() + +const onComponentNameChange = () => { + snapshotStore.recordSnapshotCache() +} + +const closeEditComponentName = () => { + componentNameEdit.value = false + if (!inputComponentName.value || !inputComponentName.value.trim()) { + return + } + if (inputComponentName.value.trim() === view.value.title) { + return + } + if (inputComponentName.value.trim().length > 64 || inputComponentName.value.trim().length < 2) { + ElMessage.warning('名称字段长度2-64个字符') + editComponentName() + return + } + view.value.title = inputComponentName.value + inputComponentName.value = '' +} + +const editComponentName = () => { + componentNameEdit.value = true + inputComponentName.value = view.value.title + nextTick(() => { + componentNameInput.value.focus() + }) +} const toolTip = computed(() => { return props.themes === 'dark' ? 'ndark' : 'dark' }) @@ -1480,7 +1512,9 @@ const drop = (ev: MouseEvent, type = 'xAxis') => {
- {{ view.title }} + {{ + view.title + }} @@ -2853,6 +2887,15 @@ const drop = (ev: MouseEvent, type = 'xAxis') => {
+ + + diff --git a/core/core-frontend/src/views/chart/components/js/panel/charts/others/quadrant.ts b/core/core-frontend/src/views/chart/components/js/panel/charts/others/quadrant.ts index 4c4d1c9a2e..815c2b4ec6 100644 --- a/core/core-frontend/src/views/chart/components/js/panel/charts/others/quadrant.ts +++ b/core/core-frontend/src/views/chart/components/js/panel/charts/others/quadrant.ts @@ -7,10 +7,8 @@ import { flow, parseJson } from '../../../util' import { valueFormatter } from '../../../formatter' import { useI18n } from '@/hooks/web/useI18n' import { isEmpty } from 'lodash-es' -import { DEFAULT_QUADRANT_STYLE } from '@/views/chart/components/editor/util/chart' const { t } = useI18n() - /** * 象限图 */ @@ -396,9 +394,6 @@ export class Quadrant extends G2PlotChartView { ...chart.customStyle.yAxisExt.axisLine, show: true } - chart.customAttr.quadrant = { - ...DEFAULT_QUADRANT_STYLE - } return chart } diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/user/vo/UserFormVO.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/user/vo/UserFormVO.java index 4c5fed52da..2c0730cfe1 100644 --- a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/user/vo/UserFormVO.java +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/user/vo/UserFormVO.java @@ -44,9 +44,6 @@ public class UserFormVO implements Serializable { @Schema(description = "模式") private String model; - @Schema(description = "系统变量") - private String sysVariable; - @Schema(description = "系统变量") private List variables; } diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/user/vo/UserGridVO.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/user/vo/UserGridVO.java index 35f8f1d886..26394a4a52 100644 --- a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/user/vo/UserGridVO.java +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/user/vo/UserGridVO.java @@ -2,7 +2,6 @@ package io.dataease.api.permissions.user.vo; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import io.dataease.api.permissions.variable.dto.SysVariableValueItem; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -28,5 +27,5 @@ public class UserGridVO { @Schema(description = "创建时间") private Long createTime; @Schema(description = "系统变量") - private List variables; + private String sysVariable; } diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/variable/api/SysVariablesApi.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/variable/api/SysVariablesApi.java index 35c9753775..8f0bbd7796 100644 --- a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/variable/api/SysVariablesApi.java +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/variable/api/SysVariablesApi.java @@ -36,7 +36,7 @@ public interface SysVariablesApi { @Operation(summary = "详细信息") @GetMapping("/detail/{id}") - SysVariableDto detail(@PathVariable String id); + SysVariableDto detail(@PathVariable Long id); @Operation(summary = "查询") @PostMapping("/query") @@ -55,7 +55,7 @@ public interface SysVariablesApi { void deleteValue(@PathVariable String id); @GetMapping("/value/selected/{id}") - List selectVariableValue(@PathVariable("id") String id); + List selectVariableValue(@PathVariable("id") Long id); @PostMapping("/value/selected/{goPage}/{pageSize}") IPage selectPage(@PathVariable("goPage") int goPage, @PathVariable("pageSize") int pageSize, @RequestBody SysVariableValueDto sysVariableValueDto); diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/variable/dto/SysVariableValueItem.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/variable/dto/SysVariableValueItem.java index 3e96ed2d45..b7aaa92670 100644 --- a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/variable/dto/SysVariableValueItem.java +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/variable/dto/SysVariableValueItem.java @@ -8,12 +8,17 @@ import java.util.List; @Data public class SysVariableValueItem { - private SysVariableDto sysVariableDto; - @JsonSerialize(using = ToStringSerializer.class) - private String variableId; - @JsonSerialize(using = ToStringSerializer.class) - private String variableValueId; @JsonSerialize(using = ToStringSerializer.class) private String variableValue; + @JsonSerialize(using = ToStringSerializer.class) + private String variableValue2; + private String variableType; + @JsonSerialize(using = ToStringSerializer.class) + private Long variableId; + @JsonSerialize(using = ToStringSerializer.class) + private Long variableValueId; + private String variableName; private List valueList; + private SysVariableDto sysVariableDto; + }