@operato/process 7.1.30 → 7.1.32

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 (57) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/tsconfig.tsbuildinfo +1 -1
  3. package/package.json +14 -14
  4. package/.storybook/main.js +0 -3
  5. package/.storybook/preview.js +0 -52
  6. package/.storybook/server.mjs +0 -8
  7. package/demo/index-modeller.html +0 -112
  8. package/demo/index-viewer.html +0 -112
  9. package/demo/index.html +0 -112
  10. package/src/data-storage/data-storage.ts +0 -47
  11. package/src/graphql/data-subscription.ts +0 -30
  12. package/src/graphql/favorite-process.ts +0 -25
  13. package/src/graphql/index.ts +0 -3
  14. package/src/graphql/process-group.ts +0 -138
  15. package/src/graphql/process.ts +0 -141
  16. package/src/graphql/scenario.ts +0 -79
  17. package/src/index.ts +0 -8
  18. package/src/modeller/component-toolbar/component-detail.ts +0 -58
  19. package/src/modeller/component-toolbar/component-menu.ts +0 -193
  20. package/src/modeller/component-toolbar/component-toolbar.ts +0 -196
  21. package/src/modeller/component-toolbar/mode-icons.ts +0 -88
  22. package/src/modeller/edit-toolbar-style.ts +0 -229
  23. package/src/modeller/edit-toolbar.ts +0 -576
  24. package/src/modeller/property-sidebar/abstract-property.ts +0 -69
  25. package/src/modeller/property-sidebar/data-binding/data-binding-mapper.ts +0 -475
  26. package/src/modeller/property-sidebar/data-binding/data-binding.ts +0 -479
  27. package/src/modeller/property-sidebar/effects/effects-shared-style.ts +0 -62
  28. package/src/modeller/property-sidebar/effects/effects.ts +0 -52
  29. package/src/modeller/property-sidebar/effects/property-event-hover.ts +0 -201
  30. package/src/modeller/property-sidebar/effects/property-event-tap.ts +0 -212
  31. package/src/modeller/property-sidebar/effects/property-event.ts +0 -76
  32. package/src/modeller/property-sidebar/effects/property-shadow.ts +0 -114
  33. package/src/modeller/property-sidebar/effects/value-converter.ts +0 -23
  34. package/src/modeller/property-sidebar/inspector/inspector.ts +0 -408
  35. package/src/modeller/property-sidebar/property-shared-style.ts +0 -136
  36. package/src/modeller/property-sidebar/property-sidebar.ts +0 -342
  37. package/src/modeller/property-sidebar/shapes/box-padding-editor-styles.ts +0 -94
  38. package/src/modeller/property-sidebar/shapes/shapes.ts +0 -410
  39. package/src/modeller/property-sidebar/specifics/specific-properties-builder.ts +0 -147
  40. package/src/modeller/property-sidebar/specifics/specifics.ts +0 -81
  41. package/src/modeller/property-sidebar/styles/styles.ts +0 -577
  42. package/src/ox-editor-process-selector.ts +0 -91
  43. package/src/ox-process-list.ts +0 -401
  44. package/src/ox-process-modeller.ts +0 -432
  45. package/src/ox-process-template-list.ts +0 -272
  46. package/src/ox-process-template-viewer.ts +0 -198
  47. package/src/ox-process-viewer.ts +0 -575
  48. package/src/ox-property-editor-process-selector.ts +0 -23
  49. package/src/selector/ox-process-creation-card.ts +0 -95
  50. package/src/selector/ox-process-selector.ts +0 -324
  51. package/src/selector/process-creation-popup.ts +0 -151
  52. package/src/selector/process-thumbnail-card.ts +0 -175
  53. package/src/types.ts +0 -57
  54. package/stories/index.stories.ts +0 -54
  55. package/tsconfig.json +0 -24
  56. package/web-dev-server.config.mjs +0 -30
  57. package/web-test-runner.config.mjs +0 -29
@@ -1,575 +0,0 @@
1
- import '@material/web/icon/icon.js'
2
- import '@material/web/fab/fab.js'
3
-
4
- import { css, html, LitElement, PropertyValues } from 'lit'
5
- import { customElement, property, query, state } from 'lit/decorators.js'
6
-
7
- import { Component, create, ReferenceProvider, SCENE_MODE } from '@hatiolab/things-scene'
8
- import { isIOS, togglefullscreen } from '@operato/utils'
9
- import { ScrollbarStyles } from '@operato/styles'
10
-
11
- import { DataStorage } from './data-storage/data-storage.js'
12
- import { DataSubscriptionProviderImpl } from './graphql/data-subscription.js'
13
- import { runScenario, startScenario } from './graphql/scenario.js'
14
-
15
- @customElement('ox-process-viewer')
16
- export class OxProcessViewer extends LitElement {
17
- static styles = [
18
- ScrollbarStyles,
19
- css`
20
- :host {
21
- display: flex;
22
- flex-direction: column;
23
-
24
- position: relative;
25
-
26
- width: 100%; /* 전체화면보기를 위해서 필요함. */
27
- overflow: hidden;
28
- }
29
-
30
- #target {
31
- flex: 1;
32
-
33
- width: 100%; /* 전체화면보기를 위해서 필요함. */
34
- height: 100%;
35
-
36
- outline: 0;
37
- }
38
-
39
- /* navigation buttons */
40
- #prev,
41
- #next {
42
- z-index: 10;
43
- position: absolute;
44
- top: 45%;
45
- min-width: 50px;
46
- width: 50px;
47
- height: 50px;
48
- margin: 0;
49
- padding: 0;
50
- color: #fff;
51
- user-select: none;
52
-
53
- --md-icon-size: 3em;
54
- }
55
-
56
- md-icon[hidden] {
57
- display: none;
58
- }
59
-
60
- md-icon:hover {
61
- background-color: rgba(0, 0, 0, 0.2);
62
- border-radius: 50%;
63
- }
64
-
65
- #prev {
66
- left: 5px;
67
- }
68
-
69
- #next {
70
- right: 5px;
71
- }
72
-
73
- #fullscreen {
74
- position: absolute;
75
- bottom: 15px;
76
- right: 16px;
77
- }
78
-
79
- [hidden] {
80
- display: none;
81
- }
82
-
83
- @media print {
84
- md-fab,
85
- md-icon {
86
- display: none;
87
- }
88
- }
89
- `
90
- ]
91
-
92
- @property({ type: String }) baseUrl: string = ''
93
- @property({ type: Object }) process: any = {}
94
- @property({ type: Object }) provider: ReferenceProvider | null = null
95
- @property({ type: Object }) data: any
96
- @property({ type: Object }) values: any
97
-
98
- @property({ type: Boolean, reflect: true, attribute: 'hide-fullscreen' }) hideFullscreen = false
99
- @property({ type: Boolean, reflect: true, attribute: 'hide-navigation' }) hideNavigation = false
100
-
101
- @state() _scene: any = null
102
- @state() _forward: { id: string; scene: any }[] = []
103
- @state() _backward: { id: string; scene: any }[] = []
104
-
105
- @state() _oldtarget?: HTMLElement
106
- @state() _fade_animations?: Array<Animation>
107
-
108
- public currentProcessId?: string = this.process?.id
109
-
110
- @query('#target') _target!: HTMLElement
111
- @query('#prev') _prev!: HTMLElement
112
- @query('#next') _next!: HTMLElement
113
- @query('#fullscreen') _fullscreen!: HTMLElement
114
-
115
- render() {
116
- var fullscreen =
117
- !isIOS() && !this.hideFullscreen
118
- ? html`
119
- <md-fab
120
- id="fullscreen"
121
- @click=${(e: Event) => this.onTapFullscreen()}
122
- @mouseover=${(e: Event) => this.transientShowButtons(true)}
123
- @mouseout=${(e: Event) => this.transientShowButtons()}
124
- title="fullscreen"
125
- >
126
- <md-icon slot="icon">${document.fullscreenElement ? 'fullscreen_exit' : 'fullscreen'}</md-icon>
127
- </md-fab>
128
- `
129
- : html``
130
-
131
- var prev = !this.hideNavigation
132
- ? html`
133
- <md-icon
134
- id="prev"
135
- @click=${(e: Event) => this.onTapPrev()}
136
- @mouseover=${(e: Event) => this.transientShowButtons(true)}
137
- @mouseout=${(e: Event) => this.transientShowButtons()}
138
- hidden
139
- >keyboard_arrow_left</md-icon
140
- >
141
- `
142
- : html``
143
-
144
- var next = !this.hideNavigation
145
- ? html`
146
- <md-icon
147
- id="next"
148
- @click=${(e: Event) => this.onTapNext()}
149
- @mouseover=${(e: Event) => this.transientShowButtons(true)}
150
- @mouseout=${(e: Event) => this.transientShowButtons()}
151
- hidden
152
- >keyboard_arrow_right</md-icon
153
- >
154
- `
155
- : html``
156
-
157
- return html`
158
- ${prev}
159
-
160
- <div
161
- id="target"
162
- @touchstart=${(e: Event) => this.transientShowButtons()}
163
- @mousemove=${(e: Event) => this.transientShowButtons()}
164
- ></div>
165
-
166
- ${next} ${fullscreen}
167
- `
168
- }
169
-
170
- connectedCallback() {
171
- super.connectedCallback()
172
-
173
- window.addEventListener('resize', () => {
174
- this._scene && this._scene.fit()
175
- })
176
-
177
- this.renderRoot.addEventListener(
178
- 'close-scene',
179
- e => {
180
- e.preventDefault()
181
- this.onTapPrev()
182
- },
183
- false
184
- )
185
- }
186
-
187
- disconnectedCallback() {
188
- super.disconnectedCallback()
189
-
190
- this.closeScene()
191
- }
192
-
193
- updated(changes: PropertyValues<this>) {
194
- if (changes.has('process')) {
195
- this.closeScene()
196
-
197
- if (this.process && this.process.id) {
198
- if (this.process.model) {
199
- this.initScene()
200
- } else {
201
- this.initSceneAsync()
202
- }
203
- }
204
- }
205
-
206
- if (changes.has('data') && this._scene && this.data) {
207
- this._scene.data = this.data
208
- }
209
-
210
- if (changes.has('values') && this._scene && this.values) {
211
- this._scene.values = this.values
212
- }
213
- }
214
-
215
- async initSceneAsync() {
216
- if (!this.process || !this.process.id) return
217
-
218
- this._scene = await this.provider!.get(this.process.id, true)
219
- this.setupScene({ id: this.process.id, scene: this._scene })
220
- }
221
-
222
- initScene() {
223
- if (!this.process || !this.process.id) return
224
-
225
- this._scene = create({
226
- model: {
227
- ...this.process.model
228
- },
229
- mode: SCENE_MODE.VIEW,
230
- refProvider: this.provider!,
231
- dataStorage: this.process.id !== 'preview' ? new DataStorage(this.process.id) : undefined,
232
- dataSubscriptionProvider: new DataSubscriptionProviderImpl()
233
- })
234
-
235
- if (this.baseUrl) {
236
- this._scene.baseUrl = this.baseUrl
237
- }
238
-
239
- this.provider!.add(this.process.id, this._scene)
240
-
241
- this.setupScene({ id: this.process.id, scene: this._scene })
242
- }
243
-
244
- closeScene() {
245
- if (this._scene) {
246
- this.unbindSceneEvents(this._scene)
247
-
248
- this._scene.target = null
249
- this._scene.release && this._scene.release()
250
-
251
- this._scene = null
252
- }
253
-
254
- // delete queued scenes
255
- this._forward.forEach(({ scene }) => scene.release && scene.release())
256
- this._forward = []
257
-
258
- this._backward.forEach(({ scene }) => scene.release && scene.release())
259
- this._backward = []
260
- }
261
-
262
- releaseScene() {
263
- this.closeScene()
264
- this.transientShowButtons()
265
- }
266
-
267
- setupScene({ id, scene }: { id: string; scene: any }) {
268
- this._scene = scene
269
-
270
- const backgroundColor = this._scene?.root.state.fillStyle
271
- if (typeof backgroundColor === 'string') {
272
- this.style.backgroundColor = backgroundColor
273
- } else {
274
- this.style.backgroundColor = 'initial'
275
- }
276
-
277
- /* scene의 기존 target을 보관한다. */
278
- this._oldtarget = this._scene.target
279
-
280
- this._scene.fit(this._scene.fitMode)
281
- this._scene.target = this._target
282
-
283
- if (this.data) {
284
- this._scene.data = this.data
285
- }
286
- if (this.values) {
287
- this._scene.values = this.values
288
- }
289
-
290
- this.currentProcessId = id
291
-
292
- this.bindSceneEvents()
293
-
294
- this.transientShowButtons()
295
- }
296
-
297
- async showScene(processId: string, bindingData?: any) {
298
- if (!processId) return
299
-
300
- try {
301
- var scene = await this.provider!.get(processId, true)
302
-
303
- if (scene === this._scene) {
304
- scene.release && scene.release()
305
- return
306
- }
307
-
308
- if (this._scene) {
309
- /* old scene을 _backward에 보관한다. */
310
- this.unbindSceneEvents(this._scene)
311
- /* 원래의 target에 되돌린다. */
312
- this._scene.target = this._oldtarget
313
- this._backward.push({ id: this.currentProcessId!, scene: this._scene })
314
- }
315
-
316
- this._scene = scene
317
-
318
- this._forward.forEach(({ scene }) => scene.release && scene.release())
319
-
320
- /* forward를 비운다. */
321
- this._forward = []
322
-
323
- this.setupScene({ id: processId, scene })
324
-
325
- if (bindingData) {
326
- scene.data = bindingData
327
- }
328
- } catch (e) {
329
- console.error(e)
330
- }
331
- }
332
-
333
- bindSceneEvents() {
334
- this._scene.on('run', this.onRunProcess, this)
335
- this._scene.on('goto', this.onLinkGoto, this)
336
- this._scene.on('link-open', this.onLinkOpen, this)
337
- this._scene.on('link-move', this.onLinkMove, this)
338
- this._scene.on('route-page', this.onRoutePage, this)
339
- this._scene.on('start-scenario', this.onStartScenario, this)
340
- this._scene.on('run-scenario', this.onRunScenario, this)
341
- }
342
-
343
- unbindSceneEvents(scene: any) {
344
- scene.off('run', this.onRunProcess, this)
345
- scene.off('goto', this.onLinkGoto, this)
346
- scene.off('link-open', this.onLinkOpen, this)
347
- scene.off('link-move', this.onLinkMove, this)
348
- scene.off('route-page', this.onRoutePage, this)
349
- scene.off('start-scenario', this.onStartScenario, this)
350
- scene.off('run-scenario', this.onRunScenario, this)
351
- }
352
-
353
- transientShowButtons(stop?: boolean) {
354
- var buttons = []
355
- !this.hideNavigation && buttons.push(this._next, this._prev)
356
- !this.hideFullscreen && buttons.push(this._fullscreen)
357
-
358
- if (buttons.length == 0) {
359
- return
360
- }
361
-
362
- if (!this._fade_animations) {
363
- this._fade_animations = buttons
364
- .filter(button => button)
365
- .map(button => {
366
- let animation = button.animate(
367
- [
368
- {
369
- opacity: 1,
370
- easing: 'ease-in'
371
- },
372
- { opacity: 0 }
373
- ],
374
- { delay: 1000, duration: 2000 }
375
- )
376
-
377
- animation.onfinish = () => {
378
- button.setAttribute('hidden', '')
379
- }
380
-
381
- return animation
382
- })
383
- }
384
-
385
- this._forward.length <= 0 ? this._next.setAttribute('hidden', '') : this._next.removeAttribute('hidden')
386
- this._backward.length <= 0 ? this._prev.setAttribute('hidden', '') : this._prev.removeAttribute('hidden')
387
- this._fullscreen && this._fullscreen.removeAttribute('hidden')
388
-
389
- this._fade_animations.forEach(animation => {
390
- animation.cancel()
391
- if (stop) return
392
-
393
- animation.play()
394
- })
395
- }
396
-
397
- /* event handlers */
398
-
399
- onTapNext() {
400
- var { id, scene } = this._forward.pop() || {}
401
- if (!scene) return
402
-
403
- if (this._scene) {
404
- this._scene.target = null
405
- /* 원래의 target에 되돌린다. */
406
- this._scene.target = this._oldtarget
407
- this.unbindSceneEvents(this._scene)
408
- this._backward.push({ id: id!, scene: this._scene })
409
- }
410
-
411
- this.setupScene({ id: id!, scene })
412
- }
413
-
414
- onTapPrev() {
415
- var { id, scene } = this._backward.pop() || {}
416
- if (!scene) return
417
-
418
- if (this._scene) {
419
- this._scene.target = null
420
- /* 원래의 target에 되돌린다. */
421
- this._scene.target = this._oldtarget
422
- this.unbindSceneEvents(this._scene)
423
- this._forward.push({ id: id!, scene: this._scene })
424
- }
425
-
426
- this.setupScene({ id: id!, scene })
427
- }
428
-
429
- onTapFullscreen() {
430
- togglefullscreen(
431
- this,
432
- () => this.requestUpdate(),
433
- () => this.requestUpdate()
434
- )
435
- }
436
-
437
- onRunProcess() {
438
- this.dispatchEvent(new CustomEvent('run-process', { bubbles: true, composed: true, detail: this.process.id }))
439
- }
440
-
441
- onLinkGoto(targetProcessId: string, options: any, fromComponent: any) {
442
- const { input, output } = options || { input: '(self)' }
443
- const data = input && fromComponent.root.findFirst(input, fromComponent)?.data
444
- this.showScene(targetProcessId, data)
445
- }
446
-
447
- onLinkOpen(url: string, value: any, fromComponent: Component) {
448
- if (!url) return
449
-
450
- try {
451
- window.open(url)
452
- } catch (ex) {
453
- document.dispatchEvent(
454
- new CustomEvent('notify', {
455
- detail: {
456
- level: 'error',
457
- message: ex,
458
- ex
459
- }
460
- })
461
- )
462
- }
463
- }
464
-
465
- onLinkMove(url: string, value: any, fromComponent: Component) {
466
- if (!url) return
467
-
468
- location.href = url
469
- }
470
-
471
- onRoutePage(page: string) {
472
- if (!page) {
473
- return
474
- }
475
-
476
- history.pushState({}, '', page)
477
- window.dispatchEvent(new Event('popstate'))
478
- }
479
-
480
- async onStartScenario(scenario: string, value: string | number | object, component: Component) {
481
- try {
482
- await startScenario(scenario, scenario, value)
483
- } catch (e) {
484
- console.error(e)
485
- }
486
- }
487
-
488
- async onRunScenario(scenario: string, value: string | number | object, component: Component) {
489
- try {
490
- component.data = await runScenario(scenario, value)
491
- } catch (e) {
492
- console.error(e)
493
- }
494
- }
495
-
496
- getSceneData() {
497
- return this._scene?.data
498
- }
499
-
500
- getSceneValues() {
501
- return this._scene?.values
502
- }
503
-
504
- async getSceneImageData(base64 = false) {
505
- if (!this._scene) {
506
- return
507
- }
508
-
509
- var { width, height } = this._scene.model
510
- var pixelRatio = window.devicePixelRatio
511
-
512
- // 1. Scene의 바운드에 근거하여, 오프스크린 캔바스를 만든다.
513
- var canvas = document.createElement('canvas')
514
- canvas.width = Number(width)
515
- canvas.height = Number(height)
516
-
517
- var root = this._scene.root
518
- // 2. 모델레이어의 원래 위치와 스케일을 저장한다.
519
- var translate = root.get('translate')
520
- var scale = root.get('scale')
521
-
522
- // 3. 위치와 스케일 기본 설정.
523
- root.set('translate', { x: 0, y: 0 })
524
- root.set('scale', { x: 1 / pixelRatio, y: 1 / pixelRatio })
525
-
526
- // 4. 오프스크린 캔바스의 Context2D를 구한뒤, 모델레이어를 그 위에 그린다.
527
- var context = canvas.getContext('2d')
528
-
529
- root.draw(context)
530
-
531
- root.set('translate', translate)
532
- root.set('scale', scale)
533
-
534
- var data = base64 ? canvas.toDataURL() : context!.getImageData(0, 0, width, height).data
535
-
536
- return {
537
- width,
538
- height,
539
- data
540
- }
541
- }
542
-
543
- async printTrick(image: string) {
544
- var viewTarget: HTMLElement | null = null
545
- var printTarget: HTMLImageElement | null = null
546
-
547
- if (!image) {
548
- image = (await this.getSceneImageData(true))?.data as string
549
- }
550
-
551
- printTarget = document.createElement('img')
552
- printTarget.id = 'target'
553
- printTarget.src = image
554
- printTarget.style.width = '100%'
555
- printTarget.style.height = '100%'
556
-
557
- const x = (mql: MediaQueryListEvent) => {
558
- if (mql.matches) {
559
- if (!viewTarget) {
560
- viewTarget = (this.renderRoot as ShadowRoot)!.getElementById('target')
561
- this.renderRoot.replaceChild(printTarget!, viewTarget!)
562
- }
563
- } else {
564
- this.renderRoot.replaceChild(viewTarget!, printTarget!)
565
- printTarget!.remove()
566
- mediaQueryList.removeEventListener('change', x)
567
- }
568
- }
569
-
570
- if (window.matchMedia) {
571
- var mediaQueryList = window.matchMedia('print')
572
- mediaQueryList.addEventListener('change', x)
573
- }
574
- }
575
- }
@@ -1,23 +0,0 @@
1
- /**
2
- * @license Copyright © HatioLab Inc. All rights reserved.
3
- */
4
-
5
- import './ox-editor-process-selector'
6
-
7
- import { html, TemplateResult } from 'lit'
8
- import { customElement } from 'lit/decorators.js'
9
-
10
- import { OxPropertyEditor, PropertySpec } from '@operato/property-editor'
11
-
12
- @customElement('ox-property-editor-process-selector')
13
- class PropertyEditorProcessSelector extends OxPropertyEditor {
14
- static get styles() {
15
- return [...OxPropertyEditor.styles]
16
- }
17
-
18
- editorTemplate(value: any, spec: PropertySpec): TemplateResult {
19
- return html`
20
- <ox-editor-process-selector id="editor" .value=${value} .properties=${spec.property}></ox-editor-process-selector>
21
- `
22
- }
23
- }
@@ -1,95 +0,0 @@
1
- import '@material/web/icon/icon.js'
2
- import './process-creation-popup'
3
-
4
- import { css, html, LitElement } from 'lit'
5
- import { customElement, property } from 'lit/decorators.js'
6
-
7
- import { i18next, localize } from '@operato/i18n'
8
- import { openPopup } from '@operato/layout'
9
-
10
- @customElement('ox-process-creation-card')
11
- export class ProcessCreationCard extends localize(i18next)(LitElement) {
12
- static get styles() {
13
- return [
14
- css`
15
- :host {
16
- display: flex;
17
- border: var(--card-list-create-border);
18
- border-radius: var(--card-list-create-border-radius);
19
-
20
- background-color: var(--md-sys-color-surface);
21
-
22
- align-content: center;
23
- justify-content: center;
24
- }
25
-
26
- div {
27
- text-align: center;
28
- font-size: 0.8em;
29
- color: var(--card-list-create-color);
30
- text-transform: capitalize;
31
- }
32
-
33
- md-icon {
34
- --md-icon-size: 42px;
35
- display: block;
36
- font-size: 3.5em;
37
- color: var(--card-list-create-icon-color);
38
- }
39
- `
40
- ]
41
- }
42
-
43
- /* default group id */
44
- @property({ type: String }) defaultGroup?: string
45
- @property({ type: Array }) groups: any
46
-
47
- private popup: any
48
-
49
- render() {
50
- return html`<div @click=${(e: Event) => this.onClick()}><md-icon>add_circle_outline</md-icon>create process</div> `
51
- }
52
-
53
- onClick() {
54
- if (this.popup) {
55
- delete this.popup
56
- }
57
-
58
- /*
59
- * 기존 설정된 이미지가 선택된 상태가 되게 하기 위해서는 selector에 value를 전달해줄 필요가 있음.
60
- * 주의. value는 object일 수도 있고, string일 수도 있다.
61
- * string인 경우에는 해당 보드의 id로 해석한다.
62
- */
63
- var template = html`
64
- <process-creation-popup
65
- .defaultGroup=${this.defaultGroup}
66
- .groups=${this.groups}
67
- @create-process=${async (e: CustomEvent) => {
68
- var { name, description, groupId, model, thumbnail } = e.detail
69
-
70
- this.dispatchEvent(
71
- new CustomEvent('create-process', {
72
- detail: {
73
- name,
74
- description,
75
- groupId,
76
- model,
77
- thumbnail
78
- }
79
- })
80
- )
81
-
82
- this.popup && this.popup.close()
83
- }}
84
- ></process-creation-popup>
85
- `
86
-
87
- this.popup = openPopup(template, {
88
- backdrop: true,
89
- size: 'large',
90
- title: i18next.t('title.create-process')
91
- })
92
- }
93
-
94
- reset() {}
95
- }