@operato/data-grist 2.0.0-alpha.9 → 2.0.0-alpha.92

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 (274) hide show
  1. package/CHANGELOG.md +358 -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/rows-option-builder.js +2 -1
  6. package/dist/src/configure/rows-option-builder.js.map +1 -1
  7. package/dist/src/configure/zero-config.js +1 -0
  8. package/dist/src/configure/zero-config.js.map +1 -1
  9. package/dist/src/data-card/data-card-gutter-menu.d.ts +1 -1
  10. package/dist/src/data-card/data-card-gutter-menu.js +5 -5
  11. package/dist/src/data-card/data-card-gutter-menu.js.map +1 -1
  12. package/dist/src/data-card/data-card.d.ts +2 -2
  13. package/dist/src/data-card/data-card.js +3 -3
  14. package/dist/src/data-card/data-card.js.map +1 -1
  15. package/dist/src/data-card/event-handlers/record-card-click-handler.js +1 -1
  16. package/dist/src/data-card/event-handlers/record-card-click-handler.js.map +1 -1
  17. package/dist/src/data-card/record-card.d.ts +2 -2
  18. package/dist/src/data-card/record-card.js +26 -26
  19. package/dist/src/data-card/record-card.js.map +1 -1
  20. package/dist/src/data-grid/data-grid-accum-field.js +8 -3
  21. package/dist/src/data-grid/data-grid-accum-field.js.map +1 -1
  22. package/dist/src/data-grid/data-grid-body.d.ts +3 -3
  23. package/dist/src/data-grid/data-grid-body.js +9 -4
  24. package/dist/src/data-grid/data-grid-body.js.map +1 -1
  25. package/dist/src/data-grid/data-grid-field.d.ts +1 -1
  26. package/dist/src/data-grid/data-grid-field.js +2 -2
  27. package/dist/src/data-grid/data-grid-field.js.map +1 -1
  28. package/dist/src/data-grid/data-grid-footer.d.ts +2 -2
  29. package/dist/src/data-grid/data-grid-footer.js +17 -9
  30. package/dist/src/data-grid/data-grid-footer.js.map +1 -1
  31. package/dist/src/data-grid/data-grid-header.d.ts +1 -1
  32. package/dist/src/data-grid/data-grid-header.js +38 -35
  33. package/dist/src/data-grid/data-grid-header.js.map +1 -1
  34. package/dist/src/data-grid/data-grid.d.ts +1 -1
  35. package/dist/src/data-grid/data-grid.js +12 -2
  36. package/dist/src/data-grid/data-grid.js.map +1 -1
  37. package/dist/src/data-grist.d.ts +226 -4
  38. package/dist/src/data-grist.js +218 -25
  39. package/dist/src/data-grist.js.map +1 -1
  40. package/dist/src/data-list/data-list-gutter.js +12 -0
  41. package/dist/src/data-list/data-list-gutter.js.map +1 -1
  42. package/dist/src/data-list/data-list.d.ts +2 -2
  43. package/dist/src/data-list/data-list.js +3 -3
  44. package/dist/src/data-list/data-list.js.map +1 -1
  45. package/dist/src/data-list/event-handlers/record-partial-click-handler.js +1 -1
  46. package/dist/src/data-list/event-handlers/record-partial-click-handler.js.map +1 -1
  47. package/dist/src/data-list/record-partial.d.ts +2 -2
  48. package/dist/src/data-list/record-partial.js +20 -18
  49. package/dist/src/data-list/record-partial.js.map +1 -1
  50. package/dist/src/data-manipulator.d.ts +6 -6
  51. package/dist/src/data-manipulator.js +44 -29
  52. package/dist/src/data-manipulator.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-tel.d.ts +1 -1
  79. package/dist/src/editors/ox-grist-editor-text.d.ts +2 -1
  80. package/dist/src/editors/ox-grist-editor-text.js +3 -0
  81. package/dist/src/editors/ox-grist-editor-text.js.map +1 -1
  82. package/dist/src/editors/ox-grist-editor-textarea.d.ts +2 -1
  83. package/dist/src/editors/ox-grist-editor-textarea.js +3 -0
  84. package/dist/src/editors/ox-grist-editor-textarea.js.map +1 -1
  85. package/dist/src/editors/ox-grist-editor-time.d.ts +1 -1
  86. package/dist/src/editors/ox-grist-editor-tree.d.ts +1 -1
  87. package/dist/src/editors/ox-grist-editor-week.d.ts +1 -1
  88. package/dist/src/editors/ox-grist-editor.d.ts +4 -4
  89. package/dist/src/editors/ox-grist-editor.js +14 -12
  90. package/dist/src/editors/ox-grist-editor.js.map +1 -1
  91. package/dist/src/editors/ox-input-tree.d.ts +1 -1
  92. package/dist/src/empty-note.d.ts +2 -2
  93. package/dist/src/empty-note.js +3 -3
  94. package/dist/src/empty-note.js.map +1 -1
  95. package/dist/src/filters/filter-checkbox.js +12 -5
  96. package/dist/src/filters/filter-checkbox.js.map +1 -1
  97. package/dist/src/filters/filter-range-date.js +12 -1
  98. package/dist/src/filters/filter-range-date.js.map +1 -1
  99. package/dist/src/filters/filter-styles.js +47 -28
  100. package/dist/src/filters/filter-styles.js.map +1 -1
  101. package/dist/src/filters/filters-form.d.ts +1 -0
  102. package/dist/src/filters/filters-form.js +71 -50
  103. package/dist/src/filters/filters-form.js.map +1 -1
  104. package/dist/src/gutters/gutter-button.d.ts +1 -1
  105. package/dist/src/gutters/gutter-button.js +3 -3
  106. package/dist/src/gutters/gutter-button.js.map +1 -1
  107. package/dist/src/gutters/gutter-dirty.d.ts +1 -1
  108. package/dist/src/gutters/gutter-dirty.js +5 -5
  109. package/dist/src/gutters/gutter-dirty.js.map +1 -1
  110. package/dist/src/handlers/contextmenu-tree-mutation.js +5 -23
  111. package/dist/src/handlers/contextmenu-tree-mutation.js.map +1 -1
  112. package/dist/src/index.d.ts +0 -1
  113. package/dist/src/index.js +0 -1
  114. package/dist/src/index.js.map +1 -1
  115. package/dist/src/record-view/record-creator.d.ts +2 -2
  116. package/dist/src/record-view/record-creator.js +1 -1
  117. package/dist/src/record-view/record-creator.js.map +1 -1
  118. package/dist/src/record-view/record-view-body.d.ts +3 -3
  119. package/dist/src/record-view/record-view-body.js +4 -4
  120. package/dist/src/record-view/record-view-body.js.map +1 -1
  121. package/dist/src/record-view/record-view.d.ts +2 -2
  122. package/dist/src/record-view/record-view.js +5 -5
  123. package/dist/src/record-view/record-view.js.map +1 -1
  124. package/dist/src/renderers/ox-grist-renderer-progress.d.ts +1 -1
  125. package/dist/src/renderers/ox-grist-renderer-tree.d.ts +1 -1
  126. package/dist/src/renderers/ox-grist-renderer.d.ts +2 -2
  127. package/dist/src/sorters/sorters-control.js +3 -3
  128. package/dist/src/sorters/sorters-control.js.map +1 -1
  129. package/dist/src/types.d.ts +1 -8
  130. package/dist/src/types.js.map +1 -1
  131. package/dist/stories/accumulator.stories.d.ts +1 -1
  132. package/dist/stories/accumulator.stories.js +55 -127
  133. package/dist/stories/accumulator.stories.js.map +1 -1
  134. package/dist/stories/barcode-input-filter.stories.d.ts +1 -1
  135. package/dist/stories/barcode-input-filter.stories.js +41 -79
  136. package/dist/stories/barcode-input-filter.stories.js.map +1 -1
  137. package/dist/stories/default-filters.stories.d.ts +1 -1
  138. package/dist/stories/default-filters.stories.js +41 -79
  139. package/dist/stories/default-filters.stories.js.map +1 -1
  140. package/dist/stories/dynamic-editable.stories.d.ts +1 -1
  141. package/dist/stories/dynamic-editable.stories.js +61 -86
  142. package/dist/stories/dynamic-editable.stories.js.map +1 -1
  143. package/dist/stories/empty-sorters.stories.d.ts +1 -1
  144. package/dist/stories/empty-sorters.stories.js +41 -78
  145. package/dist/stories/empty-sorters.stories.js.map +1 -1
  146. package/dist/stories/explicit-fetch.stories.d.ts +1 -1
  147. package/dist/stories/explicit-fetch.stories.js +42 -79
  148. package/dist/stories/explicit-fetch.stories.js.map +1 -1
  149. package/dist/stories/fixed-column.stories.d.ts +1 -1
  150. package/dist/stories/fixed-column.stories.js +45 -127
  151. package/dist/stories/fixed-column.stories.js.map +1 -1
  152. package/dist/stories/grid-setting.stories.d.ts +36 -0
  153. package/dist/stories/grid-setting.stories.js +403 -0
  154. package/dist/stories/grid-setting.stories.js.map +1 -0
  155. package/dist/stories/grist-modes.stories.d.ts +1 -1
  156. package/dist/stories/grist-modes.stories.js +74 -140
  157. package/dist/stories/grist-modes.stories.js.map +1 -1
  158. package/dist/stories/group-header.stories.d.ts +1 -1
  159. package/dist/stories/group-header.stories.js +45 -127
  160. package/dist/stories/group-header.stories.js.map +1 -1
  161. package/dist/stories/textarea.stories.d.ts +1 -1
  162. package/dist/stories/textarea.stories.js +39 -121
  163. package/dist/stories/textarea.stories.js.map +1 -1
  164. package/dist/stories/tree-column-with-checkbox.stories.d.ts +1 -1
  165. package/dist/stories/tree-column-with-checkbox.stories.js +49 -136
  166. package/dist/stories/tree-column-with-checkbox.stories.js.map +1 -1
  167. package/dist/stories/tree-column.stories.d.ts +1 -1
  168. package/dist/stories/tree-column.stories.js +49 -136
  169. package/dist/stories/tree-column.stories.js.map +1 -1
  170. package/dist/tsconfig.tsbuildinfo +1 -1
  171. package/docs/default-value/default-value.md +1 -1
  172. package/docs/default-value/value-generator/date-generator.md +2 -2
  173. package/docs/default-value/value-generator/month-date-generator.md +2 -2
  174. package/docs/default-value/value-generator/week-date-generator.md +2 -2
  175. package/docs/default-value/value-generator/year-date-generator.md +2 -2
  176. package/package.json +21 -20
  177. package/src/configure/rows-option-builder.ts +11 -1
  178. package/src/configure/zero-config.ts +1 -0
  179. package/src/data-card/data-card-gutter-menu.ts +5 -5
  180. package/src/data-card/data-card.ts +3 -3
  181. package/src/data-card/event-handlers/record-card-click-handler.ts +1 -1
  182. package/src/data-card/record-card.ts +30 -32
  183. package/src/data-grid/data-grid-accum-field.ts +8 -3
  184. package/src/data-grid/data-grid-body.ts +10 -5
  185. package/src/data-grid/data-grid-field.ts +1 -1
  186. package/src/data-grid/data-grid-footer.ts +18 -11
  187. package/src/data-grid/data-grid-header.ts +68 -65
  188. package/src/data-grid/data-grid.ts +14 -4
  189. package/src/data-grist.ts +275 -27
  190. package/src/data-list/data-list-gutter.ts +12 -0
  191. package/src/data-list/data-list.ts +3 -3
  192. package/src/data-list/event-handlers/record-partial-click-handler.ts +1 -1
  193. package/src/data-list/record-partial.ts +22 -22
  194. package/src/data-manipulator.ts +52 -31
  195. package/src/editors/ox-grist-editor-checkbox.ts +12 -2
  196. package/src/editors/ox-grist-editor-datetime.ts +1 -2
  197. package/src/editors/ox-grist-editor-file.ts +12 -2
  198. package/src/editors/ox-grist-editor-image.ts +10 -7
  199. package/src/editors/ox-grist-editor-number.ts +11 -9
  200. package/src/editors/ox-grist-editor-text.ts +4 -0
  201. package/src/editors/ox-grist-editor-textarea.ts +4 -0
  202. package/src/editors/ox-grist-editor.ts +14 -10
  203. package/src/empty-note.ts +3 -3
  204. package/src/filters/filter-checkbox.ts +15 -5
  205. package/src/filters/filter-range-date.ts +16 -1
  206. package/src/filters/filter-styles.ts +47 -28
  207. package/src/filters/filters-form.ts +76 -50
  208. package/src/gutters/gutter-button.ts +3 -3
  209. package/src/gutters/gutter-dirty.ts +5 -5
  210. package/src/handlers/contextmenu-tree-mutation.ts +5 -23
  211. package/src/index.ts +0 -1
  212. package/src/record-view/record-creator.ts +1 -1
  213. package/src/record-view/record-view-body.ts +4 -4
  214. package/src/record-view/record-view.ts +5 -5
  215. package/src/sorters/sorters-control.ts +3 -3
  216. package/src/types.ts +1 -9
  217. package/stories/accumulator.stories.ts +54 -129
  218. package/stories/barcode-input-filter.stories.ts +53 -89
  219. package/stories/default-filters.stories.ts +53 -89
  220. package/stories/dynamic-editable.stories.ts +68 -92
  221. package/stories/empty-sorters.stories.ts +53 -89
  222. package/stories/explicit-fetch.stories.ts +54 -90
  223. package/stories/fixed-column.stories.ts +57 -137
  224. package/stories/grid-setting.stories.ts +441 -0
  225. package/stories/grist-modes.stories.ts +86 -155
  226. package/stories/group-header.stories.ts +57 -137
  227. package/stories/textarea.stories.ts +42 -127
  228. package/stories/tree-column-with-checkbox.stories.ts +53 -138
  229. package/stories/tree-column.stories.ts +53 -138
  230. package/themes/grist-theme.css +1 -1
  231. package/dist/src/value-generator/date-generator.d.ts +0 -6
  232. package/dist/src/value-generator/date-generator.js +0 -30
  233. package/dist/src/value-generator/date-generator.js.map +0 -1
  234. package/dist/src/value-generator/hour-time-generator.d.ts +0 -7
  235. package/dist/src/value-generator/hour-time-generator.js +0 -29
  236. package/dist/src/value-generator/hour-time-generator.js.map +0 -1
  237. package/dist/src/value-generator/index.d.ts +0 -1
  238. package/dist/src/value-generator/index.js +0 -2
  239. package/dist/src/value-generator/index.js.map +0 -1
  240. package/dist/src/value-generator/minute-time-generator.d.ts +0 -7
  241. package/dist/src/value-generator/minute-time-generator.js +0 -29
  242. package/dist/src/value-generator/minute-time-generator.js.map +0 -1
  243. package/dist/src/value-generator/month-date-generator.d.ts +0 -7
  244. package/dist/src/value-generator/month-date-generator.js +0 -31
  245. package/dist/src/value-generator/month-date-generator.js.map +0 -1
  246. package/dist/src/value-generator/now-generator.d.ts +0 -4
  247. package/dist/src/value-generator/now-generator.js +0 -8
  248. package/dist/src/value-generator/now-generator.js.map +0 -1
  249. package/dist/src/value-generator/registry.d.ts +0 -11
  250. package/dist/src/value-generator/registry.js +0 -50
  251. package/dist/src/value-generator/registry.js.map +0 -1
  252. package/dist/src/value-generator/time-generator.d.ts +0 -6
  253. package/dist/src/value-generator/time-generator.js +0 -28
  254. package/dist/src/value-generator/time-generator.js.map +0 -1
  255. package/dist/src/value-generator/today-generator.d.ts +0 -4
  256. package/dist/src/value-generator/today-generator.js +0 -8
  257. package/dist/src/value-generator/today-generator.js.map +0 -1
  258. package/dist/src/value-generator/week-date-generator.d.ts +0 -7
  259. package/dist/src/value-generator/week-date-generator.js +0 -29
  260. package/dist/src/value-generator/week-date-generator.js.map +0 -1
  261. package/dist/src/value-generator/year-date-generator.d.ts +0 -7
  262. package/dist/src/value-generator/year-date-generator.js +0 -29
  263. package/dist/src/value-generator/year-date-generator.js.map +0 -1
  264. package/src/value-generator/date-generator.ts +0 -35
  265. package/src/value-generator/hour-time-generator.ts +0 -43
  266. package/src/value-generator/index.ts +0 -1
  267. package/src/value-generator/minute-time-generator.ts +0 -43
  268. package/src/value-generator/month-date-generator.ts +0 -38
  269. package/src/value-generator/now-generator.ts +0 -10
  270. package/src/value-generator/registry.ts +0 -58
  271. package/src/value-generator/time-generator.ts +0 -33
  272. package/src/value-generator/today-generator.ts +0 -10
  273. package/src/value-generator/week-date-generator.ts +0 -40
  274. package/src/value-generator/year-date-generator.ts +0 -36
@@ -64,14 +64,16 @@ export class DataManipulator extends LitElement {
64
64
  })
65
65
 
66
66
  /* tree processing */
67
- this.addEventListener('collapse-all', (e: Event) => this.onCollapseAll(e as CustomEvent))
68
- this.addEventListener('expand-all', (e: Event) => this.onExpandAll(e as CustomEvent))
69
- this.addEventListener('collapse-node', (e: Event) => this.onCollapse(e as CustomEvent))
70
- this.addEventListener('expand-node', (e: Event) => this.onExpand(e as CustomEvent))
67
+ this.addEventListener('collapse-all', (e: Event) => this.collapseAll())
68
+ this.addEventListener('expand-all', (e: Event) => this.expandAll())
69
+ this.addEventListener('collapse-node', (e: Event) => this.collapseNode((e as CustomEvent).detail as GristRecord))
70
+ this.addEventListener('expand-node', (e: Event) => this.expandNode((e as CustomEvent).detail as GristRecord))
71
71
  this.addEventListener('check-in-tree', (e: Event) => this.onCheckInTree(e as CustomEvent))
72
72
 
73
- this.addEventListener('add-sibling-node', (e: Event) => this.onAddSiblingNode(e as CustomEvent))
74
- this.addEventListener('add-child-node', (e: Event) => this.onAddChildNode(e as CustomEvent))
73
+ this.addEventListener('add-sibling-node', (e: Event) =>
74
+ this.addSiblingNode((e as CustomEvent).detail as GristRecord)
75
+ )
76
+ this.addEventListener('add-child-node', (e: Event) => this.addChildNode((e as CustomEvent).detail as GristRecord))
75
77
  }
76
78
 
77
79
  onFieldChange({
@@ -212,36 +214,46 @@ export class DataManipulator extends LitElement {
212
214
  this.requestUpdate()
213
215
  }
214
216
 
215
- onCollapseAll(e: CustomEvent) {
217
+ collapseAll() {
216
218
  this.refresh(false)
217
219
  }
218
220
 
219
- onExpandAll(e: CustomEvent) {
221
+ expandAll() {
220
222
  this.refresh(true)
221
223
  }
222
224
 
223
- onCollapse(e: CustomEvent) {
224
- const record = e.detail as GristRecord
225
+ collapseNode(record: GristRecord) {
225
226
  record.__expanded__ = false
226
227
 
227
228
  this.refresh()
228
229
  }
229
230
 
230
- onExpand(e: CustomEvent) {
231
- const record = e.detail as GristRecord
231
+ expandNode(record: GristRecord) {
232
232
  record.__expanded__ = true
233
233
 
234
234
  this.refresh()
235
235
  }
236
236
 
237
- onAddSiblingNode(e: CustomEvent) {
237
+ // onCollapse(e: CustomEvent) {
238
+ // const record = e.detail as GristRecord
239
+ // record.__expanded__ = false
240
+
241
+ // this.refresh()
242
+ // }
243
+
244
+ // onExpand(e: CustomEvent) {
245
+ // const record = e.detail as GristRecord
246
+ // record.__expanded__ = true
247
+
248
+ // this.refresh()
249
+ // }
250
+
251
+ addSiblingNode(record: GristRecord) {
238
252
  const { records } = this.data
239
253
  const toplevelRecords = records.filter(
240
254
  record => !record.__depth__
241
255
  ) /* __depth__ 가 설정되지 않았거나, 0 인 경우만 수집 */
242
256
 
243
- const field = e.detail
244
- const { record } = field
245
257
  const { __depth__ } = record as GristRecord
246
258
 
247
259
  function findParent(record: GristRecord, parent?: GristRecord): GristRecord | undefined {
@@ -264,15 +276,27 @@ export class DataManipulator extends LitElement {
264
276
  const sibling = {
265
277
  __depth__,
266
278
  __dirty__: '+'
267
- }
279
+ } as GristRecord
268
280
 
269
281
  if (parent) {
270
- const { __children__ } = parent as GristRecord
282
+ const { id } = parent as GristRecord
271
283
 
272
- if (!__children__) {
284
+ sibling.parent = { id }
285
+
286
+ if (!parent.__children__) {
273
287
  parent.__children__ = [sibling]
274
288
  } else {
275
- parent.__children__ = [...__children__, sibling]
289
+ let index = parent.__children__.indexOf(record)
290
+
291
+ if (index !== -1) {
292
+ parent.__children__ = [
293
+ ...parent.__children__.slice(0, index + 1),
294
+ sibling,
295
+ ...parent.__children__.slice(index + 1)
296
+ ]
297
+ } else {
298
+ parent.__children__ = [...parent.__children__, sibling]
299
+ }
276
300
  }
277
301
 
278
302
  parent.__expanded__ = true
@@ -283,25 +307,25 @@ export class DataManipulator extends LitElement {
283
307
  this.refresh()
284
308
  }
285
309
 
286
- onAddChildNode(e: CustomEvent) {
287
- const field = e.detail
288
- const { record } = field
289
-
290
- const { __children__, __depth__, __seq__ } = record as GristRecord
310
+ addChildNode(record: GristRecord) {
311
+ const { id: parentId, __children__, __depth__ } = record as GristRecord
291
312
  const child = {
313
+ parent: {
314
+ id: parentId
315
+ },
292
316
  __depth__: (__depth__ || 0) + 1,
293
317
  __dirty__: '+'
294
318
  }
295
319
 
296
- if (!__children__) {
320
+ if (!record.__children__) {
297
321
  record.__children__ = [child]
298
322
  } else {
299
- record.__children__.push(child)
323
+ record.__children__.unshift(child)
300
324
  }
301
325
 
302
326
  record.__expanded__ = true
303
327
 
304
- field.requestUpdate()
328
+ // this.requestUpdate()
305
329
 
306
330
  this.refresh()
307
331
  }
@@ -388,10 +412,7 @@ export class DataManipulator extends LitElement {
388
412
 
389
413
  private traverseRefresh(record: GristRecord, forceExpandOrCollapse?: boolean): GristRecord[] {
390
414
  if (forceExpandOrCollapse !== undefined) {
391
- record = {
392
- ...record,
393
- __expanded__: forceExpandOrCollapse
394
- }
415
+ record.__expanded__ = forceExpandOrCollapse
395
416
  }
396
417
 
397
418
  const { __expanded__, __children__ = [] } = record
@@ -4,8 +4,18 @@ import { html } from 'lit'
4
4
 
5
5
  @customElement('ox-grist-editor-checkbox')
6
6
  export class OxGristEditorCheckbox extends OxGristEditor {
7
- formatFromEditor(e: Event) {
8
- return (e.target as HTMLInputElement).checked
7
+ _onchange(e: Event) {
8
+ e.stopPropagation()
9
+
10
+ const input = e.target as HTMLInputElement
11
+
12
+ this._dirtyValue = this.formatFromEditor(input.checked)
13
+ }
14
+
15
+ formatFromEditor(value: any) {
16
+ if (typeof value == 'boolean') {
17
+ return value
18
+ }
9
19
  }
10
20
 
11
21
  formatForEditor(value: any): any {
@@ -15,8 +15,7 @@ export class OxGristEditorDateTime extends OxGristEditor {
15
15
  return new Date(timestamp - tzoffset).toISOString().slice(0, -1)
16
16
  }
17
17
 
18
- formatFromEditor(e: Event) {
19
- var value = (e.target as HTMLInputElement).value
18
+ formatFromEditor(value: any) {
20
19
  var datetime = new Date(value)
21
20
 
22
21
  return datetime.getTime()
@@ -5,8 +5,18 @@ import { OxGristEditor } from './ox-grist-editor.js'
5
5
 
6
6
  @customElement('ox-grist-editor-file')
7
7
  export class OxGristEditorFile extends OxGristEditor {
8
- formatFromEditor(e: Event): any {
9
- return (e.target as HTMLInputElement).files
8
+ _onchange(e: Event) {
9
+ e.stopPropagation()
10
+
11
+ const input = e.target as HTMLInputElement
12
+
13
+ this._dirtyValue = this.formatFromEditor(input.files)
14
+
15
+ this._onfocusout()
16
+ }
17
+
18
+ formatFromEditor(value: any): any {
19
+ return value
10
20
  }
11
21
 
12
22
  get editorTemplate() {
@@ -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() {
@@ -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}
@@ -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],