index.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <template>
  2. <div ref="propertyPanel">
  3. <div v-if="nodeName" class="node-name">{{ nodeName }}</div>
  4. <component :is="component" v-if="element" :element="element" />
  5. </div>
  6. </template>
  7. <script setup lang="ts" name="PropertyPanel">
  8. import { NodeName } from '../assets/lang/zh';
  9. import TaskPanel from './TaskPanel.vue';
  10. import ProcessPanel from './ProcessPanel.vue';
  11. import StartEndPanel from './StartEndPanel.vue';
  12. import GatewayPanel from './GatewayPanel.vue';
  13. import SequenceFlowPanel from './SequenceFlowPanel.vue';
  14. import ParticipantPanel from './ParticipantPanel.vue';
  15. import { Modeler, ModdleElement } from 'bpmn';
  16. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  17. interface propsType {
  18. modeler: Modeler;
  19. }
  20. const props = withDefaults(defineProps<propsType>(), {});
  21. const element = ref<ModdleElement>();
  22. const processElement = ref<ModdleElement>();
  23. const startEndType = ['bpmn:IntermediateThrowEvent', 'bpmn:StartEvent', 'bpmn:EndEvent'];
  24. const taskType = [
  25. 'bpmn:UserTask',
  26. 'bpmn:Task',
  27. 'bpmn:SendTask',
  28. 'bpmn:ReceiveTask',
  29. 'bpmn:ManualTask',
  30. 'bpmn:BusinessRuleTask',
  31. 'bpmn:ServiceTask',
  32. 'bpmn:ScriptTask'
  33. ];
  34. const sequenceType = ['bpmn:SequenceFlow'];
  35. const gatewayType = ['bpmn:InclusiveGateway', 'bpmn:ExclusiveGateway', 'bpmn:ParallelGateway', 'bpmn:EventBasedGateway', 'bpmn:ComplexGateway'];
  36. const processType = ['bpmn:Process'];
  37. // 组件计算
  38. const component = computed(() => {
  39. if (!element.value) return null;
  40. const type = element.value.type;
  41. if (startEndType.includes(type)) return StartEndPanel;
  42. if (taskType.includes(type)) return TaskPanel;
  43. if (sequenceType.includes(type)) return SequenceFlowPanel;
  44. if (gatewayType.includes(type)) return GatewayPanel;
  45. if (processType.includes(type)) return ProcessPanel;
  46. if (type === 'bpmn:Participant') return ParticipantPanel;
  47. //return proxy?.$modal.msgWarning('面板开发中....');
  48. });
  49. const nodeName = computed(() => {
  50. if (element.value) {
  51. const bizObj = element.value.businessObject;
  52. const type = bizObj?.eventDefinitions && bizObj?.eventDefinitions.length > 0 ? bizObj.eventDefinitions[0].$type : bizObj.$type;
  53. return NodeName[type] || type;
  54. }
  55. });
  56. const handleModeler = () => {
  57. props.modeler.on('root.added', (e: any) => {
  58. element.value = null;
  59. if (e.element.type === 'bpmn:Process') {
  60. nextTick(() => {
  61. element.value = e.element;
  62. processElement.value = e.element;
  63. });
  64. }
  65. });
  66. props.modeler.on('element.click', (e: any) => {
  67. if (e.element.type === 'bpmn:Process') {
  68. nextTick(() => {
  69. element.value = e.element;
  70. processElement.value = e.element;
  71. });
  72. }
  73. });
  74. props.modeler.on('selection.changed', (e: any) => {
  75. // 先给null为了让vue刷新
  76. element.value = null;
  77. const newElement = e.newSelection[0];
  78. if (newElement) {
  79. nextTick(() => {
  80. element.value = newElement;
  81. });
  82. } else {
  83. nextTick(() => {
  84. element.value = processElement.value;
  85. });
  86. }
  87. });
  88. };
  89. onMounted(() => {
  90. handleModeler();
  91. });
  92. </script>
  93. <style scoped lang="scss">
  94. .node-name {
  95. font-size: 16px;
  96. font-weight: bold;
  97. padding: 10px;
  98. }
  99. </style>