@operato/data-grist 2.0.0-alpha.11 → 2.0.0-alpha.111

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 (303) hide show
  1. package/CHANGELOG.md +472 -0
  2. package/demo/data-grist-test.html +25 -14
  3. package/demo/index.html +25 -14
  4. package/demo/report-test.html +13 -2
  5. package/dist/src/configure/column-builder.js.map +1 -1
  6. package/dist/src/configure/rows-option-builder.js +2 -1
  7. package/dist/src/configure/rows-option-builder.js.map +1 -1
  8. package/dist/src/configure/zero-config.js +1 -0
  9. package/dist/src/configure/zero-config.js.map +1 -1
  10. package/dist/src/data-card/data-card-gutter-menu.d.ts +1 -1
  11. package/dist/src/data-card/data-card-gutter-menu.js +5 -5
  12. package/dist/src/data-card/data-card-gutter-menu.js.map +1 -1
  13. package/dist/src/data-card/data-card.d.ts +2 -2
  14. package/dist/src/data-card/data-card.js +3 -3
  15. package/dist/src/data-card/data-card.js.map +1 -1
  16. package/dist/src/data-card/event-handlers/record-card-click-handler.js +1 -1
  17. package/dist/src/data-card/event-handlers/record-card-click-handler.js.map +1 -1
  18. package/dist/src/data-card/record-card.d.ts +2 -2
  19. package/dist/src/data-card/record-card.js +26 -26
  20. package/dist/src/data-card/record-card.js.map +1 -1
  21. package/dist/src/data-grid/data-grid-accum-field.js +8 -3
  22. package/dist/src/data-grid/data-grid-accum-field.js.map +1 -1
  23. package/dist/src/data-grid/data-grid-body-style.js +1 -0
  24. package/dist/src/data-grid/data-grid-body-style.js.map +1 -1
  25. package/dist/src/data-grid/data-grid-body.d.ts +3 -3
  26. package/dist/src/data-grid/data-grid-body.js +9 -4
  27. package/dist/src/data-grid/data-grid-body.js.map +1 -1
  28. package/dist/src/data-grid/data-grid-field.d.ts +1 -1
  29. package/dist/src/data-grid/data-grid-field.js +2 -2
  30. package/dist/src/data-grid/data-grid-field.js.map +1 -1
  31. package/dist/src/data-grid/data-grid-footer.d.ts +2 -2
  32. package/dist/src/data-grid/data-grid-footer.js +17 -9
  33. package/dist/src/data-grid/data-grid-footer.js.map +1 -1
  34. package/dist/src/data-grid/data-grid-header.d.ts +1 -1
  35. package/dist/src/data-grid/data-grid-header.js +38 -35
  36. package/dist/src/data-grid/data-grid-header.js.map +1 -1
  37. package/dist/src/data-grid/data-grid.d.ts +1 -1
  38. package/dist/src/data-grid/data-grid.js +12 -2
  39. package/dist/src/data-grid/data-grid.js.map +1 -1
  40. package/dist/src/data-grist.d.ts +1 -1
  41. package/dist/src/data-grist.js +23 -22
  42. package/dist/src/data-grist.js.map +1 -1
  43. package/dist/src/data-list/data-list-gutter.js +12 -0
  44. package/dist/src/data-list/data-list-gutter.js.map +1 -1
  45. package/dist/src/data-list/data-list.d.ts +2 -2
  46. package/dist/src/data-list/data-list.js +3 -3
  47. package/dist/src/data-list/data-list.js.map +1 -1
  48. package/dist/src/data-list/event-handlers/record-partial-click-handler.js +1 -1
  49. package/dist/src/data-list/event-handlers/record-partial-click-handler.js.map +1 -1
  50. package/dist/src/data-list/record-partial.d.ts +2 -2
  51. package/dist/src/data-list/record-partial.js +20 -18
  52. package/dist/src/data-list/record-partial.js.map +1 -1
  53. package/dist/src/data-report/data-report-body.d.ts +1 -1
  54. package/dist/src/data-report/data-report-component.d.ts +1 -1
  55. package/dist/src/data-report.d.ts +1 -1
  56. package/dist/src/editors/ox-grist-editor-checkbox.d.ts +3 -2
  57. package/dist/src/editors/ox-grist-editor-checkbox.js +9 -2
  58. package/dist/src/editors/ox-grist-editor-checkbox.js.map +1 -1
  59. package/dist/src/editors/ox-grist-editor-color.d.ts +1 -1
  60. package/dist/src/editors/ox-grist-editor-date.d.ts +1 -1
  61. package/dist/src/editors/ox-grist-editor-datetime.d.ts +2 -2
  62. package/dist/src/editors/ox-grist-editor-datetime.js +1 -2
  63. package/dist/src/editors/ox-grist-editor-datetime.js.map +1 -1
  64. package/dist/src/editors/ox-grist-editor-email.d.ts +1 -1
  65. package/dist/src/editors/ox-grist-editor-file.d.ts +3 -2
  66. package/dist/src/editors/ox-grist-editor-file.js +8 -2
  67. package/dist/src/editors/ox-grist-editor-file.js.map +1 -1
  68. package/dist/src/editors/ox-grist-editor-image.d.ts +2 -2
  69. package/dist/src/editors/ox-grist-editor-image.js +8 -8
  70. package/dist/src/editors/ox-grist-editor-image.js.map +1 -1
  71. package/dist/src/editors/ox-grist-editor-month.d.ts +1 -1
  72. package/dist/src/editors/ox-grist-editor-multiple-select.d.ts +1 -1
  73. package/dist/src/editors/ox-grist-editor-number.d.ts +3 -2
  74. package/dist/src/editors/ox-grist-editor-number.js +10 -9
  75. package/dist/src/editors/ox-grist-editor-number.js.map +1 -1
  76. package/dist/src/editors/ox-grist-editor-password.d.ts +1 -1
  77. package/dist/src/editors/ox-grist-editor-select.d.ts +1 -1
  78. package/dist/src/editors/ox-grist-editor-select.js +37 -25
  79. package/dist/src/editors/ox-grist-editor-select.js.map +1 -1
  80. package/dist/src/editors/ox-grist-editor-tel.d.ts +1 -1
  81. package/dist/src/editors/ox-grist-editor-text.d.ts +2 -1
  82. package/dist/src/editors/ox-grist-editor-text.js +3 -0
  83. package/dist/src/editors/ox-grist-editor-text.js.map +1 -1
  84. package/dist/src/editors/ox-grist-editor-textarea.d.ts +2 -1
  85. package/dist/src/editors/ox-grist-editor-textarea.js +3 -0
  86. package/dist/src/editors/ox-grist-editor-textarea.js.map +1 -1
  87. package/dist/src/editors/ox-grist-editor-time.d.ts +1 -1
  88. package/dist/src/editors/ox-grist-editor-tree.d.ts +1 -1
  89. package/dist/src/editors/ox-grist-editor-week.d.ts +1 -1
  90. package/dist/src/editors/ox-grist-editor.d.ts +4 -4
  91. package/dist/src/editors/ox-grist-editor.js +14 -12
  92. package/dist/src/editors/ox-grist-editor.js.map +1 -1
  93. package/dist/src/editors/ox-input-tree.d.ts +1 -1
  94. package/dist/src/empty-note.d.ts +2 -2
  95. package/dist/src/empty-note.js +3 -3
  96. package/dist/src/empty-note.js.map +1 -1
  97. package/dist/src/filters/filter-checkbox.js +12 -5
  98. package/dist/src/filters/filter-checkbox.js.map +1 -1
  99. package/dist/src/filters/filter-range-date.js +12 -1
  100. package/dist/src/filters/filter-range-date.js.map +1 -1
  101. package/dist/src/filters/filter-select.js +30 -16
  102. package/dist/src/filters/filter-select.js.map +1 -1
  103. package/dist/src/filters/filter-styles.js +47 -28
  104. package/dist/src/filters/filter-styles.js.map +1 -1
  105. package/dist/src/filters/filters-form.d.ts +7 -1
  106. package/dist/src/filters/filters-form.js +154 -71
  107. package/dist/src/filters/filters-form.js.map +1 -1
  108. package/dist/src/gutters/gutter-button.d.ts +1 -1
  109. package/dist/src/gutters/gutter-button.js +3 -3
  110. package/dist/src/gutters/gutter-button.js.map +1 -1
  111. package/dist/src/gutters/gutter-dirty.d.ts +1 -1
  112. package/dist/src/gutters/gutter-dirty.js +5 -5
  113. package/dist/src/gutters/gutter-dirty.js.map +1 -1
  114. package/dist/src/handlers/contextmenu-tree-mutation.js +4 -22
  115. package/dist/src/handlers/contextmenu-tree-mutation.js.map +1 -1
  116. package/dist/src/index.d.ts +0 -1
  117. package/dist/src/index.js +0 -1
  118. package/dist/src/index.js.map +1 -1
  119. package/dist/src/record-view/record-creator.d.ts +2 -2
  120. package/dist/src/record-view/record-creator.js +1 -1
  121. package/dist/src/record-view/record-creator.js.map +1 -1
  122. package/dist/src/record-view/record-view-body.d.ts +3 -3
  123. package/dist/src/record-view/record-view-body.js +4 -4
  124. package/dist/src/record-view/record-view-body.js.map +1 -1
  125. package/dist/src/record-view/record-view.d.ts +2 -2
  126. package/dist/src/record-view/record-view.js +5 -5
  127. package/dist/src/record-view/record-view.js.map +1 -1
  128. package/dist/src/renderers/ox-grist-renderer-progress.d.ts +1 -1
  129. package/dist/src/renderers/ox-grist-renderer-select.js +34 -4
  130. package/dist/src/renderers/ox-grist-renderer-select.js.map +1 -1
  131. package/dist/src/renderers/ox-grist-renderer-tree.d.ts +1 -1
  132. package/dist/src/renderers/ox-grist-renderer.d.ts +2 -2
  133. package/dist/src/sorters/sorters-control.js +3 -3
  134. package/dist/src/sorters/sorters-control.js.map +1 -1
  135. package/dist/src/types.d.ts +15 -9
  136. package/dist/src/types.js.map +1 -1
  137. package/dist/stories/{accumulator.stories.d.ts → accumulator-format.stories.d.ts} +1 -1
  138. package/dist/stories/{accumulator.stories.js → accumulator-format.stories.js} +58 -129
  139. package/dist/stories/accumulator-format.stories.js.map +1 -0
  140. package/dist/stories/barcode-input-filter.stories.d.ts +1 -1
  141. package/dist/stories/barcode-input-filter.stories.js +41 -79
  142. package/dist/stories/barcode-input-filter.stories.js.map +1 -1
  143. package/dist/stories/bounded-select-filters.stories.d.ts +25 -0
  144. package/dist/stories/bounded-select-filters.stories.js +264 -0
  145. package/dist/stories/bounded-select-filters.stories.js.map +1 -0
  146. package/dist/stories/bounded-select-record.stories.d.ts +25 -0
  147. package/dist/stories/bounded-select-record.stories.js +267 -0
  148. package/dist/stories/bounded-select-record.stories.js.map +1 -0
  149. package/dist/stories/creatable-only-column.stories.d.ts +25 -0
  150. package/dist/stories/creatable-only-column.stories.js +211 -0
  151. package/dist/stories/creatable-only-column.stories.js.map +1 -0
  152. package/dist/stories/default-filters.stories.d.ts +1 -1
  153. package/dist/stories/default-filters.stories.js +84 -79
  154. package/dist/stories/default-filters.stories.js.map +1 -1
  155. package/dist/stories/dynamic-editable.stories.d.ts +1 -1
  156. package/dist/stories/dynamic-editable.stories.js +61 -86
  157. package/dist/stories/dynamic-editable.stories.js.map +1 -1
  158. package/dist/stories/empty-sorters.stories.d.ts +1 -1
  159. package/dist/stories/empty-sorters.stories.js +41 -78
  160. package/dist/stories/empty-sorters.stories.js.map +1 -1
  161. package/dist/stories/explicit-fetch.stories.d.ts +1 -1
  162. package/dist/stories/explicit-fetch.stories.js +42 -79
  163. package/dist/stories/explicit-fetch.stories.js.map +1 -1
  164. package/dist/stories/fixed-column.stories.d.ts +1 -1
  165. package/dist/stories/fixed-column.stories.js +45 -127
  166. package/dist/stories/fixed-column.stories.js.map +1 -1
  167. package/dist/stories/grid-setting.stories.d.ts +36 -0
  168. package/dist/stories/grid-setting.stories.js +403 -0
  169. package/dist/stories/grid-setting.stories.js.map +1 -0
  170. package/dist/stories/grist-modes.stories.d.ts +1 -1
  171. package/dist/stories/grist-modes.stories.js +74 -140
  172. package/dist/stories/grist-modes.stories.js.map +1 -1
  173. package/dist/stories/group-header.stories.d.ts +1 -1
  174. package/dist/stories/group-header.stories.js +45 -127
  175. package/dist/stories/group-header.stories.js.map +1 -1
  176. package/dist/stories/textarea.stories.d.ts +1 -1
  177. package/dist/stories/textarea.stories.js +39 -121
  178. package/dist/stories/textarea.stories.js.map +1 -1
  179. package/dist/stories/tree-column-with-checkbox.stories.d.ts +1 -1
  180. package/dist/stories/tree-column-with-checkbox.stories.js +49 -136
  181. package/dist/stories/tree-column-with-checkbox.stories.js.map +1 -1
  182. package/dist/stories/tree-column.stories.d.ts +1 -1
  183. package/dist/stories/tree-column.stories.js +49 -136
  184. package/dist/stories/tree-column.stories.js.map +1 -1
  185. package/dist/tsconfig.tsbuildinfo +1 -1
  186. package/docs/default-value/default-value.md +1 -1
  187. package/docs/default-value/value-generator/date-generator.md +31 -2
  188. package/docs/default-value/value-generator/hour-time-generator.md +33 -0
  189. package/docs/default-value/value-generator/minute-time-generator.md +33 -0
  190. package/docs/default-value/value-generator/month-date-generator.md +4 -2
  191. package/docs/default-value/value-generator/now-generator.md +29 -0
  192. package/docs/default-value/value-generator/time-generator.md +31 -0
  193. package/docs/default-value/value-generator/today-generator.md +29 -0
  194. package/docs/default-value/value-generator/week-date-generator.md +33 -2
  195. package/docs/default-value/value-generator/year-date-generator.md +33 -2
  196. package/package.json +21 -20
  197. package/src/configure/column-builder.ts +1 -0
  198. package/src/configure/rows-option-builder.ts +11 -1
  199. package/src/configure/zero-config.ts +1 -0
  200. package/src/data-card/data-card-gutter-menu.ts +5 -5
  201. package/src/data-card/data-card.ts +3 -3
  202. package/src/data-card/event-handlers/record-card-click-handler.ts +1 -1
  203. package/src/data-card/record-card.ts +30 -32
  204. package/src/data-grid/data-grid-accum-field.ts +8 -3
  205. package/src/data-grid/data-grid-body-style.ts +1 -0
  206. package/src/data-grid/data-grid-body.ts +10 -5
  207. package/src/data-grid/data-grid-field.ts +1 -1
  208. package/src/data-grid/data-grid-footer.ts +18 -11
  209. package/src/data-grid/data-grid-header.ts +68 -65
  210. package/src/data-grid/data-grid.ts +14 -4
  211. package/src/data-grist.ts +25 -24
  212. package/src/data-list/data-list-gutter.ts +12 -0
  213. package/src/data-list/data-list.ts +3 -3
  214. package/src/data-list/event-handlers/record-partial-click-handler.ts +1 -1
  215. package/src/data-list/record-partial.ts +22 -22
  216. package/src/editors/ox-grist-editor-checkbox.ts +12 -2
  217. package/src/editors/ox-grist-editor-datetime.ts +1 -2
  218. package/src/editors/ox-grist-editor-file.ts +12 -2
  219. package/src/editors/ox-grist-editor-image.ts +10 -7
  220. package/src/editors/ox-grist-editor-number.ts +11 -9
  221. package/src/editors/ox-grist-editor-select.ts +41 -28
  222. package/src/editors/ox-grist-editor-text.ts +4 -0
  223. package/src/editors/ox-grist-editor-textarea.ts +4 -0
  224. package/src/editors/ox-grist-editor.ts +14 -10
  225. package/src/empty-note.ts +3 -3
  226. package/src/filters/filter-checkbox.ts +15 -5
  227. package/src/filters/filter-range-date.ts +16 -1
  228. package/src/filters/filter-select.ts +41 -28
  229. package/src/filters/filter-styles.ts +47 -28
  230. package/src/filters/filters-form.ts +159 -59
  231. package/src/gutters/gutter-button.ts +3 -3
  232. package/src/gutters/gutter-dirty.ts +5 -5
  233. package/src/handlers/contextmenu-tree-mutation.ts +4 -22
  234. package/src/index.ts +0 -1
  235. package/src/record-view/record-creator.ts +1 -1
  236. package/src/record-view/record-view-body.ts +4 -4
  237. package/src/record-view/record-view.ts +5 -5
  238. package/src/renderers/ox-grist-renderer-select.ts +41 -6
  239. package/src/sorters/sorters-control.ts +3 -3
  240. package/src/types.ts +20 -10
  241. package/stories/{accumulator.stories.ts → accumulator-format.stories.ts} +56 -130
  242. package/stories/barcode-input-filter.stories.ts +53 -89
  243. package/stories/bounded-select-filters.stories.ts +313 -0
  244. package/stories/bounded-select-record.stories.ts +316 -0
  245. package/stories/creatable-only-column.stories.ts +231 -0
  246. package/stories/default-filters.stories.ts +96 -89
  247. package/stories/dynamic-editable.stories.ts +68 -92
  248. package/stories/empty-sorters.stories.ts +53 -89
  249. package/stories/explicit-fetch.stories.ts +54 -90
  250. package/stories/fixed-column.stories.ts +57 -137
  251. package/stories/grid-setting.stories.ts +441 -0
  252. package/stories/grist-modes.stories.ts +86 -155
  253. package/stories/group-header.stories.ts +57 -137
  254. package/stories/textarea.stories.ts +42 -127
  255. package/stories/tree-column-with-checkbox.stories.ts +53 -138
  256. package/stories/tree-column.stories.ts +53 -138
  257. package/themes/grist-theme.css +3 -1
  258. package/yarn-error.log +16971 -0
  259. package/dist/src/value-generator/date-generator.d.ts +0 -6
  260. package/dist/src/value-generator/date-generator.js +0 -30
  261. package/dist/src/value-generator/date-generator.js.map +0 -1
  262. package/dist/src/value-generator/hour-time-generator.d.ts +0 -7
  263. package/dist/src/value-generator/hour-time-generator.js +0 -29
  264. package/dist/src/value-generator/hour-time-generator.js.map +0 -1
  265. package/dist/src/value-generator/index.d.ts +0 -1
  266. package/dist/src/value-generator/index.js +0 -2
  267. package/dist/src/value-generator/index.js.map +0 -1
  268. package/dist/src/value-generator/minute-time-generator.d.ts +0 -7
  269. package/dist/src/value-generator/minute-time-generator.js +0 -29
  270. package/dist/src/value-generator/minute-time-generator.js.map +0 -1
  271. package/dist/src/value-generator/month-date-generator.d.ts +0 -7
  272. package/dist/src/value-generator/month-date-generator.js +0 -31
  273. package/dist/src/value-generator/month-date-generator.js.map +0 -1
  274. package/dist/src/value-generator/now-generator.d.ts +0 -4
  275. package/dist/src/value-generator/now-generator.js +0 -8
  276. package/dist/src/value-generator/now-generator.js.map +0 -1
  277. package/dist/src/value-generator/registry.d.ts +0 -11
  278. package/dist/src/value-generator/registry.js +0 -50
  279. package/dist/src/value-generator/registry.js.map +0 -1
  280. package/dist/src/value-generator/time-generator.d.ts +0 -6
  281. package/dist/src/value-generator/time-generator.js +0 -28
  282. package/dist/src/value-generator/time-generator.js.map +0 -1
  283. package/dist/src/value-generator/today-generator.d.ts +0 -4
  284. package/dist/src/value-generator/today-generator.js +0 -8
  285. package/dist/src/value-generator/today-generator.js.map +0 -1
  286. package/dist/src/value-generator/week-date-generator.d.ts +0 -7
  287. package/dist/src/value-generator/week-date-generator.js +0 -29
  288. package/dist/src/value-generator/week-date-generator.js.map +0 -1
  289. package/dist/src/value-generator/year-date-generator.d.ts +0 -7
  290. package/dist/src/value-generator/year-date-generator.js +0 -29
  291. package/dist/src/value-generator/year-date-generator.js.map +0 -1
  292. package/dist/stories/accumulator.stories.js.map +0 -1
  293. package/src/value-generator/date-generator.ts +0 -35
  294. package/src/value-generator/hour-time-generator.ts +0 -43
  295. package/src/value-generator/index.ts +0 -1
  296. package/src/value-generator/minute-time-generator.ts +0 -43
  297. package/src/value-generator/month-date-generator.ts +0 -38
  298. package/src/value-generator/now-generator.ts +0 -10
  299. package/src/value-generator/registry.ts +0 -58
  300. package/src/value-generator/time-generator.ts +0 -33
  301. package/src/value-generator/today-generator.ts +0 -10
  302. package/src/value-generator/week-date-generator.ts +0 -40
  303. package/src/value-generator/year-date-generator.ts +0 -36
@@ -12,17 +12,20 @@ export class OxGristEditorImage extends OxGristEditor {
12
12
 
13
13
  _onchange(e: Event) {
14
14
  e.stopPropagation()
15
- this._dirtyValue = this.formatFromEditor(e)
16
- this._onfocusout()
17
- }
18
15
 
19
- formatFromEditor(e: Event) {
20
- // value가 image file object인지, image url인지 확인
21
16
  const input = e.target as HTMLInputElement
17
+
18
+ // value가 image file object인지, image url인지 확인
22
19
  if (input.files?.[0]) {
23
- return input.files[0]
20
+ this._dirtyValue = this.formatFromEditor(input.files[0])
24
21
  } else {
25
- return input.value
22
+ this._dirtyValue = this.formatFromEditor(input.value)
26
23
  }
24
+
25
+ this._onfocusout()
26
+ }
27
+
28
+ formatFromEditor(value: any) {
29
+ return value
27
30
  }
28
31
  }
@@ -1,20 +1,22 @@
1
1
  import { OxGristEditor } from './ox-grist-editor.js'
2
2
  import { customElement } from 'lit/decorators.js'
3
3
  import { html } from 'lit'
4
+ import { parseToNumberOrNull } from '@operato/utils'
4
5
 
5
6
  @customElement('ox-grist-editor-number')
6
7
  export class OxGristEditorNumber extends OxGristEditor {
7
- formatFromEditor(e: Event) {
8
- let value = (e.target as HTMLInputElement).value
8
+ get inlineEditable() {
9
+ return true
10
+ }
11
+
12
+ formatFromEditor(value: any) {
13
+ const parsed = parseToNumberOrNull(value) ?? null
9
14
 
10
- switch (this.column.type) {
11
- case 'float':
12
- return Number.parseFloat(value)
13
- case 'integer':
14
- return Number.parseInt(value)
15
- default:
16
- return Number(value)
15
+ if (parsed !== null && this.column.type == 'integer') {
16
+ return Math.floor(parsed)
17
17
  }
18
+
19
+ return parsed
18
20
  }
19
21
 
20
22
  get editorTemplate() {
@@ -1,6 +1,38 @@
1
- import { OxGristEditor } from './ox-grist-editor.js'
2
- import { customElement } from 'lit/decorators.js'
3
1
  import { html } from 'lit'
2
+ import { customElement } from 'lit/decorators.js'
3
+ import { until } from 'lit/directives/until.js'
4
+
5
+ import { OxGristEditor } from './ox-grist-editor.js'
6
+ import { SelectOption, SelectOptionObject } from '../types.js'
7
+
8
+ function buildOptions(options: SelectOption[], value: any) {
9
+ const selectOptionObjects = options.map(option => {
10
+ switch (typeof option) {
11
+ case 'string':
12
+ return {
13
+ display: option,
14
+ value: option
15
+ }
16
+ case 'object':
17
+ return {
18
+ display: option.display || option.name,
19
+ value: option.value
20
+ }
21
+ default:
22
+ return option
23
+ }
24
+ }) as SelectOptionObject[]
25
+
26
+ return html`
27
+ <select>
28
+ ${selectOptionObjects.map(
29
+ (option: any) => html`
30
+ <option ?selected=${option.value == value} value=${option.value}>${option.display}</option>
31
+ `
32
+ )}
33
+ </select>
34
+ `
35
+ }
4
36
 
5
37
  @customElement('ox-grist-editor-select')
6
38
  export class OxGristEditorSelect extends OxGristEditor {
@@ -10,33 +42,14 @@ export class OxGristEditorSelect extends OxGristEditor {
10
42
 
11
43
  if (typeof options == 'function') {
12
44
  options = options.call(null, this.value, this.column, this.record, this.rowIndex, this.field)
13
- }
14
45
 
15
- options = options.map((option: any) => {
16
- switch (typeof option) {
17
- case 'string':
18
- return {
19
- display: option,
20
- value: option
21
- }
22
- case 'object':
23
- return {
24
- display: option.display,
25
- value: option.value
26
- }
27
- default:
28
- return option
46
+ if (options instanceof Promise) {
47
+ return html`${until(options.then(options => buildOptions(options, this.value)))}`
48
+ } else {
49
+ return buildOptions((options || []) as SelectOption[], rowOptionField.display || this.value)
29
50
  }
30
- })
31
-
32
- return html`
33
- <select>
34
- ${options.map(
35
- (option: any) => html`
36
- <option ?selected=${option.value == this.value} value=${option.value}>${option.display}</option>
37
- `
38
- )}
39
- </select>
40
- `
51
+ } else {
52
+ return buildOptions((options || []) as SelectOption[], this.value)
53
+ }
41
54
  }
42
55
  }
@@ -4,6 +4,10 @@ import { html } from 'lit'
4
4
 
5
5
  @customElement('ox-grist-editor-text')
6
6
  export class OxGristEditorText extends OxGristEditor {
7
+ get inlineEditable() {
8
+ return true
9
+ }
10
+
7
11
  get editorTemplate() {
8
12
  return html` <input type="text" .value=${this.value} /> `
9
13
  }
@@ -6,6 +6,10 @@ import { html } from 'lit'
6
6
 
7
7
  @customElement('ox-grist-editor-textarea')
8
8
  export class OxGristEditorTextarea extends OxGristEditor {
9
+ get inlineEditable() {
10
+ return true
11
+ }
12
+
9
13
  get editorTemplate() {
10
14
  return html` <ox-input-textarea .value=${this.value}></ox-input-textarea> `
11
15
  }
@@ -4,7 +4,7 @@ import { customElement, property } from 'lit/decorators.js'
4
4
  import { ZERO_COLUMN, ZERO_RECORD } from '../configure/zero-config'
5
5
  import { DataGridField } from '../data-grid/data-grid-field'
6
6
  import { ColumnConfig, GristRecord } from '../types'
7
- import { getDefaultValue } from '../value-generator'
7
+ import { getDefaultValue } from '@operato/time-calculator'
8
8
 
9
9
  const STYLE = css`
10
10
  :host {
@@ -91,8 +91,8 @@ export class OxGristEditor extends LitElement {
91
91
  return this.renderRoot.firstElementChild as HTMLElement
92
92
  }
93
93
 
94
- get directEditable() {
95
- return true
94
+ get inlineEditable() {
95
+ return false
96
96
  }
97
97
 
98
98
  async firstUpdated() {
@@ -121,19 +121,21 @@ export class OxGristEditor extends LitElement {
121
121
  currentValue = getDefaultValue(defaultValue, this.record)
122
122
  }
123
123
 
124
+ this.value = this._dirtyValue = this.formatForEditor(currentValue)
125
+
124
126
  // 입력을 위한 키를 누르면서 편집모드가 될때는 누른 키가 처음에 입력되도록, enter 같은 것을 눌러서 편집모드가 되면 현재 값으로 편집모드 전환
125
- const editorValue = this.field?.valueWithEdit ? this.field.valueWithEdit : this.formatForEditor(currentValue)
126
- this.value = this._dirtyValue = this.field?.type === 'number' ? Number(editorValue) : editorValue
127
+ const valueWith = this.inlineEditable && this.field?.valueWith
128
+ this.value = this._dirtyValue = valueWith ? this.formatFromEditor(valueWith) : this.formatForEditor(currentValue)
127
129
 
128
130
  requestAnimationFrame(() => {
129
131
  this.focus()
130
- this.select()
132
+ !valueWith && this.select()
131
133
  })
132
134
  }
133
135
 
134
136
  select() {
135
137
  const editor = this.editor
136
- if ((editor as HTMLInputElement)?.select && !this.field?.valueWithEdit) {
138
+ if ((editor as HTMLInputElement)?.select) {
137
139
  return (editor as HTMLInputElement).select()
138
140
  }
139
141
  }
@@ -149,8 +151,8 @@ export class OxGristEditor extends LitElement {
149
151
  return value == null ? '' : value
150
152
  }
151
153
 
152
- formatFromEditor(e: Event): any {
153
- return (e.target as HTMLInputElement).value
154
+ formatFromEditor(value: any): any {
155
+ return value
154
156
  }
155
157
 
156
158
  _onfocusout() {
@@ -180,7 +182,9 @@ export class OxGristEditor extends LitElement {
180
182
  _onchange(e: Event): void {
181
183
  e.stopPropagation()
182
184
 
183
- this._dirtyValue = this.formatFromEditor(e)
185
+ const value = (e.target as any)?.value
186
+
187
+ this._dirtyValue = this.formatFromEditor(value)
184
188
  }
185
189
 
186
190
  _onkeydown(e: Event): void {}
package/src/empty-note.ts CHANGED
@@ -1,4 +1,4 @@
1
- import '@material/mwc-icon'
1
+ import '@material/web/icon/icon.js'
2
2
 
3
3
  import { LitElement, css, html } from 'lit'
4
4
  import { customElement, property } from 'lit/decorators.js'
@@ -11,7 +11,7 @@ export class EmptyNote extends LitElement {
11
11
  text-align: center;
12
12
  }
13
13
 
14
- mwc-icon {
14
+ md-icon {
15
15
  font: var(--oops-note-icon-font);
16
16
  color: var(--oops-note-icon-color);
17
17
  border: var(--oops-note-icon-border);
@@ -38,7 +38,7 @@ export class EmptyNote extends LitElement {
38
38
 
39
39
  render() {
40
40
  return html`
41
- ${this.icon ? html`<mwc-icon>${this.icon}</mwc-icon>` : html``}
41
+ ${this.icon ? html`<md-icon>${this.icon}</md-icon>` : html``}
42
42
  <div titler>${this.title}</div>
43
43
  ${this.description ? html`<div description>${this.description}</div>` : html``}
44
44
  `
@@ -5,8 +5,16 @@ import { html } from 'lit-html'
5
5
  import { FilterConfigObject, FilterSelectRenderer } from '../types.js'
6
6
 
7
7
  export const FilterCheckbox: FilterSelectRenderer = (column, value, owner) => {
8
- const filter = column.filter as FilterConfigObject
9
- const options = filter?.options
8
+ const { name, header, label, filter } = column
9
+
10
+ const { label: filterLabel, operator } = filter! as FilterConfigObject
11
+
12
+ const labelText =
13
+ filterLabel !== undefined
14
+ ? filterLabel
15
+ : typeof label === 'object' && label.renderer
16
+ ? label.renderer(column)
17
+ : header.renderer(column) || name
10
18
 
11
19
  return html`
12
20
  <ox-checkbox
@@ -14,19 +22,21 @@ export const FilterCheckbox: FilterSelectRenderer = (column, value, owner) => {
14
22
  ?checked=${value}
15
23
  indeterminatable
16
24
  ?indeterminate=${value == null}
25
+ left-label
17
26
  @change=${(e: CustomEvent) => {
18
27
  ;(e.target as HTMLElement).dispatchEvent(
19
28
  new CustomEvent('filter-change', {
20
29
  bubbles: true,
21
30
  composed: true,
22
31
  detail: {
23
- name: column.name,
24
- operator: filter.operator,
32
+ name,
33
+ operator,
25
34
  value: (e.target as Element & { checked: boolean | undefined }).checked
26
35
  }
27
36
  })
28
37
  )
29
38
  }}
30
- ></ox-checkbox>
39
+ ><label filter-title><span>${labelText}</span></label></ox-checkbox
40
+ >
31
41
  `
32
42
  }
@@ -2,16 +2,31 @@ import { FilterConfigObject, FilterSelectRenderer } from '../types'
2
2
 
3
3
  import { html } from 'lit-html'
4
4
 
5
+ function formatDate(type: string, date: Date) {
6
+ var year = date.getFullYear()
7
+ var month = ('0' + (date.getMonth() + 1)).slice(-2)
8
+ var day = ('0' + date.getDate()).slice(-2)
9
+ var hours = ('0' + date.getHours()).slice(-2)
10
+ var minutes = ('0' + date.getMinutes()).slice(-2)
11
+
12
+ var formatDate = year + '-' + month + '-' + day
13
+
14
+ return type == 'date' ? formatDate : formatDate + 'T' + hours + ':' + minutes
15
+ }
16
+
5
17
  export const FilterRangeDate: FilterSelectRenderer = (column, value, owner) => {
6
18
  const filter = column.filter as FilterConfigObject
7
19
 
8
- const [from, to] = value instanceof Array ? value : []
20
+ var [from, to] = value instanceof Array ? value : []
9
21
 
10
22
  var type: any = filter?.type || column.type
11
23
  if (type === 'datetime') {
12
24
  type = 'datetime-local'
13
25
  }
14
26
 
27
+ from = formatDate(type, new Date(from))
28
+ to = formatDate(type, new Date(to))
29
+
15
30
  return html`
16
31
  <input
17
32
  name=${column.name}
@@ -1,26 +1,14 @@
1
1
  import '@operato/input/ox-checkbox.js'
2
2
 
3
- import { FilterConfigObject, FilterSelectRenderer } from '../types'
3
+ import { html } from 'lit'
4
+ import { until } from 'lit/directives/until.js'
4
5
 
5
- import { html } from 'lit-html'
6
+ import { FilterConfigObject, FilterOperator, FilterSelectRenderer, SelectOption, SelectOptionObject } from '../types'
7
+ import { OxFiltersForm } from './filters-form'
8
+ import { DataGridHeader } from '../data-grid/data-grid-header'
6
9
 
7
- export const FilterSelect: FilterSelectRenderer = (column, value, owner) => {
8
- /* value는 filters-form이나 grid-header에서 처리되므로 이 곳에서는 무시한다. */
9
- const filter = column.filter as FilterConfigObject
10
- const operator = filter?.operator
11
-
12
- var options = filter?.options || column.record.options || []
13
-
14
- if (typeof options === 'function') {
15
- if (!filter?.options) {
16
- console.warn(
17
- 'ox-grist의 column.filter 속성에서는 column.record.options의 함수형 options을 사용할 수 없으므로, filter 속성에서 재지정해야한다.'
18
- )
19
- }
20
- options = options.call(column, owner)
21
- }
22
-
23
- options = options.map((option: any) => {
10
+ function buildOptions(options: SelectOption[], operator?: FilterOperator) {
11
+ const selectOptionObjects = options.map(option => {
24
12
  switch (typeof option) {
25
13
  case 'string':
26
14
  return {
@@ -29,27 +17,52 @@ export const FilterSelect: FilterSelectRenderer = (column, value, owner) => {
29
17
  }
30
18
  case 'object':
31
19
  return {
32
- display: option.display,
20
+ display: option.display || option.name,
33
21
  value: option.value
34
22
  }
35
23
  default:
36
24
  return option
37
25
  }
38
- })
26
+ }) as SelectOptionObject[]
39
27
 
40
28
  return operator === 'in'
41
29
  ? html`
42
- ${options
43
- ?.filter((option: { display: string; value: any }) => !!option)
30
+ ${selectOptionObjects
31
+ ?.filter(option => !!option)
44
32
  .map(
45
- (option: { display: string; value: any }) =>
46
- html` <ox-checkbox option value=${option.value}>${option.display}</ox-checkbox> `
33
+ ({ value, display, name }) => html` <ox-checkbox option value=${value}>${display || name}</ox-checkbox> `
47
34
  )}
48
35
  `
49
36
  : html`
50
- ${options?.map(
51
- (option: { display: string; value: any }) =>
52
- html` <div option value=${option.value}>${option.display}&nbsp;</div> `
37
+ ${selectOptionObjects?.map(
38
+ ({ value, display, name }) => html` <div option value=${value}>${display || name}&nbsp;</div> `
53
39
  )}
54
40
  `
55
41
  }
42
+
43
+ export const FilterSelect: FilterSelectRenderer = (column, value, owner) => {
44
+ /* value는 filters-form이나 grid-header에서 처리되므로 이 곳에서는 무시한다. */
45
+ const filter = column.filter as FilterConfigObject
46
+ const operator = filter?.operator
47
+ const form = owner as OxFiltersForm | DataGridHeader
48
+
49
+ var options = filter?.options || column.record.options || []
50
+
51
+ if (typeof options === 'function') {
52
+ if (!filter?.options) {
53
+ console.warn(
54
+ 'ox-grist의 column.filter 속성에서는 column.record.options의 함수형 options을 사용할 수 없으므로, filter 속성에서 재지정해야한다.'
55
+ )
56
+ }
57
+
58
+ options = options.call(null, value, column, form instanceof OxFiltersForm ? form.getFormObjectValue() : {}, owner)
59
+
60
+ if (options instanceof Promise) {
61
+ return html`${until(options.then(options => buildOptions(options, operator)))}`
62
+ } else {
63
+ return buildOptions((options || []) as SelectOption[], operator)
64
+ }
65
+ } else {
66
+ return buildOptions((options || []) as SelectOption[], operator)
67
+ }
68
+ }
@@ -2,56 +2,77 @@ import { css } from 'lit'
2
2
 
3
3
  export const FilterStyles = css`
4
4
  :host {
5
- --ox-input-placeholder-color: var(--primary-color);
6
-
7
- --ox-input-padding: var(--padding-narrow) var(--padding-default);
8
- --ox-input-border: 1px solid rgba(0, 0, 0, 0.2);
9
- --ox-input-focus-border: 1px solid var(--primary-color);
10
- --ox-input-border-radius: var(--border-radius);
11
- --ox-input-font: normal 14px var(--theme-font);
12
- --ox-input-color: var(--primary-text-color);
13
-
14
- --ox-filters-form-gap: var(--margin-wide);
15
- --ox-filters-form-label-font: var(--label-font);
16
- --ox-filters-form-label-color: var(--label-color);
17
- --ox-select-padding: 0 var(--padding-narrow);
5
+ --ox-filters-input-placeholder-color: var(--input-placeholder-color, var(--primary-color));
6
+
7
+ --ox-filters-input-border: var(--input-border, 1px solid rgba(0, 0, 0, 0.2));
8
+ --ox-filters-input-focus-border: var(--input-focus-border, 1px solid var(--primary-color));
9
+ --ox-filters-input-font: var(--input-font, normal 14px var(--theme-font));
10
+ --ox-filters-input-color: var(--input-color, var(--primary-text-color));
11
+ --ox-filters-input-focus-color: var(--input-focus-color, var(--primary-color));
12
+ --ox-filters-label-font: var(--label-font, normal 14px var(--theme-font));
13
+ --ox-filters-label-color: var(--label-color, var(--primary-text-color));
14
+ --ox-filters-input-background-color: transparent;
15
+
16
+ --ox-filters-form-gap: var(--input-gap-vertical, 8px) var(--input-gap-horizontal, 16px);
17
+ --ox-filters-input-padding: var(--input-padding, 6px 2px);
18
+
19
+ --ox-select-padding: var(--ox-filters-input-padding);
20
+ --ox-checkbox-background-color: var(--ox-filters-input-background-color, transparent);
18
21
  }
19
22
 
20
23
  label {
21
- font: var(--ox-filters-form-label-font);
22
- color: var(--ox-filters-form-label-color);
24
+ font: var(--ox-filters-label-font);
25
+ color: var(--ox-filters-label-color);
23
26
  }
27
+
24
28
  span {
25
- margin-right: var(--margin-narrow);
26
29
  text-transform: capitalize;
27
30
  }
28
31
 
29
32
  input::placeholder {
30
- color: var(--ox-input-placeholder-color);
33
+ color: var(--ox-filters-input-placeholder-color);
31
34
  opacity: 0.6;
32
35
  }
33
36
 
37
+ input {
38
+ padding: var(--ox-filters-input-padding);
39
+ }
40
+
41
+ label > span + *,
34
42
  ox-select,
35
43
  input {
36
- padding: var(--input-padding);
37
44
  border: none;
38
- border-bottom: var(--ox-input-border);
39
- font: var(--ox-input-font);
40
- color: var(--ox-input-color);
45
+ border-bottom: var(--ox-filters-input-border);
46
+ font: var(--ox-filters-input-font);
47
+ color: var(--ox-filters-input-color);
48
+ background-color: var(--ox-filters-input-background-color, transparent);
49
+ }
50
+
51
+ label > span + * {
52
+ min-width: 120px;
41
53
  }
42
54
 
43
55
  ox-select:focus,
44
56
  input:focus {
45
57
  outline: none;
46
- border-bottom: var(--ox-input-focus-border);
47
- color: var(--primary-color);
58
+ border-bottom: var(--ox-filters-input-focus-border);
59
+ color: var(--ox-filters-input-focus-color);
48
60
  }
61
+
49
62
  ox-select {
50
- padding: var(--ox-select-padding);
63
+ min-width: 100px;
64
+ max-width: 170px;
65
+ }
66
+
67
+ ox-input-barcode {
68
+ min-width: 150px;
69
+ }
70
+
71
+ ox-input-search {
72
+ max-width: 150px;
51
73
  }
52
74
 
53
75
  input[type='number'] {
54
- padding-right: var(--padding-narrow);
55
76
  max-width: 90px;
56
77
  }
57
78
 
@@ -59,15 +80,13 @@ export const FilterStyles = css`
59
80
  input[type*='time'],
60
81
  input[type='week'],
61
82
  input[type='month'] {
62
- padding: 8px var(--padding-narrow) 8px var(--padding-default);
63
83
  max-width: 170px;
64
84
  }
65
85
 
66
86
  @media only screen and (max-width: 460px) {
67
87
  :host {
68
88
  --ox-filters-form-label-font: bold 13px var(--theme-font);
69
- --ox-input-font: normal 16px var(--theme-font);
70
- --ox-filters-form-gap: var(--margin-narrow);
89
+ --ox-filters-input-font: normal 16px var(--theme-font);
71
90
  }
72
91
 
73
92
  input[from],