@operato/data-grist 7.1.31 → 7.1.33

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 (175) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/src/data-grid/data-grid-field.js +4 -1
  3. package/dist/src/data-grid/data-grid-field.js.map +1 -1
  4. package/dist/src/record-view/record-view-body.js +8 -4
  5. package/dist/src/record-view/record-view-body.js.map +1 -1
  6. package/dist/src/types.d.ts +1 -1
  7. package/dist/src/types.js.map +1 -1
  8. package/dist/tsconfig.tsbuildinfo +1 -1
  9. package/package.json +10 -10
  10. package/.storybook/main.js +0 -3
  11. package/.storybook/preview.js +0 -52
  12. package/.storybook/server.mjs +0 -8
  13. package/demo/data-grist-test.html +0 -468
  14. package/demo/favicon.ico +0 -0
  15. package/demo/index.html +0 -541
  16. package/demo/report-test.html +0 -249
  17. package/src/accumulator/accumulator.ts +0 -63
  18. package/src/configure/column-builder.ts +0 -114
  19. package/src/configure/config-builder.ts +0 -40
  20. package/src/configure/filters-option-builder.ts +0 -8
  21. package/src/configure/imex-option-builder.ts +0 -5
  22. package/src/configure/list-option-builder.ts +0 -9
  23. package/src/configure/rows-option-builder.ts +0 -38
  24. package/src/configure/tree-option-builder.ts +0 -22
  25. package/src/configure/zero-config.ts +0 -83
  26. package/src/const.ts +0 -1
  27. package/src/data-card/data-card-field.ts +0 -94
  28. package/src/data-card/data-card-gutter-menu.ts +0 -94
  29. package/src/data-card/data-card-gutter.ts +0 -103
  30. package/src/data-card/data-card.ts +0 -154
  31. package/src/data-card/event-handlers/record-card-click-handler.ts +0 -34
  32. package/src/data-card/event-handlers/record-card-dblclick-handler.ts +0 -34
  33. package/src/data-card/record-card.ts +0 -289
  34. package/src/data-consumer.ts +0 -11
  35. package/src/data-grid/data-grid-accum-field.ts +0 -109
  36. package/src/data-grid/data-grid-body-style.ts +0 -99
  37. package/src/data-grid/data-grid-body.ts +0 -753
  38. package/src/data-grid/data-grid-field.ts +0 -236
  39. package/src/data-grid/data-grid-footer.ts +0 -117
  40. package/src/data-grid/data-grid-header.ts +0 -574
  41. package/src/data-grid/data-grid.ts +0 -293
  42. package/src/data-grid/event-handlers/data-grid-body-click-handler.ts +0 -69
  43. package/src/data-grid/event-handlers/data-grid-body-contextmenu-handler.ts +0 -32
  44. package/src/data-grid/event-handlers/data-grid-body-dblclick-handler.ts +0 -42
  45. package/src/data-grid/event-handlers/data-grid-body-focus-change-handler.ts +0 -24
  46. package/src/data-grid/event-handlers/data-grid-body-keydown-handler.ts +0 -234
  47. package/src/data-grist.ts +0 -1233
  48. package/src/data-list/data-list-field.ts +0 -82
  49. package/src/data-list/data-list-gutter.ts +0 -108
  50. package/src/data-list/data-list.ts +0 -145
  51. package/src/data-list/event-handlers/record-partial-click-handler.ts +0 -34
  52. package/src/data-list/event-handlers/record-partial-dblclick-handler.ts +0 -33
  53. package/src/data-list/event-handlers/record-partial-long-press-handler.ts +0 -33
  54. package/src/data-list/record-partial.ts +0 -255
  55. package/src/data-manipulator.ts +0 -426
  56. package/src/data-provider.ts +0 -271
  57. package/src/data-report/data-report-body-style.ts +0 -58
  58. package/src/data-report/data-report-body.ts +0 -189
  59. package/src/data-report/data-report-component.ts +0 -138
  60. package/src/data-report/data-report-field.ts +0 -83
  61. package/src/data-report/data-report-header.ts +0 -242
  62. package/src/data-report/event-handlers/data-report-body-click-handler.ts +0 -38
  63. package/src/data-report/event-handlers/data-report-body-dblclick-handler.ts +0 -25
  64. package/src/data-report/event-handlers/data-report-body-keydown-handler.ts +0 -68
  65. package/src/data-report.ts +0 -424
  66. package/src/editors/index.ts +0 -4
  67. package/src/editors/ox-grist-editor-checkbox.ts +0 -28
  68. package/src/editors/ox-grist-editor-color.ts +0 -10
  69. package/src/editors/ox-grist-editor-date.ts +0 -10
  70. package/src/editors/ox-grist-editor-datetime.ts +0 -27
  71. package/src/editors/ox-grist-editor-email.ts +0 -10
  72. package/src/editors/ox-grist-editor-file.ts +0 -28
  73. package/src/editors/ox-grist-editor-image.ts +0 -31
  74. package/src/editors/ox-grist-editor-month.ts +0 -10
  75. package/src/editors/ox-grist-editor-multiple-select.ts +0 -57
  76. package/src/editors/ox-grist-editor-number.ts +0 -27
  77. package/src/editors/ox-grist-editor-password.ts +0 -10
  78. package/src/editors/ox-grist-editor-select.ts +0 -55
  79. package/src/editors/ox-grist-editor-tel.ts +0 -10
  80. package/src/editors/ox-grist-editor-text.ts +0 -14
  81. package/src/editors/ox-grist-editor-textarea.ts +0 -16
  82. package/src/editors/ox-grist-editor-time.ts +0 -10
  83. package/src/editors/ox-grist-editor-tree.ts +0 -27
  84. package/src/editors/ox-grist-editor-varname.ts +0 -36
  85. package/src/editors/ox-grist-editor-week.ts +0 -10
  86. package/src/editors/ox-grist-editor.ts +0 -207
  87. package/src/editors/ox-input-tree.ts +0 -226
  88. package/src/editors/registry.ts +0 -82
  89. package/src/empty-note.ts +0 -46
  90. package/src/filters/filter-checkbox.ts +0 -49
  91. package/src/filters/filter-input-barcode.ts +0 -34
  92. package/src/filters/filter-input.ts +0 -30
  93. package/src/filters/filter-range-date.ts +0 -81
  94. package/src/filters/filter-range-number.ts +0 -64
  95. package/src/filters/filter-select-buttons.ts +0 -60
  96. package/src/filters/filter-select.ts +0 -68
  97. package/src/filters/filter-styles.ts +0 -119
  98. package/src/filters/filters-form.ts +0 -476
  99. package/src/filters/index.ts +0 -10
  100. package/src/filters/registry.ts +0 -56
  101. package/src/formatters/date-formatter.ts +0 -3
  102. package/src/formatters/index.ts +0 -1
  103. package/src/formatters/number-formatter.ts +0 -3
  104. package/src/formatters/registry.ts +0 -30
  105. package/src/formatters/text-formatter.ts +0 -3
  106. package/src/gutters/gutter-button.ts +0 -51
  107. package/src/gutters/gutter-dirty.ts +0 -96
  108. package/src/gutters/gutter-row-selector.ts +0 -89
  109. package/src/gutters/gutter-sequence.ts +0 -54
  110. package/src/gutters/index.ts +0 -1
  111. package/src/gutters/registry.ts +0 -32
  112. package/src/handlers/contextmenu-tree-mutation.ts +0 -80
  113. package/src/handlers/index.ts +0 -1
  114. package/src/handlers/move-down.ts +0 -44
  115. package/src/handlers/move-up.ts +0 -44
  116. package/src/handlers/record-copy.ts +0 -38
  117. package/src/handlers/record-delete.ts +0 -30
  118. package/src/handlers/record-view-handler.ts +0 -27
  119. package/src/handlers/registry.ts +0 -42
  120. package/src/handlers/select-row-toggle.ts +0 -30
  121. package/src/handlers/select-row.ts +0 -27
  122. package/src/index.ts +0 -17
  123. package/src/personalizer/index.ts +0 -1
  124. package/src/personalizer/ox-grist-filter-personalizer.ts +0 -192
  125. package/src/personalizer/ox-grist-personalizer.ts +0 -226
  126. package/src/record-view/event-handlers/record-view-body-click-handler.ts +0 -33
  127. package/src/record-view/event-handlers/record-view-body-keydown-handler.ts +0 -26
  128. package/src/record-view/index.ts +0 -2
  129. package/src/record-view/ox-record-creator.ts +0 -289
  130. package/src/record-view/record-view-body.ts +0 -250
  131. package/src/record-view/record-view-handler.ts +0 -86
  132. package/src/record-view/record-view.ts +0 -122
  133. package/src/renderers/index.ts +0 -14
  134. package/src/renderers/ox-grist-renderer-boolean.ts +0 -43
  135. package/src/renderers/ox-grist-renderer-color.ts +0 -15
  136. package/src/renderers/ox-grist-renderer-date.ts +0 -62
  137. package/src/renderers/ox-grist-renderer-file.ts +0 -31
  138. package/src/renderers/ox-grist-renderer-image.ts +0 -27
  139. package/src/renderers/ox-grist-renderer-json5.ts +0 -36
  140. package/src/renderers/ox-grist-renderer-link.ts +0 -17
  141. package/src/renderers/ox-grist-renderer-password.ts +0 -7
  142. package/src/renderers/ox-grist-renderer-progress.ts +0 -45
  143. package/src/renderers/ox-grist-renderer-select.ts +0 -58
  144. package/src/renderers/ox-grist-renderer-text.ts +0 -16
  145. package/src/renderers/ox-grist-renderer-textarea.ts +0 -7
  146. package/src/renderers/ox-grist-renderer-tree.ts +0 -189
  147. package/src/renderers/ox-grist-renderer.ts +0 -35
  148. package/src/renderers/registry.ts +0 -111
  149. package/src/sorters/sorters-control.ts +0 -143
  150. package/src/types.ts +0 -813
  151. package/src/utils/index.ts +0 -2
  152. package/src/utils/list-param.ts +0 -72
  153. package/src/utils/supports-passive.ts +0 -13
  154. package/stories/accumulator-format.stories.ts +0 -276
  155. package/stories/barcode-input-filter.stories.ts +0 -216
  156. package/stories/bounded-select-filters.stories.ts +0 -333
  157. package/stories/bounded-select-record.stories.ts +0 -336
  158. package/stories/click-event-custom.stories.ts +0 -288
  159. package/stories/click-event.stories.ts +0 -283
  160. package/stories/creatable-only-column.stories.ts +0 -253
  161. package/stories/default-filters.stories.ts +0 -241
  162. package/stories/dynamic-editable.stories.ts +0 -313
  163. package/stories/empty-sorters.stories.ts +0 -180
  164. package/stories/explicit-fetch.stories.ts +0 -186
  165. package/stories/fixed-column.stories.ts +0 -416
  166. package/stories/grid-setting.stories.ts +0 -501
  167. package/stories/grist-modes.stories.ts +0 -451
  168. package/stories/group-header.stories.ts +0 -442
  169. package/stories/record-view.stories.ts +0 -143
  170. package/stories/textarea.stories.ts +0 -261
  171. package/stories/tree-column-with-checkbox.stories.ts +0 -297
  172. package/stories/tree-column.stories.ts +0 -296
  173. package/tsconfig.json +0 -26
  174. package/web-dev-server.config.mjs +0 -27
  175. package/web-test-runner.config.mjs +0 -45
@@ -1,574 +0,0 @@
1
- import '@operato/popup/ox-popup.js'
2
- import '@material/web/icon/icon.js'
3
-
4
- import { css, html, LitElement, PropertyValues, nothing, TemplateResult } from 'lit'
5
- import { customElement, property, state } from 'lit/decorators.js'
6
- import { ifDefined } from 'lit/directives/if-defined.js'
7
- import throttle from 'lodash-es/throttle'
8
-
9
- import { OxPopup } from '@operato/popup'
10
- import { TooltipReactiveController, closestElement } from '@operato/utils'
11
-
12
- import { ZERO_COLUMNS, ZERO_DATA } from '../configure/zero-config'
13
- import { FilterStyles } from '../filters/filter-styles'
14
- import { getFilterRenderer } from '../filters/registry'
15
- import { ColumnConfig, FilterConfigObject, FilterValue, GristData, SortersConfig } from '../types'
16
-
17
- @customElement('ox-grid-header')
18
- export class DataGridHeader extends LitElement {
19
- static styles = [
20
- FilterStyles,
21
- css`
22
- :host {
23
- position: relative;
24
- display: grid;
25
- grid-template-columns: var(--grid-template-columns);
26
-
27
- border-top: var(--grid-header-top-border);
28
- overflow: hidden;
29
-
30
- font-variation-settings: 'FILL' 1;
31
- }
32
-
33
- :host([raised]) [fixed] {
34
- /* 고정 컬럼이 살짝 올라와 있는 느낌을 표현 */
35
- box-shadow: 3px 0 3px rgba(0, 0, 0, 0.1);
36
- }
37
-
38
- div[column] {
39
- display: flex;
40
-
41
- white-space: nowrap;
42
- overflow: hidden;
43
- background-color: var(--grid-header-background-color);
44
- border-bottom: var(--grid-header-bottom-border);
45
- padding: var(--grid-header-padding);
46
-
47
- text-overflow: ellipsis;
48
- font: var(--grid-header-font);
49
- color: var(--grid-header-color);
50
- }
51
-
52
- div[gutter] {
53
- padding: var(--spacing-small) 0;
54
- text-align: center;
55
- }
56
-
57
- span {
58
- display: block;
59
- white-space: nowrap;
60
- overflow: hidden;
61
- }
62
-
63
- span[for-title] {
64
- flex: 1;
65
- text-overflow: ellipsis;
66
- line-height: 1.6;
67
- text-transform: var(--grid-header-text-transform, capitalize);
68
- align-self: center;
69
- }
70
-
71
- span[for-title] * {
72
- vertical-align: middle;
73
- }
74
-
75
- span[for-title] md-icon {
76
- font-size: 1.2em;
77
- }
78
-
79
- span[sorter],
80
- span[filter] {
81
- display: flex;
82
- align-self: center;
83
-
84
- padding: 0;
85
- border: 0;
86
- }
87
-
88
- span[sorter] md-icon {
89
- font-size: var(--grid-header-sorter-size);
90
- }
91
-
92
- span[filter] > md-icon {
93
- font-size: var(--fontsize-default);
94
- line-height: 20px;
95
- }
96
-
97
- span[splitter] {
98
- cursor: col-resize;
99
- border-right: var(--grid-header-splitter-border);
100
- margin-right: 0;
101
- }
102
-
103
- span[splitter]:hover {
104
- border-right: var(--grid-header-splitter-border-hover);
105
- }
106
-
107
- [filter-title] {
108
- color: var(--grid-header-filter-title-color);
109
- font: var(--grid-header-filter-title-font);
110
- text-transform: capitalize;
111
- }
112
-
113
- [filter-title] * {
114
- vertical-align: middle;
115
- }
116
-
117
- [filter-title] md-icon {
118
- opacity: 0.7;
119
- color: var(--grid-header-filter-title-icon-color);
120
- }
121
-
122
- [filter] input[type='checkbox'] {
123
- margin-left: var(--spacing-medium);
124
- margin-bottom: var(--spacing-small);
125
- }
126
-
127
- [fixed] {
128
- position: sticky;
129
- z-index: 2;
130
- }
131
-
132
- .span-both {
133
- grid-row: 1 / span 2; /* 1단과 2단에 걸쳐 표시 */
134
- }
135
-
136
- .group-header {
137
- grid-row: 1; /* 1행에 배치 */
138
- grid-column: var(--group-start) / span var(--group-size); /* 2열부터 시작하여 2열에 걸쳐 표시 */
139
- }
140
-
141
- @media print {
142
- :host {
143
- grid-template-columns: var(--grid-template-print-columns);
144
- }
145
- }
146
- `
147
- ]
148
-
149
- @property({ type: Array }) columns: ColumnConfig[] = ZERO_COLUMNS
150
- @property({ type: Object }) data: GristData = ZERO_DATA
151
- @property({ type: Array }) sorters: SortersConfig = []
152
- @property({ type: Array }) filters: FilterValue[] = []
153
- @property({ type: Boolean, attribute: 'filtering-feature' }) filteringFeature: boolean = false
154
-
155
- @state() private row1: {
156
- index: number
157
- column: ColumnConfig
158
- clazz?: string
159
- start?: number
160
- size?: number
161
- align?: string
162
- group?: string
163
- }[] = []
164
-
165
- @state() private row2: {
166
- index: number
167
- column: ColumnConfig
168
- }[] = []
169
-
170
- private _lastAccVal?: number
171
- private _throttledNotifier?: any
172
-
173
- private tooltipController?: TooltipReactiveController = new TooltipReactiveController(this)
174
-
175
- connectedCallback() {
176
- super.connectedCallback()
177
-
178
- const grid = closestElement('ox-grist', this)
179
-
180
- this.addEventListener('scroll', function () {
181
- this.scrollLeft == 0 ? this.removeAttribute('raised') : this.setAttribute('raised', '')
182
- })
183
-
184
- if (this.filteringFeature) {
185
- this?.addEventListener('filter-change', (e: Event) => {
186
- const { name, operator, value } = (e as CustomEvent).detail
187
- const filters = this.filters instanceof Array ? [...this.filters] : []
188
-
189
- if (value == null) {
190
- const index = filters.findIndex(filter => filter.name === name)
191
- if (index === -1) {
192
- return
193
- }
194
-
195
- filters.splice(index, 1)
196
- } else {
197
- const index = filters.findIndex(filter => filter.name === name)
198
- if (index === -1) {
199
- filters.push({ name, operator, value })
200
- } else {
201
- filters.splice(index, 1, { name, operator, value })
202
- }
203
- }
204
-
205
- grid?.dispatchEvent(
206
- new CustomEvent('fetch-params-change', {
207
- detail: {
208
- filters,
209
- from: 'data-grid-header'
210
- }
211
- })
212
- )
213
- })
214
- }
215
- }
216
-
217
- render() {
218
- const clazz = this.row2.length > 0 ? 'span-both' : undefined
219
-
220
- return html`
221
- ${this.row1.map(({ column, clazz, start, size, align, index, group }) =>
222
- this.renderHeaderColumn({ column, clazz, start, size, align, index, group })
223
- )}
224
-
225
- <div column class=${ifDefined(clazz)}></div>
226
-
227
- ${this.row2.map(({ column, index }) => this.renderHeaderColumn({ column, index }))}
228
- `
229
- }
230
-
231
- renderHeaderColumn({ column, clazz, start, size, align, index, group }: any): TemplateResult {
232
- if (column.hidden) {
233
- return html`${nothing}`
234
- }
235
-
236
- return html`
237
- <div
238
- ?gutter=${column.type == 'gutter'}
239
- ?fixed=${column.fixed}
240
- column
241
- class=${ifDefined(clazz)}
242
- style=${group
243
- ? `--group-start:${start};--group-size:${size};${column.header?.style || ''}`
244
- : `${column.header?.style || ''}`}
245
- >
246
- <span
247
- for-title
248
- data-reactive-tooltip
249
- style="text-align:${align || column.record.align || 'left'};"
250
- @click=${(e: MouseEvent) => this._changeSort(column)}
251
- >${this._renderHeader(column)}
252
- </span>
253
-
254
- ${!group && column.sortable
255
- ? html`
256
- <span sorter @click=${(e: MouseEvent) => this._changeSort(column)}>
257
- ${this._renderSortHeader(column)}
258
- </span>
259
- `
260
- : nothing}
261
- ${!group &&
262
- this.filteringFeature &&
263
- column.filter &&
264
- (column.filter as FilterConfigObject).operator !== 'search'
265
- ? html` <span filter> ${this._renderFilterHeader(column)} </span> `
266
- : nothing}
267
- ${column.resizable !== false
268
- ? html`
269
- <span splitter draggable="false" @mousedown=${(e: MouseEvent) => this._mousedown(e, index)}>&nbsp;</span>
270
- `
271
- : nothing}
272
- </div>
273
- `
274
- }
275
-
276
- notifyFixedLeftChange() {
277
- const fixedHeaders = Array.from(this.renderRoot.querySelectorAll('div[fixed]')) as HTMLElement[]
278
- const fixedLefts = [] as number[]
279
- var left = 0
280
- fixedHeaders.forEach((header: HTMLElement) => {
281
- header.style.left = left + 'px'
282
- fixedLefts.push(left)
283
-
284
- const width = header.offsetWidth
285
- left += width
286
- })
287
-
288
- this.dispatchEvent(
289
- new CustomEvent('fixed-lefts-change', {
290
- detail: fixedLefts
291
- })
292
- )
293
- }
294
-
295
- updated(changes: PropertyValues) {
296
- var isColumnWidthChangePossible = false
297
-
298
- if (changes.has('columns')) {
299
- this.row2 = this.columns.reduce((row2, column, index) => {
300
- if (column.hidden || !column.header?.group) {
301
- return row2
302
- }
303
- return row2.concat({
304
- index,
305
- column
306
- } as any)
307
- }, [] as any[])
308
-
309
- const clazz = this.row2.length > 0 ? 'span-both' : undefined
310
-
311
- var columnNo = 0
312
-
313
- this.row1 = this.columns.reduce((row1, column, index) => {
314
- if (column.hidden) {
315
- return row1
316
- }
317
-
318
- columnNo++
319
- if (!column.header?.group) {
320
- return row1.concat({
321
- index,
322
- column,
323
- clazz
324
- } as any)
325
- }
326
- const { group, groupStyle } = column.header
327
- const last = row1[row1.length - 1] as any
328
-
329
- if (!last || group !== last.group) {
330
- return row1.concat({
331
- index,
332
- column: {
333
- ...column,
334
- header: {
335
- renderer: () => group,
336
- style: groupStyle
337
- }
338
- },
339
- group,
340
- align: 'center',
341
- clazz: 'group-header',
342
- start: columnNo,
343
- size: 1
344
- } as any)
345
- }
346
-
347
- last.size++
348
-
349
- return row1
350
- }, [] as any[])
351
-
352
- isColumnWidthChangePossible = true
353
- }
354
-
355
- if (changes.has('data')) {
356
- isColumnWidthChangePossible = true
357
- }
358
-
359
- if (isColumnWidthChangePossible) {
360
- // requestAnimationFrame(() => this.notifyFixedLeftChange())
361
- this.notifyFixedLeftChange()
362
- }
363
- }
364
-
365
- _renderHeader(column: ColumnConfig) {
366
- var { renderer } = column.header || {}
367
- var title = renderer.call(this, column)
368
-
369
- return html`${column?.record?.mandatory ? '*' : ''} ${title} `
370
- }
371
-
372
- _renderSortHeader(column: ColumnConfig) {
373
- var sorters = this.sorters || []
374
-
375
- var sorter = sorters.find(sorter => column.type !== 'gutter' && column.name == sorter.name)
376
- if (!sorter) {
377
- return html`<md-icon style="opacity: 0.2;">unfold_more</md-icon>`
378
- }
379
-
380
- if (sorters.length > 1) {
381
- var rank = sorters.indexOf(sorter) + 1
382
- return sorter.desc
383
- ? html` <md-icon>keyboard_arrow_down</md-icon><sub>${rank}</sub> `
384
- : html` <md-icon>keyboard_arrow_up</md-icon><sub>${rank}</sub> `
385
- } else {
386
- return sorter.desc ? html` <md-icon>keyboard_arrow_down</md-icon> ` : html` <md-icon>keyboard_arrow_up</md-icon> `
387
- }
388
- }
389
-
390
- _renderFilterHeader(column: ColumnConfig) {
391
- const name = column.name
392
- const filter = column.filter as FilterConfigObject
393
- const type = filter.type
394
- const value = this.filters.find(filter => filter.name === name)?.value
395
- const idx = filter!.operator === 'between' ? 1 : 0
396
- const renderer = getFilterRenderer(type)[idx]
397
-
398
- return html`
399
- <md-icon
400
- @click=${(e: Event) => {
401
- const parent = (e.target as HTMLElement).closest('[column]') as HTMLElement
402
- const popup = parent.querySelector('ox-popup, ox-popup-list') as OxPopup | null
403
- // const popup = (e.target as HTMLElement).nextSibling as OxPopupList | null
404
-
405
- // absolute position인 popup의 위치 부모는 grist 이므로,
406
- // data-grid-header 의 포지션 부모(grist)의 위치로부터 계산해야함.
407
- // this의 position을 relative로 하지 못하는 이유 : ox-popup-list가 grid body에 덮히기 때문.
408
- // const top = parent.offsetTop + parent.offsetHeight
409
- // const right = this.clientWidth - (parent.offsetLeft + parent.offsetWidth - this.scrollLeft)
410
-
411
- popup?.open({
412
- right: 0,
413
- top: parent.offsetHeight,
414
- fixed: true
415
- })
416
- }}
417
- >filter_alt</md-icon
418
- >
419
-
420
- ${!renderer
421
- ? html``
422
- : type !== 'select'
423
- ? html` <ox-popup
424
- ><div filter-title><md-icon>filter_alt</md-icon> filter by <strong>${column.name}</strong></div>
425
- ${renderer(column, value, this)}</ox-popup
426
- >`
427
- : filter!.operator === 'in'
428
- ? html`<ox-popup-list
429
- multiple
430
- attr-selected="checked"
431
- .value=${value}
432
- with-search
433
- @select=${(e: CustomEvent) =>
434
- e.target?.dispatchEvent(
435
- new CustomEvent('filter-change', {
436
- bubbles: true,
437
- composed: true,
438
- detail: {
439
- name,
440
- operator: filter!.operator,
441
- value: !e.detail
442
- ? undefined
443
- : e.detail instanceof Array && e.detail.length === 0
444
- ? undefined
445
- : e.detail
446
- }
447
- })
448
- )}
449
- ><div filter-title slot="header">
450
- <md-icon>filter_alt</md-icon> filter by <strong>${column.name}</strong>
451
- </div>
452
- ${renderer(column, value, this)}</ox-popup-list
453
- >`
454
- : html`<ox-popup-list
455
- .value=${value}
456
- with-search
457
- @select=${(e: CustomEvent) =>
458
- e.target?.dispatchEvent(
459
- new CustomEvent('filter-change', {
460
- bubbles: true,
461
- composed: true,
462
- detail: {
463
- name,
464
- operator: filter!.operator,
465
- value: e.detail ? e.detail : undefined
466
- }
467
- })
468
- )}
469
- ><div filter-title slot="header">
470
- <md-icon>filter_alt</md-icon> filter by <strong>${column.name}</strong>
471
- </div>
472
- ${renderer(column, value, this)}</ox-popup-list
473
- >`}
474
- `
475
- }
476
-
477
- _changeSort(column: ColumnConfig) {
478
- if (!column.sortable) {
479
- return
480
- }
481
-
482
- var sorters = [...this.sorters]
483
-
484
- var idx = sorters.findIndex(sorter => sorter.name == column.name)
485
- if (idx !== -1) {
486
- let sorter = sorters[idx]
487
- if (sorter.desc) {
488
- sorters.splice(idx, 1)
489
- } else {
490
- sorters.splice(idx, 1, {
491
- ...sorter,
492
- desc: true
493
- })
494
- }
495
- } else {
496
- var sorter = {
497
- name: column.name,
498
- desc: false
499
- }
500
-
501
- sorters.push(sorter)
502
- }
503
-
504
- this.sorters = sorters
505
-
506
- this.dispatchEvent(
507
- new CustomEvent('fetch-params-change', {
508
- bubbles: true,
509
- composed: true,
510
- detail: {
511
- sorters: this.sorters,
512
- from: 'data-grid-header'
513
- }
514
- })
515
- )
516
- }
517
-
518
- _accumalate(x: number) {
519
- this._lastAccVal = (this._lastAccVal ?? 0) + x
520
- return this._lastAccVal
521
- }
522
-
523
- _notifyWidthChange(idx: number, width: number) {
524
- if (!this._throttledNotifier) {
525
- this._throttledNotifier = throttle((idx: number, width: number) => {
526
- this.dispatchEvent(
527
- new CustomEvent('column-width-change', {
528
- bubbles: true,
529
- composed: true,
530
- detail: {
531
- idx,
532
- width
533
- }
534
- })
535
- )
536
-
537
- this.notifyFixedLeftChange()
538
-
539
- this._lastAccVal = 0
540
- }, 100)
541
- }
542
-
543
- this._throttledNotifier(idx, width)
544
- }
545
-
546
- _mousedown(e: MouseEvent, idx: number) {
547
- e.stopPropagation()
548
- e.preventDefault()
549
-
550
- var mousemoveHandler = ((e: MouseEvent) => {
551
- e.stopPropagation()
552
- e.preventDefault()
553
- let column = this.columns[idx]
554
-
555
- let width = Math.max(0, Number(column.width || 100) + this._accumalate(e.movementX))
556
- if (width == 0) {
557
- /* CLARIFY-ME 왜 마지막 이벤트의 offsetX로 음수 값이 오는가 */
558
- return
559
- }
560
-
561
- this._notifyWidthChange(idx, width)
562
- }).bind(this)
563
-
564
- var mouseupHandler = ((e: MouseEvent) => {
565
- document.removeEventListener('mousemove', mousemoveHandler)
566
- document.removeEventListener('mouseup', mouseupHandler)
567
-
568
- mousemoveHandler(e)
569
- }).bind(this)
570
-
571
- document.addEventListener('mousemove', mousemoveHandler)
572
- document.addEventListener('mouseup', mouseupHandler)
573
- }
574
- }