@processmaker/modeler 1.32.0 → 1.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/README.md +7 -0
  2. package/babel.config.js +1 -2
  3. package/cypress.json +1 -1
  4. package/dist/img/inclusive-gateway.0f0afffd.svg +4 -0
  5. package/dist/img/inspector.42e5d40d.svg +5 -0
  6. package/dist/modeler.common.js +3220 -4350
  7. package/dist/modeler.common.js.map +1 -1
  8. package/dist/modeler.umd.js +3220 -4350
  9. package/dist/modeler.umd.js.map +1 -1
  10. package/dist/modeler.umd.min.js +4 -4
  11. package/dist/modeler.umd.min.js.map +1 -1
  12. package/package.json +1 -1
  13. package/src/.DS_Store +0 -0
  14. package/src/ModelerApp.vue +0 -13
  15. package/src/NodeIdGenerator.js +16 -1
  16. package/src/assets/inspector.svg +5 -0
  17. package/src/assets/toolpanel/inclusive-gateway.svg +2 -2
  18. package/src/components/controls/controls.vue +2 -11
  19. package/src/components/crown/crownButtons/addLaneAboveButton.vue +3 -1
  20. package/src/components/crown/crownButtons/addLaneBelowButton.vue +3 -1
  21. package/src/components/crown/crownButtons/crownBoundaryEventDropdown.vue +2 -1
  22. package/src/components/crown/crownButtons/genericFlowButton.vue +2 -1
  23. package/src/components/crown/crownButtons/icons/faAlignBottom.js +3 -3
  24. package/src/components/crown/crownButtons/icons/faAlignLeft.js +3 -3
  25. package/src/components/crown/crownButtons/icons/faAlignRight.js +3 -3
  26. package/src/components/crown/crownButtons/icons/faAlignTop.js +3 -3
  27. package/src/components/crown/crownButtons/icons/faCenterHorizontally.js +3 -3
  28. package/src/components/crown/crownButtons/icons/faCenterVertically.js +3 -3
  29. package/src/components/crown/crownButtons/icons/faDistributeHorizontally.js +3 -3
  30. package/src/components/crown/crownButtons/icons/faDistributeVertically.js +3 -3
  31. package/src/components/crown/crownMultiselect/crownAlign.vue +3 -0
  32. package/src/components/crown/crownMultiselect/crownMultiselect.vue +7 -5
  33. package/src/components/highlightColors.js +8 -0
  34. package/src/components/inspectors/InspectorPanel.vue +26 -3
  35. package/src/components/inspectors/inspector.scss +11 -0
  36. package/src/components/inspectors/inspectorButton/InspectorButton.vue +38 -0
  37. package/src/components/inspectors/inspectorButton/inspectorButton.scss +20 -0
  38. package/src/components/inspectors/process.js +1 -1
  39. package/src/components/modeler/Modeler.vue +102 -5
  40. package/src/components/modeler/Selection.vue +9 -1
  41. package/src/components/nodes/association/index.js +1 -1
  42. package/src/components/nodes/baseStartEvent/index.js +1 -1
  43. package/src/components/nodes/boundaryEvent/index.js +1 -1
  44. package/src/components/nodes/dataInputAssociation/index.js +1 -1
  45. package/src/components/nodes/dataObject/index.js +1 -1
  46. package/src/components/nodes/dataOutputAssociation/index.js +1 -1
  47. package/src/components/nodes/dataStore/index.js +1 -1
  48. package/src/components/nodes/endEvent/index.js +1 -1
  49. package/src/components/nodes/eventBasedGateway/index.js +1 -1
  50. package/src/components/nodes/exclusiveGateway/index.js +1 -1
  51. package/src/components/nodes/gateway/index.js +1 -1
  52. package/src/components/nodes/inclusiveGateway/index.js +1 -1
  53. package/src/components/nodes/index.js +0 -1
  54. package/src/components/nodes/intermediateEvent/index.js +1 -1
  55. package/src/components/nodes/intermediateMessageEvent/index.js +1 -1
  56. package/src/components/nodes/intermediateTimerEvent/index.js +1 -1
  57. package/src/components/nodes/manualTask/index.js +1 -1
  58. package/src/components/nodes/messageFlow/index.js +1 -1
  59. package/src/components/nodes/parallelGateway/index.js +1 -1
  60. package/src/components/nodes/pool/index.js +1 -1
  61. package/src/components/nodes/pool/pool.vue +10 -4
  62. package/src/components/nodes/poolLane/index.js +1 -1
  63. package/src/components/nodes/scriptTask/index.js +1 -1
  64. package/src/components/nodes/sequenceFlow/index.js +1 -1
  65. package/src/components/nodes/serviceTask/index.js +1 -1
  66. package/src/components/nodes/subProcess/index.js +1 -1
  67. package/src/components/nodes/task/index.js +1 -1
  68. package/src/components/nodes/textAnnotation/index.js +1 -1
  69. package/src/components/railBottom/RailBottom.vue +9 -0
  70. package/src/components/railBottom/controls/Controls.vue +22 -2
  71. package/src/components/railBottom/controls/SubmenuPopper/SubmenuPopper.vue +9 -7
  72. package/src/components/railBottom/controls/controls.scss +2 -0
  73. package/src/components/railBottom/miniPaperControl/miniPaperControl.scss +1 -0
  74. package/src/components/railBottom/railBottom.scss +2 -0
  75. package/src/components/railBottom/zoomControl/ZoomControl.vue +1 -3
  76. package/src/components/rails/explorer-rail/explorer-rail.scss +11 -0
  77. package/src/components/rails/explorer-rail/explorer.vue +14 -5
  78. package/src/components/rails/explorer-rail/filterNodeTypes/filterNodeTypes.vue +18 -3
  79. package/src/components/rails/explorer-rail/nodeTypesLoop/nodeTypesLoop.vue +6 -1
  80. package/src/components/rails/explorer-rail/pmBlocksLoop/pmBlocksLoop.vue +86 -0
  81. package/src/components/shapeStackUtils.js +1 -1
  82. package/src/components/toolbar/ToolBar.vue +49 -39
  83. package/src/components/toolbar/toolbar.scss +78 -15
  84. package/src/components/topRail/TopRail.vue +1 -0
  85. package/src/components/topRail/validateControl/validateButton/ValidateButton.vue +3 -0
  86. package/src/components/topRail/validateControl/validateIssue/ValidateIssue.vue +1 -0
  87. package/src/components/topRail/validateControl/validatePanel/ValidatePanel.vue +4 -1
  88. package/src/components/topRail/validateControl/validatePanel/validatePanel.scss +1 -1
  89. package/src/mixins/clickAndDrop.js +17 -10
  90. package/src/mixins/highlightConfig.js +35 -8
  91. package/src/mixins/linkConfig.js +33 -6
  92. package/src/nodeTypesStore.js +36 -1
  93. package/src/setup/registerPmBlock.js +0 -0
  94. package/src/store.js +1 -0
  95. package/vue.config.js +1 -0
  96. package/dist/.DS_Store +0 -0
  97. package/dist/img/distribute-horizontally-icon.5c513cf4.svg +0 -3
  98. package/dist/img/distribute-vertically-icon.a35fb699.svg +0 -3
  99. package/dist/img/inclusive-gateway.754cb36f.svg +0 -4
  100. package/src/components/controls/rankConstants.js +0 -1
  101. package/src/components/modeler/ModelerReadonly.vue +0 -1011
@@ -8,7 +8,8 @@
8
8
  :class="['control-item', {'active': selectedItem && (selectedItem.type === item.type)}]"
9
9
  :id="item.id"
10
10
  :key="item.id"
11
- @click.stop="onClickHandler($event, item)"
11
+ @click.stop="onClickControlHandler($event, item)"
12
+ :data-test="`${item.type}-main`"
12
13
  >
13
14
  <SubmenuPopper
14
15
  :data="item"
@@ -22,7 +23,7 @@
22
23
  <div
23
24
  :class="{'control-add': true, 'control-active': explorerOpen}"
24
25
  :title="$t('Add')"
25
- v-b-tooltip.hover
26
+ v-b-tooltip.hover.viewport.d50="{ customClass: 'no-pointer-events' }"
26
27
  @click="toggleExplorer"
27
28
  >
28
29
  <inline-svg :src="plusIcon" />
@@ -49,6 +50,7 @@ export default ({
49
50
  data() {
50
51
  return {
51
52
  plusIcon: require('@/assets/railBottom/plus.svg'),
53
+ currentType: null,
52
54
  };
53
55
  },
54
56
  created() {
@@ -70,9 +72,27 @@ export default ({
70
72
  this.selectedSubmenuItem = data.control.type;
71
73
  this.onClickHandler(data.event, data.control);
72
74
  },
75
+ /**
76
+ * On click on the botton rail control
77
+ * @param {Object} event
78
+ * @param {Object} control
79
+ */
80
+ onClickControlHandler(event, control) {
81
+ this.selectedSubmenuItem = null;
82
+ this.popperType = this.currentType === control.type ? null : control.type;
83
+ this.onClickHandler(event, control);
84
+ this.currentType = this.popperType;
85
+ },
73
86
  toggleExplorer() {
87
+ // Remove control click & drop selection when the Add button is clicked
88
+ this.deselect();
89
+ this.popperType = null;
90
+ this.selectedSubmenuItem = null;
91
+
92
+ // Toggle left explorer
74
93
  nodeTypesStore.commit('toggleExplorer');
75
94
  nodeTypesStore.commit('clearFilteredNodes');
95
+ nodeTypesStore.commit('clearFilteredPmBlockNodes');
76
96
  },
77
97
  },
78
98
  });
@@ -4,8 +4,9 @@
4
4
  trigger="clickToOpen"
5
5
  :options="{
6
6
  placement: 'top',
7
- modifiers: { offset: { offset: '0,20px' } }
7
+ modifiers: { offset: { offset: '0,5px' }, preventOverflow: { escapeWithReference: true } }
8
8
  }"
9
+ :append-to-body=true
9
10
  :visible-arrow=false
10
11
  :force-show="popperType === data.type"
11
12
  >
@@ -15,6 +16,7 @@
15
16
  :class="['control-submenu-list', {'active': selectedItem === item.type}]"
16
17
  :key="key"
17
18
  @click="onClickHandler($event, item)"
19
+ :data-test="item.type"
18
20
  >
19
21
  <inline-svg :src="item.icon" :alt=item.label />
20
22
  <div class="control-submenu-list-label">
@@ -28,7 +30,7 @@
28
30
  slot="reference"
29
31
  :alt=data.label
30
32
  :title="$t(data.label)"
31
- v-b-tooltip.hover
33
+ v-b-tooltip.hover.viewport.d50="{ customClass: 'no-pointer-events' }"
32
34
  >
33
35
  <div class="control-submenu-options">
34
36
  <span />
@@ -40,7 +42,7 @@
40
42
  <a v-else class="control-submenu-item"
41
43
  :alt=data.label
42
44
  :title="$t(data.label)"
43
- v-b-tooltip.hover
45
+ v-b-tooltip.hover.viewport.d50="{ customClass: 'no-pointer-events' }"
44
46
  >
45
47
  <inline-svg :src=data.icon />
46
48
  </a>
@@ -87,7 +89,7 @@ export default ({
87
89
  width: 255px;
88
90
  left: 616px;
89
91
  background: #FFFFFF;
90
- box-shadow: 0px 6px 12px rgba(0, 0, 0, 0.1);
92
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.1);
91
93
  border-radius: 4px;
92
94
  list-style: none;
93
95
  &-item {
@@ -105,12 +107,13 @@ export default ({
105
107
  align-items: center;
106
108
  padding: 12px 5px;
107
109
  gap: 8px;
108
- width: 235px;
109
110
  height: 40px;
110
111
  flex: none;
111
112
  order: 0;
112
113
  align-self: stretch;
113
114
  flex-grow: 0;
115
+ border-radius: 4px;
116
+ cursor: pointer;
114
117
 
115
118
  &.active {
116
119
  background-color: #DEEBFF;
@@ -128,7 +131,6 @@ export default ({
128
131
  height: 24px;
129
132
  }
130
133
  &-label{
131
- font-family: 'Open Sans';
132
134
  font-style: normal;
133
135
  font-weight: 400;
134
136
  font-size: 14px;
@@ -166,7 +168,7 @@ export default ({
166
168
  color: $primary-white;
167
169
  position: absolute;
168
170
  z-index: 10;
169
- box-shadow: 5px 5px 8px 0px #0000004a;
171
+ box-shadow: 5px 5px 8px 0 #0000004a;
170
172
  padding: 0.5rem;
171
173
  pointer-events: none;
172
174
  width: 40px;
@@ -9,6 +9,7 @@
9
9
  box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1);
10
10
  border-radius: 8px;
11
11
  list-style: none;
12
+ overflow-x: auto;
12
13
  }
13
14
 
14
15
  &-item {
@@ -17,6 +18,7 @@
17
18
  flex-direction: column;
18
19
  justify-content: center;
19
20
  align-items: center;
21
+ min-width: 40px;
20
22
  width: 40px;
21
23
  height: 40px;
22
24
  margin-right: 12px;
@@ -26,6 +26,7 @@
26
26
 
27
27
  & > svg {
28
28
  fill: #333344;
29
+ width: 100%;
29
30
  }
30
31
 
31
32
  &:hover:not(.mini-paper-button-active) {
@@ -24,5 +24,7 @@
24
24
  align-items: center;
25
25
  column-gap: 22px;
26
26
  width: 100%;
27
+ padding-right: 5px;
28
+ overflow-x: hidden;
27
29
  }
28
30
  }
@@ -18,9 +18,7 @@
18
18
  data-cy="zoom-reset-control"
19
19
  v-b-tooltip.hover
20
20
  :title="$t('Reset to initial scale')"
21
- >
22
- {{ percentageText }}
23
- </button>
21
+ >{{ percentageText }}</button>
24
22
 
25
23
  <button
26
24
  type="button"
@@ -53,3 +53,14 @@ $secondary-color-nav: #6c757d;
53
53
  }
54
54
  }
55
55
 
56
+ .pm-blocks {
57
+ &__container {
58
+ padding: 0.5rem 1rem;
59
+ p {
60
+ font-size: 13px;
61
+ line-height: 19px;
62
+ color: #000;
63
+ }
64
+ }
65
+ }
66
+
@@ -4,6 +4,7 @@ import { faTimes } from '@fortawesome/free-solid-svg-icons';
4
4
  import nodeTypesStore from '@/nodeTypesStore';
5
5
  import FilterNodeTypes from '@/components/rails/explorer-rail/filterNodeTypes/filterNodeTypes.vue';
6
6
  import NodeTypesLoop from '@/components/rails/explorer-rail/nodeTypesLoop/nodeTypesLoop.vue';
7
+ import PmBlocksLoop from '@/components/rails/explorer-rail/pmBlocksLoop/pmBlocksLoop.vue';
7
8
 
8
9
  export default {
9
10
  name: 'ExplorerRail',
@@ -14,11 +15,15 @@ export default {
14
15
  nodeTypes: {
15
16
  type: Array,
16
17
  },
18
+ pmBlockNodes: {
19
+ type: Array,
20
+ },
17
21
  },
18
22
  components: {
19
23
  FontAwesomeIcon,
20
24
  FilterNodeTypes,
21
25
  NodeTypesLoop,
26
+ PmBlocksLoop,
22
27
  },
23
28
  data() {
24
29
  return {
@@ -59,13 +64,14 @@ export default {
59
64
  },
60
65
  clearFilteredObjects() {
61
66
  nodeTypesStore.commit('clearFilteredNodes');
67
+ nodeTypesStore.commit('clearFilteredPmBlockNodes');
62
68
  },
63
69
  },
64
70
  };
65
71
  </script>
66
72
 
67
73
  <template>
68
- <div id="explorer-rail" data-test="explorer-rail" v-if="explorerOpen">
74
+ <div id="explorer-rail" data-test="explorer-rail" v-show="explorerOpen">
69
75
  <div class="rail-menu">
70
76
  <b-tabs class="tabs--container" :no-nav-style="true">
71
77
  <template v-for="tab in tabs">
@@ -78,14 +84,17 @@ export default {
78
84
  <font-awesome-icon :icon="faTimes()"/>
79
85
  </div>
80
86
  </div>
81
- <div class="node-types__container" v-if="tabIndex === 0">
82
- <filter-node-types />
87
+ <div class="node-types__container" v-show="tabIndex === 0">
88
+ <filter-node-types :type="'object'"/>
83
89
  <node-types-loop
84
90
  v-on="$listeners"
85
91
  />
86
92
  </div>
87
- <div class="pm-blocks__container">
88
- <!-- Here goes the PM Blocks -->
93
+ <div class="pm-blocks__container" v-show="tabIndex === 1">
94
+ <filter-node-types :type="'pmBlock'"/>
95
+ <pm-blocks-loop
96
+ v-on="$listeners"
97
+ />
89
98
  </div>
90
99
  </div>
91
100
  </template>
@@ -2,16 +2,24 @@
2
2
  import nodeTypesStore from '@/nodeTypesStore';
3
3
  export default {
4
4
  name: 'FilterNodeTypes',
5
+ props: ['type'],
5
6
  data() {
6
7
  return {
7
8
  searchTerm: '',
8
- placeholder: this.$t('Seach Objects'),
9
9
  };
10
10
  },
11
11
  watch: {
12
12
  searchTerm(value) {
13
- if (value.length === 0) nodeTypesStore.commit('clearFilteredNodes');
14
- if (value.length > 0) nodeTypesStore.commit('setFilteredNodeTypes', value);
13
+ if (this.type === 'pmBlock') {
14
+ if (value.length === 0) nodeTypesStore.commit('clearFilteredPmBlockNodes');
15
+ if (value.length > 0) nodeTypesStore.commit('setFilteredPmBlockNodeTypes', value);
16
+ } else {
17
+ if (value.length === 0) nodeTypesStore.commit('clearFilteredNodes');
18
+ if (value.length > 0) nodeTypesStore.commit('setFilteredNodeTypes', value);
19
+ }
20
+ },
21
+ type(newValue, oldValue) {
22
+ this.searchTerm = oldValue === newValue ? this.searchTerm: '';
15
23
  },
16
24
  },
17
25
  computed: {
@@ -20,6 +28,13 @@ export default {
20
28
  const nodeTypes = nodeTypesStore.getters.getNodeTypes;
21
29
  return [...pinnedNodeTypes, ...nodeTypes];
22
30
  },
31
+ pmBlockNodes() {
32
+ const pmBlockNodeTypes = nodeTypesStore.getters.getPmBlockNodeTypes;
33
+ return [...pmBlockNodeTypes];
34
+ },
35
+ placeholder() {
36
+ return this.type === 'pmBlock' ? this.$t('Search PM Blocks') : this.$t('Search Objects');
37
+ },
23
38
  },
24
39
  };
25
40
  </script>
@@ -22,9 +22,11 @@ export default {
22
22
  return !!this.pinnedObjects.find(obj => obj.type === type);
23
23
  },
24
24
  unPin(object) {
25
+ this.deselect();
25
26
  return nodeTypesStore.dispatch('removeUserPinnedObject', object);
26
27
  },
27
28
  addPin(object) {
29
+ this.deselect();
28
30
  return nodeTypesStore.dispatch('addUserPinnedObject', object);
29
31
  },
30
32
  },
@@ -55,10 +57,11 @@ export default {
55
57
  <template v-for="object in filteredNodes">
56
58
  <div
57
59
  class="node-types__item"
60
+ :data-test="object.type"
58
61
  :key="object.id"
59
62
  @mouseover="showPin = true"
60
63
  @mouseleave="showPin = false"
61
- @click.stop="onClickHandler($event, object)"
64
+ @click.self="onClickHandler($event, object)"
62
65
  >
63
66
  <img class="node-types__item__icon" :src="object.icon" :alt="$t(object.label)">
64
67
  <span>{{ $t(object.label) }}</span>
@@ -85,6 +88,7 @@ export default {
85
88
  <template v-for="pinnedObject in pinnedObjects">
86
89
  <div
87
90
  class="node-types__item"
91
+ :data-test="pinnedObject.type"
88
92
  :key="pinnedObject.id"
89
93
  @mouseover="showPin = true"
90
94
  @mouseleave="showPin = false"
@@ -106,6 +110,7 @@ export default {
106
110
  <template v-for="nodeType in unpinnedObjects">
107
111
  <div
108
112
  class="node-types__item"
113
+ :data-test="nodeType.type"
109
114
  :key="nodeType.id"
110
115
  @mouseover="showPin = true"
111
116
  @mouseleave="showPin = false"
@@ -0,0 +1,86 @@
1
+ <script>
2
+ import nodeTypesStore from '@/nodeTypesStore';
3
+ import clickAndDrop from '@/mixins/clickAndDrop';
4
+
5
+ export default {
6
+ name: 'PmBlocksLoop',
7
+ mixins: [clickAndDrop],
8
+ computed: {
9
+ pmBlockNodeTypes() {
10
+ return nodeTypesStore.getters.getPmBlockNodeTypes;
11
+ },
12
+ filteredPmBlockNodes() {
13
+ return nodeTypesStore.getters.getFilteredPmBlockNodeTypes;
14
+ },
15
+ searchTerm() {
16
+ return nodeTypesStore.getters.getSearchTerm;
17
+ },
18
+ },
19
+ };
20
+ </script>
21
+
22
+ <template>
23
+ <div id="pmBlockNodeTypesList">
24
+ <div id="filteredPmBlockNodes-container" v-if="filteredPmBlockNodes.length > 0">
25
+ <template v-for="object in filteredPmBlockNodes">
26
+ <div
27
+ class="node-types__item"
28
+ :key="object.id"
29
+ @click.stop="onClickHandler($event, object)"
30
+ >
31
+ <div class="d-flex">
32
+ <i v-if="!object.svgIcon" class="node-types__item__icon" :class="object.customIcon"/>
33
+ <img v-else class="node-types__item__icon" :src="object.svgIcon" :alt="$t(object.label)">
34
+ <label>{{ $t(object.label) }}</label>
35
+ </div>
36
+ </div>
37
+ </template>
38
+ </div>
39
+ <template v-if="filteredPmBlockNodes.length === 0 && !searchTerm">
40
+ <div class="pmBlocksContainer p-2">
41
+ <template v-for="nodeType in pmBlockNodeTypes">
42
+ <div
43
+ class="pm-block-node-types__item p-2 d-block"
44
+ :key="nodeType.id"
45
+ @click.stop="onClickHandler($event, nodeType)"
46
+ >
47
+ <div class="d-flex">
48
+ <i v-if="!nodeType.svgIcon" class="node-types__item__icon" :class="nodeType.customIcon"/>
49
+ <img v-else class="node-types__item__icon" :src="nodeType.svgIcon" :alt="$t(nodeType.label)">
50
+ <label>{{ $t(nodeType.label) }}</label>
51
+ </div>
52
+ </div>
53
+ </template>
54
+ </div>
55
+ </template>
56
+ </div>
57
+ </template>
58
+
59
+ <style lang="scss">
60
+ .pm-block-node-types {
61
+ &__item {
62
+ display: block;
63
+ padding: 0.5rem 0.3rem;
64
+ border-radius: 4px;
65
+ user-select: none;
66
+ margin-bottom: 8px;
67
+ &:hover {
68
+ background-color: #EBEEF2;
69
+ }
70
+ &__icon {
71
+ width: 1.5rem;
72
+ height: 1.5rem;
73
+ }
74
+ label {
75
+ max-width: 225px;
76
+ font-size: 14px;
77
+ line-height: 15px;
78
+ }
79
+ span {
80
+ margin-left: 1.6rem;
81
+ font-size: 13px;
82
+ color:#6C757D;
83
+ }
84
+ }
85
+ }
86
+ </style>
@@ -26,7 +26,7 @@ function isNotLane(shape) {
26
26
  function bringPoolToFront(poolShape) {
27
27
  bringShapeToFront(poolShape);
28
28
 
29
- const hasLanes = poolShape.component.node.definition.processRef.laneSets[0];
29
+ const hasLanes = poolShape.component.node.definition.processRef && poolShape.component.node.definition.processRef.laneSets[0];
30
30
  if (!hasLanes) {
31
31
  return;
32
32
  }
@@ -8,49 +8,50 @@
8
8
  <TopRail
9
9
  :validation-errors="validationErrors"
10
10
  :warnings="warnings"
11
- />
11
+ >
12
+ <component
13
+ :is="component.button"
14
+ v-for="(component, index) in validationBar"
15
+ :key="`validation-status-${index}`"
16
+ />
17
+ </TopRail>
12
18
 
13
- <align-buttons @save-state="$emit('save-state')" />
14
-
15
- <div class="btn-group btn-group-sm mr-2" role="group" aria-label="Additional controls">
16
- <b-button
17
- class="btn btn-sm btn-secondary ml-auto"
18
- data-test="panels-btn"
19
- @click="$emit('toggle-panels-compressed')"
20
- v-b-tooltip.hover
21
- :title="panelsCompressed ? $t('Show Menus') : $t('Hide Menus')"
22
- >
23
- <font-awesome-icon :icon="panelsCompressed ? expandIcon : compressIcon" />
24
- </b-button>
25
- </div>
26
- <div class="btn-group btn-group-sm" role="group" aria-label="Publish controls">
19
+ <div
20
+ class="d-flex align-items-center btn-group btn-group-sm"
21
+ role="group"
22
+ aria-label="Publish controls"
23
+ data-cy="publish-control"
24
+ >
25
+ <div class="divider" />
27
26
  <template v-if="isVersionsInstalled">
28
- <div class="d-flex justify-content-center align-items-center text-black text-capitalize" :style="{ width: '65px' }">
29
- <span class="toolbar-item mr-1" :style="{ fontWeight: 600 }">
30
- {{ versionStatus }}
31
- </span>
27
+ <div
28
+ class="toolbar-item toolbar-version-status"
29
+ data-cy="publish-version-status"
30
+ >
31
+ {{ versionStatus }}
32
32
  </div>
33
- <div class="d-flex justify-content-center align-items-center text-black text-capitalize mx-2" :style="{ width: '60px' }">
34
- <span class="toolbar-item mr-1" :style="{ fontWeight: 400 }">
35
- {{ loadingStatus }}
36
- </span>
33
+ <div
34
+ class="toolbar-item toolbar-loading-status"
35
+ data-cy="publish-loading-status"
36
+ >
37
37
  <span>
38
- <font-awesome-icon class="text-success" :icon="loadingIcon" :spin="isLoading" />
38
+ {{ loadingStatus }}
39
39
  </span>
40
+ <font-awesome-icon class="text-success" :icon="loadingIcon" :spin="isLoading" />
40
41
  </div>
41
42
  <a
42
- class="btn btn-sm btn-primary btn-autosave text-uppercase mx-2"
43
- data-test="publish-btn"
44
43
  :title="$t('Publish')"
45
44
  @click="$emit('saveBpmn')"
45
+ class="toolbar-item toolbar-publish"
46
+ data-cy="publish-btn"
46
47
  >
47
48
  {{ $t('Publish') }}
48
49
  </a>
49
50
  <a
50
- class="btn btn-sm btn-link toolbar-item btn-autosave text-black text-uppercase"
51
- data-test="close-btn"
52
51
  :title="$t('Close')"
53
52
  @click="$emit('close')"
53
+ class="toolbar-item toolbar-close"
54
+ data-cy="close-btn"
54
55
  >
55
56
  {{ $t('Close') }}
56
57
  </a>
@@ -60,18 +61,20 @@
60
61
  @navigate="onNavigate"
61
62
  @show="onShow"
62
63
  @hide="onHide"
64
+ data-cy="ellipsis-menu"
63
65
  />
64
66
  </template>
65
- <b-button
67
+ <button
66
68
  v-else
67
- class="btn btn-sm btn-secondary mini-map-btn mx-1"
69
+ class="save-button"
68
70
  data-test="mini-map-btn"
69
71
  v-b-tooltip.hover
70
72
  :title="$t('Save')"
71
73
  @click="$emit('saveBpmn')"
72
74
  >
73
75
  <font-awesome-icon :icon="saveIcon" />
74
- </b-button>
76
+ <span class="save-button-label">{{ $t('Save') }}</span>
77
+ </button>
75
78
  </div>
76
79
  </div>
77
80
  </div>
@@ -83,15 +86,12 @@ import { faCompress, faExpand, faMapMarked, faMinus, faPlus, faRedo, faUndo, faS
83
86
  import undoRedoStore from '@/undoRedoStore';
84
87
  import Breadcrumb from '@/components/toolbar/breadcrumb/Breadcrumb';
85
88
  import TopRail from '@/components/topRail/TopRail.vue';
86
- import AlignButtons from '@/components/toolbar/alignButtons/AlignButtons';
87
-
88
89
  export default {
89
90
  name: 'tool-bar',
90
91
  components: {
91
92
  Breadcrumb,
92
93
  TopRail,
93
94
  FontAwesomeIcon,
94
- AlignButtons,
95
95
  },
96
96
  props: [
97
97
  'canvasDragPosition',
@@ -103,6 +103,7 @@ export default {
103
103
  'validationErrors',
104
104
  'warnings',
105
105
  'xmlManager',
106
+ 'validationBar',
106
107
  ],
107
108
  watch: {
108
109
  miniMapOpen(isOpen) {
@@ -163,13 +164,18 @@ export default {
163
164
  spinner: faSpinner,
164
165
  ellipsisMenuActions: [
165
166
  {
166
- value: 'discard-draft',
167
- content: this.$t('Discard Draft'),
167
+ value: 'save-template',
168
+ content: this.$t('Save as Template'),
168
169
  icon: '',
169
170
  },
170
171
  {
171
- value: 'save-template',
172
- content: this.$t('Save as Template'),
172
+ value: 'save-pm-block',
173
+ content: this.$t('Save as PM Block'),
174
+ icon: '',
175
+ },
176
+ {
177
+ value: 'discard-draft',
178
+ content: this.$t('Discard Draft'),
173
179
  icon: '',
174
180
  },
175
181
  ],
@@ -202,6 +208,9 @@ export default {
202
208
  case 'save-template':
203
209
  this.$emit('publishTemplate');
204
210
  break;
211
+ case 'save-pm-block':
212
+ this.$emit('publishPmBlock');
213
+ break;
205
214
  default:
206
215
  break;
207
216
  }
@@ -220,7 +229,8 @@ export default {
220
229
  },
221
230
  },
222
231
  mounted() {
223
- if (this.$root.$children[0].process.is_template) {
232
+ const childProcess = this.$root.$children[0]?.process;
233
+ if (childProcess?.is_template) {
224
234
  const indexOfActions = this.ellipsisMenuActions.findIndex(object => {
225
235
  return object.value === 'save-template';
226
236
  });