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