index.vue 3.2 KB

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