index.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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 type { 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. return undefined;
  51. });
  52. const nodeName = computed(() => {
  53. if (element.value) {
  54. const bizObj = element.value.businessObject;
  55. const type = bizObj?.eventDefinitions && bizObj?.eventDefinitions.length > 0 ? bizObj.eventDefinitions[0].$type : bizObj.$type;
  56. return NodeName[type] || type;
  57. }
  58. return '';
  59. });
  60. const handleModeler = () => {
  61. props.modeler.on('root.added', (e: any) => {
  62. element.value = null;
  63. if (e.element.type === 'bpmn:Process') {
  64. nextTick(() => {
  65. element.value = e.element;
  66. processElement.value = e.element;
  67. });
  68. }
  69. });
  70. props.modeler.on('element.click', (e: any) => {
  71. if (e.element.type === 'bpmn:Process') {
  72. nextTick(() => {
  73. element.value = e.element;
  74. processElement.value = e.element;
  75. });
  76. }
  77. });
  78. props.modeler.on('selection.changed', (e: any) => {
  79. // 先给null为了让vue刷新
  80. element.value = null;
  81. const newElement = e.newSelection[0];
  82. if (newElement) {
  83. nextTick(() => {
  84. element.value = newElement;
  85. });
  86. } else {
  87. nextTick(() => {
  88. element.value = processElement.value;
  89. });
  90. }
  91. });
  92. };
  93. onMounted(() => {
  94. handleModeler();
  95. });
  96. </script>
  97. <style scoped lang="scss">
  98. .node-name {
  99. font-size: 16px;
  100. font-weight: bold;
  101. padding: 10px;
  102. }
  103. </style>