@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,58 +0,0 @@
1
- import { css } from 'lit'
2
-
3
- export const dataReportBodyStyle = css`
4
- :host {
5
- display: grid;
6
- grid-template-columns: var(--report-template-columns);
7
- grid-auto-rows: var(--report-record-height, min-content);
8
-
9
- overflow: auto;
10
- outline: none;
11
- }
12
-
13
- :host > [focused] {
14
- border: var(--report-record-focused-border);
15
- }
16
-
17
- :host > [focused-row] {
18
- background-color: var(--report-record-focused-background-color);
19
- }
20
-
21
- :host > [totalized] {
22
- background-color: var(--report-totalized-background-color);
23
- border-top: var(--report-totalized-border);
24
- border-bottom: var(--report-totalized-border);
25
- color: var(--report-totalized-color);
26
-
27
- font-weight: 700;
28
- }
29
-
30
- :host > [grouped] {
31
- background-color: var(--report-grouped-background-color);
32
- border-right: var(--report-grouped-border);
33
- border-bottom: var(--report-grouped-border);
34
- color: var(--report-grouped-color);
35
-
36
- font-weight: 600;
37
- }
38
-
39
- @media print {
40
- :host {
41
- -webkit-print-color-adjust: exact;
42
- grid-template-columns: var(--report-template-print-columns);
43
- }
44
- :host > [focused] {
45
- border-width: 0 1px 1px 0;
46
- border-right: var(--report-grouped-border);
47
- border-bottom: var(--report-grouped-border);
48
- }
49
-
50
- :host > [focused-row] {
51
- background-color: initial;
52
- color: #000;
53
- }
54
- :host > [grouped] {
55
- background-color: var(--report-grouped-background-color);
56
- }
57
- }
58
- `
@@ -1,189 +0,0 @@
1
- import './data-report-field'
2
-
3
- import { html, LitElement, PropertyValues } from 'lit'
4
- import { customElement, property } from 'lit/decorators.js'
5
-
6
- import { ZERO_CONFIG, ZERO_DATA } from '../configure/zero-config'
7
- import { ColumnConfig, GristConfig, GristData } from '../types'
8
- import { dataReportBodyStyle } from './data-report-body-style'
9
- import { dataReportBodyClickHandler } from './event-handlers/data-report-body-click-handler'
10
- import { dataReportBodyDblclickHandler } from './event-handlers/data-report-body-dblclick-handler'
11
- import { dataReportBodyKeydownHandler } from './event-handlers/data-report-body-keydown-handler'
12
-
13
- function calcScrollPos(parent: DataReportBody, child: Element) {
14
- /* getBoundingClientRect는 safari에서 스크롤 상태에서 다른 브라우저와는 다른 값을 리턴함 - 사파리는 약간 이상 작동함. */
15
- var { top: ct, left: cl, right: cr, bottom: cb } = child.getBoundingClientRect()
16
- var { top: pt, left: pl, right: pr, bottom: pb } = parent.getBoundingClientRect()
17
- var { scrollLeft, scrollTop } = parent
18
- var scrollbarWidth = parent.clientWidth - parent.offsetWidth
19
- var scrollbarHeight = parent.clientHeight - parent.offsetHeight
20
-
21
- return {
22
- left: cl < pl ? scrollLeft - (pl - cl) : cr > pr ? scrollLeft - (pr - cr) - scrollbarWidth : undefined,
23
- top: ct < pt ? scrollTop - (pt - ct) : cb > pb ? scrollTop - (pb - cb) - scrollbarHeight : undefined
24
- }
25
- }
26
-
27
- @customElement('ox-report-body')
28
- export class DataReportBody extends LitElement {
29
- static styles = [dataReportBodyStyle]
30
-
31
- @property({ type: Object }) config: GristConfig = ZERO_CONFIG
32
- @property({ type: Array }) columns: ColumnConfig[] = []
33
- @property({ type: Object }) data: GristData = ZERO_DATA
34
- @property({ type: Object }) focused?: { row: number; column: number }
35
-
36
- private _focusedListener?: EventListener
37
-
38
- render() {
39
- var { rows } = this.config
40
- var { groups } = rows || {}
41
-
42
- var getColumnIndex = (name: string) =>
43
- this.columns.filter(column => !column.hidden).findIndex(column => column.name == name)
44
- var getColumn = (name: string | number) => this.columns.find(column => column.name == name)
45
-
46
- var { row: focusedRow = 0, column: focusedColumn = 0 } = this.focused || {}
47
-
48
- var columns = (this.columns || []).filter(
49
- column => !column.hidden && groups.map(group => group.column).indexOf(column.name) == -1
50
- )
51
- var data = this.data
52
- var { records = [] } = data
53
-
54
- return html`
55
- ${records.map((record, idxRow) => {
56
- var attrFocusedRow = idxRow === focusedRow
57
- var totalic = record['*']
58
- var totalicColumn =
59
- totalic && (totalic.groupName == '*' ? getColumn(groups[0].column) : getColumn(totalic.groupName))
60
-
61
- return html`
62
- ${!totalic || (totalic && totalic.value)
63
- ? html`
64
- ${columns.map(column => {
65
- let columnIndex = getColumnIndex(column.name)
66
- return html`
67
- <ox-report-field
68
- .data=${data}
69
- .rowIndex=${idxRow}
70
- .columnIndex=${columnIndex}
71
- .column=${column}
72
- .record=${record}
73
- ?gutter=${column.type == 'gutter'}
74
- ?focused-row=${attrFocusedRow}
75
- ?focused=${attrFocusedRow && columnIndex === focusedColumn}
76
- ?totalized=${totalic}
77
- .value=${record[column.name]}
78
- ></ox-report-field>
79
- `
80
- })}
81
- <ox-report-field
82
- .data=${data}
83
- .rowIndex=${idxRow}
84
- .record=${record}
85
- ?focused-row=${attrFocusedRow}
86
- ?totalized=${totalic}
87
- ></ox-report-field>
88
- `
89
- : html``}
90
- ${!totalic
91
- ? html``
92
- : html`
93
- ${totalic.groupName == '*'
94
- ? html``
95
- : html`
96
- <ox-report-field
97
- .data=${data}
98
- .rowIndex=${totalic.row - 1}
99
- .columnIndex=${totalic.column - 1}
100
- .column=${totalicColumn}
101
- .record=${record}
102
- ?focused-row=${totalic.row - 1 <= focusedRow && totalic.row - 1 + totalic.rowspan > focusedRow}
103
- ?focused=${totalic.row - 1 === focusedRow && totalic.column - 1 === focusedColumn}
104
- ?grouped=${true}
105
- .value=${record[totalic.groupName]}
106
- .style="grid-area: ${totalic.row} / ${totalic.column} / span ${totalic.rowspan} / span 1;"
107
- ></ox-report-field>
108
- `}
109
- ${!totalic.value
110
- ? html``
111
- : html`
112
- <ox-report-field
113
- .data=${data}
114
- .rowIndex=${idxRow}
115
- .columnIndex=${totalic.column - 1}
116
- .column=${totalic.titleColumn}
117
- .record=${record}
118
- ?focused-row=${attrFocusedRow}
119
- ?focused=${idxRow === focusedRow && totalic.column - 1 === focusedColumn}
120
- ?grouped=${true}
121
- .value=${totalic.value}
122
- .style="grid-area: ${totalic.row +
123
- totalic.rowspan} / ${totalic.column} / span 1 / span ${totalic.colspan};"
124
- ></ox-report-field>
125
- `}
126
- `}
127
- `
128
- })}
129
- `
130
- }
131
-
132
- firstUpdated() {
133
- /* focus() 를 받을 수 있도록 함. */
134
- this.setAttribute('tabindex', '-1')
135
-
136
- /*
137
- * focusout 으로 property를 변경시키는 경우, focusout에 의해 update가 발생하는 경우에는,
138
- * 그리드 내부의 컴포넌트가 갱신되는 현상을 초래하게 된다.
139
- * 따라서, focusout 핸들러에서 update를 유발하는 코드는 강력하게 금지시킨다.
140
- */
141
- this.addEventListener('focusout', e => {
142
- if (this._focusedListener) {
143
- window.removeEventListener('keydown', this._focusedListener)
144
- delete this._focusedListener
145
- }
146
- })
147
-
148
- this.addEventListener('focusin', e => {
149
- if (!this._focusedListener) {
150
- this._focusedListener = dataReportBodyKeydownHandler.bind(this) as EventListener
151
- window.addEventListener('keydown', this._focusedListener)
152
- }
153
- })
154
-
155
- this.renderRoot.addEventListener('click', dataReportBodyClickHandler.bind(this))
156
- this.renderRoot.addEventListener('dblclick', dataReportBodyDblclickHandler.bind(this))
157
- }
158
-
159
- updated(changes: PropertyValues<this>) {
160
- if (changes.has('focused')) {
161
- let element = this.renderRoot.querySelector('[focused]')
162
- if (!element) {
163
- return
164
- }
165
-
166
- let { top, left } = calcScrollPos(this, element)
167
- // TODO this.scroll()을 사용하면, 효과가 좋으나 left 계산에 문제가 있는 것 같음.
168
- // this.scroll({
169
- // top,
170
- // left,
171
- // behavior: 'smooth'
172
- // })
173
- if (top !== undefined) {
174
- this.scrollTop = top
175
- }
176
- if (left !== undefined) {
177
- this.scrollLeft = left
178
- }
179
- }
180
- }
181
-
182
- focus() {
183
- super.focus()
184
-
185
- if (!this.focused || this.focused.row == null) {
186
- this.focused = { row: 0, column: 0 }
187
- }
188
- }
189
- }
@@ -1,138 +0,0 @@
1
- import './data-report-header'
2
- import './data-report-body'
3
-
4
- import { ColumnConfig, GristConfig, GristData } from '../types'
5
- import { LitElement, PropertyValues, css, html } from 'lit'
6
- import { ZERO_CONFIG, ZERO_DATA } from '../configure/zero-config'
7
- import { customElement, property, query } from 'lit/decorators.js'
8
-
9
- import { ScrollbarStyles } from '@operato/styles'
10
-
11
- /**
12
- * DataReportComponent
13
- */
14
-
15
- @customElement('ox-report-component')
16
- export class DataReportComponent extends LitElement {
17
- static styles = [
18
- ScrollbarStyles,
19
- css`
20
- :host {
21
- display: flex;
22
- flex-direction: column;
23
-
24
- overflow: hidden;
25
-
26
- border: 1px solid var(--report-header-border-color);
27
- border-radius: var(--report-component-border-radius);
28
- }
29
-
30
- ox-report-body {
31
- flex: 1;
32
- }
33
-
34
- @media print {
35
- :host {
36
- zoom: 80%;
37
- }
38
- }
39
- `
40
- ]
41
-
42
- @property({ type: Object }) config: GristConfig = ZERO_CONFIG
43
- @property({ type: Object }) data: GristData = ZERO_DATA
44
-
45
- private _widths: string = ''
46
-
47
- @query('ox-report-body', true) body!: HTMLElement
48
- @query('ox-report-header', true) header!: HTMLElement
49
-
50
- firstUpdated() {
51
- /* header and body scroll synchronization */
52
- this.header?.addEventListener('scroll', (e: Event) => {
53
- const body = this.body
54
- const header = this.header
55
- if (body && header) {
56
- if (body.scrollLeft !== header.scrollLeft) {
57
- body.scrollLeft = header.scrollLeft
58
- }
59
- }
60
- })
61
-
62
- this.body?.addEventListener('scroll', e => {
63
- const body = this.body
64
- const header = this.header
65
- if (body && header) {
66
- if (body.scrollLeft !== header.scrollLeft) {
67
- header.scrollLeft = body.scrollLeft
68
- }
69
- }
70
- })
71
- }
72
-
73
- updated(changes: PropertyValues<this>) {
74
- if (changes.has('config') || changes.has('data')) {
75
- /*
76
- * 데이타 내용에 따라 동적으로 컬럼의 폭이 달라지는 경우(예를 들면, sequence field)가 있으므로,
77
- * data의 변동에 대해서도 다시 계산되어야 한다.
78
- */
79
- this.calculateWidths(this.config && this.config.columns)
80
- }
81
- }
82
-
83
- calculateWidths(columns: ColumnConfig[]) {
84
- /*
85
- * 컬럼 모델 마지막에 'auto' cell을 추가하여, 자투리 영역을 꽉 채워서 표시한다.
86
- */
87
- this._widths = columns
88
- .filter(column => !column.hidden)
89
- .map(column => {
90
- switch (typeof column.width) {
91
- case 'number':
92
- return column.width + 'px'
93
- case 'string':
94
- return column.width
95
- case 'function':
96
- return column.width.call(this, column)
97
- default:
98
- return 'auto'
99
- }
100
- })
101
- .concat(['auto'])
102
- .join(' ')
103
-
104
- this.style.setProperty('--report-template-columns', this._widths)
105
- this.style.setProperty('--report-template-print-columns', this._widths.replace(/px/gi, 'fr'))
106
- }
107
-
108
- render() {
109
- var { columns } = this.config
110
-
111
- var data = this.data
112
-
113
- return html`
114
- <ox-report-header
115
- .config=${this.config}
116
- .columns=${columns}
117
- .data=${data}
118
- @column-width-change=${(e: CustomEvent) => {
119
- let { idx, width } = e.detail
120
- columns[idx].width = width
121
- this.calculateWidths(columns)
122
- }}
123
- ></ox-report-header>
124
-
125
- <ox-report-body .config=${this.config} .columns=${columns} .data=${data}></ox-report-body>
126
- `
127
- }
128
-
129
- focus() {
130
- super.focus()
131
-
132
- this.body.focus()
133
- }
134
-
135
- get pullToRefreshTarget() {
136
- return this.body
137
- }
138
- }
@@ -1,83 +0,0 @@
1
- import { ColumnConfig, GristRecord } from '../types'
2
- import { LitElement, PropertyValues, TemplateResult, css, html } from 'lit'
3
- import { ZERO_COLUMN, ZERO_RECORD } from '../configure/zero-config'
4
- import { customElement, property } from 'lit/decorators.js'
5
-
6
- const DEFAULT_TEXT_ALIGN = 'left'
7
-
8
- @customElement('ox-report-field')
9
- export class DataReportField extends LitElement {
10
- static styles = [
11
- css`
12
- :host {
13
- display: flex;
14
- align-items: center;
15
- justify-content: var(--data-report-field-justify-content, flex-start);
16
- position: relative;
17
-
18
- white-space: nowrap;
19
- overflow: hidden;
20
- background-color: var(--report-record-background-color);
21
- padding: var(--report-record-field-padding);
22
- border: 1px solid transparent;
23
- border-bottom: var(--report-record-field-border-bottom);
24
-
25
- font-size: var(--report-record-wide-fontsize);
26
- text-overflow: ellipsis;
27
-
28
- min-height: 30px;
29
- box-sizing: border-box;
30
- }
31
-
32
- :host([gutter]) * {
33
- cursor: default;
34
- font-size:1.2em;
35
- }
36
-
37
- * {
38
- flex: 1;
39
- margin: 0;
40
- text-align: var(--data-report-field-text-align);
41
- }
42
-
43
- *[center] {
44
- flex: none;
45
- margin: 0 auto;
46
- }
47
- `
48
- ]
49
-
50
- @property({ attribute: true }) align?: string
51
- @property({ type: Object }) record: GristRecord = ZERO_RECORD
52
- @property({ type: Object }) column: ColumnConfig = ZERO_COLUMN
53
- @property({ type: Number }) rowIndex: number = -1
54
- @property({ type: Number }) columnIndex: number = -1
55
- @property({ type: Object }) value: any
56
-
57
- render(): TemplateResult {
58
- if (!this.column) {
59
- return html``
60
- }
61
-
62
- var { value, column, record, rowIndex } = this
63
- var { renderer } = column.record
64
-
65
- return html` ${renderer(value, column, record, rowIndex, this)} `
66
- }
67
-
68
- updated(changes: PropertyValues<this>) {
69
- if (changes.has('column')) {
70
- var align = (this.column.record && this.column.record.align) || DEFAULT_TEXT_ALIGN
71
- if (align != DEFAULT_TEXT_ALIGN) {
72
- let justify = 'center'
73
- switch (align) {
74
- case 'right':
75
- justify = 'flex-end'
76
- break
77
- }
78
- this.style.setProperty('--data-report-field-justify-content', justify)
79
- this.style.setProperty('--data-report-field-text-align', align)
80
- }
81
- }
82
- }
83
- }
@@ -1,242 +0,0 @@
1
- import { css, html, LitElement, PropertyValues } from 'lit'
2
- import { customElement, property } from 'lit/decorators.js'
3
- import throttle from 'lodash-es/throttle'
4
-
5
- import { ZERO_CONFIG, ZERO_DATA } from '../configure/zero-config'
6
- import { ColumnConfig, GristConfig, GristData, SortersConfig } from '../types'
7
- import { supportsPassive } from '../utils'
8
-
9
- @customElement('ox-report-header')
10
- class DataReportHeader extends LitElement {
11
- static styles = [
12
- css`
13
- :host {
14
- display: grid;
15
- grid-template-columns: var(--report-template-columns);
16
-
17
- overflow: hidden;
18
- }
19
-
20
- div {
21
- display: flex;
22
-
23
- white-space: nowrap;
24
- overflow: hidden;
25
- background-color: var(--report-header-background-color, gray);
26
- border: 1px solid var(--report-header-border-color);
27
- border-width: 1px 1px 1px 0;
28
- padding: var(--report-header-padding);
29
-
30
- text-overflow: ellipsis;
31
- text-align: center;
32
- font-size: var(--report-header-fontsize, 1em);
33
- color: var(--report-header-color);
34
- }
35
-
36
- span {
37
- white-space: nowrap;
38
- overflow: hidden;
39
-
40
- text-align: center;
41
- }
42
-
43
- span[titler] {
44
- flex: 1;
45
- text-overflow: ellipsis;
46
- font: var(--report-header-font);
47
- color: var(--report-header-color);
48
- text-transform: capitalize;
49
- }
50
-
51
- span[sorter] {
52
- padding: 0;
53
- border: 0;
54
- font-size: 10px;
55
- }
56
-
57
- span[splitter] {
58
- cursor: col-resize;
59
- }
60
-
61
- @media print {
62
- :host {
63
- grid-template-columns: var(--report-template-print-columns);
64
- }
65
- }
66
- `
67
- ]
68
-
69
- @property({ type: Object }) config: GristConfig = ZERO_CONFIG
70
- @property({ type: Array }) columns: ColumnConfig[] = []
71
- @property({ type: Object }) data: GristData = ZERO_DATA
72
- @property({ type: Array }) private _sorters?: SortersConfig
73
-
74
- private throttledNotifier?: (idx: number, width: number) => void
75
-
76
- onWheelEvent(e: WheelEvent) {
77
- if (this.scrollWidth > this.clientWidth) {
78
- var delta = Math.max(-1, Math.min(1, e.deltaY || 0))
79
- this.scrollLeft = Math.max(0, this.scrollLeft - delta * 40)
80
-
81
- var maxScrollLeft = this.scrollWidth - this.clientWidth
82
-
83
- var atStart = this.scrollLeft === 0
84
- var atEnd = this.scrollLeft === maxScrollLeft
85
-
86
- // 스크롤이 맨 앞으로 와 있는 상태에서 휠을 올리는 경우 또는
87
- // 스크롤이 맨 끝으로 가 있는 상태에서 휠을 내리는 경우에만 디폴트 동작 허용
88
- if ((atStart && delta > 0) || (atEnd && delta < 0)) {
89
- return true
90
- }
91
-
92
- e.preventDefault()
93
- }
94
- }
95
-
96
- firstUpdated() {
97
- this.addEventListener('wheel', this.onWheelEvent.bind(this))
98
- }
99
-
100
- async updated(changed: PropertyValues<this>) {
101
- if (changed.has('config')) {
102
- this._sorters = this.config.sorters || []
103
- }
104
- }
105
-
106
- render() {
107
- var columns = this.columns || []
108
-
109
- return html`
110
- ${columns.map((column, idx) =>
111
- !column.hidden
112
- ? html`
113
- <div @dragstart=${(e: MouseEvent) => this._dragStart(e, idx)}>
114
- <span titler @click=${(e: Event) => this._changeSort(column)}>${this._renderHeader(column)} </span>
115
-
116
- ${column.sortable
117
- ? html`
118
- <span sorter @click=${(e: Event) => this._changeSort(column)}>
119
- ${this._renderSortHeader(column)}
120
- </span>
121
- `
122
- : html``}
123
- ${column.resizable !== false ? html` <span splitter draggable="true">&nbsp;</span> ` : html``}
124
- </div>
125
- `
126
- : html``
127
- )}
128
-
129
- <div></div>
130
- `
131
- }
132
-
133
- _renderHeader(column: ColumnConfig) {
134
- var { renderer } = column.header || {}
135
- var title = renderer.call(this, column)
136
-
137
- return html` ${title} `
138
- }
139
-
140
- _renderSortHeader(column: ColumnConfig) {
141
- if (column.hidden) {
142
- return html``
143
- }
144
-
145
- var sorters = this._sorters || []
146
-
147
- var sorter = sorters.find(sorter => column.type !== 'gutter' && column.name == sorter.name)
148
- if (!sorter) {
149
- return html``
150
- }
151
-
152
- if (sorters.length > 1) {
153
- var rank = sorters.indexOf(sorter) + 1
154
- return sorter.desc ? html` &#9660;<sub>${rank}</sub> ` : html` &#9650;<sub>${rank}</sub> `
155
- } else {
156
- return sorter.desc ? html` &#9660; ` : html` &#9650; `
157
- }
158
- }
159
-
160
- _changeSort(column: ColumnConfig) {
161
- if (!column.sortable) {
162
- return
163
- }
164
-
165
- var sorters = [...(this._sorters || [])]
166
-
167
- var idx = sorters.findIndex(sorter => sorter.name == column.name)
168
- if (idx !== -1) {
169
- let sorter = sorters[idx]
170
- if (sorter.desc) {
171
- sorters.splice(idx, 1)
172
- } else {
173
- sorter.desc = true
174
- }
175
- } else {
176
- var sorter = {
177
- name: column.name
178
- }
179
-
180
- sorters.push(sorter)
181
- }
182
-
183
- this._sorters = sorters
184
-
185
- this.dispatchEvent(
186
- new CustomEvent('fetch-params-change', {
187
- bubbles: true,
188
- composed: true,
189
- detail: {
190
- sorters: this._sorters,
191
- from: 'data-report-header'
192
- }
193
- })
194
- )
195
- }
196
-
197
- _notifyWidthChange(idx: number, width: number) {
198
- if (!this.throttledNotifier) {
199
- this.throttledNotifier = throttle((idx, width) => {
200
- this.dispatchEvent(
201
- new CustomEvent('column-width-change', {
202
- bubbles: true,
203
- composed: true,
204
- detail: {
205
- idx,
206
- width
207
- }
208
- })
209
- )
210
- }, 100)
211
- }
212
-
213
- this.throttledNotifier(idx, width)
214
- }
215
-
216
- _dragStart(e: MouseEvent, idx: number) {
217
- var target = e.currentTarget as HTMLElement
218
- var startX = e.offsetX
219
-
220
- var dragHandler = ((e: MouseEvent) => {
221
- let column = this.columns[idx]
222
-
223
- let width = Math.max(0, Number(column.width) + e.offsetX - startX)
224
- if (width == 0) {
225
- /* CLARIFY-ME 왜 마지막 이벤트의 offsetX로 음수 값이 오는가 */
226
- return
227
- }
228
-
229
- this._notifyWidthChange(idx, width)
230
- }).bind(this)
231
-
232
- var dragEndHandler = ((e: MouseEvent) => {
233
- target.removeEventListener('drag', dragHandler)
234
- target.removeEventListener('dragend', dragEndHandler)
235
-
236
- dragHandler(e)
237
- }).bind(this)
238
-
239
- target.addEventListener('drag', dragHandler)
240
- target.addEventListener('dragend', dragEndHandler)
241
- }
242
- }