@operato/data-grist 2.0.0-alpha.13 → 2.0.0-alpha.132

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 (310) hide show
  1. package/CHANGELOG.md +573 -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 +9 -2
  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 +6 -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 +74 -31
  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 -16
  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 +46 -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 +30 -9
  142. package/dist/src/types.js.map +1 -1
  143. package/dist/stories/{accumulator.stories.d.ts → accumulator-format.stories.d.ts} +1 -1
  144. package/dist/stories/{accumulator.stories.js → accumulator-format.stories.js} +50 -125
  145. package/dist/stories/accumulator-format.stories.js.map +1 -0
  146. package/dist/stories/barcode-input-filter.stories.d.ts +1 -1
  147. package/dist/stories/barcode-input-filter.stories.js +41 -79
  148. package/dist/stories/barcode-input-filter.stories.js.map +1 -1
  149. package/dist/stories/bounded-select-filters.stories.d.ts +25 -0
  150. package/dist/stories/bounded-select-filters.stories.js +264 -0
  151. package/dist/stories/bounded-select-filters.stories.js.map +1 -0
  152. package/dist/stories/bounded-select-record.stories.d.ts +25 -0
  153. package/dist/stories/bounded-select-record.stories.js +267 -0
  154. package/dist/stories/bounded-select-record.stories.js.map +1 -0
  155. package/dist/stories/creatable-only-column.stories.d.ts +25 -0
  156. package/dist/stories/creatable-only-column.stories.js +211 -0
  157. package/dist/stories/creatable-only-column.stories.js.map +1 -0
  158. package/dist/stories/default-filters.stories.d.ts +1 -1
  159. package/dist/stories/default-filters.stories.js +84 -79
  160. package/dist/stories/default-filters.stories.js.map +1 -1
  161. package/dist/stories/dynamic-editable.stories.d.ts +1 -1
  162. package/dist/stories/dynamic-editable.stories.js +51 -86
  163. package/dist/stories/dynamic-editable.stories.js.map +1 -1
  164. package/dist/stories/empty-sorters.stories.d.ts +1 -1
  165. package/dist/stories/empty-sorters.stories.js +41 -78
  166. package/dist/stories/empty-sorters.stories.js.map +1 -1
  167. package/dist/stories/explicit-fetch.stories.d.ts +1 -1
  168. package/dist/stories/explicit-fetch.stories.js +42 -79
  169. package/dist/stories/explicit-fetch.stories.js.map +1 -1
  170. package/dist/stories/fixed-column.stories.d.ts +1 -1
  171. package/dist/stories/fixed-column.stories.js +45 -127
  172. package/dist/stories/fixed-column.stories.js.map +1 -1
  173. package/dist/stories/grid-setting.stories.d.ts +42 -0
  174. package/dist/stories/grid-setting.stories.js +415 -0
  175. package/dist/stories/grid-setting.stories.js.map +1 -0
  176. package/dist/stories/grist-modes.stories.d.ts +1 -1
  177. package/dist/stories/grist-modes.stories.js +74 -140
  178. package/dist/stories/grist-modes.stories.js.map +1 -1
  179. package/dist/stories/group-header.stories.d.ts +1 -1
  180. package/dist/stories/group-header.stories.js +45 -127
  181. package/dist/stories/group-header.stories.js.map +1 -1
  182. package/dist/stories/textarea.stories.d.ts +1 -1
  183. package/dist/stories/textarea.stories.js +39 -121
  184. package/dist/stories/textarea.stories.js.map +1 -1
  185. package/dist/stories/tree-column-with-checkbox.stories.d.ts +1 -1
  186. package/dist/stories/tree-column-with-checkbox.stories.js +49 -136
  187. package/dist/stories/tree-column-with-checkbox.stories.js.map +1 -1
  188. package/dist/stories/tree-column.stories.d.ts +1 -1
  189. package/dist/stories/tree-column.stories.js +49 -136
  190. package/dist/stories/tree-column.stories.js.map +1 -1
  191. package/dist/tsconfig.tsbuildinfo +1 -1
  192. package/docs/default-value/default-value.md +1 -1
  193. package/docs/default-value/value-generator/date-generator.md +31 -2
  194. package/docs/default-value/value-generator/hour-time-generator.md +33 -0
  195. package/docs/default-value/value-generator/minute-time-generator.md +33 -0
  196. package/docs/default-value/value-generator/month-date-generator.md +4 -2
  197. package/docs/default-value/value-generator/now-generator.md +29 -0
  198. package/docs/default-value/value-generator/time-generator.md +31 -0
  199. package/docs/default-value/value-generator/today-generator.md +29 -0
  200. package/docs/default-value/value-generator/week-date-generator.md +33 -2
  201. package/docs/default-value/value-generator/year-date-generator.md +33 -2
  202. package/package.json +26 -21
  203. package/src/configure/column-builder.ts +1 -0
  204. package/src/configure/rows-option-builder.ts +11 -1
  205. package/src/configure/zero-config.ts +1 -0
  206. package/src/data-card/data-card-gutter-menu.ts +5 -5
  207. package/src/data-card/data-card.ts +3 -3
  208. package/src/data-card/event-handlers/record-card-click-handler.ts +1 -1
  209. package/src/data-card/record-card.ts +30 -32
  210. package/src/data-grid/data-grid-accum-field.ts +8 -2
  211. package/src/data-grid/data-grid-body-style.ts +1 -0
  212. package/src/data-grid/data-grid-body.ts +7 -5
  213. package/src/data-grid/data-grid-field.ts +4 -2
  214. package/src/data-grid/data-grid-footer.ts +18 -11
  215. package/src/data-grid/data-grid-header.ts +68 -65
  216. package/src/data-grid/data-grid.ts +14 -4
  217. package/src/data-grist.ts +89 -30
  218. package/src/data-list/data-list-gutter.ts +12 -0
  219. package/src/data-list/data-list.ts +3 -3
  220. package/src/data-list/event-handlers/record-partial-click-handler.ts +1 -1
  221. package/src/data-list/record-partial.ts +22 -22
  222. package/src/editors/ox-grist-editor-checkbox.ts +12 -2
  223. package/src/editors/ox-grist-editor-datetime.ts +1 -2
  224. package/src/editors/ox-grist-editor-file.ts +12 -2
  225. package/src/editors/ox-grist-editor-image.ts +10 -7
  226. package/src/editors/ox-grist-editor-number.ts +10 -9
  227. package/src/editors/ox-grist-editor-select.ts +41 -28
  228. package/src/editors/ox-grist-editor-text.ts +4 -0
  229. package/src/editors/ox-grist-editor-textarea.ts +4 -0
  230. package/src/editors/ox-grist-editor.ts +14 -14
  231. package/src/empty-note.ts +3 -3
  232. package/src/filters/filter-checkbox.ts +15 -5
  233. package/src/filters/filter-range-date.ts +16 -1
  234. package/src/filters/filter-select.ts +41 -28
  235. package/src/filters/filter-styles.ts +46 -28
  236. package/src/filters/filters-form.ts +159 -59
  237. package/src/gutters/gutter-button.ts +3 -3
  238. package/src/gutters/gutter-dirty.ts +5 -5
  239. package/src/handlers/contextmenu-tree-mutation.ts +4 -4
  240. package/src/index.ts +1 -1
  241. package/src/personalizer/index.ts +1 -0
  242. package/src/personalizer/ox-grist-personalizer.ts +181 -0
  243. package/src/record-view/record-creator.ts +1 -1
  244. package/src/record-view/record-view-body.ts +4 -4
  245. package/src/record-view/record-view.ts +5 -5
  246. package/src/renderers/ox-grist-renderer-select.ts +41 -6
  247. package/src/sorters/sorters-control.ts +3 -3
  248. package/src/types.ts +36 -10
  249. package/stories/{accumulator.stories.ts → accumulator-format.stories.ts} +48 -126
  250. package/stories/barcode-input-filter.stories.ts +53 -89
  251. package/stories/bounded-select-filters.stories.ts +313 -0
  252. package/stories/bounded-select-record.stories.ts +316 -0
  253. package/stories/creatable-only-column.stories.ts +231 -0
  254. package/stories/default-filters.stories.ts +96 -89
  255. package/stories/dynamic-editable.stories.ts +58 -92
  256. package/stories/empty-sorters.stories.ts +53 -89
  257. package/stories/explicit-fetch.stories.ts +54 -90
  258. package/stories/fixed-column.stories.ts +57 -137
  259. package/stories/grid-setting.stories.ts +462 -0
  260. package/stories/grist-modes.stories.ts +86 -155
  261. package/stories/group-header.stories.ts +57 -137
  262. package/stories/textarea.stories.ts +42 -127
  263. package/stories/tree-column-with-checkbox.stories.ts +53 -138
  264. package/stories/tree-column.stories.ts +53 -138
  265. package/themes/grist-theme.css +2 -0
  266. package/dist/src/value-generator/date-generator.d.ts +0 -6
  267. package/dist/src/value-generator/date-generator.js +0 -30
  268. package/dist/src/value-generator/date-generator.js.map +0 -1
  269. package/dist/src/value-generator/hour-time-generator.d.ts +0 -7
  270. package/dist/src/value-generator/hour-time-generator.js +0 -29
  271. package/dist/src/value-generator/hour-time-generator.js.map +0 -1
  272. package/dist/src/value-generator/index.d.ts +0 -1
  273. package/dist/src/value-generator/index.js +0 -2
  274. package/dist/src/value-generator/index.js.map +0 -1
  275. package/dist/src/value-generator/minute-time-generator.d.ts +0 -7
  276. package/dist/src/value-generator/minute-time-generator.js +0 -29
  277. package/dist/src/value-generator/minute-time-generator.js.map +0 -1
  278. package/dist/src/value-generator/month-date-generator.d.ts +0 -7
  279. package/dist/src/value-generator/month-date-generator.js +0 -31
  280. package/dist/src/value-generator/month-date-generator.js.map +0 -1
  281. package/dist/src/value-generator/now-generator.d.ts +0 -4
  282. package/dist/src/value-generator/now-generator.js +0 -8
  283. package/dist/src/value-generator/now-generator.js.map +0 -1
  284. package/dist/src/value-generator/registry.d.ts +0 -11
  285. package/dist/src/value-generator/registry.js +0 -50
  286. package/dist/src/value-generator/registry.js.map +0 -1
  287. package/dist/src/value-generator/time-generator.d.ts +0 -6
  288. package/dist/src/value-generator/time-generator.js +0 -28
  289. package/dist/src/value-generator/time-generator.js.map +0 -1
  290. package/dist/src/value-generator/today-generator.d.ts +0 -4
  291. package/dist/src/value-generator/today-generator.js +0 -8
  292. package/dist/src/value-generator/today-generator.js.map +0 -1
  293. package/dist/src/value-generator/week-date-generator.d.ts +0 -7
  294. package/dist/src/value-generator/week-date-generator.js +0 -29
  295. package/dist/src/value-generator/week-date-generator.js.map +0 -1
  296. package/dist/src/value-generator/year-date-generator.d.ts +0 -7
  297. package/dist/src/value-generator/year-date-generator.js +0 -29
  298. package/dist/src/value-generator/year-date-generator.js.map +0 -1
  299. package/dist/stories/accumulator.stories.js.map +0 -1
  300. package/src/value-generator/date-generator.ts +0 -35
  301. package/src/value-generator/hour-time-generator.ts +0 -43
  302. package/src/value-generator/index.ts +0 -1
  303. package/src/value-generator/minute-time-generator.ts +0 -43
  304. package/src/value-generator/month-date-generator.ts +0 -38
  305. package/src/value-generator/now-generator.ts +0 -10
  306. package/src/value-generator/registry.ts +0 -58
  307. package/src/value-generator/time-generator.ts +0 -33
  308. package/src/value-generator/today-generator.ts +0 -10
  309. package/src/value-generator/week-date-generator.ts +0 -40
  310. 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 './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
  }
@@ -5,17 +5,18 @@ import { parseToNumberOrNull } from '@operato/utils'
5
5
 
6
6
  @customElement('ox-grist-editor-number')
7
7
  export class OxGristEditorNumber extends OxGristEditor {
8
- formatFromEditor(e: Event) {
9
- 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
10
14
 
11
- switch (this.column.type) {
12
- case 'float':
13
- return Number.parseFloat(value) || 0
14
- case 'integer':
15
- return Number.parseInt(value) || 0
16
- default:
17
- return Number(value)
15
+ if (parsed !== null && this.column.type == 'integer') {
16
+ return Math.floor(parsed)
18
17
  }
18
+
19
+ return parsed
19
20
  }
20
21
 
21
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,8 +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'
8
- import { parseToNumberOrNull } from '@operato/utils'
7
+ import { getDefaultValue } from '@operato/time-calculator'
9
8
 
10
9
  const STYLE = css`
11
10
  :host {
@@ -92,8 +91,8 @@ export class OxGristEditor extends LitElement {
92
91
  return this.renderRoot.firstElementChild as HTMLElement
93
92
  }
94
93
 
95
- get directEditable() {
96
- return true
94
+ get inlineEditable() {
95
+ return false
97
96
  }
98
97
 
99
98
  async firstUpdated() {
@@ -122,22 +121,21 @@ export class OxGristEditor extends LitElement {
122
121
  currentValue = getDefaultValue(defaultValue, this.record)
123
122
  }
124
123
 
124
+ this.value = this._dirtyValue = this.formatForEditor(currentValue)
125
+
125
126
  // 입력을 위한 키를 누르면서 편집모드가 될때는 누른 키가 처음에 입력되도록, enter 같은 것을 눌러서 편집모드가 되면 현재 값으로 편집모드 전환
126
- const editorValue = this.field?.valueWithEdit ? this.field.valueWithEdit : this.formatForEditor(currentValue)
127
- const fieldType = this.field?.type || 'string'
128
- this.value = this._dirtyValue = ['number', 'float', 'integer', 'progress'].includes(fieldType)
129
- ? parseToNumberOrNull(editorValue)
130
- : editorValue
127
+ const valueWith = this.inlineEditable && this.field?.valueWith
128
+ this.value = this._dirtyValue = valueWith ? this.formatFromEditor(valueWith) : this.formatForEditor(currentValue)
131
129
 
132
130
  requestAnimationFrame(() => {
133
131
  this.focus()
134
- this.select()
132
+ !valueWith && this.select()
135
133
  })
136
134
  }
137
135
 
138
136
  select() {
139
137
  const editor = this.editor
140
- if ((editor as HTMLInputElement)?.select && !this.field?.valueWithEdit) {
138
+ if ((editor as HTMLInputElement)?.select) {
141
139
  return (editor as HTMLInputElement).select()
142
140
  }
143
141
  }
@@ -153,8 +151,8 @@ export class OxGristEditor extends LitElement {
153
151
  return value == null ? '' : value
154
152
  }
155
153
 
156
- formatFromEditor(e: Event): any {
157
- return (e.target as HTMLInputElement).value
154
+ formatFromEditor(value: any): any {
155
+ return value
158
156
  }
159
157
 
160
158
  _onfocusout() {
@@ -184,7 +182,9 @@ export class OxGristEditor extends LitElement {
184
182
  _onchange(e: Event): void {
185
183
  e.stopPropagation()
186
184
 
187
- this._dirtyValue = this.formatFromEditor(e)
185
+ const value = (e.target as any)?.value
186
+
187
+ this._dirtyValue = this.formatFromEditor(value)
188
188
  }
189
189
 
190
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,76 @@ 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
+
34
41
  ox-select,
35
42
  input {
36
- padding: var(--input-padding);
37
43
  border: none;
38
- border-bottom: var(--ox-input-border);
39
- font: var(--ox-input-font);
40
- color: var(--ox-input-color);
44
+ border-bottom: var(--ox-filters-input-border);
45
+ font: var(--ox-filters-input-font);
46
+ color: var(--ox-filters-input-color);
47
+ background-color: var(--ox-filters-input-background-color, transparent);
48
+ }
49
+
50
+ label > span + * {
51
+ min-width: 120px;
41
52
  }
42
53
 
43
54
  ox-select:focus,
44
55
  input:focus {
45
56
  outline: none;
46
- border-bottom: var(--ox-input-focus-border);
47
- color: var(--primary-color);
57
+ border-bottom: var(--ox-filters-input-focus-border);
58
+ color: var(--ox-filters-input-focus-color);
48
59
  }
60
+
49
61
  ox-select {
50
- padding: var(--ox-select-padding);
62
+ min-width: 100px;
63
+ max-width: 170px;
64
+ }
65
+
66
+ ox-input-barcode {
67
+ min-width: 150px;
68
+ }
69
+
70
+ ox-input-search {
71
+ max-width: 150px;
51
72
  }
52
73
 
53
74
  input[type='number'] {
54
- padding-right: var(--padding-narrow);
55
75
  max-width: 90px;
56
76
  }
57
77
 
@@ -59,15 +79,13 @@ export const FilterStyles = css`
59
79
  input[type*='time'],
60
80
  input[type='week'],
61
81
  input[type='month'] {
62
- padding: 8px var(--padding-narrow) 8px var(--padding-default);
63
82
  max-width: 170px;
64
83
  }
65
84
 
66
85
  @media only screen and (max-width: 460px) {
67
86
  :host {
68
87
  --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);
88
+ --ox-filters-input-font: normal 16px var(--theme-font);
71
89
  }
72
90
 
73
91
  input[from],