@operato/scene-bpmn 1.1.1

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 (180) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/LICENSE +21 -0
  3. package/README.md +13 -0
  4. package/assets/favicon.ico +0 -0
  5. package/assets/images/spinner.png +0 -0
  6. package/db.sqlite +0 -0
  7. package/dist/base/bpmn-activity.d.ts +5 -0
  8. package/dist/base/bpmn-activity.js +23 -0
  9. package/dist/base/bpmn-activity.js.map +1 -0
  10. package/dist/base/bpmn-container-base.d.ts +36 -0
  11. package/dist/base/bpmn-container-base.js +167 -0
  12. package/dist/base/bpmn-container-base.js.map +1 -0
  13. package/dist/base/bpmn-control-base.d.ts +36 -0
  14. package/dist/base/bpmn-control-base.js +167 -0
  15. package/dist/base/bpmn-control-base.js.map +1 -0
  16. package/dist/bpmn-call-activity.d.ts +11 -0
  17. package/dist/bpmn-call-activity.js +19 -0
  18. package/dist/bpmn-call-activity.js.map +1 -0
  19. package/dist/bpmn-comment.d.ts +14 -0
  20. package/dist/bpmn-comment.js +53 -0
  21. package/dist/bpmn-comment.js.map +1 -0
  22. package/dist/bpmn-data-object.d.ts +25 -0
  23. package/dist/bpmn-data-object.js +106 -0
  24. package/dist/bpmn-data-object.js.map +1 -0
  25. package/dist/bpmn-data-store.d.ts +11 -0
  26. package/dist/bpmn-data-store.js +36 -0
  27. package/dist/bpmn-data-store.js.map +1 -0
  28. package/dist/bpmn-event.d.ts +25 -0
  29. package/dist/bpmn-event.js +421 -0
  30. package/dist/bpmn-event.js.map +1 -0
  31. package/dist/bpmn-flow.d.ts +19 -0
  32. package/dist/bpmn-flow.js +26 -0
  33. package/dist/bpmn-flow.js.map +1 -0
  34. package/dist/bpmn-gateway.d.ts +25 -0
  35. package/dist/bpmn-gateway.js +146 -0
  36. package/dist/bpmn-gateway.js.map +1 -0
  37. package/dist/bpmn-group.d.ts +11 -0
  38. package/dist/bpmn-group.js +35 -0
  39. package/dist/bpmn-group.js.map +1 -0
  40. package/dist/bpmn-lane.d.ts +15 -0
  41. package/dist/bpmn-lane.js +25 -0
  42. package/dist/bpmn-lane.js.map +1 -0
  43. package/dist/bpmn-pool.d.ts +14 -0
  44. package/dist/bpmn-pool.js +22 -0
  45. package/dist/bpmn-pool.js.map +1 -0
  46. package/dist/bpmn-subprocess.d.ts +19 -0
  47. package/dist/bpmn-subprocess.js +146 -0
  48. package/dist/bpmn-subprocess.js.map +1 -0
  49. package/dist/bpmn-task.d.ts +32 -0
  50. package/dist/bpmn-task.js +311 -0
  51. package/dist/bpmn-task.js.map +1 -0
  52. package/dist/editors/index.d.ts +0 -0
  53. package/dist/editors/index.js +2 -0
  54. package/dist/editors/index.js.map +1 -0
  55. package/dist/groups/index.d.ts +7 -0
  56. package/dist/groups/index.js +3 -0
  57. package/dist/groups/index.js.map +1 -0
  58. package/dist/groups/process.d.ts +6 -0
  59. package/dist/groups/process.js +48 -0
  60. package/dist/groups/process.js.map +1 -0
  61. package/dist/index.d.ts +12 -0
  62. package/dist/index.js +13 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/templates/bpmn-call-activity.d.ts +17 -0
  65. package/dist/templates/bpmn-call-activity.js +18 -0
  66. package/dist/templates/bpmn-call-activity.js.map +1 -0
  67. package/dist/templates/bpmn-comment.d.ts +19 -0
  68. package/dist/templates/bpmn-comment.js +20 -0
  69. package/dist/templates/bpmn-comment.js.map +1 -0
  70. package/dist/templates/bpmn-data-object.d.ts +19 -0
  71. package/dist/templates/bpmn-data-object.js +20 -0
  72. package/dist/templates/bpmn-data-object.js.map +1 -0
  73. package/dist/templates/bpmn-data-store.d.ts +17 -0
  74. package/dist/templates/bpmn-data-store.js +18 -0
  75. package/dist/templates/bpmn-data-store.js.map +1 -0
  76. package/dist/templates/bpmn-event.d.ts +17 -0
  77. package/dist/templates/bpmn-event.js +18 -0
  78. package/dist/templates/bpmn-event.js.map +1 -0
  79. package/dist/templates/bpmn-flow.d.ts +15 -0
  80. package/dist/templates/bpmn-flow.js +16 -0
  81. package/dist/templates/bpmn-flow.js.map +1 -0
  82. package/dist/templates/bpmn-gateway.d.ts +17 -0
  83. package/dist/templates/bpmn-gateway.js +18 -0
  84. package/dist/templates/bpmn-gateway.js.map +1 -0
  85. package/dist/templates/bpmn-group.d.ts +15 -0
  86. package/dist/templates/bpmn-group.js +16 -0
  87. package/dist/templates/bpmn-group.js.map +1 -0
  88. package/dist/templates/bpmn-lane.d.ts +17 -0
  89. package/dist/templates/bpmn-lane.js +18 -0
  90. package/dist/templates/bpmn-lane.js.map +1 -0
  91. package/dist/templates/bpmn-pool.d.ts +15 -0
  92. package/dist/templates/bpmn-pool.js +16 -0
  93. package/dist/templates/bpmn-pool.js.map +1 -0
  94. package/dist/templates/bpmn-subprocess.d.ts +17 -0
  95. package/dist/templates/bpmn-subprocess.js +18 -0
  96. package/dist/templates/bpmn-subprocess.js.map +1 -0
  97. package/dist/templates/bpmn-task.d.ts +17 -0
  98. package/dist/templates/bpmn-task.js +18 -0
  99. package/dist/templates/bpmn-task.js.map +1 -0
  100. package/dist/templates/index.d.ts +15 -0
  101. package/dist/templates/index.js +28 -0
  102. package/dist/templates/index.js.map +1 -0
  103. package/helps/bpmn/gateway/complex-decision-gateway-example.png +0 -0
  104. package/helps/bpmn/gateway/complex-decision-gateway.png +0 -0
  105. package/helps/bpmn/gateway/event-based-gateway-example.webp +0 -0
  106. package/helps/bpmn/gateway/exclusive-event-based-gateway-example.png +0 -0
  107. package/helps/bpmn/gateway/exclusive-event-based-gateway.webp +0 -0
  108. package/helps/bpmn/gateway/exclusive-gateway-example.webp +0 -0
  109. package/helps/bpmn/gateway/exclusive-gateway.png +0 -0
  110. package/helps/bpmn/gateway/gateway-types.webp +0 -0
  111. package/helps/bpmn/gateway/gateway.md +111 -0
  112. package/helps/bpmn/gateway/inclusive-gateway-example.webp +0 -0
  113. package/helps/bpmn/gateway/inclusive-gateway.png +0 -0
  114. package/helps/bpmn/gateway/parallel-event-based-gateway-example.png +0 -0
  115. package/helps/bpmn/gateway/parallel-event-based-gateway.png +0 -0
  116. package/helps/bpmn/gateway/parallel-gateway-example.webp +0 -0
  117. package/helps/bpmn/gateway/parallel-gateway.png +0 -0
  118. package/icons/bpmn-group.png +0 -0
  119. package/icons/bpmn-lane.png +0 -0
  120. package/icons/bpmn-pool.png +0 -0
  121. package/icons/icon-bpmn-association-flow.png +0 -0
  122. package/icons/icon-bpmn-call-activity.png +0 -0
  123. package/icons/icon-bpmn-comment.png +0 -0
  124. package/icons/icon-bpmn-data-object.png +0 -0
  125. package/icons/icon-bpmn-data-store.png +0 -0
  126. package/icons/icon-bpmn-event.png +0 -0
  127. package/icons/icon-bpmn-flow.png +0 -0
  128. package/icons/icon-bpmn-gateway.png +0 -0
  129. package/icons/icon-bpmn-group.png +0 -0
  130. package/icons/icon-bpmn-lane.png +0 -0
  131. package/icons/icon-bpmn-message-flow.png +0 -0
  132. package/icons/icon-bpmn-pool.png +0 -0
  133. package/icons/icon-bpmn-subprocess.png +0 -0
  134. package/icons/icon-bpmn-task.png +0 -0
  135. package/logs/.08636eb59927f12972f6774f5947c8507b3564c2-audit.json +20 -0
  136. package/logs/.5e5d741d8b7784a2fbad65eedc0fd46946aaf6f2-audit.json +20 -0
  137. package/logs/application-2022-11-03-10.log +22 -0
  138. package/logs/application-2022-11-03-11.log +18 -0
  139. package/logs/connections-2022-11-03-10.log +70 -0
  140. package/logs/connections-2022-11-03-11.log +105 -0
  141. package/package.json +60 -0
  142. package/src/base/bpmn-activity.ts +32 -0
  143. package/src/base/bpmn-container-base.ts +201 -0
  144. package/src/base/bpmn-control-base.ts +201 -0
  145. package/src/bpmn-call-activity.ts +22 -0
  146. package/src/bpmn-comment.ts +65 -0
  147. package/src/bpmn-data-object.ts +127 -0
  148. package/src/bpmn-data-store.ts +47 -0
  149. package/src/bpmn-event.ts +442 -0
  150. package/src/bpmn-flow.ts +28 -0
  151. package/src/bpmn-gateway.ts +165 -0
  152. package/src/bpmn-group.ts +39 -0
  153. package/src/bpmn-lane.ts +46 -0
  154. package/src/bpmn-pool.ts +25 -0
  155. package/src/bpmn-subprocess.ts +165 -0
  156. package/src/bpmn-task.ts +340 -0
  157. package/src/editors/index.ts +0 -0
  158. package/src/groups/index.ts +3 -0
  159. package/src/groups/process.ts +48 -0
  160. package/src/index.ts +12 -0
  161. package/src/templates/bpmn-call-activity.ts +18 -0
  162. package/src/templates/bpmn-comment.ts +20 -0
  163. package/src/templates/bpmn-data-object.ts +20 -0
  164. package/src/templates/bpmn-data-store.ts +18 -0
  165. package/src/templates/bpmn-event.ts +18 -0
  166. package/src/templates/bpmn-flow.ts +16 -0
  167. package/src/templates/bpmn-gateway.ts +18 -0
  168. package/src/templates/bpmn-group.ts +16 -0
  169. package/src/templates/bpmn-lane.ts +18 -0
  170. package/src/templates/bpmn-pool.ts +16 -0
  171. package/src/templates/bpmn-subprocess.ts +18 -0
  172. package/src/templates/bpmn-task.ts +18 -0
  173. package/src/templates/index.ts +29 -0
  174. package/things-scene.config.js +7 -0
  175. package/translations/en.json +11 -0
  176. package/translations/ko.json +11 -0
  177. package/translations/ms.json +11 -0
  178. package/translations/zh.json +11 -0
  179. package/tsconfig.json +22 -0
  180. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,201 @@
1
+ import { Anchor, BOUNDS, Component, Connectable, LinkEnd, RectPath, Shape } from '@hatiolab/things-scene'
2
+
3
+ export enum DIRECTION {
4
+ NORTH = 'N',
5
+ EAST = 'E',
6
+ SOUTH = 'S',
7
+ WEST = 'W'
8
+ }
9
+
10
+ export enum INOUT {
11
+ IN = 'in',
12
+ OUT = 'out',
13
+ INOUT = 'inout'
14
+ }
15
+
16
+ export enum FLOW {
17
+ MESSAGE = 'message',
18
+ SEQUENCE = 'sequence',
19
+ ASSOCIATION = 'association'
20
+ }
21
+
22
+ export type NODE = {
23
+ name: string
24
+ description: string
25
+ inout: INOUT
26
+ type: FLOW
27
+ direction: DIRECTION
28
+ multiplicity?: number
29
+ }
30
+
31
+ const STYLE_MAP = {
32
+ message: {
33
+ strokeStyle: 'navy',
34
+ fillStyle: 'navy'
35
+ },
36
+ sequence: {
37
+ strokeStyle: 'red',
38
+ fillStyle: 'red',
39
+ lineDash: 'long-dash-dot'
40
+ },
41
+ association: {
42
+ strokeStyle: 'yellow',
43
+ fillStyle: 'yellow',
44
+ lineDash: 'dash',
45
+ begin: 'none',
46
+ beginSize: 'size1',
47
+ end: 'none',
48
+ endSize: 'size1'
49
+ }
50
+ }
51
+
52
+ type FILTER_FUNCTION = (this: Anchor, counterEnd?: LinkEnd) => boolean
53
+
54
+ const ANCHOR_LENGTH = 8
55
+
56
+ const TEMPLATE = {
57
+ type: 'bpmn-flow',
58
+ lineWidth: 2,
59
+ strokeStyle: 'black',
60
+ begin: 'none',
61
+ beginSize: 'size1',
62
+ end: 'arrow',
63
+ endSize: 'size9',
64
+ round: 10
65
+ }
66
+
67
+ function linkFilter(this: Anchor, counterEnd?: LinkEnd) {
68
+ if (!counterEnd) {
69
+ return this.inout !== 'in'
70
+ }
71
+
72
+ const { component, anchor } = counterEnd || {}
73
+ /* FIXME remove !anchor.type condition */
74
+ return !anchor?.type || anchor.type === this.type
75
+ }
76
+
77
+ export default abstract class BPMNControlBase extends Connectable(RectPath(Shape)) {
78
+ get anchors(): Array<Anchor> {
79
+ var allNodes = this.nodes
80
+ var { left, top, width, height } = this.bounds
81
+
82
+ var right = left + width
83
+ var bottom = top + height
84
+
85
+ const dirs: Array<Array<Anchor>> = [DIRECTION.NORTH, DIRECTION.EAST, DIRECTION.SOUTH, DIRECTION.WEST].map(
86
+ direction => {
87
+ const nodes = allNodes.filter(node => node.direction === direction)
88
+ if (nodes.length === 0) {
89
+ return []
90
+ }
91
+
92
+ var dx = 0
93
+ var dy = 0
94
+ var sx = 0
95
+ var sy = 0
96
+
97
+ switch (direction) {
98
+ case DIRECTION.NORTH:
99
+ sx = left
100
+ sy = top
101
+ dx = width / (nodes.length + 1)
102
+ dy = 0
103
+
104
+ break
105
+
106
+ case DIRECTION.EAST:
107
+ sx = right
108
+ sy = top
109
+ dx = 0
110
+ dy = height / (nodes.length + 1)
111
+
112
+ break
113
+
114
+ case DIRECTION.SOUTH:
115
+ sx = left
116
+ sy = bottom
117
+ dx = width / (nodes.length + 1)
118
+ dy = 0
119
+
120
+ break
121
+
122
+ case DIRECTION.WEST:
123
+ sx = left
124
+ sy = top
125
+ dx = 0
126
+ dy = height / (nodes.length + 1)
127
+
128
+ break
129
+
130
+ default:
131
+ }
132
+
133
+ return nodes.map((node, idx) => {
134
+ const x = sx + dx * (idx + 1)
135
+ const y = sy + dy * (idx + 1)
136
+
137
+ return {
138
+ type: node.type as string,
139
+ name: node.name,
140
+ inout: node.inout,
141
+ position: {
142
+ x,
143
+ y
144
+ },
145
+ bounds: {
146
+ left: x - ANCHOR_LENGTH / 2,
147
+ top: y - ANCHOR_LENGTH / 2,
148
+ width: ANCHOR_LENGTH,
149
+ height: ANCHOR_LENGTH
150
+ },
151
+ filter: linkFilter,
152
+ template: {
153
+ ...TEMPLATE,
154
+ ...(STYLE_MAP[node.type || 'message'] || STYLE_MAP['message'])
155
+ },
156
+ multiplicity: node.multiplicity
157
+ }
158
+ })
159
+ }
160
+ )
161
+
162
+ return dirs.flat()
163
+ }
164
+
165
+ get nodes(): NODE[] {
166
+ return [
167
+ {
168
+ name: 'Left',
169
+ description: 'Left side message inout',
170
+ inout: INOUT.INOUT,
171
+ type: FLOW.MESSAGE,
172
+ direction: DIRECTION.WEST,
173
+ multiplicity: 1
174
+ },
175
+ {
176
+ name: 'Top',
177
+ description: 'Top side message inout',
178
+ inout: INOUT.INOUT,
179
+ type: FLOW.MESSAGE,
180
+ direction: DIRECTION.NORTH,
181
+ multiplicity: 1
182
+ },
183
+ {
184
+ name: 'Right',
185
+ description: 'Right side message inout',
186
+ inout: INOUT.INOUT,
187
+ type: FLOW.MESSAGE,
188
+ direction: DIRECTION.EAST,
189
+ multiplicity: 1
190
+ },
191
+ {
192
+ name: 'Down',
193
+ description: 'Down side message inout',
194
+ inout: INOUT.INOUT,
195
+ type: FLOW.MESSAGE,
196
+ direction: DIRECTION.SOUTH,
197
+ multiplicity: 1
198
+ }
199
+ ]
200
+ }
201
+ }
@@ -0,0 +1,22 @@
1
+ import { Component } from '@hatiolab/things-scene'
2
+ import BPMNActivity from './base/bpmn-activity'
3
+
4
+ const NATURE = {
5
+ mutable: false,
6
+ resizable: true,
7
+ rotatable: false,
8
+ properties: [],
9
+ help: '/eipatterns/bpmn-call-activity/bpmn-call-activity'
10
+ }
11
+
12
+ export default class BPMNCallActivity extends BPMNActivity {
13
+ static get nature() {
14
+ return NATURE
15
+ }
16
+
17
+ getImageElement(): HTMLImageElement | undefined {
18
+ return
19
+ }
20
+ }
21
+
22
+ Component.register('bpmn-call-activity', BPMNCallActivity)
@@ -0,0 +1,65 @@
1
+ import { BOUNDS, Component } from '@hatiolab/things-scene'
2
+
3
+ import BPMNControlBase, { DIRECTION, INOUT, NODE, FLOW } from './base/bpmn-control-base'
4
+
5
+ const NATURE = {
6
+ mutable: false,
7
+ resizable: true,
8
+ rotatable: false,
9
+ properties: [],
10
+ help: '/eipatterns/bpmn-comment/bpmn-comment'
11
+ }
12
+
13
+ export default class BPMNComment extends BPMNControlBase {
14
+ static get nature() {
15
+ return NATURE
16
+ }
17
+
18
+ get nodes(): NODE[] {
19
+ return [
20
+ {
21
+ name: 'Left',
22
+ description: 'Left side message inout',
23
+ inout: INOUT.INOUT,
24
+ type: FLOW.MESSAGE,
25
+ direction: DIRECTION.WEST,
26
+ multiplicity: 1
27
+ }
28
+ ]
29
+ }
30
+
31
+ render(ctx: CanvasRenderingContext2D) {
32
+ const { left, top, width, height } = this.bounds
33
+ const bracket = height / 3
34
+
35
+ ctx.translate(left, top)
36
+ ctx.beginPath()
37
+
38
+ ctx.moveTo(bracket, 0)
39
+ ctx.lineTo(0, 0)
40
+ ctx.lineTo(0, height)
41
+ ctx.lineTo(bracket, height)
42
+ this.drawStroke(ctx)
43
+
44
+ ctx.beginPath()
45
+ ctx.rect(0, 0, width, height)
46
+ this.drawFill(ctx)
47
+
48
+ ctx.beginPath()
49
+
50
+ ctx.translate(-left, -top)
51
+ }
52
+
53
+ get textBounds(): BOUNDS {
54
+ var { left, top, width, height } = this.bounds
55
+
56
+ return {
57
+ left: left + 10,
58
+ top: top + 10,
59
+ width: width - 10,
60
+ height: height - 10
61
+ }
62
+ }
63
+ }
64
+
65
+ Component.register('bpmn-comment', BPMNComment)
@@ -0,0 +1,127 @@
1
+ import { Component, Properties } from '@hatiolab/things-scene'
2
+
3
+ import BPMNControlBase from './base/bpmn-control-base'
4
+
5
+ const NATURE = {
6
+ mutable: false,
7
+ resizable: true,
8
+ rotatable: false,
9
+ properties: [
10
+ {
11
+ type: 'select',
12
+ name: 'inout',
13
+ label: 'inout',
14
+ property: {
15
+ options: [
16
+ {
17
+ display: '',
18
+ value: ''
19
+ },
20
+ {
21
+ display: 'input',
22
+ value: 'input'
23
+ },
24
+ {
25
+ display: 'output',
26
+ value: 'output'
27
+ }
28
+ ]
29
+ }
30
+ }
31
+ ],
32
+ help: '/eipatterns/bpmn-data-object/bpmn-data-object'
33
+ }
34
+
35
+ export default class BPMNDataObject extends BPMNControlBase {
36
+ private imageElement?: HTMLImageElement
37
+
38
+ static get nature() {
39
+ return NATURE
40
+ }
41
+
42
+ render(ctx: CanvasRenderingContext2D) {
43
+ var { left, top, width, height } = this.bounds
44
+
45
+ const corner = (Math.min(width, height) * 2) / 5
46
+
47
+ ctx.translate(left, top)
48
+ ctx.beginPath()
49
+
50
+ ctx.moveTo(width - corner, 0)
51
+ ctx.lineTo(width - corner, corner)
52
+ ctx.lineTo(width, corner)
53
+ ctx.lineTo(width - corner, 0)
54
+ this.drawStroke(ctx)
55
+
56
+ ctx.beginPath()
57
+ ctx.moveTo(0, 0)
58
+ ctx.lineTo(width - corner, 0)
59
+ ctx.lineTo(width - corner, corner)
60
+ ctx.lineTo(width, corner)
61
+ ctx.lineTo(width, height)
62
+ ctx.lineTo(0, height)
63
+ ctx.lineTo(0, 0)
64
+
65
+ this.drawFill(ctx)
66
+ this.drawStroke(ctx)
67
+
68
+ ctx.beginPath()
69
+
70
+ const image = this.getImageElement()
71
+ if (image) {
72
+ this.drawImage(ctx, image, 0, 0, corner, corner)
73
+ }
74
+
75
+ ctx.translate(-left, -top)
76
+ }
77
+
78
+ onchange(after: Properties, before: Properties) {
79
+ if ('inout' in after || 'strokeStyle' in after) {
80
+ delete this.imageElement
81
+ }
82
+ }
83
+
84
+ getImageElement(): HTMLImageElement | undefined {
85
+ if (!this.imageElement) {
86
+ const { inout, strokeStyle } = this.state
87
+
88
+ if (!inout) {
89
+ return
90
+ }
91
+
92
+ const src: string = IMAGES[inout]
93
+ if (!src) {
94
+ return
95
+ }
96
+
97
+ this.imageElement = new Image()
98
+ this.imageElement.src =
99
+ 'data:image/svg+xml;charset=UTF-8;base64,' + btoa(src.replace(/{{strokeColor}}/g, strokeStyle))
100
+ }
101
+
102
+ return this.imageElement
103
+ }
104
+ }
105
+
106
+ Component.register('bpmn-data-object', BPMNDataObject)
107
+
108
+ const IMAGES: { [type: string]: string } = {
109
+ input: `
110
+ <svg version="1.1" id="Layer_3" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
111
+ viewBox="0 0 35 35" style="enable-background:new 0 0 35 35;" xml:space="preserve">
112
+ <style type="text/css">
113
+ .st0{fill:none;stroke:{{strokeColor}};stroke-miterlimit:10;}
114
+ </style>
115
+ <path class="st0" d="M19,13.8V8l9.5,9.5L19,27v-5.8H6.5v-7.5H19z"/>
116
+ </svg>
117
+ `,
118
+ output: `
119
+ <svg version="1.1" id="Layer_3" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
120
+ viewBox="0 0 35 35" style="enable-background:new 0 0 35 35;" xml:space="preserve">
121
+ <style type="text/css">
122
+ .st0{fill:{{strokeColor}};}
123
+ </style>
124
+ <path class="st0" d="M19,13.8V8l9.5,9.5L19,27v-5.8H6.5v-7.5H19z"/>
125
+ </svg>
126
+ `
127
+ }
@@ -0,0 +1,47 @@
1
+ import { Component } from '@hatiolab/things-scene'
2
+
3
+ import BPMNControlBase from './base/bpmn-control-base'
4
+
5
+ const NATURE = {
6
+ mutable: false,
7
+ resizable: true,
8
+ rotatable: false,
9
+ properties: [],
10
+ help: '/eipatterns/bpmn-data-store/bpmn-data-store'
11
+ }
12
+
13
+ export default class BPMNDataStore extends BPMNControlBase {
14
+ static get nature() {
15
+ return NATURE
16
+ }
17
+
18
+ render(ctx: CanvasRenderingContext2D) {
19
+ const { left, top, width, height } = this.bounds
20
+ const ry = Math.abs(height / 6)
21
+ const startAngle = Math.PI
22
+ const endAngle = 0
23
+
24
+ ctx.translate(left, top)
25
+ ctx.beginPath()
26
+
27
+ ctx.ellipse(width / 2, ry, width / 2, ry, 0, startAngle, startAngle - Math.PI * 2, true)
28
+
29
+ ctx.moveTo(0, ry + ry / 2)
30
+ ctx.ellipse(width / 2, ry + ry / 2, width / 2, ry, 0, startAngle, endAngle, true)
31
+
32
+ ctx.moveTo(0, ry + ry)
33
+ ctx.ellipse(width / 2, ry + ry, width / 2, ry, 0, startAngle, endAngle, true)
34
+
35
+ ctx.moveTo(0, ry)
36
+ ctx.lineTo(0, height - ry)
37
+ ctx.ellipse(width / 2, height - ry, width / 2, ry, 0, startAngle, endAngle, true)
38
+ ctx.lineTo(width, ry)
39
+
40
+ this.drawFill(ctx)
41
+ this.drawStroke(ctx)
42
+
43
+ ctx.translate(-left, -top)
44
+ }
45
+ }
46
+
47
+ Component.register('bpmn-data-store', BPMNDataStore)