@operato/data-grist 8.0.0-alpha.8 → 8.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/CHANGELOG.md +186 -0
  2. package/dist/src/data-grid/data-grid-body.js +21 -7
  3. package/dist/src/data-grid/data-grid-body.js.map +1 -1
  4. package/dist/src/data-grid/data-grid-footer.js +2 -0
  5. package/dist/src/data-grid/data-grid-footer.js.map +1 -1
  6. package/dist/src/data-grid/data-grid-header.d.ts +1 -1
  7. package/dist/src/data-grid/data-grid-header.js +13 -9
  8. package/dist/src/data-grid/data-grid-header.js.map +1 -1
  9. package/dist/src/editors/ox-grist-editor-varname.d.ts +6 -0
  10. package/dist/src/editors/ox-grist-editor-varname.js +36 -0
  11. package/dist/src/editors/ox-grist-editor-varname.js.map +1 -0
  12. package/dist/src/editors/ox-grist-editor.js +3 -3
  13. package/dist/src/editors/ox-grist-editor.js.map +1 -1
  14. package/dist/src/editors/registry.js +3 -1
  15. package/dist/src/editors/registry.js.map +1 -1
  16. package/dist/src/gutters/gutter-sequence.d.ts +1 -1
  17. package/dist/src/record-view/index.d.ts +1 -1
  18. package/dist/src/record-view/index.js +1 -1
  19. package/dist/src/record-view/index.js.map +1 -1
  20. package/dist/src/record-view/{record-creator.d.ts → ox-record-creator.d.ts} +8 -4
  21. package/dist/src/record-view/{record-creator.js → ox-record-creator.js} +90 -34
  22. package/dist/src/record-view/ox-record-creator.js.map +1 -0
  23. package/dist/src/renderers/ox-grist-renderer-boolean.js +1 -1
  24. package/dist/src/renderers/ox-grist-renderer-boolean.js.map +1 -1
  25. package/dist/stories/accumulator-format.stories.d.ts +1 -1
  26. package/dist/stories/accumulator-format.stories.js +1 -1
  27. package/dist/stories/accumulator-format.stories.js.map +1 -1
  28. package/dist/stories/click-event-custom.stories.d.ts +45 -0
  29. package/dist/stories/click-event-custom.stories.js +247 -0
  30. package/dist/stories/click-event-custom.stories.js.map +1 -0
  31. package/dist/stories/click-event.stories.d.ts +1 -1
  32. package/dist/stories/click-event.stories.js +1 -1
  33. package/dist/stories/click-event.stories.js.map +1 -1
  34. package/dist/stories/fixed-column.stories.d.ts +1 -1
  35. package/dist/stories/fixed-column.stories.js +1 -1
  36. package/dist/stories/fixed-column.stories.js.map +1 -1
  37. package/dist/stories/grid-setting.stories.d.ts +1 -1
  38. package/dist/stories/grid-setting.stories.js +1 -1
  39. package/dist/stories/grid-setting.stories.js.map +1 -1
  40. package/dist/stories/grist-modes.stories.d.ts +1 -1
  41. package/dist/stories/grist-modes.stories.js +1 -1
  42. package/dist/stories/grist-modes.stories.js.map +1 -1
  43. package/dist/stories/group-header.stories.d.ts +1 -1
  44. package/dist/stories/group-header.stories.js +1 -1
  45. package/dist/stories/group-header.stories.js.map +1 -1
  46. package/dist/stories/textarea.stories.d.ts +1 -1
  47. package/dist/stories/textarea.stories.js +1 -1
  48. package/dist/stories/textarea.stories.js.map +1 -1
  49. package/dist/stories/tree-column-with-checkbox.stories.d.ts +1 -1
  50. package/dist/stories/tree-column-with-checkbox.stories.js +1 -1
  51. package/dist/stories/tree-column-with-checkbox.stories.js.map +1 -1
  52. package/dist/stories/tree-column.stories.d.ts +1 -1
  53. package/dist/stories/tree-column.stories.js +1 -1
  54. package/dist/stories/tree-column.stories.js.map +1 -1
  55. package/dist/tsconfig.tsbuildinfo +1 -1
  56. package/package.json +20 -20
  57. package/themes/calendar-theme.css +3 -1
  58. package/.storybook/main.js +0 -3
  59. package/.storybook/preview.js +0 -52
  60. package/.storybook/server.mjs +0 -8
  61. package/dist/src/record-view/record-creator.js.map +0 -1
  62. package/src/accumulator/accumulator.ts +0 -63
  63. package/src/configure/column-builder.ts +0 -114
  64. package/src/configure/config-builder.ts +0 -40
  65. package/src/configure/filters-option-builder.ts +0 -8
  66. package/src/configure/imex-option-builder.ts +0 -5
  67. package/src/configure/list-option-builder.ts +0 -9
  68. package/src/configure/rows-option-builder.ts +0 -38
  69. package/src/configure/tree-option-builder.ts +0 -22
  70. package/src/configure/zero-config.ts +0 -83
  71. package/src/const.ts +0 -1
  72. package/src/data-card/data-card-field.ts +0 -94
  73. package/src/data-card/data-card-gutter-menu.ts +0 -94
  74. package/src/data-card/data-card-gutter.ts +0 -103
  75. package/src/data-card/data-card.ts +0 -154
  76. package/src/data-card/event-handlers/record-card-click-handler.ts +0 -34
  77. package/src/data-card/event-handlers/record-card-dblclick-handler.ts +0 -34
  78. package/src/data-card/record-card.ts +0 -298
  79. package/src/data-consumer.ts +0 -11
  80. package/src/data-grid/data-grid-accum-field.ts +0 -109
  81. package/src/data-grid/data-grid-body-style.ts +0 -85
  82. package/src/data-grid/data-grid-body.ts +0 -749
  83. package/src/data-grid/data-grid-field.ts +0 -227
  84. package/src/data-grid/data-grid-footer.ts +0 -117
  85. package/src/data-grid/data-grid-header.ts +0 -574
  86. package/src/data-grid/data-grid.ts +0 -293
  87. package/src/data-grid/event-handlers/data-grid-body-click-handler.ts +0 -69
  88. package/src/data-grid/event-handlers/data-grid-body-contextmenu-handler.ts +0 -32
  89. package/src/data-grid/event-handlers/data-grid-body-dblclick-handler.ts +0 -42
  90. package/src/data-grid/event-handlers/data-grid-body-focus-change-handler.ts +0 -24
  91. package/src/data-grid/event-handlers/data-grid-body-keydown-handler.ts +0 -234
  92. package/src/data-grist.ts +0 -1233
  93. package/src/data-list/data-list-field.ts +0 -82
  94. package/src/data-list/data-list-gutter.ts +0 -108
  95. package/src/data-list/data-list.ts +0 -145
  96. package/src/data-list/event-handlers/record-partial-click-handler.ts +0 -34
  97. package/src/data-list/event-handlers/record-partial-dblclick-handler.ts +0 -33
  98. package/src/data-list/event-handlers/record-partial-long-press-handler.ts +0 -33
  99. package/src/data-list/record-partial.ts +0 -264
  100. package/src/data-manipulator.ts +0 -426
  101. package/src/data-provider.ts +0 -271
  102. package/src/data-report/data-report-body-style.ts +0 -58
  103. package/src/data-report/data-report-body.ts +0 -189
  104. package/src/data-report/data-report-component.ts +0 -138
  105. package/src/data-report/data-report-field.ts +0 -83
  106. package/src/data-report/data-report-header.ts +0 -242
  107. package/src/data-report/event-handlers/data-report-body-click-handler.ts +0 -38
  108. package/src/data-report/event-handlers/data-report-body-dblclick-handler.ts +0 -25
  109. package/src/data-report/event-handlers/data-report-body-keydown-handler.ts +0 -68
  110. package/src/data-report.ts +0 -424
  111. package/src/editors/index.ts +0 -4
  112. package/src/editors/ox-grist-editor-checkbox.ts +0 -28
  113. package/src/editors/ox-grist-editor-color.ts +0 -10
  114. package/src/editors/ox-grist-editor-date.ts +0 -10
  115. package/src/editors/ox-grist-editor-datetime.ts +0 -27
  116. package/src/editors/ox-grist-editor-email.ts +0 -10
  117. package/src/editors/ox-grist-editor-file.ts +0 -28
  118. package/src/editors/ox-grist-editor-image.ts +0 -31
  119. package/src/editors/ox-grist-editor-month.ts +0 -10
  120. package/src/editors/ox-grist-editor-multiple-select.ts +0 -57
  121. package/src/editors/ox-grist-editor-number.ts +0 -27
  122. package/src/editors/ox-grist-editor-password.ts +0 -10
  123. package/src/editors/ox-grist-editor-select.ts +0 -55
  124. package/src/editors/ox-grist-editor-tel.ts +0 -10
  125. package/src/editors/ox-grist-editor-text.ts +0 -14
  126. package/src/editors/ox-grist-editor-textarea.ts +0 -16
  127. package/src/editors/ox-grist-editor-time.ts +0 -10
  128. package/src/editors/ox-grist-editor-tree.ts +0 -27
  129. package/src/editors/ox-grist-editor-week.ts +0 -10
  130. package/src/editors/ox-grist-editor.ts +0 -207
  131. package/src/editors/ox-input-tree.ts +0 -226
  132. package/src/editors/registry.ts +0 -80
  133. package/src/empty-note.ts +0 -46
  134. package/src/filters/filter-checkbox.ts +0 -49
  135. package/src/filters/filter-input-barcode.ts +0 -34
  136. package/src/filters/filter-input.ts +0 -30
  137. package/src/filters/filter-range-date.ts +0 -81
  138. package/src/filters/filter-range-number.ts +0 -64
  139. package/src/filters/filter-select-buttons.ts +0 -60
  140. package/src/filters/filter-select.ts +0 -68
  141. package/src/filters/filter-styles.ts +0 -119
  142. package/src/filters/filters-form.ts +0 -476
  143. package/src/filters/index.ts +0 -10
  144. package/src/filters/registry.ts +0 -56
  145. package/src/formatters/date-formatter.ts +0 -3
  146. package/src/formatters/index.ts +0 -1
  147. package/src/formatters/number-formatter.ts +0 -3
  148. package/src/formatters/registry.ts +0 -30
  149. package/src/formatters/text-formatter.ts +0 -3
  150. package/src/gutters/gutter-button.ts +0 -51
  151. package/src/gutters/gutter-dirty.ts +0 -96
  152. package/src/gutters/gutter-row-selector.ts +0 -89
  153. package/src/gutters/gutter-sequence.ts +0 -54
  154. package/src/gutters/index.ts +0 -1
  155. package/src/gutters/registry.ts +0 -32
  156. package/src/handlers/contextmenu-tree-mutation.ts +0 -80
  157. package/src/handlers/index.ts +0 -1
  158. package/src/handlers/move-down.ts +0 -44
  159. package/src/handlers/move-up.ts +0 -44
  160. package/src/handlers/record-copy.ts +0 -38
  161. package/src/handlers/record-delete.ts +0 -30
  162. package/src/handlers/record-view-handler.ts +0 -27
  163. package/src/handlers/registry.ts +0 -42
  164. package/src/handlers/select-row-toggle.ts +0 -30
  165. package/src/handlers/select-row.ts +0 -27
  166. package/src/index.ts +0 -17
  167. package/src/personalizer/index.ts +0 -1
  168. package/src/personalizer/ox-grist-filter-personalizer.ts +0 -192
  169. package/src/personalizer/ox-grist-personalizer.ts +0 -226
  170. package/src/record-view/event-handlers/record-view-body-click-handler.ts +0 -33
  171. package/src/record-view/event-handlers/record-view-body-keydown-handler.ts +0 -26
  172. package/src/record-view/index.ts +0 -2
  173. package/src/record-view/record-creator.ts +0 -226
  174. package/src/record-view/record-view-body.ts +0 -257
  175. package/src/record-view/record-view-handler.ts +0 -86
  176. package/src/record-view/record-view.ts +0 -122
  177. package/src/renderers/index.ts +0 -14
  178. package/src/renderers/ox-grist-renderer-boolean.ts +0 -43
  179. package/src/renderers/ox-grist-renderer-color.ts +0 -15
  180. package/src/renderers/ox-grist-renderer-date.ts +0 -62
  181. package/src/renderers/ox-grist-renderer-file.ts +0 -31
  182. package/src/renderers/ox-grist-renderer-image.ts +0 -27
  183. package/src/renderers/ox-grist-renderer-json5.ts +0 -36
  184. package/src/renderers/ox-grist-renderer-link.ts +0 -17
  185. package/src/renderers/ox-grist-renderer-password.ts +0 -7
  186. package/src/renderers/ox-grist-renderer-progress.ts +0 -45
  187. package/src/renderers/ox-grist-renderer-select.ts +0 -58
  188. package/src/renderers/ox-grist-renderer-text.ts +0 -16
  189. package/src/renderers/ox-grist-renderer-textarea.ts +0 -7
  190. package/src/renderers/ox-grist-renderer-tree.ts +0 -189
  191. package/src/renderers/ox-grist-renderer.ts +0 -35
  192. package/src/renderers/registry.ts +0 -111
  193. package/src/sorters/sorters-control.ts +0 -143
  194. package/src/types.ts +0 -813
  195. package/src/utils/index.ts +0 -2
  196. package/src/utils/list-param.ts +0 -72
  197. package/src/utils/supports-passive.ts +0 -13
  198. package/stories/accumulator-format.stories.ts +0 -276
  199. package/stories/barcode-input-filter.stories.ts +0 -216
  200. package/stories/bounded-select-filters.stories.ts +0 -333
  201. package/stories/bounded-select-record.stories.ts +0 -336
  202. package/stories/click-event.stories.ts +0 -283
  203. package/stories/creatable-only-column.stories.ts +0 -253
  204. package/stories/default-filters.stories.ts +0 -241
  205. package/stories/dynamic-editable.stories.ts +0 -313
  206. package/stories/empty-sorters.stories.ts +0 -180
  207. package/stories/explicit-fetch.stories.ts +0 -186
  208. package/stories/fixed-column.stories.ts +0 -416
  209. package/stories/grid-setting.stories.ts +0 -501
  210. package/stories/grist-modes.stories.ts +0 -451
  211. package/stories/group-header.stories.ts +0 -442
  212. package/stories/record-view.stories.ts +0 -143
  213. package/stories/textarea.stories.ts +0 -261
  214. package/stories/tree-column-with-checkbox.stories.ts +0 -297
  215. package/stories/tree-column.stories.ts +0 -296
  216. package/tsconfig.json +0 -26
  217. package/web-dev-server.config.mjs +0 -27
  218. 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
- }