@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
@@ -47,6 +47,10 @@ export class DataGridAccumField extends LitElement {
47
47
  flex: none;
48
48
  margin: 0 auto;
49
49
  }
50
+
51
+ md-icon {
52
+ font-size: 1.5em;
53
+ }
50
54
  `
51
55
  ]
52
56
 
@@ -58,11 +62,11 @@ export class DataGridAccumField extends LitElement {
58
62
  @property({ type: Boolean }) editing = false
59
63
  @property({ type: Object }) value = {}
60
64
  @property({ attribute: false }) emphasized: any = false
61
- @property({ type: String }) fixed?: string
65
+ @property({ type: String, attribute: true }) fixed?: string
62
66
 
63
67
  render(): TemplateResult {
64
68
  if (!this.column || !this.column.accumulator) {
65
- return this.columnIndex == 0 ? html`<mwc-icon>functions</mwc-icon>` : html`${nothing}`
69
+ return this.columnIndex == 0 ? html`<md-icon>functions</md-icon>` : html`${nothing}`
66
70
  }
67
71
 
68
72
  var { value, column, record, rowIndex } = this
@@ -70,11 +74,12 @@ export class DataGridAccumField extends LitElement {
70
74
 
71
75
  // tag가 true이면 value 앞에 (sum) 같은 태그 생성
72
76
  var { accumulator } = column
77
+ let tag = ''
73
78
  if (typeof accumulator === 'object' && typeof accumulator.type === 'string' && accumulator?.tag) {
74
- value = `(${i18next.t(`label.accumulator_${accumulator.type}`)}) ${value}`
79
+ tag = `(${i18next.t(`label.accumulator_${accumulator.type}`)})`
75
80
  }
76
81
 
77
- return html`${renderer?.call(this, value, column, record, rowIndex, this)}`
82
+ return html`${tag}&nbsp;${renderer?.call(this, value, column, record, rowIndex, this)}`
78
83
  }
79
84
 
80
85
  updated(changes: PropertyValues<this>) {
@@ -95,6 +100,8 @@ export class DataGridAccumField extends LitElement {
95
100
  if (changes.has('fixed')) {
96
101
  if (this.fixed) {
97
102
  this.style.left = this.fixed + 'px'
103
+ } else {
104
+ this.style.left = 'unset'
98
105
  }
99
106
  }
100
107
  }
@@ -10,6 +10,7 @@ export const dataGridBodyStyle = css`
10
10
  outline: none;
11
11
  color: var(--grid-record-color);
12
12
  position: relative;
13
+ border-bottom: var(--grid-body-bottom-border);
13
14
  }
14
15
 
15
16
  ox-grid-field[odd] {
@@ -100,7 +100,7 @@ export class DataGridBody extends LitElement {
100
100
  @property({ type: Array }) columns: ColumnConfig[] = []
101
101
  @property({ type: Object }) data: GristData = ZERO_DATA
102
102
  @property({ type: Object }) focused: { row: number; column: number } = ZERO_FOCUS
103
- @property({ type: Object }) editTarget: { row: number; column: number; valueWithEdit: string | null } | null = null
103
+ @property({ type: Object }) editTarget: { row: number; column: number; valueWith: string | null } | null = null
104
104
  @property({ type: Number }) from = -1
105
105
  @property({ type: Number }) to = -1
106
106
  @property({ type: Array }) fixedLefts: number[] = []
@@ -135,7 +135,7 @@ export class DataGridBody extends LitElement {
135
135
  render() {
136
136
  // block이 선택되어 있으면, focused row/column은 표현하지 않는다.
137
137
  var { row: focusedRow, column: focusedColumn } = (!this._selectBlock && this.focused) || {}
138
- var { row: editingRow, column: editingColumn, valueWithEdit = null } = this.editTarget || {}
138
+ var { row: editingRow, column: editingColumn, valueWith = null } = this.editTarget || {}
139
139
 
140
140
  var columns = this.columns.filter(column => !column.hidden)
141
141
  var data = this.data
@@ -182,7 +182,7 @@ export class DataGridBody extends LitElement {
182
182
  ?selected-row=${attrSelected}
183
183
  ?focused=${idxRow === focusedRow && idxColumn === focusedColumn}
184
184
  ?editing=${idxRow === editingRow && idxColumn === editingColumn}
185
- .valueWithEdit=${valueWithEdit}
185
+ .valueWith=${valueWith}
186
186
  .value=${record[column.name]}
187
187
  ?dirty=${!!dirtyFields[column.name]}
188
188
  fixed=${ifDefined(this.fixedLefts[idxColumn])}
@@ -400,7 +400,7 @@ export class DataGridBody extends LitElement {
400
400
  }
401
401
  }
402
402
 
403
- startEditTarget(row: number, column: number, valueWithEdit: string | null = null) {
403
+ startEditTarget(row: number, column: number, valueWith: string | null = null) {
404
404
  var { editable } = this.columns.filter(column => !column.hidden)[column].record
405
405
  if (typeof editable === 'function') {
406
406
  const curRow = this.data.records[row] || {}
@@ -419,7 +419,7 @@ export class DataGridBody extends LitElement {
419
419
  this.editTarget = {
420
420
  row,
421
421
  column,
422
- valueWithEdit
422
+ valueWith
423
423
  }
424
424
  }
425
425
 
@@ -647,14 +647,19 @@ export class DataGridBody extends LitElement {
647
647
 
648
648
  switch (type) {
649
649
  case 'object':
650
+ case 'parameters':
650
651
  try {
651
652
  value = JSON.parse(value || 'null')
652
653
  } catch (err) {}
653
654
  break
654
655
  case 'boolean':
656
+ case 'checkbox':
655
657
  value = !!value && !!String(value).match(/true/i)
656
658
  break
657
659
  case 'number':
660
+ case 'float':
661
+ case 'integer':
662
+ case 'progress':
658
663
  value = parseToNumberOrNull(value)
659
664
  break
660
665
  default:
@@ -87,9 +87,9 @@ export class DataGridField extends LitElement {
87
87
  @property({ type: Number }) columnIndex = 0
88
88
  @property({ type: Boolean }) editing = false
89
89
  @property({ type: Object }) value = {}
90
- @property({ type: String }) valueWithEdit: string | null = null
90
+ @property({ type: String }) valueWith: string | null = null
91
91
  @property({ attribute: false }) emphasized: any = false
92
- @property({ type: String }) fixed?: string
92
+ @property({ type: String, attribute: true }) fixed?: string
93
93
  @property({ type: String }) type?: string
94
94
  @property({ type: Boolean }) isWorking: boolean = false
95
95
 
@@ -155,6 +155,8 @@ export class DataGridField extends LitElement {
155
155
  if (changes.has('fixed')) {
156
156
  if (this.fixed) {
157
157
  this.style.left = this.fixed + 'px'
158
+ } else {
159
+ this.style.left = 'unset'
158
160
  }
159
161
  }
160
162
 
@@ -1,4 +1,4 @@
1
- import '@material/mwc-icon'
1
+ import '@material/web/icon/icon.js'
2
2
 
3
3
  import { css, html, LitElement } from 'lit'
4
4
  import { customElement, property } from 'lit/decorators.js'
@@ -14,17 +14,18 @@ export class DataGridFooter extends LitElement {
14
14
  :host {
15
15
  display: flex;
16
16
  flex-direction: row;
17
+ gap: 4px;
17
18
  overflow: hidden;
18
19
 
19
20
  padding: var(--grid-footer-padding);
20
21
  background-color: var(--grid-footer-background-color);
21
22
  font-size: var(--grid-footer-font-size);
23
+ align-items: center;
22
24
  }
23
25
 
24
26
  :host * {
25
27
  white-space: nowrap;
26
28
  overflow: hidden;
27
- padding: 0 2px;
28
29
 
29
30
  text-overflow: ellipsis;
30
31
  text-align: center;
@@ -35,11 +36,18 @@ export class DataGridFooter extends LitElement {
35
36
  flex: 1;
36
37
  }
37
38
 
38
- mwc-icon {
39
+ md-icon {
39
40
  font-size: 1.5em;
40
41
  vertical-align: middle;
41
42
  }
42
43
 
44
+ .limit {
45
+ display: flex;
46
+ flex-direction: row;
47
+ gap: 6px;
48
+ align-items: center;
49
+ }
50
+
43
51
  .limit a {
44
52
  color: var(--grid-footer-limit-color);
45
53
  }
@@ -82,20 +90,19 @@ export class DataGridFooter extends LitElement {
82
90
  var totalPage = Math.max(1, Math.ceil(total / limit))
83
91
 
84
92
  return html`
85
- <a ?inactive=${page <= 1} @click=${() => this._gotoPage(1)}><mwc-icon>skip_previous</mwc-icon></a>
86
- <a ?inactive=${page <= 1} @click=${() => this._gotoPage(page - 1)}><mwc-icon>navigate_before</mwc-icon></a>
93
+ <a ?inactive=${page <= 1} @click=${() => this._gotoPage(1)}><md-icon>skip_previous</md-icon></a>
94
+ <a ?inactive=${page <= 1} @click=${() => this._gotoPage(page - 1)}><md-icon>navigate_before</md-icon></a>
87
95
  <span>page <strong>${page}</strong>&nbsp;/&nbsp;${totalPage}</span>
88
- <a ?inactive=${page >= totalPage} @click=${() => this._gotoPage(page + 1)}><mwc-icon>navigate_next</mwc-icon></a>
89
- <a ?inactive=${page >= totalPage} @click=${() => this._gotoPage(totalPage)}><mwc-icon>skip_next</mwc-icon></a>
96
+ <a ?inactive=${page >= totalPage} @click=${() => this._gotoPage(page + 1)}><md-icon>navigate_next</md-icon></a>
97
+ <a ?inactive=${page >= totalPage} @click=${() => this._gotoPage(totalPage)}><md-icon>skip_next</md-icon></a>
90
98
 
91
99
  <span class="filler"></span>
92
100
 
93
101
  <span class="limit">
94
102
  ${pages.map(
95
- size =>
96
- html`
97
- <a ?selected=${limit == size} @click=${() => this._changeLimit(size)}>${stringifyBigNumber(size)}</a>
98
- `
103
+ size => html`
104
+ <a ?selected=${limit == size} @click=${() => this._changeLimit(size)}>${stringifyBigNumber(size)}</a>
105
+ `
99
106
  )}
100
107
  records
101
108
  </span>
@@ -1,5 +1,5 @@
1
1
  import '@operato/popup/ox-popup.js'
2
- import '@material/mwc-icon'
2
+ import '@material/web/icon/icon.js'
3
3
 
4
4
  import { css, html, LitElement, PropertyValues, nothing, TemplateResult } from 'lit'
5
5
  import { customElement, property, state } from 'lit/decorators.js'
@@ -22,6 +22,7 @@ export class DataGridHeader extends LitElement {
22
22
  TooltipStyles,
23
23
  css`
24
24
  :host {
25
+ position: relative;
25
26
  display: grid;
26
27
  grid-template-columns: var(--grid-template-columns);
27
28
 
@@ -62,7 +63,7 @@ export class DataGridHeader extends LitElement {
62
63
  align-self: center;
63
64
  }
64
65
 
65
- span[for-title] mwc-icon {
66
+ span[for-title] md-icon {
66
67
  font-size: var(--grid-record-fontsize);
67
68
  }
68
69
 
@@ -75,11 +76,11 @@ export class DataGridHeader extends LitElement {
75
76
  border: 0;
76
77
  }
77
78
 
78
- span[sorter] mwc-icon {
79
+ span[sorter] md-icon {
79
80
  font-size: var(--grid-header-sorter-size);
80
81
  }
81
82
 
82
- span[filter] > mwc-icon {
83
+ span[filter] > md-icon {
83
84
  font-size: var(--fontsize-default);
84
85
  line-height: 20px;
85
86
  }
@@ -104,7 +105,7 @@ export class DataGridHeader extends LitElement {
104
105
  vertical-align: middle;
105
106
  }
106
107
 
107
- [filter-title] mwc-icon {
108
+ [filter-title] md-icon {
108
109
  opacity: 0.7;
109
110
  color: var(--grid-header-filter-title-icon-color);
110
111
  }
@@ -363,12 +364,10 @@ export class DataGridHeader extends LitElement {
363
364
  if (sorters.length > 1) {
364
365
  var rank = sorters.indexOf(sorter) + 1
365
366
  return sorter.desc
366
- ? html` <mwc-icon>keyboard_arrow_down</mwc-icon><sub>${rank}</sub> `
367
- : html` <mwc-icon>keyboard_arrow_up</mwc-icon><sub>${rank}</sub> `
367
+ ? html` <md-icon>keyboard_arrow_down</md-icon><sub>${rank}</sub> `
368
+ : html` <md-icon>keyboard_arrow_up</md-icon><sub>${rank}</sub> `
368
369
  } else {
369
- return sorter.desc
370
- ? html` <mwc-icon>keyboard_arrow_down</mwc-icon> `
371
- : html` <mwc-icon>keyboard_arrow_up</mwc-icon> `
370
+ return sorter.desc ? html` <md-icon>keyboard_arrow_down</md-icon> ` : html` <md-icon>keyboard_arrow_up</md-icon> `
372
371
  }
373
372
  }
374
373
 
@@ -381,7 +380,7 @@ export class DataGridHeader extends LitElement {
381
380
  const renderer = getFilterRenderer(type)[idx]
382
381
 
383
382
  return html`
384
- <mwc-icon
383
+ <md-icon
385
384
  @click=${(e: Event) => {
386
385
  const parent = (e.target as HTMLElement).closest('[column]') as HTMLElement
387
386
  const popup = parent.querySelector('ox-popup, ox-popup-list') as OxPopup | null
@@ -398,63 +397,63 @@ export class DataGridHeader extends LitElement {
398
397
  top
399
398
  })
400
399
  }}
401
- >filter_alt</mwc-icon
400
+ >filter_alt</md-icon
402
401
  >
403
402
 
404
403
  ${!renderer
405
404
  ? html``
406
405
  : type !== 'select'
407
- ? html` <ox-popup
408
- ><div filter-title><mwc-icon>filter_alt</mwc-icon> filter by <strong>${column.name}</strong></div>
409
- ${renderer(column, value, this)}</ox-popup
410
- >`
411
- : filter!.operator === 'in'
412
- ? html`<ox-popup-list
413
- multiple
414
- attr-selected="checked"
415
- .value=${value}
416
- with-search
417
- @select=${(e: CustomEvent) =>
418
- e.target?.dispatchEvent(
419
- new CustomEvent('filter-change', {
420
- bubbles: true,
421
- composed: true,
422
- detail: {
423
- name,
424
- operator: filter!.operator,
425
- value: !e.detail
426
- ? undefined
427
- : e.detail instanceof Array && e.detail.length === 0
428
- ? undefined
429
- : e.detail
430
- }
431
- })
432
- )}
433
- ><div filter-title slot="header">
434
- <mwc-icon>filter_alt</mwc-icon> filter by <strong>${column.name}</strong>
435
- </div>
436
- ${renderer(column, value, this)}</ox-popup-list
437
- >`
438
- : html`<ox-popup-list
439
- .value=${value}
440
- with-search
441
- @select=${(e: CustomEvent) =>
442
- e.target?.dispatchEvent(
443
- new CustomEvent('filter-change', {
444
- bubbles: true,
445
- composed: true,
446
- detail: {
447
- name,
448
- operator: filter!.operator,
449
- value: e.detail ? e.detail : undefined
450
- }
451
- })
452
- )}
453
- ><div filter-title slot="header">
454
- <mwc-icon>filter_alt</mwc-icon> filter by <strong>${column.name}</strong>
455
- </div>
456
- ${renderer(column, value, this)}</ox-popup-list
457
- >`}
406
+ ? html` <ox-popup
407
+ ><div filter-title><md-icon>filter_alt</md-icon> filter by <strong>${column.name}</strong></div>
408
+ ${renderer(column, value, this)}</ox-popup
409
+ >`
410
+ : filter!.operator === 'in'
411
+ ? html`<ox-popup-list
412
+ multiple
413
+ attr-selected="checked"
414
+ .value=${value}
415
+ with-search
416
+ @select=${(e: CustomEvent) =>
417
+ e.target?.dispatchEvent(
418
+ new CustomEvent('filter-change', {
419
+ bubbles: true,
420
+ composed: true,
421
+ detail: {
422
+ name,
423
+ operator: filter!.operator,
424
+ value: !e.detail
425
+ ? undefined
426
+ : e.detail instanceof Array && e.detail.length === 0
427
+ ? undefined
428
+ : e.detail
429
+ }
430
+ })
431
+ )}
432
+ ><div filter-title slot="header">
433
+ <md-icon>filter_alt</md-icon> filter by <strong>${column.name}</strong>
434
+ </div>
435
+ ${renderer(column, value, this)}</ox-popup-list
436
+ >`
437
+ : html`<ox-popup-list
438
+ .value=${value}
439
+ with-search
440
+ @select=${(e: CustomEvent) =>
441
+ e.target?.dispatchEvent(
442
+ new CustomEvent('filter-change', {
443
+ bubbles: true,
444
+ composed: true,
445
+ detail: {
446
+ name,
447
+ operator: filter!.operator,
448
+ value: e.detail ? e.detail : undefined
449
+ }
450
+ })
451
+ )}
452
+ ><div filter-title slot="header">
453
+ <md-icon>filter_alt</md-icon> filter by <strong>${column.name}</strong>
454
+ </div>
455
+ ${renderer(column, value, this)}</ox-popup-list
456
+ >`}
458
457
  `
459
458
  }
460
459
 
@@ -471,11 +470,15 @@ export class DataGridHeader extends LitElement {
471
470
  if (sorter.desc) {
472
471
  sorters.splice(idx, 1)
473
472
  } else {
474
- sorter.desc = true
473
+ sorters.splice(idx, 1, {
474
+ ...sorter,
475
+ desc: true
476
+ })
475
477
  }
476
478
  } else {
477
479
  var sorter = {
478
- name: column.name
480
+ name: column.name,
481
+ desc: false
479
482
  }
480
483
 
481
484
  sorters.push(sorter)
@@ -43,6 +43,11 @@ export class DataGrid extends DataManipulator {
43
43
  transform: translate(-50%, -50%);
44
44
  }
45
45
 
46
+ div[setting] {
47
+ position: relative;
48
+ z-index: 1;
49
+ }
50
+
46
51
  @media print {
47
52
  :host {
48
53
  zoom: 80%;
@@ -159,7 +164,7 @@ export class DataGrid extends DataManipulator {
159
164
 
160
165
  if (this.focused && 'row' in this.focused) {
161
166
  var { row = 0, column = 0 } = this.focused
162
- var { records: oldrecords = [] } = changes.get('data')
167
+ var { records: oldrecords = [] } = changes.get('data') || {}
163
168
  var { records: newrecords } = this.data
164
169
 
165
170
  var oldrecord = oldrecords[row]
@@ -172,8 +177,8 @@ export class DataGrid extends DataManipulator {
172
177
  ('id' in oldrecord
173
178
  ? record.id == oldrecord.id
174
179
  : 'name' in oldrecord
175
- ? record.name == oldrecord.name
176
- : false)
180
+ ? record.name == oldrecord.name
181
+ : false)
177
182
  )
178
183
 
179
184
  this.focused = {
@@ -222,6 +227,10 @@ export class DataGrid extends DataManipulator {
222
227
  var data = this.data
223
228
 
224
229
  return html`
230
+ <div setting>
231
+ <slot name="setting"></slot>
232
+ </div>
233
+
225
234
  <ox-grid-header
226
235
  .columns=${columns}
227
236
  .sorters=${this.sorters}
@@ -234,7 +243,8 @@ export class DataGrid extends DataManipulator {
234
243
  this.calculateWidths(columns)
235
244
  }}
236
245
  @fixed-lefts-change=${(e: CustomEvent) => (this.fixedLefts = e.detail)}
237
- ></ox-grid-header>
246
+ >
247
+ </ox-grid-header>
238
248
 
239
249
  <ox-grid-body
240
250
  .config=${this.config}
package/src/data-grist.ts CHANGED
@@ -29,6 +29,7 @@ import {
29
29
  GristRecord,
30
30
  GristSelectFunction,
31
31
  PaginationConfig,
32
+ PersonalGristPreference,
32
33
  SortersConfig
33
34
  } from './types'
34
35
  import { convertListParamToSearchString, convertSearchStringToListParam } from './utils'
@@ -59,7 +60,7 @@ export class DataGrist extends LitElement implements DataConsumer {
59
60
 
60
61
  padding: var(--ox-grist-padding);
61
62
 
62
- --mdc-icon-size: var(--grid-record-wide-fontsize);
63
+ --md-icon-size: var(--grid-record-wide-fontsize);
63
64
  }
64
65
 
65
66
  #wrap {
@@ -85,7 +86,7 @@ export class DataGrist extends LitElement implements DataConsumer {
85
86
  box-sizing: border-box;
86
87
  background-color: var(--grist-background-color);
87
88
 
88
- z-index: 1;
89
+ z-index: 2;
89
90
  }
90
91
  `
91
92
  ]
@@ -170,8 +171,21 @@ export class DataGrist extends LitElement implements DataConsumer {
170
171
  */
171
172
  @property({ type: Boolean, attribute: 'url-params-sensitive' }) urlParamsSensitive?: boolean
172
173
 
173
- @state() _data: GristData = ZERO_DATA
174
- @state() _config: GristConfig = ZERO_CONFIG
174
+ @property({ type: Object }) personalConfigProvider?: {
175
+ load(): PersonalGristPreference | Promise<PersonalGristPreference | undefined> | undefined
176
+ save(
177
+ preference?: PersonalGristPreference
178
+ ): PersonalGristPreference | Promise<PersonalGristPreference | undefined> | undefined
179
+ reset(): void | Promise<void>
180
+ }
181
+
182
+ @state() personalConfig?: {
183
+ columns?: Partial<ColumnConfig>[]
184
+ [key: string]: any
185
+ }
186
+
187
+ @state() _data: GristData = ZERO_DATA // copy data, dirty data
188
+ @state() _config: GristConfig = ZERO_CONFIG // compiled configuration
175
189
  @state() private _showSpinner: boolean = false
176
190
 
177
191
  @query('slot[name=headroom]') head!: HTMLElement
@@ -300,9 +314,47 @@ export class DataGrist extends LitElement implements DataConsumer {
300
314
  }
301
315
  }
302
316
 
303
- private setConfig() {
317
+ public applyUpdatedConfiguration() {
318
+ const config = { ...this.config }
319
+ const columns: Partial<ColumnConfig>[] = config.columns
320
+
321
+ if (this.personalConfig) {
322
+ const { columns: personalColumns } = this.personalConfig
323
+
324
+ if (personalColumns) {
325
+ const xcolumns = columns.map((column: Partial<ColumnConfig>) => {
326
+ const personalColumn = personalColumns.find(pcolumn => pcolumn.name == column.name)
327
+ return personalColumn ? { ...column, ...personalColumn } : column
328
+ })
329
+
330
+ function reorderList(a: { name: string }[], b: { name: string }[]): { name: string }[] {
331
+ // 결과 배열 초기화, a 배열 길이만큼 undefined로 채움
332
+ const result = new Array(a.length)
333
+
334
+ // b 배열에 없는 아이템은 원래 위치로 채움
335
+ a.forEach((item, index) => {
336
+ if (!item.name || !b.find(bi => bi.name == item.name)) {
337
+ result[index] = item
338
+ }
339
+ })
340
+
341
+ b.forEach(item => {
342
+ const ai = a.find(ai => ai.name == item.name)
343
+ if (ai) {
344
+ result[result.findIndex(slot => slot === undefined)] = ai
345
+ }
346
+ })
347
+
348
+ return result
349
+ }
350
+
351
+ // 배열 재정렬 실행
352
+ config.columns = reorderList(xcolumns as any, personalColumns as any)
353
+ }
354
+ }
355
+
304
356
  this._config = buildConfig({
305
- ...this.config
357
+ ...config
306
358
  })
307
359
 
308
360
  this.dispatchEvent(
@@ -401,31 +453,32 @@ export class DataGrist extends LitElement implements DataConsumer {
401
453
  .pagination=${this.pagination || {}}
402
454
  ?empty=${empty}
403
455
  >
456
+ <slot name="setting" slot="setting"> </slot>
404
457
  </ox-grid>
405
458
  `
406
459
  : this.mode == 'CARD'
407
- ? html`
408
- <ox-card
409
- id="grist"
410
- .config=${this.compiledConfig}
411
- .data=${this._data}
412
- .sorters=${this.sorters || []}
413
- .filters=${this.filters || []}
414
- ?empty=${empty}
415
- >
416
- </ox-card>
417
- `
418
- : html`
419
- <ox-list
420
- id="grist"
421
- .config=${this.compiledConfig}
422
- .data=${this._data}
423
- .sorters=${this.sorters || []}
424
- .filters=${this.filters || []}
425
- ?empty=${empty}
426
- >
427
- </ox-list>
428
- `}
460
+ ? html`
461
+ <ox-card
462
+ id="grist"
463
+ .config=${this.compiledConfig}
464
+ .data=${this._data}
465
+ .sorters=${this.sorters || []}
466
+ .filters=${this.filters || []}
467
+ ?empty=${empty}
468
+ >
469
+ </ox-card>
470
+ `
471
+ : html`
472
+ <ox-list
473
+ id="grist"
474
+ .config=${this.compiledConfig}
475
+ .data=${this._data}
476
+ .sorters=${this.sorters || []}
477
+ .filters=${this.filters || []}
478
+ ?empty=${empty}
479
+ >
480
+ </ox-list>
481
+ `}
429
482
  </div>
430
483
 
431
484
  <div id="spinner" ?show=${this._showSpinner}></div>
@@ -532,8 +585,10 @@ export class DataGrist extends LitElement implements DataConsumer {
532
585
  await this.requestUpdate()
533
586
  }
534
587
 
535
- if (changes.has('config')) {
536
- this.setConfig()
588
+ if (changes.has('personalConfigProvider') && this.personalConfigProvider) {
589
+ this.personalConfig = await this.personalConfigProvider.load()
590
+ } else if (changes.has('config') || changes.has('personalConfig')) {
591
+ this.applyUpdatedConfiguration()
537
592
  }
538
593
 
539
594
  if (changes.has('fetchHandler')) {
@@ -22,6 +22,18 @@ export class DataListGutter extends LitElement {
22
22
  font-size: var(--grid-record-wide-fontsize);
23
23
  text-overflow: ellipsis;
24
24
  color: var(--grid-record-color);
25
+
26
+ padding-right: 10px;
27
+ }
28
+
29
+ :host-context(.expand)::after {
30
+ content: '';
31
+ position: absolute;
32
+ left: 50%;
33
+ top: 50%;
34
+ transform: translate(-50%, -50%);
35
+ width: 150%;
36
+ height: 220%;
25
37
  }
26
38
 
27
39
  * {