@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.
- package/CHANGELOG.md +138 -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 +6 -2
- 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/filters/filter-range-date.js +12 -1
- package/dist/src/filters/filter-range-date.js.map +1 -1
- package/dist/src/filters/filters-form.d.ts +1 -0
- package/dist/src/filters/filters-form.js +21 -3
- package/dist/src/filters/filters-form.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/index.d.ts +0 -1
- package/dist/src/index.js +0 -1
- package/dist/src/index.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 +428 -5
- 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/stories/grist-modes.stories.js +23 -2
- package/dist/stories/grist-modes.stories.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/docs/gutter/gutter.md +7 -0
- package/package.json +6 -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 +6 -2
- package/src/editors/ox-input-tree.ts +1 -1
- package/src/filters/filter-range-date.ts +16 -1
- package/src/filters/filters-form.ts +25 -2
- package/src/handlers/contextmenu-tree-mutation.ts +1 -19
- package/src/index.ts +0 -1
- package/src/renderers/ox-grist-renderer-tree.ts +1 -1
- package/src/types.ts +435 -5
- package/stories/accumulator.stories.ts +10 -5
- package/stories/dynamic-editable.stories.ts +10 -0
- package/stories/fixed-column.stories.ts +3 -3
- package/stories/grist-modes.stories.ts +23 -2
- 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/value-generator/date-generator.ts +0 -35
- package/src/value-generator/hour-time-generator.ts +0 -43
- package/src/value-generator/index.ts +0 -1
- package/src/value-generator/minute-time-generator.ts +0 -43
- package/src/value-generator/month-date-generator.ts +0 -38
- package/src/value-generator/now-generator.ts +0 -10
- package/src/value-generator/registry.ts +0 -58
- package/src/value-generator/time-generator.ts +0 -33
- package/src/value-generator/today-generator.ts +0 -10
- package/src/value-generator/week-date-generator.ts +0 -40
- package/src/value-generator/year-date-generator.ts +0 -36
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
|
}
|
@@ -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 '
|
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
|
-
|
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
|
@@ -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
|
-
|
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 =
|
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
@@ -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
|