@operato/data-grist 2.0.0-alpha.99 → 2.0.0-beta.1

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 (216) hide show
  1. package/CHANGELOG.md +441 -0
  2. package/demo/data-grist-test.html +1 -1
  3. package/demo/index.html +1 -1
  4. package/dist/src/data-card/data-card-field.js +2 -2
  5. package/dist/src/data-card/data-card-field.js.map +1 -1
  6. package/dist/src/data-card/data-card-gutter-menu.js +5 -5
  7. package/dist/src/data-card/data-card-gutter-menu.js.map +1 -1
  8. package/dist/src/data-card/data-card-gutter.js +6 -6
  9. package/dist/src/data-card/data-card-gutter.js.map +1 -1
  10. package/dist/src/data-card/data-card.js +7 -9
  11. package/dist/src/data-card/data-card.js.map +1 -1
  12. package/dist/src/data-card/record-card.js +9 -10
  13. package/dist/src/data-card/record-card.js.map +1 -1
  14. package/dist/src/data-grid/data-grid-accum-field.js +12 -5
  15. package/dist/src/data-grid/data-grid-accum-field.js.map +1 -1
  16. package/dist/src/data-grid/data-grid-body-style.js +12 -0
  17. package/dist/src/data-grid/data-grid-body-style.js.map +1 -1
  18. package/dist/src/data-grid/data-grid-body.d.ts +0 -1
  19. package/dist/src/data-grid/data-grid-body.js +14 -21
  20. package/dist/src/data-grid/data-grid-body.js.map +1 -1
  21. package/dist/src/data-grid/data-grid-field.js +8 -2
  22. package/dist/src/data-grid/data-grid-field.js.map +1 -1
  23. package/dist/src/data-grid/data-grid-footer.js +4 -2
  24. package/dist/src/data-grid/data-grid-footer.js.map +1 -1
  25. package/dist/src/data-grid/data-grid-header.js +9 -6
  26. package/dist/src/data-grid/data-grid-header.js.map +1 -1
  27. package/dist/src/data-grid/data-grid.js +23 -1
  28. package/dist/src/data-grid/data-grid.js.map +1 -1
  29. package/dist/src/data-grid/event-handlers/data-grid-body-click-handler.js +3 -0
  30. package/dist/src/data-grid/event-handlers/data-grid-body-click-handler.js.map +1 -1
  31. package/dist/src/data-grist.d.ts +10 -2
  32. package/dist/src/data-grist.js +71 -8
  33. package/dist/src/data-grist.js.map +1 -1
  34. package/dist/src/data-list/data-list-field.js +5 -5
  35. package/dist/src/data-list/data-list-field.js.map +1 -1
  36. package/dist/src/data-list/data-list-gutter.js +3 -3
  37. package/dist/src/data-list/data-list-gutter.js.map +1 -1
  38. package/dist/src/data-list/data-list.js +4 -4
  39. package/dist/src/data-list/data-list.js.map +1 -1
  40. package/dist/src/data-list/record-partial.js +9 -10
  41. package/dist/src/data-list/record-partial.js.map +1 -1
  42. package/dist/src/data-manipulator.d.ts +1 -1
  43. package/dist/src/data-manipulator.js +5 -5
  44. package/dist/src/data-manipulator.js.map +1 -1
  45. package/dist/src/data-report/data-report-field.js +2 -1
  46. package/dist/src/data-report/data-report-field.js.map +1 -1
  47. package/dist/src/data-report/data-report-header.js +2 -2
  48. package/dist/src/data-report/data-report-header.js.map +1 -1
  49. package/dist/src/editors/ox-grist-editor-select.js +37 -25
  50. package/dist/src/editors/ox-grist-editor-select.js.map +1 -1
  51. package/dist/src/editors/ox-input-tree.js +8 -8
  52. package/dist/src/editors/ox-input-tree.js.map +1 -1
  53. package/dist/src/filters/filter-input-barcode.js +1 -0
  54. package/dist/src/filters/filter-input-barcode.js.map +1 -1
  55. package/dist/src/filters/filter-select.js +30 -16
  56. package/dist/src/filters/filter-select.js.map +1 -1
  57. package/dist/src/filters/filter-styles.js +46 -31
  58. package/dist/src/filters/filter-styles.js.map +1 -1
  59. package/dist/src/filters/filters-form.d.ts +15 -4
  60. package/dist/src/filters/filters-form.js +205 -70
  61. package/dist/src/filters/filters-form.js.map +1 -1
  62. package/dist/src/gutters/gutter-dirty.js +2 -2
  63. package/dist/src/gutters/gutter-dirty.js.map +1 -1
  64. package/dist/src/index.d.ts +1 -0
  65. package/dist/src/index.js +1 -0
  66. package/dist/src/index.js.map +1 -1
  67. package/dist/src/personalizer/index.d.ts +1 -0
  68. package/dist/src/personalizer/index.js +2 -0
  69. package/dist/src/personalizer/index.js.map +1 -0
  70. package/dist/src/personalizer/ox-grist-filter-personalizer.d.ts +8 -0
  71. package/dist/src/personalizer/ox-grist-filter-personalizer.js +177 -0
  72. package/dist/src/personalizer/ox-grist-filter-personalizer.js.map +1 -0
  73. package/dist/src/personalizer/ox-grist-personalizer.d.ts +8 -0
  74. package/dist/src/personalizer/ox-grist-personalizer.js +178 -0
  75. package/dist/src/personalizer/ox-grist-personalizer.js.map +1 -0
  76. package/dist/src/record-view/record-creator.js +2 -2
  77. package/dist/src/record-view/record-creator.js.map +1 -1
  78. package/dist/src/renderers/ox-grist-renderer-select.js +34 -4
  79. package/dist/src/renderers/ox-grist-renderer-select.js.map +1 -1
  80. package/dist/src/renderers/ox-grist-renderer-tree.js +8 -8
  81. package/dist/src/renderers/ox-grist-renderer-tree.js.map +1 -1
  82. package/dist/src/sorters/sorters-control.js +3 -3
  83. package/dist/src/sorters/sorters-control.js.map +1 -1
  84. package/dist/src/types.d.ts +41 -2
  85. package/dist/src/types.js.map +1 -1
  86. package/dist/stories/{accumulator.stories.d.ts → accumulator-format.stories.d.ts} +9 -0
  87. package/dist/stories/{accumulator.stories.js → accumulator-format.stories.js} +24 -12
  88. package/dist/stories/accumulator-format.stories.js.map +1 -0
  89. package/dist/stories/barcode-input-filter.stories.d.ts +5 -0
  90. package/dist/stories/barcode-input-filter.stories.js +29 -5
  91. package/dist/stories/barcode-input-filter.stories.js.map +1 -1
  92. package/dist/stories/bounded-select-filters.stories.d.ts +30 -0
  93. package/dist/stories/bounded-select-filters.stories.js +288 -0
  94. package/dist/stories/bounded-select-filters.stories.js.map +1 -0
  95. package/dist/stories/bounded-select-record.stories.d.ts +30 -0
  96. package/dist/stories/bounded-select-record.stories.js +291 -0
  97. package/dist/stories/bounded-select-record.stories.js.map +1 -0
  98. package/dist/stories/click-event.stories.d.ts +41 -0
  99. package/dist/stories/click-event.stories.js +234 -0
  100. package/dist/stories/click-event.stories.js.map +1 -0
  101. package/dist/stories/creatable-only-column.stories.d.ts +5 -0
  102. package/dist/stories/creatable-only-column.stories.js +46 -21
  103. package/dist/stories/creatable-only-column.stories.js.map +1 -1
  104. package/dist/stories/default-filters.stories.d.ts +5 -0
  105. package/dist/stories/default-filters.stories.js +84 -17
  106. package/dist/stories/default-filters.stories.js.map +1 -1
  107. package/dist/stories/dynamic-editable.stories.d.ts +5 -0
  108. package/dist/stories/dynamic-editable.stories.js +44 -21
  109. package/dist/stories/dynamic-editable.stories.js.map +1 -1
  110. package/dist/stories/empty-sorters.stories.d.ts +7 -1
  111. package/dist/stories/empty-sorters.stories.js +41 -17
  112. package/dist/stories/empty-sorters.stories.js.map +1 -1
  113. package/dist/stories/explicit-fetch.stories.d.ts +5 -0
  114. package/dist/stories/explicit-fetch.stories.js +40 -17
  115. package/dist/stories/explicit-fetch.stories.js.map +1 -1
  116. package/dist/stories/fixed-column.stories.d.ts +5 -0
  117. package/dist/stories/fixed-column.stories.js +53 -30
  118. package/dist/stories/fixed-column.stories.js.map +1 -1
  119. package/dist/stories/grid-setting.stories.d.ts +20 -4
  120. package/dist/stories/grid-setting.stories.js +96 -51
  121. package/dist/stories/grid-setting.stories.js.map +1 -1
  122. package/dist/stories/grist-modes.stories.d.ts +8 -2
  123. package/dist/stories/grist-modes.stories.js +58 -35
  124. package/dist/stories/grist-modes.stories.js.map +1 -1
  125. package/dist/stories/group-header.stories.d.ts +5 -0
  126. package/dist/stories/group-header.stories.js +53 -30
  127. package/dist/stories/group-header.stories.js.map +1 -1
  128. package/dist/stories/textarea.stories.d.ts +8 -2
  129. package/dist/stories/textarea.stories.js +37 -13
  130. package/dist/stories/textarea.stories.js.map +1 -1
  131. package/dist/stories/tree-column-with-checkbox.stories.d.ts +5 -0
  132. package/dist/stories/tree-column-with-checkbox.stories.js +44 -21
  133. package/dist/stories/tree-column-with-checkbox.stories.js.map +1 -1
  134. package/dist/stories/tree-column.stories.d.ts +5 -0
  135. package/dist/stories/tree-column.stories.js +44 -21
  136. package/dist/stories/tree-column.stories.js.map +1 -1
  137. package/dist/tsconfig.tsbuildinfo +1 -1
  138. package/docs/default-value/value-generator/date-generator.md +29 -0
  139. package/docs/default-value/value-generator/hour-time-generator.md +33 -0
  140. package/docs/default-value/value-generator/minute-time-generator.md +33 -0
  141. package/docs/default-value/value-generator/month-date-generator.md +2 -0
  142. package/docs/default-value/value-generator/now-generator.md +29 -0
  143. package/docs/default-value/value-generator/time-generator.md +31 -0
  144. package/docs/default-value/value-generator/today-generator.md +29 -0
  145. package/docs/default-value/value-generator/week-date-generator.md +31 -0
  146. package/docs/default-value/value-generator/year-date-generator.md +31 -0
  147. package/package.json +15 -10
  148. package/src/data-card/data-card-field.ts +2 -2
  149. package/src/data-card/data-card-gutter-menu.ts +5 -5
  150. package/src/data-card/data-card-gutter.ts +6 -6
  151. package/src/data-card/data-card.ts +7 -9
  152. package/src/data-card/record-card.ts +9 -10
  153. package/src/data-grid/data-grid-accum-field.ts +11 -5
  154. package/src/data-grid/data-grid-body-style.ts +12 -0
  155. package/src/data-grid/data-grid-body.ts +16 -29
  156. package/src/data-grid/data-grid-field.ts +7 -2
  157. package/src/data-grid/data-grid-footer.ts +4 -2
  158. package/src/data-grid/data-grid-header.ts +8 -6
  159. package/src/data-grid/data-grid.ts +23 -1
  160. package/src/data-grid/event-handlers/data-grid-body-click-handler.ts +4 -0
  161. package/src/data-grist.ts +88 -8
  162. package/src/data-list/data-list-field.ts +5 -5
  163. package/src/data-list/data-list-gutter.ts +3 -3
  164. package/src/data-list/data-list.ts +4 -4
  165. package/src/data-list/record-partial.ts +9 -10
  166. package/src/data-manipulator.ts +5 -5
  167. package/src/data-report/data-report-field.ts +2 -1
  168. package/src/data-report/data-report-header.ts +2 -2
  169. package/src/editors/ox-grist-editor-select.ts +41 -28
  170. package/src/editors/ox-input-tree.ts +8 -8
  171. package/src/filters/filter-input-barcode.ts +1 -0
  172. package/src/filters/filter-select.ts +41 -28
  173. package/src/filters/filter-styles.ts +46 -31
  174. package/src/filters/filters-form.ts +273 -119
  175. package/src/gutters/gutter-dirty.ts +2 -2
  176. package/src/index.ts +1 -0
  177. package/src/personalizer/index.ts +1 -0
  178. package/src/personalizer/ox-grist-filter-personalizer.ts +191 -0
  179. package/src/personalizer/ox-grist-personalizer.ts +192 -0
  180. package/src/record-view/record-creator.ts +2 -2
  181. package/src/renderers/ox-grist-renderer-select.ts +41 -6
  182. package/src/renderers/ox-grist-renderer-tree.ts +8 -8
  183. package/src/sorters/sorters-control.ts +3 -3
  184. package/src/types.ts +53 -2
  185. package/stories/{accumulator.stories.ts → accumulator-format.stories.ts} +33 -12
  186. package/stories/barcode-input-filter.stories.ts +31 -6
  187. package/stories/bounded-select-filters.stories.ts +339 -0
  188. package/stories/bounded-select-record.stories.ts +342 -0
  189. package/stories/click-event.stories.ts +269 -0
  190. package/stories/creatable-only-column.stories.ts +54 -28
  191. package/stories/default-filters.stories.ts +92 -24
  192. package/stories/dynamic-editable.stories.ts +52 -28
  193. package/stories/empty-sorters.stories.ts +51 -25
  194. package/stories/explicit-fetch.stories.ts +48 -24
  195. package/stories/fixed-column.stories.ts +62 -39
  196. package/stories/grid-setting.stories.ts +120 -63
  197. package/stories/grist-modes.stories.ts +74 -46
  198. package/stories/group-header.stories.ts +61 -39
  199. package/stories/textarea.stories.ts +49 -17
  200. package/stories/tree-column-with-checkbox.stories.ts +52 -28
  201. package/stories/tree-column.stories.ts +52 -28
  202. package/themes/dark-hc.css +151 -0
  203. package/themes/dark-mc.css +151 -0
  204. package/themes/dark.css +151 -0
  205. package/themes/grist-theme.css +103 -100
  206. package/themes/light-hc.css +151 -0
  207. package/themes/light-mc.css +151 -0
  208. package/themes/light.css +151 -0
  209. package/themes/md-typescale-styles.css +100 -0
  210. package/themes/spacing.css +43 -0
  211. package/themes/state-color.css +6 -0
  212. package/dist/stories/accumulator.stories.js.map +0 -1
  213. package/themes/app-theme.css +0 -145
  214. package/themes/form-theme.css +0 -75
  215. package/themes/oops-theme.css +0 -26
  216. package/themes/report-theme.css +0 -47
@@ -5,6 +5,7 @@ import '@operato/popup/ox-popup-list.js'
5
5
  import '@material/web/icon/icon.js'
6
6
 
7
7
  import { html, TemplateResult } from 'lit'
8
+ import { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles'
8
9
 
9
10
  import { FetchHandler } from '../src/types.js'
10
11
  import { CommonHeaderStyles, CommonGristStyles } from '@operato/styles'
@@ -65,6 +66,7 @@ function buildConfig({ headerFilter }: { headerFilter: boolean }) {
65
66
  header: 'name',
66
67
  filter: 'search',
67
68
  record: {
69
+ mandatory: true,
68
70
  editable: (value: any, column: any, record: any, rowIndex: any, field: any) => {
69
71
  return !record.id
70
72
  }
@@ -97,6 +99,7 @@ function buildConfig({ headerFilter }: { headerFilter: boolean }) {
97
99
  name: 'number',
98
100
  header: 'number',
99
101
  record: {
102
+ mandatory: true,
100
103
  editable: true
101
104
  },
102
105
  width: 80
@@ -152,7 +155,8 @@ export default {
152
155
  title: 'creatable only column for ox-grist',
153
156
  component: 'ox-grist',
154
157
  argTypes: {
155
- headerFilter: { control: 'boolean' }
158
+ headerFilter: { control: 'boolean' },
159
+ theme: { control: 'select', options: ['light', 'dark'] }
156
160
  }
157
161
  }
158
162
 
@@ -164,10 +168,18 @@ interface Story<T> {
164
168
 
165
169
  interface ArgTypes {
166
170
  headerFilter: boolean
171
+ theme: 'light' | 'dark'
167
172
  }
168
173
 
169
- const Template: Story<ArgTypes> = ({ headerFilter }: ArgTypes) =>
170
- html` <link
174
+ const Template: Story<ArgTypes> = ({ headerFilter, theme = 'light' }: ArgTypes) =>
175
+ html` <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
176
+
177
+ <link href="/themes/light.css" rel="stylesheet" />
178
+ <link href="/themes/dark.css" rel="stylesheet" />
179
+ <link href="/themes/spacing.css" rel="stylesheet" />
180
+ <link href="/themes/grist-theme.css" rel="stylesheet" />
181
+
182
+ <link
171
183
  href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
172
184
  rel="stylesheet"
173
185
  />
@@ -180,15 +192,29 @@ const Template: Story<ArgTypes> = ({ headerFilter }: ArgTypes) =>
180
192
  rel="stylesheet"
181
193
  />
182
194
 
183
- <link href="/themes/app-theme.css" rel="stylesheet" />
184
- <link href="/themes/oops-theme.css" rel="stylesheet" />
185
- <link href="/themes/grist-theme.css" rel="stylesheet" />
195
+ <style>
196
+ ${MDTypeScaleStyles.cssText}
197
+ </style>
186
198
 
187
199
  <style>
188
200
  ${CommonGristStyles.cssText}
189
201
  ${CommonHeaderStyles.cssText}
190
202
  </style>
191
203
 
204
+ <script>
205
+ document.body.classList.add('${theme}')
206
+ </script>
207
+
208
+ <style>
209
+ ox-grist {
210
+ height: 600px;
211
+ }
212
+
213
+ ox-filters-form {
214
+ flex: 1;
215
+ }
216
+ </style>
217
+
192
218
  <ox-grist
193
219
  .config=${buildConfig({ headerFilter })}
194
220
  mode="GRID"
@@ -199,31 +225,31 @@ const Template: Story<ArgTypes> = ({ headerFilter }: ArgTypes) =>
199
225
  console.log(name, number, chk)
200
226
  }}
201
227
  >
202
- <div slot="headroom">
203
- <div id="filters">
228
+ <div slot="headroom" class="header">
229
+ <div class="filters">
204
230
  <ox-filters-form></ox-filters-form>
205
- </div>
206
231
 
207
- <div id="sorters">
208
- Sort
209
- <md-icon
210
- @click=${(e: Event) => {
211
- const target = e.currentTarget as HTMLElement
212
- ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
213
- right: 0,
214
- top: target.offsetTop + target.offsetHeight
215
- })
216
- }}
217
- >expand_more</md-icon
218
- >
219
- <ox-popup id="sorter-control">
220
- <ox-sorters-control> </ox-sorters-control>
221
- </ox-popup>
222
- </div>
232
+ <div id="sorters">
233
+ Sort
234
+ <md-icon
235
+ @click=${(e: Event) => {
236
+ const target = e.currentTarget as HTMLElement
237
+ ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
238
+ right: 0,
239
+ top: target.offsetTop + target.offsetHeight
240
+ })
241
+ }}
242
+ >expand_more</md-icon
243
+ >
244
+ <ox-popup id="sorter-control">
245
+ <ox-sorters-control> </ox-sorters-control>
246
+ </ox-popup>
247
+ </div>
223
248
 
224
- <ox-record-creator id="add" light-popup>
225
- <button><md-icon>add</md-icon></button>
226
- </ox-record-creator>
249
+ <ox-record-creator id="add" light-popup>
250
+ <button><md-icon>add</md-icon></button>
251
+ </ox-record-creator>
252
+ </div>
227
253
  </div>
228
254
  </ox-grist>`
229
255
 
@@ -5,6 +5,7 @@ import '@operato/popup/ox-popup-list.js'
5
5
  import '@material/web/icon/icon.js'
6
6
 
7
7
  import { html, TemplateResult } from 'lit'
8
+ import { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles'
8
9
 
9
10
  import { FetchHandler } from '../src/types.js'
10
11
 
@@ -25,6 +26,7 @@ const fetchHandler: FetchHandler = async ({ sorters = [], filters, page, limit }
25
26
  id: String(idx),
26
27
  name: idx % 2 ? `shnam-${start + idx + 1}` : `heartyoh-${start + idx + 1}`,
27
28
  description: idx % 2 ? `hatiolabmanager${start + idx + 1}1234567890` : `hatiosea manager-${start + idx + 1}`,
29
+ due: idx % 2 ? '2024-01-01' : '2024-02-01',
28
30
  createdAt: Date.now(),
29
31
  updatedAt: Date.now()
30
32
  }
@@ -73,10 +75,52 @@ function buildConfig({ headerFilter }: { headerFilter: boolean }) {
73
75
  },
74
76
  width: 200
75
77
  },
78
+ {
79
+ type: 'date',
80
+ name: 'due',
81
+ header: 'due',
82
+ filter: {
83
+ operator: 'between',
84
+ value: [
85
+ {
86
+ name: 'today',
87
+ params: {
88
+ relativeDays: -2,
89
+ timeZone: 'Asia/Seoul',
90
+ format: 'YYYY-MM-DD'
91
+ }
92
+ },
93
+ {
94
+ name: 'today',
95
+ params: {
96
+ relativeDays: 1,
97
+ timeZone: 'Asia/Seoul',
98
+ locale: 'en-CA' /* 'YYYY-MM-DD' format */,
99
+ format: {
100
+ year: 'numeric',
101
+ month: '2-digit',
102
+ day: '2-digit'
103
+ }
104
+ }
105
+ }
106
+ ]
107
+ },
108
+ record: {
109
+ align: 'left'
110
+ },
111
+ width: 120
112
+ },
76
113
  {
77
114
  type: 'datetime',
78
115
  name: 'updatedAt',
79
116
  header: 'updated at',
117
+ filter: {
118
+ operator: 'between',
119
+ value: [
120
+ { name: 'week', params: { relativeWeeks: -1 } },
121
+ { name: 'today', params: { relativeDays: +1 } }
122
+ ]
123
+ },
80
124
  width: 180
81
125
  },
82
126
  {
@@ -106,7 +150,8 @@ export default {
106
150
  title: 'default filters for ox-grist',
107
151
  component: 'ox-grist',
108
152
  argTypes: {
109
- headerFilter: { control: 'boolean' }
153
+ headerFilter: { control: 'boolean' },
154
+ theme: { control: 'select', options: ['light', 'dark'] }
110
155
  }
111
156
  }
112
157
 
@@ -118,10 +163,18 @@ interface Story<T> {
118
163
 
119
164
  interface ArgTypes {
120
165
  headerFilter: boolean
166
+ theme?: 'light' | 'dark'
121
167
  }
122
168
 
123
- const Template: Story<ArgTypes> = ({ headerFilter }: ArgTypes) =>
124
- html` <link
169
+ const Template: Story<ArgTypes> = ({ headerFilter, theme = 'light' }: ArgTypes) =>
170
+ html` <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
171
+
172
+ <link href="/themes/light.css" rel="stylesheet" />
173
+ <link href="/themes/dark.css" rel="stylesheet" />
174
+ <link href="/themes/spacing.css" rel="stylesheet" />
175
+ <link href="/themes/grist-theme.css" rel="stylesheet" />
176
+
177
+ <link
125
178
  href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
126
179
  rel="stylesheet"
127
180
  />
@@ -133,41 +186,56 @@ const Template: Story<ArgTypes> = ({ headerFilter }: ArgTypes) =>
133
186
  href="https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1"
134
187
  rel="stylesheet"
135
188
  />
136
- <link href="/themes/app-theme.css" rel="stylesheet" />
137
- <link href="/themes/oops-theme.css" rel="stylesheet" />
138
- <link href="/themes/grist-theme.css" rel="stylesheet" />
189
+
190
+ <style>
191
+ ${MDTypeScaleStyles.cssText}
192
+ </style>
139
193
 
140
194
  <style>
141
195
  ${CommonGristStyles.cssText}
142
196
  ${CommonHeaderStyles.cssText}
143
197
  </style>
144
198
 
199
+ <script>
200
+ document.body.classList.add('${theme}')
201
+ </script>
202
+
203
+ <style>
204
+ ox-grist {
205
+ height: 600px;
206
+ }
207
+
208
+ ox-filters-form {
209
+ flex: 1;
210
+ }
211
+ </style>
212
+
145
213
  <ox-grist
146
214
  .config=${buildConfig({ headerFilter })}
147
215
  mode="GRID"
148
216
  .fetchHandler=${fetchHandler}
149
217
  @filters-change=${(e: Event) => console.log('filters', (e.target as any).filters)}
150
218
  >
151
- <div slot="headroom">
152
- <div id="filters">
219
+ <div slot="headroom" class="header">
220
+ <div class="filters">
153
221
  <ox-filters-form></ox-filters-form>
154
- </div>
155
222
 
156
- <div id="sorters">
157
- Sort
158
- <md-icon
159
- @click=${(e: Event) => {
160
- const target = e.currentTarget as HTMLElement
161
- ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
162
- right: 0,
163
- top: target.offsetTop + target.offsetHeight
164
- })
165
- }}
166
- >expand_more</md-icon
167
- >
168
- <ox-popup id="sorter-control">
169
- <ox-sorters-control> </ox-sorters-control>
170
- </ox-popup>
223
+ <div id="sorters">
224
+ Sort
225
+ <md-icon
226
+ @click=${(e: Event) => {
227
+ const target = e.currentTarget as HTMLElement
228
+ ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
229
+ right: 0,
230
+ top: target.offsetTop + target.offsetHeight
231
+ })
232
+ }}
233
+ >expand_more</md-icon
234
+ >
235
+ <ox-popup id="sorter-control">
236
+ <ox-sorters-control> </ox-sorters-control>
237
+ </ox-popup>
238
+ </div>
171
239
  </div>
172
240
  </div>
173
241
  </ox-grist>`
@@ -5,6 +5,7 @@ import '@operato/popup/ox-popup-list.js'
5
5
  import '@material/web/icon/icon.js'
6
6
 
7
7
  import { html, TemplateResult } from 'lit'
8
+ import { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles'
8
9
 
9
10
  import { FetchHandler } from '../src/types.js'
10
11
  import { CommonHeaderStyles, CommonGristStyles } from '@operato/styles'
@@ -180,7 +181,8 @@ export default {
180
181
  title: 'dynamic-editable for ox-grist',
181
182
  component: 'ox-grist',
182
183
  argTypes: {
183
- headerFilter: { control: 'boolean' }
184
+ headerFilter: { control: 'boolean' },
185
+ theme: { control: 'select', options: ['light', 'dark'] }
184
186
  }
185
187
  }
186
188
 
@@ -192,10 +194,18 @@ interface Story<T> {
192
194
 
193
195
  interface ArgTypes {
194
196
  headerFilter: boolean
197
+ theme: 'light' | 'dark'
195
198
  }
196
199
 
197
- const Template: Story<ArgTypes> = ({ headerFilter }: ArgTypes) =>
198
- html` <link
200
+ const Template: Story<ArgTypes> = ({ headerFilter, theme = 'light' }: ArgTypes) =>
201
+ html` <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
202
+
203
+ <link href="/themes/light.css" rel="stylesheet" />
204
+ <link href="/themes/dark.css" rel="stylesheet" />
205
+ <link href="/themes/spacing.css" rel="stylesheet" />
206
+ <link href="/themes/grist-theme.css" rel="stylesheet" />
207
+
208
+ <link
199
209
  href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
200
210
  rel="stylesheet"
201
211
  />
@@ -208,15 +218,29 @@ const Template: Story<ArgTypes> = ({ headerFilter }: ArgTypes) =>
208
218
  rel="stylesheet"
209
219
  />
210
220
 
211
- <link href="/themes/app-theme.css" rel="stylesheet" />
212
- <link href="/themes/oops-theme.css" rel="stylesheet" />
213
- <link href="/themes/grist-theme.css" rel="stylesheet" />
221
+ <style>
222
+ ${MDTypeScaleStyles.cssText}
223
+ </style>
214
224
 
215
225
  <style>
216
226
  ${CommonGristStyles.cssText}
217
227
  ${CommonHeaderStyles.cssText}
218
228
  </style>
219
229
 
230
+ <script>
231
+ document.body.classList.add('${theme}')
232
+ </script>
233
+
234
+ <style>
235
+ ox-grist {
236
+ height: 600px;
237
+ }
238
+
239
+ ox-filters-form {
240
+ flex: 1;
241
+ }
242
+ </style>
243
+
220
244
  <ox-grist
221
245
  .config=${buildConfig({ headerFilter })}
222
246
  mode="GRID"
@@ -227,31 +251,31 @@ const Template: Story<ArgTypes> = ({ headerFilter }: ArgTypes) =>
227
251
  console.log(name, number, chk)
228
252
  }}
229
253
  >
230
- <div slot="headroom">
231
- <div id="filters">
254
+ <div slot="headroom" class="header">
255
+ <div class="filters">
232
256
  <ox-filters-form></ox-filters-form>
233
- </div>
234
257
 
235
- <div id="sorters">
236
- Sort
237
- <md-icon
238
- @click=${(e: Event) => {
239
- const target = e.currentTarget as HTMLElement
240
- ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
241
- right: 0,
242
- top: target.offsetTop + target.offsetHeight
243
- })
244
- }}
245
- >expand_more</md-icon
246
- >
247
- <ox-popup id="sorter-control">
248
- <ox-sorters-control> </ox-sorters-control>
249
- </ox-popup>
250
- </div>
258
+ <div id="sorters">
259
+ Sort
260
+ <md-icon
261
+ @click=${(e: Event) => {
262
+ const target = e.currentTarget as HTMLElement
263
+ ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
264
+ right: 0,
265
+ top: target.offsetTop + target.offsetHeight
266
+ })
267
+ }}
268
+ >expand_more</md-icon
269
+ >
270
+ <ox-popup id="sorter-control">
271
+ <ox-sorters-control> </ox-sorters-control>
272
+ </ox-popup>
273
+ </div>
251
274
 
252
- <ox-record-creator id="add" light-popup>
253
- <button><md-icon>add</md-icon></button>
254
- </ox-record-creator>
275
+ <ox-record-creator id="add" light-popup>
276
+ <button><md-icon>add</md-icon></button>
277
+ </ox-record-creator>
278
+ </div>
255
279
  </div>
256
280
  </ox-grist>`
257
281
 
@@ -5,6 +5,7 @@ import '@operato/popup/ox-popup-list.js'
5
5
  import '@material/web/icon/icon.js'
6
6
 
7
7
  import { html, TemplateResult } from 'lit'
8
+ import { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles'
8
9
 
9
10
  import { FetchHandler } from '../src/types.js'
10
11
  import { CommonHeaderStyles, CommonGristStyles } from '@operato/styles'
@@ -92,7 +93,9 @@ const config = {
92
93
  export default {
93
94
  title: 'empty sorters for ox-grist',
94
95
  component: 'ox-grist',
95
- argTypes: {}
96
+ argTypes: {
97
+ theme: { control: 'select', options: ['light', 'dark'] }
98
+ }
96
99
  }
97
100
 
98
101
  interface Story<T> {
@@ -101,10 +104,19 @@ interface Story<T> {
101
104
  argTypes?: Record<string, unknown>
102
105
  }
103
106
 
104
- interface ArgTypes {}
107
+ interface ArgTypes {
108
+ theme: 'light' | 'dark'
109
+ }
110
+
111
+ const Template: Story<ArgTypes> = ({ theme = 'light' }: ArgTypes) =>
112
+ html` <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
113
+
114
+ <link href="/themes/light.css" rel="stylesheet" />
115
+ <link href="/themes/dark.css" rel="stylesheet" />
116
+ <link href="/themes/spacing.css" rel="stylesheet" />
117
+ <link href="/themes/grist-theme.css" rel="stylesheet" />
105
118
 
106
- const Template: Story<ArgTypes> = ({}: ArgTypes) =>
107
- html` <link
119
+ <link
108
120
  href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
109
121
  rel="stylesheet"
110
122
  />
@@ -117,41 +129,55 @@ const Template: Story<ArgTypes> = ({}: ArgTypes) =>
117
129
  rel="stylesheet"
118
130
  />
119
131
 
120
- <link href="/themes/app-theme.css" rel="stylesheet" />
121
- <link href="/themes/oops-theme.css" rel="stylesheet" />
122
- <link href="/themes/grist-theme.css" rel="stylesheet" />
132
+ <style>
133
+ ${MDTypeScaleStyles.cssText}
134
+ </style>
123
135
 
124
136
  <style>
125
137
  ${CommonGristStyles.cssText}
126
138
  ${CommonHeaderStyles.cssText}
127
139
  </style>
128
140
 
141
+ <script>
142
+ document.body.classList.add('${theme}')
143
+ </script>
144
+
145
+ <style>
146
+ ox-grist {
147
+ height: 600px;
148
+ }
149
+
150
+ ox-filters-form {
151
+ flex: 1;
152
+ }
153
+ </style>
154
+
129
155
  <ox-grist
130
156
  .config=${config}
131
157
  mode="GRID"
132
158
  .fetchHandler=${fetchHandler}
133
159
  @filters-change=${(e: Event) => console.log('filters', (e.target as any).filters)}
134
160
  >
135
- <div slot="headroom">
136
- <div id="filters">
161
+ <div slot="headroom" class="header">
162
+ <div class="filters">
137
163
  <ox-filters-form></ox-filters-form>
138
- </div>
139
164
 
140
- <div id="sorters">
141
- Sort
142
- <md-icon
143
- @click=${(e: Event) => {
144
- const target = e.currentTarget as HTMLElement
145
- ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
146
- right: 0,
147
- top: target.offsetTop + target.offsetHeight
148
- })
149
- }}
150
- >expand_more</md-icon
151
- >
152
- <ox-popup id="sorter-control">
153
- <ox-sorters-control> </ox-sorters-control>
154
- </ox-popup>
165
+ <div id="sorters">
166
+ Sort
167
+ <md-icon
168
+ @click=${(e: Event) => {
169
+ const target = e.currentTarget as HTMLElement
170
+ ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
171
+ right: 0,
172
+ top: target.offsetTop + target.offsetHeight
173
+ })
174
+ }}
175
+ >expand_more</md-icon
176
+ >
177
+ <ox-popup id="sorter-control">
178
+ <ox-sorters-control> </ox-sorters-control>
179
+ </ox-popup>
180
+ </div>
155
181
  </div>
156
182
  </div>
157
183
  </ox-grist>`
@@ -5,6 +5,7 @@ import '@operato/popup/ox-popup-list.js'
5
5
  import '@material/web/icon/icon.js'
6
6
 
7
7
  import { html, TemplateResult } from 'lit'
8
+ import { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles'
8
9
 
9
10
  import { FetchHandler } from '../src/types.js'
10
11
  import { CommonHeaderStyles, CommonGristStyles } from '@operato/styles'
@@ -94,7 +95,8 @@ export default {
94
95
  title: 'explicit-fetch attribute for ox-grist',
95
96
  component: 'ox-grist',
96
97
  argTypes: {
97
- explicitFetch: { control: 'boolean' }
98
+ explicitFetch: { control: 'boolean' },
99
+ theme: { control: 'select', options: ['light', 'dark'] }
98
100
  }
99
101
  }
100
102
 
@@ -106,10 +108,18 @@ interface Story<T> {
106
108
 
107
109
  interface ArgTypes {
108
110
  explicitFetch: boolean
111
+ theme: 'light' | 'dark'
109
112
  }
110
113
 
111
- const Template: Story<ArgTypes> = ({ explicitFetch = false }: ArgTypes) =>
112
- html` <link
114
+ const Template: Story<ArgTypes> = ({ explicitFetch = false, theme = 'light' }: ArgTypes) =>
115
+ html` <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
116
+
117
+ <link href="/themes/light.css" rel="stylesheet" />
118
+ <link href="/themes/dark.css" rel="stylesheet" />
119
+ <link href="/themes/spacing.css" rel="stylesheet" />
120
+ <link href="/themes/grist-theme.css" rel="stylesheet" />
121
+
122
+ <link
113
123
  href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
114
124
  rel="stylesheet"
115
125
  />
@@ -122,15 +132,29 @@ const Template: Story<ArgTypes> = ({ explicitFetch = false }: ArgTypes) =>
122
132
  rel="stylesheet"
123
133
  />
124
134
 
125
- <link href="/themes/app-theme.css" rel="stylesheet" />
126
- <link href="/themes/oops-theme.css" rel="stylesheet" />
127
- <link href="/themes/grist-theme.css" rel="stylesheet" />
135
+ <style>
136
+ ${MDTypeScaleStyles.cssText}
137
+ </style>
128
138
 
129
139
  <style>
130
140
  ${CommonGristStyles.cssText}
131
141
  ${CommonHeaderStyles.cssText}
132
142
  </style>
133
143
 
144
+ <script>
145
+ document.body.classList.add('${theme}')
146
+ </script>
147
+
148
+ <style>
149
+ ox-grist {
150
+ height: 600px;
151
+ }
152
+
153
+ ox-filters-form {
154
+ flex: 1;
155
+ }
156
+ </style>
157
+
134
158
  <ox-grist
135
159
  .config=${config}
136
160
  mode="GRID"
@@ -138,26 +162,26 @@ const Template: Story<ArgTypes> = ({ explicitFetch = false }: ArgTypes) =>
138
162
  .fetchHandler=${fetchHandler}
139
163
  @filters-change=${(e: Event) => console.log('filters', (e.target as any).filters)}
140
164
  >
141
- <div slot="headroom">
142
- <div id="filters">
165
+ <div slot="headroom" class="header">
166
+ <div class="filters">
143
167
  <ox-filters-form></ox-filters-form>
144
- </div>
145
168
 
146
- <div id="sorters">
147
- Sort
148
- <md-icon
149
- @click=${(e: Event) => {
150
- const target = e.currentTarget as HTMLElement
151
- ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
152
- right: 0,
153
- top: target.offsetTop + target.offsetHeight
154
- })
155
- }}
156
- >expand_more</md-icon
157
- >
158
- <ox-popup id="sorter-control">
159
- <ox-sorters-control> </ox-sorters-control>
160
- </ox-popup>
169
+ <div id="sorters">
170
+ Sort
171
+ <md-icon
172
+ @click=${(e: Event) => {
173
+ const target = e.currentTarget as HTMLElement
174
+ ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
175
+ right: 0,
176
+ top: target.offsetTop + target.offsetHeight
177
+ })
178
+ }}
179
+ >expand_more</md-icon
180
+ >
181
+ <ox-popup id="sorter-control">
182
+ <ox-sorters-control> </ox-sorters-control>
183
+ </ox-popup>
184
+ </div>
161
185
  </div>
162
186
  </div>
163
187
  </ox-grist>`