usePanel.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import showConfig from '@/components/BpmnDesign/assets/showConfig';
  2. import { ModdleElement } from 'bpmn';
  3. import useModelerStore from '@/store/modules/modeler';
  4. import { MultiInstanceTypeEnum } from '@/enums/bpmn/IndexEnums';
  5. interface Options {
  6. element: ModdleElement;
  7. }
  8. export default (ops: Options) => {
  9. const { element } = ops;
  10. const { getModeling, getModdle } = useModelerStore();
  11. const modeling = getModeling();
  12. const moddle = getModdle();
  13. /**
  14. * 当前节点类型
  15. */
  16. const elementType = computed(() => {
  17. const bizObj = element.businessObject;
  18. return bizObj.eventDefinitions ? bizObj.eventDefinitions[0].$type : bizObj.$type;
  19. });
  20. /**
  21. * 用于控制面板字段显示与隐藏的配置
  22. */
  23. const config = computed(() => showConfig[elementType.value] || {});
  24. /**
  25. * 创建一个节点
  26. * @param elementType 节点类型
  27. * @param properties 属性
  28. * @param parent 父节点
  29. */
  30. const createModdleElement = (elementType: string, properties: any, parent: ModdleElement) => {
  31. const element = moddle.create(elementType, properties);
  32. parent && (element.$parent = parent);
  33. return element;
  34. };
  35. /**
  36. * 获取扩展属性,如果不存在会自动创建
  37. */
  38. const getExtensionElements = (create = true) => {
  39. let extensionElements = element.businessObject.get<ModdleElement>('extensionElements');
  40. if (!extensionElements && create) {
  41. extensionElements = createModdleElement('bpmn:ExtensionElements', { values: [] }, element.businessObject);
  42. modeling.updateModdleProperties(element, element.businessObject, { extensionElements });
  43. }
  44. return extensionElements;
  45. };
  46. /**
  47. * 获取extensionElements下的properties
  48. * @param extensionElements 可选参数,默认获取当前Element下的extensionElements下的Properties
  49. */
  50. const getPropertiesElements = (extensionElements?: ModdleElement) => {
  51. if (!extensionElements) {
  52. extensionElements = getExtensionElements();
  53. }
  54. let propertiesElements = extensionElements.values.find((item) => item.$type === 'flowable:properties');
  55. if (!propertiesElements) {
  56. propertiesElements = createModdleElement('flowable:properties', { values: [] }, extensionElements);
  57. modeling.updateModdleProperties(element, extensionElements, {
  58. values: [...extensionElements.get<[]>('values'), propertiesElements]
  59. });
  60. }
  61. return propertiesElements;
  62. };
  63. /**
  64. * 更新节点属性
  65. * @param properties 属性值
  66. */
  67. const updateProperties = (properties: any) => {
  68. modeling.updateProperties(element, properties);
  69. };
  70. /**
  71. * 更新节点信息
  72. * @param updateElement 需要更新的节点
  73. * @param properties 属性
  74. */
  75. const updateModdleProperties = (updateElement, properties: any) => {
  76. modeling.updateModdleProperties(element, updateElement, properties);
  77. };
  78. /**
  79. * 更新Property属性
  80. * @param name key值
  81. * @param value 值
  82. */
  83. const updateProperty = (name: string, value: string) => {
  84. const propertiesElements = getPropertiesElements();
  85. let propertyElements = propertiesElements.values.find((item) => item.name === name);
  86. if (!propertyElements) {
  87. propertyElements = createModdleElement('flowable:property', { name: name, value: value }, propertiesElements);
  88. modeling.updateModdleProperties(element, propertiesElements, {
  89. values: [...propertiesElements.get('values'), propertyElements]
  90. });
  91. } else {
  92. propertyElements.name = name;
  93. propertyElements.value = value;
  94. }
  95. return propertyElements;
  96. };
  97. const idChange = (newVal: string) => {
  98. if (newVal) {
  99. updateProperties({ id: newVal });
  100. }
  101. };
  102. const nameChange = (newVal: string) => {
  103. if (newVal) {
  104. updateProperties({ name: newVal });
  105. }
  106. };
  107. const constant = {
  108. MultiInstanceType: [
  109. { id: '373d4b81-a0d1-4eb8-8685-0d2fb1b468e2', label: '无', value: MultiInstanceTypeEnum.NONE },
  110. { id: 'b5acea7c-b7e5-46b0-8778-390db091bdab', label: '串行', value: MultiInstanceTypeEnum.SERIAL },
  111. { id: 'b4f0c683-1ccc-43c4-8380-e1b998986caf', label: '并行', value: MultiInstanceTypeEnum.PARALLEL }
  112. ]
  113. };
  114. return {
  115. elementType,
  116. constant,
  117. showConfig: config,
  118. updateProperties,
  119. updateProperty,
  120. updateModdleProperties,
  121. createModdleElement,
  122. idChange,
  123. nameChange,
  124. getExtensionElements,
  125. getPropertiesElements
  126. };
  127. };