@operato/data-grist 2.0.0-alpha.0 → 2.0.0-alpha.11

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 (100) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/dist/src/accumulator/accumulator.js +4 -4
  3. package/dist/src/accumulator/accumulator.js.map +1 -1
  4. package/dist/src/configure/column-builder.js +5 -5
  5. package/dist/src/configure/column-builder.js.map +1 -1
  6. package/dist/src/configure/zero-config.js +3 -1
  7. package/dist/src/configure/zero-config.js.map +1 -1
  8. package/dist/src/data-card/data-card-field.js +1 -1
  9. package/dist/src/data-card/data-card-field.js.map +1 -1
  10. package/dist/src/data-grid/data-grid-accum-field.d.ts +1 -0
  11. package/dist/src/data-grid/data-grid-accum-field.js +8 -0
  12. package/dist/src/data-grid/data-grid-accum-field.js.map +1 -1
  13. package/dist/src/data-grid/data-grid-body.js +24 -3
  14. package/dist/src/data-grid/data-grid-body.js.map +1 -1
  15. package/dist/src/data-grid/data-grid-field.d.ts +1 -0
  16. package/dist/src/data-grid/data-grid-field.js +5 -0
  17. package/dist/src/data-grid/data-grid-field.js.map +1 -1
  18. package/dist/src/data-grid/data-grid-header.d.ts +1 -0
  19. package/dist/src/data-grid/data-grid-header.js +16 -14
  20. package/dist/src/data-grid/data-grid-header.js.map +1 -1
  21. package/dist/src/data-grid/event-handlers/data-grid-body-click-handler.js +2 -2
  22. package/dist/src/data-grid/event-handlers/data-grid-body-click-handler.js.map +1 -1
  23. package/dist/src/data-grid/event-handlers/data-grid-body-contextmenu-handler.d.ts +7 -0
  24. package/dist/src/data-grid/event-handlers/data-grid-body-contextmenu-handler.js +25 -0
  25. package/dist/src/data-grid/event-handlers/data-grid-body-contextmenu-handler.js.map +1 -0
  26. package/dist/src/data-grid/event-handlers/data-grid-body-dblclick-handler.js +2 -2
  27. package/dist/src/data-grid/event-handlers/data-grid-body-dblclick-handler.js.map +1 -1
  28. package/dist/src/data-grid/event-handlers/data-grid-body-focus-change-handler.js +2 -2
  29. package/dist/src/data-grid/event-handlers/data-grid-body-focus-change-handler.js.map +1 -1
  30. package/dist/src/data-grist.d.ts +225 -3
  31. package/dist/src/data-grist.js +195 -3
  32. package/dist/src/data-grist.js.map +1 -1
  33. package/dist/src/data-list/data-list-field.js +1 -1
  34. package/dist/src/data-list/data-list-field.js.map +1 -1
  35. package/dist/src/data-manipulator.d.ts +7 -3
  36. package/dist/src/data-manipulator.js +103 -20
  37. package/dist/src/data-manipulator.js.map +1 -1
  38. package/dist/src/editors/ox-grist-editor-tree.d.ts +6 -0
  39. package/dist/src/editors/ox-grist-editor-tree.js +27 -0
  40. package/dist/src/editors/ox-grist-editor-tree.js.map +1 -0
  41. package/dist/src/editors/ox-grist-editor.d.ts +1 -0
  42. package/dist/src/editors/ox-grist-editor.js +3 -0
  43. package/dist/src/editors/ox-grist-editor.js.map +1 -1
  44. package/dist/src/editors/ox-input-tree.d.ts +20 -0
  45. package/dist/src/editors/ox-input-tree.js +221 -0
  46. package/dist/src/editors/ox-input-tree.js.map +1 -0
  47. package/dist/src/editors/registry.js +3 -1
  48. package/dist/src/editors/registry.js.map +1 -1
  49. package/dist/src/filters/filters-form.js +1 -1
  50. package/dist/src/filters/filters-form.js.map +1 -1
  51. package/dist/src/handlers/contextmenu-tree-mutation.d.ts +3 -0
  52. package/dist/src/handlers/contextmenu-tree-mutation.js +82 -0
  53. package/dist/src/handlers/contextmenu-tree-mutation.js.map +1 -0
  54. package/dist/src/handlers/registry.js +3 -1
  55. package/dist/src/handlers/registry.js.map +1 -1
  56. package/dist/src/renderers/ox-grist-renderer-tree.d.ts +1 -0
  57. package/dist/src/renderers/ox-grist-renderer-tree.js +6 -3
  58. package/dist/src/renderers/ox-grist-renderer-tree.js.map +1 -1
  59. package/dist/src/types.d.ts +437 -6
  60. package/dist/src/types.js +9 -0
  61. package/dist/src/types.js.map +1 -1
  62. package/dist/stories/accumulator.stories.js +2 -1
  63. package/dist/stories/accumulator.stories.js.map +1 -1
  64. package/dist/stories/fixed-column.stories.js +3 -3
  65. package/dist/stories/fixed-column.stories.js.map +1 -1
  66. package/dist/stories/tree-column-with-checkbox.stories.js +8 -3
  67. package/dist/stories/tree-column-with-checkbox.stories.js.map +1 -1
  68. package/dist/stories/tree-column.stories.js +8 -3
  69. package/dist/stories/tree-column.stories.js.map +1 -1
  70. package/dist/tsconfig.tsbuildinfo +1 -1
  71. package/docs/gutter/gutter.md +7 -0
  72. package/package.json +5 -5
  73. package/src/accumulator/accumulator.ts +4 -4
  74. package/src/configure/column-builder.ts +4 -4
  75. package/src/configure/zero-config.ts +3 -1
  76. package/src/data-card/data-card-field.ts +1 -1
  77. package/src/data-grid/data-grid-accum-field.ts +7 -0
  78. package/src/data-grid/data-grid-body.ts +30 -3
  79. package/src/data-grid/data-grid-field.ts +6 -0
  80. package/src/data-grid/data-grid-header.ts +22 -18
  81. package/src/data-grid/event-handlers/data-grid-body-click-handler.ts +2 -2
  82. package/src/data-grid/event-handlers/data-grid-body-contextmenu-handler.ts +32 -0
  83. package/src/data-grid/event-handlers/data-grid-body-dblclick-handler.ts +2 -2
  84. package/src/data-grid/event-handlers/data-grid-body-focus-change-handler.ts +2 -2
  85. package/src/data-grist.ts +250 -3
  86. package/src/data-list/data-list-field.ts +1 -1
  87. package/src/data-manipulator.ts +130 -22
  88. package/src/editors/ox-grist-editor-tree.ts +27 -0
  89. package/src/editors/ox-grist-editor.ts +4 -0
  90. package/src/editors/ox-input-tree.ts +226 -0
  91. package/src/editors/registry.ts +3 -1
  92. package/src/filters/filters-form.ts +1 -1
  93. package/src/handlers/contextmenu-tree-mutation.ts +98 -0
  94. package/src/handlers/registry.ts +3 -1
  95. package/src/renderers/ox-grist-renderer-tree.ts +7 -3
  96. package/src/types.ts +446 -6
  97. package/stories/accumulator.stories.ts +2 -1
  98. package/stories/fixed-column.stories.ts +3 -3
  99. package/stories/tree-column-with-checkbox.stories.ts +8 -3
  100. package/stories/tree-column.stories.ts +8 -3
@@ -18,7 +18,9 @@ export const ZERO_FIELD_RENDERER: FieldRenderer = (value, column, record, rowInd
18
18
 
19
19
  export const ZERO_EVENTHANDLERSET: GristEventHandlerSet = {
20
20
  click: undefined,
21
- dblclick: undefined
21
+ dblclick: undefined,
22
+ focus: undefined,
23
+ contextmenu: undefined
22
24
  }
23
25
  export const ZERO_COLUMNS: ColumnConfig[] = []
24
26
  export const ZERO_GROUPS: GroupConfig[] = []
@@ -89,7 +89,7 @@ export class DataCardField extends LitElement {
89
89
 
90
90
  if (typeof label == 'object') {
91
91
  let { renderer: labelRenderer } = label
92
- return html`<label>${labelRenderer()}</label>${recordRenderer(value, column, record, rowIndex, this)}`
92
+ return html`<label>${labelRenderer(column)}</label>${recordRenderer(value, column, record, rowIndex, this)}`
93
93
  } else {
94
94
  return html`${recordRenderer(value, column, record, rowIndex, this)}`
95
95
  }
@@ -58,6 +58,7 @@ export class DataGridAccumField extends LitElement {
58
58
  @property({ type: Boolean }) editing = false
59
59
  @property({ type: Object }) value = {}
60
60
  @property({ attribute: false }) emphasized: any = false
61
+ @property({ type: String }) fixed?: string
61
62
 
62
63
  render(): TemplateResult {
63
64
  if (!this.column || !this.column.accumulator) {
@@ -90,5 +91,11 @@ export class DataGridAccumField extends LitElement {
90
91
  this.style.setProperty('--data-grid-field-text-align', align)
91
92
  }
92
93
  }
94
+
95
+ if (changes.has('fixed')) {
96
+ if (this.fixed) {
97
+ this.style.left = this.fixed + 'px'
98
+ }
99
+ }
93
100
  }
94
101
  }
@@ -18,6 +18,7 @@ import { DataGridField } from './data-grid-field'
18
18
  import { dataGridBodyClickHandler } from './event-handlers/data-grid-body-click-handler'
19
19
  import { dataGridBodyDblclickHandler } from './event-handlers/data-grid-body-dblclick-handler'
20
20
  import { dataGridBodyFocusChangeHandler } from './event-handlers/data-grid-body-focus-change-handler'
21
+ import { dataGridBodyContextMenuHandler } from './event-handlers/data-grid-body-contextmenu-handler'
21
22
  import { dataGridBodyKeydownHandler } from './event-handlers/data-grid-body-keydown-handler'
22
23
  import { accumulate } from '../accumulator/accumulator'
23
24
 
@@ -75,7 +76,7 @@ export class DataGridBody extends LitElement {
75
76
  [fixed] {
76
77
  position: sticky;
77
78
  background-color: var(--grid-record-background-color);
78
- z-index: 1; /* 고정된 열을 다른 열 위에 표시. */
79
+ z-index: 2; /* 고정된 열을 다른 열 위에 표시. */
79
80
  }
80
81
 
81
82
  :host([raised]) [fixed] {
@@ -88,6 +89,10 @@ export class DataGridBody extends LitElement {
88
89
  bottom: 0;
89
90
  z-index: 1;
90
91
  }
92
+
93
+ ox-grid-accum-field[fixed] {
94
+ background-color: var(--grid-accum-record-background-color, #ccc);
95
+ }
91
96
  `
92
97
  ]
93
98
 
@@ -135,7 +140,6 @@ export class DataGridBody extends LitElement {
135
140
  var columns = this.columns.filter(column => !column.hidden)
136
141
  var data = this.data
137
142
  var { records } = data
138
- records = records.filter(record => !record.__parent__ || !record.__parent__.collapsed)
139
143
  var { appendable, classifier, accumulator } = this.config.rows
140
144
  const { start, end } = this._selectBlock || {}
141
145
 
@@ -208,6 +212,7 @@ export class DataGridBody extends LitElement {
208
212
  .column=${column}
209
213
  .record=${accumRecord!}
210
214
  .value=${accumRecord[column.name]}
215
+ fixed=${ifDefined(this.fixedLefts[idxColumn])}
211
216
  ></ox-grid-accum-field>
212
217
  `
213
218
  )}
@@ -261,6 +266,27 @@ export class DataGridBody extends LitElement {
261
266
  this.setSelectBlock(start, end)
262
267
  })
263
268
 
269
+ this.renderRoot.addEventListener('contextmenu', (event: Event) => {
270
+ const e = event as MouseEvent
271
+ this.setSelectBlock()
272
+
273
+ this._draggable = false
274
+
275
+ var target = (e.target as Element).closest('ox-grid-field') as DataGridField
276
+ var { rowIndex, columnIndex } = target || {}
277
+
278
+ this.dispatchEvent(
279
+ new CustomEvent('focus-change', {
280
+ bubbles: true,
281
+ composed: true,
282
+ detail: {
283
+ row: rowIndex,
284
+ column: columnIndex
285
+ }
286
+ })
287
+ )
288
+ })
289
+
264
290
  this.renderRoot.addEventListener('mousedown', (event: Event) => {
265
291
  const e = event as MouseEvent
266
292
  this.setSelectBlock()
@@ -285,7 +311,7 @@ export class DataGridBody extends LitElement {
285
311
  })
286
312
  )
287
313
 
288
- if (!isNaN(rowIndex) && !isNaN(columnIndex)) {
314
+ if (columnIndex >= 0 && target.editableOnClick && !isNaN(rowIndex) && !isNaN(columnIndex)) {
289
315
  this.startEditTarget(rowIndex, columnIndex)
290
316
  }
291
317
  })
@@ -318,6 +344,7 @@ export class DataGridBody extends LitElement {
318
344
 
319
345
  this.renderRoot.addEventListener('click', dataGridBodyClickHandler.bind(this))
320
346
  this.renderRoot.addEventListener('dblclick', dataGridBodyDblclickHandler.bind(this))
347
+ this.renderRoot.addEventListener('contextmenu', dataGridBodyContextMenuHandler.bind(this))
321
348
 
322
349
  this.addEventListener('focus-change', dataGridBodyFocusChangeHandler.bind(this))
323
350
 
@@ -173,4 +173,10 @@ export class DataGridField extends LitElement {
173
173
  this.removeAttribute('emphasized-row')
174
174
  }
175
175
  }
176
+
177
+ get editableOnClick() {
178
+ const renderer = this.renderRoot.firstElementChild as HTMLElement
179
+ //@ts-ignore
180
+ return renderer && 'editableOnClick' in renderer ? renderer.editableOnClick : true
181
+ }
176
182
  }
@@ -267,26 +267,26 @@ export class DataGridHeader extends LitElement {
267
267
  `
268
268
  }
269
269
 
270
- updated(changes: PropertyValues) {
271
- if (changes.has('data')) {
272
- const fixedHeaders = Array.from(this.renderRoot.querySelectorAll('div[fixed]')) as HTMLElement[]
273
- const fixedLefts = [] as number[]
274
- var left = 0
275
- fixedHeaders.forEach((header: HTMLElement) => {
276
- header.style.left = left + 'px'
277
- fixedLefts.push(left)
278
-
279
- const width = header.offsetWidth
280
- left += width
281
- })
270
+ notifyFixedLeftChange() {
271
+ const fixedHeaders = Array.from(this.renderRoot.querySelectorAll('div[fixed]')) as HTMLElement[]
272
+ const fixedLefts = [] as number[]
273
+ var left = 0
274
+ fixedHeaders.forEach((header: HTMLElement) => {
275
+ header.style.left = left + 'px'
276
+ fixedLefts.push(left)
277
+
278
+ const width = header.offsetWidth
279
+ left += width
280
+ })
282
281
 
283
- this.dispatchEvent(
284
- new CustomEvent('fixed-lefts-change', {
285
- detail: fixedLefts
286
- })
287
- )
288
- }
282
+ this.dispatchEvent(
283
+ new CustomEvent('fixed-lefts-change', {
284
+ detail: fixedLefts
285
+ })
286
+ )
287
+ }
289
288
 
289
+ updated(changes: PropertyValues) {
290
290
  if (changes.has('columns')) {
291
291
  this.row2 = this.columns.reduce((row2, column, index) => {
292
292
  if (column.hidden || !column.header?.group) {
@@ -340,6 +340,8 @@ export class DataGridHeader extends LitElement {
340
340
 
341
341
  return row1
342
342
  }, [] as any[])
343
+
344
+ requestAnimationFrame(this.notifyFixedLeftChange.bind(this))
343
345
  }
344
346
  }
345
347
 
@@ -512,6 +514,8 @@ export class DataGridHeader extends LitElement {
512
514
  })
513
515
  )
514
516
 
517
+ this.notifyFixedLeftChange()
518
+
515
519
  this._lastAccVal = 0
516
520
  }, 100)
517
521
  }
@@ -56,10 +56,10 @@ export function dataGridBodyClickHandler(this: DataGridBody, e: Event): void {
56
56
  /* do column click handler */
57
57
  if (column) {
58
58
  var { click } = column.handlers
59
- click && click(this.columns, this.data, column, record, rowIndex, target)
59
+ click && click(this.columns, this.data, column, record, rowIndex, target, e)
60
60
  }
61
61
 
62
62
  /* do rows click handler */
63
63
  var { click: rowsClick } = this.config.rows.handlers
64
- rowsClick && rowsClick(this.columns, this.data, column, record, rowIndex, target)
64
+ rowsClick && rowsClick(this.columns, this.data, column, record, rowIndex, target, e)
65
65
  }
@@ -0,0 +1,32 @@
1
+ import { DataGridBody } from '../data-grid-body'
2
+ import { DataGridField } from '../data-grid-field'
3
+
4
+ /**
5
+ * ox-grid-body 의 focus-change handler
6
+ *
7
+ * - handler의 this 는 ox-grid-body임.
8
+ */
9
+ export async function dataGridBodyContextMenuHandler(this: DataGridBody, e: Event): Promise<void> {
10
+ e.stopPropagation()
11
+
12
+ if (this.editTarget) {
13
+ /* editTarget이 새로 설정되지 않았다면, 이후 기능이 실행된다. */
14
+ return
15
+ }
16
+
17
+ /* target should be 'ox-grid-field' */
18
+ var target = (e.target as Element).closest('ox-grid-field') as DataGridField
19
+ var { column, record, rowIndex, columnIndex } = target || {}
20
+
21
+ var { column, record } = target || {}
22
+
23
+ /* do column contextmenu handler */
24
+ if (column) {
25
+ var { contextmenu } = column.handlers
26
+ contextmenu && contextmenu(this.columns, this.data, column, record, rowIndex, target, e)
27
+ }
28
+
29
+ /* do rows contextmenu handler */
30
+ var { contextmenu: rowsContextMenu } = this.config.rows.handlers
31
+ rowsContextMenu && rowsContextMenu(this.columns, this.data, column, record, rowIndex, target, e)
32
+ }
@@ -33,10 +33,10 @@ export async function dataGridBodyDblclickHandler(this: DataGridBody, e: Event):
33
33
  /* do column dblclick handler */
34
34
  if (column) {
35
35
  var { dblclick } = column.handlers
36
- dblclick && dblclick(this.columns, this.data, column, record, rowIndex, target)
36
+ dblclick && dblclick(this.columns, this.data, column, record, rowIndex, target, e)
37
37
  }
38
38
 
39
39
  /* do rows dblclick handler */
40
40
  var { dblclick: rowsDblclick } = this.config.rows.handlers
41
- rowsDblclick && rowsDblclick(this.columns, this.data, column, record, rowIndex, target)
41
+ rowsDblclick && rowsDblclick(this.columns, this.data, column, record, rowIndex, target, e)
42
42
  }
@@ -15,10 +15,10 @@ export async function dataGridBodyFocusChangeHandler(this: DataGridBody, e: Even
15
15
  /* do column focus handler */
16
16
  if (column) {
17
17
  var { focus } = column.handlers
18
- focus && focus(this.columns, this.data, column, record, rowIndex, target)
18
+ focus && focus(this.columns, this.data, column, record, rowIndex, target, e)
19
19
  }
20
20
 
21
21
  /* do rows focus handler */
22
22
  var { focus: rowsFocus } = this.config.rows.handlers
23
- rowsFocus && rowsFocus(this.columns, this.data, column, record, rowIndex, target)
23
+ rowsFocus && rowsFocus(this.columns, this.data, column, record, rowIndex, target, e)
24
24
  }