@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,326 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+
5
+ import '@operato/input/ox-input-angle.js'
6
+ import '@operato/input/ox-buttons-radio.js'
7
+ import '@material/mwc-icon'
8
+ import '@operato/i18n/ox-i18n.js'
9
+ import '@operato/help/ox-title-with-help.js'
10
+
11
+ import { css, html } from 'lit'
12
+ import { property } from 'lit/decorators.js'
13
+
14
+ import { BOUNDS, Component, Properties } from '@hatiolab/things-scene'
15
+ import { ScopedElementsMixin } from '@open-wc/scoped-elements'
16
+
17
+ import { AbstractProperty } from '../abstract-property'
18
+ import { PropertyShadow } from '../effects/property-shadow.js'
19
+ import { PropertySharedStyle } from '../property-shared-style'
20
+ import { BoxPaddingEditorStyles } from './box-padding-editor-styles'
21
+
22
+ export class PropertyShapes extends ScopedElementsMixin(AbstractProperty) {
23
+ static styles = [
24
+ PropertySharedStyle,
25
+ BoxPaddingEditorStyles,
26
+ css`
27
+ fieldset[collapsable] legend {
28
+ box-sizing: border-box;
29
+ width: 100%;
30
+ }
31
+
32
+ fieldset[collapsable] legend mwc-icon {
33
+ float: right;
34
+ font-size: medium;
35
+ margin: 0;
36
+ cursor: pointer;
37
+ }
38
+
39
+ fieldset[collapsable][collapsed] > :not(legend) {
40
+ display: none;
41
+ }
42
+ `,
43
+ css`
44
+ .icon-label label {
45
+ background: var(--url-icon-properties-label) 7px -900px no-repeat;
46
+ }
47
+
48
+ .icon-label label.width {
49
+ background-position: 7px -96px;
50
+ }
51
+
52
+ .icon-label label.height {
53
+ background-position: 7px 4px;
54
+ }
55
+
56
+ .icon-label label.rotate {
57
+ background-position: 7px -198px;
58
+ }
59
+
60
+ .icon-label label.twidth {
61
+ background-position: 7px -296px;
62
+ }
63
+
64
+ .icon-label label.theight {
65
+ background-position: 7px -396px;
66
+ }
67
+
68
+ .icon-label label.zPos {
69
+ background-position: 5px -1098px;
70
+ }
71
+
72
+ .icon-label label.depth {
73
+ background-position: 5px -1198px;
74
+ }
75
+
76
+ .icon-label label.rotationX {
77
+ background-position: 5px -1296px;
78
+ }
79
+
80
+ .icon-label label.rotationY {
81
+ background-position: 5px -1396px;
82
+ }
83
+
84
+ .icon-label label.rotationZ {
85
+ background-position: 5px -1496px;
86
+ }
87
+
88
+ ox-buttons-radio > * {
89
+ width: 30px;
90
+ height: 25px;
91
+ min-width: initial;
92
+ margin: 0 4px 0 0;
93
+ padding: 0;
94
+ border-radius: 0;
95
+ display: inline-block;
96
+ border-bottom: 2px solid #fff;
97
+ }
98
+
99
+ ox-buttons-radio div {
100
+ background: var(--url-icon-properties) no-repeat;
101
+ }
102
+
103
+ ox-buttons-radio div[data-value='left'] {
104
+ background-position: 50% 3px;
105
+ }
106
+
107
+ ox-buttons-radio div[data-value='center'] {
108
+ background-position: 50% -47px;
109
+ }
110
+
111
+ ox-buttons-radio div[data-value='right'] {
112
+ background-position: 50% -97px;
113
+ }
114
+
115
+ ox-buttons-radio div[data-value='justify'] {
116
+ background-position: 50% -147px;
117
+ }
118
+
119
+ ox-buttons-radio div[data-value='top'] {
120
+ background-position: 50% -197px;
121
+ }
122
+
123
+ ox-buttons-radio div[data-value='middle'] {
124
+ background-position: 50% -193px;
125
+ }
126
+
127
+ ox-buttons-radio div[data-value='bottom'] {
128
+ background-position: 50% -188px;
129
+ }
130
+
131
+ ox-buttons-radio div[active] {
132
+ border-color: #f2471c;
133
+ }
134
+ `
135
+ ]
136
+
137
+ @property({ type: Object }) value?: Properties
138
+ @property({ type: Object }) bounds: BOUNDS | null = null
139
+ @property({ type: Array }) selected: Component[] = []
140
+
141
+ firstUpdated() {
142
+ this.renderRoot.addEventListener('change', this._onValueChange.bind(this))
143
+ }
144
+
145
+ static get scopedElements() {
146
+ return {
147
+ 'process-property-shadow': PropertyShadow
148
+ }
149
+ }
150
+
151
+ render() {
152
+ const value = this.value || {}
153
+
154
+ return html`
155
+ <fieldset>
156
+ <div class="property-grid">
157
+ ${this._isIdentifiable(this.selected)
158
+ ? html`
159
+ <label> <ox-i18n msgid="label.id">ID</ox-i18n> </label>
160
+ <input value-key="id" .value=${value.id || ''} />
161
+ `
162
+ : html``}
163
+ ${this._hasTextProperty(this.selected)
164
+ ? html`
165
+ <label> <ox-i18n msgid="label.text">Text</ox-i18n> </label>
166
+ <input value-key="text" .value=${value.text || ''} />
167
+ `
168
+ : html``}
169
+ </div>
170
+ </fieldset>
171
+
172
+ ${this.selected.length && this.selected[0].isRootModel()
173
+ ? html`
174
+ <fieldset class="icon-label unit">
175
+ <legend>
176
+ <ox-title-with-help topic="process-modeller/shapes/size" msgid="label.size">size</ox-title-with-help>
177
+ </legend>
178
+
179
+ <div class="property-grid">
180
+ <label class="width"> <ox-i18n msgid="label.width">width</ox-i18n> </label>
181
+ <input type="number" value-key="bounds.width" .value=${this.bounds?.width} />
182
+ <label class="height"> <ox-i18n msgid="label.height">height</ox-i18n> </label>
183
+ <input type="number" value-key="bounds.height" .value=${this.bounds?.height} />
184
+ </div>
185
+ </fieldset>
186
+ `
187
+ : html`
188
+ <fieldset>
189
+ <legend>
190
+ <ox-title-with-help topic="process-modeller/effects/shadow" msgid="label.shadow"
191
+ >shadow</ox-title-with-help
192
+ >
193
+ </legend>
194
+
195
+ <process-property-shadow value-key="shadow" .value=${value.shadow || {}}> </process-property-shadow>
196
+ </fieldset>
197
+ `}
198
+ ${this._hasTextProperty(this.selected)
199
+ ? html`
200
+ <fieldset>
201
+ <legend>
202
+ <ox-title-with-help topic="process-modeller/shapes/text-box" msgid="label.text-box"
203
+ >text box</ox-title-with-help
204
+ >
205
+ </legend>
206
+
207
+ <div class="property-grid">
208
+ <label> <ox-i18n msgid="label.horizontal">horizontal</ox-i18n> </label>
209
+ <ox-buttons-radio value-key="textAlign" .value=${value.textAlign}>
210
+ <div data-value="left"></div>
211
+ <div data-value="center"></div>
212
+ <div data-value="right"></div>
213
+ <div data-value="justify"></div>
214
+ </ox-buttons-radio>
215
+
216
+ <label> <ox-i18n msgid="label.vertical">vertical</ox-i18n> </label>
217
+ <ox-buttons-radio value-key="textBaseline" .value=${value.textBaseline}>
218
+ <div data-value="top"></div>
219
+ <div data-value="middle"></div>
220
+ <div data-value="bottom"></div>
221
+ </ox-buttons-radio>
222
+
223
+ <div class="checkbox-row">
224
+ <input id="checkbox-textwrap" type="checkbox" value-key="textWrap" .checked=${value.textWrap} />
225
+ <label for="checkbox-textwrap"> <ox-i18n msgid="label.text-wrap">Text Wrap</ox-i18n> </label>
226
+ </div>
227
+
228
+ <label> <ox-i18n msgid="label.padding">padding</ox-i18n> </label>
229
+ <table class="box-padding">
230
+ <tr>
231
+ <td class="slide1"></td>
232
+ <td class="slide2"></td>
233
+ <td class="slide3"></td>
234
+ </tr>
235
+ <tr>
236
+ <td class="slide4"></td>
237
+ <td class="slide5">
238
+ <input type="number" value-key="paddingTop" .value=${value.paddingTop} />
239
+ <input type="number" value-key="paddingLeft" .value=${value.paddingLeft} />
240
+ <input type="number" value-key="paddingRight" .value=${value.paddingRight} />
241
+ <input type="number" value-key="paddingBottom" .value=${value.paddingBottom} />
242
+ </td>
243
+ <td class="slide6"></td>
244
+ </tr>
245
+ <tr>
246
+ <td class="slide7"></td>
247
+ <td class="slide8"></td>
248
+ <td class="slide9"></td>
249
+ </tr>
250
+ </table>
251
+ </div>
252
+ </fieldset>
253
+ `
254
+ : html``}
255
+ ${this.selected.length && this.selected[0].isRootModel()
256
+ ? html`
257
+ <fieldset class="icon-label">
258
+ <legend>
259
+ <ox-title-with-help topic="process-modeller/shapes/viewer-option" msgid="label.viewer-option"
260
+ >Viewer Option</ox-title-with-help
261
+ >
262
+ </legend>
263
+
264
+ <div class="property-grid">
265
+ <label><ox-i18n msgid="label.fit">Fit</ox-i18n></label>
266
+ <select value-key="fitMode" .value=${value.fitMode || 'ratio'}>
267
+ <option value="none">none</option>
268
+ <option value="ratio" selected>ratio</option>
269
+ <option value="both">both</option>
270
+ <option value="width">width</option>
271
+ <option value="height">height</option>
272
+ </select>
273
+ </div>
274
+ </fieldset>
275
+ `
276
+ : html``}
277
+ `
278
+ }
279
+
280
+ _onValueChange(e: Event) {
281
+ var element = e.target as HTMLElement
282
+ var key = element.getAttribute('value-key')
283
+
284
+ if (!key) {
285
+ return
286
+ }
287
+
288
+ var value = this._getValueFromEventTarget(element)
289
+
290
+ if (key.indexOf('bounds.') == 0) {
291
+ if (isNaN(value)) return
292
+ this.dispatchEvent(
293
+ new CustomEvent('bounds-change', {
294
+ bubbles: true,
295
+ composed: true,
296
+ detail: {
297
+ [key.substr(7)]: value
298
+ }
299
+ })
300
+ )
301
+ } else {
302
+ this._onAfterValueChange(key, value)
303
+ }
304
+ }
305
+
306
+ _hasTextProperty(selected: Component[]) {
307
+ for (let i = 0; i < selected.length; i++) {
308
+ if (!selected[i].hasTextProperty) return false
309
+ }
310
+
311
+ return true
312
+ }
313
+
314
+ _isIdentifiable(selected: Component[]) {
315
+ if (!selected || selected.length == 0 || selected.length > 1 || (selected[0].isLayer && selected[0].isLayer()))
316
+ return false
317
+
318
+ return true
319
+ }
320
+
321
+ _isLine(selected: Component[]) {
322
+ if (!selected || !(selected[0] && selected[0].isLine())) return false
323
+
324
+ return true
325
+ }
326
+ }
@@ -0,0 +1,144 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+
5
+ import '@operato/app/property-editor.js' /* for registering property editors */
6
+
7
+ import { html, LitElement, PropertyValues } from 'lit'
8
+ import { property } from 'lit/decorators.js'
9
+
10
+ import { Properties } from '@hatiolab/things-scene'
11
+ import { OxPropertyEditor, PropertySpec } from '@operato/property-editor'
12
+
13
+ /**
14
+ 모든 에디터들은 change 이벤트를 지원해야 한다. 또한, 모든 에디터들은 value속성에 값을 가져야 한다.
15
+
16
+ Example:
17
+
18
+ <specific-properties-builder value="{{value}}">
19
+ <label>Center X</label>
20
+ <input type="number" .value="${value.cx}">
21
+ <label>Width</label>
22
+ <input type="number" .value="${value.width}">
23
+ </specific-properties-builder>
24
+ */
25
+
26
+ const DEFAULT_VALUE = {
27
+ legend: '',
28
+ number: 0,
29
+ angle: 0,
30
+ string: '',
31
+ password: '',
32
+ textarea: '',
33
+ checkbox: false,
34
+ select: '',
35
+ color: '#000000',
36
+ 'solidcolor-stops': null,
37
+ 'gradientcolor-stops': null,
38
+ 'gltf-selector': '',
39
+ 'image-selector': '',
40
+ multiplecolor: null,
41
+ editortable: null,
42
+ imageselector: '',
43
+ options: null,
44
+ date: null
45
+ }
46
+
47
+ function convertValue(type: string, value: any) {
48
+ var converted = String(value).trim() == '' ? undefined : value
49
+ switch (type) {
50
+ case 'number':
51
+ case 'angle':
52
+ converted = parseFloat(value)
53
+ converted = converted == NaN ? undefined : converted
54
+ break
55
+ }
56
+
57
+ return converted
58
+ }
59
+
60
+ export class SpecificPropertiesBuilder extends LitElement {
61
+ @property({ type: Object }) value: any
62
+ @property({ type: Array }) props: any[] = []
63
+ @property({ type: Object }) propertyEditor: any
64
+
65
+ render() {
66
+ return html`<slot></slot>`
67
+ }
68
+
69
+ firstUpdated() {
70
+ this.addEventListener('change', this._onValueChanged.bind(this))
71
+ }
72
+
73
+ updated(changes: PropertyValues<this>) {
74
+ changes.has('props') && this._onPropsChanged(this.props)
75
+ changes.has('value') && this._setValues()
76
+ }
77
+
78
+ _onPropsChanged(props: any[]) {
79
+ this.textContent = ''
80
+ ;(props || []).forEach((spec: PropertySpec) => {
81
+ const { label, type, placeholder, name, observe, property, editor, quantifier, defaultValue } = spec
82
+
83
+ let elementType = OxPropertyEditor.getEditor(type)
84
+ if (!elementType) {
85
+ console.warn('Property Editor not defined', type)
86
+ return
87
+ }
88
+ let element = document.createElement(elementType) as OxPropertyEditor
89
+
90
+ element.label = label
91
+ element.type = type
92
+ element.placeholder = placeholder
93
+ element.name = name
94
+ element.setAttribute('name', name)
95
+
96
+ if (observe) {
97
+ element.observe = observe
98
+ }
99
+ element.property = property
100
+ element.editor = editor
101
+ element.quantifier = quantifier
102
+ element.defaultValue = defaultValue
103
+ element.setAttribute('property-editor', 'true')
104
+
105
+ this.appendChild(element)
106
+ })
107
+ }
108
+
109
+ _setValues() {
110
+ this.value &&
111
+ Array.from(this.querySelectorAll('[name]')).forEach((prop: Properties) => {
112
+ let name = prop.getAttribute('name')
113
+ var convertedValue = convertValue(prop.type, this.value[name])
114
+ if (convertedValue === undefined) convertedValue = (DEFAULT_VALUE as any)[prop.type]
115
+ prop.value = convertedValue
116
+ prop.observe && prop.observe.call(prop, prop.value)
117
+ })
118
+ }
119
+
120
+ _onValueChanged(e: Event) {
121
+ e.stopPropagation()
122
+ var target = e.target as Element
123
+
124
+ const prop = target.closest('[property-editor]') as OxPropertyEditor
125
+
126
+ var name = prop.getAttribute('name')
127
+ if (!name) {
128
+ return
129
+ }
130
+
131
+ this.value[name] = prop.value
132
+ this._setValues()
133
+
134
+ this.dispatchEvent(
135
+ new CustomEvent('property-change', {
136
+ bubbles: true,
137
+ composed: true,
138
+ detail: {
139
+ [name]: prop.value
140
+ }
141
+ })
142
+ )
143
+ }
144
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+
5
+ import '@operato/help/ox-help-icon.js'
6
+
7
+ import { css, html, LitElement } from 'lit'
8
+ import { property } from 'lit/decorators.js'
9
+
10
+ import { Component, Scene } from '@hatiolab/things-scene'
11
+ import { ScopedElementsMixin } from '@open-wc/scoped-elements'
12
+
13
+ import { PropertySharedStyle } from '../property-shared-style'
14
+ import { SpecificPropertiesBuilder } from './specific-properties-builder.js'
15
+
16
+ export class PropertySpecific extends ScopedElementsMixin(LitElement) {
17
+ static styles = [
18
+ PropertySharedStyle,
19
+ css`
20
+ label {
21
+ display: block;
22
+ margin: 10px;
23
+
24
+ text-align: right;
25
+ font: bold 14px var(--theme-font);
26
+ color: var(--primary-color);
27
+ text-transform: uppercase;
28
+ }
29
+ `
30
+ ]
31
+
32
+ @property({ type: Object }) value: any
33
+ @property({ type: Object }) scene: Scene | null = null
34
+ @property({ type: Array }) selected: Component[] = []
35
+ @property({ type: Array }) props: any[] = []
36
+ @property({ type: Array }) propertyEditor: any[] = []
37
+
38
+ private boundINeedSelected: any = this._onINeedSelected.bind(this)
39
+
40
+ connectedCallback() {
41
+ super.connectedCallback()
42
+
43
+ this.addEventListener('i-need-selected', this.boundINeedSelected)
44
+ }
45
+
46
+ disconnectedCallback() {
47
+ super.disconnectedCallback()
48
+
49
+ this.removeEventListener('i-need-selected', this.boundINeedSelected)
50
+ }
51
+ static get scopedElements() {
52
+ return {
53
+ 'property-specific-properties-builder': SpecificPropertiesBuilder
54
+ }
55
+ }
56
+ render() {
57
+ const selected = this.selected && this.selected[0]
58
+ const value = this.value || {}
59
+
60
+ return html`
61
+ <label>${value.type}<ox-help-icon .topic=${selected?.nature?.help}></ox-help-icon></label>
62
+
63
+ <property-specific-properties-builder .value=${value} .props=${this.props} .propertyEditor=${this.propertyEditor}>
64
+ </property-specific-properties-builder>
65
+ `
66
+ }
67
+
68
+ _onINeedSelected(e: CustomEvent) {
69
+ e.stopPropagation()
70
+
71
+ var { callback } = e.detail
72
+
73
+ this.scene!.undoableChange(() => {
74
+ callback.call(null, this.selected)
75
+ })
76
+ }
77
+ }