fix: 修复搜索组件一系列bug
This commit is contained in:
@@ -101,7 +101,7 @@ export default {
|
|||||||
},
|
},
|
||||||
enterListener (event) {
|
enterListener (event) {
|
||||||
if (event.keyCode === 13) {
|
if (event.keyCode === 13) {
|
||||||
this.$refs.tagMode && this.$refs.tagMode.search()
|
this.$refs.tagMode && this.$refs.tagMode.enterSearch()
|
||||||
this.$refs.textMode && this.$refs.textMode.search()
|
this.$refs.textMode && this.$refs.textMode.search()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,6 +87,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import Meta, { connection, condition, columnType } from './meta/meta'
|
import Meta, { connection, condition, columnType } from './meta/meta'
|
||||||
import _ from 'lodash'
|
import _ from 'lodash'
|
||||||
|
import { handleErrorTip } from '@/components/advancedSearch/meta/error'
|
||||||
import Parser, { stringInQuot } from '@/components/advancedSearch/meta/parser'
|
import Parser, { stringInQuot } from '@/components/advancedSearch/meta/parser'
|
||||||
export default {
|
export default {
|
||||||
name: 'TagMode',
|
name: 'TagMode',
|
||||||
@@ -208,11 +209,11 @@ export default {
|
|||||||
// 若是in或not in,column的type要改成array,否则是string
|
// 若是in或not in,column的type要改成array,否则是string
|
||||||
if (operator.toLowerCase().indexOf('in') > -1) {
|
if (operator.toLowerCase().indexOf('in') > -1) {
|
||||||
meta.column.type = columnType.array
|
meta.column.type = columnType.array
|
||||||
meta.value.type = columnType.array
|
|
||||||
meta.value.value = []
|
meta.value.value = []
|
||||||
|
} else if (['>', '<', '>=', '<='].indexOf(operator) > -1) {
|
||||||
|
meta.column.type = columnType.number
|
||||||
} else {
|
} else {
|
||||||
meta.column.type = columnType.string
|
meta.column.type = columnType.string
|
||||||
meta.value.type = columnType.string
|
|
||||||
if (_.isArray(meta.value.value)) {
|
if (_.isArray(meta.value.value)) {
|
||||||
meta.value.value = ''
|
meta.value.value = ''
|
||||||
}
|
}
|
||||||
@@ -225,8 +226,50 @@ export default {
|
|||||||
meta.operator.isEditing = true
|
meta.operator.isEditing = true
|
||||||
},
|
},
|
||||||
valueBlur (meta) {
|
valueBlur (meta) {
|
||||||
meta.value.value = meta.value.value.replace(/"/g, "'")
|
if (meta.column.type === columnType.array) {
|
||||||
meta.value.label = meta.value.value // label是显示,value是实际值;目前的需求label和value是相等的,
|
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)
|
||||||
|
}
|
||||||
|
if (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)) {
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
if (str.indexOf("'") > -1) {
|
||||||
|
str = str.replace(/'/g, "''")
|
||||||
|
}
|
||||||
|
meta.value.value = str
|
||||||
|
}
|
||||||
|
meta.value.label = meta.value.value // label是显示,value是实际值
|
||||||
|
}
|
||||||
meta.value.isEditing = !meta.isCompleteCondition()
|
meta.value.isEditing = !meta.isCompleteCondition()
|
||||||
},
|
},
|
||||||
valueClick (meta) {
|
valueClick (meta) {
|
||||||
@@ -241,6 +284,12 @@ export default {
|
|||||||
return meta.name === value
|
return meta.name === value
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
enterSearch () {
|
||||||
|
const isEditing = this.metaList.some(meta => meta.value.isEditing)
|
||||||
|
if (!isEditing) {
|
||||||
|
this.search()
|
||||||
|
}
|
||||||
|
},
|
||||||
search () {
|
search () {
|
||||||
if (this.metaList.length > 0) {
|
if (this.metaList.length > 0) {
|
||||||
const parser = new Parser(this.columnList)
|
const parser = new Parser(this.columnList)
|
||||||
@@ -248,7 +297,7 @@ export default {
|
|||||||
if (_.isEmpty(errorList)) {
|
if (_.isEmpty(errorList)) {
|
||||||
this.$emit('search', parser.parseMeta(this.metaList))
|
this.$emit('search', parser.parseMeta(this.metaList))
|
||||||
} else {
|
} else {
|
||||||
// TODO 错误提示
|
this.$message.error(handleErrorTip(errorList[0]))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.$emit('search', { q: '', str: '', metaList: [] })
|
this.$emit('search', { q: '', str: '', metaList: [] })
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import CodeMirror from 'codemirror'
|
|||||||
import { toRaw } from 'vue'
|
import { toRaw } from 'vue'
|
||||||
import _ from 'lodash'
|
import _ from 'lodash'
|
||||||
import { columnType } from '@/components/advancedSearch/meta/meta'
|
import { columnType } from '@/components/advancedSearch/meta/meta'
|
||||||
|
import {handleErrorTip} from "@/components/advancedSearch/meta/error";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'TextMode',
|
name: 'TextMode',
|
||||||
@@ -56,7 +57,7 @@ export default {
|
|||||||
if (_.isEmpty(errorList)) {
|
if (_.isEmpty(errorList)) {
|
||||||
this.$emit('search', parser.parseStr(str))
|
this.$emit('search', parser.parseStr(str))
|
||||||
} else {
|
} else {
|
||||||
// TODO 错误提示
|
this.$message.error(handleErrorTip(errorList[0]))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.$emit('search', { q: '', str: '', metaList: [] })
|
this.$emit('search', { q: '', str: '', metaList: [] })
|
||||||
@@ -71,9 +72,12 @@ export default {
|
|||||||
const parser = new Parser(this.columnList)
|
const parser = new Parser(this.columnList)
|
||||||
const errorList = parser.validateStr(str)
|
const errorList = parser.validateStr(str)
|
||||||
if (_.isEmpty(errorList)) {
|
if (_.isEmpty(errorList)) {
|
||||||
this.$emit('changeMode', 'tag', parser.parseStr(str))
|
const metaList = parser.parseStr(str)
|
||||||
|
console.info(metaList)
|
||||||
|
this.$emit('changeMode', 'tag', metaList)
|
||||||
} else {
|
} else {
|
||||||
this.$emit('changeMode', 'tag', { metaList: [], str: '' })
|
this.$emit('changeMode', 'tag', { metaList: [], str: '' })
|
||||||
|
console.info(errorList)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.$emit('changeMode', 'tag', { str: '', metaList: [] })
|
this.$emit('changeMode', 'tag', { str: '', metaList: [] })
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import i18n from '@/i18n'
|
||||||
export const errorTypes = {
|
export const errorTypes = {
|
||||||
illegalChar: 'parse.errorTip.illegalChar', // 非法字符
|
illegalChar: 'parse.errorTip.illegalChar', // 非法字符
|
||||||
syntaxError: 'parse.errorTip.syntaxError', // 语法错误,此i18n内容有占位符
|
syntaxError: 'parse.errorTip.syntaxError', // 语法错误,此i18n内容有占位符
|
||||||
@@ -15,9 +16,13 @@ export const errorDesc = {
|
|||||||
},
|
},
|
||||||
typeError: {
|
typeError: {
|
||||||
str: 'parse.errorTip.typeError.expectString', // Expected parameter type is string
|
str: 'parse.errorTip.typeError.expectString', // Expected parameter type is string
|
||||||
|
number: 'parse.errorTip.typeError.expectNumber', // Expected parameter type is number
|
||||||
meta: 'parse.errorTip.typeError.expectMetaArray' // Expected parameter type is Meta array
|
meta: 'parse.errorTip.typeError.expectMetaArray' // Expected parameter type is Meta array
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
export function handleErrorTip (error) {
|
||||||
|
return i18n.global.t(error.type) + ': ' + i18n.global.t(error.desc) + ', at index ' + error.index
|
||||||
|
}
|
||||||
export default class ParserError {
|
export default class ParserError {
|
||||||
constructor (index, type, desc) {
|
constructor (index, type, desc) {
|
||||||
this.index = index
|
this.index = index
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ export default class Meta {
|
|||||||
if (this.meta === condition) {
|
if (this.meta === condition) {
|
||||||
return (this.column.type === columnType.fullText)
|
return (this.column.type === columnType.fullText)
|
||||||
? !_.isEmpty(this.column.name)
|
? !_.isEmpty(this.column.name)
|
||||||
: !_.isEmpty(this.column.name) && !_.isEmpty(this.operator.value) && !_.isEmpty(this.value.value)
|
: !_.isEmpty(this.column.name) && !_.isEmpty(this.operator.value) && (!_.isEmpty(this.value.value) || (_.isNumber(this.value.value) && !_.isNaN(this.value.value)))
|
||||||
} else if (this.meta === connection) {
|
} else if (this.meta === connection) {
|
||||||
return !!this.value
|
return !!this.value
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import Meta, { connection, condition, columnType } from './meta'
|
import Meta, { connection, condition, columnType } from './meta'
|
||||||
import Token, { types } from './token'
|
import Token, { types } from './token'
|
||||||
import ParserError, { errorTypes, errorDesc } from '@/components/advancedSearch/meta/error'
|
import ParserError, { errorTypes, errorDesc } from '@/components/advancedSearch/meta/error'
|
||||||
|
import _ from 'lodash'
|
||||||
|
|
||||||
const strReg = {
|
const strReg = {
|
||||||
all: /^[\da-zA-Z\s.'><!=-_(),%]$/,
|
all: /^[\da-zA-Z\s.'><!=-_(),%]$/,
|
||||||
@@ -96,6 +97,13 @@ export default class Parser {
|
|||||||
} else {
|
} else {
|
||||||
str += `${meta.column.name}${meta.operator.value}'${meta.value.value}' `
|
str += `${meta.column.name}${meta.operator.value}'${meta.value.value}' `
|
||||||
}
|
}
|
||||||
|
} else if (meta.column.type === columnType.number) {
|
||||||
|
if (_.isNumber(Number(meta.value.value))) {
|
||||||
|
str += `${meta.column.name}${meta.operator.value}${meta.value.value} `
|
||||||
|
} else {
|
||||||
|
this.errorList.push(new ParserError(i, errorTypes.typeError, errorDesc.typeError.number))
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -136,6 +144,10 @@ export default class Parser {
|
|||||||
} else {
|
} else {
|
||||||
str += `${meta.column.name}${meta.operator.value}'${meta.value.value}' `
|
str += `${meta.column.name}${meta.operator.value}'${meta.value.value}' `
|
||||||
}
|
}
|
||||||
|
} else if (meta.column.type === columnType.number) {
|
||||||
|
if (_.isNumber(Number(meta.value.value))) {
|
||||||
|
str += `${meta.column.name}${meta.operator.value}${meta.value.value} `
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -555,7 +567,6 @@ export default class Parser {
|
|||||||
if (isInApostrophe) {
|
if (isInApostrophe) {
|
||||||
if (meta.column.name) {
|
if (meta.column.name) {
|
||||||
meta.value.value = token.value
|
meta.value.value = token.value
|
||||||
meta.value.type = columnType.string
|
|
||||||
meta.column.type = columnType.string
|
meta.column.type = columnType.string
|
||||||
} else {
|
} else {
|
||||||
meta.column.type = columnType.fullText
|
meta.column.type = columnType.fullText
|
||||||
@@ -589,7 +600,6 @@ export default class Parser {
|
|||||||
if (isInApostrophe) {
|
if (isInApostrophe) {
|
||||||
if (prevToken && prevToken.prevToken && [types.commonOperator, types.letterOperator].indexOf(prevToken.prevToken.type) > -1) {
|
if (prevToken && prevToken.prevToken && [types.commonOperator, types.letterOperator].indexOf(prevToken.prevToken.type) > -1) {
|
||||||
meta.value.value = token.value
|
meta.value.value = token.value
|
||||||
meta.value.type = columnType.string
|
|
||||||
meta.column.type = columnType.string
|
meta.column.type = columnType.string
|
||||||
} else if (prevToken && (!prevToken.prevToken || prevToken.prevToken.type === types.connection)) {
|
} else if (prevToken && (!prevToken.prevToken || prevToken.prevToken.type === types.connection)) {
|
||||||
meta.column.type = columnType.fullText
|
meta.column.type = columnType.fullText
|
||||||
@@ -606,9 +616,19 @@ export default class Parser {
|
|||||||
if (prevToken) {
|
if (prevToken) {
|
||||||
// 前面是操作符,则是普通value;前面是连接符,是全文搜索
|
// 前面是操作符,则是普通value;前面是连接符,是全文搜索
|
||||||
if ([types.commonOperator, types.letterOperator].indexOf(prevToken.type) > -1) {
|
if ([types.commonOperator, types.letterOperator].indexOf(prevToken.type) > -1) {
|
||||||
meta.value.value = token.value
|
// 大于、小于号限制为number
|
||||||
meta.value.type = columnType.string
|
if (['>', '<', '>=', '<='].indexOf(prevToken.value) > -1) {
|
||||||
meta.column.type = columnType.string
|
if (_.isNumber(Number(token.value))) {
|
||||||
|
meta.column.type = columnType.number
|
||||||
|
meta.value.value = Number(token.value)
|
||||||
|
} else {
|
||||||
|
errorList.push(new ParserError(token.end, errorTypes.typeError, errorDesc.typeError.number))
|
||||||
|
break
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
meta.column.type = columnType.string
|
||||||
|
meta.value.value = token.value
|
||||||
|
}
|
||||||
} else if (prevToken.type === types.connection) {
|
} else if (prevToken.type === types.connection) {
|
||||||
meta.column.name = token.value
|
meta.column.name = token.value
|
||||||
meta.column.type = columnType.fullText
|
meta.column.type = columnType.fullText
|
||||||
|
|||||||
@@ -428,13 +428,13 @@ export default {
|
|||||||
if (entityTypeMeta && entityTypeMeta.operator.value === '=') {
|
if (entityTypeMeta && entityTypeMeta.operator.value === '=') {
|
||||||
let entityType = ''
|
let entityType = ''
|
||||||
this.limitFilterType = false
|
this.limitFilterType = false
|
||||||
if (entityTypeMeta.value.value.toLowerCase() === "'ip'") {
|
if (entityTypeMeta.value.value.toLowerCase() === 'ip') {
|
||||||
this.limitFilterType = true
|
this.limitFilterType = true
|
||||||
entityType = 'ip'
|
entityType = 'ip'
|
||||||
} else if (entityTypeMeta.value.value.toLowerCase() === "'domain'") {
|
} else if (entityTypeMeta.value.value.toLowerCase() === 'domain') {
|
||||||
this.limitFilterType = true
|
this.limitFilterType = true
|
||||||
entityType = 'domain'
|
entityType = 'domain'
|
||||||
} else if (entityTypeMeta.value.value.toLowerCase() === "'app'") {
|
} else if (entityTypeMeta.value.value.toLowerCase() === 'app') {
|
||||||
this.limitFilterType = true
|
this.limitFilterType = true
|
||||||
entityType = 'app'
|
entityType = 'app'
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user