@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
@@ -0,0 +1,181 @@
1
+ import '@material/web/button/outlined-button.js'
2
+
3
+ import { css, html, LitElement } from 'lit'
4
+ import { customElement, property, state } from 'lit/decorators.js'
5
+
6
+ import { i18next } from '@operato/i18n'
7
+ import { OxPopupList } from '@operato/popup'
8
+
9
+ import { ColumnConfig, PersonalGristPreference } from '../types'
10
+ import { DataGrist } from '../data-grist'
11
+ import { OxCheckbox } from '@operato/input'
12
+
13
+ @customElement('ox-grist-personalizer')
14
+ export class OxGristPersonalizer extends LitElement {
15
+ static styles = [
16
+ css`
17
+ md-icon {
18
+ --md-icon-size: 14px;
19
+ width: 16px;
20
+ height: 16px;
21
+ background-color: rgba(var(--secondary-color-rgb), 0.6);
22
+ color: var(--primary-color);
23
+ border-radius: 0px 0px 7px 7px;
24
+ cursor: pointer;
25
+
26
+ &:hover {
27
+ color: var(--theme-white-color);
28
+ }
29
+ }
30
+ `
31
+ ]
32
+
33
+ @property({ type: String }) page!: string
34
+ @property({ type: String }) element!: string
35
+ @property({ type: Boolean, attribute: true }) debug: boolean = false
36
+
37
+ @state() private preference?: PersonalGristPreference
38
+
39
+ render() {
40
+ return html`
41
+ <md-icon
42
+ @click=${(e: MouseEvent) => {
43
+ const grist = this.closest('ox-grist') as DataGrist
44
+
45
+ const { config, compiledConfig } = grist
46
+ const { columns: compiledColumns } = compiledConfig
47
+
48
+ const columns = compiledColumns
49
+ .filter(ccolumn => {
50
+ const column = config.columns.find((column: Partial<ColumnConfig>) => column.name == ccolumn.name)
51
+ return column && column.name && column.type !== 'gutter' && !column.hidden
52
+ })
53
+ .map(column => compiledColumns.find(compiledColumn => compiledColumn.name == column.name)!)
54
+
55
+ this.preference = {
56
+ columns: columns.map(column => {
57
+ return {
58
+ name: column.name,
59
+ hidden: column.hidden,
60
+ width: column.width
61
+ }
62
+ })
63
+ }
64
+
65
+ const template = html`
66
+ <div class="personalizer-header" slot="header">
67
+ <md-icon
68
+ style="margin-left: auto;"
69
+ @click=${async (e: MouseEvent) => {
70
+ if (grist.personalConfigProvider) {
71
+ grist.personalConfig = this.preference = await grist.personalConfigProvider.save(this.preference)
72
+ }
73
+ popup.close()
74
+ }}
75
+ title=${String(i18next.t('button.save'))}
76
+ >keep</md-icon
77
+ ><md-icon
78
+ @click=${async (e: MouseEvent) => {
79
+ if (grist.personalConfigProvider) {
80
+ grist.personalConfig = this.preference = {}
81
+ await grist.personalConfigProvider.reset()
82
+ }
83
+ popup.close()
84
+ }}
85
+ title=${String(i18next.t('button.delete'))}
86
+ >keep_off</md-icon
87
+ ><md-icon @click=${async (e: MouseEvent) => popup.close()} title=${String(i18next.t('button.close'))}
88
+ >close</md-icon
89
+ >
90
+ </div>
91
+
92
+ ${columns.map(
93
+ column => html`
94
+ <ox-checkbox label="checkbox" ?checked=${!column.hidden} value=${column.name} option
95
+ >${column.header.renderer(column)}<span style="position: absolute; right: 10px; cursor: move;" handle
96
+ >☰</span
97
+ ></ox-checkbox
98
+ >
99
+ `
100
+ )}
101
+ `
102
+
103
+ const popup = OxPopupList.open({
104
+ template,
105
+ multiple: true,
106
+ sortable: true,
107
+ debug: this.debug,
108
+ attrSelected: 'checked',
109
+ top: e.pageY,
110
+ left: e.pageX,
111
+ styles: css`
112
+ :host {
113
+ width: 240px;
114
+ max-height: 300px;
115
+ overflow: auto;
116
+ }
117
+
118
+ ::slotted(.personalizer-header) {
119
+ --md-icon-size: 1.4em;
120
+
121
+ display: flex;
122
+ flex-direction: row;
123
+ align-items: center;
124
+ text-transform: capitalize;
125
+ box-shadow: 0 3px 3px rgba(0, 0, 0, 0.3);
126
+ }
127
+
128
+ ::slotted([option]) {
129
+ position: relative;
130
+ user-select: none;
131
+ }
132
+ `
133
+ })
134
+
135
+ popup.onselect = (e: Event) => {
136
+ const selected = (e as CustomEvent).detail
137
+
138
+ const pconfig: PersonalGristPreference = grist.personalConfig || {}
139
+ const pcolumns = this.preference?.columns || columns
140
+
141
+ pconfig.columns = pcolumns.map(column => {
142
+ return {
143
+ name: column.name,
144
+ hidden: selected.indexOf(column.name) == -1,
145
+ width: column.width
146
+ }
147
+ })
148
+
149
+ this.preference = pconfig
150
+
151
+ grist.personalConfig = this.preference
152
+
153
+ grist.applyUpdatedConfiguration()
154
+ }
155
+
156
+ popup.addEventListener('sorted', (e: Event) => {
157
+ const sorted = (e as CustomEvent).detail as HTMLElement[]
158
+
159
+ const pconfig: PersonalGristPreference = grist.personalConfig || {}
160
+
161
+ pconfig.columns = sorted.map(element => {
162
+ const name = (element as OxCheckbox).value
163
+ return {
164
+ name,
165
+ hidden: !element.hasAttribute('checked'),
166
+ width: columns.find(column => column.name == name)?.width
167
+ }
168
+ })
169
+
170
+ this.preference = pconfig
171
+
172
+ grist.personalConfig = this.preference
173
+
174
+ grist.applyUpdatedConfiguration()
175
+ })
176
+ }}
177
+ >settings</md-icon
178
+ >
179
+ `
180
+ }
181
+ }
@@ -1,4 +1,4 @@
1
- import '@material/mwc-icon'
1
+ import '@material/web/icon/icon.js'
2
2
  import './record-view'
3
3
 
4
4
  import { html, LitElement } from 'lit'
@@ -1,4 +1,4 @@
1
- import '@material/mwc-icon'
1
+ import '@material/web/icon/icon.js'
2
2
  import '../data-grid/data-grid-field'
3
3
 
4
4
  import { css, html, LitElement } from 'lit'
@@ -34,7 +34,7 @@ export class RecordViewBody extends LitElement {
34
34
  color: var(--record-view-label-color);
35
35
  }
36
36
 
37
- label mwc-icon {
37
+ label md-icon {
38
38
  display: none;
39
39
  }
40
40
 
@@ -43,7 +43,7 @@ export class RecordViewBody extends LitElement {
43
43
  font-weight: bold;
44
44
  }
45
45
 
46
- label[editable] mwc-icon {
46
+ label[editable] md-icon {
47
47
  display: inline-block;
48
48
  font-size: var(--record-view-label-icon-size);
49
49
  opacity: 0.5;
@@ -99,7 +99,7 @@ export class RecordViewBody extends LitElement {
99
99
 
100
100
  return html`
101
101
  <label ?editable=${editable}
102
- ><span>${mandatory ? '*' : ''}${this._renderLabel(column)}</span> <mwc-icon>edit</mwc-icon></label
102
+ ><span>${mandatory ? '*' : ''}${this._renderLabel(column)}</span> <md-icon>edit</md-icon></label
103
103
  >
104
104
  <ox-grid-field
105
105
  .rowIndex=${rowIndex}
@@ -1,4 +1,4 @@
1
- import '@material/mwc-icon'
1
+ import '@material/web/icon/icon.js'
2
2
  import './record-view-body'
3
3
  import '@operato/input/ox-input-file.js'
4
4
  import '../data-grid/data-grid-field'
@@ -53,7 +53,7 @@ export class RecordView extends LitElement {
53
53
  vertical-align: middle;
54
54
  }
55
55
 
56
- [footer] button mwc-icon {
56
+ [footer] button md-icon {
57
57
  margin-top: -3px;
58
58
  margin-right: 5px;
59
59
  font-size: var(--record-view-footer-iconbutton-size);
@@ -74,9 +74,9 @@ export class RecordView extends LitElement {
74
74
  <ox-record-view-body .columns=${this.columns} .record=${this.record} .rowIndex=${this.rowIndex}>
75
75
  </ox-record-view-body>
76
76
  <div footer>
77
- <button @click=${this.onReset.bind(this)}><mwc-icon>refresh</mwc-icon><span>Reset</span></button>
78
- <button @click=${this.onCancel.bind(this)}><mwc-icon>clear</mwc-icon><span>Cancel</span></button>
79
- <button @click=${this.onOK.bind(this)} ok><mwc-icon>radio_button_unchecked</mwc-icon><span>OK</span></button>
77
+ <button @click=${this.onReset.bind(this)}><md-icon>refresh</md-icon><span>Reset</span></button>
78
+ <button @click=${this.onCancel.bind(this)}><md-icon>clear</md-icon><span>Cancel</span></button>
79
+ <button @click=${this.onOK.bind(this)} ok><md-icon>radio_button_unchecked</md-icon><span>OK</span></button>
80
80
  </div>
81
81
  `
82
82
  }
@@ -1,11 +1,41 @@
1
1
  import { html } from 'lit'
2
+ import { until } from 'lit/directives/until.js'
2
3
 
3
- import { FieldRenderer } from '../types'
4
+ import { FieldRenderer, SelectOption, SelectOptionObject } from '../types'
5
+
6
+ function buildOptions(options: SelectOption[], value: any) {
7
+ const selectOptionObjects = options.map(option => {
8
+ switch (typeof option) {
9
+ case 'string':
10
+ return {
11
+ display: option,
12
+ value: option
13
+ }
14
+ case 'object':
15
+ return {
16
+ display: option.display || option.name,
17
+ value: option.value
18
+ }
19
+ default:
20
+ return option
21
+ }
22
+ }) as SelectOptionObject[]
23
+
24
+ var res = selectOptionObjects
25
+ ? selectOptionObjects.filter((option: any) => option.value == String(value == null ? '' : value))
26
+ : []
27
+
28
+ if (res.length) {
29
+ return html`<span>${res[0].display || res[0].name || ''}</span>`
30
+ }
31
+ return html`<span>${value}</span>`
32
+ }
4
33
 
5
34
  export const OxGristRendererSelect: FieldRenderer = (value, column, record, rowIndex, field) => {
6
35
  if (value == null) {
7
36
  return ''
8
37
  }
38
+
9
39
  var rowOptionField = column.record.rowOptionField && record[column.record.rowOptionField]
10
40
  var options = rowOptionField?.options ? rowOptionField.options : column.record.options
11
41
 
@@ -13,11 +43,16 @@ export const OxGristRendererSelect: FieldRenderer = (value, column, record, rowI
13
43
  console.error(`options value for select '${column.name}' column is mandatory.`)
14
44
  } else if (typeof options == 'function') {
15
45
  options = options.call(null, value, column, record, rowIndex, field)
16
- }
17
46
 
18
- var res = options ? options.filter((option: any) => option.value == String(value == null ? '' : value)) : []
19
- if (res.length) {
20
- return html`<span>${res[0].display}</span>`
47
+ if (options instanceof Promise) {
48
+ return html`${until(
49
+ options.then(options => buildOptions(options, value)),
50
+ value
51
+ )}`
52
+ } else {
53
+ return buildOptions((options || []) as SelectOption[], value)
54
+ }
55
+ } else {
56
+ return buildOptions((options || []) as SelectOption[], value)
21
57
  }
22
- return html`<span>${value}</span>`
23
58
  }
@@ -29,9 +29,9 @@ export class SortersControl extends LitElement {
29
29
  text-transform: capitalize;
30
30
  user-select: none;
31
31
  }
32
- [option] mwc-icon {
32
+ [option] md-icon {
33
33
  margin-left: var(--margin-default);
34
- --mdc-icon-size: var(--fontsize-large);
34
+ --md-icon-size: var(--fontsize-large);
35
35
  color: var(--primary-color);
36
36
  }
37
37
  [option] sub {
@@ -99,7 +99,7 @@ export class SortersControl extends LitElement {
99
99
  ${desc === null
100
100
  ? html``
101
101
  : html`
102
- <mwc-icon>${desc ? 'keyboard_arrow_down' : 'keyboard_arrow_up'}</mwc-icon>
102
+ <md-icon>${desc ? 'keyboard_arrow_down' : 'keyboard_arrow_up'}</md-icon>
103
103
  ${rank === 0 ? html`` : html`<sub>${rank}</sub>`}
104
104
  `}
105
105
  </div>
package/src/types.ts CHANGED
@@ -9,7 +9,7 @@ import { DataListGutter } from './data-list/data-list-gutter'
9
9
  import { RecordPartial } from './data-list/record-partial'
10
10
  import { DataReportField } from './data-report/data-report-field'
11
11
  import { OxGristEditor } from './editors'
12
- import { QueryFilter } from './filters'
12
+ import { QueryFilter, OxFiltersForm } from './filters'
13
13
  import { OxGristRenderer } from './renderers/ox-grist-renderer'
14
14
 
15
15
  /**
@@ -83,6 +83,22 @@ export type FilterOperator =
83
83
  | 'i_nlike'
84
84
  | 'nlike'
85
85
 
86
+ export type SelectOptionObject =
87
+ | {
88
+ name: string
89
+ display?: never
90
+ value: string
91
+ }
92
+ | {
93
+ display: string
94
+ name?: never
95
+ value: string
96
+ }
97
+
98
+ export type SelectOption = SelectOptionObject | string
99
+
100
+ export type FilterChangedCallback = (value: any, form: OxFiltersForm) => boolean
101
+
86
102
  /**
87
103
  * Configuration object for specifying filter conditions.
88
104
  *
@@ -99,6 +115,8 @@ export type FilterConfigObject = {
99
115
  options?: { [key: string]: any }
100
116
  value?: string | number | boolean | string[] | number[] | undefined
101
117
  label?: string
118
+ boundTo?: string[]
119
+ onchange?: FilterChangedCallback
102
120
  }
103
121
 
104
122
  /**
@@ -427,15 +445,6 @@ export type HeaderConfig = {
427
445
  */
428
446
  export type HeaderRenderer = (column: ColumnConfig) => any
429
447
 
430
- /**
431
- * Function type for generating values.
432
- *
433
- * @callback ValueGeneratorFn
434
- * @param {...any} args - The arguments used for generating a value.
435
- * @returns {*} - The generated value.
436
- */
437
- export type ValueGeneratorFn = (...args: any[]) => any
438
-
439
448
  /**
440
449
  * Configuration for specifying default values for fields in a record.
441
450
  * Default values can be set using predefined value generator functions or custom user-defined functions.
@@ -627,6 +636,7 @@ export type ImexConfig = {
627
636
  export type RowsConfig = {
628
637
  accumulator?: boolean
629
638
  appendable: boolean
639
+ editable: boolean
630
640
  insertable: boolean
631
641
  selectable?: RowSelectableConfig
632
642
  groups: GroupConfig[]
@@ -751,3 +761,17 @@ export type GristData = {
751
761
  * @returns {boolean} - `true` if the record should be selected, `false` otherwise.
752
762
  */
753
763
  export type GristSelectFunction = (record: GristRecord) => boolean
764
+
765
+ /**
766
+ * Defines a type for personalized grid settings. It includes individual column settings and additional configurations specific to a user's grid view.
767
+ *
768
+ * @typedef {Object} PersonalGristPreference
769
+ * @property {Partial<ColumnConfig>[]} [columns] - Partially defines the configuration for each column in the grid.
770
+ * Each element can include only some properties of the `ColumnConfig`, used for optionally overriding column settings.
771
+ * @property {any} [key] - Allows for storing additional user-defined properties with dynamic keys.
772
+ * This property can include various custom settings beyond the grid configuration, and the keys can be freely defined.
773
+ */
774
+ export type PersonalGristPreference = {
775
+ columns?: Partial<ColumnConfig>[]
776
+ [key: string]: any
777
+ }
@@ -3,7 +3,7 @@ import '../src/filters/filters-form.js'
3
3
  import '../src/sorters/sorters-control.js'
4
4
  import '../src/record-view/record-creator.js'
5
5
  import '@operato/popup/ox-popup-list.js'
6
- import '@material/mwc-icon'
6
+ import '@material/web/icon/icon.js'
7
7
 
8
8
  import { html, TemplateResult } from 'lit'
9
9
 
@@ -16,6 +16,8 @@ import {
16
16
  ValidationCallback
17
17
  } from '../src/types.js'
18
18
 
19
+ import { CommonHeaderStyles, CommonGristStyles } from '@operato/styles'
20
+
19
21
  const fetchHandler: FetchHandler = async ({ page, limit }) => {
20
22
  var total = 25
21
23
  var start = (page! - 1) * limit!
@@ -103,9 +105,15 @@ const config = {
103
105
  header: 'accval',
104
106
  record: {
105
107
  editable: true,
106
- align: 'right'
108
+ align: 'right',
109
+ defaultValue: 100,
110
+ format: '+$#,##0.00'
107
111
  },
108
112
  accumulator: 'avg',
113
+ // accumulator: {
114
+ // type: 'avg',
115
+ // tag: true
116
+ // },
109
117
  sortable: true,
110
118
  width: 130
111
119
  },
@@ -116,7 +124,10 @@ const config = {
116
124
  header: 'accval2',
117
125
  record: {
118
126
  editable: true,
119
- align: 'right'
127
+ align: 'right',
128
+ renderer: (value: any, column: any, record: any) => {
129
+ return value && Intl.NumberFormat('en-US').format(value)
130
+ }
120
131
  },
121
132
  accumulator: {
122
133
  type: 'sum',
@@ -163,9 +174,6 @@ const config = {
163
174
  {
164
175
  name: 'name',
165
176
  desc: true
166
- },
167
- {
168
- name: 'email'
169
177
  }
170
178
  ],
171
179
  pagination: {
@@ -174,7 +182,7 @@ const config = {
174
182
  }
175
183
 
176
184
  export default {
177
- title: 'accumulator in ox-grist',
185
+ title: 'accumulator format in ox-grist',
178
186
  component: 'ox-grist',
179
187
  argTypes: {
180
188
  config: { control: 'object' },
@@ -196,137 +204,55 @@ interface ArgTypes {
196
204
  fetchHandler: object
197
205
  }
198
206
 
199
- const Template: Story<ArgTypes> = ({
200
- config,
201
- mode = 'GRID',
202
- urlParamsSensitive = false,
203
- fetchHandler
204
- }: ArgTypes) => html` <link
205
- href="https://fonts.googleapis.com/css?family=Material+Icons&display=block"
206
- rel="stylesheet"
207
- />
208
- <link href="/themes/app-theme.css" rel="stylesheet" />
209
- <link href="/themes/oops-theme.css" rel="stylesheet" />
210
- <link href="/themes/grist-theme.css" rel="stylesheet" />
211
-
212
- <style>
213
- ox-grist {
214
- height: 600px;
215
- }
216
-
217
- [slot='headroom'] {
218
- display: flex;
219
- flex-direction: row;
220
- align-items: center;
221
- padding: var(--padding-default) var(--padding-wide);
222
- background-color: var(--theme-white-color);
223
- box-shadow: var(--box-shadow);
224
-
225
- --mdc-icon-size: 24px;
226
- }
227
- #sorters mwc-icon,
228
- #modes mwc-icon {
229
- --mdc-icon-size: 18px;
230
- }
231
- #sorters {
232
- margin-left: auto;
233
- margin-right: var(--margin-default);
234
- padding-left: var(--padding-narrow);
235
- border-bottom: var(--border-dark-color);
236
- position: relative;
237
- color: var(--secondary-color);
238
- font-size: var(--fontsize-default);
239
- user-select: none;
240
- }
241
-
242
- #sorters > * {
243
- padding: var(--padding-narrow);
244
- vertical-align: middle;
245
- }
246
-
247
- #modes > * {
248
- padding: var(--padding-narrow);
249
- opacity: 0.5;
250
- color: var(--primary-text-color);
251
- cursor: pointer;
252
- }
253
-
254
- #modes > mwc-icon[active] {
255
- border-radius: 9px;
256
- background-color: rgba(var(--primary-color-rgb), 0.05);
257
- opacity: 1;
258
- color: var(--secondary-text-color);
259
- cursor: default;
260
- }
261
-
262
- #modes > mwc-icon:hover {
263
- opacity: 1;
264
- color: var(--secondary-text-color);
265
- }
266
-
267
- #add {
268
- width: 50px;
269
- text-align: right;
270
- }
271
-
272
- #add button {
273
- background-color: var(--primary-color);
274
- border: 0;
275
- border-radius: 50%;
276
- padding: 5px;
277
- width: 36px;
278
- height: 36px;
279
- cursor: pointer;
280
- }
281
-
282
- #add button:hover {
283
- background-color: var(--focus-background-color);
284
- box-shadow: var(--box-shadow);
285
- }
286
-
287
- #add button mwc-icon {
288
- font-size: 2em;
289
- color: var(--theme-white-color);
290
- }
207
+ const Template: Story<ArgTypes> = ({ config, mode = 'GRID', urlParamsSensitive = false, fetchHandler }: ArgTypes) =>
208
+ html` <link
209
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
210
+ rel="stylesheet"
211
+ />
212
+ <link
213
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL@20..48,100..700,0..1"
214
+ rel="stylesheet"
215
+ />
216
+ <link
217
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1"
218
+ rel="stylesheet"
219
+ />
291
220
 
292
- #filters {
293
- display: flex;
294
- justify-content: center;
295
- align-items: center;
296
- }
221
+ <link href="/themes/app-theme.css" rel="stylesheet" />
222
+ <link href="/themes/oops-theme.css" rel="stylesheet" />
223
+ <link href="/themes/grist-theme.css" rel="stylesheet" />
297
224
 
298
- #filters * {
299
- margin-right: var(--margin-default);
300
- }
225
+ <style>
226
+ ${CommonGristStyles.cssText}
227
+ ${CommonHeaderStyles.cssText}
228
+ </style>
301
229
 
302
- @media only screen and (max-width: 460px) {
303
- #filters {
304
- flex-direction: column;
230
+ <style>
231
+ ox-grist {
232
+ height: 600px;
305
233
  }
306
234
 
307
- #modes {
308
- display: none;
235
+ ox-filters-form {
236
+ flex: 1;
309
237
  }
310
- }
311
- </style>
238
+ </style>
312
239
 
313
- <ox-grist
314
- mode="GRID"
315
- .config=${config}
316
- .fetchHandler=${fetchHandler}
317
- ?url-params-sensitive=${urlParamsSensitive}
318
- @filters-change=${(e: Event) => console.log('filters', (e.target as any).filters)}
319
- >
320
- <div slot="headroom">
321
- <div id="filters">
322
- <ox-filters-form autofocus></ox-filters-form>
240
+ <ox-grist
241
+ mode="GRID"
242
+ .config=${config}
243
+ .fetchHandler=${fetchHandler}
244
+ ?url-params-sensitive=${urlParamsSensitive}
245
+ @filters-change=${(e: Event) => console.log('filters', (e.target as any).filters)}
246
+ >
247
+ <div slot="headroom" class="header">
248
+ <div class="filters">
249
+ <ox-filters-form autofocus></ox-filters-form>
250
+ <ox-record-creator id="add" light-popup>
251
+ <button><md-icon>add</md-icon></button>
252
+ </ox-record-creator>
253
+ </div>
323
254
  </div>
324
-
325
- <ox-record-creator id="add" light-popup>
326
- <button><mwc-icon>add</mwc-icon></button>
327
- </ox-record-creator>
328
- </div>
329
- </ox-grist>`
255
+ </ox-grist>`
330
256
 
331
257
  export const Regular = Template.bind({})
332
258
  Regular.args = {