@operato/data-grist 8.0.0-beta.0 → 8.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 (164) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/package.json +10 -10
  3. package/.storybook/main.js +0 -3
  4. package/.storybook/preview.js +0 -52
  5. package/.storybook/server.mjs +0 -8
  6. package/src/accumulator/accumulator.ts +0 -63
  7. package/src/configure/column-builder.ts +0 -114
  8. package/src/configure/config-builder.ts +0 -40
  9. package/src/configure/filters-option-builder.ts +0 -8
  10. package/src/configure/imex-option-builder.ts +0 -5
  11. package/src/configure/list-option-builder.ts +0 -9
  12. package/src/configure/rows-option-builder.ts +0 -38
  13. package/src/configure/tree-option-builder.ts +0 -22
  14. package/src/configure/zero-config.ts +0 -83
  15. package/src/const.ts +0 -1
  16. package/src/data-card/data-card-field.ts +0 -94
  17. package/src/data-card/data-card-gutter-menu.ts +0 -94
  18. package/src/data-card/data-card-gutter.ts +0 -103
  19. package/src/data-card/data-card.ts +0 -154
  20. package/src/data-card/event-handlers/record-card-click-handler.ts +0 -34
  21. package/src/data-card/event-handlers/record-card-dblclick-handler.ts +0 -34
  22. package/src/data-card/record-card.ts +0 -298
  23. package/src/data-consumer.ts +0 -11
  24. package/src/data-grid/data-grid-accum-field.ts +0 -109
  25. package/src/data-grid/data-grid-body-style.ts +0 -85
  26. package/src/data-grid/data-grid-body.ts +0 -765
  27. package/src/data-grid/data-grid-field.ts +0 -227
  28. package/src/data-grid/data-grid-footer.ts +0 -119
  29. package/src/data-grid/data-grid-header.ts +0 -578
  30. package/src/data-grid/data-grid.ts +0 -293
  31. package/src/data-grid/event-handlers/data-grid-body-click-handler.ts +0 -69
  32. package/src/data-grid/event-handlers/data-grid-body-contextmenu-handler.ts +0 -32
  33. package/src/data-grid/event-handlers/data-grid-body-dblclick-handler.ts +0 -42
  34. package/src/data-grid/event-handlers/data-grid-body-focus-change-handler.ts +0 -24
  35. package/src/data-grid/event-handlers/data-grid-body-keydown-handler.ts +0 -234
  36. package/src/data-grist.ts +0 -1233
  37. package/src/data-list/data-list-field.ts +0 -82
  38. package/src/data-list/data-list-gutter.ts +0 -108
  39. package/src/data-list/data-list.ts +0 -145
  40. package/src/data-list/event-handlers/record-partial-click-handler.ts +0 -34
  41. package/src/data-list/event-handlers/record-partial-dblclick-handler.ts +0 -33
  42. package/src/data-list/event-handlers/record-partial-long-press-handler.ts +0 -33
  43. package/src/data-list/record-partial.ts +0 -264
  44. package/src/data-manipulator.ts +0 -426
  45. package/src/data-provider.ts +0 -271
  46. package/src/data-report/data-report-body-style.ts +0 -58
  47. package/src/data-report/data-report-body.ts +0 -189
  48. package/src/data-report/data-report-component.ts +0 -138
  49. package/src/data-report/data-report-field.ts +0 -83
  50. package/src/data-report/data-report-header.ts +0 -242
  51. package/src/data-report/event-handlers/data-report-body-click-handler.ts +0 -38
  52. package/src/data-report/event-handlers/data-report-body-dblclick-handler.ts +0 -25
  53. package/src/data-report/event-handlers/data-report-body-keydown-handler.ts +0 -68
  54. package/src/data-report.ts +0 -424
  55. package/src/editors/index.ts +0 -4
  56. package/src/editors/ox-grist-editor-checkbox.ts +0 -28
  57. package/src/editors/ox-grist-editor-color.ts +0 -10
  58. package/src/editors/ox-grist-editor-date.ts +0 -10
  59. package/src/editors/ox-grist-editor-datetime.ts +0 -27
  60. package/src/editors/ox-grist-editor-email.ts +0 -10
  61. package/src/editors/ox-grist-editor-file.ts +0 -28
  62. package/src/editors/ox-grist-editor-image.ts +0 -31
  63. package/src/editors/ox-grist-editor-month.ts +0 -10
  64. package/src/editors/ox-grist-editor-multiple-select.ts +0 -57
  65. package/src/editors/ox-grist-editor-number.ts +0 -27
  66. package/src/editors/ox-grist-editor-password.ts +0 -10
  67. package/src/editors/ox-grist-editor-select.ts +0 -55
  68. package/src/editors/ox-grist-editor-tel.ts +0 -10
  69. package/src/editors/ox-grist-editor-text.ts +0 -14
  70. package/src/editors/ox-grist-editor-textarea.ts +0 -16
  71. package/src/editors/ox-grist-editor-time.ts +0 -10
  72. package/src/editors/ox-grist-editor-tree.ts +0 -27
  73. package/src/editors/ox-grist-editor-varname.ts +0 -36
  74. package/src/editors/ox-grist-editor-week.ts +0 -10
  75. package/src/editors/ox-grist-editor.ts +0 -207
  76. package/src/editors/ox-input-tree.ts +0 -226
  77. package/src/editors/registry.ts +0 -82
  78. package/src/empty-note.ts +0 -46
  79. package/src/filters/filter-checkbox.ts +0 -49
  80. package/src/filters/filter-input-barcode.ts +0 -34
  81. package/src/filters/filter-input.ts +0 -30
  82. package/src/filters/filter-range-date.ts +0 -81
  83. package/src/filters/filter-range-number.ts +0 -64
  84. package/src/filters/filter-select-buttons.ts +0 -60
  85. package/src/filters/filter-select.ts +0 -68
  86. package/src/filters/filter-styles.ts +0 -119
  87. package/src/filters/filters-form.ts +0 -476
  88. package/src/filters/index.ts +0 -10
  89. package/src/filters/registry.ts +0 -56
  90. package/src/formatters/date-formatter.ts +0 -3
  91. package/src/formatters/index.ts +0 -1
  92. package/src/formatters/number-formatter.ts +0 -3
  93. package/src/formatters/registry.ts +0 -30
  94. package/src/formatters/text-formatter.ts +0 -3
  95. package/src/gutters/gutter-button.ts +0 -51
  96. package/src/gutters/gutter-dirty.ts +0 -96
  97. package/src/gutters/gutter-row-selector.ts +0 -89
  98. package/src/gutters/gutter-sequence.ts +0 -54
  99. package/src/gutters/index.ts +0 -1
  100. package/src/gutters/registry.ts +0 -32
  101. package/src/handlers/contextmenu-tree-mutation.ts +0 -80
  102. package/src/handlers/index.ts +0 -1
  103. package/src/handlers/move-down.ts +0 -44
  104. package/src/handlers/move-up.ts +0 -44
  105. package/src/handlers/record-copy.ts +0 -38
  106. package/src/handlers/record-delete.ts +0 -30
  107. package/src/handlers/record-view-handler.ts +0 -27
  108. package/src/handlers/registry.ts +0 -42
  109. package/src/handlers/select-row-toggle.ts +0 -30
  110. package/src/handlers/select-row.ts +0 -27
  111. package/src/index.ts +0 -17
  112. package/src/personalizer/index.ts +0 -1
  113. package/src/personalizer/ox-grist-filter-personalizer.ts +0 -192
  114. package/src/personalizer/ox-grist-personalizer.ts +0 -226
  115. package/src/record-view/event-handlers/record-view-body-click-handler.ts +0 -33
  116. package/src/record-view/event-handlers/record-view-body-keydown-handler.ts +0 -26
  117. package/src/record-view/index.ts +0 -2
  118. package/src/record-view/ox-record-creator.ts +0 -289
  119. package/src/record-view/record-view-body.ts +0 -257
  120. package/src/record-view/record-view-handler.ts +0 -86
  121. package/src/record-view/record-view.ts +0 -122
  122. package/src/renderers/index.ts +0 -14
  123. package/src/renderers/ox-grist-renderer-boolean.ts +0 -43
  124. package/src/renderers/ox-grist-renderer-color.ts +0 -15
  125. package/src/renderers/ox-grist-renderer-date.ts +0 -62
  126. package/src/renderers/ox-grist-renderer-file.ts +0 -31
  127. package/src/renderers/ox-grist-renderer-image.ts +0 -27
  128. package/src/renderers/ox-grist-renderer-json5.ts +0 -36
  129. package/src/renderers/ox-grist-renderer-link.ts +0 -17
  130. package/src/renderers/ox-grist-renderer-password.ts +0 -7
  131. package/src/renderers/ox-grist-renderer-progress.ts +0 -45
  132. package/src/renderers/ox-grist-renderer-select.ts +0 -58
  133. package/src/renderers/ox-grist-renderer-text.ts +0 -16
  134. package/src/renderers/ox-grist-renderer-textarea.ts +0 -7
  135. package/src/renderers/ox-grist-renderer-tree.ts +0 -189
  136. package/src/renderers/ox-grist-renderer.ts +0 -35
  137. package/src/renderers/registry.ts +0 -111
  138. package/src/sorters/sorters-control.ts +0 -143
  139. package/src/types.ts +0 -813
  140. package/src/utils/index.ts +0 -2
  141. package/src/utils/list-param.ts +0 -72
  142. package/src/utils/supports-passive.ts +0 -13
  143. package/stories/accumulator-format.stories.ts +0 -276
  144. package/stories/barcode-input-filter.stories.ts +0 -216
  145. package/stories/bounded-select-filters.stories.ts +0 -333
  146. package/stories/bounded-select-record.stories.ts +0 -336
  147. package/stories/click-event-custom.stories.ts +0 -287
  148. package/stories/click-event.stories.ts +0 -283
  149. package/stories/creatable-only-column.stories.ts +0 -253
  150. package/stories/default-filters.stories.ts +0 -241
  151. package/stories/dynamic-editable.stories.ts +0 -313
  152. package/stories/empty-sorters.stories.ts +0 -180
  153. package/stories/explicit-fetch.stories.ts +0 -186
  154. package/stories/fixed-column.stories.ts +0 -416
  155. package/stories/grid-setting.stories.ts +0 -501
  156. package/stories/grist-modes.stories.ts +0 -451
  157. package/stories/group-header.stories.ts +0 -442
  158. package/stories/record-view.stories.ts +0 -143
  159. package/stories/textarea.stories.ts +0 -261
  160. package/stories/tree-column-with-checkbox.stories.ts +0 -297
  161. package/stories/tree-column.stories.ts +0 -296
  162. package/tsconfig.json +0 -26
  163. package/web-dev-server.config.mjs +0 -27
  164. package/web-test-runner.config.mjs +0 -45
@@ -1,501 +0,0 @@
1
- import '@material/web/icon/icon.js'
2
- import '@operato/popup/ox-popup-list.js'
3
-
4
- import { sleep } from '@operato/utils'
5
-
6
- import '../src/index.js'
7
- import '../src/filters/filters-form.js'
8
- import '../src/sorters/sorters-control.js'
9
- import '../src/record-view/ox-record-creator.js'
10
- import '../src/personalizer/ox-grist-personalizer.js'
11
- import '../src/personalizer/ox-grist-filter-personalizer.js'
12
-
13
- import { html, TemplateResult } from 'lit'
14
- import { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles'
15
-
16
- import { CommonHeaderStyles, CommonGristStyles } from '@operato/styles'
17
-
18
- import {
19
- ColumnConfig,
20
- FetchHandler,
21
- GristClassifier,
22
- GristEventHandlerSet,
23
- GristRecord,
24
- PersonalGristPreference,
25
- ValidationCallback
26
- } from '../src/types.js'
27
- import { OxPrompt } from '@operato/popup'
28
-
29
- const fetchHandler: FetchHandler = async ({ page, limit }) => {
30
- var total = 120993
31
- var start = (page! - 1) * limit!
32
-
33
- await new Promise(resolve => setTimeout(resolve, 500))
34
-
35
- return {
36
- total,
37
- records: Array(limit! * page! > total ? total % limit! : limit)
38
- .fill('')
39
- .map((item, idx) => {
40
- return {
41
- id: String(idx),
42
- name: idx % 2 ? `shnam-${start + idx + 1}` : `heartyoh-${start + idx + 1}`,
43
- description: idx % 2 ? `hatiolabmanager${start + idx + 1}1234567890` : `hatiosea manager-${start + idx + 1}`,
44
- email: idx % 2 ? `shnam-${start + idx + 1}@gmail.com` : `heartyoh-${start + idx + 1}@gmail.com`,
45
- active: Math.round(Math.random() * 2) % 2 ? true : false,
46
- barcode: idx % 2 ? `1234567890${start + idx + 1}` : `0987654321${start + idx + 1}`,
47
- company:
48
- idx % 2
49
- ? {
50
- id: '2',
51
- name: 'HatioLAB',
52
- description: `경기도 성남시-${start + idx + 1}`
53
- }
54
- : {
55
- id: '3',
56
- name: 'HatioSEA',
57
- description: `말레이시아 세티아알람-${start + idx + 1}`
58
- },
59
- thumbnail:
60
- idx % 4 === 0
61
- ? '' /* no source */
62
- : idx % 4 === 1
63
- ? `http://www.hatiolab.com/assets/img/operato-biz3.png`
64
- : idx % 4 === 2
65
- ? `http://www.hatiolab.com/assets/img/thingsboard-30.png`
66
- : `http://www.hatiolab.com/wrong-url.png` /* wrong source */,
67
- role: ['admin', 'worker', 'tester'][idx % 3],
68
- color: idx % 2 ? `#87f018` : `#180f87`,
69
- rate: Math.round(Math.random() * 100),
70
- dynamicType: ['text', 'email', 'checkbox', 'color', 'progress', 'barcode'][idx % 5],
71
- dynamicValue: ['abcdefghijkl', 'heartyoh@hatiolab.com', 'true', 'orange', '50', '1234567890'][idx % 5],
72
- homepage:
73
- idx % 2 ? `http://hatiolab.com/${start + idx + 1}` : `http://deadpool.hatiolab.com/${start + idx + 1}`,
74
- json5: {
75
- abc: 'abc',
76
- value: 123
77
- },
78
- createdAt: Date.now(),
79
- updatedAt: Date.now()
80
- }
81
- })
82
- }
83
- }
84
-
85
- const config = {
86
- list: {
87
- thumbnail: 'thumbnail',
88
- fields: ['name', 'description'],
89
- details: ['role', 'email']
90
- },
91
- columns: [
92
- {
93
- type: 'gutter',
94
- gutterName: 'dirty'
95
- },
96
- {
97
- type: 'gutter',
98
- gutterName: 'sequence'
99
- },
100
- {
101
- type: 'gutter',
102
- gutterName: 'row-selector',
103
- multiple: true
104
- },
105
- {
106
- type: 'gutter',
107
- gutterName: 'button',
108
- icon: 'edit',
109
- title: 'edit',
110
- handlers: {
111
- click: function () {
112
- console.log('clicked')
113
- }
114
- }
115
- },
116
- {
117
- type: 'gutter',
118
- gutterName: 'button',
119
- icon: 'add',
120
- title: 'add',
121
- handlers: {
122
- click: 'record-copy'
123
- }
124
- },
125
- {
126
- type: 'gutter',
127
- gutterName: 'button',
128
- icon: 'arrow_downward',
129
- title: 'download',
130
- handlers: {
131
- click: 'move-down'
132
- }
133
- },
134
- {
135
- type: 'string',
136
- name: 'id',
137
- hidden: true
138
- },
139
- {
140
- type: 'link',
141
- name: 'name',
142
- label: true,
143
- fixed: true,
144
- header: 'name',
145
- record: {
146
- editable: true,
147
- options: {
148
- // href: 'http://hatiolab.com',
149
- href: function (column: ColumnConfig, record: GristRecord, rowIndex: number) {
150
- return record['homepage']
151
- },
152
- target: '_blank'
153
- }
154
- },
155
- filter: 'search',
156
- sortable: true,
157
- width: 120
158
- },
159
- {
160
- type: 'string',
161
- name: 'description',
162
- header: 'description',
163
- filter: 'search',
164
- record: {
165
- editable: true,
166
- align: 'left'
167
- },
168
- width: 200,
169
- handlers: {
170
- click: (columns, data, column, record, rowIndex, target) => {
171
- alert(`${column!.name} ${record![column!.name]}, row : ${rowIndex}`)
172
- }
173
- } as GristEventHandlerSet
174
- },
175
- {
176
- type: 'email',
177
- name: 'email',
178
- label: true,
179
- header: 'email',
180
- record: {
181
- editable: true
182
- },
183
- filter: 'search',
184
- sortable: true,
185
- width: 130,
186
- validation: (async (after, before, record, column) => {
187
- if (after.indexOf('@') == -1) {
188
- return await OxPrompt.open({
189
- title: '잘못된 이메일 포맷',
190
- text: '그래도 변경하시겠습니까?',
191
- cancelButton: { text: 'No' },
192
- confirmButton: { text: 'Yes' }
193
- })
194
- }
195
- return true
196
- }) as ValidationCallback
197
- },
198
- {
199
- type: 'boolean',
200
- name: 'active',
201
- header: 'active',
202
- record: {
203
- editable: true
204
- },
205
- filter: true,
206
- handlers: {
207
- dblclick: () => {
208
- const grist = document.querySelector('ox-grist') as any
209
- console.log(grist!.dirtyRecords)
210
- }
211
- },
212
- sortable: true,
213
- width: 60
214
- },
215
- {
216
- type: 'select',
217
- name: 'role',
218
- label: true,
219
- header: 'role',
220
- record: {
221
- options: ['', 'admin', 'worker', 'tester'],
222
- editable: true
223
- },
224
- filter: true,
225
- sortable: true,
226
- width: 120
227
- },
228
- {
229
- type: 'color',
230
- name: 'color',
231
- header: 'color',
232
- record: {
233
- editable: true
234
- },
235
- sortable: true,
236
- width: 50
237
- },
238
- {
239
- type: 'float',
240
- name: 'rate',
241
- header: 'rate',
242
- record: {
243
- align: 'right',
244
- editable: true,
245
- defaultValue: 10000.1
246
- },
247
- filter: {
248
- operator: 'between',
249
- value: [1, 100]
250
- },
251
- sortable: true,
252
- width: 50
253
- },
254
- {
255
- type: 'json5',
256
- name: 'json5',
257
- header: 'JSON5',
258
- record: {
259
- wide: true
260
- },
261
- width: 200
262
- },
263
- {
264
- type: 'image',
265
- name: 'thumbnail',
266
- header: 'thumbnail',
267
- record: {
268
- editable: true,
269
- wide: true
270
- },
271
- width: 120
272
- },
273
- {
274
- type: 'datetime',
275
- name: 'updatedAt',
276
- header: 'updated at',
277
- record: {
278
- editable: true,
279
- defaultValue: {
280
- name: 'now'
281
- }
282
- },
283
- filter: {
284
- operator: 'between',
285
- type: 'datetime',
286
- value: [
287
- {
288
- name: 'today',
289
- params: {
290
- type: 'datetime'
291
- }
292
- },
293
- {
294
- name: 'now',
295
- params: {
296
- type: 'datetime',
297
- relativeDays: 1
298
- }
299
- }
300
- ]
301
- },
302
- sortable: true,
303
- width: 180
304
- },
305
- {
306
- type: 'datetime',
307
- name: 'createdAt',
308
- header: 'created at',
309
- record: {
310
- editable: false
311
- },
312
- sortable: true,
313
- width: 180
314
- }
315
- ],
316
- rows: {
317
- selectable: {
318
- multiple: true
319
- },
320
- handlers: {
321
- focus: 'select-row-toggle'
322
- },
323
- classifier: function (record, rowIndex) {
324
- const rate = record['rate']
325
- const emphasized =
326
- rate < 10 ? ['black', 'white'] : rate < 25 ? ['yellow', 'blue'] : rate < 40 ? ['cyan', 'red'] : undefined
327
- return {
328
- emphasized
329
- }
330
- } as GristClassifier
331
- },
332
- sorters: [
333
- {
334
- name: 'name',
335
- desc: true
336
- },
337
- {
338
- name: 'email'
339
- }
340
- ],
341
- pagination: {
342
- pages: [20, 30, 50, 100, 200]
343
- }
344
- }
345
-
346
- export default {
347
- title: 'grid setting',
348
- component: 'ox-grist',
349
- argTypes: {
350
- config: { control: 'object' },
351
- mode: { control: 'select', options: ['GRID', 'LIST', 'CARD'] },
352
- urlParamsSensitive: { control: 'boolean' },
353
- withoutSearch: { control: 'boolean' },
354
- debug: { control: 'boolean' }
355
- }
356
- }
357
-
358
- interface Story<T> {
359
- (args: T): TemplateResult
360
- args?: Partial<T>
361
- argTypes?: Record<string, unknown>
362
- }
363
-
364
- interface ArgTypes {
365
- config: object
366
- mode: 'GRID' | 'LIST' | 'CARD'
367
- urlParamsSensitive: boolean
368
- withoutSearch: boolean
369
- fetchHandler: FetchHandler
370
- debug: boolean
371
- }
372
-
373
- var personalConfig: PersonalGristPreference = {
374
- columns: [
375
- { name: 'name', hidden: false, width: 200 },
376
- { name: 'description', hidden: true }
377
- ],
378
- pagination: {
379
- pages: [20, 30, 50, 100, 200],
380
- limit: 30
381
- }
382
- }
383
-
384
- const Template: Story<ArgTypes> = ({
385
- config,
386
- mode = 'GRID',
387
- urlParamsSensitive = false,
388
- withoutSearch = false,
389
- debug = false,
390
- fetchHandler
391
- }: ArgTypes) =>
392
- html` <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
393
-
394
- <link href="/themes/light.css" rel="stylesheet" />
395
- <link href="/themes/dark.css" rel="stylesheet" />
396
- <link href="/themes/spacing.css" rel="stylesheet" />
397
- <link href="/themes/material-theme.css" rel="stylesheet" />
398
- <link href="/themes/grist-theme.css" rel="stylesheet" />
399
-
400
- <link
401
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
402
- rel="stylesheet"
403
- />
404
- <link
405
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL@20..48,100..700,0..1"
406
- rel="stylesheet"
407
- />
408
- <link
409
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1"
410
- rel="stylesheet"
411
- />
412
-
413
- <style>
414
- ${MDTypeScaleStyles.cssText}
415
- </style>
416
-
417
- <style>
418
- ${CommonGristStyles.cssText}
419
- ${CommonHeaderStyles.cssText}
420
- </style>
421
-
422
- <style>
423
- ox-grist {
424
- flex: 1;
425
- }
426
-
427
- ox-filters-form {
428
- flex: 1;
429
- }
430
- </style>
431
-
432
- <ox-grist
433
- .mode=${mode}
434
- .config=${config}
435
- .fetchHandler=${fetchHandler}
436
- .personalConfigProvider=${{
437
- async load() {
438
- await sleep(1000)
439
- return personalConfig
440
- },
441
- async save(preference: PersonalGristPreference) {
442
- await sleep(1000)
443
- personalConfig = {
444
- ...personalConfig,
445
- ...preference
446
- }
447
- console.log('saving preference', personalConfig)
448
- return preference
449
- },
450
- async reset() {
451
- personalConfig = {}
452
- await sleep(1000)
453
- }
454
- }}
455
- ?url-params-sensitive=${urlParamsSensitive}
456
- @filters-change=${(e: Event) => console.log('filters', (e.target as any).filters)}
457
- >
458
- <div slot="headroom" class="header">
459
- <div class="filters">
460
- <ox-filters-form autofocus ?without-search=${withoutSearch}>
461
- <ox-grist-filter-personalizer slot="setting"></ox-grist-filter-personalizer>
462
- </ox-filters-form>
463
-
464
- <div id="sorters">
465
- Sort
466
- <md-icon
467
- @click=${(e: Event) => {
468
- const target = e.currentTarget as HTMLElement
469
- ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
470
- right: 0,
471
- top: target.offsetTop + target.offsetHeight
472
- })
473
- }}
474
- >expand_more</md-icon
475
- >
476
- <ox-popup id="sorter-control">
477
- <ox-sorters-control> </ox-sorters-control>
478
- </ox-popup>
479
- </div>
480
-
481
- <div id="modes">
482
- <md-icon @click=${() => (mode = 'GRID')} ?active=${mode == 'GRID'}>grid_on</md-icon>
483
- <md-icon @click=${() => (mode = 'LIST')} ?active=${mode == 'LIST'}>format_list_bulleted</md-icon>
484
- <md-icon @click=${() => (mode = 'CARD')} ?active=${mode == 'CARD'}>apps</md-icon>
485
- </div>
486
-
487
- <ox-record-creator id="add" light-popup>
488
- <button><md-icon>add</md-icon></button>
489
- </ox-record-creator>
490
- </div>
491
- </div>
492
-
493
- <ox-grist-personalizer slot="setting" ?debug=${debug}></ox-grist-personalizer>
494
- </ox-grist>`
495
-
496
- export const Regular = Template.bind({})
497
- Regular.args = {
498
- config,
499
- fetchHandler,
500
- mode: 'GRID'
501
- }