@operato/data-grist 2.0.0-alpha.2 → 2.0.0-alpha.20
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.
- package/CHANGELOG.md +129 -0
- package/dist/src/accumulator/accumulator.js +4 -4
- package/dist/src/accumulator/accumulator.js.map +1 -1
- package/dist/src/configure/rows-option-builder.js +2 -1
- package/dist/src/configure/rows-option-builder.js.map +1 -1
- package/dist/src/configure/zero-config.js +1 -0
- package/dist/src/configure/zero-config.js.map +1 -1
- package/dist/src/data-card/event-handlers/record-card-click-handler.js +1 -1
- package/dist/src/data-card/event-handlers/record-card-click-handler.js.map +1 -1
- package/dist/src/data-grid/data-grid-accum-field.js +3 -2
- package/dist/src/data-grid/data-grid-accum-field.js.map +1 -1
- package/dist/src/data-grid/data-grid-body.js +3 -1
- package/dist/src/data-grid/data-grid-body.js.map +1 -1
- package/dist/src/data-grid/data-grid-header.d.ts +1 -0
- package/dist/src/data-grid/data-grid-header.js +16 -14
- package/dist/src/data-grid/data-grid-header.js.map +1 -1
- package/dist/src/data-grist.d.ts +225 -3
- package/dist/src/data-grist.js +195 -3
- package/dist/src/data-grist.js.map +1 -1
- package/dist/src/data-list/event-handlers/record-partial-click-handler.js +1 -1
- package/dist/src/data-list/event-handlers/record-partial-click-handler.js.map +1 -1
- package/dist/src/data-manipulator.d.ts +6 -4
- package/dist/src/data-manipulator.js +91 -21
- package/dist/src/data-manipulator.js.map +1 -1
- package/dist/src/editors/ox-grist-editor-number.js +2 -2
- package/dist/src/editors/ox-grist-editor-number.js.map +1 -1
- package/dist/src/editors/ox-grist-editor.js +5 -1
- package/dist/src/editors/ox-grist-editor.js.map +1 -1
- package/dist/src/editors/ox-input-tree.js +1 -1
- package/dist/src/editors/ox-input-tree.js.map +1 -1
- package/dist/src/handlers/contextmenu-tree-mutation.js +1 -19
- package/dist/src/handlers/contextmenu-tree-mutation.js.map +1 -1
- package/dist/src/renderers/ox-grist-renderer-tree.js +1 -1
- package/dist/src/renderers/ox-grist-renderer-tree.js.map +1 -1
- package/dist/src/types.d.ts +435 -4
- package/dist/src/types.js +9 -0
- package/dist/src/types.js.map +1 -1
- package/dist/stories/accumulator.stories.js +10 -5
- package/dist/stories/accumulator.stories.js.map +1 -1
- package/dist/stories/dynamic-editable.stories.js +10 -0
- package/dist/stories/dynamic-editable.stories.js.map +1 -1
- package/dist/stories/fixed-column.stories.js +3 -3
- package/dist/stories/fixed-column.stories.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/docs/gutter/gutter.md +7 -0
- package/package.json +5 -5
- package/src/accumulator/accumulator.ts +4 -4
- package/src/configure/rows-option-builder.ts +11 -1
- package/src/configure/zero-config.ts +1 -0
- package/src/data-card/event-handlers/record-card-click-handler.ts +1 -1
- package/src/data-grid/data-grid-accum-field.ts +3 -2
- package/src/data-grid/data-grid-body.ts +3 -1
- package/src/data-grid/data-grid-header.ts +22 -18
- package/src/data-grist.ts +250 -3
- package/src/data-list/event-handlers/record-partial-click-handler.ts +1 -1
- package/src/data-manipulator.ts +113 -22
- package/src/editors/ox-grist-editor-number.ts +3 -2
- package/src/editors/ox-grist-editor.ts +5 -1
- package/src/editors/ox-input-tree.ts +1 -1
- package/src/handlers/contextmenu-tree-mutation.ts +1 -19
- package/src/renderers/ox-grist-renderer-tree.ts +1 -1
- package/src/types.ts +443 -4
- package/stories/accumulator.stories.ts +10 -5
- package/stories/dynamic-editable.stories.ts +10 -0
- package/stories/fixed-column.stories.ts +3 -3
- package/themes/grist-theme.css +1 -1
- package/dist/src/data-grid/event-handlers/data-grid-body-focus-change-handler copy.d.ts +0 -7
- package/dist/src/data-grid/event-handlers/data-grid-body-focus-change-handler copy.js +0 -19
- package/dist/src/data-grid/event-handlers/data-grid-body-focus-change-handler copy.js.map +0 -1
- package/dist/src/handlers/contextmenu-tree.d.ts +0 -3
- package/dist/src/handlers/contextmenu-tree.js +0 -30
- package/dist/src/handlers/contextmenu-tree.js.map +0 -1
- package/dist/src/handlers/move-up copy.d.ts +0 -3
- package/dist/src/handlers/move-up copy.js +0 -26
- package/dist/src/handlers/move-up copy.js.map +0 -1
package/src/data-manipulator.ts
CHANGED
@@ -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.
|
68
|
-
this.addEventListener('expand-all', (e: Event) => this.
|
69
|
-
this.addEventListener('
|
70
|
-
this.addEventListener('
|
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
|
-
|
75
|
-
|
76
|
-
|
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
|
-
|
217
|
+
collapseAll() {
|
219
218
|
this.refresh(false)
|
220
219
|
}
|
221
220
|
|
222
|
-
|
221
|
+
expandAll() {
|
223
222
|
this.refresh(true)
|
224
223
|
}
|
225
224
|
|
226
|
-
|
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
|
-
|
234
|
-
|
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'
|
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
|
}
|
@@ -5,6 +5,7 @@ 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
7
|
import { getDefaultValue } from '../value-generator'
|
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
|
-
|
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__ ? '
|
217
|
+
new CustomEvent(this.record.__expanded__ ? 'collapse-node' : 'expand-node', {
|
218
218
|
bubbles: true,
|
219
219
|
composed: true,
|
220
220
|
detail: this.record
|
@@ -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
|
@@ -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__ ? '
|
176
|
+
new CustomEvent(this.record.__expanded__ ? 'collapse-node' : 'expand-node', {
|
177
177
|
bubbles: true,
|
178
178
|
composed: true,
|
179
179
|
detail: this.record
|