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

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 +433 -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
@@ -6,6 +6,7 @@ import '@operato/popup/ox-popup-list.js'
6
6
  import '@material/web/icon/icon.js'
7
7
 
8
8
  import { html, TemplateResult } from 'lit'
9
+ import { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles'
9
10
 
10
11
  import {
11
12
  ColumnConfig,
@@ -106,7 +107,8 @@ const config = {
106
107
  record: {
107
108
  editable: true,
108
109
  align: 'right',
109
- defaultValue: 100
110
+ defaultValue: 100,
111
+ format: '+$#,##0.00'
110
112
  },
111
113
  accumulator: 'avg',
112
114
  // accumulator: {
@@ -164,9 +166,6 @@ const config = {
164
166
  selectable: {
165
167
  multiple: false
166
168
  },
167
- handlers: {
168
- focus: 'select-row'
169
- },
170
169
  accumulator: true
171
170
  },
172
171
  sorters: [
@@ -181,12 +180,14 @@ const config = {
181
180
  }
182
181
 
183
182
  export default {
184
- title: 'accumulator in ox-grist',
183
+ title: 'accumulator format in ox-grist',
185
184
  component: 'ox-grist',
186
185
  argTypes: {
187
186
  config: { control: 'object' },
188
187
  mode: { control: 'select', options: ['GRID', 'LIST', 'CARD'] },
189
- urlParamsSensitive: { control: 'boolean' }
188
+ urlParamsSensitive: { control: 'boolean' },
189
+ theme: { control: 'select', options: ['light', 'dark'] },
190
+ withoutSearch: { control: 'boolean' }
190
191
  }
191
192
  }
192
193
 
@@ -200,11 +201,27 @@ interface ArgTypes {
200
201
  config: object
201
202
  mode: string
202
203
  urlParamsSensitive: boolean
204
+ withoutSearch: boolean
203
205
  fetchHandler: object
206
+ theme: 'light' | 'dark'
204
207
  }
205
208
 
206
- const Template: Story<ArgTypes> = ({ config, mode = 'GRID', urlParamsSensitive = false, fetchHandler }: ArgTypes) =>
207
- html` <link
209
+ const Template: Story<ArgTypes> = ({
210
+ config,
211
+ mode = 'GRID',
212
+ urlParamsSensitive = false,
213
+ withoutSearch = false,
214
+ fetchHandler,
215
+ theme = 'light'
216
+ }: ArgTypes) =>
217
+ html` <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
218
+
219
+ <link href="/themes/light.css" rel="stylesheet" />
220
+ <link href="/themes/dark.css" rel="stylesheet" />
221
+ <link href="/themes/spacing.css" rel="stylesheet" />
222
+ <link href="/themes/grist-theme.css" rel="stylesheet" />
223
+
224
+ <link
208
225
  href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
209
226
  rel="stylesheet"
210
227
  />
@@ -217,15 +234,19 @@ const Template: Story<ArgTypes> = ({ config, mode = 'GRID', urlParamsSensitive =
217
234
  rel="stylesheet"
218
235
  />
219
236
 
220
- <link href="/themes/app-theme.css" rel="stylesheet" />
221
- <link href="/themes/oops-theme.css" rel="stylesheet" />
222
- <link href="/themes/grist-theme.css" rel="stylesheet" />
237
+ <style>
238
+ ${MDTypeScaleStyles.cssText}
239
+ </style>
223
240
 
224
241
  <style>
225
242
  ${CommonGristStyles.cssText}
226
243
  ${CommonHeaderStyles.cssText}
227
244
  </style>
228
245
 
246
+ <script>
247
+ document.body.classList.add('${theme}')
248
+ </script>
249
+
229
250
  <style>
230
251
  ox-grist {
231
252
  height: 600px;
@@ -245,7 +266,7 @@ const Template: Story<ArgTypes> = ({ config, mode = 'GRID', urlParamsSensitive =
245
266
  >
246
267
  <div slot="headroom" class="header">
247
268
  <div class="filters">
248
- <ox-filters-form autofocus></ox-filters-form>
269
+ <ox-filters-form ?without-search=${withoutSearch} autofocus></ox-filters-form>
249
270
  <ox-record-creator id="add" light-popup>
250
271
  <button><md-icon>add</md-icon></button>
251
272
  </ox-record-creator>
@@ -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
 
@@ -121,7 +122,8 @@ export default {
121
122
  argTypes: {
122
123
  englishOnly: { control: 'boolean' },
123
124
  selectAfterChange: { control: 'boolean' },
124
- headerFilter: { control: 'boolean' }
125
+ headerFilter: { control: 'boolean' },
126
+ theme: { control: 'select', options: ['light', 'dark'] }
125
127
  }
126
128
  }
127
129
 
@@ -135,10 +137,18 @@ interface ArgTypes {
135
137
  englishOnly: boolean
136
138
  selectAfterChange: boolean
137
139
  headerFilter: boolean
140
+ theme: 'light' | 'dark'
138
141
  }
139
142
 
140
- const Template: Story<ArgTypes> = ({ englishOnly, selectAfterChange, headerFilter }: ArgTypes) =>
141
- html` <link
143
+ const Template: Story<ArgTypes> = ({ englishOnly, selectAfterChange, headerFilter, theme = 'light' }: ArgTypes) =>
144
+ html` <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
145
+
146
+ <link href="/themes/light.css" rel="stylesheet" />
147
+ <link href="/themes/dark.css" rel="stylesheet" />
148
+ <link href="/themes/spacing.css" rel="stylesheet" />
149
+ <link href="/themes/grist-theme.css" rel="stylesheet" />
150
+
151
+ <link
142
152
  href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
143
153
  rel="stylesheet"
144
154
  />
@@ -150,15 +160,30 @@ const Template: Story<ArgTypes> = ({ englishOnly, selectAfterChange, headerFilte
150
160
  href="https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1"
151
161
  rel="stylesheet"
152
162
  />
153
- <link href="/themes/app-theme.css" rel="stylesheet" />
154
- <link href="/themes/oops-theme.css" rel="stylesheet" />
155
- <link href="/themes/grist-theme.css" rel="stylesheet" />
163
+
164
+ <style>
165
+ ${MDTypeScaleStyles.cssText}
166
+ </style>
156
167
 
157
168
  <style>
158
169
  ${CommonGristStyles.cssText}
159
170
  ${CommonHeaderStyles.cssText}
160
171
  </style>
161
172
 
173
+ <script>
174
+ document.body.classList.add('${theme}')
175
+ </script>
176
+
177
+ <style>
178
+ ox-grist {
179
+ height: 600px;
180
+ }
181
+
182
+ ox-filters-form {
183
+ flex: 1;
184
+ }
185
+ </style>
186
+
162
187
  <ox-grist
163
188
  .config=${buildConfig({ englishOnly, selectAfterChange, headerFilter })}
164
189
  mode="GRID"
@@ -0,0 +1,339 @@
1
+ import '../src/index.js'
2
+ import '../src/filters/filters-form.js'
3
+ import '../src/sorters/sorters-control.js'
4
+ import '@operato/popup/ox-popup-list.js'
5
+ import '@material/web/icon/icon.js'
6
+
7
+ import { html, TemplateResult } from 'lit'
8
+ import { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles'
9
+
10
+ import { sleep } from '@operato/utils'
11
+
12
+ import { ColumnConfig, FetchHandler, GristRecord, SelectOption } from '../src/types.js'
13
+
14
+ import { CommonHeaderStyles, CommonGristStyles } from '@operato/styles'
15
+ import { DataGridField } from '../src/data-grid/data-grid-field.js'
16
+
17
+ const fetchHandler: FetchHandler = async ({ sorters = [], filters, page, limit }) => {
18
+ var total = 120993
19
+ var start = (page! - 1) * limit!
20
+
21
+ await new Promise(resolve => setTimeout(resolve, 500))
22
+
23
+ return {
24
+ total,
25
+ records: Array(limit! * page! > total ? total % limit! : limit)
26
+ .fill('')
27
+ .map((item, idx) => {
28
+ const warehouse = idx % 2 ? '01' : '02'
29
+ const zone = idx % 2 ? 'Z001' : 'Z002'
30
+
31
+ return {
32
+ id: String(idx),
33
+ name: idx % 2 ? `shnam-${start + idx + 1}` : `heartyoh-${start + idx + 1}`,
34
+ description: idx % 2 ? `hatiolabmanager${start + idx + 1}1234567890` : `hatiosea manager-${start + idx + 1}`,
35
+ warehouse,
36
+ zone,
37
+ location: `L${warehouse}-${zone}-0${(idx % 5) + 1}`,
38
+ createdAt: Date.now(),
39
+ updatedAt: Date.now()
40
+ }
41
+ })
42
+ }
43
+ }
44
+
45
+ function buildConfig({ headerFilter }: { headerFilter: boolean }) {
46
+ return {
47
+ list: {
48
+ fields: ['name', 'description'],
49
+ details: ['updatedAt', 'createdAt']
50
+ },
51
+ columns: [
52
+ {
53
+ type: 'gutter',
54
+ gutterName: 'sequence'
55
+ },
56
+ {
57
+ type: 'string',
58
+ name: 'id',
59
+ hidden: true
60
+ },
61
+ {
62
+ type: 'string',
63
+ name: 'name',
64
+ label: true,
65
+ header: 'name',
66
+ filter: {
67
+ operator: 'eq',
68
+ value: 'shnam'
69
+ },
70
+ sortable: true,
71
+ width: 120
72
+ },
73
+ {
74
+ type: 'string',
75
+ name: 'description',
76
+ header: 'description',
77
+ record: {
78
+ align: 'left'
79
+ },
80
+ width: 200
81
+ },
82
+ {
83
+ type: 'select',
84
+ name: 'warehouse',
85
+ header: 'warehouse',
86
+ filter: {
87
+ operator: 'eq'
88
+ },
89
+ record: {
90
+ align: 'left',
91
+ options: async (
92
+ value: any,
93
+ column: ColumnConfig,
94
+ record: GristRecord,
95
+ rowIndex: number,
96
+ field: DataGridField
97
+ ): Promise<SelectOption[]> => {
98
+ await sleep(1000) // 테스트를 위해서 강제로 1초 쉬기
99
+ return [
100
+ {
101
+ display: '',
102
+ value: ''
103
+ }
104
+ ].concat(
105
+ WAREHOUSE.map(w => {
106
+ return {
107
+ display: w.name,
108
+ value: w.id
109
+ }
110
+ })
111
+ )
112
+ }
113
+ },
114
+ width: 200
115
+ },
116
+ {
117
+ type: 'select',
118
+ name: 'zone',
119
+ header: 'zone',
120
+ filter: {
121
+ operator: 'eq',
122
+ boundTo: ['warehouse'],
123
+ onchange: () => {
124
+ console.log('warehousde filter value changed.')
125
+ }
126
+ },
127
+ record: {
128
+ align: 'left',
129
+ options: async (
130
+ value: any,
131
+ column: ColumnConfig,
132
+ record: GristRecord,
133
+ rowIndex: number,
134
+ field: DataGridField
135
+ ): Promise<SelectOption[]> => {
136
+ console.log('arguments', arguments)
137
+ await sleep(1000) // 테스트를 위해서 강제로 1초 쉬기
138
+ const warehouse = record.warehouse
139
+ console.log('warehouse', warehouse)
140
+
141
+ const targetWH = warehouse && WAREHOUSE.find(w => w.id == warehouse)
142
+ const zones = targetWH
143
+ ? targetWH.zones
144
+ : WAREHOUSE.reduce((sum, warehouse) => {
145
+ sum = sum.concat(warehouse.zones)
146
+ return sum
147
+ }, [] as any[])
148
+
149
+ return [
150
+ {
151
+ display: '',
152
+ value: ''
153
+ }
154
+ ].concat(
155
+ zones.map((z: any) => {
156
+ return {
157
+ display: z.name,
158
+ value: z.id
159
+ }
160
+ })
161
+ )
162
+ }
163
+ },
164
+ width: 200
165
+ },
166
+ {
167
+ type: 'select',
168
+ name: 'location',
169
+ header: 'location',
170
+ filter: {
171
+ operator: 'eq',
172
+ boundTo: ['warehouse', 'zone']
173
+ },
174
+ record: {
175
+ align: 'left',
176
+ options: async (
177
+ value: any,
178
+ column: ColumnConfig,
179
+ record: GristRecord,
180
+ rowIndex: number,
181
+ field: DataGridField
182
+ ): Promise<SelectOption[]> => {
183
+ await sleep(1000) // 테스트를 위해서 강제로 1초 쉬기
184
+ const warehouse = record.warehouse
185
+ const zone = record.zone
186
+ console.log('warehouse, zone', warehouse, zone)
187
+
188
+ const targetWH = (warehouse && WAREHOUSE.find(w => w.id == warehouse)) || null
189
+ const targetZone = zone && targetWH?.zones.find((z: any) => z.id == zone)
190
+ return targetZone ? ['', ...targetZone.locations] : []
191
+ }
192
+ },
193
+ width: 200
194
+ },
195
+ {
196
+ type: 'datetime',
197
+ name: 'updatedAt',
198
+ header: 'updated at',
199
+ width: 180
200
+ },
201
+ {
202
+ type: 'datetime',
203
+ name: 'createdAt',
204
+ header: 'created at',
205
+ width: 180
206
+ }
207
+ ],
208
+ rows: {},
209
+ sorters: [
210
+ {
211
+ name: 'name',
212
+ desc: true
213
+ }
214
+ ],
215
+ filters: {
216
+ header: headerFilter
217
+ },
218
+ pagination: {
219
+ pages: [30, 50, 100, 200]
220
+ }
221
+ }
222
+ }
223
+
224
+ const WAREHOUSE = [
225
+ {
226
+ id: '01',
227
+ name: '제 1 창고',
228
+ zones: [
229
+ {
230
+ id: 'Z001',
231
+ name: 'Zone 01-001',
232
+ locations: ['L01-001-01', 'L01-001-02', 'L01-001-03', 'L01-001-04', 'L01-001-05']
233
+ },
234
+ {
235
+ id: 'Z002',
236
+ name: 'Zone 01-002',
237
+ locations: ['L01-002-01', 'L01-002-02', 'L01-002-03', 'L01-002-04', 'L01-002-05']
238
+ }
239
+ ]
240
+ },
241
+ {
242
+ id: '02',
243
+ name: '제 2 창고',
244
+ zones: [
245
+ {
246
+ id: 'Z001',
247
+ name: 'Zone 02-001',
248
+ locations: ['L02-001-01', 'L02-001-02', 'L02-001-03', 'L02-001-04', 'L02-001-05']
249
+ },
250
+ {
251
+ id: 'Z002',
252
+ name: 'Zone 02-002',
253
+ locations: ['L02-002-01', 'L02-002-02', 'L02-002-03', 'L02-002-04', 'L02-002-05']
254
+ }
255
+ ]
256
+ }
257
+ ]
258
+
259
+ export default {
260
+ title: 'bounded select filters for ox-grist',
261
+ component: 'ox-grist',
262
+ argTypes: {
263
+ headerFilter: { control: 'boolean' },
264
+ theme: { control: 'select', options: ['light', 'dark'] }
265
+ }
266
+ }
267
+
268
+ interface Story<T> {
269
+ (args: T): TemplateResult
270
+ args?: Partial<T>
271
+ argTypes?: Record<string, unknown>
272
+ }
273
+
274
+ interface ArgTypes {
275
+ headerFilter: boolean
276
+ theme: 'light' | 'dark'
277
+ }
278
+
279
+ const Template: Story<ArgTypes> = ({ headerFilter, theme = 'light' }: ArgTypes) =>
280
+ html` <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
281
+
282
+ <link href="/themes/light.css" rel="stylesheet" />
283
+ <link href="/themes/dark.css" rel="stylesheet" />
284
+ <link href="/themes/spacing.css" rel="stylesheet" />
285
+ <link href="/themes/grist-theme.css" rel="stylesheet" />
286
+
287
+ <link
288
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
289
+ rel="stylesheet"
290
+ />
291
+ <link
292
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL@20..48,100..700,0..1"
293
+ rel="stylesheet"
294
+ />
295
+ <link
296
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1"
297
+ rel="stylesheet"
298
+ />
299
+
300
+ <style>
301
+ ${MDTypeScaleStyles.cssText}
302
+ </style>
303
+
304
+ <style>
305
+ ${CommonGristStyles.cssText}
306
+ ${CommonHeaderStyles.cssText}
307
+ </style>
308
+
309
+ <script>
310
+ document.body.classList.add('${theme}')
311
+ </script>
312
+
313
+ <style>
314
+ ox-grist {
315
+ height: 600px;
316
+ }
317
+
318
+ ox-filters-form {
319
+ flex: 1;
320
+ }
321
+ </style>
322
+
323
+ <ox-grist
324
+ .config=${buildConfig({ headerFilter })}
325
+ mode="GRID"
326
+ .fetchHandler=${fetchHandler}
327
+ @filters-change=${(e: Event) => console.log('filters', (e.target as any).filters)}
328
+ >
329
+ <div slot="headroom" class="header">
330
+ <div class="filters">
331
+ <ox-filters-form></ox-filters-form>
332
+ </div>
333
+ </div>
334
+ </ox-grist>`
335
+
336
+ export const Regular = Template.bind({})
337
+ Regular.args = {
338
+ headerFilter: true
339
+ }