mirror of
https://github.com/yudaocode/yudao-ui-admin-vue3.git
synced 2026-04-19 13:08:39 +00:00
Merge pull request #204 from zhanglc0618/fix/lost-properties
fix: 【bpm】bpmn设计器: 组件部分属性第一次失去焦点丢失数据问题
This commit is contained in:
@@ -282,7 +282,6 @@ const editingListenerIndex = ref(-1) // 监听器所在下标,-1 为新增
|
|||||||
const editingListenerFieldIndex = ref(-1) // 字段所在下标,-1 为新增
|
const editingListenerFieldIndex = ref(-1) // 字段所在下标,-1 为新增
|
||||||
const listenerTypeObject = ref(listenerType)
|
const listenerTypeObject = ref(listenerType)
|
||||||
const fieldTypeObject = ref(fieldType)
|
const fieldTypeObject = ref(fieldType)
|
||||||
const bpmnElement = ref()
|
|
||||||
const otherExtensionList = ref()
|
const otherExtensionList = ref()
|
||||||
const bpmnElementListeners = ref()
|
const bpmnElementListeners = ref()
|
||||||
const listenerFormRef = ref()
|
const listenerFormRef = ref()
|
||||||
@@ -290,13 +289,19 @@ const listenerFieldFormRef = ref()
|
|||||||
const bpmnInstances = () => (window as any)?.bpmnInstances
|
const bpmnInstances = () => (window as any)?.bpmnInstances
|
||||||
|
|
||||||
const resetListenersList = () => {
|
const resetListenersList = () => {
|
||||||
bpmnElement.value = bpmnInstances().bpmnElement
|
const instances = bpmnInstances()
|
||||||
|
if (!instances || !instances.bpmnElement) return
|
||||||
|
|
||||||
|
// 直接使用原始BPMN元素,避免Vue响应式代理问题
|
||||||
|
const bpmnElement = instances.bpmnElement
|
||||||
|
const businessObject = bpmnElement.businessObject
|
||||||
|
|
||||||
otherExtensionList.value =
|
otherExtensionList.value =
|
||||||
bpmnElement.value.businessObject?.extensionElements?.values?.filter(
|
businessObject?.extensionElements?.values?.filter(
|
||||||
(ex) => ex.$type !== `${prefix}:ExecutionListener`
|
(ex) => ex.$type !== `${prefix}:ExecutionListener`
|
||||||
) ?? [] // 保留非监听器类型的扩展属性,避免移除监听器时清空其他配置(如审批人等)。相关案例:https://gitee.com/yudaocode/yudao-ui-admin-vue3/issues/ICMSYC
|
) ?? [] // 保留非监听器类型的扩展属性,避免移除监听器时清空其他配置(如审批人等)。相关案例:https://gitee.com/yudaocode/yudao-ui-admin-vue3/issues/ICMSYC
|
||||||
bpmnElementListeners.value =
|
bpmnElementListeners.value =
|
||||||
bpmnElement.value.businessObject?.extensionElements?.values?.filter(
|
businessObject?.extensionElements?.values?.filter(
|
||||||
(ex) => ex.$type === `${prefix}:ExecutionListener`
|
(ex) => ex.$type === `${prefix}:ExecutionListener`
|
||||||
) ?? []
|
) ?? []
|
||||||
elementListenersList.value = bpmnElementListeners.value.map((listener) =>
|
elementListenersList.value = bpmnElementListeners.value.map((listener) =>
|
||||||
@@ -378,10 +383,13 @@ const removeListener = (index) => {
|
|||||||
cancelButtonText: '取 消'
|
cancelButtonText: '取 消'
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
|
const instances = bpmnInstances()
|
||||||
|
if (!instances || !instances.bpmnElement) return
|
||||||
|
|
||||||
bpmnElementListeners.value.splice(index, 1)
|
bpmnElementListeners.value.splice(index, 1)
|
||||||
elementListenersList.value.splice(index, 1)
|
elementListenersList.value.splice(index, 1)
|
||||||
updateElementExtensions(
|
updateElementExtensions(
|
||||||
bpmnElement.value,
|
instances.bpmnElement,
|
||||||
otherExtensionList.value.concat(bpmnElementListeners.value)
|
otherExtensionList.value.concat(bpmnElementListeners.value)
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@@ -392,7 +400,13 @@ const saveListenerConfig = async () => {
|
|||||||
// debugger
|
// debugger
|
||||||
let validateStatus = await listenerFormRef.value.validate()
|
let validateStatus = await listenerFormRef.value.validate()
|
||||||
if (!validateStatus) return // 验证不通过直接返回
|
if (!validateStatus) return // 验证不通过直接返回
|
||||||
|
|
||||||
|
const instances = bpmnInstances()
|
||||||
|
if (!instances || !instances.bpmnElement) return
|
||||||
|
|
||||||
|
const bpmnElement = instances.bpmnElement
|
||||||
const listenerObject = createListenerObject(listenerForm.value, false, prefix)
|
const listenerObject = createListenerObject(listenerForm.value, false, prefix)
|
||||||
|
|
||||||
if (editingListenerIndex.value === -1) {
|
if (editingListenerIndex.value === -1) {
|
||||||
bpmnElementListeners.value.push(listenerObject)
|
bpmnElementListeners.value.push(listenerObject)
|
||||||
elementListenersList.value.push(listenerForm.value)
|
elementListenersList.value.push(listenerForm.value)
|
||||||
@@ -402,11 +416,11 @@ const saveListenerConfig = async () => {
|
|||||||
}
|
}
|
||||||
// 保存其他配置
|
// 保存其他配置
|
||||||
otherExtensionList.value =
|
otherExtensionList.value =
|
||||||
bpmnElement.value.businessObject?.extensionElements?.values?.filter(
|
bpmnElement.businessObject?.extensionElements?.values?.filter(
|
||||||
(ex) => ex.$type !== `${prefix}:ExecutionListener`
|
(ex) => ex.$type !== `${prefix}:ExecutionListener`
|
||||||
) ?? []
|
) ?? []
|
||||||
updateElementExtensions(
|
updateElementExtensions(
|
||||||
bpmnElement.value,
|
bpmnElement,
|
||||||
otherExtensionList.value.concat(bpmnElementListeners.value)
|
otherExtensionList.value.concat(bpmnElementListeners.value)
|
||||||
)
|
)
|
||||||
// 4. 隐藏侧边栏
|
// 4. 隐藏侧边栏
|
||||||
@@ -420,6 +434,10 @@ const openProcessListenerDialog = async () => {
|
|||||||
processListenerDialogRef.value.open('execution')
|
processListenerDialogRef.value.open('execution')
|
||||||
}
|
}
|
||||||
const selectProcessListener = (listener) => {
|
const selectProcessListener = (listener) => {
|
||||||
|
const instances = bpmnInstances()
|
||||||
|
if (!instances || !instances.bpmnElement) return
|
||||||
|
|
||||||
|
const bpmnElement = instances.bpmnElement
|
||||||
const listenerForm = initListenerForm2(listener)
|
const listenerForm = initListenerForm2(listener)
|
||||||
const listenerObject = createListenerObject(listenerForm, false, prefix)
|
const listenerObject = createListenerObject(listenerForm, false, prefix)
|
||||||
bpmnElementListeners.value.push(listenerObject)
|
bpmnElementListeners.value.push(listenerObject)
|
||||||
@@ -427,11 +445,11 @@ const selectProcessListener = (listener) => {
|
|||||||
|
|
||||||
// 保存其他配置
|
// 保存其他配置
|
||||||
otherExtensionList.value =
|
otherExtensionList.value =
|
||||||
bpmnElement.value.businessObject?.extensionElements?.values?.filter(
|
bpmnElement.businessObject?.extensionElements?.values?.filter(
|
||||||
(ex) => ex.$type !== `${prefix}:ExecutionListener`
|
(ex) => ex.$type !== `${prefix}:ExecutionListener`
|
||||||
) ?? []
|
) ?? []
|
||||||
updateElementExtensions(
|
updateElementExtensions(
|
||||||
bpmnElement.value,
|
bpmnElement,
|
||||||
otherExtensionList.value.concat(bpmnElementListeners.value)
|
otherExtensionList.value.concat(bpmnElementListeners.value)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -329,7 +329,6 @@ const listenerFieldFormModelVisible = ref(false) // 监听器 注入字段表单
|
|||||||
const editingListenerIndex = ref(-1) // 监听器所在下标,-1 为新增
|
const editingListenerIndex = ref(-1) // 监听器所在下标,-1 为新增
|
||||||
const editingListenerFieldIndex = ref(-1) // 字段所在下标,-1 为新增
|
const editingListenerFieldIndex = ref(-1) // 字段所在下标,-1 为新增
|
||||||
const listenerFieldForm = ref<any>({}) // 监听器 注入字段 详情表单
|
const listenerFieldForm = ref<any>({}) // 监听器 注入字段 详情表单
|
||||||
const bpmnElement = ref()
|
|
||||||
const bpmnElementListeners = ref()
|
const bpmnElementListeners = ref()
|
||||||
const otherExtensionList = ref()
|
const otherExtensionList = ref()
|
||||||
const listenerFormRef = ref()
|
const listenerFormRef = ref()
|
||||||
@@ -337,17 +336,21 @@ const listenerFieldFormRef = ref()
|
|||||||
const bpmnInstances = () => (window as any)?.bpmnInstances
|
const bpmnInstances = () => (window as any)?.bpmnInstances
|
||||||
|
|
||||||
const resetListenersList = () => {
|
const resetListenersList = () => {
|
||||||
console.log(
|
const instances = bpmnInstances()
|
||||||
bpmnInstances().bpmnElement,
|
if (!instances || !instances.bpmnElement) return
|
||||||
'window.bpmnInstances.bpmnElementwindow.bpmnInstances.bpmnElementwindow.bpmnInstances.bpmnElementwindow.bpmnInstances.bpmnElementwindow.bpmnInstances.bpmnElementwindow.bpmnInstances.bpmnElement'
|
|
||||||
)
|
// 直接使用原始BPMN元素,避免Vue响应式代理问题
|
||||||
bpmnElement.value = bpmnInstances().bpmnElement
|
const bpmnElement = instances.bpmnElement
|
||||||
|
const businessObject = bpmnElement.businessObject
|
||||||
|
|
||||||
|
console.log(bpmnElement, 'bpmnElement - resetListenersList')
|
||||||
|
|
||||||
otherExtensionList.value =
|
otherExtensionList.value =
|
||||||
bpmnElement.value.businessObject?.extensionElements?.values?.filter(
|
businessObject?.extensionElements?.values?.filter(
|
||||||
(ex) => ex.$type !== `${prefix}:TaskListener`
|
(ex) => ex.$type !== `${prefix}:TaskListener`
|
||||||
) ?? [] // 保留非监听器类型的扩展属性,避免移除监听器时清空其他配置(如审批人等)。相关案例:https://gitee.com/yudaocode/yudao-ui-admin-vue3/issues/ICMSYC
|
) ?? [] // 保留非监听器类型的扩展属性,避免移除监听器时清空其他配置(如审批人等)。相关案例:https://gitee.com/yudaocode/yudao-ui-admin-vue3/issues/ICMSYC
|
||||||
bpmnElementListeners.value =
|
bpmnElementListeners.value =
|
||||||
bpmnElement.value.businessObject?.extensionElements?.values?.filter(
|
businessObject?.extensionElements?.values?.filter(
|
||||||
(ex) => ex.$type === `${prefix}:TaskListener`
|
(ex) => ex.$type === `${prefix}:TaskListener`
|
||||||
) ?? []
|
) ?? []
|
||||||
elementListenersList.value = bpmnElementListeners.value.map((listener) =>
|
elementListenersList.value = bpmnElementListeners.value.map((listener) =>
|
||||||
@@ -385,10 +388,13 @@ const removeListener = (listener, index?) => {
|
|||||||
cancelButtonText: '取 消'
|
cancelButtonText: '取 消'
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
|
const instances = bpmnInstances()
|
||||||
|
if (!instances || !instances.bpmnElement) return
|
||||||
|
|
||||||
bpmnElementListeners.value.splice(index, 1)
|
bpmnElementListeners.value.splice(index, 1)
|
||||||
elementListenersList.value.splice(index, 1)
|
elementListenersList.value.splice(index, 1)
|
||||||
updateElementExtensions(
|
updateElementExtensions(
|
||||||
bpmnElement.value,
|
instances.bpmnElement,
|
||||||
otherExtensionList.value.concat(bpmnElementListeners.value)
|
otherExtensionList.value.concat(bpmnElementListeners.value)
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@@ -398,7 +404,13 @@ const removeListener = (listener, index?) => {
|
|||||||
const saveListenerConfig = async () => {
|
const saveListenerConfig = async () => {
|
||||||
let validateStatus = await listenerFormRef.value.validate()
|
let validateStatus = await listenerFormRef.value.validate()
|
||||||
if (!validateStatus) return // 验证不通过直接返回
|
if (!validateStatus) return // 验证不通过直接返回
|
||||||
|
|
||||||
|
const instances = bpmnInstances()
|
||||||
|
if (!instances || !instances.bpmnElement) return
|
||||||
|
|
||||||
|
const bpmnElement = instances.bpmnElement
|
||||||
const listenerObject = createListenerObject(listenerForm.value, true, prefix)
|
const listenerObject = createListenerObject(listenerForm.value, true, prefix)
|
||||||
|
|
||||||
if (editingListenerIndex.value === -1) {
|
if (editingListenerIndex.value === -1) {
|
||||||
bpmnElementListeners.value.push(listenerObject)
|
bpmnElementListeners.value.push(listenerObject)
|
||||||
elementListenersList.value.push(listenerForm.value)
|
elementListenersList.value.push(listenerForm.value)
|
||||||
@@ -408,11 +420,11 @@ const saveListenerConfig = async () => {
|
|||||||
}
|
}
|
||||||
// 保存其他配置
|
// 保存其他配置
|
||||||
otherExtensionList.value =
|
otherExtensionList.value =
|
||||||
bpmnElement.value.businessObject?.extensionElements?.values?.filter(
|
bpmnElement.businessObject?.extensionElements?.values?.filter(
|
||||||
(ex) => ex.$type !== `${prefix}:TaskListener`
|
(ex) => ex.$type !== `${prefix}:TaskListener`
|
||||||
) ?? []
|
) ?? []
|
||||||
updateElementExtensions(
|
updateElementExtensions(
|
||||||
bpmnElement.value,
|
bpmnElement,
|
||||||
otherExtensionList.value.concat(bpmnElementListeners.value)
|
otherExtensionList.value.concat(bpmnElementListeners.value)
|
||||||
)
|
)
|
||||||
// 4. 隐藏侧边栏
|
// 4. 隐藏侧边栏
|
||||||
@@ -464,6 +476,10 @@ const openProcessListenerDialog = async () => {
|
|||||||
processListenerDialogRef.value.open('task')
|
processListenerDialogRef.value.open('task')
|
||||||
}
|
}
|
||||||
const selectProcessListener = (listener) => {
|
const selectProcessListener = (listener) => {
|
||||||
|
const instances = bpmnInstances()
|
||||||
|
if (!instances || !instances.bpmnElement) return
|
||||||
|
|
||||||
|
const bpmnElement = instances.bpmnElement
|
||||||
const listenerForm = initListenerForm2(listener)
|
const listenerForm = initListenerForm2(listener)
|
||||||
const listenerObject = createListenerObject(listenerForm, true, prefix)
|
const listenerObject = createListenerObject(listenerForm, true, prefix)
|
||||||
bpmnElementListeners.value.push(listenerObject)
|
bpmnElementListeners.value.push(listenerObject)
|
||||||
@@ -471,11 +487,11 @@ const selectProcessListener = (listener) => {
|
|||||||
|
|
||||||
// 保存其他配置
|
// 保存其他配置
|
||||||
otherExtensionList.value =
|
otherExtensionList.value =
|
||||||
bpmnElement.value.businessObject?.extensionElements?.values?.filter(
|
bpmnElement.businessObject?.extensionElements?.values?.filter(
|
||||||
(ex) => ex.$type !== `${prefix}:TaskListener`
|
(ex) => ex.$type !== `${prefix}:TaskListener`
|
||||||
) ?? []
|
) ?? []
|
||||||
updateElementExtensions(
|
updateElementExtensions(
|
||||||
bpmnElement.value,
|
bpmnElement,
|
||||||
otherExtensionList.value.concat(bpmnElementListeners.value)
|
otherExtensionList.value.concat(bpmnElementListeners.value)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,7 +67,6 @@ const elementPropertyList = ref<any[]>([])
|
|||||||
const propertyForm = ref<any>({})
|
const propertyForm = ref<any>({})
|
||||||
const editingPropertyIndex = ref(-1)
|
const editingPropertyIndex = ref(-1)
|
||||||
const propertyFormModelVisible = ref(false)
|
const propertyFormModelVisible = ref(false)
|
||||||
const bpmnElement = ref()
|
|
||||||
const otherExtensionList = ref()
|
const otherExtensionList = ref()
|
||||||
const bpmnElementProperties = ref()
|
const bpmnElementProperties = ref()
|
||||||
const bpmnElementPropertyList = ref()
|
const bpmnElementPropertyList = ref()
|
||||||
@@ -75,16 +74,21 @@ const attributeFormRef = ref()
|
|||||||
const bpmnInstances = () => (window as any)?.bpmnInstances
|
const bpmnInstances = () => (window as any)?.bpmnInstances
|
||||||
|
|
||||||
const resetAttributesList = () => {
|
const resetAttributesList = () => {
|
||||||
bpmnElement.value = bpmnInstances().bpmnElement
|
const instances = bpmnInstances()
|
||||||
|
if (!instances || !instances.bpmnElement) return
|
||||||
|
|
||||||
|
// 直接使用原始BPMN元素,避免Vue响应式代理问题
|
||||||
|
const bpmnElement = instances.bpmnElement
|
||||||
|
const businessObject = bpmnElement.businessObject
|
||||||
|
|
||||||
otherExtensionList.value = [] // 其他扩展配置
|
otherExtensionList.value = [] // 其他扩展配置
|
||||||
bpmnElementProperties.value =
|
bpmnElementProperties.value =
|
||||||
// bpmnElement.value.businessObject?.extensionElements?.filter((ex) => {
|
businessObject?.extensionElements?.values?.filter((ex) => {
|
||||||
bpmnElement.value.businessObject?.extensionElements?.values?.filter((ex) => {
|
|
||||||
if (ex.$type !== `${prefix}:Properties`) {
|
if (ex.$type !== `${prefix}:Properties`) {
|
||||||
otherExtensionList.value.push(ex)
|
otherExtensionList.value.push(ex)
|
||||||
}
|
}
|
||||||
return ex.$type === `${prefix}:Properties`
|
return ex.$type === `${prefix}:Properties`
|
||||||
}) ?? [];
|
}) ?? []
|
||||||
|
|
||||||
// 保存所有的 扩展属性字段
|
// 保存所有的 扩展属性字段
|
||||||
bpmnElementPropertyList.value = bpmnElementProperties.value.reduce(
|
bpmnElementPropertyList.value = bpmnElementProperties.value.reduce(
|
||||||
@@ -123,10 +127,15 @@ const removeAttributes = (attr, index) => {
|
|||||||
const saveAttribute = () => {
|
const saveAttribute = () => {
|
||||||
console.log(propertyForm.value, 'propertyForm.value')
|
console.log(propertyForm.value, 'propertyForm.value')
|
||||||
const { name, value } = propertyForm.value
|
const { name, value } = propertyForm.value
|
||||||
|
const instances = bpmnInstances()
|
||||||
|
if (!instances || !instances.bpmnElement) return
|
||||||
|
|
||||||
|
const bpmnElement = instances.bpmnElement
|
||||||
|
|
||||||
if (editingPropertyIndex.value !== -1) {
|
if (editingPropertyIndex.value !== -1) {
|
||||||
bpmnInstances().modeling.updateModdleProperties(
|
instances.modeling.updateModdleProperties(
|
||||||
toRaw(bpmnElement.value),
|
bpmnElement,
|
||||||
toRaw(bpmnElementPropertyList.value)[toRaw(editingPropertyIndex.value)],
|
bpmnElementPropertyList.value[editingPropertyIndex.value],
|
||||||
{
|
{
|
||||||
name,
|
name,
|
||||||
value
|
value
|
||||||
@@ -134,12 +143,12 @@ const saveAttribute = () => {
|
|||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
// 新建属性字段
|
// 新建属性字段
|
||||||
const newPropertyObject = bpmnInstances().moddle.create(`${prefix}:Property`, {
|
const newPropertyObject = instances.moddle.create(`${prefix}:Property`, {
|
||||||
name,
|
name,
|
||||||
value
|
value
|
||||||
})
|
})
|
||||||
// 新建一个属性字段的保存列表
|
// 新建一个属性字段的保存列表
|
||||||
const propertiesObject = bpmnInstances().moddle.create(`${prefix}:Properties`, {
|
const propertiesObject = instances.moddle.create(`${prefix}:Properties`, {
|
||||||
values: bpmnElementPropertyList.value.concat([newPropertyObject])
|
values: bpmnElementPropertyList.value.concat([newPropertyObject])
|
||||||
})
|
})
|
||||||
updateElementExtensions(propertiesObject)
|
updateElementExtensions(propertiesObject)
|
||||||
@@ -148,10 +157,14 @@ const saveAttribute = () => {
|
|||||||
resetAttributesList()
|
resetAttributesList()
|
||||||
}
|
}
|
||||||
const updateElementExtensions = (properties) => {
|
const updateElementExtensions = (properties) => {
|
||||||
const extensions = bpmnInstances().moddle.create('bpmn:ExtensionElements', {
|
const instances = bpmnInstances()
|
||||||
|
if (!instances || !instances.bpmnElement) return
|
||||||
|
|
||||||
|
const bpmnElement = instances.bpmnElement
|
||||||
|
const extensions = instances.moddle.create('bpmn:ExtensionElements', {
|
||||||
values: otherExtensionList.value.concat([properties])
|
values: otherExtensionList.value.concat([properties])
|
||||||
})
|
})
|
||||||
bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), {
|
instances.modeling.updateProperties(bpmnElement, {
|
||||||
extensionElements: extensions
|
extensionElements: extensions
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import { toRaw } from 'vue'
|
|
||||||
const bpmnInstances = () => (window as any)?.bpmnInstances
|
const bpmnInstances = () => (window as any)?.bpmnInstances
|
||||||
// 创建监听器实例
|
// 创建监听器实例
|
||||||
export function createListenerObject(options, isTask, prefix) {
|
export function createListenerObject(options, isTask, prefix) {
|
||||||
@@ -61,7 +60,8 @@ export function updateElementExtensions(element, extensionList) {
|
|||||||
const extensions = bpmnInstances().moddle.create('bpmn:ExtensionElements', {
|
const extensions = bpmnInstances().moddle.create('bpmn:ExtensionElements', {
|
||||||
values: extensionList
|
values: extensionList
|
||||||
})
|
})
|
||||||
bpmnInstances().modeling.updateProperties(toRaw(element), {
|
// 直接使用原始元素对象,不需要toRaw包装
|
||||||
|
bpmnInstances().modeling.updateProperties(element, {
|
||||||
extensionElements: extensions
|
extensionElements: extensions
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user