@processmaker/modeler 1.24.4 → 1.26.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@processmaker/modeler",
3
- "version": "1.24.4",
3
+ "version": "1.26.0",
4
4
  "scripts": {
5
5
  "serve": "vue-cli-service serve",
6
6
  "open-cypress": "TZ=UTC cypress open",
package/src/.DS_Store CHANGED
Binary file
@@ -3,7 +3,7 @@ $controls-column-compressed-max-width: 95px;
3
3
  $controls-transition: 0.3s;
4
4
 
5
5
  .controls {
6
- z-index: 1;
6
+ z-index: 2;
7
7
  padding-bottom: $toolbar-height;
8
8
 
9
9
  &-column {
@@ -27,8 +27,13 @@ $controls-transition: 0.3s;
27
27
  background: #f7f7f7;
28
28
  }
29
29
 
30
- .list-group-item:first-child {
31
- border-top: 0;
30
+ .list-group-item {
31
+ &:focus-visible {
32
+ outline: none;
33
+ }
34
+ &:first-child {
35
+ border-top: 0;
36
+ }
32
37
  }
33
38
 
34
39
  .tool {
@@ -4,7 +4,7 @@ $crown-left-chevron: 0.3rem;
4
4
  .crown-config {
5
5
  background-color: $primary-color;
6
6
  position: absolute;
7
- z-index: 0;
7
+ z-index: 1;
8
8
  display: flex;
9
9
  align-items: center;
10
10
  justify-content: center;
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="crown-config" :style="style" v-if="showCrown" role="menu">
2
+ <div class="crown-config" :style="style" v-if="showCrown && !isMultiselect" role="menu">
3
3
  <slot />
4
4
 
5
5
  <association-flow-button
@@ -168,6 +168,10 @@ export default {
168
168
  this.$t = this.$t.bind(this);
169
169
  },
170
170
  computed: {
171
+ isMultiselect() {
172
+ const countSelected = store.getters.highlightedShapes.length;
173
+ return countSelected > 1;
174
+ },
171
175
  isFlow() {
172
176
  return [
173
177
  'processmaker-modeler-sequence-flow',
@@ -0,0 +1,140 @@
1
+ <template>
2
+ <div
3
+ class="crown-config crown-multiselect"
4
+ :style="style"
5
+ v-if="isMultiSelect"
6
+ role="menu"
7
+ >
8
+ <slot />
9
+
10
+ <button
11
+ v-for="button in buttons"
12
+ :key="button.label"
13
+ :aria-label="button.label"
14
+ class="btn"
15
+ :title="button.label"
16
+ :data-test="button.testId"
17
+ :role="button.role"
18
+ @mousedown.stop.prevent
19
+ @click.stop.prevent="button.action"
20
+ >
21
+ <i :class="`fa fa-${button.icon} text-white`" />
22
+ </button>
23
+ </div>
24
+ </template>
25
+
26
+ <script>
27
+ import store from '@/store';
28
+ import runningInCypressTest from '@/runningInCypressTest';
29
+
30
+ export default {
31
+ props: {
32
+ paper: Object,
33
+ },
34
+ data() {
35
+ return {
36
+ runningInCypressTest: runningInCypressTest(),
37
+ showCrown: false,
38
+ savePositionOnPointerupEventSet: false,
39
+ style: null,
40
+ taskDropdownInitiallyOpen: this.paperNotRendered(),
41
+ showReplaceModal: false,
42
+ nodeToReplace: null,
43
+ buttons: [
44
+ {
45
+ label: 'Copy Element',
46
+ icon: 'copy',
47
+ testId: 'copy-button',
48
+ role: 'menuitem',
49
+ action: this.copyElement,
50
+ },
51
+ {
52
+ label: 'Delete Element',
53
+ icon: 'trash-alt',
54
+ testId: 'delete-button',
55
+ role: 'menuitem',
56
+ action: this.deleteElement,
57
+ },
58
+ // add more buttons as necessary
59
+ ],
60
+ };
61
+ },
62
+ created() {
63
+ this.$t = this.$t.bind(this);
64
+ },
65
+ computed: {
66
+ isMultiSelect() {
67
+ const countSelected = store.getters.highlightedShapes.length;
68
+ return countSelected > 1;
69
+ },
70
+ highlightedShapes: () => store.getters.highlightedShapes,
71
+ },
72
+ methods: {
73
+ copyElement() {
74
+ // @todo: Implement copyElement
75
+ this.$emit('copy-nodes');
76
+ },
77
+ deleteElement() {
78
+ this.$emit('remove-nodes');
79
+ },
80
+ paperNotRendered() {
81
+ return !this.isRendering;
82
+ },
83
+ setNodePosition() {
84
+ this.shape.stopListening(
85
+ this.paper,
86
+ 'element:pointerup',
87
+ this.setNodePosition
88
+ );
89
+ this.savePositionOnPointerupEventSet = false;
90
+
91
+ if (!store.getters.allowSavingElementPosition) {
92
+ return;
93
+ }
94
+
95
+ this.$emit('save-state');
96
+ },
97
+ paperDoneRendering() {
98
+ if (!this.isRendering) {
99
+ return;
100
+ }
101
+
102
+ return new Promise((resolve) => this.paper.once('render:done', resolve));
103
+ },
104
+ setUpCrownConfig() {
105
+ this.paper.on(
106
+ 'render:done scale:changed translate:changed',
107
+ this.repositionCrown
108
+ );
109
+ },
110
+ setUpPositionHandling() {},
111
+ },
112
+ async mounted() {
113
+ await this.$nextTick();
114
+ await this.paperDoneRendering();
115
+ this.setUpCrownConfig();
116
+ },
117
+ };
118
+ </script>
119
+
120
+ <style scoped>
121
+ .crown-multiselect {
122
+ top: -38px;
123
+ left: 50%;
124
+ pointer-events: auto;
125
+ }
126
+ .btn {
127
+ border: none;
128
+ padding: 0;
129
+ margin-top: 0;
130
+ display: flex;
131
+ }
132
+ img {
133
+ margin: 0px 10px;
134
+ height: 15px;
135
+ }
136
+ i {
137
+ margin: 0px 10px;
138
+ font-size: 15px;
139
+ }
140
+ </style>
@@ -0,0 +1,62 @@
1
+ import ZoomInOut from './zoomInOut';
2
+ import store from '@/store';
3
+ import moveShapeByKeypress from './moveWithArrowKeys';
4
+
5
+ export default {
6
+ mixins: [ZoomInOut],
7
+ mounted() {
8
+ document.addEventListener('keydown', this.keydownListener);
9
+ document.addEventListener('keyup', this.keyupListener);
10
+ },
11
+ methods: {
12
+ handleHotkeys(event, options) {
13
+ // Pass event to all handlers
14
+ this.zoomInOutHandler(event, options);
15
+ },
16
+ keyupListener(event) {
17
+ if (event.code === 'Space') {
18
+ this.isGrabbing = false;
19
+ this.paperManager.removeEventHandler('blank:pointermove');
20
+ }
21
+ },
22
+ keydownListener(event) {
23
+ // Check if either the Control key (Windows/Linux) or the Meta key (macOS) is pressed
24
+ const isAppleOS = this.isAppleOS();
25
+ const mod = isAppleOS ? event.metaKey : event.ctrlKey;
26
+ let options = { mod, isAppleOS, modeler: this };
27
+ try {
28
+ this.handleHotkeys(event, options);
29
+ } catch (error) {
30
+ // eslint-disable-next-line no-console
31
+ console.error(error);
32
+ }
33
+
34
+ const focusIsOutsideDiagram = !event.target.toString().toLowerCase().includes('body');
35
+ if (focusIsOutsideDiagram) {
36
+ return;
37
+ }
38
+
39
+ if (event.code === 'Space') {
40
+ this.isGrabbing = true;
41
+ this.paperManager.addEventHandler('blank:pointermove', (event, x, y) => {
42
+ if (!this.canvasDragPosition) {
43
+ const scale = this.paperManager.scale;
44
+ this.canvasDragPosition = { x: x * scale.sx, y: y * scale.sy };
45
+ }
46
+ if (this.canvasDragPosition) {
47
+ this.paperManager.translate(
48
+ event.offsetX - this.canvasDragPosition.x,
49
+ event.offsetY - this.canvasDragPosition.y
50
+ );
51
+ }
52
+ });
53
+ }
54
+
55
+ moveShapeByKeypress(
56
+ event.key,
57
+ store.getters.highlightedShapes,
58
+ this.pushToUndoStack,
59
+ );
60
+ },
61
+ },
62
+ };
@@ -0,0 +1,29 @@
1
+ export default {
2
+ methods: {
3
+ zoomInOutHandler(event, options) {
4
+ const isPlus =
5
+ (event.key === '+' || event.key === 'NumpadAdd')
6
+ || (event.keyCode === 107 || event.keyCode === 187);
7
+
8
+ const isMinus =
9
+ (event.key === '-' || event.key === 'NumpadSubtract')
10
+ || (event.keyCode === 109 || event.keyCode === 189);
11
+
12
+
13
+ if (isPlus && options.mod) {
14
+ this.zoomIn(event);
15
+ }
16
+ if (isMinus && options.mod) {
17
+ this.zoomOut(event);
18
+ }
19
+ },
20
+ zoomIn(event) {
21
+ event.preventDefault();
22
+ this.canvasScale = this.paperManager.scale.sx + this.scaleStep;
23
+ },
24
+ zoomOut(event) {
25
+ event.preventDefault();
26
+ this.canvasScale = Math.max(this.minimumScale, this.paperManager.scale.sx -= this.scaleStep);
27
+ },
28
+ },
29
+ };
@@ -212,6 +212,7 @@ export default {
212
212
  return this.defaultInspectorHandler(omit(value, ['artifacts', 'flowElements', 'laneSets']));
213
213
  },
214
214
  setNodeProp(node, key, value) {
215
+ this.$emit('shape-resize');
215
216
  store.commit('updateNodeProp', { node, key, value });
216
217
  },
217
218
  defaultInspectorHandler(value) {
@@ -5,7 +5,7 @@ $inspector-column-max-width: 265px;
5
5
  }
6
6
 
7
7
  .inspector {
8
- z-index: 1;
8
+ z-index: 2;
9
9
 
10
10
  &-container {
11
11
  text-align: left;