CN-1265: 实体列表的搜索器和过滤器一系列bug修复

This commit is contained in:
刘洪洪
2023-09-01 15:55:03 +08:00
parent de624ee048
commit f921b5df50
5 changed files with 175 additions and 34 deletions

View File

@@ -40,7 +40,13 @@
<div class="condition__value">
<div v-if="meta.value.isEditing">
<!--避免blur事件和keyup.enter重复执行-->
<el-input v-model="meta.value.value" size="mini" @blur="valueBlur(meta)" ref="valueInput" @keyup.enter="valueBlur(meta)"></el-input>
<el-input
ref="valueInput"
v-model="meta.value.value"
size="mini"
@blur="valueBlur(meta)"
@focus="valueFocus(meta)"
@keyup.enter="valueBlur(meta)"></el-input>
</div>
<span v-else @click="valueClick(meta)">{{meta.value.label}}</span>
</div>
@@ -107,7 +113,13 @@ import Meta, { connection, condition, columnType } from './meta/meta'
import _ from 'lodash'
import { handleErrorTip } from '@/components/advancedSearch/meta/error'
import Parser, { handleMetaListToStr, stringInQuot } from '@/components/advancedSearch/meta/parser'
import { comparedEntityKey, handleEntityTypeByStr, overwriteUrl, urlParamsHandler } from '@/utils/tools'
import {
comparedEntityKey,
getEntityTypeByValue,
handleEntityTypeByStr,
overwriteUrl,
urlParamsHandler
} from '@/utils/tools'
export default {
name: 'TagMode',
props: {
@@ -233,6 +245,16 @@ export default {
// 根据所选label在columnList中匹配label来确定操作符一般为=,INtags操作符为has
const obj = this.columnList.find(t => t.label === meta.column.label)
this.operatorList = obj ? obj.doc.constraints.operator_functions.split(',') : ['=', 'IN']
// 用户模糊搜索,则自动匹配实体类型和结构
if (meta.column.type === columnType.fullText) {
meta.operator.value = '='
meta.operator.show = true
meta.value.value = `'${meta.column.label}'`
meta.value.label = `'${meta.column.label}'`
meta.column.label = getEntityTypeByValue(meta.column.label)
meta.column.type = 'string'
}
}, 200)
},
connectionClick (meta) {
@@ -267,7 +289,7 @@ export default {
operatorClick (meta) {
meta.operator.isEditing = true
},
valueBlur (meta) {
valueFocus (meta) {
if (meta.column.type === columnType.array) {
let valueArr = []
if (!_.isArray(meta.value.value)) {
@@ -314,6 +336,61 @@ export default {
}
meta.value.label = meta.value.value // label是显示value是实际值
}
},
valueBlur (meta) {
if (meta.column.type === columnType.array) {
let valueArr = []
if (!_.isArray(meta.value.value)) {
let value = meta.value.value.trim().replace(/"/g, "'")
if (value.indexOf('(') === 0 && value.indexOf(')') === value.length - 1) {
value = value.substring(1, value.length)
value = value.substring(0, value.length - 1)
}
valueArr = value.split(',')
} else {
valueArr = meta.value.value
}
meta.value.value = valueArr.map(v => {
let str = v.trim().replace(/"/g, "'")
if (str[0] === "'" && str[str.length - 1] === "'") {
str = str.substring(1, str.length)
str = str.substring(0, str.length - 1)
}
// 如果此时参数为xi'an处理为xi''an后一个条件避免若参数为xi''an,则不处理
if (str.indexOf("'") > -1 && str.indexOf("''") === -1) {
str = str.replace(/'/g, "''")
}
return str
})
let label = '('
meta.value.value.forEach(v => {
label += `'${v}',`
})
label = label.substring(0, label.length - 1)
label += ')'
meta.value.label = label
} else {
if (!_.isNumber(meta.value.value) && meta.value.value !== '') {
// 判断是否被单引号包裹
const regex = /^'[^']*'$/
const isWrapped = regex.test(meta.value.value)
let str = meta.value.value.trim().replace(/"/g, "'")
if (str[0] === "'" && str[str.length - 1] === "'") {
str = str.substring(1, str.length)
str = str.substring(0, str.length - 1)
}
// 如果此时参数为xi'an处理为xi''an后一个条件避免若参数为xi''an,则不处理
if (str.indexOf("'") > -1 && str.indexOf("''") === -1) {
str = str.replace(/'/g, "''")
}
// meta.value.value = str
if (!isWrapped) {
meta.value.value = `'${str}'`
}
}
meta.value.label = meta.value.value // label是显示value是实际值
}
meta.value.isEditing = !meta.isCompleteCondition()
},
valueClick (meta) {
@@ -392,7 +469,7 @@ export default {
meta.column.label = column ? column.label : param.column
meta.operator.value = param.operator
meta.operator.show = true
meta.value.value = this.handleValue(param.value, column, column.operator, 'noQuotes')
meta.value.value = this.handleValue(param.value, column, column.operator)
meta.value.show = true
meta.value.label = meta.value.value
this.addCondition(meta)

View File

@@ -144,14 +144,18 @@ export default {
return value
}
} else {
return column.type === columnType.string ? stringInQuot(value) : value
return (column.type.items ? column.type.items : column.type) === columnType.string ? stringInQuot(value) : value
}
},
addParams (params) {
let current = this.codeMirror.getValue()
params.forEach(param => {
const column = this.columnList.find(c => c.label === param.column)
current = `${current ? current + ' AND ' : ''}${param.column}${handleOperatorSpace(param.operator)}${this.handleValue(param.value, column, param.operator)}`
if (param.operator === 'has') {
current = `${current ? current + ' AND ' : ''}${param.operator}(${param.column},${this.handleValue(param.value, column, param.operator)})`
} else {
current = `${current ? current + ' AND ' : ''}${param.column}${handleOperatorSpace(param.operator)}${this.handleValue(param.value, column, param.operator)}`
}
})
toRaw(this.codeMirror).setValue(current.trim())
},

View File

@@ -1,6 +1,6 @@
import Meta, { connection, condition, columnType } from './meta'
import Meta, { columnType, condition, connection } from './meta'
import Token, { types } from './token'
import ParserError, { errorTypes, errorDesc } from '@/components/advancedSearch/meta/error'
import ParserError, { errorDesc, errorTypes } from '@/components/advancedSearch/meta/error'
import _ from 'lodash'
import { columnList } from '@/utils/static-data'
import { getEntityTypeByValue } from '@/utils/tools'
@@ -97,10 +97,22 @@ export default class Parser {
if (meta.operator.value.toLowerCase().indexOf('like') > -1 || meta.operator.value.toLowerCase().indexOf('in') > -1) {
str += `${meta.column.label} ${meta.operator.value} '${meta.value.value}' `
} else if (meta.operator.value.toLowerCase().indexOf('has') > -1) {
// 操作符为has时has函数需要提前格式为has(label,value)
str += `${meta.operator.value}(${meta.column.label},'${meta.value.value}') `
const isWrapped = isSingleQuoteWrapping(meta.value.value)
// 如果值被单引号包裹则不需要再添加单引号包裹true为单引号包裹
if (isWrapped) {
// 操作符为has时has函数需要提前格式为has(label,value)
str += `${meta.operator.value}(${meta.column.label},${meta.value.value}) `
} else {
str += `${meta.operator.value}(${meta.column.label},'${meta.value.value}') `
}
} else {
str += `${meta.column.label}${meta.operator.value}'${meta.value.value}' `
const isWrapped = isSingleQuoteWrapping(meta.value.value)
// 如果值被单引号包裹则不需要再添加单引号包裹true为单引号包裹
if (isWrapped || meta.value.value.indexOf("''") > -1) {
str += `${meta.column.label}${meta.operator.value}${meta.value.value} `
} else {
str += `${meta.column.label}${meta.operator.value}'${meta.value.value}' `
}
}
} else if (meta.column.type === columnType.number) {
if (_.isNumber(Number(meta.value.value))) {
@@ -147,10 +159,21 @@ export default class Parser {
if (meta.operator.value.toLowerCase().indexOf('like') > -1 || meta.operator.value.toLowerCase().indexOf('in') > -1) {
str += `${meta.column.label} ${meta.operator.value} '${meta.value.value}' `
} else if (meta.operator.value.toLowerCase().indexOf('has') > -1) {
// 操作符为has时has函数需要提前格式为has(label,value)
str += `${meta.operator.value}(${meta.column.label},'${meta.value.value}') `
const isWrapped = isSingleQuoteWrapping(meta.value.value)
if (isWrapped) {
// 操作符为has时has函数需要提前格式为has(label,value)
str += `${meta.operator.value}(${meta.column.label},${meta.value.value}) `
} else {
str += `${meta.operator.value}(${meta.column.label},'${meta.value.value}') `
}
} else {
str += `${meta.column.label}${meta.operator.value}'${meta.value.value}' `
const isWrapped = isSingleQuoteWrapping(meta.value.value)
if (isWrapped || meta.value.value.indexOf("''") > -1) {
// 如xi''an这种情况不需要再添加单引号
str += `${meta.column.label}${meta.operator.value}${meta.value.value} `
} else {
str += `${meta.column.label}${meta.operator.value}'${meta.value.value}' `
}
}
} else if (meta.column.type === columnType.number) {
if (_.isNumber(Number(meta.value.value))) {
@@ -577,7 +600,8 @@ export default class Parser {
// 前面是连接符或操作符或空后面是连接符或空或在单引号内是value
if (isInApostrophe) {
if (meta.column.label) {
meta.value.value = token.value
// meta.value.value = token.value
meta.value.value = isSingleQuoteWrapping(token.value) ? token.value : `'${token.value}'`
meta.column.type = columnType.string
} else {
meta.column.type = columnType.fullText
@@ -747,6 +771,12 @@ export default class Parser {
} else {
meta.value.label = '()'
}
} else if (meta.column.type === columnType.string) {
if (meta.value.value.indexOf("''") > -1) {
meta.value.label = meta.value.value
} else {
meta.value.label = isSingleQuoteWrapping(meta.value.value) ? meta.value.value : `'${meta.value.value}'`
}
} else {
meta.value.label = meta.value.value
}
@@ -819,8 +849,21 @@ export function handleMetaListToStr (metaList) {
if (result) {
if (metaList[0].operator.value.toLowerCase() === 'has') {
return `${metaList[0].operator.value}(${metaList[0].column.label},'${metaList[0].value.label}')`
} else {
} else if (metaList[0].value.label.indexOf('(') > -1) {
// 避免如IN后面带()的,不添加单引号
return `${metaList[0].column.label} ${metaList[0].operator.value} ${metaList[0].value.label}`
} else if (metaList[0].value.label.indexOf("''") > -1) {
// 如xi''an这种情况直接返回
return `${metaList[0].column.label} ${metaList[0].operator.value} ${metaList[0].value.label}`
} else {
const isWrapped = isSingleQuoteWrapping(metaList[0].value.label)
// 如果值被单引号包裹则不需要再添加单引号包裹true为单引号包裹
if (isWrapped) {
// 操作符为has时has函数需要提前格式为has(label,value)
return `${metaList[0].column.label} ${metaList[0].operator.value} ${metaList[0].value.label}`
} else {
return `${metaList[0].column.label} ${metaList[0].operator.value} '${metaList[0].value.label}'`
}
}
} else {
const regex = /^["']|["']$/
@@ -838,7 +881,7 @@ export function handleMetaListToStr (metaList) {
metaList.forEach(item => {
if (item.value !== 'AND') {
if (item.column.label.toLowerCase() === 'tag') {
hasStr += `${item.operator.value}(${item.column.label},'${item.value.value}') AND `
hasStr += `${item.operator.value}(${item.column.label},${item.value.value}) AND `
} else {
newMetaList.push(item)
}
@@ -858,10 +901,16 @@ export function handleMetaListToStr (metaList) {
lastObj[i] = `${i} IN (${str})`
} else if (i.toLowerCase() === 'tag') {
// lastObj[i] = `${i} = '${newObj[i]}'`
lastObj[i] = `has(${i},'${newObj[i]}')`
lastObj[i] = `has(${i},${newObj[i]})`
} else {
// 单独存在的,直接保留
lastObj[i] = `${i} = '${newObj[i]}'`
const isWrapped = isSingleQuoteWrapping(newObj[i])
// 如果值被单引号包裹则不需要再添加单引号包裹true为单引号包裹
if (isWrapped || newObj[i].indexOf("''") > -1) {
// 操作符为has时has函数需要提前格式为has(label,value)
lastObj[i] = `${i} = ${newObj[i]}`
} else {
lastObj[i] = `${i} = '${newObj[i]}'`
}
}
}
@@ -894,3 +943,10 @@ const combineLabel = (list) => {
return acc
}, {})
}
/**
* 判断字符串是否为单引号包裹
*/
const isSingleQuoteWrapping = (str) => {
const regex = /^'[^']*'$/
return regex.test(str)
}