mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-10-31 10:37:41 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			175 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div class="panel-tab__content">
 | |
|     <el-table :data="elementPropertyList" max-height="240" border fit>
 | |
|       <el-table-column label="序号" width="50px" type="index" />
 | |
|       <el-table-column label="属性名" prop="name" min-width="100px" show-overflow-tooltip />
 | |
|       <el-table-column label="属性值" prop="value" min-width="100px" show-overflow-tooltip />
 | |
|       <el-table-column label="操作" width="90px">
 | |
|         <template #default="scope">
 | |
|           <el-button type="text" @click="openAttributesForm(scope.row, scope.$index)"
 | |
|             >编辑</el-button
 | |
|           >
 | |
|           <el-divider direction="vertical" />
 | |
|           <el-button
 | |
|             type="text"
 | |
|             style="color: #ff4d4f"
 | |
|             @click="removeAttributes(scope.roww, scope.$index)"
 | |
|             >移除</el-button
 | |
|           >
 | |
|         </template>
 | |
|       </el-table-column>
 | |
|     </el-table>
 | |
|     <div class="element-drawer__button">
 | |
|       <XButton
 | |
|         type="primary"
 | |
|         preIcon="ep:plus"
 | |
|         title="添加属性"
 | |
|         @click="openAttributesForm(null, -1)"
 | |
|       />
 | |
|     </div>
 | |
| 
 | |
|     <el-dialog
 | |
|       v-model="propertyFormModelVisible"
 | |
|       title="属性配置"
 | |
|       width="600px"
 | |
|       append-to-body
 | |
|       destroy-on-close
 | |
|     >
 | |
|       <el-form :model="propertyForm" label-width="80px" ref="attributeFormRef">
 | |
|         <el-form-item label="属性名:" prop="name">
 | |
|           <el-input v-model="propertyForm.name" clearable />
 | |
|         </el-form-item>
 | |
|         <el-form-item label="属性值:" prop="value">
 | |
|           <el-input v-model="propertyForm.value" clearable />
 | |
|         </el-form-item>
 | |
|       </el-form>
 | |
|       <template #footer>
 | |
|         <el-button @click="propertyFormModelVisible = false">取 消</el-button>
 | |
|         <el-button type="primary" @click="saveAttribute">确 定</el-button>
 | |
|       </template>
 | |
|     </el-dialog>
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script setup lang="ts" name="ElementProperties">
 | |
| import { ref, inject, nextTick, watch } from 'vue'
 | |
| import {
 | |
|   ElMessageBox,
 | |
|   ElDialog,
 | |
|   ElButton,
 | |
|   ElForm,
 | |
|   ElFormItem,
 | |
|   ElTable,
 | |
|   ElTableColumn,
 | |
|   ElDivider,
 | |
|   ElInput
 | |
| } from 'element-plus'
 | |
| const props = defineProps({
 | |
|   id: String,
 | |
|   type: String
 | |
| })
 | |
| const prefix = inject('prefix')
 | |
| // const width = inject('width')
 | |
| 
 | |
| const elementPropertyList = ref([])
 | |
| const propertyForm = ref({})
 | |
| const editingPropertyIndex = ref(-1)
 | |
| const propertyFormModelVisible = ref(false)
 | |
| const bpmnElement = ref()
 | |
| const otherExtensionList = ref()
 | |
| const bpmnElementProperties = ref()
 | |
| const bpmnElementPropertyList = ref()
 | |
| const attributeFormRef = ref()
 | |
| 
 | |
| const resetAttributesList = () => {
 | |
|   bpmnElement.value = window.bpmnInstances.bpmnElement
 | |
|   otherExtensionList.value = [] // 其他扩展配置
 | |
|   bpmnElementProperties.value =
 | |
|     bpmnElement.value.businessObject?.extensionElements?.values?.filter((ex) => {
 | |
|       if (ex.$type !== `${prefix}:Properties`) {
 | |
|         otherExtensionList.value.push(ex)
 | |
|       }
 | |
|       return ex.$type === `${prefix}:Properties`
 | |
|     }) ?? []
 | |
| 
 | |
|   // 保存所有的 扩展属性字段
 | |
|   bpmnElementPropertyList.value = bpmnElementProperties.value.reduce(
 | |
|     (pre, current) => pre.concat(current.values),
 | |
|     []
 | |
|   )
 | |
|   // 复制 显示
 | |
|   elementPropertyList.value = JSON.parse(JSON.stringify(bpmnElementPropertyList.value ?? []))
 | |
| }
 | |
| const openAttributesForm = (attr, index) => {
 | |
|   editingPropertyIndex.value = index
 | |
|   propertyForm.value = index === -1 ? {} : JSON.parse(JSON.stringify(attr))
 | |
|   propertyFormModelVisible.value = true
 | |
|   nextTick(() => {
 | |
|     if (attributeFormRef.value) attributeFormRef.value.clearValidate()
 | |
|   })
 | |
| }
 | |
| const removeAttributes = (attr, index) => {
 | |
|   console.log(attr, 'attr')
 | |
|   ElMessageBox.confirm('确认移除该属性吗?', '提示', {
 | |
|     confirmButtonText: '确 认',
 | |
|     cancelButtonText: '取 消'
 | |
|   })
 | |
|     .then(() => {
 | |
|       elementPropertyList.value.splice(index, 1)
 | |
|       bpmnElementPropertyList.value.splice(index, 1)
 | |
|       // 新建一个属性字段的保存列表
 | |
|       const propertiesObject = window.bpmnInstances.moddle.create(`${prefix}:Properties`, {
 | |
|         values: bpmnElementPropertyList.value
 | |
|       })
 | |
|       updateElementExtensions(propertiesObject)
 | |
|       resetAttributesList()
 | |
|     })
 | |
|     .catch(() => console.info('操作取消'))
 | |
| }
 | |
| const saveAttribute = () => {
 | |
|   console.log(propertyForm.value, 'propertyForm.value')
 | |
|   const { name, value } = propertyForm.value
 | |
|   if (editingPropertyIndex.value !== -1) {
 | |
|     window.bpmnInstances.modeling.updateModdleProperties(
 | |
|       bpmnElement.value,
 | |
|       bpmnElementPropertyList.value[editingPropertyIndex.value],
 | |
|       {
 | |
|         name,
 | |
|         value
 | |
|       }
 | |
|     )
 | |
|   } else {
 | |
|     // 新建属性字段
 | |
|     const newPropertyObject = window.bpmnInstances.moddle.create(`${prefix}:Property`, {
 | |
|       name,
 | |
|       value
 | |
|     })
 | |
|     // 新建一个属性字段的保存列表
 | |
|     const propertiesObject = window.bpmnInstances.moddle.create(`${prefix}:Properties`, {
 | |
|       values: bpmnElementPropertyList.value.concat([newPropertyObject])
 | |
|     })
 | |
|     updateElementExtensions(propertiesObject)
 | |
|   }
 | |
|   propertyFormModelVisible.value = false
 | |
|   resetAttributesList()
 | |
| }
 | |
| const updateElementExtensions = (properties) => {
 | |
|   const extensions = window.bpmnInstances.moddle.create('bpmn:ExtensionElements', {
 | |
|     values: otherExtensionList.value.concat([properties])
 | |
|   })
 | |
|   window.bpmnInstances.modeling.updateProperties(bpmnElement.value, {
 | |
|     extensionElements: extensions
 | |
|   })
 | |
| }
 | |
| 
 | |
| watch(
 | |
|   () => props.id,
 | |
|   (val) => {
 | |
|     if (val) {
 | |
|       val && val.length && resetAttributesList()
 | |
|     }
 | |
|   },
 | |
|   { immediate: true }
 | |
| )
 | |
| </script>
 | 
