@operato/data-grist 7.1.31 → 7.1.32

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 (173) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/tsconfig.tsbuildinfo +1 -1
  3. package/package.json +10 -10
  4. package/.storybook/main.js +0 -3
  5. package/.storybook/preview.js +0 -52
  6. package/.storybook/server.mjs +0 -8
  7. package/demo/data-grist-test.html +0 -468
  8. package/demo/favicon.ico +0 -0
  9. package/demo/index.html +0 -541
  10. package/demo/report-test.html +0 -249
  11. package/dist/src/record-view/record-creator.d.ts +0 -17
  12. package/dist/src/record-view/record-creator.js +0 -148
  13. package/dist/src/record-view/record-creator.js.map +0 -1
  14. package/src/accumulator/accumulator.ts +0 -63
  15. package/src/configure/column-builder.ts +0 -114
  16. package/src/configure/config-builder.ts +0 -40
  17. package/src/configure/filters-option-builder.ts +0 -8
  18. package/src/configure/imex-option-builder.ts +0 -5
  19. package/src/configure/list-option-builder.ts +0 -9
  20. package/src/configure/rows-option-builder.ts +0 -38
  21. package/src/configure/tree-option-builder.ts +0 -22
  22. package/src/configure/zero-config.ts +0 -83
  23. package/src/const.ts +0 -1
  24. package/src/data-card/data-card-field.ts +0 -94
  25. package/src/data-card/data-card-gutter-menu.ts +0 -94
  26. package/src/data-card/data-card-gutter.ts +0 -103
  27. package/src/data-card/data-card.ts +0 -154
  28. package/src/data-card/event-handlers/record-card-click-handler.ts +0 -34
  29. package/src/data-card/event-handlers/record-card-dblclick-handler.ts +0 -34
  30. package/src/data-card/record-card.ts +0 -289
  31. package/src/data-consumer.ts +0 -11
  32. package/src/data-grid/data-grid-accum-field.ts +0 -109
  33. package/src/data-grid/data-grid-body-style.ts +0 -99
  34. package/src/data-grid/data-grid-body.ts +0 -753
  35. package/src/data-grid/data-grid-field.ts +0 -236
  36. package/src/data-grid/data-grid-footer.ts +0 -117
  37. package/src/data-grid/data-grid-header.ts +0 -574
  38. package/src/data-grid/data-grid.ts +0 -293
  39. package/src/data-grid/event-handlers/data-grid-body-click-handler.ts +0 -69
  40. package/src/data-grid/event-handlers/data-grid-body-contextmenu-handler.ts +0 -32
  41. package/src/data-grid/event-handlers/data-grid-body-dblclick-handler.ts +0 -42
  42. package/src/data-grid/event-handlers/data-grid-body-focus-change-handler.ts +0 -24
  43. package/src/data-grid/event-handlers/data-grid-body-keydown-handler.ts +0 -234
  44. package/src/data-grist.ts +0 -1233
  45. package/src/data-list/data-list-field.ts +0 -82
  46. package/src/data-list/data-list-gutter.ts +0 -108
  47. package/src/data-list/data-list.ts +0 -145
  48. package/src/data-list/event-handlers/record-partial-click-handler.ts +0 -34
  49. package/src/data-list/event-handlers/record-partial-dblclick-handler.ts +0 -33
  50. package/src/data-list/event-handlers/record-partial-long-press-handler.ts +0 -33
  51. package/src/data-list/record-partial.ts +0 -255
  52. package/src/data-manipulator.ts +0 -426
  53. package/src/data-provider.ts +0 -271
  54. package/src/data-report/data-report-body-style.ts +0 -58
  55. package/src/data-report/data-report-body.ts +0 -189
  56. package/src/data-report/data-report-component.ts +0 -138
  57. package/src/data-report/data-report-field.ts +0 -83
  58. package/src/data-report/data-report-header.ts +0 -242
  59. package/src/data-report/event-handlers/data-report-body-click-handler.ts +0 -38
  60. package/src/data-report/event-handlers/data-report-body-dblclick-handler.ts +0 -25
  61. package/src/data-report/event-handlers/data-report-body-keydown-handler.ts +0 -68
  62. package/src/data-report.ts +0 -424
  63. package/src/editors/index.ts +0 -4
  64. package/src/editors/ox-grist-editor-checkbox.ts +0 -28
  65. package/src/editors/ox-grist-editor-color.ts +0 -10
  66. package/src/editors/ox-grist-editor-date.ts +0 -10
  67. package/src/editors/ox-grist-editor-datetime.ts +0 -27
  68. package/src/editors/ox-grist-editor-email.ts +0 -10
  69. package/src/editors/ox-grist-editor-file.ts +0 -28
  70. package/src/editors/ox-grist-editor-image.ts +0 -31
  71. package/src/editors/ox-grist-editor-month.ts +0 -10
  72. package/src/editors/ox-grist-editor-multiple-select.ts +0 -57
  73. package/src/editors/ox-grist-editor-number.ts +0 -27
  74. package/src/editors/ox-grist-editor-password.ts +0 -10
  75. package/src/editors/ox-grist-editor-select.ts +0 -55
  76. package/src/editors/ox-grist-editor-tel.ts +0 -10
  77. package/src/editors/ox-grist-editor-text.ts +0 -14
  78. package/src/editors/ox-grist-editor-textarea.ts +0 -16
  79. package/src/editors/ox-grist-editor-time.ts +0 -10
  80. package/src/editors/ox-grist-editor-tree.ts +0 -27
  81. package/src/editors/ox-grist-editor-varname.ts +0 -36
  82. package/src/editors/ox-grist-editor-week.ts +0 -10
  83. package/src/editors/ox-grist-editor.ts +0 -207
  84. package/src/editors/ox-input-tree.ts +0 -226
  85. package/src/editors/registry.ts +0 -82
  86. package/src/empty-note.ts +0 -46
  87. package/src/filters/filter-checkbox.ts +0 -49
  88. package/src/filters/filter-input-barcode.ts +0 -34
  89. package/src/filters/filter-input.ts +0 -30
  90. package/src/filters/filter-range-date.ts +0 -81
  91. package/src/filters/filter-range-number.ts +0 -64
  92. package/src/filters/filter-select-buttons.ts +0 -60
  93. package/src/filters/filter-select.ts +0 -68
  94. package/src/filters/filter-styles.ts +0 -119
  95. package/src/filters/filters-form.ts +0 -476
  96. package/src/filters/index.ts +0 -10
  97. package/src/filters/registry.ts +0 -56
  98. package/src/formatters/date-formatter.ts +0 -3
  99. package/src/formatters/index.ts +0 -1
  100. package/src/formatters/number-formatter.ts +0 -3
  101. package/src/formatters/registry.ts +0 -30
  102. package/src/formatters/text-formatter.ts +0 -3
  103. package/src/gutters/gutter-button.ts +0 -51
  104. package/src/gutters/gutter-dirty.ts +0 -96
  105. package/src/gutters/gutter-row-selector.ts +0 -89
  106. package/src/gutters/gutter-sequence.ts +0 -54
  107. package/src/gutters/index.ts +0 -1
  108. package/src/gutters/registry.ts +0 -32
  109. package/src/handlers/contextmenu-tree-mutation.ts +0 -80
  110. package/src/handlers/index.ts +0 -1
  111. package/src/handlers/move-down.ts +0 -44
  112. package/src/handlers/move-up.ts +0 -44
  113. package/src/handlers/record-copy.ts +0 -38
  114. package/src/handlers/record-delete.ts +0 -30
  115. package/src/handlers/record-view-handler.ts +0 -27
  116. package/src/handlers/registry.ts +0 -42
  117. package/src/handlers/select-row-toggle.ts +0 -30
  118. package/src/handlers/select-row.ts +0 -27
  119. package/src/index.ts +0 -17
  120. package/src/personalizer/index.ts +0 -1
  121. package/src/personalizer/ox-grist-filter-personalizer.ts +0 -192
  122. package/src/personalizer/ox-grist-personalizer.ts +0 -226
  123. package/src/record-view/event-handlers/record-view-body-click-handler.ts +0 -33
  124. package/src/record-view/event-handlers/record-view-body-keydown-handler.ts +0 -26
  125. package/src/record-view/index.ts +0 -2
  126. package/src/record-view/ox-record-creator.ts +0 -289
  127. package/src/record-view/record-view-body.ts +0 -250
  128. package/src/record-view/record-view-handler.ts +0 -86
  129. package/src/record-view/record-view.ts +0 -122
  130. package/src/renderers/index.ts +0 -14
  131. package/src/renderers/ox-grist-renderer-boolean.ts +0 -43
  132. package/src/renderers/ox-grist-renderer-color.ts +0 -15
  133. package/src/renderers/ox-grist-renderer-date.ts +0 -62
  134. package/src/renderers/ox-grist-renderer-file.ts +0 -31
  135. package/src/renderers/ox-grist-renderer-image.ts +0 -27
  136. package/src/renderers/ox-grist-renderer-json5.ts +0 -36
  137. package/src/renderers/ox-grist-renderer-link.ts +0 -17
  138. package/src/renderers/ox-grist-renderer-password.ts +0 -7
  139. package/src/renderers/ox-grist-renderer-progress.ts +0 -45
  140. package/src/renderers/ox-grist-renderer-select.ts +0 -58
  141. package/src/renderers/ox-grist-renderer-text.ts +0 -16
  142. package/src/renderers/ox-grist-renderer-textarea.ts +0 -7
  143. package/src/renderers/ox-grist-renderer-tree.ts +0 -189
  144. package/src/renderers/ox-grist-renderer.ts +0 -35
  145. package/src/renderers/registry.ts +0 -111
  146. package/src/sorters/sorters-control.ts +0 -143
  147. package/src/types.ts +0 -813
  148. package/src/utils/index.ts +0 -2
  149. package/src/utils/list-param.ts +0 -72
  150. package/src/utils/supports-passive.ts +0 -13
  151. package/stories/accumulator-format.stories.ts +0 -276
  152. package/stories/barcode-input-filter.stories.ts +0 -216
  153. package/stories/bounded-select-filters.stories.ts +0 -333
  154. package/stories/bounded-select-record.stories.ts +0 -336
  155. package/stories/click-event-custom.stories.ts +0 -288
  156. package/stories/click-event.stories.ts +0 -283
  157. package/stories/creatable-only-column.stories.ts +0 -253
  158. package/stories/default-filters.stories.ts +0 -241
  159. package/stories/dynamic-editable.stories.ts +0 -313
  160. package/stories/empty-sorters.stories.ts +0 -180
  161. package/stories/explicit-fetch.stories.ts +0 -186
  162. package/stories/fixed-column.stories.ts +0 -416
  163. package/stories/grid-setting.stories.ts +0 -501
  164. package/stories/grist-modes.stories.ts +0 -451
  165. package/stories/group-header.stories.ts +0 -442
  166. package/stories/record-view.stories.ts +0 -143
  167. package/stories/textarea.stories.ts +0 -261
  168. package/stories/tree-column-with-checkbox.stories.ts +0 -297
  169. package/stories/tree-column.stories.ts +0 -296
  170. package/tsconfig.json +0 -26
  171. package/web-dev-server.config.mjs +0 -27
  172. package/web-test-runner.config.mjs +0 -45
  173. package/yarn-error.log +0 -16971
@@ -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
- }