@operato/data-grist 2.0.0-alpha.2 → 2.0.0-alpha.22

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 +138 -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/rows-option-builder.js +2 -1
  5. package/dist/src/configure/rows-option-builder.js.map +1 -1
  6. package/dist/src/configure/zero-config.js +1 -0
  7. package/dist/src/configure/zero-config.js.map +1 -1
  8. package/dist/src/data-card/event-handlers/record-card-click-handler.js +1 -1
  9. package/dist/src/data-card/event-handlers/record-card-click-handler.js.map +1 -1
  10. package/dist/src/data-grid/data-grid-accum-field.js +3 -2
  11. package/dist/src/data-grid/data-grid-accum-field.js.map +1 -1
  12. package/dist/src/data-grid/data-grid-body.js +3 -1
  13. package/dist/src/data-grid/data-grid-body.js.map +1 -1
  14. package/dist/src/data-grid/data-grid-header.d.ts +1 -0
  15. package/dist/src/data-grid/data-grid-header.js +16 -14
  16. package/dist/src/data-grid/data-grid-header.js.map +1 -1
  17. package/dist/src/data-grist.d.ts +225 -3
  18. package/dist/src/data-grist.js +195 -3
  19. package/dist/src/data-grist.js.map +1 -1
  20. package/dist/src/data-list/event-handlers/record-partial-click-handler.js +1 -1
  21. package/dist/src/data-list/event-handlers/record-partial-click-handler.js.map +1 -1
  22. package/dist/src/data-manipulator.d.ts +6 -4
  23. package/dist/src/data-manipulator.js +91 -21
  24. package/dist/src/data-manipulator.js.map +1 -1
  25. package/dist/src/editors/ox-grist-editor-number.js +2 -2
  26. package/dist/src/editors/ox-grist-editor-number.js.map +1 -1
  27. package/dist/src/editors/ox-grist-editor.js +6 -2
  28. package/dist/src/editors/ox-grist-editor.js.map +1 -1
  29. package/dist/src/editors/ox-input-tree.js +1 -1
  30. package/dist/src/editors/ox-input-tree.js.map +1 -1
  31. package/dist/src/filters/filter-range-date.js +12 -1
  32. package/dist/src/filters/filter-range-date.js.map +1 -1
  33. package/dist/src/filters/filters-form.d.ts +1 -0
  34. package/dist/src/filters/filters-form.js +21 -3
  35. package/dist/src/filters/filters-form.js.map +1 -1
  36. package/dist/src/handlers/contextmenu-tree-mutation.js +1 -19
  37. package/dist/src/handlers/contextmenu-tree-mutation.js.map +1 -1
  38. package/dist/src/index.d.ts +0 -1
  39. package/dist/src/index.js +0 -1
  40. package/dist/src/index.js.map +1 -1
  41. package/dist/src/renderers/ox-grist-renderer-tree.js +1 -1
  42. package/dist/src/renderers/ox-grist-renderer-tree.js.map +1 -1
  43. package/dist/src/types.d.ts +428 -5
  44. package/dist/src/types.js +9 -0
  45. package/dist/src/types.js.map +1 -1
  46. package/dist/stories/accumulator.stories.js +10 -5
  47. package/dist/stories/accumulator.stories.js.map +1 -1
  48. package/dist/stories/dynamic-editable.stories.js +10 -0
  49. package/dist/stories/dynamic-editable.stories.js.map +1 -1
  50. package/dist/stories/fixed-column.stories.js +3 -3
  51. package/dist/stories/fixed-column.stories.js.map +1 -1
  52. package/dist/stories/grist-modes.stories.js +23 -2
  53. package/dist/stories/grist-modes.stories.js.map +1 -1
  54. package/dist/tsconfig.tsbuildinfo +1 -1
  55. package/docs/gutter/gutter.md +7 -0
  56. package/package.json +6 -5
  57. package/src/accumulator/accumulator.ts +4 -4
  58. package/src/configure/rows-option-builder.ts +11 -1
  59. package/src/configure/zero-config.ts +1 -0
  60. package/src/data-card/event-handlers/record-card-click-handler.ts +1 -1
  61. package/src/data-grid/data-grid-accum-field.ts +3 -2
  62. package/src/data-grid/data-grid-body.ts +3 -1
  63. package/src/data-grid/data-grid-header.ts +22 -18
  64. package/src/data-grist.ts +250 -3
  65. package/src/data-list/event-handlers/record-partial-click-handler.ts +1 -1
  66. package/src/data-manipulator.ts +113 -22
  67. package/src/editors/ox-grist-editor-number.ts +3 -2
  68. package/src/editors/ox-grist-editor.ts +6 -2
  69. package/src/editors/ox-input-tree.ts +1 -1
  70. package/src/filters/filter-range-date.ts +16 -1
  71. package/src/filters/filters-form.ts +25 -2
  72. package/src/handlers/contextmenu-tree-mutation.ts +1 -19
  73. package/src/index.ts +0 -1
  74. package/src/renderers/ox-grist-renderer-tree.ts +1 -1
  75. package/src/types.ts +435 -5
  76. package/stories/accumulator.stories.ts +10 -5
  77. package/stories/dynamic-editable.stories.ts +10 -0
  78. package/stories/fixed-column.stories.ts +3 -3
  79. package/stories/grist-modes.stories.ts +23 -2
  80. package/themes/grist-theme.css +1 -1
  81. package/dist/src/data-grid/event-handlers/data-grid-body-focus-change-handler copy.d.ts +0 -7
  82. package/dist/src/data-grid/event-handlers/data-grid-body-focus-change-handler copy.js +0 -19
  83. package/dist/src/data-grid/event-handlers/data-grid-body-focus-change-handler copy.js.map +0 -1
  84. package/dist/src/handlers/contextmenu-tree.d.ts +0 -3
  85. package/dist/src/handlers/contextmenu-tree.js +0 -30
  86. package/dist/src/handlers/contextmenu-tree.js.map +0 -1
  87. package/dist/src/handlers/move-up copy.d.ts +0 -3
  88. package/dist/src/handlers/move-up copy.js +0 -26
  89. package/dist/src/handlers/move-up copy.js.map +0 -1
  90. package/src/value-generator/date-generator.ts +0 -35
  91. package/src/value-generator/hour-time-generator.ts +0 -43
  92. package/src/value-generator/index.ts +0 -1
  93. package/src/value-generator/minute-time-generator.ts +0 -43
  94. package/src/value-generator/month-date-generator.ts +0 -38
  95. package/src/value-generator/now-generator.ts +0 -10
  96. package/src/value-generator/registry.ts +0 -58
  97. package/src/value-generator/time-generator.ts +0 -33
  98. package/src/value-generator/today-generator.ts +0 -10
  99. package/src/value-generator/week-date-generator.ts +0 -40
  100. package/src/value-generator/year-date-generator.ts +0 -36
@@ -64,18 +64,17 @@ export class DataManipulator extends LitElement {
64
64
  })
65
65
 
66
66
  /* tree processing */
67
- this.addEventListener('collapse-all', (e: Event) => this.onCollapseAll(e as CustomEvent))
68
- this.addEventListener('expand-all', (e: Event) => this.onExpandAll(e as CustomEvent))
69
- this.addEventListener('collapsed', (e: Event) => this.onCollapsed(e as CustomEvent))
70
- this.addEventListener('expanded', (e: Event) => this.onExpanded(e as CustomEvent))
67
+ this.addEventListener('collapse-all', (e: Event) => this.collapseAll())
68
+ this.addEventListener('expand-all', (e: Event) => this.expandAll())
69
+ this.addEventListener('collapse-node', (e: Event) => this.collapseNode((e as CustomEvent).detail as GristRecord))
70
+ this.addEventListener('expand-node', (e: Event) => this.expandNode((e as CustomEvent).detail as GristRecord))
71
71
  this.addEventListener('check-in-tree', (e: Event) => this.onCheckInTree(e as CustomEvent))
72
- }
73
72
 
74
- // updated(changes: PropertyValues<this>) {
75
- // if (changes.has('data')) {
76
- // this.refresh()
77
- // }
78
- // }
73
+ this.addEventListener('add-sibling-node', (e: Event) =>
74
+ this.addSiblingNode((e as CustomEvent).detail as GristRecord)
75
+ )
76
+ this.addEventListener('add-child-node', (e: Event) => this.addChildNode((e as CustomEvent).detail as GristRecord))
77
+ }
79
78
 
80
79
  onFieldChange({
81
80
  after,
@@ -215,25 +214,119 @@ export class DataManipulator extends LitElement {
215
214
  this.requestUpdate()
216
215
  }
217
216
 
218
- onCollapseAll(e: CustomEvent) {
217
+ collapseAll() {
219
218
  this.refresh(false)
220
219
  }
221
220
 
222
- onExpandAll(e: CustomEvent) {
221
+ expandAll() {
223
222
  this.refresh(true)
224
223
  }
225
224
 
226
- onCollapsed(e: CustomEvent) {
227
- const record = e.detail
225
+ collapseNode(record: GristRecord) {
228
226
  record.__expanded__ = false
229
227
 
230
228
  this.refresh()
231
229
  }
232
230
 
233
- onExpanded(e: CustomEvent) {
234
- const record = e.detail
231
+ expandNode(record: GristRecord) {
232
+ record.__expanded__ = true
233
+
234
+ this.refresh()
235
+ }
236
+
237
+ // onCollapse(e: CustomEvent) {
238
+ // const record = e.detail as GristRecord
239
+ // record.__expanded__ = false
240
+
241
+ // this.refresh()
242
+ // }
243
+
244
+ // onExpand(e: CustomEvent) {
245
+ // const record = e.detail as GristRecord
246
+ // record.__expanded__ = true
247
+
248
+ // this.refresh()
249
+ // }
250
+
251
+ addSiblingNode(record: GristRecord) {
252
+ const { records } = this.data
253
+ const toplevelRecords = records.filter(
254
+ record => !record.__depth__
255
+ ) /* __depth__ 가 설정되지 않았거나, 0 인 경우만 수집 */
256
+
257
+ const { __depth__ } = record as GristRecord
258
+
259
+ function findParent(record: GristRecord, parent?: GristRecord): GristRecord | undefined {
260
+ var children = (parent ? parent.__children__ || [] : toplevelRecords) as GristRecord[]
261
+
262
+ if (children.find(child => child === record)) {
263
+ return parent
264
+ } else {
265
+ for (let child of children) {
266
+ const found = findParent(record, child)
267
+ if (found) {
268
+ return found
269
+ }
270
+ }
271
+ }
272
+ }
273
+
274
+ const parent = findParent(record)
275
+
276
+ const sibling = {
277
+ __depth__,
278
+ __dirty__: '+'
279
+ } as GristRecord
280
+
281
+ if (parent) {
282
+ const { id } = parent as GristRecord
283
+
284
+ sibling.parent = { id }
285
+
286
+ if (!parent.__children__) {
287
+ parent.__children__ = [sibling]
288
+ } else {
289
+ let index = parent.__children__.indexOf(record)
290
+
291
+ if (index !== -1) {
292
+ parent.__children__ = [
293
+ ...parent.__children__.slice(0, index + 1),
294
+ sibling,
295
+ ...parent.__children__.slice(index + 1)
296
+ ]
297
+ } else {
298
+ parent.__children__ = [...parent.__children__, sibling]
299
+ }
300
+ }
301
+
302
+ parent.__expanded__ = true
303
+ } else {
304
+ this.data.records = [...toplevelRecords, sibling]
305
+ }
306
+
307
+ this.refresh()
308
+ }
309
+
310
+ addChildNode(record: GristRecord) {
311
+ const { id: parentId, __children__, __depth__ } = record as GristRecord
312
+ const child = {
313
+ parent: {
314
+ id: parentId
315
+ },
316
+ __depth__: (__depth__ || 0) + 1,
317
+ __dirty__: '+'
318
+ }
319
+
320
+ if (!record.__children__) {
321
+ record.__children__ = [child]
322
+ } else {
323
+ record.__children__.unshift(child)
324
+ }
325
+
235
326
  record.__expanded__ = true
236
327
 
328
+ // this.requestUpdate()
329
+
237
330
  this.refresh()
238
331
  }
239
332
 
@@ -256,7 +349,8 @@ export class DataManipulator extends LitElement {
256
349
 
257
350
  children.forEach(child => updateCheckedAll(child))
258
351
 
259
- var checked: 'checked' | 'half-checked' | 'unchecked' | undefined
352
+ var checked: 'checked' | 'half-checked' | 'unchecked' | undefined =
353
+ record.__check_in_tree__ == 'checked' ? 'checked' : undefined
260
354
 
261
355
  children.forEach(child => {
262
356
  const { __check_in_tree__ } = child
@@ -264,7 +358,7 @@ export class DataManipulator extends LitElement {
264
358
  if (__check_in_tree__ == 'half-checked') {
265
359
  checked = 'half-checked'
266
360
  } else if (__check_in_tree__ == 'checked') {
267
- checked = checked == 'checked' || !checked ? 'checked' : 'half-checked'
361
+ checked = checked == 'checked' ? 'checked' : 'half-checked'
268
362
  } else {
269
363
  checked = checked == 'unchecked' || !checked ? 'unchecked' : 'half-checked'
270
364
  }
@@ -318,10 +412,7 @@ export class DataManipulator extends LitElement {
318
412
 
319
413
  private traverseRefresh(record: GristRecord, forceExpandOrCollapse?: boolean): GristRecord[] {
320
414
  if (forceExpandOrCollapse !== undefined) {
321
- record = {
322
- ...record,
323
- __expanded__: forceExpandOrCollapse
324
- }
415
+ record.__expanded__ = forceExpandOrCollapse
325
416
  }
326
417
 
327
418
  const { __expanded__, __children__ = [] } = record
@@ -1,6 +1,7 @@
1
1
  import { OxGristEditor } from './ox-grist-editor.js'
2
2
  import { customElement } from 'lit/decorators.js'
3
3
  import { html } from 'lit'
4
+ import { parseToNumberOrNull } from '@operato/utils'
4
5
 
5
6
  @customElement('ox-grist-editor-number')
6
7
  export class OxGristEditorNumber extends OxGristEditor {
@@ -9,9 +10,9 @@ export class OxGristEditorNumber extends OxGristEditor {
9
10
 
10
11
  switch (this.column.type) {
11
12
  case 'float':
12
- return Number.parseFloat(value)
13
+ return Number.parseFloat(value) || 0
13
14
  case 'integer':
14
- return Number.parseInt(value)
15
+ return Number.parseInt(value) || 0
15
16
  default:
16
17
  return Number(value)
17
18
  }
@@ -4,7 +4,8 @@ import { customElement, property } from 'lit/decorators.js'
4
4
  import { ZERO_COLUMN, ZERO_RECORD } from '../configure/zero-config'
5
5
  import { DataGridField } from '../data-grid/data-grid-field'
6
6
  import { ColumnConfig, GristRecord } from '../types'
7
- import { getDefaultValue } from '../value-generator'
7
+ import { getDefaultValue } from '@operato/time-calculator'
8
+ import { parseToNumberOrNull } from '@operato/utils'
8
9
 
9
10
  const STYLE = css`
10
11
  :host {
@@ -123,7 +124,10 @@ export class OxGristEditor extends LitElement {
123
124
 
124
125
  // 입력을 위한 키를 누르면서 편집모드가 될때는 누른 키가 처음에 입력되도록, enter 같은 것을 눌러서 편집모드가 되면 현재 값으로 편집모드 전환
125
126
  const editorValue = this.field?.valueWithEdit ? this.field.valueWithEdit : this.formatForEditor(currentValue)
126
- this.value = this._dirtyValue = this.field?.type === 'number' ? Number(editorValue) : editorValue
127
+ const fieldType = this.field?.type || 'string'
128
+ this.value = this._dirtyValue = ['number', 'float', 'integer', 'progress'].includes(fieldType)
129
+ ? parseToNumberOrNull(editorValue)
130
+ : editorValue
127
131
 
128
132
  requestAnimationFrame(() => {
129
133
  this.focus()
@@ -214,7 +214,7 @@ export class OxInputTree extends OxFormField {
214
214
  e.stopPropagation()
215
215
 
216
216
  this.dispatchEvent(
217
- new CustomEvent(this.record.__expanded__ ? 'collapsed' : 'expanded', {
217
+ new CustomEvent(this.record.__expanded__ ? 'collapse-node' : 'expand-node', {
218
218
  bubbles: true,
219
219
  composed: true,
220
220
  detail: this.record
@@ -2,16 +2,31 @@ import { FilterConfigObject, FilterSelectRenderer } from '../types'
2
2
 
3
3
  import { html } from 'lit-html'
4
4
 
5
+ function formatDate(type: string, date: Date) {
6
+ var year = date.getFullYear()
7
+ var month = ('0' + (date.getMonth() + 1)).slice(-2)
8
+ var day = ('0' + date.getDate()).slice(-2)
9
+ var hours = ('0' + date.getHours()).slice(-2)
10
+ var minutes = ('0' + date.getMinutes()).slice(-2)
11
+
12
+ var formatDate = year + '-' + month + '-' + day
13
+
14
+ return type == 'date' ? formatDate : formatDate + 'T' + hours + ':' + minutes
15
+ }
16
+
5
17
  export const FilterRangeDate: FilterSelectRenderer = (column, value, owner) => {
6
18
  const filter = column.filter as FilterConfigObject
7
19
 
8
- const [from, to] = value instanceof Array ? value : []
20
+ var [from, to] = value instanceof Array ? value : []
9
21
 
10
22
  var type: any = filter?.type || column.type
11
23
  if (type === 'datetime') {
12
24
  type = 'datetime-local'
13
25
  }
14
26
 
27
+ from = formatDate(type, new Date(from))
28
+ to = formatDate(type, new Date(to))
29
+
15
30
  return html`
16
31
  <input
17
32
  name=${column.name}
@@ -6,6 +6,8 @@ import '@operato/input/ox-input-search.js'
6
6
  import { css, html, LitElement, PropertyValues, TemplateResult, nothing } from 'lit'
7
7
  import { customElement, property, queryAsync, state } from 'lit/decorators.js'
8
8
 
9
+ import { getDefaultValue } from '@operato/time-calculator'
10
+
9
11
  import { FilterConfigObject } from '..'
10
12
  import { DataGrist } from '../data-grist'
11
13
  import { ColumnConfig, FilterOperator, FilterValue, GristConfig } from '../types'
@@ -72,7 +74,6 @@ export class FiltersForm extends LitElement {
72
74
 
73
75
  if (grist) {
74
76
  this.config = grist.compiledConfig
75
- this.value = grist.filters || []
76
77
 
77
78
  grist.addEventListener('config-change', (e: Event) => {
78
79
  this.config = (e as CustomEvent).detail
@@ -102,6 +103,17 @@ export class FiltersForm extends LitElement {
102
103
  }
103
104
  }
104
105
 
106
+ buildDefaultValue(operator: string, defaultValue: any) {
107
+ if (defaultValue === undefined) {
108
+ return
109
+ }
110
+ if (operator == 'between') {
111
+ return (defaultValue as Array<any>).map(v => getDefaultValue(v, this))
112
+ } else {
113
+ return getDefaultValue(defaultValue, this)
114
+ }
115
+ }
116
+
105
117
  updated(changes: PropertyValues<this>) {
106
118
  if (changes.has('config')) {
107
119
  const filters = this.config.columns.filter(columnConfig => !!columnConfig.filter)
@@ -114,6 +126,15 @@ export class FiltersForm extends LitElement {
114
126
  return filter!.operator === 'search'
115
127
  })
116
128
 
129
+ const grist = this.closest('ox-grist') as DataGrist
130
+
131
+ this.value = (grist.filters || []).map(filter => {
132
+ return {
133
+ ...filter,
134
+ value: this.buildDefaultValue(filter!.operator, filter!.value)
135
+ }
136
+ })
137
+
117
138
  this.empty = (this.searchColumns.length === 0 || this.withoutSearch) && this.filterColumns.length === 0
118
139
  }
119
140
  }
@@ -160,7 +181,9 @@ export class FiltersForm extends LitElement {
160
181
  ? 'text'
161
182
  : type
162
183
  )[idx]
163
- const value = this.value?.find(filter => filter.name == name)?.value
184
+ const value =
185
+ this.value?.find(filter => filter.name == name)?.value ??
186
+ this.buildDefaultValue(operator!, (filter as FilterConfigObject)?.value)
164
187
 
165
188
  if (!renderer) {
166
189
  return html``
@@ -9,7 +9,7 @@ function dispatchEvent(field: DataGridField, event: string) {
9
9
  new CustomEvent(event, {
10
10
  bubbles: true,
11
11
  composed: true,
12
- detail: field
12
+ detail: field.record
13
13
  })
14
14
  )
15
15
  }
@@ -54,24 +54,6 @@ export const ContextMenuTreeMutation = function (
54
54
  <mwc-icon slot="icon">playlist_add</mwc-icon>
55
55
  </ox-popup-menuitem>
56
56
 
57
- <ox-popup-menuitem
58
- label="move up"
59
- @click=${() => {
60
- dispatchEvent(field, 'move-up')
61
- }}
62
- >
63
- <mwc-icon slot="icon">arrow_upward</mwc-icon>
64
- </ox-popup-menuitem>
65
-
66
- <ox-popup-menuitem
67
- label="move down"
68
- @click=${() => {
69
- dispatchEvent(field, 'move-down')
70
- }}
71
- >
72
- <mwc-icon slot="icon">arrow_downward</mwc-icon>
73
- </ox-popup-menuitem>
74
-
75
57
  <div separator></div>
76
58
 
77
59
  <ox-popup-menuitem
package/src/index.ts CHANGED
@@ -12,6 +12,5 @@ export * from './gutters'
12
12
  export * from './filters'
13
13
  export * from './sorters/sorters-control'
14
14
  export * from './record-view'
15
- export * from './value-generator'
16
15
 
17
16
  export * from './utils/list-param'
@@ -173,7 +173,7 @@ export class OxGristRendererTree extends OxGristRenderer {
173
173
  e.stopPropagation()
174
174
 
175
175
  this.dispatchEvent(
176
- new CustomEvent(this.record.__expanded__ ? 'collapsed' : 'expanded', {
176
+ new CustomEvent(this.record.__expanded__ ? 'collapse-node' : 'expand-node', {
177
177
  bubbles: true,
178
178
  composed: true,
179
179
  detail: this.record