|
|
|
@ -127,7 +127,7 @@ |
|
|
|
</template> |
|
|
|
|
|
|
|
<script> |
|
|
|
import { parseElementCombination } from '@/utils/elementCombination' |
|
|
|
import { parseElementCombination, getElementReference, getElementReferenceKey } from '@/utils/elementCombination' |
|
|
|
|
|
|
|
let nextElementId = 0 |
|
|
|
|
|
|
|
@ -154,6 +154,7 @@ export default { |
|
|
|
selectedElements: [], |
|
|
|
separator: '-', |
|
|
|
originalReferences: [], |
|
|
|
originalSelectedElementIds: [], |
|
|
|
originalCombinationData: '', |
|
|
|
originalSeparator: '-' |
|
|
|
} |
|
|
|
@ -205,9 +206,14 @@ export default { |
|
|
|
this.selectedElements = references.map((reference, index) => { |
|
|
|
const savedId = savedConfig && savedConfig.selectedElements && savedConfig.selectedElements[index] |
|
|
|
const candidates = this.allElements.filter(element => element !== this.targetElement && element.type === reference.type) |
|
|
|
const source = (savedId != null && candidates.find(element => element.id === savedId)) || |
|
|
|
candidates.find(element => this.getElementFullName(element) === reference.reference) || |
|
|
|
(reference.data === undefined && candidates[0]) |
|
|
|
// 显式身份未命中表示来源已删除,不能串用同名元素的公式。 |
|
|
|
const matches = candidates.filter(element => reference.data === undefined || this.getElementFullName(element) === reference.reference) |
|
|
|
const source = reference.elementKey !== undefined |
|
|
|
? candidates.find(element => getElementReferenceKey(element) === reference.elementKey) |
|
|
|
: savedId != null |
|
|
|
? candidates.find(element => element.id === savedId) |
|
|
|
// 历史同名引用未记录身份时不能猜测来源,保留引用,待用户重新选择。 |
|
|
|
: matches.length === 1 ? matches[0] : null |
|
|
|
// 来源已删除时保留原引用,避免打开后直接确定就悄悄丢失内容。 |
|
|
|
return source || { |
|
|
|
id: `missing_${index}`, |
|
|
|
@ -217,6 +223,8 @@ export default { |
|
|
|
} |
|
|
|
}) |
|
|
|
|
|
|
|
this.originalSelectedElementIds = this.selectedElements.map(element => element.id) |
|
|
|
|
|
|
|
if (savedConfig && savedConfig.separator != null) { |
|
|
|
this.separator = String(savedConfig.separator) |
|
|
|
} else if (references.length > 1) { |
|
|
|
@ -229,6 +237,7 @@ export default { |
|
|
|
this.selectedElements = [] |
|
|
|
this.separator = '-' |
|
|
|
this.originalReferences = [] |
|
|
|
this.originalSelectedElementIds = [] |
|
|
|
this.originalCombinationData = '' |
|
|
|
this.originalSeparator = '-' |
|
|
|
}, |
|
|
|
@ -378,13 +387,18 @@ export default { |
|
|
|
}, |
|
|
|
|
|
|
|
generateSequenceFormat() { |
|
|
|
const references = this.selectedElements.map(element => this.getElementFullName(element)) |
|
|
|
// 未改动时保持原组合字面内容(含手工插入的不同间隔文字),确认不会重写或重复追加。 |
|
|
|
const references = this.selectedElements.map(element => getElementReference(element)) |
|
|
|
// 保留原有间隔文字,同时为每个引用写入独立身份;重排同名元素也能生效。 |
|
|
|
if (this.originalReferences && this.originalReferences.length > 0 && |
|
|
|
this.separator === this.originalSeparator && |
|
|
|
references.length === this.originalReferences.length && |
|
|
|
references.every((reference, index) => reference === this.originalReferences[index])) { |
|
|
|
return this.originalCombinationData |
|
|
|
this.selectedElements.every((element, index) => element.id === this.originalSelectedElementIds[index])) { |
|
|
|
const original = parseElementCombination(this.originalCombinationData) |
|
|
|
let result = this.originalCombinationData |
|
|
|
for (let index = original.length - 1; index >= 0; index--) { |
|
|
|
result = result.slice(0, original[index].start) + `{${references[index]}}` + result.slice(original[index].end) |
|
|
|
} |
|
|
|
return result |
|
|
|
} |
|
|
|
return references.map(reference => `{${reference}}`).join(this.separator || '') |
|
|
|
} |
|
|
|
|