@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,62 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+
5
+ import { css } from 'lit'
6
+
7
+ export const EffectsSharedStyle = css`
8
+ :host {
9
+ display: grid;
10
+ grid-template-columns: repeat(10, 1fr);
11
+ grid-gap: 5px;
12
+ grid-auto-rows: minmax(24px, auto);
13
+
14
+ align-items: center;
15
+ }
16
+
17
+ * {
18
+ align-self: stretch;
19
+ }
20
+
21
+ label {
22
+ grid-column: span 3;
23
+ text-align: right;
24
+ text-transform: capitalize;
25
+
26
+ align-self: center;
27
+ }
28
+
29
+ input,
30
+ select,
31
+ ox-input-angle,
32
+ ox-input-color,
33
+ [custom-editor] {
34
+ grid-column: span 7;
35
+ }
36
+
37
+ input,
38
+ select,
39
+ ox-input-angle input,
40
+ ox-input-color input,
41
+ [custom-editor] input {
42
+ border: var(--property-sidebar-fieldset-border);
43
+ }
44
+
45
+ ox-input-data {
46
+ height: 300px;
47
+ }
48
+
49
+ input[type='checkbox'] {
50
+ grid-column: 4 / 5;
51
+ align-self: center;
52
+ }
53
+
54
+ label.checkbox-label {
55
+ grid-column: span 6;
56
+ text-align: left;
57
+ }
58
+
59
+ [fullwidth] {
60
+ grid-column: 1 / -1;
61
+ }
62
+ `
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+
5
+ import '@operato/i18n/ox-i18n.js'
6
+ import '@operato/help/ox-title-with-help.js'
7
+
8
+ import { html } from 'lit'
9
+ import { property } from 'lit/decorators.js'
10
+
11
+ import { Properties, Scene } from '@hatiolab/things-scene'
12
+ import { ScopedElementsMixin } from '@open-wc/scoped-elements'
13
+
14
+ import { AbstractProperty } from '../abstract-property.js'
15
+ import { PropertySharedStyle } from '../property-shared-style.js'
16
+ import { PropertyShadow } from './property-shadow.js'
17
+
18
+ export class PropertyEffects extends ScopedElementsMixin(AbstractProperty) {
19
+ static styles = [PropertySharedStyle]
20
+
21
+ @property({ type: Object }) value?: Properties
22
+ @property({ type: Object }) scene?: Scene
23
+
24
+ firstUpdated() {
25
+ this.renderRoot.addEventListener('change', this._onValueChange.bind(this))
26
+ }
27
+
28
+ static get scopedElements() {
29
+ return {
30
+ 'process-property-shadow': PropertyShadow
31
+ }
32
+ }
33
+
34
+ render() {
35
+ const value = this.value || {}
36
+
37
+ return html`
38
+ <fieldset>
39
+ <legend>
40
+ <ox-title-with-help topic="process-modeller/effects/shadow" msgid="label.shadow">shadow</ox-title-with-help>
41
+ </legend>
42
+
43
+ <process-property-shadow value-key="shadow" .value=${value.shadow || {}}> </process-property-shadow>
44
+ </fieldset>
45
+ `
46
+ }
47
+ }
@@ -0,0 +1,114 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+
5
+ import '@operato/i18n/ox-i18n.js'
6
+ import '@operato/input/ox-input-color.js'
7
+
8
+ import { css, html, LitElement } from 'lit'
9
+ import { property } from 'lit/decorators.js'
10
+
11
+ import { Properties } from '@hatiolab/things-scene'
12
+
13
+ import { convert } from './value-converter'
14
+
15
+ /**
16
+ * 컴포넌트의 그림자 속성을 편집하는 element
17
+ *
18
+ * Example:
19
+ * <property-shadow
20
+ * @change="${e => { this.shadow = e.target.value }}"
21
+ * value="${this.shadow}"
22
+ * ></property-shadow>
23
+ */
24
+
25
+ export class PropertyShadow extends LitElement {
26
+ static styles = [
27
+ css`
28
+ :host {
29
+ display: grid;
30
+ grid-template-columns: repeat(10, 1fr);
31
+ grid-gap: 5px;
32
+ grid-auto-rows: minmax(24px, auto);
33
+
34
+ align-items: center;
35
+ }
36
+
37
+ * {
38
+ align-self: stretch;
39
+ }
40
+
41
+ label {
42
+ grid-column: span 3;
43
+ text-align: right;
44
+ text-transform: capitalize;
45
+
46
+ align-self: center;
47
+ }
48
+
49
+ input[type='number'],
50
+ ox-input-color {
51
+ grid-column: span 7;
52
+ }
53
+ input[type='number'] {
54
+ border: var(--property-sidebar-fieldset-border);
55
+ }
56
+
57
+ .icon-only-label {
58
+ grid-column: span 3;
59
+ background: var(--url-icon-properties-label) no-repeat;
60
+ float: left;
61
+ margin: 0;
62
+ align-self: stretch;
63
+ }
64
+
65
+ .icon-only-label.color {
66
+ background-position: 100% -500px;
67
+ }
68
+ `
69
+ ]
70
+
71
+ @property({ type: Object }) value?: Properties
72
+
73
+ firstUpdated() {
74
+ this.renderRoot.addEventListener('change', this._onValueChange.bind(this))
75
+ }
76
+
77
+ render() {
78
+ const value = this.value || {}
79
+
80
+ return html`
81
+ <label> <ox-i18n msgid="label.shadowOffsetX">offset-X</ox-i18n> </label>
82
+
83
+ <input type="number" value-key="left" .value=${value.left} />
84
+
85
+ <label> <ox-i18n msgid="label.shadowOffsetY">offset-Y</ox-i18n> </label>
86
+
87
+ <input type="number" value-key="top" .value=${value.top} />
88
+
89
+ <label> <ox-i18n msgid="label.shadowSize">Size</ox-i18n> </label>
90
+
91
+ <input type="number" value-key="blurSize" .value=${value.blurSize} />
92
+
93
+ <label class="icon-only-label color"></label>
94
+
95
+ <ox-input-color value-key="color" .value=${value.color}> </ox-input-color>
96
+ `
97
+ }
98
+
99
+ _onValueChange(e: Event) {
100
+ var element = e.target as HTMLElement
101
+ var key = element.getAttribute('value-key')
102
+
103
+ if (!key) {
104
+ return
105
+ }
106
+
107
+ this.value = {
108
+ ...this.value,
109
+ [key]: convert(element)
110
+ }
111
+
112
+ this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }))
113
+ }
114
+ }
@@ -0,0 +1,23 @@
1
+ export function convert(element: any) {
2
+ switch (element.tagName) {
3
+ case 'INPUT':
4
+ switch (element.type) {
5
+ case 'checkbox':
6
+ return element.checked
7
+ case 'number':
8
+ return Number(element.value) || 0
9
+ case 'text':
10
+ return String(element.value)
11
+ }
12
+ break
13
+
14
+ case 'PAPER-BUTTON':
15
+ return element.active
16
+
17
+ case 'PAPER-LISTBOX':
18
+ return element.selected
19
+
20
+ default:
21
+ return element.value
22
+ }
23
+ }
@@ -0,0 +1,361 @@
1
+ import '@operato/input/ox-input-search.js'
2
+
3
+ import { css, html, LitElement, PropertyValues, TemplateResult } from 'lit'
4
+ import { property, state } from 'lit/decorators.js'
5
+ import Sortable from 'sortablejs'
6
+
7
+ import { Component, Container, Scene } from '@hatiolab/things-scene'
8
+
9
+ export class SceneInspector extends LitElement {
10
+ static styles = [
11
+ css`
12
+ :host {
13
+ display: flex;
14
+ flex-direction: column;
15
+
16
+ color: var(--scene-inspector-color);
17
+ }
18
+
19
+ div[result] {
20
+ flex: 1;
21
+
22
+ display: flex;
23
+ flex-direction: column;
24
+
25
+ overflow-y: auto;
26
+ }
27
+
28
+ .component {
29
+ display: block;
30
+ overflow: hidden;
31
+ border-bottom: 1px solid rgba(0, 0, 0, 0.05);
32
+ font-size: 14px;
33
+ }
34
+
35
+ .component[selected] {
36
+ background-color: var(--scene-inspector-selected-background-color);
37
+ border-top: var(--scene-inspector-selected-border);
38
+ border-bottom: var(--scene-inspector-selected-border);
39
+ }
40
+ [selected] .type {
41
+ font-weight: bold;
42
+ }
43
+
44
+ span,
45
+ i {
46
+ display: inline-block;
47
+ }
48
+
49
+ span.type {
50
+ text-overflow: ellipses;
51
+ }
52
+
53
+ span.name {
54
+ background-color: var(--scene-inspector-name-background-color);
55
+ border-radius: var(--border-radius);
56
+ padding: 0 4px;
57
+ color: #fff;
58
+ font-size: 0.8em;
59
+ }
60
+
61
+ .eye {
62
+ margin: 0 0 0 5px;
63
+ vertical-align: middle;
64
+ opacity: 0.7;
65
+ font-size: 1.1em;
66
+ color: var(--scene-inspector-eye-icon-color);
67
+ }
68
+
69
+ .collapsed::before,
70
+ .extended::before,
71
+ .collapsespace::before {
72
+ background: var(--url-icon-shell-inspector) no-repeat;
73
+ width: 16px;
74
+ height: 18px;
75
+ display: inline-block;
76
+ content: '';
77
+ opacity: 0.6;
78
+ }
79
+
80
+ .collapsed::before {
81
+ background-position: 100% -195px;
82
+ }
83
+
84
+ .extended::before {
85
+ background-position: 100% -295px;
86
+ }
87
+
88
+ .collapsespace::before {
89
+ background-position: 100% -395px;
90
+ opacity: 0.9;
91
+ width: 16px;
92
+ }
93
+ .collapsed,
94
+ .extended,
95
+ .collapsespace {
96
+ border-left: 1px dotted rgba(0, 0, 0, 0.1);
97
+ }
98
+
99
+ pre {
100
+ display: inline;
101
+ }
102
+ `
103
+ ]
104
+
105
+ @property({ type: Object }) scene?: Scene
106
+
107
+ @state() private searchText: string = ''
108
+
109
+ private _extendedMap: any
110
+ private show: boolean = false
111
+
112
+ disconnectScene(scene?: Scene) {
113
+ if (scene) {
114
+ scene.off('selected', undefined, this)
115
+ scene.off('execute', undefined, this)
116
+ scene.off('undo', undefined, this)
117
+ scene.off('redo', undefined, this)
118
+ }
119
+ }
120
+
121
+ disconnectedCallback() {
122
+ super.disconnectedCallback()
123
+
124
+ this.disconnectScene(this.scene)
125
+ delete this._extendedMap
126
+ }
127
+
128
+ render() {
129
+ return html`
130
+ <ox-input-search
131
+ @change=${(e: Event) => (this.searchText = (e.target as HTMLInputElement).value)}
132
+ ></ox-input-search>
133
+
134
+ <div result>${!this.scene ? html`` : this.renderComponent(this.scene.root, 0)}</div>
135
+ `
136
+ }
137
+
138
+ firstUpdated() {
139
+ dispatchEvent(new Event('resize'))
140
+
141
+ this.renderRoot.addEventListener('click', this._onclick.bind(this) as EventListener)
142
+ this.renderRoot.addEventListener('dblclick', this._ondblclick.bind(this) as EventListener)
143
+ }
144
+
145
+ refresh() {
146
+ let selected = this.scene?.selected || []
147
+
148
+ selected.forEach(component => {
149
+ let parent = component.parent
150
+ while (parent && !this.extendedMap.get(parent)) {
151
+ this.extendedMap.set(parent, true)
152
+ parent = parent.parent
153
+ }
154
+ })
155
+
156
+ this.requestUpdate()
157
+ }
158
+
159
+ updated(change: PropertyValues<this>) {
160
+ if (change.has('scene')) {
161
+ let oldScene = change.get('scene') as Scene
162
+
163
+ if (oldScene) {
164
+ this.disconnectScene(oldScene)
165
+ delete this._extendedMap
166
+ }
167
+
168
+ if (this.scene && this.scene.root) {
169
+ this.scene.on('selected', this.refresh, this)
170
+ this.scene.on('execute', this.refresh, this)
171
+ this.scene.on('undo', this.refresh, this)
172
+ this.scene.on('redo', this.refresh, this)
173
+
174
+ this.refresh()
175
+ }
176
+ }
177
+
178
+ this.updateComplete.then(() => {
179
+ this.renderRoot.querySelectorAll('[sortable]').forEach(sortable => {
180
+ new Sortable(sortable as HTMLElement, this.sortableConfig)
181
+ })
182
+ })
183
+ }
184
+
185
+ sortableConfig: Sortable.Options = {
186
+ group: 'inspector',
187
+ animation: 150,
188
+ draggable: '.component',
189
+ swapThreshold: 1,
190
+ onSort: this.onSort.bind(this)
191
+ }
192
+
193
+ onSort(e: Sortable.SortableEvent) {
194
+ if (!this.scene) return
195
+
196
+ var component = (e.item as HTMLElement & { component: Component }).component
197
+ var to_container = (e.to as HTMLElement & { component: Component }).component as Container
198
+ var to_index = e.newIndex! - 1
199
+
200
+ this.scene.move(component, to_container, to_index)
201
+
202
+ this.show = false
203
+ this.updateComplete.then(() => {
204
+ this.show = true
205
+ })
206
+ }
207
+
208
+ _onclick(e: MouseEvent) {
209
+ e.stopPropagation()
210
+
211
+ var targetElement = e.target as HTMLElement & { component: Component }
212
+ var classList = targetElement.classList
213
+ var component
214
+
215
+ while (!component && targetElement) {
216
+ component = targetElement.component
217
+
218
+ if (component) break
219
+
220
+ targetElement = targetElement.parentNode as HTMLElement & { component: Component }
221
+
222
+ if (!targetElement || targetElement === this.renderRoot) break
223
+ }
224
+
225
+ if (component) {
226
+ if (classList.contains('eye')) {
227
+ this.toggleHidden(component)
228
+ } else if (classList.contains('extended') || classList.contains('collapsed')) {
229
+ this.toggleExtended(component)
230
+ }
231
+
232
+ this.selectComponent(component)
233
+ } else {
234
+ if (classList.contains('inspector')) {
235
+ this.show = !this.show
236
+ this.style.height = this.show ? '100%' : ''
237
+ }
238
+ }
239
+
240
+ this.requestUpdate()
241
+ }
242
+
243
+ _ondblclick(e: MouseEvent) {
244
+ e.stopPropagation()
245
+
246
+ var targetElement = e.target as HTMLElement & { component: Component }
247
+ var component
248
+
249
+ while (!component && targetElement) {
250
+ component = targetElement.component
251
+
252
+ if (component) break
253
+
254
+ targetElement = targetElement.parentNode as HTMLElement & { component: Component }
255
+
256
+ if (!targetElement || targetElement === this.renderRoot) break
257
+ }
258
+
259
+ if (component && component.isContainer()) {
260
+ this.toggleExtended(component)
261
+ }
262
+
263
+ this.requestUpdate()
264
+ }
265
+
266
+ get extendedMap() {
267
+ if (!this._extendedMap) {
268
+ this._extendedMap = new WeakMap()
269
+ }
270
+
271
+ return this._extendedMap
272
+ }
273
+
274
+ getNodeHandleClass(component: Component) {
275
+ if (component.isContainer() && (component as Container).components.length > 0) {
276
+ return !!this.extendedMap.get(component) ? 'extended' : 'collapsed'
277
+ } else {
278
+ return 'collapsespace'
279
+ }
280
+ }
281
+
282
+ isExtended(component: Component) {
283
+ return !!this.extendedMap.get(component)
284
+ }
285
+
286
+ toggleExtended(component: Component) {
287
+ var extended = this.isExtended(component)
288
+
289
+ if (extended) {
290
+ this.extendedMap.delete(component)
291
+ } else {
292
+ this.extendedMap.set(component, !extended)
293
+ }
294
+
295
+ this.requestUpdate()
296
+ }
297
+
298
+ toggleHidden(component: Component) {
299
+ component.set('hidden', !component.hidden)
300
+
301
+ this.requestUpdate()
302
+ }
303
+
304
+ selectComponent(component: Component) {
305
+ this.scene!.selected = [component]
306
+
307
+ this.requestUpdate()
308
+ }
309
+
310
+ shouldBeShown(component: Component): boolean {
311
+ const { type, name, id, tag } = component.state
312
+
313
+ return !!(
314
+ !this.searchText ||
315
+ `${type} ${name || ''} ${id || ''} ${tag || ''}`.search(this.searchText) > -1 ||
316
+ ((component as Container).components || []).find((child: Component) => this.shouldBeShown(child))
317
+ )
318
+ }
319
+
320
+ renderComponent(component: Component, depth: number): TemplateResult {
321
+ if (!component) {
322
+ return html``
323
+ }
324
+
325
+ if (!this.shouldBeShown(component)) {
326
+ return html``
327
+ }
328
+
329
+ const children = (component.isContainer() && (component as Container).components) || []
330
+ const extended = this.isExtended(component) ? children.filter(child => this.shouldBeShown(child)) : []
331
+ const { type, id, tag, class: clazz } = component.state
332
+
333
+ const name = (id ? `#${id}` : '') + (tag ? `@${tag}` : '') + (clazz ? `.(${clazz})` : '')
334
+
335
+ return html`
336
+ <div
337
+ class="component"
338
+ ?selected=${(this.scene?.selected || []).indexOf(component) > -1}
339
+ .component=${component}
340
+ ?sortable=${component.isContainer()}
341
+ >
342
+ <span>
343
+ ${depth > 0
344
+ ? html`
345
+ <mwc-icon class="eye">${component.get('hidden') ? 'visibility_off' : 'visibility'}</mwc-icon>
346
+ <pre>${' '.repeat(depth)}</pre>
347
+ `
348
+ : html` <pre>${' '.repeat(depth + 2)}</pre> `}
349
+
350
+ <span class=${this.getNodeHandleClass(component)}> </span>
351
+
352
+ <span class="type">${depth == 0 ? 'ROOT' : type}</span> ${name
353
+ ? html` <span class="name">${name}</span> `
354
+ : html``}
355
+ </span>
356
+
357
+ ${extended.map(child => this.renderComponent(child, depth + 1))}
358
+ </div>
359
+ `
360
+ }
361
+ }