<script lang="ts" setup>
import more_v from '@/assets/svg/more_v.svg'
import icon_add_outlined from '@/assets/svg/icon_add_outlined.svg'
import icon_drag_outlined from '@/assets/svg/icon_drag_outlined.svg'
import icon_visible_outlined from '@/assets/svg/icon_visible_outlined.svg'
import de_pwd_invisible from '@/assets/svg/de_pwd_invisible.svg'
import dvFolder from '@/assets/svg/dv-folder.svg'
import icon_dataset from '@/assets/svg/icon_dataset.svg'
import icon_deleteTrash_outlined from '@/assets/svg/icon_delete-trash_outlined.svg'
import icon_warning_filled from '@/assets/svg/icon_warning_filled.svg'
import icon_info_outlined from '@/assets/svg/icon_info_outlined.svg'
import icon_edit_outlined from '@/assets/svg/icon_edit_outlined.svg'
import {
ref,
reactive,
nextTick,
computed,
shallowRef,
toRefs,
watch,
defineAsyncComponent,
provide,
unref
} from 'vue'
import { storeToRefs } from 'pinia'
import { enumValueObj } from '@/api/dataset'
import CustomSortFilter from './CustomSortFilter.vue'
import { addQueryCriteriaConfig } from './options'
import { getCustomTime } from './time-format'
import { dvMainStoreWithOut } from '@/store/modules/data-visualization/dvMain'
import {
getThisStart,
getThisEnd,
getLastStart,
getAround,
getAroundStart,
getCustomRange
} from './time-format-dayjs'
import { snapshotStoreWithOut } from '@/store/modules/data-visualization/snapshot'
import { useI18n } from '@/hooks/web/useI18n'
import { fieldType } from '@/utils/attr'
import { ElMessage, ElSelect, ElMessageBox } from 'element-plus-secondary'
import type { DatasetDetail } from '@/api/dataset'
import { getDsDetailsWithPerm, getSqlParams, listFieldsWithPermissions } from '@/api/dataset'
import EmptyBackground from '@/components/empty-background/src/EmptyBackground.vue'
import TreeFieldDialog from '@/custom-component/v-query/TreeFieldDialog.vue'
import { cloneDeep } from 'lodash-es'
import { getDatasetTree } from '@/api/dataset'
import { Tree } from '@/views/visualized/data/dataset/form/CreatDsGroup.vue'
import draggable from 'vuedraggable'
import type { ManipulateType } from 'dayjs'
import dayjs from 'dayjs'
import ConditionDefaultConfiguration from '@/custom-component/v-query/ConditionDefaultConfiguration.vue'
import { iconChartMap } from '@/components/icon-group/chart-list'
import { iconFieldMap } from '@/components/icon-group/field-list'
import treeSort from '@/utils/treeSortUtils'
import { useCache } from '@/hooks/web/useCache'
const { t } = useI18n()
const { wsCache } = useCache()
const dvMainStore = dvMainStoreWithOut()
const { componentData, canvasViewInfo } = storeToRefs(dvMainStore)
const defaultConfigurationRef = ref(null)
interface DatasetField {
type?: string
innerType?: string
title: string
id: string
tableId: string
}
const props = defineProps({
queryElement: {
type: Object,
default() {
return {
id: null,
propValue: []
}
}
}
})
const dialogVisible = ref(false)
const renameInput = ref([])
const valueSource = ref([])
const conditions = ref([])
const checkAll = ref(false)
const activeConditionForRename = reactive({
id: '',
name: '',
visible: false
})
const datasetMap = {}
const snapshotStore = snapshotStoreWithOut()
const dfsComponentData = () => {
let arr = componentData.value.filter(
com => !['VQuery', 'DeTabs'].includes(com.innerType) && com.component !== 'Group'
)
componentData.value.forEach(ele => {
if (ele.innerType === 'DeTabs') {
ele.propValue.forEach(itx => {
arr = [
...arr,
...itx.componentData.filter(
com => !['VQuery', 'DeTabs'].includes(com.innerType) && com.component !== 'Group'
)
]
itx.componentData.forEach(j => {
if (j.component === 'Group') {
arr = [
...arr,
j.propValue.filter(
com => !['VQuery', 'DeTabs'].includes(com.innerType) && com.component !== 'Group'
)
]
}
})
})
} else if (ele.component === 'Group') {
arr = [
...arr,
ele.propValue.filter(
com => !['VQuery', 'DeTabs'].includes(com.innerType) && com.component !== 'Group'
)
]
ele.propValue.forEach(element => {
if (element.innerType === 'DeTabs') {
element.propValue.forEach(itx => {
arr = [
...arr,
...itx.componentData.filter(
com => !['VQuery', 'DeTabs'].includes(com.innerType) && com.component !== 'Group'
)
]
})
}
})
}
})
return arr.flat()
}
const datasetFieldList = computed(() => {
return dfsComponentData()
.map(ele => {
const obj = canvasViewInfo.value[ele.id]
if (!obj) return null
const { id, title, tableId, type } = obj as DatasetField
return !!id && !!tableId
? {
id,
type,
title,
tableId
}
: null
})
.filter(ele => !!ele)
})
const setCascadeDefault = val => {
conditions.value.forEach(ele => {
if (
ele.optionValueSource === 1 &&
[0, 2, 5].includes(+ele.displayType) &&
val.includes(ele.id)
) {
ele.selectValue = Array.isArray(ele.selectValue) ? [] : undefined
ele.defaultValue = Array.isArray(ele.defaultValue) ? [] : undefined
ele.mapValue = Array.isArray(ele.mapValue) ? [] : undefined
ele.defaultMapValue = Array.isArray(ele.defaultMapValue) ? [] : undefined
}
})
}
let cascadeArr = []
const saveCascade = arr => {
cascadeArr = arr
}
const getCascadeList = () => {
return cascadeArr
}
provide('set-cascade-default', setCascadeDefault)
provide('cascade-list', getCascadeList)
const curComponent = ref()
const manual = ref()
const activeCondition = ref('')
const isIndeterminate = ref(false)
const datasetTree = shallowRef([])
const fields = ref<DatasetDetail[]>()
const { queryElement } = toRefs(props)
const getDetype = (id, arr) => {
return arr.flat().find(ele => ele.id === id)?.deType
}
const showConfiguration = computed(() => {
if (!curComponent.value) return false
if (!curComponent.value.checkedFields?.length) return false
return curComponent.value.checkedFields.some(ele => {
return !!curComponent.value.checkedFieldsMap[ele]
})
})
const showTypeError = computed(() => {
if (!curComponent.value) return false
if (!curComponent.value.checkedFields?.length) return false
if (!fields.value?.length) return false
if (!!curComponent.value.parameters.length && isTimeParameter.value) {
const timeArr = curComponent.value.parameters.map(ele => ele.type[1])
const [typeOne] = timeArr
if (timeArr.some(ele => ele !== typeOne)) {
return true
}
}
let displayTypeField = null
let hasParameterNumArrType = 0
let allNum =
curComponent.value.checkedFields.every(id => {
return curComponent.value.checkedFieldsMapArrNum?.[id]?.length
}) && ['22'].includes(curComponent.value.displayType)
return curComponent.value.checkedFields.some(id => {
if (allNum) {
return false
}
if (
curComponent.value.checkedFieldsMapArrNum?.[id]?.length &&
['22', '2'].includes(curComponent.value.displayType)
) {
if (hasParameterNumArrType === 0) {
hasParameterNumArrType = 1
}
if (hasParameterNumArrType === 2) {
return true
}
}
if (
!curComponent.value.checkedFieldsMapArrNum?.[id]?.length &&
['22', '2'].includes(curComponent.value.displayType) &&
curComponent.value.parameters.some(ele => [2, 3].includes(ele.deType)) &&
curComponent.value.checkedFieldsMap[id]
) {
if (hasParameterNumArrType === 0) {
hasParameterNumArrType = 2
}
if (hasParameterNumArrType === 1) {
return true
}
}
const arr = fields.value.find(ele => ele.componentId === id)
const checkId = curComponent.value.checkedFieldsMap?.[id]
const field = duplicateRemoval(Object.values(arr?.fields || {}).flat()).find(
ele => checkId === ele.id
)
if (!field) return false
if (displayTypeField === null) {
displayTypeField = field
return false
}
if (displayTypeField?.deType === field?.deType && displayTypeField?.deType === 1) {
if (!Array.isArray(field.type) || !Array.isArray(displayTypeField.type)) {
return false
}
if (!displayTypeField.type?.length && !field.type?.length) {
return false
}
if (displayTypeField.type?.length !== field.type?.length) {
return true
}
}
return [2, 3].includes(field?.deType) && [2, 3].includes(displayTypeField.deType)
? false
: displayTypeField.deType !== field?.deType
})
})
const typeList = [
{
label: t('data_fill.rename'),
command: 'rename'
},
{
label: t('data_fill.delete'),
command: 'del'
}
]
const handleCheckAllChange = (val: boolean) => {
curComponent.value.checkedFields = val ? fields.value.map(ele => ele.componentId) : []
isIndeterminate.value = false
val && setSameId()
}
const handleCheckedFieldsChange = (value: string[]) => {
handleDialogClick()
const checkedCount = value.length
checkAll.value = checkedCount === fields.value.length
isIndeterminate.value = checkedCount > 0 && checkedCount < fields.value.length
if (curComponent.value.displayType === '8') return
setType()
}
const setSameId = () => {
const comIdMap = {}
Object.keys(curComponent.value.checkedFieldsMap).forEach(ele => {
if (curComponent.value.checkedFieldsMap[ele]) {
fields.value.forEach(itx => {
if (
itx.componentId === ele &&
curComponent.value.checkedFields?.includes(itx.componentId)
) {
comIdMap[itx.id] = curComponent.value.checkedFieldsMap[itx.componentId]
comIdMap[`active-${itx.id}`] = itx.activelist
}
})
}
})
Object.keys(curComponent.value.checkedFieldsMap).forEach(ele => {
if (!curComponent.value.checkedFieldsMap[ele]) {
fields.value.forEach(itx => {
if (
itx.componentId === ele &&
curComponent.value.checkedFields?.includes(itx.componentId) &&
comIdMap[itx.id]
) {
curComponent.value.checkedFieldsMap[itx.componentId] = comIdMap[itx.id]
itx.activelist = comIdMap[`active-${itx.id}`]
}
})
}
})
}
const handleCheckedFieldsChangeTree = (value: string[]) => {
handleDialogClick()
const checkedCount = value.length
checkAll.value = checkedCount === fields.value.length
isIndeterminate.value = checkedCount > 0 && checkedCount < fields.value.length
setSameId()
if (curComponent.value.displayType === '8') return
setTreeDefault()
setRelationBack()
setType()
}
const isParametersDisable = item => {
let isDisabled = false
if (!isNumParameter.value && isTimeParameter.value) {
if (notTimeRangeType.value.length && item.deType !== 1) {
isDisabled = true
}
}
return isDisabled
}
const setParametersArrNum = (val, componentId) => {
if (curComponent.value.checkedFieldsMapArr?.[componentId]?.length) {
curComponent.value.checkedFieldsMapArr[componentId] = []
curComponent.value.checkedFieldsMapEnd[componentId] = ''
curComponent.value.checkedFieldsMapStart[componentId] = ''
}
const timeStartId = curComponent.value.checkedFieldsMapStartNum[componentId]
const timeEndId = curComponent.value.checkedFieldsMapEndNum[componentId]
if (timeStartId) {
curComponent.value.checkedFieldsMapEndNum[componentId] = val.find(ele => ele !== timeStartId)
}
if (timeEndId) {
curComponent.value.checkedFieldsMapStartNum[componentId] = val.find(ele => ele !== timeEndId)
}
if (!val.length) {
curComponent.value.checkedFieldsMap[componentId] = ''
curComponent.value.checkedFieldsMapEndNum[componentId] = ''
curComponent.value.checkedFieldsMapStartNum[componentId] = ''
curComponent.value.parametersArr[componentId] = []
}
if (curComponent.value.checkedFieldsMapArrNum[componentId].length) {
setParametersNumType(componentId)
}
setTypeChange()
}
const setParametersArr = (val, componentId) => {
if (curComponent.value.checkedFieldsMapArrNum?.[componentId]?.length) {
curComponent.value.checkedFieldsMapArrNum[componentId] = []
curComponent.value.checkedFieldsMapEndNum[componentId] = ''
curComponent.value.checkedFieldsMapStartNum[componentId] = ''
}
const timeStartId = curComponent.value.checkedFieldsMapStart[componentId]
const timeEndId = curComponent.value.checkedFieldsMapEnd[componentId]
if (timeStartId) {
curComponent.value.checkedFieldsMapEnd[componentId] = val.find(ele => ele !== timeStartId)
}
if (timeEndId) {
curComponent.value.checkedFieldsMapStart[componentId] = val.find(ele => ele !== timeEndId)
}
if (!val.length) {
curComponent.value.checkedFieldsMap[componentId] = ''
curComponent.value.checkedFieldsMapEnd[componentId] = ''
curComponent.value.checkedFieldsMapStart[componentId] = ''
curComponent.value.displayType = '1'
curComponent.value.parametersArr[componentId] = []
curComponent.value.timeGranularity = ''
curComponent.value.timeGranularityMultiple = ''
}
if (curComponent.value.checkedFieldsMapArr[componentId].length) {
setParametersTimeType(componentId)
}
setTypeChange()
}
let currentComponentId = ''
let currentParameterId = ''
const timeDialogShow = ref(false)
const timeParameterType = ref(0)
const timeName = ref('')
const numDialogShow = ref(false)
const numParameterType = ref(0)
const numName = ref('')
const timeTypeChange = () => {
if (!curComponent.value.checkedFieldsMapArr[currentComponentId]) {
curComponent.value.checkedFieldsMapArr[currentComponentId] = []
}
if (timeParameterType.value === 0) {
curComponent.value.checkedFieldsMap[currentComponentId] = currentParameterId
curComponent.value.checkedFieldsMapArr[currentComponentId] = []
curComponent.value.checkedFieldsMapStart[currentComponentId] = ''
curComponent.value.checkedFieldsMapEnd[currentComponentId] = ''
}
if (timeParameterType.value === 1) {
curComponent.value.checkedFieldsMapStart[currentComponentId] = currentParameterId
curComponent.value.checkedFieldsMapArr[currentComponentId] = [
...new Set([
...curComponent.value.checkedFieldsMapArr[currentComponentId],
currentParameterId
])
]
if (curComponent.value.checkedFieldsMapArr[currentComponentId].length === 1) {
curComponent.value.checkedFieldsMapEnd[currentComponentId] = ''
} else {
curComponent.value.checkedFieldsMapEnd[currentComponentId] =
curComponent.value.checkedFieldsMapArr[currentComponentId].length === 2
? curComponent.value.checkedFieldsMapArr[currentComponentId].find(
ele => ele !== currentParameterId
)
: currentParameterId
}
}
if (timeParameterType.value === 2) {
curComponent.value.checkedFieldsMapArr[currentComponentId] = [
...new Set([
...curComponent.value.checkedFieldsMapArr[currentComponentId],
currentParameterId
])
]
curComponent.value.checkedFieldsMapEnd[currentComponentId] = currentParameterId
if (curComponent.value.checkedFieldsMapArr[currentComponentId].length === 1) {
curComponent.value.checkedFieldsMapStart[currentComponentId] = ''
} else {
curComponent.value.checkedFieldsMapStart[currentComponentId] =
curComponent.value.checkedFieldsMapArr[currentComponentId].length === 2
? curComponent.value.checkedFieldsMapArr[currentComponentId].find(
ele => ele !== currentParameterId
)
: currentParameterId
}
}
curComponent.value.displayType = curComponent.value.checkedFieldsMapArr[currentComponentId].length
? '7'
: '1'
setParametersTimeType(currentComponentId)
setTypeChange()
timeDialogShow.value = false
}
const setTreeDefault = () => {
if (curComponent.value.displayType !== '9' || relationshipChartIndex.value !== 0) return
if (!!curComponent.value.checkedFields.length) {
let tableId = ''
fields.value.forEach(ele => {
if (
curComponent.value.checkedFields.includes(ele.componentId) &&
curComponent.value.checkedFieldsMap[ele.componentId] &&
!tableId
) {
tableId = datasetFieldList.value.find(itx => itx.id === ele.componentId)?.tableId
}
})
if (tableId && !curComponent.value.treeDatasetId) {
curComponent.value.treeDatasetId = tableId
getOptions(curComponent.value.treeDatasetId, curComponent.value)
}
}
}
const setTreeDefaultBatch = ele => {
if (!!ele.checkedFields.length) {
let tableId = ''
fields.value.forEach(ele => {
if (
ele.checkedFields.includes(ele.componentId) &&
ele.checkedFieldsMap[ele.componentId] &&
!tableId
) {
tableId = datasetFieldList.value.find(itx => itx.id === ele.componentId)?.tableId
}
})
if (tableId && !ele.treeDatasetId) {
ele.treeDatasetId = tableId
}
}
}
const numTypeChange = () => {
if (!curComponent.value.checkedFieldsMapArrNum[currentComponentId]) {
curComponent.value.checkedFieldsMapArrNum[currentComponentId] = []
}
if (numParameterType.value === 0) {
curComponent.value.checkedFieldsMap[currentComponentId] = currentParameterId
curComponent.value.checkedFieldsMapArrNum[currentComponentId] = []
curComponent.value.checkedFieldsMapStartNum[currentComponentId] = ''
curComponent.value.checkedFieldsMapEndNum[currentComponentId] = ''
}
if (numParameterType.value === 1) {
curComponent.value.checkedFieldsMapStartNum[currentComponentId] = currentParameterId
curComponent.value.checkedFieldsMapArrNum[currentComponentId] = [
...new Set([
...curComponent.value.checkedFieldsMapArrNum[currentComponentId],
currentParameterId
])
]
if (curComponent.value.checkedFieldsMapArrNum[currentComponentId].length === 1) {
curComponent.value.checkedFieldsMapEndNum[currentComponentId] = ''
} else {
curComponent.value.checkedFieldsMapEndNum[currentComponentId] =
curComponent.value.checkedFieldsMapArrNum[currentComponentId].length === 2
? curComponent.value.checkedFieldsMapArrNum[currentComponentId].find(
ele => ele !== currentParameterId
)
: currentParameterId
}
}
if (numParameterType.value === 2) {
curComponent.value.checkedFieldsMapArrNum[currentComponentId] = [
...new Set([
...curComponent.value.checkedFieldsMapArrNum[currentComponentId],
currentParameterId
])
]
curComponent.value.checkedFieldsMapEndNum[currentComponentId] = currentParameterId
if (curComponent.value.checkedFieldsMapArrNum[currentComponentId].length === 1) {
curComponent.value.checkedFieldsMapStartNum[currentComponentId] = ''
} else {
curComponent.value.checkedFieldsMapStartNum[currentComponentId] =
curComponent.value.checkedFieldsMapArrNum[currentComponentId].length === 2
? curComponent.value.checkedFieldsMapArrNum[currentComponentId].find(
ele => ele !== currentParameterId
)
: currentParameterId
}
}
curComponent.value.displayType = curComponent.value.checkedFieldsMapArrNum[currentComponentId]
.length
? '22'
: '2'
setParametersNumType(currentComponentId)
setTypeChange()
numDialogShow.value = false
}
const setParametersNumType = componentId => {
curComponent.value.parametersArr[componentId] = duplicateRemoval(
unref(fields)
.filter(ele => ele.componentId === componentId)
.map(ele => Object.values(ele?.fields || {}).flat())
.flat()
.filter(
ele =>
[
curComponent.value.checkedFieldsMapEndNum[componentId],
curComponent.value.checkedFieldsMapStartNum[componentId]
]
.filter(ele => !!ele)
.includes(ele.id) && !!ele.variableName
)
)
}
const setParametersTimeType = componentId => {
curComponent.value.parametersArr[componentId] = duplicateRemoval(
unref(fields)
.filter(ele => ele.componentId === componentId)
.map(ele => Object.values(ele?.fields || {}).flat())
.flat()
.filter(
ele =>
[
curComponent.value.checkedFieldsMapEnd[componentId],
curComponent.value.checkedFieldsMapStart[componentId]
]
.filter(ele => !!ele)
.includes(ele.id) && !!ele.variableName
)
)
if (!curComponent.value.parametersArr[componentId].length) return
const [v1, v2] = curComponent.value.parametersArr[componentId][0].type
curComponent.value.timeGranularityMultiple = typeTimeMap[v2 || v1]
? `${typeTimeMap[v2 || v1]}range`
: ''
curComponent.value.timeGranularity = typeTimeMap[v2 || v1]
}
const numClick = (componentId, timeVal) => {
numParameterType.value =
timeVal.id === curComponent.value.checkedFieldsMapStartNum[componentId]
? 1
: timeVal.id === curComponent.value.checkedFieldsMapEndNum[componentId]
? 2
: 0
currentComponentId = componentId
currentParameterId = timeVal.id
numName.value = timeVal.variableName
numDialogShow.value = true
}
const timeClick = (componentId, timeVal) => {
timeParameterType.value =
timeVal.id === curComponent.value.checkedFieldsMapStart[componentId]
? 1
: timeVal.id === curComponent.value.checkedFieldsMapEnd[componentId]
? 2
: 0
currentComponentId = componentId
currentParameterId = timeVal.id
timeName.value = timeVal.variableName
timeDialogShow.value = true
}
const duplicateRemoval = arr => {
const objList = []
let idList = arr.map(ele => ele.id)
for (let index = 0; index < arr.length; index++) {
const element = arr[index]
if (idList.includes(element.id)) {
objList.push(element)
idList = idList.filter(ele => ele !== element.id)
}
}
return objList
}
const setParameters = field => {
const fieldArr = Object.values(curComponent.value.checkedFieldsMap).filter(ele => !!ele)
curComponent.value.parameters = duplicateRemoval(
Object.values(field?.fields || {})
.flat()
.filter(ele => fieldArr.includes(ele.id) && !!ele.variableName)
.concat(curComponent.value.parameters.filter(ele => fieldArr.includes(ele.id)))
)
fields.value.forEach(ele => {
if (
ele.id === field.id &&
curComponent.value.checkedFields?.includes(ele.componentId) &&
!curComponent.value.checkedFieldsMap[ele.componentId]
) {
ele.activelist = field.activelist
curComponent.value.checkedFieldsMap[ele.componentId] =
curComponent.value.checkedFieldsMap[field.componentId]
}
})
const notChangeType =
curComponent.value.checkedFields.some(ele => {
return (
curComponent.value.checkedFieldsMapStart[ele] || curComponent.value.checkedFieldsMapEnd[ele]
)
}) && +curComponent.value.displayType === 7
nextTick(() => {
if (isTimeParameter.value && !notChangeType) {
const timeParameter = curComponent.value.parameters.find(ele => ele.deType === 1)
curComponent.value.timeGranularity =
typeTimeMap[timeParameter.type[1] || timeParameter.type[0]]
curComponent.value.displayType = '1'
}
if (!!curComponent.value.parameters.length) {
curComponent.value.conditionType = 0
if (curComponent.value.optionValueSource === 0) {
curComponent.value.optionValueSource = 1
}
}
if (curComponent.value.displayType === '22') {
const isNumParameter = curComponent.value.checkedFields.some(ele => {
return curComponent.value.parameters?.some(
itx => [2, 3].includes(itx.deType) && curComponent.value.checkedFieldsMap[ele] === itx.id
)
})
const isSingle = curComponent.value.checkedFields.every(id => {
return !curComponent.value.checkedFieldsMapArr?.[id]?.length
})
if (isSingle && isNumParameter) {
curComponent.value.displayType = '2'
}
}
setTypeChange()
})
if (notChangeType) return
setType()
setTreeDefault()
setRelationBack()
}
const setType = () => {
if (curComponent.value.checkedFields?.length) {
const [id] = curComponent.value.checkedFields
const arr = fields.value.find(ele => ele.componentId === id)
const checkId = curComponent.value.checkedFieldsMap?.[id]
const field = Object.values(arr?.fields || {})
.flat()
.find(ele => checkId === ele.id)
if (field?.deType !== undefined) {
let displayType = curComponent.value.displayType
if (['22'].includes(curComponent.value.displayType) && [2, 3].includes(field?.deType)) {
return
}
if (['9'].includes(curComponent.value.displayType)) {
return
}
if (!(field?.deType === 1 && curComponent.value.displayType === '7')) {
curComponent.value.displayType = `${[3, 4].includes(field?.deType) ? 2 : field?.deType}`
}
if (field?.deType === 7) {
curComponent.value.displayType = '0'
}
if (
+displayType !== +curComponent.value.displayType &&
!([3, 4].includes(+displayType) && +curComponent.value.displayType === 2)
) {
setTypeChange()
}
}
}
if (
curComponent.value.checkedFields.some(ele => {
return (
curComponent.value.checkedFieldsMapStart[ele] || curComponent.value.checkedFieldsMapEnd[ele]
)
}) &&
+curComponent.value.displayType === 1
) {
curComponent.value.displayType = '7'
}
}
let oldDisplayType
const handleSetTypeChange = () => {
let displayType = curComponent.value.displayType
if (oldDisplayType === '9' && ['0', '8'].includes(displayType)) {
curComponent.value.displayType = '9'
ElMessageBox.confirm(t('common.changing_the_display'), {
confirmButtonType: 'primary',
type: 'warning',
cancelButtonText: t('common.cancel'),
autofocus: false,
showClose: false
}).then(() => {
curComponent.value.displayType = displayType
setTypeChange()
})
} else {
setTypeChange()
}
}
const setTypeChange = () => {
handleDialogClick()
nextTick(() => {
curComponent.value.field.id = ''
defaultConfigurationRef.value?.displayTypeChange?.()
if (
+curComponent.value.displayType === 7 &&
['yearrange', 'monthrange', 'daterange', 'datetimerange'].includes(
curComponent.value.timeGranularity
)
) {
curComponent.value.timeGranularityMultiple = curComponent.value.timeGranularity
}
setTreeDefault()
setRelationBack()
if (curComponent.value.displayType === '0' && curComponent.value.treeFieldList?.length) {
curComponent.value.treeFieldList = []
curComponent.value.treeCheckedList = []
}
oldDisplayType = curComponent.value.displayType
})
}
const isTimeParameter = computed(() => {
return curComponent.value.checkedFields.some(ele => {
return curComponent.value.parameters?.some(
itx =>
itx.deType === 1 &&
!!itx.variableName &&
curComponent.value.checkedFieldsMap[ele] === itx.id
)
})
})
const isNumParameter = computed(() => {
return curComponent.value.parameters?.some(
ele => [2, 3].includes(ele.deType) && !!ele.variableName
)
})
const notNumRange = computed(() => {
return curComponent.value.checkedFields.some(ele => {
return curComponent.value.checkedFieldsMapArrNum[ele]?.length > 0
})
})
const canNotNumRange = computed(() => {
if (
curComponent.value.checkedFields.every(id => {
return curComponent.value.checkedFieldsMapArrNum?.[id]?.length > 0
})
) {
return false
} else {
return curComponent.value.checkedFields.some(ele => {
return curComponent.value.parameters?.some(
itx => [2, 3].includes(itx.deType) && curComponent.value.checkedFieldsMap[ele] === itx.id
)
})
}
})
const notTimeRange = computed(() => {
return curComponent.value.checkedFields.some(ele => {
return curComponent.value.checkedFieldsMapArr[ele]?.length > 0
})
})
const notTimeRangeType = computed(() => {
const fieldsArr = unref(fields)
.map(ele => Object.values(ele?.fields || {}).flat())
.flat()
const field = Object.values(curComponent.value.checkedFieldsMapArr || {}).flat()
const obj = fieldsArr.find(ele => ele.id === field[0])
return obj?.type || []
})
const timeList = [
{
label: t('dynamic_time.year'),
value: 'year'
},
{
label: t('chart.y_M'),
value: 'month'
},
{
label: t('chart.y_M_d'),
value: 'date'
},
{
label: t('chart.y_M_d_H_m_s'),
value: 'datetime'
}
]
const typeTimeMap = {
'DATETIME-YEAR': 'year',
'YYYY-MM': 'month',
'YYYY/MM': 'month',
'YYYY-MM-DD': 'date',
'YYYY/MM/DD': 'date',
'YYYY-MM-DD HH:mm:ss': 'datetime',
'YYYY/MM/DD HH:mm:ss': 'datetime'
}
const timeParameterList = computed(() => {
if (!isTimeParameter.value) return timeList
const [year, y] = curComponent.value.parameters?.filter(
ele => ele.deType === 1 && !!ele.variableName
)[0].type
let stopPush = false
return timeList.reduce((pre, ele) => {
if (ele.value === (typeTimeMap[y] || typeTimeMap[year])) {
stopPush = true
pre.push(ele)
} else if (!stopPush) {
pre.push(ele)
}
return pre
}, [])
})
const cancelClick = () => {
handleDialogClick()
dialogVisible.value = false
}
const initDataset = () => {
getDatasetTree({}).then(res => {
const result = (res as unknown as Tree[]) || []
if (result[0]?.id === '0') {
sortTypeChange(dfs(result[0].children))
} else {
sortTypeChange(dfs(result))
}
})
}
const sortTypeChange = arr => {
const sortType = wsCache.get('TreeSort-dataset') || 'time_desc'
datasetTree.value = treeSort(arr, sortType)
}
let newDatasetId = ''
let oldDatasetId = ''
const handleCurrentChange = node => {
if (!curComponent.value.dataset?.id) return
let id = `${curComponent.value.dataset?.id}--${curComponent.value.id}`
let isChange = false
for (let i in cascadeArr) {
const [fir, sec] = cascadeArr[i]
if (fir?.datasetId.includes(id) || sec?.datasetId.includes(id)) {
isChange = true
}
}
if (!isChange) return
oldDatasetId = curComponent.value.dataset?.id
newDatasetId = node.id
}
const confirmIdChange = () => {
curComponent.value.dataset.id = newDatasetId
clearCascadeArrDataset(`${oldDatasetId}--${curComponent.value.id}`)
newDatasetId = ''
oldDatasetId = ''
handleDatasetChange()
}
const handleDatasetChange = () => {
if (!!newDatasetId && !!oldDatasetId) {
curComponent.value.dataset.id = oldDatasetId
ElMessageBox.confirm(t('v_query.to_modify_it'), {
confirmButtonType: 'primary',
type: 'warning',
confirmButtonText: t('commons.confirm'),
cancelButtonText: t('commons.cancel'),
autofocus: false,
showClose: false
}).then(() => {
confirmIdChange()
})
return
}
curComponent.value.field.id = ''
curComponent.value.displayId = ''
curComponent.value.sortId = ''
getOptions(curComponent.value.dataset.id, curComponent.value)
}
const handleDatasetTreeChange = () => {
curComponent.value.treeFieldList = []
curComponent.value.treeCheckedList = []
relationshipChartIndex.value = 0
curComponent.value.oldTreeLoad = true
getOptions(curComponent.value.treeDatasetId, curComponent.value)
}
const handleFieldChange = () => {
if (!curComponent.value.defaultValueCheck) return
curComponent.value.defaultValue = curComponent.value.multiple ? [] : undefined
if (!curComponent.value.displayId) {
curComponent.value.displayId = curComponent.value.field.id
}
}
const handleValueSourceChange = () => {
curComponent.value.defaultValue = curComponent.value.multiple ? [] : undefined
multipleChange(curComponent.value.multiple)
if (curComponent.value.optionValueSource === 1 && !curComponent.value.dataset.id) {
let id = ''
let comId = ''
Object.keys(curComponent.value.checkedFieldsMap).forEach(ele => {
if (curComponent.value.checkedFieldsMap[ele]) {
comId = ele
id = curComponent.value.checkedFieldsMap[ele]
}
})
fields.value.forEach(ele => {
if (ele.componentId === comId) {
curComponent.value.dataset.id = ele.id
}
})
curComponent.value.displayId = id
curComponent.value.sortId = id
curComponent.value.field.id = id
getOptions(curComponent.value.dataset.id, curComponent.value)
}
}
const multipleChange = (val: boolean, isMultipleChange = false) => {
if (isMultipleChange) {
curComponent.value.defaultValue = val ? [] : undefined
}
const { defaultValue } = curComponent.value
if (Array.isArray(defaultValue)) {
curComponent.value.selectValue = val ? defaultValue : undefined
} else {
curComponent.value.selectValue = val
? defaultValue !== undefined
? [defaultValue]
: []
: defaultValue
}
curComponent.value.multiple = val
}
const isInRange = (ele, startWindowTime, timeStamp) => {
const {
intervalType,
regularOrTrends,
regularOrTrendsValue,
relativeToCurrent,
timeNum,
relativeToCurrentType,
around,
dynamicWindow,
maximumSingleQuery,
timeNumRange,
relativeToCurrentRange,
relativeToCurrentTypeRange,
aroundRange
} = ele.timeRange || {}
let isDynamicWindowTime = false
const noTime = ele.timeGranularityMultiple.split('time').join('').split('range')[0]
const queryTimeType = noTime === 'date' ? 'day' : (noTime as ManipulateType)
if (startWindowTime && dynamicWindow) {
isDynamicWindowTime =
dayjs(startWindowTime)
.add(maximumSingleQuery, queryTimeType)
.startOf(queryTimeType)
.valueOf() -
1000 <
timeStamp
}
if (intervalType === 'none') {
if (dynamicWindow) return isDynamicWindowTime
return false
}
let startTime
if (relativeToCurrent === 'custom') {
startTime = getAroundStart(relativeToCurrentType, around === 'f' ? 'subtract' : 'add', timeNum)
} else {
switch (relativeToCurrent) {
case 'thisYear':
startTime = getThisStart('year')
break
case 'lastYear':
startTime = getLastStart('year')
break
case 'thisMonth':
startTime = getThisStart('month')
break
case 'lastMonth':
startTime = getLastStart('month')
break
case 'thisQuarter':
startTime = getThisStart('quarter')
break
case 'thisWeek':
startTime = new Date(
dayjs().startOf('week').add(1, 'day').startOf('day').format('YYYY/MM/DD HH:mm:ss')
)
break
case 'today':
startTime = getThisStart('day')
break
case 'yesterday':
startTime = getLastStart('day')
break
case 'monthBeginning':
startTime = getThisStart('month')
break
case 'monthEnd':
startTime = getThisEnd('month')
break
case 'yearBeginning':
startTime = getThisStart('year')
break
default:
break
}
}
const startValue = regularOrTrends === 'fixed' ? regularOrTrendsValue : startTime
if (intervalType === 'start') {
return startWindowTime < +new Date(startValue) || isDynamicWindowTime
}
if (intervalType === 'end') {
return timeStamp > +new Date(startValue) || isDynamicWindowTime
}
if (intervalType === 'timeInterval') {
let endTime
if (relativeToCurrentRange === 'custom') {
startTime =
regularOrTrends === 'fixed'
? new Date(
dayjs(new Date(regularOrTrendsValue[0])).startOf(noTime).format('YYYY/MM/DD HH:mm:ss')
)
: getAroundStart(relativeToCurrentType, around === 'f' ? 'subtract' : 'add', timeNum)
endTime =
regularOrTrends === 'fixed'
? new Date(
dayjs(new Date(regularOrTrendsValue[1])).endOf(noTime).format('YYYY/MM/DD HH:mm:ss')
)
: getAround(
relativeToCurrentTypeRange,
aroundRange === 'f' ? 'subtract' : 'add',
timeNumRange
)
} else {
;[startTime, endTime] = getCustomRange(relativeToCurrentRange)
}
return (
startWindowTime < +new Date(startTime) - 1000 ||
timeStamp > +new Date(endTime) ||
isDynamicWindowTime
)
}
}
const CascadeDialog = defineAsyncComponent(() => import('./QueryCascade.vue'))
const cascadeDialog = ref()
const openCascadeDialog = () => {
const cascadeMap = conditions.value
.filter(ele => {
return (
([0, 2, 5].includes(+ele.displayType) &&
ele.optionValueSource === 1 &&
!!ele.checkedFields?.length &&
!!Object.values(ele.checkedFieldsMap).filter(item => !!item).length) ||
([9].includes(+ele.displayType) && ele.treeFieldList?.length)
)
})
.reduce((pre, next) => {
const isTree = [9].includes(+next.displayType)
const fieldId = isTree ? next.treeFieldList[0].id : next.field.id
const datasetId = isTree ? next.treeFieldList[0].datasetGroupId : next.dataset.id
pre[next.id] = {
datasetId,
isTree,
name: next.name,
queryId: next.id,
fieldId: fieldId,
deType: (datasetMap[next.dataset.id]?.fields?.dimensionList || next.dataset.fields).find(
ele => ele.id === fieldId
)?.deType
}
return pre
}, {})
cascadeDialog.value.init(cascadeMap, cascadeArr)
}
const clearCascadeArrDataset = id => {
for (let i in cascadeArr) {
const [fir, sec] = cascadeArr[i]
if (fir?.datasetId.includes(id)) {
cascadeArr[i] = []
} else if (sec?.datasetId.includes(id)) {
cascadeArr[i] = [fir]
}
}
cascadeArr = cascadeArr.filter(ele => !!ele.length)
}
const indexNumCascade = [
t('visualization.number1'),
t('visualization.number2'),
t('visualization.number3'),
t('visualization.number4'),
t('visualization.number5')
]
const validateConditionType = ({
defaultConditionValueF,
defaultConditionValueS,
conditionType
}) => {
if (conditionType === 0) {
return defaultConditionValueF === ''
} else {
return defaultConditionValueF === '' || defaultConditionValueS === ''
}
}
const setParams = ele => {
const {
defaultConditionValueOperatorF,
defaultConditionValueF,
defaultConditionValueOperatorS,
defaultConditionValueS
} = ele
ele.conditionValueOperatorF = defaultConditionValueOperatorF
ele.conditionValueF = defaultConditionValueF
ele.conditionValueOperatorS = defaultConditionValueOperatorS
ele.conditionValueS = defaultConditionValueS
}
const validate = () => {
return conditions.value.some(ele => {
if (ele.auto) return false
if (!ele.checkedFields?.length || ele.checkedFields.some(itx => !ele.checkedFieldsMap[itx])) {
ElMessage.error(t('v_query.be_linked_first'))
return true
}
if (
ele.displayType === '0' &&
ele.defaultValueCheck &&
((Array.isArray(ele.defaultValue) && !ele.defaultValue.length) || !ele.defaultValue)
) {
if (ele.optionValueSource !== 1) {
ElMessage.error(t('report.filter.title'))
return true
}
if (!ele.defaultValueFirstItem) {
ElMessage.error(t('report.filter.title'))
return true
}
}
if (ele.displayType === '9') {
if (
ele.defaultValueCheck &&
((Array.isArray(ele.defaultValue) && !ele.defaultValue.length) || !ele.defaultValue)
) {
ElMessage.error(t('report.filter.title'))
return true
}
if (!ele.treeDatasetId) {
setTreeDefaultBatch(ele)
if (!ele.treeDatasetId) {
ElMessage.error(t('data_set.dataset_cannot_be'))
}
return true
}
if (!ele.treeFieldList?.length) {
ElMessage.error(t('common.tree_structure'))
return true
}
if (
ele.treeCheckedList
?.slice(0, ele.treeFieldList.length)
.some(
item =>
!item.checkedFields?.length ||
item.checkedFields.some(itx => !item.checkedFieldsMap[itx])
)
) {
ElMessage.error(t('v_query.be_linked_first'))
return true
}
}
if (ele.displayType === '22' && ele.defaultValueCheck) {
ele.numValueEnd = ele.defaultNumValueEnd
ele.numValueStart = ele.defaultNumValueStart
if (
(ele.defaultNumValueEnd !== 0 && !ele.defaultNumValueEnd) ||
(ele.defaultNumValueStart !== 0 && !ele.defaultNumValueStart)
) {
ElMessage.error(t('v_query.cannot_be_empty_de'))
return true
}
if (
!isNaN(ele.defaultNumValueEnd) &&
!isNaN(ele.defaultNumValueStart) &&
ele.defaultNumValueEnd < ele.defaultNumValueStart
) {
ElMessage.error(t('v_query.the_minimum_value'))
return true
}
}
let displayTypeField = null
let errorTips = t('v_query.cannot_be_performed')
let hasParameterNumArrType = 0
if (
ele.checkedFields.some(id => {
if (ele.checkedFieldsMapArrNum?.[id]?.length) {
if (hasParameterNumArrType === 0) {
hasParameterNumArrType = 1
}
if (hasParameterNumArrType === 2) {
return true
}
}
if (
!ele.checkedFieldsMapArrNum?.[id]?.length &&
['22'].includes(ele.displayType) &&
!!ele.parameters.length
) {
if (hasParameterNumArrType === 0) {
hasParameterNumArrType = 2
}
if (hasParameterNumArrType === 1) {
return true
}
}
if (ele.checkedFieldsMapArrNum?.[id]?.length === 1 && ele.displayType === '22') {
errorTips = t('v_query.numerical_parameter_configuration')
return true
}
if (ele.checkedFieldsMapArr?.[id]?.length === 1 && ele.displayType === '7') {
errorTips = t('v_query.and_end_time')
return true
}
const arr = fields.value.find(itx => itx.componentId === id)
const checkId = ele.checkedFieldsMap?.[id]
const field = duplicateRemoval(Object.values(arr?.fields || {}).flat()).find(
itx => checkId === itx.id
)
if (!field) return false
if (displayTypeField === null) {
displayTypeField = field
return false
}
if (displayTypeField?.deType === field?.deType && displayTypeField?.deType === 1) {
if (!Array.isArray(field.type) || !Array.isArray(displayTypeField.type)) {
return false
}
if (!displayTypeField.type?.length && !field.type?.length) {
return false
}
if (displayTypeField.type?.length !== field.type?.length) {
errorTips = t('v_query.format_is_inconsistent')
return true
}
for (let index = 0; index < displayTypeField.type.length; index++) {
if (displayTypeField.type[index] !== field.type[index]) {
errorTips = t('v_query.format_is_inconsistent')
return true
}
}
}
return displayTypeField.deType !== field?.deType
})
) {
ElMessage.error(errorTips)
return true
}
if (ele.required) {
if (ele.displayType === '8') {
setParams(ele)
const result = validateConditionType(ele)
if (result) {
ElMessage.error(t('v_query.cannot_be_empty_de'))
}
return result
}
if (!ele.defaultValueCheck) {
ElMessage.error(t('v_query.cannot_be_empty_de'))
return true
}
if (ele.displayType === '22') {
if (
(ele.defaultNumValueEnd !== 0 && !ele.defaultNumValueEnd) ||
(ele.defaultNumValueStart !== 0 && !ele.defaultNumValueStart)
) {
ElMessage.error(t('v_query.cannot_be_empty_de'))
return true
}
return false
}
if (
(Array.isArray(ele.defaultValue) && !ele.defaultValue.length) ||
(ele.defaultValue !== 0 && !ele.defaultValue)
) {
ElMessage.error(t('v_query.cannot_be_empty_de'))
return true
}
}
if (ele.displayType === '8') {
setParams(ele)
return false
}
if (!ele.defaultValueCheck) {
const isMultiple = +ele.displayType === 7 || ele.multiple
ele.selectValue = isMultiple ? [] : undefined
ele.defaultValue = isMultiple ? [] : undefined
}
if (ele.displayType === '1') {
if (!ele.defaultValueCheck) return false
if (ele.timeType === 'fixed') {
if (!ele.defaultValue) {
ElMessage.error(t('v_query.cannot_be_empty_time'))
return true
}
}
}
if (ele.displayType === '2') {
if (!ele.defaultValueCheck) return false
if (
(Array.isArray(ele.defaultValue) && !ele.defaultValue.length) ||
(!Array.isArray(ele.defaultValue) && ['', undefined, null].includes(ele.defaultValue))
) {
ElMessage.error(t('report.filter.title'))
return true
}
}
if (+ele.displayType === 7) {
if (!ele.defaultValueCheck) return false
if (ele.timeType === 'fixed') {
const [s, e] = ele.defaultValue || []
if (!s || !e) {
ElMessage.error(t('v_query.cannot_be_empty_time'))
return true
}
}
const {
timeNum,
relativeToCurrentType,
around,
relativeToCurrentRange,
timeGranularityMultiple,
arbitraryTime,
timeGranularity,
timeNumRange,
relativeToCurrentTypeRange,
aroundRange,
arbitraryTimeRange,
timeType
} = ele
let startTime =
timeType === 'dynamic'
? getCustomTime(
timeNum,
relativeToCurrentType,
timeGranularity,
around,
arbitraryTime,
timeGranularityMultiple,
'start-config'
)
: new Date(ele.defaultValue[0])
let endTime =
timeType === 'dynamic'
? getCustomTime(
timeNumRange,
relativeToCurrentTypeRange,
timeGranularity,
aroundRange,
arbitraryTimeRange,
timeGranularityMultiple,
'end-config'
)
: new Date(ele.defaultValue[1])
if (!!relativeToCurrentRange && relativeToCurrentRange !== 'custom') {
;[startTime, endTime] = getCustomRange(relativeToCurrentRange)
}
if (+startTime > +endTime) {
ElMessage.error(t('v_query.the_start_time'))
return true
}
if (!ele.setTimeRange) return false
if (
isInRange(
ele,
timeGranularityMultiple.includes('time')
? dayjs(+startTime).startOf('day').valueOf()
: +startTime,
timeGranularityMultiple.includes('time')
? dayjs(+endTime).startOf('day').valueOf()
: +endTime
)
) {
ElMessage.error(t('v_query.range_please_reset'))
return true
}
return false
}
if (
ele.displayType !== '9' &&
ele.optionValueSource === 2 &&
!ele.valueSource?.filter(ele => !!ele).length
) {
ElMessage.error(t('v_query.cannot_be_empty_input'))
return true
}
if (
!['9', '22', '1', '7'].includes(ele.displayType) &&
ele.optionValueSource === 1 &&
!ele.field.id
) {
ElMessage.error(
!ele.dataset?.id ? t('v_query.option_value_field') : t('v_query.the_data_set')
)
return true
}
})
}
const handleBeforeClose = () => {
defaultConfigurationRef.value?.mult()
defaultConfigurationRef.value?.single()
handleDialogClick()
if (curComponent.value) {
curComponent.value.id = ''
}
relationshipChartIndex.value = 0
dialogVisible.value = false
}
const emits = defineEmits(['queryData', 'reRenderAll'])
const confirmClick = () => {
if (validate()) return
defaultConfigurationRef.value?.mult()
defaultConfigurationRef.value?.single()
handleDialogClick()
dialogVisible.value = false
conditions.value.forEach(ele => {
curComponent.value = ele
multipleChange(
['1', '7'].includes(curComponent.value.displayType)
? curComponent.value.displayType === '7'
: curComponent.value.multiple
)
})
const oldArr = cloneDeep(unref(queryElement.value.propValue))
queryElement.value.propValue = []
nextTick(() => {
conditions.value.forEach(itx => {
cascadeArr.forEach(ele => {
ele.forEach(item => {
if (item.datasetId.split('--')[1] === itx.id && itx.defaultValueCheck) {
const val = itx.mapValue
item.selectValue = Array.isArray(val) ? [...val] : val
item.currentSelectValue = Array.isArray(val) ? [...val] : val
}
})
})
})
queryElement.value.cascade = cloneDeep(cascadeArr)
cascadeArr = []
queryElement.value.propValue = cloneDeep(conditions.value)
snapshotStore.recordSnapshotCache('confirmClick')
curComponent.value.id = ''
relationshipChartIndex.value = 0
nextTick(() => {
emits('reRenderAll', oldArr, cloneDeep(unref(conditions)))
emits('queryData')
})
})
}
const fieldsComputed = computed(() => {
return curComponent.value.dataset.fields.filter(ele => {
return (
ele.deType === +curComponent.value.displayType ||
([0, 2, 3, 4].includes(ele.deType) && [0, 2].includes(+curComponent.value.displayType)) ||
(ele.deType === 7 && +curComponent.value.displayType === 0)
)
})
})
const cancelValueSource = () => {
valueSource.value = cloneDeep(curComponent.value.valueSource)
if (!valueSource.value.length) {
valueSource.value.push('')
}
manual.value.hide()
}
const confirmValueSource = () => {
if (
valueSource.value.some(ele => {
if (typeof ele === 'string') {
return !ele.trim()
}
return false
})
) {
ElMessage.error(t('v_query.cannot_be_empty_input'))
return
}
curComponent.value.valueSource = cloneDeep(
valueSource.value.filter(ele => {
if (typeof ele === 'string') {
return ele.trim()
}
return true
})
)
handleValueSourceChange()
cancelValueSource()
}
const setCondition = (queryId: string) => {
conditions.value = (cloneDeep(props.queryElement.propValue) || []).map(ele =>
parameterCompletion(ele)
)
init(queryId)
}
const setConditionOut = () => {
conditions.value = (cloneDeep(props.queryElement.propValue) || []).map(ele =>
parameterCompletion(ele)
)
addQueryCriteria()
init(conditions.value[conditions.value.length - 1].id)
}
const setActiveSelectTab = (arr, id) => {
let activelist = 'dimensionList'
arr.some((ele, index) => {
if ((ele || []).some(itx => itx.id === id)) {
activelist = ['dimensionList', 'quotaList', 'parameterList'][index]
return true
}
return false
})
return activelist
}
const init = (queryId: string) => {
initDataset()
relationshipChartIndex.value = 0
renameInput.value = []
handleCondition({ id: queryId })
cascadeArr = cloneDeep(queryElement.value.cascade || [])
dialogVisible.value = true
const datasetFieldIdList = datasetFieldList.value.map(ele => ele.tableId)
for (const i in datasetMap) {
if (!datasetFieldIdList.includes(i)) {
delete datasetMap[i]
}
}
const datasetMapKeyList = Object.keys(datasetMap)
if (datasetFieldIdList.every(ele => datasetMapKeyList.includes(ele))) {
fields.value = datasetFieldList.value
.map(ele => {
if (!datasetMap[ele.tableId]) return null
return { ...datasetMap[ele.tableId], componentId: ele.id }
})
.filter(ele => !!ele)
}
const params = [...new Set(datasetFieldList.value.map(ele => ele.tableId).filter(ele => !!ele))]
if (!params.length) return
Promise.all([getDsDetailsWithPerm(params), getSqlParams(params)])
.then(([dq, p]) => {
dq.filter(ele => !!ele).forEach(ele => {
ele.activelist = 'dimensionList'
ele.fields.parameterList = p.filter(
itx => itx.datasetGroupId === ele.id && !itx.params?.length
)
ele.hasParameter = !!ele.fields.parameterList.length
ele.fields.dimensionList = (ele.fields.dimensionList || []).filter(
itx => !itx.params?.length
)
ele.fields.quotaList = (ele.fields.quotaList || []).filter(itx => !itx.params?.length)
datasetMap[ele.id] = ele
})
fields.value = datasetFieldList.value
.map(ele => {
if (!datasetMap[ele.tableId]) return null
const activeCom = datasetMap[ele.tableId].fields || {}
const activelist = setActiveSelectTab(
[activeCom.dimensionList, activeCom.quotaList, activeCom.parameterList],
curComponent.value.checkedFieldsMap[ele.id]
)
return { ...datasetMap[ele.tableId], componentId: ele.id, activelist }
})
.filter(ele => !!ele)
})
.finally(() => {
if (!curComponent.value.treeDatasetId) {
nextTick(() => {
setTreeDefault()
})
}
handleCheckedFieldsChange(curComponent.value.checkedFields)
})
}
const weightlessness = () => {
valueSource.value = Array.from(new Set(valueSource.value))
}
const parameterCompletion = ele => {
const attributes = {
timeType: 'fixed',
hideConditionSwitching: false,
required: false,
defaultMapValue: [],
mapValue: [],
parametersStart: null,
conditionType: 0,
conditionValueOperatorF: 'eq',
conditionValueF: '',
conditionValueOperatorS: 'like',
conditionValueS: '',
resultMode: 0,
defaultConditionValueOperatorF: 'eq',
defaultConditionValueF: '',
defaultConditionValueOperatorS: 'like',
defaultConditionValueS: '',
parametersEnd: null,
relativeToCurrent: 'custom',
timeNum: 0,
relativeToCurrentRange: 'custom',
relativeToCurrentType: 'year',
around: 'f',
arbitraryTime: new Date(),
timeNumRange: 0,
relativeToCurrentTypeRange: 'year',
aroundRange: 'f',
treeDatasetId: '',
displayId: '',
sortId: '',
sort: 'asc',
arbitraryTimeRange: new Date(),
setTimeRange: false,
showEmpty: false,
defaultNumValueStart: null,
defaultNumValueEnd: null,
numValueEnd: null,
numValueStart: null,
displayFormat: 0,
timeRange: {
intervalType: 'none',
dynamicWindow: false,
maximumSingleQuery: 0,
regularOrTrends: 'fixed',
regularOrTrendsValue: '',
relativeToCurrent: 'custom',
timeNum: 0,
relativeToCurrentType: 'year',
around: 'f',
timeNumRange: 0,
relativeToCurrentTypeRange: 'year',
aroundRange: 'f'
},
oldTreeLoad: false,
treeCheckedList: [],
defaultValueFirstItem: false,
treeFieldList: []
}
Object.entries(attributes).forEach(([key, val]) => {
ele[key] ?? (ele[key] = val)
})
if (!ele.treeDatasetId) {
ele.treeDatasetId = ele.dataset.id
}
if (!ele.timeRange.relativeToCurrentRange) {
ele.timeRange.relativeToCurrentRange = 'custom'
}
return ele
}
const handleCondition = (item, idx = 0) => {
handleDialogClick()
if (activeConditionForRename.id) return
activeCondition.value = item.id
const obj = conditions.value.find(ele => ele.id === item.id)
if (!obj.checkedFieldsMapArr) {
obj.checkedFieldsMapArr = {}
obj.checkedFieldsMapArrNum = {}
obj.checkedFieldsMapStart = {}
obj.checkedFieldsMapStartNum = {}
obj.checkedFieldsMapEnd = {}
obj.checkedFieldsMapEndNum = {}
obj.parametersArr = {}
}
curComponent.value = obj
curComponent.value.dataset.fields = []
nextTick(() => {
defaultConfigurationRef.value.changeMultiple(curComponent.value.multiple)
})
if (curComponent.value.dataset.id) {
listFieldsWithPermissions(curComponent.value.dataset.id).then(res => {
curComponent.value.dataset.fields = res.data
})
}
if (!curComponent.value.checkedFieldsMapStart) {
curComponent.value.checkedFieldsMapStart = {}
}
if (!curComponent.value.checkedFieldsMapStartNum) {
curComponent.value.checkedFieldsMapStartNum = {}
}
if (!curComponent.value.checkedFieldsMapEnd) {
curComponent.value.checkedFieldsMapEnd = {}
}
if (!curComponent.value.checkedFieldsMapEndNum) {
curComponent.value.checkedFieldsMapEndNum = {}
}
if (!curComponent.value.checkedFieldsMapArr) {
curComponent.value.checkedFieldsMapArr = {}
}
if (!curComponent.value.checkedFieldsMapArrNum) {
curComponent.value.checkedFieldsMapArrNum = {}
}
if (!curComponent.value.parametersArr) {
curComponent.value.parametersArr = {}
}
datasetFieldList.value.forEach(ele => {
if (!curComponent.value.checkedFieldsMap[ele.id]) {
curComponent.value.checkedFieldsMap[ele.id] = ''
}
if (!curComponent.value.checkedFieldsMapStart[ele.id]) {
curComponent.value.checkedFieldsMapStart[ele.id] = ''
}
if (!curComponent.value.checkedFieldsMapStartNum[ele.id]) {
curComponent.value.checkedFieldsMapStartNum[ele.id] = ''
}
if (!curComponent.value.checkedFieldsMapEnd[ele.id]) {
curComponent.value.checkedFieldsMapEnd[ele.id] = ''
}
if (!curComponent.value.checkedFieldsMapEndNum[ele.id]) {
curComponent.value.checkedFieldsMapEndNum[ele.id] = ''
}
if (!curComponent.value.checkedFieldsMapArr[ele.id]) {
curComponent.value.checkedFieldsMapArr[ele.id] = []
}
if (!curComponent.value.checkedFieldsMapArrNum[ele.id]) {
curComponent.value.checkedFieldsMapArrNum[ele.id] = []
}
if (!curComponent.value.parametersArr[ele.id]) {
curComponent.value.parametersArr[ele.id] = []
}
})
const idMap = datasetFieldList.value.map(ele => ele.id)
curComponent.value.checkedFields = curComponent.value.checkedFields.filter(ele =>
idMap.includes(ele)
)
if (!!fields.value?.length) {
fields.value.forEach(ele => {
const activeCom = ele.fields
ele.activelist = setActiveSelectTab(
[activeCom.dimensionList, activeCom.quotaList, activeCom.parameterList],
curComponent.value.checkedFieldsMap[ele.componentId]
)
})
handleCheckedFieldsChange(curComponent.value.checkedFields)
}
multipleChange(curComponent.value.multiple)
valueSource.value = cloneDeep(curComponent.value.valueSource)
if (!valueSource.value.length) {
valueSource.value.push('')
}
nextTick(() => {
if (curComponent.value.displayType === '9') {
oldDisplayType = '9'
handleRelationshipChart(idx, true)
if (!curComponent.value.treeDatasetId && fields.value?.length) {
nextTick(() => {
setTreeDefault()
})
} else if (curComponent.value.treeDatasetId) {
getOptions(curComponent.value.treeDatasetId, curComponent.value)
}
}
curComponent.value.showError = showError.value
curComponent.value.auto && (document.querySelector('.chart-field').scrollTop = 0)
})
}
const getOptions = (id, component) => {
listFieldsWithPermissions(id).then(res => {
component.dataset.fields = res.data
})
}
const handleSortChange = () => {
handleFieldChange()
curComponent.value.sortList = []
if (sortComputed.value) {
curComponent.value.sort = ''
}
}
const resetSort = () => {
if (sortComputed.value) {
curComponent.value.sort = ''
}
if (!curComponent.value.defaultValueCheck) return
curComponent.value.defaultValue = curComponent.value.multiple ? [] : undefined
}
const customSortFilterRef = ref()
const sortSave = list => {
curComponent.value.sortList = cloneDeep(list)
}
const handleCustomClick = async () => {
if (sortComputed.value || curComponent.value.sort !== 'customSort') return
let list = cloneDeep(curComponent.value.sortList || [])
if (!list.length) {
const arr = await enumValueObj({ queryId: curComponent.value.sortId, searchText: '' })
list = arr.map(ele => ele[curComponent.value.sortId])
}
customSortFilterRef.value.sortInit([...new Set(list)])
}
const sortComputed = computed(() => {
const { sortId, displayId } = curComponent.value
return sortId && displayId && sortId !== displayId
})
const treeDialog = ref()
const startTreeDesign = () => {
treeDialog.value.init(
curComponent.value.dataset.fields.filter(ele => ele.groupType === 'd' && ele.deType === 0),
curComponent.value.treeFieldList
)
}
const saveTree = arr => {
curComponent.value.treeFieldList = arr
setSameField()
}
const setSameField = () => {
curComponent.value.treeFieldList.forEach((ele, index) => {
if (!curComponent.value.treeCheckedList[index]) {
curComponent.value.treeCheckedList = [
...curComponent.value.treeCheckedList,
{
checkedFields: [...curComponent.value.checkedFields],
checkedFieldsMap: cloneDeep(curComponent.value.checkedFieldsMap)
}
]
}
fields.value.forEach(item => {
const ids = item.fields.dimensionList.map(itx => itx.id)
if (ids.includes(ele.id)) {
curComponent.value.treeCheckedList[index].checkedFieldsMap[item.componentId] = ele.id
}
})
})
curComponent.value.checkedFields =
curComponent.value.treeCheckedList[relationshipChartIndex.value].checkedFields
curComponent.value.checkedFieldsMap =
curComponent.value.treeCheckedList[relationshipChartIndex.value].checkedFieldsMap
}
const showError = computed(() => {
if (!curComponent.value) return false
const {
optionValueSource,
checkedFieldsMap,
checkedFields,
field,
valueSource,
displayType,
treeCheckedList,
treeFieldList
} = curComponent.value
const arr = checkedFields.filter(ele => !!checkedFieldsMap[ele])
if (!checkedFields.length || !arr.length) {
return true
}
if (9 === +displayType) {
for (const key in treeCheckedList) {
if (key > treeFieldList.length) continue
const treeArr = treeCheckedList[key].checkedFields.filter(
ele => !!treeCheckedList[key].checkedFieldsMap[ele]
)
if (!treeCheckedList[key].checkedFields.length || !treeArr.length) {
return true
}
}
}
if ([1, 7, 8, 22, 9].includes(+displayType)) {
return false
}
return (optionValueSource === 1 && !field.id) || (optionValueSource === 2 && !valueSource.length)
})
const handleDialogClick = () => {
defaultConfigurationRef.value?.handleDialogClick()
}
const relativeToCurrentList = computed(() => {
let list = []
if (!curComponent.value) return list
switch (curComponent.value.timeGranularity) {
case 'year':
list = [
{
label: t('dynamic_year.current'),
value: 'thisYear'
},
{
label: t('dynamic_year.last'),
value: 'lastYear'
}
]
break
case 'month':
list = [
{
label: t('cron.this_month'),
value: 'thisMonth'
},
{
label: t('dynamic_month.last'),
value: 'lastMonth'
}
]
break
case 'date':
list = [
{
label: t('dynamic_time.today'),
value: 'today'
},
{
label: t('dynamic_time.yesterday'),
value: 'yesterday'
},
{
label: t('dynamic_time.firstOfMonth'),
value: 'monthBeginning'
},
{
label: t('dynamic_time.endOfMonth'),
value: 'monthEnd'
},
{
label: t('dynamic_time.firstOfYear'),
value: 'yearBeginning'
}
]
break
case 'datetime':
list = [
{
label: t('dynamic_time.today'),
value: 'today'
},
{
label: t('dynamic_time.yesterday'),
value: 'yesterday'
},
{
label: t('dynamic_time.firstOfMonth'),
value: 'monthBeginning'
},
{
label: t('dynamic_time.endOfMonth'),
value: 'monthEnd'
},
{
label: t('dynamic_time.firstOfYear'),
value: 'yearBeginning'
}
]
break
default:
break
}
return [
...list,
{
label: t('dynamic_time.custom'),
value: 'custom'
}
]
})
const relativeToCurrentListRange = computed(() => {
let list = []
if (!curComponent.value) return list
switch (curComponent.value.timeGranularityMultiple) {
case 'yearrange':
list = [
{
label: t('dynamic_year.current'),
value: 'thisYear'
},
{
label: t('dynamic_year.last'),
value: 'lastYear'
}
]
break
case 'monthrange':
list = [
{
label: t('cron.this_month'),
value: 'thisMonth'
},
{
label: t('dynamic_month.last'),
value: 'lastMonth'
},
{
label: t('v_query.last_3_months'),
value: 'LastThreeMonths'
},
{
label: t('v_query.last_6_months'),
value: 'LastSixMonths'
},
{
label: t('v_query.last_12_months'),
value: 'LastTwelveMonths'
},
{
label: t('common.to_this_month'),
value: 'YearToThisMonth'
},
{
label: t('v_query.year_to_last_month_end'),
value: 'YearToLastMonthEnd'
}
]
break
case 'daterange':
case 'datetimerange':
list = [
{
label: t('dynamic_time.today'),
value: 'today'
},
{
label: t('dynamic_time.yesterday'),
value: 'yesterday'
},
{
label: t('v_query.last_3_days'),
value: 'LastThreeDays'
},
{
label: t('v_query.month_to_date'),
value: 'monthBeginning'
},
{
label: t('v_query.year_to_date'),
value: 'yearBeginning'
},
{
label: t('v_query.year_to_last_month_end'),
value: 'YearToLastMonthEnd'
},
{
label: t('common.month_to_yesterday'),
value: 'monthToYesterday'
}
]
break
default:
break
}
return [
...list,
{
label: t('dynamic_time.custom'),
value: 'custom'
}
]
})
const timeGranularityChange = (val: string) => {
curComponent.value.relativeToCurrentType = ['date', 'datetime'].includes(val) ? 'date' : val
if (curComponent.value.relativeToCurrent !== 'custom') {
curComponent.value.relativeToCurrent = relativeToCurrentList.value[0]?.value
}
}
const handleTimeTypeChange = () => {
if (curComponent.value.displayType === '1') {
timeGranularityChange(curComponent.value.timeGranularity)
} else {
timeGranularityMultipleChange(curComponent.value.timeGranularityMultiple)
}
}
const timeGranularityMultipleChange = (val: string) => {
handleDialogClick()
curComponent.value.relativeToCurrentType = ['daterange', 'datetimerange'].includes(val)
? 'date'
: val.split('range')[0]
curComponent.value.relativeToCurrentTypeRange = curComponent.value.relativeToCurrentType
if (curComponent.value.relativeToCurrentRange !== 'custom') {
curComponent.value.relativeToCurrentRange = relativeToCurrentListRange.value[0]?.value
}
if (curComponent.value.timeRange) return
curComponent.value.timeRange = {
intervalType: 'none',
dynamicWindow: false,
maximumSingleQuery: 0,
regularOrTrends: 'fixed',
regularOrTrendsValue: '',
relativeToCurrent: 'custom',
relativeToCurrentRange: 'custom',
timeNum: 0,
relativeToCurrentType: curComponent.value.relativeToCurrentRange,
around: 'f',
timeNumRange: 0,
relativeToCurrentTypeRange: curComponent.value.relativeToCurrentRange,
aroundRange: 'f'
}
}
watch(
() => showError.value,
val => {
if (!curComponent.value) return
curComponent.value.showError = val
}
)
const setRenameInput = val => {
renameInput.value.push(val)
}
const relationshipChartIndex = ref(0)
const notCurrentEle = (ele, index) => {
if (activeCondition.value !== ele.id) {
handleCondition(ele, index)
} else {
handleRelationshipChart(index)
}
}
const setRelationBack = () => {
curComponent.value.treeCheckedList[relationshipChartIndex.value] = {
checkedFields: [...curComponent.value.checkedFields],
checkedFieldsMap: cloneDeep(curComponent.value.checkedFieldsMap)
}
}
const handleRelationshipChart = (index, initShip = false) => {
if (curComponent.value.treeCheckedList?.length && !initShip) {
curComponent.value.treeCheckedList[relationshipChartIndex.value] = {
checkedFields: [...curComponent.value.checkedFields],
checkedFieldsMap: cloneDeep(curComponent.value.checkedFieldsMap)
}
}
relationshipChartIndex.value = index
if (!curComponent.value?.treeCheckedList?.length && !curComponent.value.oldTreeLoad) {
curComponent.value.treeCheckedList = curComponent.value.treeFieldList.map(ele => {
return {
checkedFields: [...curComponent.value.checkedFields],
checkedFieldsMap: curComponent.value.checkedFields.reduce((pre, next) => {
pre[next] = ele.id
return pre
}, {})
}
})
} else if (!curComponent.value?.treeCheckedList?.length && curComponent.value.oldTreeLoad) {
curComponent.value.treeCheckedList = curComponent.value.treeFieldList.map(() => {
return {
checkedFields: [...curComponent.value.checkedFields],
checkedFieldsMap: cloneDeep(curComponent.value.checkedFieldsMap)
}
})
}
if (!curComponent.value?.treeCheckedList[index]) return
const { checkedFields, checkedFieldsMap } = curComponent.value?.treeCheckedList[index]
curComponent.value.checkedFields = checkedFields
curComponent.value.checkedFieldsMap = checkedFieldsMap
const checkedCount = checkedFields?.length
checkAll.value = checkedCount === fields.value?.length
isIndeterminate.value = checkedCount > 0 && checkedCount < fields.value?.length
}
const addOperation = (cmd, condition, index) => {
switch (cmd) {
case 'del':
renameInput.value = []
conditions.value.splice(index, 1)
curComponent.value = null
break
case 'rename':
renameInput.value = []
Object.assign(activeConditionForRename, condition)
setTimeout(() => {
nextTick(() => {
renameInput.value[0].focus()
})
}, 400)
break
default:
break
}
}
const dsSelectProps = {
label: 'name',
children: 'children',
value: 'id',
isLeaf: node => !node.children?.length
}
const dfs = arr => {
return (arr || []).filter(ele => {
if (!!ele.children?.length && !ele.leaf) {
ele.children = dfs(ele.children) || []
return !!ele.children?.length
}
return ele.leaf
})
}
const renameInputBlur = () => {
if (activeConditionForRename.name.trim() === '') {
ElMessage.error(t('v_query.cannot_be_empty_name'))
renameInput.value[0]?.focus()
return
}
conditions.value.some(ele => {
if (activeConditionForRename.id === ele.id) {
ele.name = activeConditionForRename.name
return true
}
return false
})
activeConditionForRename.id = ''
}
const addQueryCriteria = () => {
relationshipChartIndex.value = 0
conditions.value.push(parameterCompletion(addQueryCriteriaConfig()))
}
const addQueryCriteriaAndSelect = () => {
addQueryCriteria()
handleCondition(conditions.value[conditions.value.length - 1])
}
const addCriteriaConfig = () => {
addQueryCriteria()
return conditions.value[conditions.value.length - 1].id
}
defineExpose({
setCondition,
addCriteriaConfig,
setConditionOut
})
</script>
<template>
<el-dialog
class="query-condition-configuration"
v-model="dialogVisible"
width="1200px"
:title="t('v_query.query_condition_setting')"
@click.stop
:before-close="handleBeforeClose"
@mousedown.stop
@mousedup.stop
>
<div class="container" @click="handleDialogClick">
<div class="query-condition-list">
<div class="title">
{{ t('v_query.query_condition') }}
<el-icon @click="addQueryCriteriaAndSelect">
<Icon name="icon_add_outlined"><icon_add_outlined class="svg-icon" /></Icon>
</el-icon>
</div>
<draggable tag="div" :list="conditions" handle=".handle">
<template #item="{ element, index }">
<div
:key="element.id"
@dblclick.stop="addOperation('rename', element, index)"
@click.stop="handleCondition(element)"
class="list-item_box"
:style="{
marginBottom: element.treeFieldList
? element.treeFieldList.slice(1).length * 40 + 'px'
: 0
}"
>
<div
class="list-item_primary"
:class="element.id === activeCondition && relationshipChartIndex === 0 && 'active'"
>
<el-icon class="handle">
<Icon name="icon_drag_outlined"><icon_drag_outlined class="svg-icon" /></Icon>
</el-icon>
<div class="label flex-align-center icon" :title="element.name">
<el-icon
v-if="!element.auto && element.showError"
style="font-size: 16px; color: #f54a45"
>
<icon name="icon_warning_filled"><icon_warning_filled class="svg-icon" /></icon>
</el-icon>
{{ element.name }}
</div>
<div class="condition-icon flex-align-center">
<handle-more
@handle-command="cmd => addOperation(cmd, element, index)"
:menu-list="typeList"
:icon-name="more_v"
placement="bottom-end"
></handle-more>
<el-icon
class="hover-icon"
@click.stop="element.visible = !element.visible"
v-if="element.visible"
>
<Icon name="icon_visible_outlined"
><icon_visible_outlined class="svg-icon"
/></Icon>
</el-icon>
<el-icon
class="hover-icon"
@click.stop="element.visible = !element.visible"
v-else
>
<Icon name="de_pwd_invisible"><de_pwd_invisible class="svg-icon" /></Icon>
</el-icon>
</div>
<div @click.stop v-if="activeConditionForRename.id === element.id" class="rename">
<el-input
@blur="renameInputBlur"
:ref="setRenameInput"
v-model="activeConditionForRename.name"
></el-input>
</div>
</div>
<template v-if="element.treeFieldList">
<div
:class="
element.id === activeCondition &&
relationshipChartIndex === index + 1 &&
'active'
"
class="list-item_primary list-tree_primary"
:style="{
top: 40 * (index + 1) + 'px',
paddingLeft: 32 + 16 * (index + 1) + 'px'
}"
v-for="(itx, index) in element.treeFieldList.slice(1)"
:key="itx.field"
@click.stop="notCurrentEle(element, index + 1)"
>
{{ itx.name }}
</div>
</template>
</div>
</template>
</draggable>
</div>
<div v-if="!!curComponent" class="chart-field" :class="curComponent.auto && 'hidden'">
<el-scrollbar>
<div class="mask" v-if="curComponent.auto"></div>
<div class="title flex-align-center">
{{ t('v_query.chart_and_field') }}
<el-radio-group class="ml-4 larger-radio" v-model="curComponent.auto">
<el-radio :disabled="!curComponent.auto" :label="true">
<div class="flex-align-center">
{{ t('chart.margin_model_auto') }}
<el-tooltip effect="dark" placement="top">
<template #content>
<div>
{{ t('v_query.be_switched_to') }}
<br />
{{ t('v_query.to_automatic_again') }}
</div>
</template>
<el-icon style="margin-left: 4px; color: #646a73">
<icon name="icon_info_outlined"><icon_info_outlined class="svg-icon" /></icon>
</el-icon>
</el-tooltip>
</div>
</el-radio>
<el-radio :label="false">{{ t('commons.custom') }}</el-radio>
</el-radio-group>
</div>
<div class="select-all">
<el-checkbox
v-model="checkAll"
:indeterminate="isIndeterminate"
@change="handleCheckAllChange"
>{{ t('dataset.check_all') }}</el-checkbox
>
</div>
<div class="field-list">
<el-checkbox-group
v-model="curComponent.checkedFields"
@change="handleCheckedFieldsChangeTree"
>
<div v-for="field in fields" :key="field.componentId" class="list-item_field_de">
<el-checkbox :label="field.componentId"
><el-icon class="component-type">
<Icon
><component
:is="iconChartMap[canvasViewInfo[field.componentId].type]"
></component
></Icon> </el-icon
><span
:title="canvasViewInfo[field.componentId].title"
class="checkbox-name ellipsis"
>{{ canvasViewInfo[field.componentId].title }}</span
></el-checkbox
>
<span :title="field.name" class="dataset ellipsis">{{ field.name }}</span>
<el-select
@change="val => setParametersArr(val, field.componentId)"
@focus="handleDialogClick"
multiple
filterable
collapse-tags
collapse-tags-tooltip
key="checkedFieldsMapArrTime"
:multiple-limit="2"
class="field-select--input"
style="margin-left: 12px"
popper-class="field-select--dqp"
v-if="
curComponent.checkedFields.includes(field.componentId) &&
curComponent.checkedFieldsMapArr &&
curComponent.checkedFieldsMapArr[field.componentId] &&
curComponent.checkedFieldsMapArr[field.componentId].length
"
v-model="curComponent.checkedFieldsMapArr[field.componentId]"
clearable
>
<template v-if="curComponent.checkedFieldsMap[field.componentId]" #prefix>
<el-icon>
<Icon
><component
:class="`field-icon-${
fieldType[
getDetype(
curComponent.checkedFieldsMap[field.componentId],
Object.values(field.fields)
)
]
}`"
:is="
iconFieldMap[
fieldType[
getDetype(
curComponent.checkedFieldsMap[field.componentId],
Object.values(field.fields)
)
]
]
"
></component
></Icon>
</el-icon>
</template>
<template #header>
<el-tabs stretch class="params-select--header" v-model="field.activelist">
<el-tab-pane
disabled
:label="t('chart.dimension')"
name="dimensionList"
></el-tab-pane>
<el-tab-pane
disabled
:label="t('chart.quota')"
name="quotaList"
></el-tab-pane>
<el-tab-pane :label="t('dataset.param')" name="parameterList"></el-tab-pane>
</el-tabs>
</template>
<el-option
v-for="ele in field.fields[field.activelist]"
:key="ele.id"
:label="ele.name || ele.variableName"
:value="ele.id"
:disabled="isParametersDisable(ele)"
>
<div class="flex-align-center icon">
<el-icon>
<Icon :className="`field-icon-${fieldType[ele.deType]}`"
><component
class="svg-icon"
:class="`field-icon-${fieldType[ele.deType]}`"
:is="iconFieldMap[fieldType[ele.deType]]"
></component
></Icon>
</el-icon>
<span :title="ele.name || ele.variableName" class="ellipsis">
{{ ele.name || ele.variableName }}
</span>
<span
v-if="
curComponent.checkedFieldsMapArr[field.componentId].includes(ele.id) &&
field.activelist === 'parameterList'
"
@click.stop="timeClick(field.componentId, ele)"
class="range-time_setting"
>
{{
curComponent.checkedFieldsMapStart[field.componentId] === ele.id
? t('dataset.start_time')
: curComponent.checkedFieldsMapEnd[field.componentId] === ele.id
? t('dataset.end_time')
: ''
}}
<el-icon>
<Icon>
<icon_edit_outlined class="svg-icon"></icon_edit_outlined>
</Icon>
</el-icon>
</span>
</div>
</el-option>
</el-select>
<el-select
@change="val => setParametersArrNum(val, field.componentId)"
@focus="handleDialogClick"
multiple
filterable
collapse-tags
collapse-tags-tooltip
key="checkedFieldsMapArr"
:multiple-limit="2"
class="field-select--input"
style="margin-left: 12px"
popper-class="field-select--dqp"
v-else-if="
curComponent.checkedFields.includes(field.componentId) &&
curComponent.checkedFieldsMapArrNum &&
curComponent.checkedFieldsMapArrNum[field.componentId] &&
curComponent.checkedFieldsMapArrNum[field.componentId].length
"
v-model="curComponent.checkedFieldsMapArrNum[field.componentId]"
clearable
>
<template v-if="curComponent.checkedFieldsMap[field.componentId]" #prefix>
<el-icon>
<Icon
><component
:class="`field-icon-${
fieldType[
getDetype(
curComponent.checkedFieldsMap[field.componentId],
Object.values(field.fields)
)
]
}`"
:is="
iconFieldMap[
fieldType[
getDetype(
curComponent.checkedFieldsMap[field.componentId],
Object.values(field.fields)
)
]
]
"
></component
></Icon>
</el-icon>
</template>
<template #header>
<el-tabs stretch class="params-select--header" v-model="field.activelist">
<el-tab-pane
disabled
:label="t('chart.dimension')"
name="dimensionList"
></el-tab-pane>
<el-tab-pane
disabled
:label="t('chart.quota')"
name="quotaList"
></el-tab-pane>
<el-tab-pane :label="t('dataset.param')" name="parameterList"></el-tab-pane>
</el-tabs>
</template>
<el-option
v-for="ele in field.fields[field.activelist]"
:key="ele.id"
:label="ele.name || ele.variableName"
:value="ele.id"
:disabled="![2, 3].includes(ele.deType)"
>
<div class="flex-align-center icon">
<el-icon>
<Icon :className="`field-icon-${fieldType[ele.deType]}`"
><component
class="svg-icon"
:class="`field-icon-${fieldType[ele.deType]}`"
:is="iconFieldMap[fieldType[ele.deType]]"
></component
></Icon>
</el-icon>
<span :title="ele.name || ele.variableName" class="ellipsis">
{{ ele.name || ele.variableName }}
</span>
<span
v-if="
curComponent.checkedFieldsMapArrNum[field.componentId].includes(ele.id) &&
field.activelist === 'parameterList'
"
@click.stop="numClick(field.componentId, ele)"
class="range-time_setting"
>
{{
curComponent.checkedFieldsMapStartNum[field.componentId] === ele.id
? t('chart.min')
: curComponent.checkedFieldsMapEndNum[field.componentId] === ele.id
? t('chart.max')
: ''
}}
<el-icon>
<Icon>
<icon_edit_outlined class="svg-icon"></icon_edit_outlined>
</Icon>
</el-icon>
</span>
</div>
</el-option>
</el-select>
<el-select
@change="setParameters(field)"
@focus="handleDialogClick"
filterable
style="margin-left: 12px"
popper-class="field-select--dqp"
v-else-if="curComponent.checkedFields.includes(field.componentId)"
v-model="curComponent.checkedFieldsMap[field.componentId]"
clearable
>
<template v-if="curComponent.checkedFieldsMap[field.componentId]" #prefix>
<el-icon>
<Icon
><component
:class="`field-icon-${
fieldType[
getDetype(
curComponent.checkedFieldsMap[field.componentId],
Object.values(field.fields)
)
]
}`"
:is="
iconFieldMap[
fieldType[
getDetype(
curComponent.checkedFieldsMap[field.componentId],
Object.values(field.fields)
)
]
]
"
></component
></Icon>
</el-icon>
</template>
<template #header>
<el-tabs stretch class="params-select--header" v-model="field.activelist">
<el-tab-pane :label="t('chart.dimension')" name="dimensionList"></el-tab-pane>
<el-tab-pane
:disabled="curComponent.displayType === '9'"
:label="t('chart.quota')"
name="quotaList"
></el-tab-pane>
<el-tab-pane
v-if="field.hasParameter"
:label="t('dataset.param')"
:disabled="curComponent.displayType === '9'"
name="parameterList"
></el-tab-pane>
</el-tabs>
</template>
<el-option
v-for="ele in field.fields[field.activelist]"
:key="ele.id"
:label="ele.name || ele.variableName"
:value="ele.id"
:disabled="
ele.desensitized ||
(curComponent.displayType === '9' && ele.deType === 1) ||
isParametersDisable(ele)
"
>
<div
class="flex-align-center icon"
:title="ele.desensitized ? t('v_query.as_query_conditions') : ''"
>
<el-icon>
<Icon :className="`field-icon-${fieldType[ele.deType]}`"
><component
class="svg-icon"
:class="`field-icon-${fieldType[ele.deType]}`"
:is="iconFieldMap[fieldType[ele.deType]]"
></component
></Icon>
</el-icon>
<span :title="ele.name || ele.variableName" class="ellipsis">
{{ ele.name || ele.variableName }}
</span>
<span
@click.stop="
() =>
isNumParameter
? numClick(field.componentId, ele)
: timeClick(field.componentId, ele)
"
v-if="
curComponent.checkedFieldsMap[field.componentId] === ele.id &&
field.activelist === 'parameterList' &&
(isTimeParameter || isNumParameter)
"
class="range-time_setting"
>
{{ isNumParameter ? t('chart.value_formatter_value') : t('dataset.time') }}
<el-icon>
<Icon>
<icon_edit_outlined class="svg-icon"></icon_edit_outlined>
</Icon>
</el-icon>
</span>
</div>
</el-option>
</el-select>
<span style="width: 172px; margin-left: 12px" v-else></span>
</div>
</el-checkbox-group>
</div>
</el-scrollbar>
</div>
<div
v-if="!!curComponent"
class="condition-configuration"
:class="curComponent.auto && 'condition-configuration_hide'"
>
<el-scrollbar>
<div class="mask condition" v-if="curComponent.auto"></div>
<div class="title flex-align-center">
{{ t('v_query.query_condition_configuration') }}
<el-checkbox
:disabled="
curComponent.auto ||
(curComponent.displayType === '9' && relationshipChartIndex !== 0)
"
v-model="curComponent.required"
:label="t('v_query.required_items')"
/>
</div>
<div
v-show="
(curComponent.displayType !== '9' && showConfiguration && !showTypeError) ||
(curComponent.displayType === '9' && relationshipChartIndex == 0)
"
class="configuration-list"
>
<div class="list-item">
<div class="label">{{ t('v_query.display_type') }}</div>
<div class="value">
<el-select
@focus="handleDialogClick"
@change="handleSetTypeChange"
v-model="curComponent.displayType"
>
<el-option
:disabled="!['0', '8', '9'].includes(curComponent.displayType)"
:label="t('v_query.text_drop_down')"
value="0"
/>
<el-option
:disabled="!['0', '8', '9'].includes(curComponent.displayType)"
:label="t('v_query.text_search')"
value="8"
/>
<el-option
:disabled="
!['0', '8', '9'].includes(curComponent.displayType) ||
!!curComponent.parameters.length
"
:label="t('v_query.drop_down_tree')"
value="9"
/>
<template v-if="['2', '22'].includes(curComponent.displayType)">
<el-option
:disabled="!['2', '22'].includes(curComponent.displayType) || notNumRange"
:label="t('v_query.number_drop_down')"
value="2"
/>
<el-option
:disabled="!['2', '22'].includes(curComponent.displayType) || canNotNumRange"
:label="t('v_query.number_range')"
value="22"
/>
</template>
<el-option
v-else
:disabled="curComponent.displayType !== '5'"
:label="t('v_query.number_drop_down')"
value="5"
/>
<el-option
:disabled="
!['1', '7'].includes(curComponent.displayType) ||
(isTimeParameter && notTimeRange)
"
:label="t('dataset.time')"
value="1"
/>
<el-option
:disabled="
!['1', '7'].includes(curComponent.displayType) ||
(isTimeParameter && !notTimeRange)
"
:label="t('common.component.dateRange')"
value="7"
/>
</el-select>
</div>
</div>
<div class="list-item" v-if="curComponent.displayType === '9'">
<div :title="t('v_query.of_option_values')" class="label ellipsis">
{{ t('v_query.of_option_values') }}
</div>
<div class="value">
<el-radio-group class="larger-radio icon-info" v-model="curComponent.resultMode">
<el-radio :label="0"
>{{ t('login.default_login') }}
<el-tooltip effect="dark" :content="t('common.up_to_options')" placement="top">
<el-icon style="margin-left: 4px; color: #646a73">
<icon name="icon_info_outlined"
><icon_info_outlined class="svg-icon"
/></icon>
</el-icon> </el-tooltip
></el-radio>
<el-radio :label="1">{{ t('chart.result_mode_all') }}</el-radio>
</el-radio-group>
</div>
</div>
<div class="list-item" v-if="curComponent.displayType === '9'">
<div :title="t('copilot.pls_choose_dataset')" class="label ellipsis">
{{ t('copilot.pls_choose_dataset') }}
</div>
<div class="value">
<el-tree-select
:teleported="false"
v-model="curComponent.treeDatasetId"
:data="datasetTree"
:placeholder="t('copilot.pls_choose_dataset')"
@change="handleDatasetTreeChange"
:props="dsSelectProps"
placement="bottom"
:render-after-expand="false"
filterable
popper-class="dataset-tree"
>
<template #default="{ node, data }">
<div class="content">
<el-icon size="18px" v-if="!data.leaf">
<Icon><dvFolder class="svg-icon" /></Icon>
</el-icon>
<el-icon size="18px" v-if="data.leaf">
<Icon><icon_dataset class="svg-icon" /></Icon>
</el-icon>
<span
class="label-tree ellipsis"
style="margin-left: 8px"
:title="node.label"
>{{ node.label }}</span
>
</div>
</template>
</el-tree-select>
</div>
</div>
<div class="list-item" v-if="curComponent.displayType === '9'">
<div class="label" style="width: 135px; height: 26px; line-height: 26px">
{{ t('v_query.tree_structure_design') }}
<el-button
v-if="curComponent.treeFieldList && !!curComponent.treeFieldList.length"
text
@click="startTreeDesign"
>
<template #icon>
<icon><icon_edit_outlined class="svg-icon" /></icon>
</template>
</el-button>
</div>
<div class="search-tree">
<template v-if="curComponent.treeFieldList && !!curComponent.treeFieldList.length">
<div
v-for="(ele, index) in curComponent.treeFieldList"
:key="ele.id"
class="tree-field"
>
<span class="level-index"
>{{ t('visualization.level') }}{{ indexNumCascade[index] }}</span
>
<span class="field-type"
><el-icon>
<Icon
><component
:class="`field-icon-${fieldType[ele.deType]}`"
class="svg-icon"
:is="iconFieldMap[fieldType[ele.deType]]"
></component
></Icon> </el-icon
></span>
<span class="field-tree_name ellipsis" :title="ele.name">{{ ele.name }}</span>
<span class="field-relationship_chart" v-if="index === 0">{{
t('common.associated_chart_first')
}}</span>
<span class="field-relationship_chart" v-else>
<el-button text @click="handleRelationshipChart(index)">
{{ t('common.associated_chart') }}
</el-button>
</span>
</div>
</template>
<el-button class="start-tree_design" @click="startTreeDesign" v-else text>
<template #icon>
<Icon name="icon_add_outlined"><icon_add_outlined class="svg-icon" /></Icon>
</template>
{{ t('v_query.the_tree_structure') }}
</el-button>
</div>
<TreeFieldDialog ref="treeDialog" @save-tree="saveTree"></TreeFieldDialog>
</div>
<div class="list-item" v-if="['1', '7'].includes(curComponent.displayType)">
<div :title="t('v_query.time_granularity')" class="label ellipsis">
{{ t('v_query.time_granularity') }}
</div>
<div class="value">
<template v-if="curComponent.displayType === '7' && !isTimeParameter">
<el-select
@change="timeGranularityMultipleChange"
:placeholder="t('v_query.the_time_granularity')"
@focus="handleDialogClick"
v-model="curComponent.timeGranularityMultiple"
>
<el-option :label="t('chart.y')" value="yearrange" />
<el-option :label="t('chart.y_M')" value="monthrange" />
<el-option :label="t('chart.y_M_d')" value="daterange" />
<el-option :label="t('chart.y_M_d_H_m_s')" value="datetimerange" />
</el-select>
</template>
<template v-else>
<el-select
@change="timeGranularityChange"
:placeholder="t('v_query.the_time_granularity')"
v-model="curComponent.timeGranularity"
>
<el-option
v-for="ele in timeParameterList"
:key="ele.value"
:label="ele.label"
:value="ele.value"
/>
</el-select>
</template>
</div>
</div>
<div
class="list-item top-item"
v-if="!['1', '7', '8', '9', '22'].includes(curComponent.displayType)"
>
<div :title="t('v_query.option_value_source')" class="label ellipsis">
{{ t('v_query.option_value_source') }}
</div>
<div class="value">
<div class="value">
<el-radio-group
class="larger-radio"
@change="handleValueSourceChange"
v-model="curComponent.optionValueSource"
>
<el-radio :disabled="!!curComponent.parameters.length" :label="0">{{
t('chart.margin_model_auto')
}}</el-radio>
<el-radio :label="1">{{ t('chart.select_dataset') }}</el-radio>
<el-radio :label="2">{{ t('v_query.manual_input') }}</el-radio>
</el-radio-group>
</div>
<template v-if="curComponent.optionValueSource === 1">
<div class="value">
<el-tree-select
:teleported="false"
v-model="curComponent.dataset.id"
:data="datasetTree"
:placeholder="t('copilot.pls_choose_dataset')"
@change="handleDatasetChange"
@current-change="handleCurrentChange"
:props="dsSelectProps"
placement="bottom"
:render-after-expand="false"
filterable
popper-class="dataset-tree"
>
<template #default="{ node, data }">
<div class="content">
<el-icon size="18px" v-if="!data.leaf">
<Icon name="dv-folder"><dvFolder class="svg-icon" /></Icon>
</el-icon>
<el-icon size="18px" v-if="data.leaf">
<Icon name="icon_dataset"><icon_dataset class="svg-icon" /></Icon>
</el-icon>
<span
class="label-tree ellipsis"
style="margin-left: 8px"
:title="node.label"
>{{ node.label }}</span
>
</div>
</template>
</el-tree-select>
</div>
<div style="display: flex; align-items: center" class="value ellipsis">
<span :title="t('v_query.query_field')" class="label">{{
t('v_query.query_field')
}}</span>
<el-select
@change="handleFieldChange"
:placeholder="t('v_query.query_field')"
class="search-field"
v-model="curComponent.field.id"
>
<template v-if="curComponent.field.id" #prefix>
<el-icon>
<Icon
><component
class="svg-icon"
:class="`field-icon-${
fieldType[
getDetype(curComponent.field.id, curComponent.dataset.fields)
]
}`"
:is="
iconFieldMap[
fieldType[
getDetype(curComponent.field.id, curComponent.dataset.fields)
]
]
"
></component
></Icon>
</el-icon>
</template>
<el-option
v-for="ele in curComponent.dataset.fields.filter(
ele =>
ele.deType === +curComponent.displayType ||
([3, 4].includes(ele.deType) && +curComponent.displayType === 2) ||
(ele.deType === 7 && +curComponent.displayType === 0)
)"
:key="ele.id"
:label="ele.name"
:value="ele.id"
:disabled="ele.desensitized"
>
<div
class="flex-align-center icon"
:title="ele.desensitized ? t('v_query.as_query_conditions') : ''"
>
<el-icon>
<Icon :className="`field-icon-${fieldType[ele.deType]}`"
><component
class="svg-icon"
:class="`field-icon-${fieldType[ele.deType]}`"
:is="iconFieldMap[fieldType[ele.deType]]"
></component
></Icon>
</el-icon>
<span>
{{ ele.name }}
</span>
</div>
</el-option>
</el-select>
</div>
<div style="display: flex; align-items: center" class="value">
<span :title="t('v_query.display_field')" class="label ellipsis">{{
t('v_query.display_field')
}}</span>
<el-select
:placeholder="t('v_query.display_field')"
class="search-field"
v-model="curComponent.displayId"
@change="resetSort"
>
<template v-if="curComponent.displayId" #prefix>
<el-icon>
<Icon
><component
class="svg-icon"
:class="`field-icon-${
fieldType[
getDetype(curComponent.displayId, curComponent.dataset.fields)
]
}`"
:is="
iconFieldMap[
fieldType[
getDetype(curComponent.displayId, curComponent.dataset.fields)
]
]
"
></component
></Icon>
</el-icon>
</template>
<el-option
v-for="ele in fieldsComputed"
:key="ele.id"
:label="ele.name"
:value="ele.id"
:disabled="ele.desensitized"
>
<div
class="flex-align-center icon"
:title="ele.desensitized ? t('v_query.as_query_conditions') : ''"
>
<el-icon>
<Icon :className="`field-icon-${fieldType[ele.deType]}`"
><component
class="svg-icon"
:class="`field-icon-${fieldType[ele.deType]}`"
:is="iconFieldMap[fieldType[ele.deType]]"
></component
></Icon>
</el-icon>
<span>
{{ ele.name }}
</span>
</div>
</el-option>
</el-select>
</div>
<div class="value">
<span class="label">{{ t('chart.total_sort_field') }}</span>
<div>
<el-select
clearable
:placeholder="t('v_query.the_sorting_field')"
v-model="curComponent.sortId"
class="sort-field"
style="width: 240px"
@change="handleSortChange"
>
<template v-if="curComponent.sortId" #prefix>
<el-icon>
<Icon
><component
class="svg-icon"
:class="`field-icon-${
fieldType[
getDetype(curComponent.sortId, curComponent.dataset.fields)
]
}`"
:is="
iconFieldMap[
fieldType[
getDetype(curComponent.sortId, curComponent.dataset.fields)
]
]
"
></component
></Icon>
</el-icon>
</template>
<el-option
v-for="ele in curComponent.dataset.fields"
:key="ele.id"
:label="ele.name"
:value="ele.id"
:disabled="ele.desensitized"
>
<div
class="flex-align-center icon"
:title="ele.desensitized ? t('v_query.as_query_conditions') : ''"
>
<el-icon>
<Icon
><component
:class="`field-icon-${fieldType[ele.deType]}`"
class="svg-icon"
:is="iconFieldMap[fieldType[ele.deType]]"
></component
></Icon>
</el-icon>
<span>
{{ ele.name }}
</span>
</div>
</el-option>
</el-select>
<el-select
class="sort-type"
v-model="curComponent.sort"
@change="handleFieldChange"
>
<el-option :label="t('chart.asc')" value="asc" />
<el-option :label="t('chart.desc')" value="desc" />
<el-option
@click="handleCustomClick"
:title="sortComputed ? $t('v_query.display_sort') : ''"
:disabled="sortComputed"
:label="t('v_query.custom_sort')"
value="customSort"
/>
</el-select>
</div>
</div>
</template>
<div v-if="curComponent.optionValueSource === 2" class="value flex-align-center">
<el-popover
placement="bottom-start"
popper-class="manual-input"
ref="manual"
:width="358"
trigger="click"
>
<template #reference>
<el-button text>
<template #icon>
<Icon name="icon_edit_outlined"
><icon_edit_outlined class="svg-icon"
/></Icon>
</template>
{{ t('common.edit') }}
</el-button>
</template>
<div class="manual-input-container">
<el-scrollbar>
<div class="title">{{ t('auth.manual_input') }}</div>
<div class="select-value">
<span> {{ t('data_fill.form.option_value') }} </span>
<div :key="index" v-for="(_, index) in valueSource" class="select-item">
<el-input
maxlength="64"
v-if="curComponent.displayType === '2'"
@blur="weightlessness"
v-model.number="valueSource[index]"
></el-input>
<el-input
maxlength="64"
v-else
@blur="weightlessness"
v-model="valueSource[index]"
></el-input>
<el-button
v-if="valueSource.length !== 1"
@click="valueSource.splice(index, 1)"
class="value"
text
>
<template #icon>
<Icon name="icon_delete-trash_outlined"
><icon_deleteTrash_outlined class="svg-icon"
/></Icon>
</template>
</el-button>
</div>
</div>
</el-scrollbar>
<div class="add-btn">
<el-button @click="valueSource.push('')" text>
<template #icon>
<Icon name="icon_add_outlined"
><icon_add_outlined class="svg-icon"
/></Icon>
</template>
{{ t('data_fill.form.add_option') }}
</el-button>
</div>
<div class="manual-footer flex-align-center">
<el-button @click="cancelValueSource">{{ t('chart.cancel') }} </el-button>
<el-button @click="confirmValueSource" type="primary"
>{{ t('chart.confirm') }}
</el-button>
</div>
</div>
</el-popover>
<div
v-if="!!curComponent.valueSource.length"
class="config-flag flex-align-center"
>
{{ t('v_query.configured') }}
</div>
</div>
</div>
<template v-if="['0', '2', '5'].includes(curComponent.displayType)">
<div
class="label ellipsis"
:title="t('common.display_formats')"
style="margin-top: 10.5px"
>
{{ t('common.display_formats') }}
</div>
<div class="value" style="margin-top: 10.5px">
<el-radio-group
class="larger-radio icon-info"
v-model="curComponent.displayFormat"
>
<el-radio :label="0">{{ t('common.dropdown_display') }} </el-radio>
<el-radio :label="1">{{ t('common.tile_display') }}</el-radio>
</el-radio-group>
</div>
</template>
<div
class="label ellipsis"
:title="t('v_query.of_option_values')"
style="margin-top: 10.5px"
>
{{ t('v_query.of_option_values') }}
</div>
<div class="value" style="margin-top: 10.5px">
<el-radio-group class="larger-radio icon-info" v-model="curComponent.resultMode">
<el-radio :label="0"
>{{ t('chart.default') }}
<el-tooltip effect="dark" :content="t('common.up_to_options')" placement="top">
<el-icon style="margin-left: 4px; color: #646a73">
<icon name="icon_info_outlined"
><icon_info_outlined class="svg-icon"
/></icon>
</el-icon> </el-tooltip
></el-radio>
<el-radio :label="1">{{ t('data_set.all') }}</el-radio>
</el-radio-group>
</div>
</div>
<div class="list-item top-item" v-if="curComponent.displayType === '8'">
<div :title="t('v_query.condition_type')" class="label ellipsis">
{{ t('v_query.condition_type') }}
</div>
<div class="value">
<div class="value">
<el-radio-group class="larger-radio" v-model="curComponent.conditionType">
<el-radio :label="0">{{ t('v_query.single_condition') }}</el-radio>
<el-radio :label="1" :disabled="!!curComponent.parameters.length">{{
t('v_query.with_condition')
}}</el-radio>
<el-radio :label="2" :disabled="!!curComponent.parameters.length">{{
t('v_query.or_condition')
}}</el-radio>
</el-radio-group>
</div>
</div>
</div>
<div style="margin-bottom: 10.5px" v-if="curComponent.displayType === '8'">
<el-checkbox
v-model="curComponent.hideConditionSwitching"
:label="t('v_query.hide_condition_switch')"
/>
</div>
<condition-default-configuration
ref="defaultConfigurationRef"
@handleTimeTypeChange="handleTimeTypeChange"
:cur-component="curComponent"
></condition-default-configuration>
</div>
<div v-if="showTypeError && showConfiguration" class="empty">
<empty-background :description="t('v_query.cannot_be_performed')" img-type="error" />
</div>
<div
v-else-if="curComponent.displayType === '9' && relationshipChartIndex !== 0"
class="empty"
>
<empty-background :description="t('common.other_levels')" img-type="error" />
</div>
<div v-else-if="!showConfiguration" class="empty">
<empty-background :description="t('v_query.be_linked_first')" img-type="noneWhite" />
</div>
</el-scrollbar>
</div>
</div>
<template #footer>
<div class="dialog-footer">
<el-button class="query-cascade" @click="openCascadeDialog">{{
t('v_query.component_cascade_configuration')
}}</el-button>
<el-button @click="cancelClick">{{ t('chart.cancel') }} </el-button>
<el-button @click="confirmClick" type="primary">{{ t('chart.confirm') }} </el-button>
</div>
</template>
</el-dialog>
<el-dialog :title="timeName" v-model="timeDialogShow" width="420px">
<el-form label-position="top">
<el-form-item :label="t('v_query.time_type')" class="form-item" prop="name">
<el-radio-group v-model="timeParameterType">
<el-radio :label="0">{{ t('data_set.time') }}</el-radio>
<el-radio :label="1">{{ t('datasource.start_time') }}</el-radio>
<el-radio :label="2">{{ t('datasource.end_time') }}</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<el-button secondary @click="timeDialogShow = false">{{ t('chart.cancel') }}</el-button>
<el-button type="primary" @click="timeTypeChange">{{ t('chart.confirm') }}</el-button>
</template>
</el-dialog>
<el-dialog :title="numName" v-model="numDialogShow" width="420px">
<el-form label-position="top">
<el-form-item :label="t('chart.map_line_type')" class="form-item" prop="name">
<el-radio-group v-model="numParameterType">
<el-radio :label="0">{{ t('chart.value_formatter_value') }}</el-radio>
<el-radio :label="1">{{ t('chart.min') }}</el-radio>
<el-radio :label="2">{{ t('chart.max') }}</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<el-button secondary @click="numDialogShow = false">{{ t('dataset.cancel') }}</el-button>
<el-button type="primary" @click="numTypeChange">{{ t('dataset.confirm') }}</el-button>
</template>
</el-dialog>
<customSortFilter ref="customSortFilterRef" @save="sortSave"></customSortFilter>
<CascadeDialog @saveCascade="saveCascade" ref="cascadeDialog"></CascadeDialog>
</template>
<style lang="less">
.range-time_setting {
height: 20px;
padding: 1px 4px 1px 4px;
border-radius: 2px;
display: flex;
align-items: center;
font-size: 12px;
font-weight: 400;
line-height: 20px;
background: #1f23291a;
color: #1f2329;
margin-left: 4px;
.ed-icon {
font-size: 12px;
margin-right: 0 !important;
margin-left: 4px;
}
}
.field-select--dqp {
min-width: 210px !important;
}
.ed-select-dropdown__header {
padding: 0 8px !important;
.params-select--header {
--ed-tabs-header-height: 32px;
.ed-tabs__item {
font-weight: 400;
font-size: 15px;
}
}
}
.condition-value-select-popper {
.ed-select-dropdown__item.selected::after {
display: none;
}
}
.dataset-parameters {
font-family: var(--de-custom_font, 'PingFang');
font-style: normal;
font-weight: 400;
.ed-select-dropdown__item {
height: 50px;
line-height: 50px;
padding-top: 4px;
&.selected::after {
top: 30% !important;
}
}
.variable-name {
font-size: 14px;
line-height: 22px;
}
.dataset-full-name {
color: #8d9199;
font-size: 12px;
line-height: 20px;
}
}
.query-condition-configuration {
--ed-font-weight-primary: 400;
.query-cascade {
position: absolute;
left: 24px;
bottom: 24px;
}
.ed-dialog__headerbtn {
top: 21px;
display: flex;
align-items: center;
justify-content: center;
}
.ed-select__prefix {
font-size: 16px;
&::after {
display: none;
}
}
.container {
font-size: 14px;
font-family: var(--de-custom_font, 'PingFang');
width: 1152px;
height: 454px;
border-radius: 6px;
border: 1px solid #dee0e3;
display: flex;
.ed-checkbox:not(.is-disabled) {
.ed-checkbox__label:hover {
color: #1f2329;
}
}
.query-condition-list {
height: 100%;
background: #f5f6f7;
border-right: 1px solid #dee0e3;
width: 208px;
overflow-y: auto;
.title {
padding: 16px;
display: flex;
align-items: center;
justify-content: space-between;
font-family: var(--de-custom_font, 'PingFang');
font-size: 14px;
font-style: normal;
font-weight: 500;
line-height: 22px;
.ed-icon {
cursor: pointer;
font-size: 16px;
color: var(--ed-color-primary);
}
}
.list-item_box {
width: 100%;
position: relative;
.list-tree_primary {
position: absolute;
left: 0;
padding: 8px 32px;
width: 100%;
}
}
.list-item_primary {
border-radius: 0;
position: relative;
.label {
width: 75%;
}
.rename {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: var(--ed-color-primary-1a, rgba(51, 112, 255, 0.1));
padding: 4px 10px;
z-index: 5;
}
}
}
.mask {
position: absolute;
top: 30px;
left: 0;
width: 100%;
z-index: 5;
background: rgba(255, 255, 255, 0.6);
height: calc(100% - 30px);
&.condition {
height: calc(100% - 45px);
top: 45px;
}
}
.chart-field {
height: calc(100% - 16px);
padding: 0 16px 16px 16px;
width: 474px;
position: relative;
overflow-y: auto;
margin-top: 16px;
.flex-align-center {
position: sticky;
top: 0;
justify-content: space-between;
background: #fff;
z-index: 5;
.ed-radio {
height: 20px;
}
}
.title {
font-family: var(--de-custom_font, 'PingFang');
font-size: 14px;
font-style: normal;
font-weight: 500;
line-height: 22px;
margin-bottom: 8px;
}
.select-all {
height: 40px;
}
.field-list {
.component-type {
margin-right: 4px;
font-size: 20px;
color: var(--ed-color-primary);
}
.list-item_field_de {
height: 32px;
display: flex;
align-items: center;
margin-bottom: 8px;
.field-select--input {
.ed-select__prefix {
padding-right: 0;
}
.ed-select__input {
margin-left: 6px !important;
}
.ed-tag {
max-width: 46px !important;
.ed-tag__close {
margin-left: 2px;
}
.ed-select__tags-text {
max-width: 30px !important;
}
}
}
.ed-checkbox__label {
display: inline-flex;
align-items: center;
.checkbox-name {
width: 110px;
}
}
.dataset {
color: #646a73;
font-size: 14px;
height: 22px;
width: 90px;
line-height: 22px;
margin-left: 8px;
}
.ed-select {
width: 172px;
}
}
}
}
.hidden {
overflow-y: hidden;
}
.condition-configuration {
border-left: 1px solid #dee0e3;
width: 467px;
position: relative;
overflow: hidden;
.ed-scrollbar {
padding: 16px;
}
&.condition-configuration_hide {
overflow: hidden;
}
.mask {
left: -1px;
width: calc(100% + 2px);
}
.config-flag {
color: #646a73;
height: 16px;
padding: 0px 4px;
font-family: var(--de-custom_font, 'PingFang');
font-size: 10px;
font-style: normal;
font-weight: 500;
line-height: 13px;
border-radius: 2px;
background: rgba(31, 35, 41, 0.1);
margin-left: 8px;
&.range-filter-time-flag {
display: inline-block;
padding: 1px 4px;
line-height: 14px;
margin-left: 4px;
}
}
.flex-align-center {
position: sticky;
top: 0;
justify-content: space-between;
background: #fff;
z-index: 5;
.ed-checkbox {
height: 20px;
}
}
.title {
margin-bottom: 16px;
font-family: var(--de-custom_font, 'PingFang');
font-size: 14px;
font-style: normal;
font-weight: 500;
line-height: 22px;
position: relative;
&.flex-align-center::after {
content: '';
position: absolute;
width: 100%;
height: 16px;
background: #fff;
top: -16px;
left: 0;
}
}
.configuration-list {
.list-item {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 10.5px;
flex-wrap: wrap;
.search-tree {
width: 100%;
height: 216px;
margin-top: 8px;
position: relative;
padding: 16px;
box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.12);
.start-tree_design {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.tree-field {
display: flex;
align-items: center;
margin-bottom: 16px;
.level-index {
margin-right: 40px;
}
.field-type {
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
}
.field-tree_name {
margin-left: 8px;
width: 100px;
}
.field-relationship_chart {
margin-left: 8px;
}
}
}
.setting-content {
width: 100%;
padding-left: 24px;
}
&.top-item {
.label {
margin-bottom: auto;
padding-top: 5.5px;
}
}
.label {
width: 85px;
color: #1f2329;
}
.value {
.ed-select {
width: 321px;
}
width: 321px;
.value {
margin-top: 8px;
&:first-child {
margin-top: -0.5px;
}
.search-field {
width: 257px;
}
.sort-field {
width: 176px;
}
.label {
line-height: 32px;
font-size: 14px;
margin-right: 8px;
}
}
}
.value {
width: 321px;
.condition-type {
margin-top: 3px !important;
display: flex;
position: relative;
.ed-input__wrapper {
border: none;
border-radius: 0;
box-shadow: none;
height: 26px;
font-family: var(--de-custom_font, 'PingFang');
word-wrap: break-word;
text-align: left;
color: rgba(0, 0, 0, 0.65);
list-style: none;
user-select: none;
cursor: pointer;
line-height: 26px;
box-sizing: border-box;
max-width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
opacity: 1;
}
.ed-select .ed-input.is-focus .ed-input__wrapper,
.ed-select:hover:not(.ed-select--disabled) .ed-input__wrapper,
.ed-select .ed-input__wrapper.is-focus {
box-shadow: none !important;
}
.ed-select {
width: 120px;
.ed-input__wrapper {
padding: 0;
}
}
.condition-type-tip {
font-size: 12px;
color: #646a73;
line-height: 26px;
margin-right: 8px;
}
.bottom-line {
box-sizing: border-box;
height: 1px;
background-color: #000;
opacity: 0.3;
position: absolute;
right: 5px;
bottom: 3px;
width: 220px;
z-index: 10;
&.next-line {
width: 206px;
}
}
&:first-child {
margin-top: -0.5px;
}
}
}
.value {
.sort-field {
width: 240px;
}
.sort-type {
width: 73px;
margin-left: 8px;
}
}
.parameters {
margin-left: auto;
margin-top: 8px;
.w100 {
width: 100%;
}
.ed-select,
.ed-date-editor,
.ed-date-editor--datetime .ed-input__wrapper,
.ed-select-v2 {
width: 415px;
}
.ed-date-editor {
.ed-input__wrapper {
width: 100%;
}
}
}
.parameters-range {
width: 100%;
padding-left: 24px;
display: flex;
flex-wrap: wrap;
.range-title,
.params-start,
.params-end {
width: 50%;
}
.params-start,
.params-end {
margin-top: 8px;
.ed-select {
width: 100%;
}
}
.params-end {
padding-left: 4px;
}
.params-start {
padding-right: 4px;
}
}
.setting {
&.setting {
margin-top: 8px;
}
&.parameters {
width: 100%;
padding-left: 24px;
.ed-date-editor {
width: 325px !important;
}
}
margin-left: auto;
display: flex;
justify-content: space-between;
align-items: center;
.setting-label {
width: 80px;
margin-right: 8px;
}
.setting-value {
margin: 8px 0;
&.select {
margin-top: 0;
.ed-select {
width: 325px;
}
}
}
.setting-input {
display: flex;
padding-left: 86px;
justify-content: flex-end;
align-items: center;
&.range {
padding-left: 0px;
}
& > div + div {
margin-left: 8px;
}
&.with-date {
.ed-input-number {
width: 71px;
}
.ed-select {
width: 62px;
}
.ed-date-editor.ed-input {
width: 106px;
}
}
}
&.is-year-month-range {
.setting-input {
&.with-date {
.ed-input-number,
.ed-select {
width: 103px;
}
}
.ed-date-editor.ed-input {
display: none;
}
}
}
}
}
}
}
}
}
.manual-input {
height: 405px;
padding: 0 !important;
.manual-input-container {
.title {
padding: 16px;
}
.add-btn {
padding: 8px 16px;
}
.select-value {
padding-left: 16px;
max-height: 246px;
.value {
color: #646a73;
margin-left: 6px;
font-size: 20px;
}
.select-item {
margin: 8px 0;
&:last-child {
margin-bottom: 0;
}
.ed-input {
width: 298px;
}
}
}
.manual-footer {
position: absolute;
bottom: 0;
padding: 16px;
height: 63px;
width: 100%;
border-top: 1px solid rgba(31, 35, 41, 0.15);
justify-content: flex-end;
}
}
}
.dataset-tree {
.content {
display: flex;
align-items: center;
width: 100%;
.label-tree {
margin-left: 5px;
width: calc(100% - 45px);
}
}
max-width: 321px;
.ed-select-dropdown__item.selected {
font-weight: 400;
}
}
.larger-radio {
&.icon-info {
.ed-radio__label {
display: flex;
align-items: center;
}
}
.ed-radio__inner {
width: 16px;
height: 16px;
}
}
</style>