Merge remote-tracking branch 'origin/master'

This commit is contained in:
XaoLi717 2024-07-22 09:41:24 +08:00
commit 007e1a4f16
3 changed files with 304 additions and 59 deletions

View File

@ -1,60 +1,84 @@
<template>
<div class="process-panel__container" :style="{ width: `${width}px` }">
<el-collapse v-model="activeTab">
<el-collapse-item name="base">
<!-- class="panel-tab__title" -->
<template #title>
<Icon icon="ep:info-filled" />
常规</template
>
<ElementBaseInfo
:id-edit-disabled="idEditDisabled"
:business-object="elementBusinessObject"
:type="elementType"
:model="model"
/>
</el-collapse-item>
<el-collapse-item name="condition" v-if="elementType === 'Process'" key="message">
<template #title><Icon icon="ep:comment" />消息与信号</template>
<signal-and-massage />
</el-collapse-item>
<el-collapse-item name="condition" v-if="conditionFormVisible" key="condition">
<template #title><Icon icon="ep:promotion" />流转条件</template>
<flow-condition :business-object="elementBusinessObject" :type="elementType" />
</el-collapse-item>
<el-collapse-item name="condition" v-if="formVisible" key="form">
<template #title><Icon icon="ep:list" />表单</template>
<element-form :id="elementId" :type="elementType" />
</el-collapse-item>
<el-collapse-item name="task" v-if="elementType.indexOf('Task') !== -1" key="task">
<template #title><Icon icon="ep:checked" />任务审批人</template>
<element-task :id="elementId" :type="elementType" />
</el-collapse-item>
<el-collapse-item
name="multiInstance"
v-if="elementType.indexOf('Task') !== -1"
key="multiInstance"
>
<template #title><Icon icon="ep:help-filled" />多实例会签配置</template>
<element-multi-instance :business-object="elementBusinessObject" :type="elementType" />
</el-collapse-item>
<el-collapse-item name="listeners" key="listeners">
<template #title><Icon icon="ep:bell-filled" />执行监听器</template>
<element-listeners :id="elementId" :type="elementType" />
</el-collapse-item>
<el-collapse-item name="taskListeners" v-if="elementType === 'UserTask'" key="taskListeners">
<template #title><Icon icon="ep:bell-filled" />任务监听器</template>
<user-task-listeners :id="elementId" :type="elementType" />
</el-collapse-item>
<el-collapse-item name="extensions" key="extensions">
<template #title><Icon icon="ep:circle-plus-filled" />扩展属性</template>
<element-properties :id="elementId" :type="elementType" />
</el-collapse-item>
<el-collapse-item name="other" key="other">
<template #title><Icon icon="ep:promotion" />其他</template>
<element-other-config :id="elementId" />
</el-collapse-item>
</el-collapse>
<div class="process-panel__container" :style="{ width: `${width}px` }" v-show="elementType != 'Process'">
<el-tabs type="border-card" @tab-click="handleTabClick" v-model="activeName">
<!-- -----------------基本---------------------- -->
<el-tab-pane :label="('基本')" name="tab_base">
<div v-show="tabRefresh.tab_base">
<ElementBaseInfo
:id-edit-disabled="idEditDisabled"
:business-object="elementBusinessObject"
:type="elementType"
:model="model"
/>
</div>
</el-tab-pane>
<!-- ------------------审批--------------------- -->
<el-tab-pane :label="('审批')" name="tab_approval">
<div v-if="tabRefresh.tab_approval">
<el-collapse v-model="tab_active">
<el-collapse-item name="task" v-if="elementType.indexOf('Task') !== -1" key="task">
<template #title><Icon icon="ep:checked" />任务审批人 </template>
<element-task :id="elementId" :type="elementType" />
</el-collapse-item>
</el-collapse>
<el-collapse v-model="tab_active">
<el-collapse-item name="multiInstance" v-if="elementType.indexOf('Task') !== -1" key="multiInstance">
<template #title><Icon icon="ep:help-filled" />多实例会签配置</template>
<element-multi-instance :business-object="elementBusinessObject" :type="elementType" />
</el-collapse-item>
</el-collapse>
</div>
</el-tab-pane>
<!-- ------------------流转--------------------- -->
<el-tab-pane :label="('流转')" name="tab_flow">
<div v-if="tabRefresh.tab_flow">
<el-collapse v-model="tab_active">
<el-collapse-item name="condition" v-if="elementType === 'Process'" key="message">
<template #title><Icon icon="ep:comment" />消息与信号</template>
<signal-and-massage />
</el-collapse-item>
<el-collapse-item name="condition" v-if="conditionFormVisible" key="condition">
<template #title><Icon icon="ep:promotion" />流转条件</template>
<flow-condition :business-object="elementBusinessObject" :type="elementType" />
</el-collapse-item>
<el-collapse-item name="listeners" key="listeners">
<template #title><Icon icon="ep:bell-filled" />执行监听器</template>
<element-listeners :id="elementId" :type="elementType" />
</el-collapse-item>
<el-collapse-item name="taskListeners" v-if="elementType === 'UserTask'" key="taskListeners">
<template #title><Icon icon="ep:bell-filled" />任务监听器</template>
<user-task-listeners :id="elementId" :type="elementType" />
</el-collapse-item>
</el-collapse>
</div>
</el-tab-pane>
<!-- ------------------表单--------------------- -->
<el-tab-pane :label="('表单')" name="tab_form">
<div v-if="tabRefresh.tab_form">
<el-collapse v-model="tab_active">
<el-collapse-item name="condition" v-if="formVisible" key="form">
<template #title><Icon icon="ep:list" />表单</template>
<element-form :id="elementId" :type="elementType" />
</el-collapse-item>
</el-collapse>
</div>
</el-tab-pane>
<!-- ------------------扩展--------------------- -->
<el-tab-pane :label="('扩展')" name="tab_extend">
<div v-if="tabRefresh.tab_extend">
<el-collapse v-model="tab_active">
<el-collapse-item name="extensions" key="extensions">
<template #title><Icon icon="ep:circle-plus-filled" />扩展属性</template>
<element-properties :id="elementId" :type="elementType" />
</el-collapse-item>
<el-collapse-item name="other" key="other">
<template #title><Icon icon="ep:promotion" />其他</template>
<element-other-config :id="elementId" />
</el-collapse-item>
</el-collapse>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script lang="ts" setup>
@ -68,7 +92,48 @@ import ElementListeners from './listeners/ElementListeners.vue'
import ElementProperties from './properties/ElementProperties.vue'
// import ElementForm from './form/ElementForm.vue'
import UserTaskListeners from './listeners/UserTaskListeners.vue'
// tab begin+++++++++++++
export type TabRefresh = {
tab_base: boolean
tab_approval: boolean
tab_flow: boolean
tab_form: boolean
tab_extend:boolean
}
const tab_active = ref(['task', 'multiInstance','message','condition','listeners','taskListeners','form','extensions','other'])
const activeName = ref('tab_base')
const tabRefresh = reactive<TabRefresh>({
tab_base: true,
tab_approval: false,
tab_flow: false,
tab_form:false,
tab_extend: false
})
const handleTabClick = async (tab) => {
activeName.value = tab.props.name
switch (activeName.value) {
case 'tab_base':
await switchTab('tab_base')
break
case 'tab_approval':
await switchTab('tab_approval')
break
case 'tab_flow':
await switchTab('tab_flow')
break
case 'tab_form':
await switchTab('tab_form')
break
case 'tab_extend':
await switchTab('tab_extend')
break
}}
const switchTab = async (tab) => {
Object.keys(tabRefresh).forEach((k) => {
tabRefresh[k as keyof TabRefresh] = tab == k
})
}
// tabend--------------------
defineOptions({ name: 'MyPropertiesPanel' })
/**

View File

@ -21,10 +21,10 @@
</el-form-item>
</div>
<div v-else>
<el-form-item label="ID">
<el-form-item label="节点ID">
<el-input v-model="elementBaseInfo.id" clearable @change="updateBaseInfo('id')" />
</el-form-item>
<el-form-item label="名称">
<el-form-item label="节点名称">
<el-input v-model="elementBaseInfo.name" clearable @change="updateBaseInfo('name')" />
</el-form-item>
</div>

View File

@ -0,0 +1,180 @@
<template>
<div class="panel-tab__content">
<el-form label-width="90px" :model="needProps" :rules="rules">
<div v-if="needProps.type == 'bpmn:Process'">
<!-- 如果是 Process 信息的时候使用自定义表单 -->
<el-form-item label="流程标识" prop="id">
<el-input
v-model="needProps.id"
placeholder="请输入流标标识"
:disabled="needProps.id !== undefined && needProps.id.length > 0"
@change="handleKeyUpdate"
/>
</el-form-item>
<el-form-item label="流程名称" prop="name">
<el-input
v-model="needProps.name"
placeholder="请输入流程名称"
clearable
@change="handleNameUpdate"
/>
</el-form-item>
</div>
<div v-else>
<el-form-item label="ID">
<el-input v-model="elementBaseInfo.id" clearable @change="updateBaseInfo('id')" />
</el-form-item>
<el-form-item label="名称">
<el-input v-model="elementBaseInfo.name" clearable @change="updateBaseInfo('name')" />
</el-form-item>
</div>
</el-form>
</div>
</template>
<script lang="ts" setup>
defineOptions({ name: 'ElementBaseInfo' })
const props = defineProps({
businessObject: {
type: Object,
default: () => {}
},
model: {
type: Object,
default: () => {}
}
})
const needProps = ref<any>({})
const bpmnElement = ref()
const elementBaseInfo = ref<any>({})
//
// const forms = ref([])
//
const rules = reactive({
id: [{ required: true, message: '流程标识不能为空', trigger: 'blur' }],
name: [{ required: true, message: '流程名称不能为空', trigger: 'blur' }]
})
const bpmnInstances = () => (window as any)?.bpmnInstances
const resetBaseInfo = () => {
console.log(window, 'window')
console.log(bpmnElement.value, 'bpmnElement')
bpmnElement.value = bpmnInstances()?.bpmnElement
// console.log(bpmnElement.value, 'resetBaseInfo11111111111')
elementBaseInfo.value = bpmnElement.value.businessObject
needProps.value['type'] = bpmnElement.value.businessObject.$type
// elementBaseInfo.value['typess'] = bpmnElement.value.businessObject.$type
// elementBaseInfo.value = JSON.parse(JSON.stringify(bpmnElement.value.businessObject))
// console.log(elementBaseInfo.value, 'elementBaseInfo22222222222')
}
const handleKeyUpdate = (value) => {
// value XML NCName
if (!value) {
return
}
if (!value.match(/[a-zA-Z_][\-_.0-9a-zA-Z$]*/)) {
console.log('key 不满足 XML NCName 规则,所以不进行赋值')
return
}
console.log('key 满足 XML NCName 规则,所以进行赋值')
// BPMN XML key id
elementBaseInfo.value['id'] = value
setTimeout(() => {
updateBaseInfo('id')
}, 100)
}
const handleNameUpdate = (value) => {
console.log(elementBaseInfo, 'elementBaseInfo')
if (!value) {
return
}
elementBaseInfo.value['name'] = value
setTimeout(() => {
updateBaseInfo('name')
}, 100)
}
// const handleDescriptionUpdate=(value)=> {
// TODO documentation
// this.elementBaseInfo['documentation'] = value;
// this.updateBaseInfo('documentation');
// }
const updateBaseInfo = (key) => {
console.log(key, 'key')
// elementBaseInfo
const attrObj = Object.create(null)
// console.log(attrObj, 'attrObj')
attrObj[key] = elementBaseInfo.value[key]
// console.log(attrObj, 'attrObj111')
// const attrObj = {
// id: elementBaseInfo.value[key]
// // di: { id: `${elementBaseInfo.value[key]}_di` }
// }
// console.log(elementBaseInfo, 'elementBaseInfo11111111111')
needProps.value = { ...elementBaseInfo.value, ...needProps.value }
if (key === 'id') {
// console.log('jinru')
console.log(window, 'window')
console.log(bpmnElement.value, 'bpmnElement')
console.log(toRaw(bpmnElement.value), 'bpmnElement')
bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), {
id: elementBaseInfo.value[key],
di: { id: `${elementBaseInfo.value[key]}_di` }
})
} else {
console.log(attrObj, 'attrObj')
bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), attrObj)
}
}
watch(
() => props.businessObject,
(val) => {
// console.log(val, 'val11111111111111111111')
if (val) {
// nextTick(() => {
resetBaseInfo()
// })
}
}
)
watch(
() => props.model?.key,
(val) => {
// bpmn key name
if (val) {
handleKeyUpdate(props.model.key)
handleNameUpdate(props.model.name)
}
}
)
// watch(
// () => ({ ...props }),
// (oldVal, newVal) => {
// console.log(oldVal, 'oldVal')
// console.log(newVal, 'newVal')
// if (newVal) {
// needProps.value = newVal
// }
// },
// {
// immediate: true
// }
// )
// 'model.key': {
// immediate: false,
// handler: function (val) {
// this.handleKeyUpdate(val)
// }
// }
onBeforeUnmount(() => {
bpmnElement.value = null
})
</script>