@operato/input 2.0.0-alpha.8 → 2.0.0-alpha.80

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 (192) hide show
  1. package/CHANGELOG.md +203 -0
  2. package/demo/index-multiple-colors.html +14 -2
  3. package/demo/index-partition-keys.html +13 -2
  4. package/demo/index-select.html +20 -9
  5. package/demo/index-table.html +13 -2
  6. package/demo/index.html +13 -2
  7. package/dist/src/locale/locale-picker.d.ts +1 -1
  8. package/dist/src/ox-buttons-radio.d.ts +1 -1
  9. package/dist/src/ox-checkbox.d.ts +4 -4
  10. package/dist/src/ox-input-3axis.d.ts +1 -1
  11. package/dist/src/ox-input-3dish.d.ts +1 -1
  12. package/dist/src/ox-input-angle.d.ts +1 -1
  13. package/dist/src/ox-input-barcode.d.ts +3 -4
  14. package/dist/src/ox-input-barcode.js +28 -42
  15. package/dist/src/ox-input-barcode.js.map +1 -1
  16. package/dist/src/ox-input-code.d.ts +2 -3
  17. package/dist/src/ox-input-code.js +8 -15
  18. package/dist/src/ox-input-code.js.map +1 -1
  19. package/dist/src/ox-input-color-gradient.d.ts +1 -1
  20. package/dist/src/ox-input-color-stops.d.ts +1 -1
  21. package/dist/src/ox-input-color.d.ts +1 -1
  22. package/dist/src/ox-input-container.d.ts +2 -2
  23. package/dist/src/ox-input-container.js +2 -2
  24. package/dist/src/ox-input-container.js.map +1 -1
  25. package/dist/src/ox-input-crontab.d.ts +1 -2
  26. package/dist/src/ox-input-crontab.js +4 -7
  27. package/dist/src/ox-input-crontab.js.map +1 -1
  28. package/dist/src/ox-input-data.d.ts +4 -5
  29. package/dist/src/ox-input-data.js +88 -36
  30. package/dist/src/ox-input-data.js.map +1 -1
  31. package/dist/src/ox-input-duration.d.ts +1 -2
  32. package/dist/src/ox-input-duration.js +13 -9
  33. package/dist/src/ox-input-duration.js.map +1 -1
  34. package/dist/src/ox-input-file.d.ts +2 -2
  35. package/dist/src/ox-input-file.js +10 -9
  36. package/dist/src/ox-input-file.js.map +1 -1
  37. package/dist/src/ox-input-hashtags.d.ts +1 -1
  38. package/dist/src/ox-input-i18n-label.d.ts +33 -0
  39. package/dist/src/ox-input-i18n-label.js +129 -0
  40. package/dist/src/ox-input-i18n-label.js.map +1 -0
  41. package/dist/src/ox-input-image.d.ts +2 -2
  42. package/dist/src/ox-input-image.js +4 -4
  43. package/dist/src/ox-input-image.js.map +1 -1
  44. package/dist/src/ox-input-key-values.d.ts +2 -2
  45. package/dist/src/ox-input-key-values.js +9 -10
  46. package/dist/src/ox-input-key-values.js.map +1 -1
  47. package/dist/src/ox-input-mass-fraction.d.ts +2 -2
  48. package/dist/src/ox-input-mass-fraction.js +46 -29
  49. package/dist/src/ox-input-mass-fraction.js.map +1 -1
  50. package/dist/src/ox-input-multiple-colors.d.ts +2 -2
  51. package/dist/src/ox-input-multiple-colors.js +7 -7
  52. package/dist/src/ox-input-multiple-colors.js.map +1 -1
  53. package/dist/src/ox-input-options.d.ts +2 -2
  54. package/dist/src/ox-input-options.js +5 -7
  55. package/dist/src/ox-input-options.js.map +1 -1
  56. package/dist/src/ox-input-partition-keys.d.ts +2 -2
  57. package/dist/src/ox-input-partition-keys.js +10 -10
  58. package/dist/src/ox-input-partition-keys.js.map +1 -1
  59. package/dist/src/ox-input-privilege.d.ts +1 -2
  60. package/dist/src/ox-input-privilege.js +15 -31
  61. package/dist/src/ox-input-privilege.js.map +1 -1
  62. package/dist/src/ox-input-quantifier.d.ts +1 -1
  63. package/dist/src/ox-input-scene-component-id.d.ts +1 -1
  64. package/dist/src/ox-input-search.d.ts +2 -2
  65. package/dist/src/ox-input-search.js +4 -4
  66. package/dist/src/ox-input-search.js.map +1 -1
  67. package/dist/src/ox-input-select-buttons.d.ts +1 -1
  68. package/dist/src/ox-input-stack.d.ts +1 -1
  69. package/dist/src/ox-input-table.d.ts +1 -1
  70. package/dist/src/ox-input-table.js +12 -12
  71. package/dist/src/ox-input-table.js.map +1 -1
  72. package/dist/src/ox-input-textarea.d.ts +1 -1
  73. package/dist/src/ox-input-unit-number.d.ts +2 -2
  74. package/dist/src/ox-input-unit-number.js +5 -4
  75. package/dist/src/ox-input-unit-number.js.map +1 -1
  76. package/dist/src/ox-input-value-map.d.ts +2 -2
  77. package/dist/src/ox-input-value-map.js +15 -15
  78. package/dist/src/ox-input-value-map.js.map +1 -1
  79. package/dist/src/ox-input-value-ranges.d.ts +2 -2
  80. package/dist/src/ox-input-value-ranges.js +15 -15
  81. package/dist/src/ox-input-value-ranges.js.map +1 -1
  82. package/dist/src/ox-input-work-shift.d.ts +1 -1
  83. package/dist/src/ox-input-work-shift.js +4 -5
  84. package/dist/src/ox-input-work-shift.js.map +1 -1
  85. package/dist/src/ox-select.d.ts +2 -2
  86. package/dist/src/ox-select.js +4 -4
  87. package/dist/src/ox-select.js.map +1 -1
  88. package/dist/stories/ox-input-3axis.stories.js +14 -1
  89. package/dist/stories/ox-input-3axis.stories.js.map +1 -1
  90. package/dist/stories/ox-input-3dish.stories.js +14 -1
  91. package/dist/stories/ox-input-3dish.stories.js.map +1 -1
  92. package/dist/stories/ox-input-angle.stories.js +13 -1
  93. package/dist/stories/ox-input-angle.stories.js.map +1 -1
  94. package/dist/stories/ox-input-barcode.stories.js +13 -1
  95. package/dist/stories/ox-input-barcode.stories.js.map +1 -1
  96. package/dist/stories/ox-input-code.stories.d.ts +4 -0
  97. package/dist/stories/ox-input-code.stories.js +18 -3
  98. package/dist/stories/ox-input-code.stories.js.map +1 -1
  99. package/dist/stories/ox-input-crontab.stories.js +13 -1
  100. package/dist/stories/ox-input-crontab.stories.js.map +1 -1
  101. package/dist/stories/ox-input-data.stories.d.ts +29 -0
  102. package/dist/stories/ox-input-data.stories.js +50 -0
  103. package/dist/stories/ox-input-data.stories.js.map +1 -0
  104. package/dist/stories/ox-input-duration.stories.js +13 -1
  105. package/dist/stories/ox-input-duration.stories.js.map +1 -1
  106. package/dist/stories/ox-input-file.stories.js +13 -1
  107. package/dist/stories/ox-input-file.stories.js.map +1 -1
  108. package/dist/stories/ox-input-hashtags.stories.js +13 -1
  109. package/dist/stories/ox-input-hashtags.stories.js.map +1 -1
  110. package/dist/stories/ox-input-i18n-label.stories.d.ts +29 -0
  111. package/dist/stories/ox-input-i18n-label.stories.js +70 -0
  112. package/dist/stories/ox-input-i18n-label.stories.js.map +1 -0
  113. package/dist/stories/ox-input-key-values.stories.js +13 -1
  114. package/dist/stories/ox-input-key-values.stories.js.map +1 -1
  115. package/dist/stories/ox-input-mass-fraction.stories.js +13 -1
  116. package/dist/stories/ox-input-mass-fraction.stories.js.map +1 -1
  117. package/dist/stories/ox-input-multiple-colors.stories.js +21 -10
  118. package/dist/stories/ox-input-multiple-colors.stories.js.map +1 -1
  119. package/dist/stories/ox-input-options.stories.js +13 -1
  120. package/dist/stories/ox-input-options.stories.js.map +1 -1
  121. package/dist/stories/ox-input-partition-keys.stories.js +13 -1
  122. package/dist/stories/ox-input-partition-keys.stories.js.map +1 -1
  123. package/dist/stories/ox-input-privilege.stories.js +13 -1
  124. package/dist/stories/ox-input-privilege.stories.js.map +1 -1
  125. package/dist/stories/ox-input-quantifier.stories.js +13 -1
  126. package/dist/stories/ox-input-quantifier.stories.js.map +1 -1
  127. package/dist/stories/ox-input-range.stories.js +13 -1
  128. package/dist/stories/ox-input-range.stories.js.map +1 -1
  129. package/dist/stories/ox-input-search.stories.js +13 -1
  130. package/dist/stories/ox-input-search.stories.js.map +1 -1
  131. package/dist/stories/ox-input-select-buttons.stories.js +13 -1
  132. package/dist/stories/ox-input-select-buttons.stories.js.map +1 -1
  133. package/dist/stories/ox-input-unit.stories.js +14 -1
  134. package/dist/stories/ox-input-unit.stories.js.map +1 -1
  135. package/dist/stories/ox-input-value-map.stories.js +13 -1
  136. package/dist/stories/ox-input-value-map.stories.js.map +1 -1
  137. package/dist/stories/ox-input-value-ranges.stories.js +13 -1
  138. package/dist/stories/ox-input-value-ranges.stories.js.map +1 -1
  139. package/dist/stories/ox-input-work-shift.stories.js +13 -1
  140. package/dist/stories/ox-input-work-shift.stories.js.map +1 -1
  141. package/dist/stories/ox-select.stories.js +13 -1
  142. package/dist/stories/ox-select.stories.js.map +1 -1
  143. package/dist/tsconfig.tsbuildinfo +1 -1
  144. package/package.json +25 -21
  145. package/src/ox-input-barcode.ts +31 -41
  146. package/src/ox-input-code.ts +6 -13
  147. package/src/ox-input-container.ts +2 -2
  148. package/src/ox-input-crontab.ts +4 -8
  149. package/src/ox-input-data.ts +97 -38
  150. package/src/ox-input-duration.ts +13 -10
  151. package/src/ox-input-file.ts +10 -9
  152. package/src/ox-input-i18n-label.ts +139 -0
  153. package/src/ox-input-image.ts +4 -4
  154. package/src/ox-input-key-values.ts +27 -22
  155. package/src/ox-input-mass-fraction.ts +46 -29
  156. package/src/ox-input-multiple-colors.ts +7 -7
  157. package/src/ox-input-options.ts +5 -7
  158. package/src/ox-input-partition-keys.ts +28 -22
  159. package/src/ox-input-privilege.ts +15 -32
  160. package/src/ox-input-search.ts +4 -4
  161. package/src/ox-input-table.ts +12 -12
  162. package/src/ox-input-unit-number.ts +5 -4
  163. package/src/ox-input-value-map.ts +17 -17
  164. package/src/ox-input-value-ranges.ts +17 -17
  165. package/src/ox-input-work-shift.ts +4 -5
  166. package/src/ox-select.ts +4 -4
  167. package/stories/ox-input-3axis.stories.ts +14 -1
  168. package/stories/ox-input-3dish.stories.ts +14 -1
  169. package/stories/ox-input-angle.stories.ts +13 -1
  170. package/stories/ox-input-barcode.stories.ts +13 -1
  171. package/stories/ox-input-code.stories.ts +25 -3
  172. package/stories/ox-input-crontab.stories.ts +13 -1
  173. package/stories/ox-input-data.stories.ts +65 -0
  174. package/stories/ox-input-duration.stories.ts +13 -1
  175. package/stories/ox-input-file.stories.ts +13 -1
  176. package/stories/ox-input-hashtags.stories.ts +13 -1
  177. package/stories/ox-input-i18n-label.stories.ts +85 -0
  178. package/stories/ox-input-key-values.stories.ts +13 -1
  179. package/stories/ox-input-mass-fraction.stories.ts +13 -1
  180. package/stories/ox-input-multiple-colors.stories.ts +21 -10
  181. package/stories/ox-input-options.stories.ts +13 -1
  182. package/stories/ox-input-partition-keys.stories.ts +13 -1
  183. package/stories/ox-input-privilege.stories.ts +13 -1
  184. package/stories/ox-input-quantifier.stories.ts +13 -1
  185. package/stories/ox-input-range.stories.ts +13 -1
  186. package/stories/ox-input-search.stories.ts +13 -1
  187. package/stories/ox-input-select-buttons.stories.ts +13 -1
  188. package/stories/ox-input-unit.stories.ts +14 -1
  189. package/stories/ox-input-value-map.stories.ts +13 -1
  190. package/stories/ox-input-value-ranges.stories.ts +13 -1
  191. package/stories/ox-input-work-shift.stories.ts +13 -1
  192. package/stories/ox-select.stories.ts +13 -1
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@operato/input",
3
3
  "description": "Webcomponents for input following open-wc recommendations",
4
4
  "author": "heartyoh@hatiolab.com",
5
- "version": "2.0.0-alpha.8",
5
+ "version": "2.0.0-alpha.80",
6
6
  "main": "dist/src/index.js",
7
7
  "module": "dist/src/index.js",
8
8
  "license": "MIT",
@@ -46,6 +46,7 @@
46
46
  "./ox-input-search.js": "./dist/src/ox-input-search.js",
47
47
  "./ox-input-value-map.js": "./dist/src/ox-input-value-map.js",
48
48
  "./ox-input-value-ranges.js": "./dist/src/ox-input-value-ranges.js",
49
+ "./ox-input-i18n-label.js": "./dist/src/ox-input-i18n-label.js",
49
50
  "./ox-input-partition-keys.js": "./dist/src/ox-input-partition-keys.js",
50
51
  "./ox-input-table.js": "./dist/src/ox-input-table.js",
51
52
  "./ox-input-scene-component-id.js": "./dist/src/ox-input-scene-component-id.js",
@@ -143,6 +144,9 @@
143
144
  "./ox-input-value-ranges.js": [
144
145
  "./dist/src/ox-input-value-ranges.d.ts"
145
146
  ],
147
+ "./ox-input-i18n-label.js": [
148
+ "./dist/src/ox-input-i18n-label.d.ts"
149
+ ],
146
150
  "./ox-input-partition-keys.js": [
147
151
  "./dist/src/ox-input-partition-keys.d.ts"
148
152
  ],
@@ -189,39 +193,39 @@
189
193
  "@codemirror/state": "^6.3.3",
190
194
  "@codemirror/theme-one-dark": "^6.1.2",
191
195
  "@codemirror/view": "^6.22.1",
192
- "@lit/localize": "^0.11.2",
193
- "@material/mwc-icon": "^0.27.0",
194
- "@operato/color-picker": "^2.0.0-alpha.0",
195
- "@operato/i18n": "^2.0.0-alpha.0",
196
- "@operato/popup": "^2.0.0-alpha.8",
197
- "@operato/styles": "^2.0.0-alpha.0",
198
- "@operato/utils": "^2.0.0-alpha.8",
196
+ "@lit/localize": "^0.12.1",
197
+ "@material/web": "^1.4.0",
198
+ "@operato/color-picker": "^2.0.0-alpha.57",
199
+ "@operato/i18n": "^2.0.0-alpha.59",
200
+ "@operato/popup": "^2.0.0-alpha.80",
201
+ "@operato/styles": "^2.0.0-alpha.80",
202
+ "@operato/utils": "^2.0.0-alpha.68",
199
203
  "@polymer/paper-dropdown-menu": "^3.2.0",
200
204
  "@polymer/paper-item": "^3.0.1",
201
205
  "@thebespokepixel/es-tinycolor": "^3.1.0",
202
206
  "@types/codemirror": "^5.60.5",
203
207
  "@undecaf/zbar-wasm": "^0.10.1",
204
208
  "codemirror": "^6.0.1",
205
- "lit": "^2.5.0",
209
+ "lit": "^3.1.2",
206
210
  "lodash-es": "^4.17.21"
207
211
  },
208
212
  "devDependencies": {
209
- "@custom-elements-manifest/analyzer": "^0.8.1",
213
+ "@custom-elements-manifest/analyzer": "^0.9.2",
210
214
  "@hatiolab/prettier-config": "^1.0.0",
211
- "@lit/localize-tools": "^0.6.3",
212
- "@open-wc/eslint-config": "^10.0.0",
215
+ "@lit/localize-tools": "^0.7.2",
216
+ "@open-wc/eslint-config": "^12.0.3",
213
217
  "@open-wc/testing": "^3.1.6",
214
- "@typescript-eslint/eslint-plugin": "^5.59.1",
215
- "@typescript-eslint/parser": "^5.59.1",
218
+ "@typescript-eslint/eslint-plugin": "^7.0.1",
219
+ "@typescript-eslint/parser": "^7.0.1",
216
220
  "@web/dev-server": "^0.3.0",
217
- "@web/dev-server-storybook": "^0.7.4",
218
- "@web/test-runner": "^0.17.0",
221
+ "@web/dev-server-storybook": "^2.0.1",
222
+ "@web/test-runner": "^0.18.0",
219
223
  "concurrently": "^8.0.1",
220
224
  "eslint": "^8.39.0",
221
- "eslint-config-prettier": "^8.3.0",
222
- "husky": "^8.0.1",
223
- "lint-staged": "^13.2.2",
224
- "prettier": "^2.4.1",
225
+ "eslint-config-prettier": "^9.1.0",
226
+ "husky": "^9.0.11",
227
+ "lint-staged": "^15.2.2",
228
+ "prettier": "^3.2.5",
225
229
  "tslib": "^2.3.1",
226
230
  "typescript": "^5.0.4"
227
231
  },
@@ -239,5 +243,5 @@
239
243
  "prettier --write"
240
244
  ]
241
245
  },
242
- "gitHead": "9b76564615d73b9da50d13d30d43cdaa0d4a6fa6"
246
+ "gitHead": "9405ad5252a157db9c9680256a6cb65f764a890b"
243
247
  }
@@ -85,31 +85,6 @@ export class OxInputBarcode extends OxFormField {
85
85
  #scan-button[hidden] {
86
86
  display: none;
87
87
  }
88
-
89
- ox-popup {
90
- position: fixed;
91
-
92
- width: 80vw;
93
- height: 80vh;
94
- transform: translate(10%, 10%);
95
- }
96
-
97
- video {
98
- width: 100%;
99
- height: 100%;
100
- }
101
-
102
- @media screen and (max-width: 460px) {
103
- ox-popup {
104
- position: fixed;
105
- left: 0;
106
- top: 0;
107
- width: 100vw;
108
- height: 100vh;
109
- height: 100dvh;
110
- transform: translate(0%, 0%);
111
- }
112
- }
113
88
  `
114
89
  ]
115
90
 
@@ -146,8 +121,9 @@ export class OxInputBarcode extends OxFormField {
146
121
  @state() stream?: MediaStream
147
122
 
148
123
  @query('input') input!: HTMLInputElement
149
- @query('ox-popup') popup!: OxPopup
150
- @query('video') video!: HTMLVideoElement
124
+
125
+ private popup: OxPopup | null = null
126
+ private video: HTMLVideoElement | null = null
151
127
 
152
128
  connectedCallback() {
153
129
  super.connectedCallback()
@@ -192,14 +168,6 @@ export class OxInputBarcode extends OxFormField {
192
168
  }}
193
169
  ?disabled=${this.disabled}
194
170
  ></button>
195
-
196
- <ox-popup
197
- @focusout=${() => {
198
- this.stopScan()
199
- }}
200
- >
201
- <video></video>
202
- </ox-popup>
203
171
  `
204
172
  }
205
173
 
@@ -250,20 +218,37 @@ export class OxInputBarcode extends OxFormField {
250
218
 
251
219
  async scan(e: MouseEvent) {
252
220
  try {
253
- this.popup.open({})
221
+ if (this.popup) {
222
+ this.stopScan()
223
+ }
254
224
 
255
- /* template.video가 생성된 후에 접근하기 위해서, 한 프레임을 강제로 건너뛴다. */
256
- await this.updateComplete
225
+ this.popup = OxPopup.open({
226
+ template: html`
227
+ <video></video>
228
+ <md-icon
229
+ style="position: fixed; right: 0; top: 0; color: red; tabindex: 0"
230
+ @click=${() => {
231
+ this.stopScan()
232
+ }}
233
+ >close</md-icon
234
+ >
235
+ `,
236
+ width: '100vw',
237
+ height: '100dvh'
238
+ })
239
+
240
+ this.video! = this.popup.querySelector('video') as HTMLVideoElement
257
241
 
258
242
  var constraints = { audio: false, video: { facingMode: 'environment' } } /* backside camera first */
259
243
  this.stream = await navigator.mediaDevices.getUserMedia(constraints)
244
+
260
245
  this.video.srcObject = this.stream
261
246
  this.video.play()
262
247
 
263
248
  this.video.onloadedmetadata = async e => {
264
249
  var canvas = new OffscreenCanvas(
265
- this.video.videoWidth || this.video.width,
266
- this.video.videoHeight || this.video.height
250
+ this.video!.videoWidth || this.video!.width,
251
+ this.video!.videoHeight || this.video!.height
267
252
  )
268
253
 
269
254
  var context = canvas.getContext('2d', {
@@ -276,7 +261,7 @@ export class OxInputBarcode extends OxFormField {
276
261
  return
277
262
  }
278
263
 
279
- context!.drawImage(this.video, 0, 0, canvas.width, canvas.height)
264
+ context!.drawImage(this.video!, 0, 0, canvas.width, canvas.height)
280
265
  const imageData = context!.getImageData(0, 0, canvas.width, canvas.height)
281
266
  const symbols = await scanImageData(imageData)
282
267
  const result = symbols[0]?.decode()
@@ -317,6 +302,11 @@ export class OxInputBarcode extends OxFormField {
317
302
  this.video.srcObject = null
318
303
  }
319
304
 
305
+ if (this.popup) {
306
+ this.popup.close()
307
+ this.popup = null
308
+ }
309
+
320
310
  this.stream?.getTracks().forEach(track => track.stop())
321
311
  }
322
312
  }
@@ -5,8 +5,9 @@
5
5
  import { css, PropertyValues } from 'lit'
6
6
  import { customElement, property } from 'lit/decorators.js'
7
7
 
8
+ import { minimalSetup } from 'codemirror'
8
9
  import { history, historyKeymap, indentWithTab } from '@codemirror/commands'
9
- import { EditorView, highlightActiveLine, keymap } from '@codemirror/view'
10
+ import { EditorView, highlightActiveLine, keymap, lineNumbers } from '@codemirror/view'
10
11
  import { autocompletion, closeBrackets } from '@codemirror/autocomplete'
11
12
  import { bracketMatching, LanguageSupport, syntaxHighlighting } from '@codemirror/language'
12
13
  import { oneDarkHighlightStyle, oneDark } from '@codemirror/theme-one-dark'
@@ -25,7 +26,7 @@ WEB Component for code-mirror code editor.
25
26
 
26
27
  Example:
27
28
 
28
- <ox-input-code .value=${text} tab-size="4" tab-as-space="true" language="javascript">
29
+ <ox-input-code .value=${text} language="javascript" show-line-numbers>
29
30
  </ox-input-code>
30
31
  */
31
32
  @customElement('ox-input-code')
@@ -51,8 +52,7 @@ export class OxInputCode extends OxFormField {
51
52
  * `value`는 에디터에서 작성중인 contents이다.
52
53
  */
53
54
  @property({ type: String }) value: string = ''
54
- @property({ type: Number, attribute: 'tab-size' }) tabSize: number = 2
55
- @property({ type: Boolean, attribute: 'tab-as-space' }) tabAsSpace: boolean = true
55
+ @property({ type: Boolean, attribute: 'show-line-numbers' }) showLineNumbers: boolean = false
56
56
  @property({ type: String }) language?: string = 'javascript'
57
57
 
58
58
  private _self_changing: boolean = false
@@ -88,7 +88,9 @@ export class OxInputCode extends OxFormField {
88
88
  this._editor = new EditorView({
89
89
  doc: this.value,
90
90
  extensions: [
91
+ minimalSetup,
91
92
  ...language,
93
+ ...(this.showLineNumbers ? [lineNumbers()] : []),
92
94
  bracketMatching(),
93
95
  closeBrackets(),
94
96
  history(),
@@ -129,15 +131,6 @@ export class OxInputCode extends OxFormField {
129
131
  this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true, detail: this.value }))
130
132
  })
131
133
 
132
- // this._editor.contentDOM.addEventListener('change', async e => {
133
- // this._self_changing = true
134
- // this._changed = true
135
-
136
- // await this.updateComplete
137
-
138
- // this._self_changing = false
139
- // })
140
-
141
134
  return this._editor
142
135
  }
143
136
  }
@@ -2,7 +2,7 @@
2
2
  * @license Copyright © HatioLab Inc. All rights reserved.
3
3
  */
4
4
 
5
- import '@material/mwc-icon'
5
+ import '@material/web/icon/icon.js'
6
6
  import '@operato/popup/ox-popup-list.js'
7
7
 
8
8
  import { css, html, LitElement } from 'lit'
@@ -17,7 +17,7 @@ export class OxInputContainer extends LitElement {
17
17
  render() {
18
18
  return html`
19
19
  <slot> </slot>
20
- <mwc-icon @click=${this.openPopupList.bind(this)}>menu</mwc-icon>
20
+ <md-icon @click=${this.openPopupList.bind(this)}>menu</md-icon>
21
21
 
22
22
  <ox-popup-list></ox-popup-list>
23
23
  `
@@ -2,8 +2,6 @@
2
2
  * @license Copyright © HatioLab Inc. All rights reserved.
3
3
  */
4
4
 
5
- import '@material/mwc-button'
6
-
7
5
  import { css, html, PropertyValues } from 'lit'
8
6
  import { customElement, property, state } from 'lit/decorators.js'
9
7
 
@@ -211,14 +209,12 @@ export class OxInputCrontab extends OxFormField {
211
209
  margin: -0.25rem;
212
210
  }
213
211
 
214
- mwc-button {
215
- background-color: var(--secondary-color);
212
+ button {
216
213
  border-radius: var(--button-border-radius);
217
- --mdc-theme-primary: #fff;
218
214
  margin: 0.25rem;
219
215
  }
220
- mwc-button:hover,
221
- mwc-button:active {
216
+ button:hover,
217
+ button:active {
222
218
  background-color: var(--primary-color);
223
219
  }
224
220
  `
@@ -399,7 +395,7 @@ export class OxInputCrontab extends OxFormField {
399
395
  }
400
396
 
401
397
  get focusableElements(): HTMLElement[] {
402
- return Array.from(this.renderRoot.querySelectorAll('select, input, mwc-button'))
398
+ return Array.from(this.renderRoot.querySelectorAll('select, input, button'))
403
399
  }
404
400
 
405
401
  firstUpdated() {
@@ -4,11 +4,13 @@
4
4
 
5
5
  import './ox-input-code'
6
6
 
7
- import { css, html, PropertyValues } from 'lit'
7
+ import { css, html } from 'lit'
8
8
  import { customElement } from 'lit/decorators.js'
9
+ import { live } from 'lit/directives/live.js'
9
10
 
10
11
  import { OxFormField } from './ox-form-field.js'
11
12
  import { OxInputCode } from './ox-input-code.js'
13
+ import { isEqual } from 'lodash-es'
12
14
 
13
15
  /**
14
16
  WEB Component for code-mirror based data editor.
@@ -36,7 +38,7 @@ export class OxInputData extends OxFormField {
36
38
  font-size: small;
37
39
  }
38
40
 
39
- div[datatype] mwc-icon {
41
+ div[datatype] md-icon {
40
42
  margin-left: auto;
41
43
  }
42
44
 
@@ -49,38 +51,56 @@ export class OxInputData extends OxFormField {
49
51
  ]
50
52
 
51
53
  render() {
54
+ const valueType = typeof this.value
55
+
52
56
  return html`
53
57
  <div datatype>
54
58
  <input
59
+ id="string"
55
60
  type="radio"
56
61
  name="data-type"
57
62
  data-value="string"
58
- .checked=${typeof this.value == 'string'}
63
+ .checked=${live(valueType == 'string')}
59
64
  @click=${() => this._setDataType('string')}
60
65
  ?disabled=${this.disabled}
61
- />string
66
+ />
67
+ <label for="string">string</label>
62
68
 
63
69
  <input
70
+ id="number"
64
71
  type="radio"
65
72
  name="data-type"
66
73
  data-value="number"
67
- .checked=${typeof this.value == 'number'}
74
+ .checked=${live(valueType == 'number')}
68
75
  @click=${() => this._setDataType('number')}
69
76
  ?disabled=${this.disabled}
70
- />number
77
+ />
78
+ <label for="number">number</label>
71
79
 
72
80
  <input
81
+ id="object"
73
82
  type="radio"
74
83
  name="data-type"
75
84
  data-value="object"
76
- .checked=${typeof this.value == 'object'}
85
+ .checked=${live(valueType == 'object')}
77
86
  @click=${() => this._setDataType('object')}
78
87
  ?disabled=${this.disabled}
79
- />object
80
- <mwc-icon @click=${() => this._clearData()} title="delete">delete_forever</mwc-icon>
88
+ />
89
+ <label for="object">object</label>
90
+
91
+ <md-icon @click=${() => this._clearData()} title="delete">delete_forever</md-icon>
81
92
  </div>
82
93
 
83
- <ox-input-code .value=${this._getData(this.value)} language="javascript" editor ?disabled=${this.disabled}>
94
+ <ox-input-code
95
+ .value=${this._getStringData(this.value)}
96
+ language="text"
97
+ editor
98
+ ?disabled=${this.disabled}
99
+ @change=${(e: CustomEvent) => {
100
+ e.stopPropagation()
101
+ this._setDataTypeAndValue(valueType, (e.target as any).value)
102
+ }}
103
+ >
84
104
  </ox-input-code>
85
105
  `
86
106
  }
@@ -88,45 +108,75 @@ export class OxInputData extends OxFormField {
88
108
  firstUpdated() {
89
109
  this.renderRoot.addEventListener('change', e => {
90
110
  e.stopPropagation()
111
+
91
112
  const target = e.target as OxInputCode
92
113
  if (target.hasAttribute('editor')) {
114
+ if (this.value === undefined && target.value == '') {
115
+ return
116
+ }
93
117
  this.value = target.value
94
118
  }
95
-
96
- const type = this.renderRoot.querySelector('input[name=data-type]:checked')?.getAttribute('data-value')
97
- this._setDataType(type)
98
119
  })
99
120
  }
100
121
 
101
- udpated(changes: PropertyValues<this>) {
102
- if (changes.has('value')) {
103
- this.value = this._getData(this.value)
122
+ _setDataTypeAndValue(type: string | undefined | null, value: any) {
123
+ /* value must be a string */
124
+ try {
125
+ switch (type) {
126
+ case 'number':
127
+ if (!isNaN(Number(value))) {
128
+ value = Number(value)
129
+ }
130
+ break
131
+ case 'object':
132
+ value = eval('(' + value + ')')
133
+ break
134
+ }
135
+ } catch (e) {}
136
+
137
+ if (isEqual(this.value, value)) {
138
+ return
104
139
  }
140
+
141
+ this.value = value
142
+
143
+ this.requestUpdate()
144
+ this._onAfterValueChange()
105
145
  }
106
146
 
107
147
  _setDataType(type: string | undefined | null) {
108
- if (typeof this.value !== type) {
109
- var value = this.value
110
-
111
- try {
112
- switch (type) {
113
- case 'string':
114
- this.value = String(value || '')
115
- break
116
- case 'number':
117
- if (!isNaN(value)) {
118
- this.value = Number(value)
119
- }
120
- break
121
- case 'object':
122
- this.value = eval('(' + value + ')')
123
- break
124
- }
125
- } catch (e) {
126
- console.log(e)
148
+ if (typeof this.value == type) {
149
+ return
150
+ }
151
+
152
+ var value = this.value
153
+
154
+ try {
155
+ switch (type) {
156
+ case 'string':
157
+ value = this._getStringData(value)
158
+ break
159
+ case 'number':
160
+ if (!isNaN(value)) {
161
+ value = Number(value)
162
+ }
163
+ break
164
+ case 'object':
165
+ value = eval('(' + value + ')')
166
+ break
127
167
  }
168
+ } catch (e) {
169
+ console.log(e)
128
170
  }
129
171
 
172
+ if (isEqual(this.value, value)) {
173
+ this.requestUpdate()
174
+ return
175
+ }
176
+
177
+ this.value = value
178
+
179
+ this.requestUpdate()
130
180
  this._onAfterValueChange()
131
181
  }
132
182
 
@@ -135,11 +185,20 @@ export class OxInputData extends OxFormField {
135
185
  this._onAfterValueChange()
136
186
  }
137
187
 
138
- _getData(data: any) {
139
- return typeof data !== 'object' ? data || '' : JSON.stringify(data, null, 1)
188
+ _getStringData(data: any) {
189
+ const type = typeof data
190
+
191
+ switch (type) {
192
+ case 'object':
193
+ return JSON.stringify(data, null, 1)
194
+ case 'undefined':
195
+ return ''
196
+ default:
197
+ return String(data) || ''
198
+ }
140
199
  }
141
200
 
142
- _onAfterValueChange() {
201
+ async _onAfterValueChange() {
143
202
  this.dispatchEvent(
144
203
  new CustomEvent('change', {
145
204
  bubbles: true,
@@ -2,8 +2,6 @@
2
2
  * @license Copyright © HatioLab Inc. All rights reserved.
3
3
  */
4
4
 
5
- import '@material/mwc-button'
6
-
7
5
  import { css, html } from 'lit'
8
6
  import { customElement, property, query } from 'lit/decorators.js'
9
7
 
@@ -28,9 +26,14 @@ export class OxInputDuration extends OxFormField {
28
26
  }
29
27
 
30
28
  form {
31
- width: 100%;
32
- height: 100%;
33
- justify-content: center;
29
+ display: flex;
30
+ flex-direction: row;
31
+
32
+ align-items: center;
33
+ }
34
+
35
+ [padding] {
36
+ min-width: 100px;
34
37
  }
35
38
 
36
39
  input {
@@ -65,18 +68,16 @@ export class OxInputDuration extends OxFormField {
65
68
  border: var(--button-border);
66
69
  border-radius: var(--border-radius);
67
70
  background-color: var(--button-background-color);
68
- padding: var(--padding-narrow) var(--padding-default);
69
71
  min-height: 35px;
70
72
  line-height: 0.8;
71
73
  color: var(--button-color);
72
74
  cursor: pointer;
73
75
  }
76
+
74
77
  button + button {
75
78
  margin-left: -5px;
76
79
  }
77
- button mwc-icon {
78
- font-size: var(--fontsize-default);
79
- }
80
+
80
81
  button:focus,
81
82
  button:hover,
82
83
  button:active {
@@ -100,6 +101,7 @@ export class OxInputDuration extends OxFormField {
100
101
 
101
102
  return html`
102
103
  <form @change=${this.onChange.bind(this)}>
104
+ <div padding></div>
103
105
  <input id="days" type="number" .value=${String(days || 0)} pattern="\\d*" ?disabled=${this.disabled} />
104
106
  <label for="days">${i18next.t('label.days')}</label>
105
107
 
@@ -148,8 +150,9 @@ export class OxInputDuration extends OxFormField {
148
150
  }}
149
151
  ?disabled=${this.disabled}
150
152
  >
151
- <mwc-icon>backspace</mwc-icon>
153
+ <md-icon>backspace</md-icon>
152
154
  </button>
155
+ <div padding></div>
153
156
  </form>
154
157
  `
155
158
  }
@@ -2,7 +2,7 @@
2
2
  * @license Copyright © HatioLab Inc. All rights reserved.
3
3
  */
4
4
 
5
- import '@material/mwc-icon'
5
+ import '@material/web/icon/icon.js'
6
6
 
7
7
  import { css, html, PropertyValues } from 'lit'
8
8
  import { customElement, property, query } from 'lit/decorators.js'
@@ -32,9 +32,10 @@ export class OxInputFile extends OxFormField {
32
32
  font: var(--file-uploader-font) !important;
33
33
  color: var(--file-uploader-color);
34
34
  }
35
- :host > mwc-icon {
35
+
36
+ :host > md-icon {
36
37
  color: var(--file-uploader-icon-color);
37
- --mdc-icon-size: var(--file-uploader-icon-size, 36px);
38
+ --md-icon-size: var(--file-uploader-icon-size, 36px);
38
39
  }
39
40
 
40
41
  :host(.candrop) {
@@ -75,14 +76,14 @@ export class OxInputFile extends OxFormField {
75
76
  border-bottom: var(--file-uploader-li-border-bottom);
76
77
  font: normal 14px var(--theme-font);
77
78
  }
78
- li mwc-icon {
79
+ li md-icon {
79
80
  float: right;
80
81
  cursor: pointer;
81
82
  margin: var(--file-uploader-li-icon-margin);
82
83
  font-size: 1em;
83
84
  }
84
- li mwc-icon:hover,
85
- li mwc-icon:active {
85
+ li md-icon:hover,
86
+ li md-icon:active {
86
87
  color: var(--file-uploader-li-icon-focus-color);
87
88
  }
88
89
  `
@@ -104,7 +105,7 @@ export class OxInputFile extends OxFormField {
104
105
  var files: File[] = this.value || []
105
106
 
106
107
  return html`
107
- <mwc-icon>${this.icon || 'upload'}</mwc-icon>
108
+ <md-icon>${this.icon || 'upload'}</md-icon>
108
109
 
109
110
  <span>${this.description || 'drop files here!'}</span>
110
111
 
@@ -127,7 +128,7 @@ export class OxInputFile extends OxFormField {
127
128
  file => html`
128
129
  <li>
129
130
  - ${file.name}
130
- <mwc-icon
131
+ <md-icon
131
132
  @click=${(e: Event) => {
132
133
  if (this.disabled) {
133
134
  return
@@ -136,7 +137,7 @@ export class OxInputFile extends OxFormField {
136
137
  this.value = [...files]
137
138
  this._notifyChange()
138
139
  }}
139
- >delete_outline</mwc-icon
140
+ >delete_outline</md-icon
140
141
  >
141
142
  </li>
142
143
  `