fix: preserve advanced snmp oid json fields
This commit is contained in:
@@ -314,6 +314,8 @@ const createEmptySnmpOidRow = (): SnmpOidRow => ({
|
|||||||
type: '',
|
type: '',
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const snmpOidTableFields = ['oid', 'metric_name', 'metric_unit', 'type']
|
||||||
|
|
||||||
const normalizeSnmpOidRows = (rows: SnmpOidRow[]) =>
|
const normalizeSnmpOidRows = (rows: SnmpOidRow[]) =>
|
||||||
rows
|
rows
|
||||||
.map((row) => ({
|
.map((row) => ({
|
||||||
@@ -337,6 +339,28 @@ const findIncompleteSnmpOidRowIndex = (rows: SnmpOidRow[]) =>
|
|||||||
return Boolean(hasAnyValue && (!normalizedRow.oid || !normalizedRow.metric_name))
|
return Boolean(hasAnyValue && (!normalizedRow.oid || !normalizedRow.metric_name))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const parseSnmpOidJsonArray = (raw: string) => {
|
||||||
|
const text = raw.trim()
|
||||||
|
if (!text) {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
const parsed = JSON.parse(text)
|
||||||
|
if (!Array.isArray(parsed)) {
|
||||||
|
throw new Error('SNMP OID 配置必须是 JSON 数组')
|
||||||
|
}
|
||||||
|
return parsed
|
||||||
|
}
|
||||||
|
|
||||||
|
const hasSnmpOidTableUnsupportedFields = (raw: string) => {
|
||||||
|
const rows = parseSnmpOidJsonArray(raw)
|
||||||
|
return rows.some((item) => {
|
||||||
|
if (!item || typeof item !== 'object' || Array.isArray(item)) {
|
||||||
|
return Boolean(item)
|
||||||
|
}
|
||||||
|
return Object.keys(item).some((key) => !snmpOidTableFields.includes(key))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
const stringifySnmpOidRows = (rows: SnmpOidRow[]) => {
|
const stringifySnmpOidRows = (rows: SnmpOidRow[]) => {
|
||||||
const normalizedRows = normalizeSnmpOidRows(rows)
|
const normalizedRows = normalizeSnmpOidRows(rows)
|
||||||
return normalizedRows.length ? JSON.stringify(normalizedRows, null, 2) : ''
|
return normalizedRows.length ? JSON.stringify(normalizedRows, null, 2) : ''
|
||||||
@@ -347,10 +371,7 @@ const parseSnmpOidRows = (raw: string): SnmpOidRow[] => {
|
|||||||
if (!text) {
|
if (!text) {
|
||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
const parsed = JSON.parse(text)
|
const parsed = parseSnmpOidJsonArray(text)
|
||||||
if (!Array.isArray(parsed)) {
|
|
||||||
throw new Error('SNMP OID 配置必须是 JSON 数组')
|
|
||||||
}
|
|
||||||
return parsed.map((item) => ({
|
return parsed.map((item) => ({
|
||||||
oid: String(item?.oid ?? '').trim(),
|
oid: String(item?.oid ?? '').trim(),
|
||||||
metric_name: String(item?.metric_name ?? '').trim(),
|
metric_name: String(item?.metric_name ?? '').trim(),
|
||||||
@@ -432,7 +453,12 @@ watch(
|
|||||||
})
|
})
|
||||||
snmpOidEditMode.value = 'table'
|
snmpOidEditMode.value = 'table'
|
||||||
try {
|
try {
|
||||||
syncSnmpOidRowsFromJson()
|
if (hasSnmpOidTableUnsupportedFields(formData.snmp_oids || '')) {
|
||||||
|
snmpOidEditMode.value = 'json'
|
||||||
|
snmpOidRows.value = []
|
||||||
|
} else {
|
||||||
|
syncSnmpOidRowsFromJson()
|
||||||
|
}
|
||||||
} catch {
|
} catch {
|
||||||
snmpOidEditMode.value = 'json'
|
snmpOidEditMode.value = 'json'
|
||||||
snmpOidRows.value = []
|
snmpOidRows.value = []
|
||||||
@@ -495,6 +521,10 @@ const switchSnmpOidEditMode = () => {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
if (hasSnmpOidTableUnsupportedFields(formData.snmp_oids)) {
|
||||||
|
Message.warning('当前 SNMP OID JSON 包含表格不支持的字段,请在 JSON 模式下编辑')
|
||||||
|
return
|
||||||
|
}
|
||||||
syncSnmpOidRowsFromJson()
|
syncSnmpOidRowsFromJson()
|
||||||
snmpOidEditMode.value = 'table'
|
snmpOidEditMode.value = 'table'
|
||||||
} catch {
|
} catch {
|
||||||
@@ -521,6 +551,7 @@ const validateSnmpOidConfigBeforeSubmit = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
const parsedRows = parseSnmpOidJsonArray(formData.snmp_oids)
|
||||||
const rows = parseSnmpOidRows(formData.snmp_oids)
|
const rows = parseSnmpOidRows(formData.snmp_oids)
|
||||||
const invalidIndex = findIncompleteSnmpOidRowIndex(rows)
|
const invalidIndex = findIncompleteSnmpOidRowIndex(rows)
|
||||||
if (invalidIndex >= 0) {
|
if (invalidIndex >= 0) {
|
||||||
@@ -529,7 +560,7 @@ const validateSnmpOidConfigBeforeSubmit = () => {
|
|||||||
}
|
}
|
||||||
const normalizedRows = normalizeSnmpOidRows(rows)
|
const normalizedRows = normalizeSnmpOidRows(rows)
|
||||||
snmpOidRows.value = normalizedRows
|
snmpOidRows.value = normalizedRows
|
||||||
formData.snmp_oids = normalizedRows.length ? JSON.stringify(normalizedRows, null, 2) : ''
|
formData.snmp_oids = JSON.stringify(parsedRows, null, 2)
|
||||||
return true
|
return true
|
||||||
} catch {
|
} catch {
|
||||||
Message.warning('SNMP OID 配置必须是合法 JSON 数组')
|
Message.warning('SNMP OID 配置必须是合法 JSON 数组')
|
||||||
|
|||||||
Reference in New Issue
Block a user