@operato/process 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 (197) hide show
  1. package/.storybook/main.js +3 -0
  2. package/.storybook/server.mjs +8 -0
  3. package/CHANGELOG.md +1824 -0
  4. package/LICENSE +21 -0
  5. package/README.md +95 -0
  6. package/demo/index-modeller.html +101 -0
  7. package/demo/index-viewer.html +101 -0
  8. package/demo/index.html +101 -0
  9. package/dist/src/data-storage/data-storage.d.ts +8 -0
  10. package/dist/src/data-storage/data-storage.js +28 -0
  11. package/dist/src/data-storage/data-storage.js.map +1 -0
  12. package/dist/src/graphql/data-subscription.d.ts +5 -0
  13. package/dist/src/graphql/data-subscription.js +24 -0
  14. package/dist/src/graphql/data-subscription.js.map +1 -0
  15. package/dist/src/graphql/favorite-process.d.ts +1 -0
  16. package/dist/src/graphql/favorite-process.js +23 -0
  17. package/dist/src/graphql/favorite-process.js.map +1 -0
  18. package/dist/src/graphql/index.d.ts +3 -0
  19. package/dist/src/graphql/index.js +4 -0
  20. package/dist/src/graphql/index.js.map +1 -0
  21. package/dist/src/graphql/process-group.d.ts +7 -0
  22. package/dist/src/graphql/process-group.js +125 -0
  23. package/dist/src/graphql/process-group.js.map +1 -0
  24. package/dist/src/graphql/process.d.ts +6 -0
  25. package/dist/src/graphql/process.js +130 -0
  26. package/dist/src/graphql/process.js.map +1 -0
  27. package/dist/src/graphql/scenario.d.ts +6 -0
  28. package/dist/src/graphql/scenario.js +69 -0
  29. package/dist/src/graphql/scenario.js.map +1 -0
  30. package/dist/src/index.d.ts +5 -0
  31. package/dist/src/index.js +6 -0
  32. package/dist/src/index.js.map +1 -0
  33. package/dist/src/modeller/component-toolbar/component-detail.d.ts +12 -0
  34. package/dist/src/modeller/component-toolbar/component-detail.js +58 -0
  35. package/dist/src/modeller/component-toolbar/component-detail.js.map +1 -0
  36. package/dist/src/modeller/component-toolbar/component-menu.d.ts +24 -0
  37. package/dist/src/modeller/component-toolbar/component-menu.js +190 -0
  38. package/dist/src/modeller/component-toolbar/component-menu.js.map +1 -0
  39. package/dist/src/modeller/component-toolbar/component-toolbar.d.ts +28 -0
  40. package/dist/src/modeller/component-toolbar/component-toolbar.js +168 -0
  41. package/dist/src/modeller/component-toolbar/component-toolbar.js.map +1 -0
  42. package/dist/src/modeller/component-toolbar/mode-icons.d.ts +2 -0
  43. package/dist/src/modeller/component-toolbar/mode-icons.js +86 -0
  44. package/dist/src/modeller/component-toolbar/mode-icons.js.map +1 -0
  45. package/dist/src/modeller/edit-toolbar-style.d.ts +4 -0
  46. package/dist/src/modeller/edit-toolbar-style.js +227 -0
  47. package/dist/src/modeller/edit-toolbar-style.js.map +1 -0
  48. package/dist/src/modeller/edit-toolbar.d.ts +61 -0
  49. package/dist/src/modeller/edit-toolbar.js +641 -0
  50. package/dist/src/modeller/edit-toolbar.js.map +1 -0
  51. package/dist/src/modeller/property-sidebar/abstract-property.d.ts +10 -0
  52. package/dist/src/modeller/property-sidebar/abstract-property.js +55 -0
  53. package/dist/src/modeller/property-sidebar/abstract-property.js.map +1 -0
  54. package/dist/src/modeller/property-sidebar/effects/effects-shared-style.d.ts +4 -0
  55. package/dist/src/modeller/property-sidebar/effects/effects-shared-style.js +61 -0
  56. package/dist/src/modeller/property-sidebar/effects/effects-shared-style.js.map +1 -0
  57. package/dist/src/modeller/property-sidebar/effects/effects.d.ts +20 -0
  58. package/dist/src/modeller/property-sidebar/effects/effects.js +42 -0
  59. package/dist/src/modeller/property-sidebar/effects/effects.js.map +1 -0
  60. package/dist/src/modeller/property-sidebar/effects/property-shadow.d.ts +23 -0
  61. package/dist/src/modeller/property-sidebar/effects/property-shadow.js +103 -0
  62. package/dist/src/modeller/property-sidebar/effects/property-shadow.js.map +1 -0
  63. package/dist/src/modeller/property-sidebar/effects/value-converter.d.ts +1 -0
  64. package/dist/src/modeller/property-sidebar/effects/value-converter.js +21 -0
  65. package/dist/src/modeller/property-sidebar/effects/value-converter.js.map +1 -0
  66. package/dist/src/modeller/property-sidebar/inspector/inspector.d.ts +29 -0
  67. package/dist/src/modeller/property-sidebar/inspector/inspector.js +318 -0
  68. package/dist/src/modeller/property-sidebar/inspector/inspector.js.map +1 -0
  69. package/dist/src/modeller/property-sidebar/property-shared-style.d.ts +4 -0
  70. package/dist/src/modeller/property-sidebar/property-shared-style.js +135 -0
  71. package/dist/src/modeller/property-sidebar/property-shared-style.js.map +1 -0
  72. package/dist/src/modeller/property-sidebar/property-sidebar.d.ts +43 -0
  73. package/dist/src/modeller/property-sidebar/property-sidebar.js +309 -0
  74. package/dist/src/modeller/property-sidebar/property-sidebar.js.map +1 -0
  75. package/dist/src/modeller/property-sidebar/shapes/box-padding-editor-styles.d.ts +1 -0
  76. package/dist/src/modeller/property-sidebar/shapes/box-padding-editor-styles.js +94 -0
  77. package/dist/src/modeller/property-sidebar/shapes/box-padding-editor-styles.js.map +1 -0
  78. package/dist/src/modeller/property-sidebar/shapes/shapes.d.ts +28 -0
  79. package/dist/src/modeller/property-sidebar/shapes/shapes.js +321 -0
  80. package/dist/src/modeller/property-sidebar/shapes/shapes.js.map +1 -0
  81. package/dist/src/modeller/property-sidebar/specifics/specific-properties-builder.d.ts +16 -0
  82. package/dist/src/modeller/property-sidebar/specifics/specific-properties-builder.js +132 -0
  83. package/dist/src/modeller/property-sidebar/specifics/specific-properties-builder.js.map +1 -0
  84. package/dist/src/modeller/property-sidebar/specifics/specifics.d.ts +25 -0
  85. package/dist/src/modeller/property-sidebar/specifics/specifics.js +81 -0
  86. package/dist/src/modeller/property-sidebar/specifics/specifics.js.map +1 -0
  87. package/dist/src/modeller/property-sidebar/styles/styles.d.ts +21 -0
  88. package/dist/src/modeller/property-sidebar/styles/styles.js +559 -0
  89. package/dist/src/modeller/property-sidebar/styles/styles.js.map +1 -0
  90. package/dist/src/modeller/scene-viewer/scene-handler.d.ts +11 -0
  91. package/dist/src/modeller/scene-viewer/scene-handler.js +32 -0
  92. package/dist/src/modeller/scene-viewer/scene-handler.js.map +1 -0
  93. package/dist/src/modeller/scene-viewer/scene-layer.d.ts +10 -0
  94. package/dist/src/modeller/scene-viewer/scene-layer.js +38 -0
  95. package/dist/src/modeller/scene-viewer/scene-layer.js.map +1 -0
  96. package/dist/src/modeller/scene-viewer/scene-property.d.ts +6 -0
  97. package/dist/src/modeller/scene-viewer/scene-property.js +15 -0
  98. package/dist/src/modeller/scene-viewer/scene-property.js.map +1 -0
  99. package/dist/src/modeller/scene-viewer/scene-viewer.d.ts +38 -0
  100. package/dist/src/modeller/scene-viewer/scene-viewer.js +243 -0
  101. package/dist/src/modeller/scene-viewer/scene-viewer.js.map +1 -0
  102. package/dist/src/ox-process-list.d.ts +2 -0
  103. package/dist/src/ox-process-list.js +427 -0
  104. package/dist/src/ox-process-list.js.map +1 -0
  105. package/dist/src/ox-process-modeller.d.ts +58 -0
  106. package/dist/src/ox-process-modeller.js +396 -0
  107. package/dist/src/ox-process-modeller.js.map +1 -0
  108. package/dist/src/ox-process-viewer.d.ts +51 -0
  109. package/dist/src/ox-process-viewer.js +512 -0
  110. package/dist/src/ox-process-viewer.js.map +1 -0
  111. package/dist/src/types.d.ts +37 -0
  112. package/dist/src/types.js +2 -0
  113. package/dist/src/types.js.map +1 -0
  114. package/dist/stories/index.stories.d.ts +33 -0
  115. package/dist/stories/index.stories.js +33 -0
  116. package/dist/stories/index.stories.js.map +1 -0
  117. package/dist/tsconfig.tsbuildinfo +1 -0
  118. package/icons/components/audio.png +0 -0
  119. package/icons/components/both-arrow.png +0 -0
  120. package/icons/components/color-image.png +0 -0
  121. package/icons/components/container.png +0 -0
  122. package/icons/components/dash.png +0 -0
  123. package/icons/components/donut.png +0 -0
  124. package/icons/components/ellipse.png +0 -0
  125. package/icons/components/forklift.png +0 -0
  126. package/icons/components/gif-image.png +0 -0
  127. package/icons/components/global-reference.png +0 -0
  128. package/icons/components/gray-image.png +0 -0
  129. package/icons/components/humidity-sensor.png +0 -0
  130. package/icons/components/info-window.png +0 -0
  131. package/icons/components/line.png +0 -0
  132. package/icons/components/local-reference.png +0 -0
  133. package/icons/components/no-image.png +0 -0
  134. package/icons/components/ortholine.png +0 -0
  135. package/icons/components/person.png +0 -0
  136. package/icons/components/polygon.png +0 -0
  137. package/icons/components/polyline.png +0 -0
  138. package/icons/components/popup.png +0 -0
  139. package/icons/components/rect.png +0 -0
  140. package/icons/components/single-arrow.png +0 -0
  141. package/icons/components/star.png +0 -0
  142. package/icons/components/streamline.png +0 -0
  143. package/icons/components/text.png +0 -0
  144. package/icons/components/triangle.png +0 -0
  145. package/icons/icon-collapse-active.png +0 -0
  146. package/icons/icon-collapse.png +0 -0
  147. package/icons/icon-fullscreen.png +0 -0
  148. package/icons/icon-htoolbar.png +0 -0
  149. package/icons/icon-properties-arrow-type.png +0 -0
  150. package/icons/icon-properties-gradient-direction.png +0 -0
  151. package/icons/icon-properties-label.png +0 -0
  152. package/icons/icon-properties-line-type.png +0 -0
  153. package/icons/icon-properties-padding.png +0 -0
  154. package/icons/icon-properties-ratio.png +0 -0
  155. package/icons/icon-properties-table.png +0 -0
  156. package/icons/icon-properties.png +0 -0
  157. package/icons/icon-shell-inspector.png +0 -0
  158. package/package.json +115 -0
  159. package/src/data-storage/data-storage.ts +47 -0
  160. package/src/graphql/data-subscription.ts +30 -0
  161. package/src/graphql/favorite-process.ts +25 -0
  162. package/src/graphql/index.ts +3 -0
  163. package/src/graphql/process-group.ts +138 -0
  164. package/src/graphql/process.ts +144 -0
  165. package/src/graphql/scenario.ts +79 -0
  166. package/src/index.ts +7 -0
  167. package/src/modeller/component-toolbar/component-detail.ts +58 -0
  168. package/src/modeller/component-toolbar/component-menu.ts +187 -0
  169. package/src/modeller/component-toolbar/component-toolbar.ts +173 -0
  170. package/src/modeller/component-toolbar/mode-icons.ts +86 -0
  171. package/src/modeller/edit-toolbar-style.ts +228 -0
  172. package/src/modeller/edit-toolbar.ts +641 -0
  173. package/src/modeller/property-sidebar/abstract-property.ts +69 -0
  174. package/src/modeller/property-sidebar/effects/effects-shared-style.ts +62 -0
  175. package/src/modeller/property-sidebar/effects/effects.ts +47 -0
  176. package/src/modeller/property-sidebar/effects/property-shadow.ts +114 -0
  177. package/src/modeller/property-sidebar/effects/value-converter.ts +23 -0
  178. package/src/modeller/property-sidebar/inspector/inspector.ts +361 -0
  179. package/src/modeller/property-sidebar/property-shared-style.ts +136 -0
  180. package/src/modeller/property-sidebar/property-sidebar.ts +308 -0
  181. package/src/modeller/property-sidebar/shapes/box-padding-editor-styles.ts +94 -0
  182. package/src/modeller/property-sidebar/shapes/shapes.ts +326 -0
  183. package/src/modeller/property-sidebar/specifics/specific-properties-builder.ts +144 -0
  184. package/src/modeller/property-sidebar/specifics/specifics.ts +77 -0
  185. package/src/modeller/property-sidebar/styles/styles.ts +577 -0
  186. package/src/modeller/scene-viewer/scene-handler.ts +39 -0
  187. package/src/modeller/scene-viewer/scene-layer.ts +41 -0
  188. package/src/modeller/scene-viewer/scene-property.ts +9 -0
  189. package/src/modeller/scene-viewer/scene-viewer.ts +249 -0
  190. package/src/ox-process-list.ts +459 -0
  191. package/src/ox-process-modeller.ts +396 -0
  192. package/src/ox-process-viewer.ts +555 -0
  193. package/src/types.ts +68 -0
  194. package/stories/index.stories.ts +52 -0
  195. package/tsconfig.json +23 -0
  196. package/web-dev-server.config.mjs +30 -0
  197. package/web-test-runner.config.mjs +29 -0
@@ -0,0 +1,396 @@
1
+ import '@material/mwc-fab'
2
+ import '@hatiolab/things-scene'
3
+ import './ox-process-viewer'
4
+
5
+ import { saveAs } from 'file-saver'
6
+ import { css, html, LitElement, PropertyValues } from 'lit'
7
+ import { customElement, property, query } from 'lit/decorators.js'
8
+
9
+ import { Scene, SCENE_MODE } from '@hatiolab/things-scene'
10
+ import { ScopedElementsMixin } from '@open-wc/scoped-elements'
11
+ import { OxPopup } from '@operato/popup'
12
+ import { isMacOS, togglefullscreen } from '@operato/utils'
13
+
14
+ import { ComponentGroup, ComponentTemplate } from './types'
15
+
16
+ import { ComponentToolbar } from './modeller/component-toolbar/component-toolbar'
17
+ import { EditToolbar } from './modeller/edit-toolbar'
18
+ import { PropertySidebar } from './modeller/property-sidebar/property-sidebar'
19
+ import SceneViewer from './modeller/scene-viewer/scene-viewer'
20
+ import SceneLayer from './modeller/scene-viewer/scene-layer'
21
+ import SceneProperty from './modeller/scene-viewer/scene-property'
22
+
23
+ const MACOS = isMacOS()
24
+
25
+ const ICON_PROPERTIES = new URL('../../icons/icon-properties.png', import.meta.url).href
26
+ const ICON_PROPERTIES_LINE_TYPE = new URL('../../icons/icon-properties-line-type.png', import.meta.url).href
27
+ const ICON_PROPERTIES_ARROW_TYPE = new URL('../../icons/icon-properties-arrow-type.png', import.meta.url).href
28
+ const ICON_PROPERTIES_LABEL = new URL('../../icons/icon-properties-label.png', import.meta.url).href
29
+ const ICON_PROPERTIES_PADDING = new URL('../../icons/icon-properties-padding.png', import.meta.url).href
30
+
31
+ const ICON_HTOOLBAR = new URL('../../icons/icon-htoolbar.png', import.meta.url).href
32
+ const ICON_FULLSCREEN = new URL('../../icons/icon-fullscreen.png', import.meta.url).href
33
+ const ICON_COLLAPSE = new URL('../../icons/icon-collapse.png', import.meta.url).href
34
+ const ICON_COLLAPSE_ACTIVE = new URL('../../icons/icon-collapse-active.png', import.meta.url).href
35
+
36
+ const ICON_SHELL_INSPECTOR = new URL('../../icons/icon-shell-inspector.png', import.meta.url).href
37
+
38
+ var Registry: ComponentGroup[] = []
39
+
40
+ @customElement('ox-process-modeller')
41
+ export class OxProcessModeller extends ScopedElementsMixin(LitElement) {
42
+ static styles = [
43
+ css`
44
+ :host {
45
+ display: grid;
46
+
47
+ grid-template-rows: auto 1fr;
48
+ grid-template-columns: auto 1fr auto;
49
+ grid-template-areas: 'toolbar toolbar toolbar' 'palletbar scene propertybar';
50
+ grid-gap: 0;
51
+
52
+ height: 100%;
53
+ overflow: hidden;
54
+ }
55
+
56
+ process-edit-toolbar {
57
+ grid-area: toolbar;
58
+ }
59
+
60
+ process-component-toolbar {
61
+ grid-area: palletbar;
62
+ }
63
+
64
+ process-property-sidebar {
65
+ grid-area: propertybar;
66
+ overflow: hidden;
67
+ }
68
+
69
+ #scene-wrap {
70
+ grid-area: scene;
71
+ position: relative;
72
+
73
+ display: flex;
74
+ flex-direction: row;
75
+ }
76
+
77
+ scene-viewer {
78
+ flex: 1;
79
+ width: 100%;
80
+ height: 100%;
81
+ }
82
+
83
+ mwc-fab {
84
+ position: absolute;
85
+ right: 15px;
86
+ bottom: 15px;
87
+ }
88
+
89
+ ox-popup {
90
+ width: 90%;
91
+ height: 90%;
92
+ left: 50%;
93
+ top: 50%;
94
+ transform: translateX(-50%) translateY(-50%);
95
+ background: var(--secondary-color, black);
96
+
97
+ display: flex;
98
+ justify-content: center;
99
+ flex-direction: column;
100
+ }
101
+
102
+ ox-process-viewer {
103
+ width: 98%;
104
+ height: 98%;
105
+ margin: auto;
106
+ padding: 0;
107
+ }
108
+ `
109
+ ]
110
+
111
+ static registerGroup(group: ComponentGroup) {
112
+ var found = Registry.find(inRegisterGroup => inRegisterGroup.name == group.name)
113
+
114
+ if (found) {
115
+ found = {
116
+ ...found,
117
+ ...group
118
+ }
119
+ } else {
120
+ Registry.push(group)
121
+ }
122
+ }
123
+
124
+ static registerTemplate(templates: ComponentTemplate[]): void {
125
+ templates &&
126
+ templates.forEach(template => {
127
+ var group = Registry.find(group => group.name == template.group)
128
+
129
+ if (!group) {
130
+ console.warn('Invalid group', group, template)
131
+ return
132
+ }
133
+
134
+ if (!group.templates.find(inGroupTemplate => inGroupTemplate.type == template.type)) {
135
+ group.templates.push(template)
136
+ }
137
+ })
138
+ }
139
+
140
+ static get groups(): ComponentGroup[] {
141
+ return Registry
142
+ }
143
+
144
+ static getGroup(name: string) {
145
+ return Registry.find(group => group.name === name)
146
+ }
147
+
148
+ @property({ type: String }) processName: string = ''
149
+ @property({ type: Object }) model: any = null
150
+ @property({ type: String }) baseUrl: string = ''
151
+ @property({ type: Array }) selected: any[] = []
152
+ @property({ type: Number }) mode: SCENE_MODE = SCENE_MODE.EDIT
153
+ @property({ type: Object }) provider: any = null
154
+ @property({ type: Boolean }) hideProperty: boolean = false
155
+ @property({ type: String }) overlay: string = ''
156
+ @property({ type: Object }) scene?: Scene
157
+ @property({ type: Array }) componentGroupList: any[] = []
158
+ @property({ type: Array }) fonts: any[] = []
159
+ @property({ type: Array }) propertyEditor: any[] = []
160
+
161
+ @query('process-edit-toolbar') private editToolbar!: EditToolbar
162
+
163
+ private group: string = ''
164
+ private shortcutHandler?: (e: KeyboardEvent) => void
165
+
166
+ constructor() {
167
+ super()
168
+
169
+ document.addEventListener('get-all-scene-component-ids', (e: Event) => {
170
+ var { component, callback } = (e as CustomEvent).detail
171
+
172
+ if (!this.scene) return
173
+
174
+ var ids
175
+ if (component) {
176
+ ids = this.scene.findAll(component).map(c => c.model.id)
177
+ } else {
178
+ // @ts-ignore
179
+ ids = this.scene.ids.map(({ key }) => key)
180
+ }
181
+
182
+ ids = ids.filter(id => !!id).sort()
183
+ callback(ids)
184
+ })
185
+
186
+ this.style.setProperty('--url-icon-properties', `url(${ICON_PROPERTIES})`)
187
+ this.style.setProperty('--url-icon-properties-label', `url(${ICON_PROPERTIES_LABEL})`)
188
+ this.style.setProperty('--url-icon-properties-padding', `url(${ICON_PROPERTIES_PADDING})`)
189
+ this.style.setProperty('--url-icon-properties-line-type', `url(${ICON_PROPERTIES_LINE_TYPE})`)
190
+ this.style.setProperty('--url-icon-properties-arrow-type', `url(${ICON_PROPERTIES_ARROW_TYPE})`)
191
+
192
+ this.style.setProperty('--url-icon-htoolbar', `url(${ICON_HTOOLBAR})`)
193
+ this.style.setProperty('--url-icon-fullscreen', `url(${ICON_FULLSCREEN})`)
194
+ this.style.setProperty('--url-icon-collapse', `url(${ICON_COLLAPSE})`)
195
+ this.style.setProperty('--url-icon-collapse-active', `url(${ICON_COLLAPSE_ACTIVE})`)
196
+
197
+ this.style.setProperty('--url-icon-shell-inspector', `url(${ICON_SHELL_INSPECTOR})`)
198
+ }
199
+
200
+ static get scopedElements() {
201
+ return {
202
+ 'process-edit-toolbar': EditToolbar,
203
+ 'process-property-sidebar': PropertySidebar,
204
+ 'process-component-toolbar': ComponentToolbar,
205
+ 'scene-viewer': SceneViewer,
206
+ 'scene-layer': SceneLayer,
207
+ 'scene-property': SceneProperty
208
+ }
209
+ }
210
+
211
+ render() {
212
+ return html`
213
+ <process-edit-toolbar
214
+ .scene=${this.scene}
215
+ .selected=${this.selected}
216
+ @hide-property-changed=${(e: CustomEvent) => (this.hideProperty = e.detail.value)}
217
+ @open-preview=${() => this.preview()}
218
+ @download-model=${() => this.downloadModel()}
219
+ @modeller-fullscreen=${() => togglefullscreen(this)}
220
+ >
221
+ ${this.renderBrandingZone()}
222
+ </process-edit-toolbar>
223
+
224
+ <process-component-toolbar
225
+ .scene=${this.scene}
226
+ .mode=${this.mode}
227
+ @mode-changed=${(e: CustomEvent) => {
228
+ this.mode = e.detail.value
229
+ }}
230
+ .componentGroupList=${this.componentGroupList}
231
+ .group=${this.group}
232
+ >
233
+ </process-component-toolbar>
234
+
235
+ <div id="scene-wrap">
236
+ <scene-viewer
237
+ id="scene"
238
+ .scene=${this.scene}
239
+ @scene-changed=${(e: CustomEvent) => {
240
+ this.scene = e.detail.value
241
+ }}
242
+ .model=${this.model}
243
+ .selected=${this.selected}
244
+ @selected-changed=${(e: CustomEvent) => {
245
+ this.selected = e.detail.value
246
+ }}
247
+ .mode=${this.mode}
248
+ @mode-changed=${(e: CustomEvent) => {
249
+ this.mode = e.detail.value
250
+ }}
251
+ fit="ratio"
252
+ .baseUrl=${this.baseUrl}
253
+ @contextmenu=${() => this.onContextMenu()}
254
+ .provider=${this.provider}
255
+ name="modeller"
256
+ >
257
+ <scene-layer type="selection-layer"></scene-layer>
258
+ <scene-layer type="modeling-layer"></scene-layer>
259
+ <scene-layer type="add-layer"> </scene-layer>
260
+ <scene-layer type="guide-layer">
261
+ <scene-property name="ruler" value="disabled"></scene-property>
262
+ </scene-layer>
263
+ <scene-layer type="shift-layer">
264
+ <scene-property name="text" value="${this.overlay}"></scene-property>
265
+ <scene-property name="alpha" value="0.3"></scene-property>
266
+ <scene-property name="fontFamily" value="arial"></scene-property>
267
+ <scene-property name="fontSize" value="30" type="number"></scene-property>
268
+ <scene-property name="fontColor" value="navy"></scene-property>
269
+ <scene-property name="textBaseline" value="top"></scene-property>
270
+ <scene-property name="textAlign" value="left"></scene-property>
271
+ <scene-property name="paddingTop" value="50" type="number"></scene-property>
272
+ <scene-property name="paddingLeft" value="50" type="number"></scene-property>
273
+ </scene-layer>
274
+ <scene-layer type="decotag-layer"></scene-layer>
275
+ <scene-handler type="text-editor"></scene-handler>
276
+ <scene-handler type="move-handler"></scene-handler>
277
+ </scene-viewer>
278
+
279
+ <mwc-fab icon="save" @click=${() => this.onTapSave()} title="save"> </mwc-fab>
280
+ </div>
281
+
282
+ <process-property-sidebar
283
+ .scene=${this.scene}
284
+ .selected=${this.selected}
285
+ .collapsed=${this.hideProperty}
286
+ .fonts=${this.fonts}
287
+ .propertyEditor=${this.propertyEditor}
288
+ >
289
+ </process-property-sidebar>
290
+ `
291
+ }
292
+
293
+ connectedCallback(): void {
294
+ super.connectedCallback()
295
+ this.bindShortcutEvent()
296
+ }
297
+
298
+ disconnectedCallback(): void {
299
+ super.disconnectedCallback()
300
+ this.unbindShortcutEvent()
301
+ }
302
+
303
+ updated(changes: PropertyValues<this>): void {
304
+ if (changes.has('scene')) {
305
+ if (this.scene) {
306
+ this.scene.anchorStarterTemplate = {
307
+ type: 'streamline',
308
+ lineWidth: 2,
309
+ strokeStyle: 'black',
310
+ begin: 'oval',
311
+ beginSize: 'size9',
312
+ end: 'arrow',
313
+ endSize: 'size9',
314
+ round: 10
315
+ }
316
+ }
317
+ }
318
+ }
319
+
320
+ close() {
321
+ this.model = null
322
+ this.requestUpdate()
323
+ }
324
+
325
+ onShortcut(e: KeyboardEvent) {
326
+ if (MACOS) var ctrlKey = e.metaKey
327
+ else var ctrlKey = e.ctrlKey
328
+
329
+ switch (e.code) {
330
+ case 'KeyS':
331
+ if (ctrlKey) {
332
+ this.onTapSave()
333
+ e.preventDefault()
334
+ }
335
+ break
336
+ }
337
+ }
338
+
339
+ preview() {
340
+ const process = {
341
+ id: 'preview',
342
+ model: this.scene?.model ? JSON.parse(JSON.stringify(this.scene.model)) : null
343
+ }
344
+
345
+ OxPopup.open({
346
+ template: html` <ox-process-viewer .provider=${this.provider} .process=${process}></ox-process-viewer> `,
347
+ parent: this.renderRoot as Element
348
+ })
349
+
350
+ requestAnimationFrame(() => {
351
+ dispatchEvent(new Event('resize'))
352
+ })
353
+ }
354
+
355
+ downloadModel() {
356
+ if (!this.scene) return
357
+
358
+ var model = JSON.stringify(this.model, null, 2)
359
+ var filename = (this.processName || 'NONAME') + '-' + Date.now() + '.json'
360
+ saveAs(new Blob([model], { type: 'application/octet-stream' }), filename)
361
+ }
362
+
363
+ renderBrandingZone() {
364
+ return html``
365
+ }
366
+
367
+ onTapSave() {
368
+ this.dispatchEvent(new CustomEvent('save-model', { bubbles: true, composed: true, detail: { model: this.model } }))
369
+ }
370
+
371
+ bindShortcutEvent() {
372
+ // TODO: Global Hotkey에 대한 정의를 process-edit-toolbar에서 가져올 수 있도록 수정해야 함.
373
+ const GLOBAL_HOTKEYS = ['Digit1', 'Digit2', 'F11', 'KeyD', 'KeyP', 'KeyS']
374
+
375
+ this.shortcutHandler = (e: KeyboardEvent) => {
376
+ const target = e.composedPath()[0] as HTMLElement
377
+ var tagName = target.tagName
378
+ var isInput = target.isContentEditable || tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA'
379
+ var isGlobalHotkey = GLOBAL_HOTKEYS.includes(e.code)
380
+
381
+ if (!isGlobalHotkey && isInput) return
382
+ if (!this.editToolbar.onShortcut(e)) this.onShortcut(e)
383
+ }
384
+
385
+ document.addEventListener('keydown', this.shortcutHandler)
386
+ }
387
+
388
+ unbindShortcutEvent() {
389
+ if (this.shortcutHandler) {
390
+ document.removeEventListener('keydown', this.shortcutHandler)
391
+ delete this.shortcutHandler
392
+ }
393
+ }
394
+
395
+ onContextMenu() {}
396
+ }