@operato/data-grist 2.0.0-alpha.12 → 2.0.0-alpha.120

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 (312) hide show
  1. package/CHANGELOG.md +526 -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 +12 -4
  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 +6 -3
  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 +12 -3
  41. package/dist/src/data-grist.js +68 -28
  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 -4
  115. package/dist/src/handlers/contextmenu-tree-mutation.js.map +1 -1
  116. package/dist/src/index.d.ts +1 -1
  117. package/dist/src/index.js +1 -1
  118. package/dist/src/index.js.map +1 -1
  119. package/dist/src/personalizer/index.d.ts +1 -0
  120. package/dist/src/personalizer/index.js +2 -0
  121. package/dist/src/personalizer/index.js.map +1 -0
  122. package/dist/src/personalizer/ox-grist-personalizer.d.ts +10 -0
  123. package/dist/src/personalizer/ox-grist-personalizer.js +171 -0
  124. package/dist/src/personalizer/ox-grist-personalizer.js.map +1 -0
  125. package/dist/src/record-view/record-creator.d.ts +2 -2
  126. package/dist/src/record-view/record-creator.js +1 -1
  127. package/dist/src/record-view/record-creator.js.map +1 -1
  128. package/dist/src/record-view/record-view-body.d.ts +3 -3
  129. package/dist/src/record-view/record-view-body.js +4 -4
  130. package/dist/src/record-view/record-view-body.js.map +1 -1
  131. package/dist/src/record-view/record-view.d.ts +2 -2
  132. package/dist/src/record-view/record-view.js +5 -5
  133. package/dist/src/record-view/record-view.js.map +1 -1
  134. package/dist/src/renderers/ox-grist-renderer-progress.d.ts +1 -1
  135. package/dist/src/renderers/ox-grist-renderer-select.js +34 -4
  136. package/dist/src/renderers/ox-grist-renderer-select.js.map +1 -1
  137. package/dist/src/renderers/ox-grist-renderer-tree.d.ts +1 -1
  138. package/dist/src/renderers/ox-grist-renderer.d.ts +2 -2
  139. package/dist/src/sorters/sorters-control.js +3 -3
  140. package/dist/src/sorters/sorters-control.js.map +1 -1
  141. package/dist/src/types.d.ts +28 -9
  142. package/dist/src/types.js.map +1 -1
  143. package/dist/stories/accumulator-format.stories.d.ts +36 -0
  144. package/dist/stories/accumulator-format.stories.js +231 -0
  145. package/dist/stories/accumulator-format.stories.js.map +1 -0
  146. package/dist/stories/accumulator.stories.d.ts +6 -1
  147. package/dist/stories/accumulator.stories.js +70 -129
  148. package/dist/stories/accumulator.stories.js.map +1 -1
  149. package/dist/stories/barcode-input-filter.stories.d.ts +1 -1
  150. package/dist/stories/barcode-input-filter.stories.js +41 -79
  151. package/dist/stories/barcode-input-filter.stories.js.map +1 -1
  152. package/dist/stories/bounded-select-filters.stories.d.ts +25 -0
  153. package/dist/stories/bounded-select-filters.stories.js +264 -0
  154. package/dist/stories/bounded-select-filters.stories.js.map +1 -0
  155. package/dist/stories/bounded-select-record.stories.d.ts +25 -0
  156. package/dist/stories/bounded-select-record.stories.js +267 -0
  157. package/dist/stories/bounded-select-record.stories.js.map +1 -0
  158. package/dist/stories/creatable-only-column.stories.d.ts +25 -0
  159. package/dist/stories/creatable-only-column.stories.js +211 -0
  160. package/dist/stories/creatable-only-column.stories.js.map +1 -0
  161. package/dist/stories/default-filters.stories.d.ts +1 -1
  162. package/dist/stories/default-filters.stories.js +84 -79
  163. package/dist/stories/default-filters.stories.js.map +1 -1
  164. package/dist/stories/dynamic-editable.stories.d.ts +1 -1
  165. package/dist/stories/dynamic-editable.stories.js +61 -86
  166. package/dist/stories/dynamic-editable.stories.js.map +1 -1
  167. package/dist/stories/empty-sorters.stories.d.ts +1 -1
  168. package/dist/stories/empty-sorters.stories.js +41 -78
  169. package/dist/stories/empty-sorters.stories.js.map +1 -1
  170. package/dist/stories/explicit-fetch.stories.d.ts +1 -1
  171. package/dist/stories/explicit-fetch.stories.js +42 -79
  172. package/dist/stories/explicit-fetch.stories.js.map +1 -1
  173. package/dist/stories/fixed-column.stories.d.ts +1 -1
  174. package/dist/stories/fixed-column.stories.js +45 -127
  175. package/dist/stories/fixed-column.stories.js.map +1 -1
  176. package/dist/stories/grid-setting.stories.d.ts +42 -0
  177. package/dist/stories/grid-setting.stories.js +415 -0
  178. package/dist/stories/grid-setting.stories.js.map +1 -0
  179. package/dist/stories/grist-modes.stories.d.ts +1 -1
  180. package/dist/stories/grist-modes.stories.js +74 -140
  181. package/dist/stories/grist-modes.stories.js.map +1 -1
  182. package/dist/stories/group-header.stories.d.ts +1 -1
  183. package/dist/stories/group-header.stories.js +45 -127
  184. package/dist/stories/group-header.stories.js.map +1 -1
  185. package/dist/stories/textarea.stories.d.ts +1 -1
  186. package/dist/stories/textarea.stories.js +39 -121
  187. package/dist/stories/textarea.stories.js.map +1 -1
  188. package/dist/stories/tree-column-with-checkbox.stories.d.ts +1 -1
  189. package/dist/stories/tree-column-with-checkbox.stories.js +49 -136
  190. package/dist/stories/tree-column-with-checkbox.stories.js.map +1 -1
  191. package/dist/stories/tree-column.stories.d.ts +1 -1
  192. package/dist/stories/tree-column.stories.js +49 -136
  193. package/dist/stories/tree-column.stories.js.map +1 -1
  194. package/dist/tsconfig.tsbuildinfo +1 -1
  195. package/docs/default-value/default-value.md +1 -1
  196. package/docs/default-value/value-generator/date-generator.md +31 -2
  197. package/docs/default-value/value-generator/hour-time-generator.md +33 -0
  198. package/docs/default-value/value-generator/minute-time-generator.md +33 -0
  199. package/docs/default-value/value-generator/month-date-generator.md +4 -2
  200. package/docs/default-value/value-generator/now-generator.md +29 -0
  201. package/docs/default-value/value-generator/time-generator.md +31 -0
  202. package/docs/default-value/value-generator/today-generator.md +29 -0
  203. package/docs/default-value/value-generator/week-date-generator.md +33 -2
  204. package/docs/default-value/value-generator/year-date-generator.md +33 -2
  205. package/package.json +26 -21
  206. package/src/configure/column-builder.ts +1 -0
  207. package/src/configure/rows-option-builder.ts +11 -1
  208. package/src/configure/zero-config.ts +1 -0
  209. package/src/data-card/data-card-gutter-menu.ts +5 -5
  210. package/src/data-card/data-card.ts +3 -3
  211. package/src/data-card/event-handlers/record-card-click-handler.ts +1 -1
  212. package/src/data-card/record-card.ts +30 -32
  213. package/src/data-grid/data-grid-accum-field.ts +11 -4
  214. package/src/data-grid/data-grid-body-style.ts +1 -0
  215. package/src/data-grid/data-grid-body.ts +10 -5
  216. package/src/data-grid/data-grid-field.ts +4 -2
  217. package/src/data-grid/data-grid-footer.ts +18 -11
  218. package/src/data-grid/data-grid-header.ts +68 -65
  219. package/src/data-grid/data-grid.ts +14 -4
  220. package/src/data-grist.ts +85 -30
  221. package/src/data-list/data-list-gutter.ts +12 -0
  222. package/src/data-list/data-list.ts +3 -3
  223. package/src/data-list/event-handlers/record-partial-click-handler.ts +1 -1
  224. package/src/data-list/record-partial.ts +22 -22
  225. package/src/editors/ox-grist-editor-checkbox.ts +12 -2
  226. package/src/editors/ox-grist-editor-datetime.ts +1 -2
  227. package/src/editors/ox-grist-editor-file.ts +12 -2
  228. package/src/editors/ox-grist-editor-image.ts +10 -7
  229. package/src/editors/ox-grist-editor-number.ts +11 -9
  230. package/src/editors/ox-grist-editor-select.ts +41 -28
  231. package/src/editors/ox-grist-editor-text.ts +4 -0
  232. package/src/editors/ox-grist-editor-textarea.ts +4 -0
  233. package/src/editors/ox-grist-editor.ts +14 -10
  234. package/src/empty-note.ts +3 -3
  235. package/src/filters/filter-checkbox.ts +15 -5
  236. package/src/filters/filter-range-date.ts +16 -1
  237. package/src/filters/filter-select.ts +41 -28
  238. package/src/filters/filter-styles.ts +47 -28
  239. package/src/filters/filters-form.ts +159 -59
  240. package/src/gutters/gutter-button.ts +3 -3
  241. package/src/gutters/gutter-dirty.ts +5 -5
  242. package/src/handlers/contextmenu-tree-mutation.ts +4 -4
  243. package/src/index.ts +1 -1
  244. package/src/personalizer/index.ts +1 -0
  245. package/src/personalizer/ox-grist-personalizer.ts +181 -0
  246. package/src/record-view/record-creator.ts +1 -1
  247. package/src/record-view/record-view-body.ts +4 -4
  248. package/src/record-view/record-view.ts +5 -5
  249. package/src/renderers/ox-grist-renderer-select.ts +41 -6
  250. package/src/sorters/sorters-control.ts +3 -3
  251. package/src/types.ts +34 -10
  252. package/stories/{accumulator.stories.ts → accumulator-format.stories.ts} +56 -130
  253. package/stories/barcode-input-filter.stories.ts +53 -89
  254. package/stories/bounded-select-filters.stories.ts +313 -0
  255. package/stories/bounded-select-record.stories.ts +316 -0
  256. package/stories/creatable-only-column.stories.ts +231 -0
  257. package/stories/default-filters.stories.ts +96 -89
  258. package/stories/dynamic-editable.stories.ts +68 -92
  259. package/stories/empty-sorters.stories.ts +53 -89
  260. package/stories/explicit-fetch.stories.ts +54 -90
  261. package/stories/fixed-column.stories.ts +57 -137
  262. package/stories/grid-setting.stories.ts +462 -0
  263. package/stories/grist-modes.stories.ts +86 -155
  264. package/stories/group-header.stories.ts +57 -137
  265. package/stories/textarea.stories.ts +42 -127
  266. package/stories/tree-column-with-checkbox.stories.ts +53 -138
  267. package/stories/tree-column.stories.ts +53 -138
  268. package/themes/grist-theme.css +3 -1
  269. package/dist/src/value-generator/date-generator.d.ts +0 -6
  270. package/dist/src/value-generator/date-generator.js +0 -30
  271. package/dist/src/value-generator/date-generator.js.map +0 -1
  272. package/dist/src/value-generator/hour-time-generator.d.ts +0 -7
  273. package/dist/src/value-generator/hour-time-generator.js +0 -29
  274. package/dist/src/value-generator/hour-time-generator.js.map +0 -1
  275. package/dist/src/value-generator/index.d.ts +0 -1
  276. package/dist/src/value-generator/index.js +0 -2
  277. package/dist/src/value-generator/index.js.map +0 -1
  278. package/dist/src/value-generator/minute-time-generator.d.ts +0 -7
  279. package/dist/src/value-generator/minute-time-generator.js +0 -29
  280. package/dist/src/value-generator/minute-time-generator.js.map +0 -1
  281. package/dist/src/value-generator/month-date-generator.d.ts +0 -7
  282. package/dist/src/value-generator/month-date-generator.js +0 -31
  283. package/dist/src/value-generator/month-date-generator.js.map +0 -1
  284. package/dist/src/value-generator/now-generator.d.ts +0 -4
  285. package/dist/src/value-generator/now-generator.js +0 -8
  286. package/dist/src/value-generator/now-generator.js.map +0 -1
  287. package/dist/src/value-generator/registry.d.ts +0 -11
  288. package/dist/src/value-generator/registry.js +0 -50
  289. package/dist/src/value-generator/registry.js.map +0 -1
  290. package/dist/src/value-generator/time-generator.d.ts +0 -6
  291. package/dist/src/value-generator/time-generator.js +0 -28
  292. package/dist/src/value-generator/time-generator.js.map +0 -1
  293. package/dist/src/value-generator/today-generator.d.ts +0 -4
  294. package/dist/src/value-generator/today-generator.js +0 -8
  295. package/dist/src/value-generator/today-generator.js.map +0 -1
  296. package/dist/src/value-generator/week-date-generator.d.ts +0 -7
  297. package/dist/src/value-generator/week-date-generator.js +0 -29
  298. package/dist/src/value-generator/week-date-generator.js.map +0 -1
  299. package/dist/src/value-generator/year-date-generator.d.ts +0 -7
  300. package/dist/src/value-generator/year-date-generator.js +0 -29
  301. package/dist/src/value-generator/year-date-generator.js.map +0 -1
  302. package/src/value-generator/date-generator.ts +0 -35
  303. package/src/value-generator/hour-time-generator.ts +0 -43
  304. package/src/value-generator/index.ts +0 -1
  305. package/src/value-generator/minute-time-generator.ts +0 -43
  306. package/src/value-generator/month-date-generator.ts +0 -38
  307. package/src/value-generator/now-generator.ts +0 -10
  308. package/src/value-generator/registry.ts +0 -58
  309. package/src/value-generator/time-generator.ts +0 -33
  310. package/src/value-generator/today-generator.ts +0 -10
  311. package/src/value-generator/week-date-generator.ts +0 -40
  312. package/src/value-generator/year-date-generator.ts +0 -36
@@ -1,4 +1,4 @@
1
- import '@material/mwc-icon'
1
+ import '@material/web/icon/icon.js'
2
2
  import './record-partial'
3
3
 
4
4
  import { css, html, PropertyValues } from 'lit'
@@ -25,7 +25,7 @@ export class DataList extends DataManipulator {
25
25
  }
26
26
 
27
27
  #upward {
28
- --mdc-icon-size: 26px;
28
+ --md-icon-size: 26px;
29
29
  position: absolute;
30
30
  top: var(--data-list-fab-position-vertical);
31
31
  right: var(--data-list-fab-position-horizontal);
@@ -118,7 +118,7 @@ export class DataList extends DataManipulator {
118
118
  ${this.empty ? html` <ox-empty-note title="NO RECORDS"></ox-empty-note> ` : html``}
119
119
  ${this.isTop
120
120
  ? html``
121
- : html` <mwc-icon id="upward" @click=${(e: Event) => this.gotoTop(e)}>arrow_upward</mwc-icon> `}
121
+ : html` <md-icon id="upward" @click=${(e: Event) => this.gotoTop(e)}>arrow_upward</md-icon> `}
122
122
  `
123
123
  }
124
124
 
@@ -29,6 +29,6 @@ export function recordPartialClickHandler(this: RecordPartial, e: MouseEvent): v
29
29
  rowsClick(this.config.columns, this.data, column, this.record, rowIndex, target)
30
30
  } else {
31
31
  /* content 가 클릭된 경우 - 레코드뷰 팝업을 실행한다. */
32
- this.popupRecordView()
32
+ this.config.rows.editable && this.popupRecordView()
33
33
  }
34
34
  }
@@ -1,4 +1,4 @@
1
- import '@material/mwc-icon'
1
+ import '@material/web/icon/icon.js'
2
2
  import './data-list-gutter'
3
3
  import './data-list-field'
4
4
  import '../record-view'
@@ -39,6 +39,7 @@ export class RecordPartial extends LitElement {
39
39
  border-bottom: var(--data-list-item-border-bottom);
40
40
  position: relative;
41
41
  min-height: 42px;
42
+ padding-left: 7px;
42
43
  }
43
44
 
44
45
  :host([dirty])::before {
@@ -168,32 +169,31 @@ export class RecordPartial extends LitElement {
168
169
  }
169
170
 
170
171
  return html`
171
- ${dirtyIcon ? html` <mwc-icon dirty>${dirtyIcon}</mwc-icon> ` : html``}
172
+ ${dirtyIcon ? html` <md-icon dirty>${dirtyIcon}</md-icon> ` : html``}
172
173
  ${gutters.map(
173
- gutter =>
174
- html`
175
- <ox-list-gutter
176
- .rowIndex=${rowIndex}
177
- .column=${gutter}
178
- .record=${record}
179
- .value=${record[gutter.name]}
180
- ></ox-list-gutter>
181
- `
174
+ gutter => html`
175
+ <ox-list-gutter
176
+ class=${gutter.name === 'detail' ? 'expand' : ''}
177
+ .rowIndex=${rowIndex}
178
+ .column=${gutter}
179
+ .record=${record}
180
+ .value=${record[gutter.name]}
181
+ ></ox-list-gutter>
182
+ `
182
183
  )}
183
184
 
184
185
  <div content>
185
186
  ${displayColumns.map(
186
- (column, idx) =>
187
- html`
188
- <ox-list-field
189
- .rowIndex=${rowIndex}
190
- .column=${column}
191
- .record=${record}
192
- .value=${record[column?.name || '']}
193
- ?name=${idx == 0}
194
- ?desc=${idx == 1}
195
- ></ox-list-field>
196
- `
187
+ (column, idx) => html`
188
+ <ox-list-field
189
+ .rowIndex=${rowIndex}
190
+ .column=${column}
191
+ .record=${record}
192
+ .value=${record[column?.name || '']}
193
+ ?name=${idx == 0}
194
+ ?desc=${idx == 1}
195
+ ></ox-list-field>
196
+ `
197
197
  )}
198
198
  </div>
199
199
  ${thumbnail
@@ -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() {
@@ -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
+ }