@operato/data-grist 2.0.0-alpha.0 → 2.0.0-alpha.3
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 +24 -0
- package/dist/src/configure/column-builder.js +5 -5
- package/dist/src/configure/column-builder.js.map +1 -1
- package/dist/src/configure/zero-config.js +3 -1
- package/dist/src/configure/zero-config.js.map +1 -1
- package/dist/src/data-card/data-card-field.js +1 -1
- package/dist/src/data-card/data-card-field.js.map +1 -1
- package/dist/src/data-grid/data-grid-accum-field.d.ts +1 -0
- package/dist/src/data-grid/data-grid-accum-field.js +8 -0
- package/dist/src/data-grid/data-grid-accum-field.js.map +1 -1
- package/dist/src/data-grid/data-grid-body.js +24 -3
- package/dist/src/data-grid/data-grid-body.js.map +1 -1
- package/dist/src/data-grid/data-grid-field.d.ts +1 -0
- package/dist/src/data-grid/data-grid-field.js +5 -0
- package/dist/src/data-grid/data-grid-field.js.map +1 -1
- package/dist/src/data-grid/event-handlers/data-grid-body-click-handler.js +2 -2
- package/dist/src/data-grid/event-handlers/data-grid-body-click-handler.js.map +1 -1
- package/dist/src/data-grid/event-handlers/data-grid-body-contextmenu-handler.d.ts +7 -0
- package/dist/src/data-grid/event-handlers/data-grid-body-contextmenu-handler.js +25 -0
- package/dist/src/data-grid/event-handlers/data-grid-body-contextmenu-handler.js.map +1 -0
- package/dist/src/data-grid/event-handlers/data-grid-body-dblclick-handler.js +2 -2
- package/dist/src/data-grid/event-handlers/data-grid-body-dblclick-handler.js.map +1 -1
- package/dist/src/data-grid/event-handlers/data-grid-body-focus-change-handler.js +2 -2
- package/dist/src/data-grid/event-handlers/data-grid-body-focus-change-handler.js.map +1 -1
- package/dist/src/data-list/data-list-field.js +1 -1
- package/dist/src/data-list/data-list-field.js.map +1 -1
- package/dist/src/data-manipulator.d.ts +7 -3
- package/dist/src/data-manipulator.js +86 -18
- package/dist/src/data-manipulator.js.map +1 -1
- package/dist/src/editors/ox-grist-editor-tree.d.ts +6 -0
- package/dist/src/editors/ox-grist-editor-tree.js +27 -0
- package/dist/src/editors/ox-grist-editor-tree.js.map +1 -0
- package/dist/src/editors/ox-grist-editor.d.ts +1 -0
- package/dist/src/editors/ox-grist-editor.js +3 -0
- package/dist/src/editors/ox-grist-editor.js.map +1 -1
- package/dist/src/editors/ox-input-tree.d.ts +20 -0
- package/dist/src/editors/ox-input-tree.js +221 -0
- package/dist/src/editors/ox-input-tree.js.map +1 -0
- package/dist/src/editors/registry.js +3 -1
- package/dist/src/editors/registry.js.map +1 -1
- package/dist/src/filters/filters-form.js +1 -1
- package/dist/src/filters/filters-form.js.map +1 -1
- package/dist/src/handlers/contextmenu-tree-mutation.d.ts +3 -0
- package/dist/src/handlers/contextmenu-tree-mutation.js +82 -0
- package/dist/src/handlers/contextmenu-tree-mutation.js.map +1 -0
- package/dist/src/handlers/registry.js +3 -1
- package/dist/src/handlers/registry.js.map +1 -1
- package/dist/src/renderers/ox-grist-renderer-tree.d.ts +1 -0
- package/dist/src/renderers/ox-grist-renderer-tree.js +6 -3
- package/dist/src/renderers/ox-grist-renderer-tree.js.map +1 -1
- package/dist/src/types.d.ts +437 -6
- package/dist/src/types.js +9 -0
- package/dist/src/types.js.map +1 -1
- package/dist/stories/tree-column-with-checkbox.stories.js +8 -3
- package/dist/stories/tree-column-with-checkbox.stories.js.map +1 -1
- package/dist/stories/tree-column.stories.js +8 -3
- package/dist/stories/tree-column.stories.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/docs/gutter/gutter.md +7 -0
- package/package.json +4 -4
- package/src/configure/column-builder.ts +4 -4
- package/src/configure/zero-config.ts +3 -1
- package/src/data-card/data-card-field.ts +1 -1
- package/src/data-grid/data-grid-accum-field.ts +7 -0
- package/src/data-grid/data-grid-body.ts +30 -3
- package/src/data-grid/data-grid-field.ts +6 -0
- package/src/data-grid/event-handlers/data-grid-body-click-handler.ts +2 -2
- package/src/data-grid/event-handlers/data-grid-body-contextmenu-handler.ts +32 -0
- package/src/data-grid/event-handlers/data-grid-body-dblclick-handler.ts +2 -2
- package/src/data-grid/event-handlers/data-grid-body-focus-change-handler.ts +2 -2
- package/src/data-list/data-list-field.ts +1 -1
- package/src/data-manipulator.ts +109 -22
- package/src/editors/ox-grist-editor-tree.ts +27 -0
- package/src/editors/ox-grist-editor.ts +4 -0
- package/src/editors/ox-input-tree.ts +226 -0
- package/src/editors/registry.ts +3 -1
- package/src/filters/filters-form.ts +1 -1
- package/src/handlers/contextmenu-tree-mutation.ts +98 -0
- package/src/handlers/registry.ts +3 -1
- package/src/renderers/ox-grist-renderer-tree.ts +7 -3
- package/src/types.ts +446 -6
- package/stories/tree-column-with-checkbox.stories.ts +8 -3
- package/stories/tree-column.stories.ts +8 -3
@@ -0,0 +1,226 @@
|
|
1
|
+
/**
|
2
|
+
* @license Copyright © HatioLab Inc. All rights reserved.
|
3
|
+
*/
|
4
|
+
|
5
|
+
import { PropertyValues, css, html, nothing } from 'lit'
|
6
|
+
import { customElement, property, query, state } from 'lit/decorators.js'
|
7
|
+
import { ifDefined } from 'lit/directives/if-defined.js'
|
8
|
+
|
9
|
+
import { OxFormField } from '@operato/input'
|
10
|
+
import { GristRecord } from '../types'
|
11
|
+
|
12
|
+
@customElement('ox-input-tree')
|
13
|
+
export class OxInputTree extends OxFormField {
|
14
|
+
static styles = css`
|
15
|
+
:host {
|
16
|
+
overflow: hidden;
|
17
|
+
}
|
18
|
+
|
19
|
+
div[wrap] {
|
20
|
+
flex: 1;
|
21
|
+
|
22
|
+
position: relative;
|
23
|
+
|
24
|
+
display: flex;
|
25
|
+
align-items: center;
|
26
|
+
gap: 6px;
|
27
|
+
|
28
|
+
padding-left: calc(var(--tree-depth, 0) * 18px);
|
29
|
+
}
|
30
|
+
|
31
|
+
span[expander] {
|
32
|
+
display: inline-block;
|
33
|
+
vertical-align: middle;
|
34
|
+
width: 12px;
|
35
|
+
height: 20px;
|
36
|
+
cursor: pointer;
|
37
|
+
position: relative;
|
38
|
+
}
|
39
|
+
|
40
|
+
span[expander][collapsed]::before {
|
41
|
+
position: absolute;
|
42
|
+
top: 50%;
|
43
|
+
left: 50%;
|
44
|
+
transform: translate(-25%, -50%) rotate(-90deg);
|
45
|
+
content: ' ';
|
46
|
+
border: 5px solid transparent;
|
47
|
+
border-top: 5px solid var(--primary-color, #1890ff);
|
48
|
+
}
|
49
|
+
|
50
|
+
span[expander][expanded]::before {
|
51
|
+
position: absolute;
|
52
|
+
top: 50%;
|
53
|
+
left: 50%;
|
54
|
+
transform: translate(-50%, -25%);
|
55
|
+
content: ' ';
|
56
|
+
border: 5px solid transparent;
|
57
|
+
border-top: 5px solid var(--primary-color, #1890ff);
|
58
|
+
}
|
59
|
+
|
60
|
+
span[checkbox] {
|
61
|
+
display: inline-block;
|
62
|
+
vertical-align: middle;
|
63
|
+
width: 12px;
|
64
|
+
height: 20px;
|
65
|
+
cursor: pointer;
|
66
|
+
position: relative;
|
67
|
+
}
|
68
|
+
|
69
|
+
span[checkbox]::before {
|
70
|
+
cursor: pointer;
|
71
|
+
position: absolute;
|
72
|
+
top: 50%;
|
73
|
+
left: 50%;
|
74
|
+
transform: translate(-50%, -50%);
|
75
|
+
content: ' ';
|
76
|
+
display: block;
|
77
|
+
width: 10px;
|
78
|
+
height: 10px;
|
79
|
+
border: 1px solid var(--primary-color, #1890ff);
|
80
|
+
border-radius: 2px;
|
81
|
+
}
|
82
|
+
|
83
|
+
span[checkbox][checked='checked']::before {
|
84
|
+
background-color: var(--primary-color, #1890ff);
|
85
|
+
border-color: var(--primary-color, #1890ff);
|
86
|
+
}
|
87
|
+
|
88
|
+
span[checkbox][checked='checked']::after {
|
89
|
+
position: absolute;
|
90
|
+
content: ' ';
|
91
|
+
display: block;
|
92
|
+
top: 50%;
|
93
|
+
left: 50%;
|
94
|
+
width: 3px;
|
95
|
+
height: 7px;
|
96
|
+
border: 2px solid #fff;
|
97
|
+
border-top: none;
|
98
|
+
border-left: none;
|
99
|
+
-webkit-transform: translate(-50%, -50%) rotate(45deg);
|
100
|
+
-ms-transform: translate(-50%, -50%) rotate(45deg);
|
101
|
+
transform: translate(-50%, -50%) rotate(45deg);
|
102
|
+
}
|
103
|
+
|
104
|
+
span[checkbox][checked='half-checked']::before {
|
105
|
+
background-color: var(--primary-color, #1890ff);
|
106
|
+
border-color: var(--primary-color, #1890ff);
|
107
|
+
}
|
108
|
+
|
109
|
+
span[checkbox][checked='half-checked']::after {
|
110
|
+
position: absolute;
|
111
|
+
content: ' ';
|
112
|
+
display: block;
|
113
|
+
top: 50%;
|
114
|
+
left: 50%;
|
115
|
+
transform: translate(-50%, -50%);
|
116
|
+
width: 10px;
|
117
|
+
height: 2px;
|
118
|
+
background-color: #fff;
|
119
|
+
}
|
120
|
+
|
121
|
+
span[label] {
|
122
|
+
flex: 1;
|
123
|
+
}
|
124
|
+
|
125
|
+
input {
|
126
|
+
width: 100%;
|
127
|
+
height: 100%;
|
128
|
+
border: 0;
|
129
|
+
background-color: transparent;
|
130
|
+
box-sizing: border-box;
|
131
|
+
}
|
132
|
+
|
133
|
+
input:focus {
|
134
|
+
outline: none;
|
135
|
+
}
|
136
|
+
`
|
137
|
+
|
138
|
+
@property({ type: Object }) record!: GristRecord
|
139
|
+
@property({ type: Boolean }) selectable?: boolean
|
140
|
+
|
141
|
+
@state() private checked?: 'checked' | 'half-checked' | 'unchecked'
|
142
|
+
@state() private expanded?: boolean = false
|
143
|
+
|
144
|
+
@query('input') input!: HTMLInputElement
|
145
|
+
|
146
|
+
render() {
|
147
|
+
var { __children__ } = this.record
|
148
|
+
|
149
|
+
const expandable = __children__ && __children__.length > 0
|
150
|
+
|
151
|
+
return html`
|
152
|
+
<div wrap>
|
153
|
+
${expandable
|
154
|
+
? html`
|
155
|
+
<span
|
156
|
+
expander
|
157
|
+
@click=${this.onClickExpander.bind(this)}
|
158
|
+
?expanded=${this.expanded}
|
159
|
+
?collapsed=${!this.expanded}
|
160
|
+
></span>
|
161
|
+
`
|
162
|
+
: html`<span expander></span>`}
|
163
|
+
${this.selectable
|
164
|
+
? html` <span checkbox @click=${this.onClickCheckbox.bind(this)} checked=${ifDefined(this.checked)}></span>`
|
165
|
+
: nothing}
|
166
|
+
|
167
|
+
<span label
|
168
|
+
><input
|
169
|
+
value=${ifDefined(this.value)}
|
170
|
+
@change=${(e: Event) => {
|
171
|
+
e.stopPropagation()
|
172
|
+
this.value = (e.target as HTMLInputElement).value
|
173
|
+
this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true }))
|
174
|
+
}}
|
175
|
+
focus
|
176
|
+
/></span>
|
177
|
+
|
178
|
+
<!-- <span label>${this.value}</span> -->
|
179
|
+
</div>
|
180
|
+
`
|
181
|
+
}
|
182
|
+
|
183
|
+
updated(changes: PropertyValues<this>) {
|
184
|
+
var { __depth__, __check_in_tree__, __expanded__ } = this.record
|
185
|
+
this.checked = __check_in_tree__
|
186
|
+
this.expanded = __expanded__
|
187
|
+
|
188
|
+
this.style.setProperty('--tree-depth', String(__depth__))
|
189
|
+
}
|
190
|
+
|
191
|
+
focus() {
|
192
|
+
this.input.focus()
|
193
|
+
}
|
194
|
+
|
195
|
+
select() {
|
196
|
+
this.input.select()
|
197
|
+
}
|
198
|
+
|
199
|
+
onClickCheckbox(e: MouseEvent) {
|
200
|
+
e.stopPropagation()
|
201
|
+
|
202
|
+
this.dispatchEvent(
|
203
|
+
new CustomEvent('check-in-tree', {
|
204
|
+
bubbles: true,
|
205
|
+
composed: true,
|
206
|
+
detail: this.record
|
207
|
+
})
|
208
|
+
)
|
209
|
+
|
210
|
+
this.requestUpdate()
|
211
|
+
}
|
212
|
+
|
213
|
+
onClickExpander(e: MouseEvent) {
|
214
|
+
e.stopPropagation()
|
215
|
+
|
216
|
+
this.dispatchEvent(
|
217
|
+
new CustomEvent(this.record.__expanded__ ? 'collapse-node' : 'expand-node', {
|
218
|
+
bubbles: true,
|
219
|
+
composed: true,
|
220
|
+
detail: this.record
|
221
|
+
})
|
222
|
+
)
|
223
|
+
|
224
|
+
this.requestUpdate()
|
225
|
+
}
|
226
|
+
}
|
package/src/editors/registry.ts
CHANGED
@@ -17,6 +17,7 @@ import { OxGristEditorTel } from './ox-grist-editor-tel'
|
|
17
17
|
import { OxGristEditorText } from './ox-grist-editor-text'
|
18
18
|
import { OxGristEditorTextarea } from './ox-grist-editor-textarea'
|
19
19
|
import { OxGristEditorTime } from './ox-grist-editor-time'
|
20
|
+
import { OxGristEditorTree } from './ox-grist-editor-tree'
|
20
21
|
import { OxGristEditorWeek } from './ox-grist-editor-week'
|
21
22
|
|
22
23
|
var EDITORS: { [name: string]: { new (): OxGristEditor } } = {
|
@@ -42,7 +43,8 @@ var EDITORS: { [name: string]: { new (): OxGristEditor } } = {
|
|
42
43
|
link: OxGristEditorText,
|
43
44
|
image: OxGristEditorImage,
|
44
45
|
file: OxGristEditorFile,
|
45
|
-
'string[]': OxGristEditorMultipleSelect
|
46
|
+
'string[]': OxGristEditorMultipleSelect,
|
47
|
+
tree: OxGristEditorTree
|
46
48
|
}
|
47
49
|
|
48
50
|
export function registerEditor(type: string, editor: { new (): OxGristEditor }) {
|
@@ -151,7 +151,7 @@ export class FiltersForm extends LitElement {
|
|
151
151
|
filterLabel !== undefined
|
152
152
|
? filterLabel
|
153
153
|
: typeof label === 'object' && label.renderer
|
154
|
-
? label.renderer()
|
154
|
+
? label.renderer(column)
|
155
155
|
: header.renderer(column) || name
|
156
156
|
|
157
157
|
const idx = operator === 'between' ? 1 : 0
|
@@ -0,0 +1,98 @@
|
|
1
|
+
import { html } from 'lit'
|
2
|
+
import { OxPopupMenu } from '@operato/popup'
|
3
|
+
|
4
|
+
import { DataGridField } from '../data-grid/data-grid-field'
|
5
|
+
import { ColumnConfig, GristData, GristRecord } from '../types'
|
6
|
+
|
7
|
+
function dispatchEvent(field: DataGridField, event: string) {
|
8
|
+
field.dispatchEvent(
|
9
|
+
new CustomEvent(event, {
|
10
|
+
bubbles: true,
|
11
|
+
composed: true,
|
12
|
+
detail: field
|
13
|
+
})
|
14
|
+
)
|
15
|
+
}
|
16
|
+
|
17
|
+
/*
|
18
|
+
* handler들은 ox-grid-field 로부터 호출되는 것을 전제로 하며,
|
19
|
+
* 전반적인 처리를 위해서, columns 및 data 정보를 포함해서 제공할 수 있어야 한다.
|
20
|
+
*/
|
21
|
+
export const ContextMenuTreeMutation = function (
|
22
|
+
columns: ColumnConfig[],
|
23
|
+
data: GristData,
|
24
|
+
column: ColumnConfig,
|
25
|
+
record: GristRecord,
|
26
|
+
rowIndex: number,
|
27
|
+
field: DataGridField,
|
28
|
+
event: Event
|
29
|
+
): void {
|
30
|
+
const e = event as PointerEvent
|
31
|
+
if (!('pageX' in e && 'pageY' in e)) {
|
32
|
+
return
|
33
|
+
}
|
34
|
+
|
35
|
+
e.preventDefault()
|
36
|
+
|
37
|
+
OxPopupMenu.open({
|
38
|
+
template: html`
|
39
|
+
<ox-popup-menuitem
|
40
|
+
label="add sibling node"
|
41
|
+
@click=${() => {
|
42
|
+
dispatchEvent(field, 'add-sibling-node')
|
43
|
+
}}
|
44
|
+
>
|
45
|
+
<mwc-icon slot="icon">add</mwc-icon>
|
46
|
+
</ox-popup-menuitem>
|
47
|
+
|
48
|
+
<ox-popup-menuitem
|
49
|
+
label="add child node"
|
50
|
+
@click=${() => {
|
51
|
+
dispatchEvent(field, 'add-child-node')
|
52
|
+
}}
|
53
|
+
>
|
54
|
+
<mwc-icon slot="icon">playlist_add</mwc-icon>
|
55
|
+
</ox-popup-menuitem>
|
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
|
+
<div separator></div>
|
76
|
+
|
77
|
+
<ox-popup-menuitem
|
78
|
+
label="collapse all"
|
79
|
+
@click=${() => {
|
80
|
+
dispatchEvent(field, 'collapse-all')
|
81
|
+
}}
|
82
|
+
>
|
83
|
+
<mwc-icon slot="icon">unfold_less</mwc-icon>
|
84
|
+
</ox-popup-menuitem>
|
85
|
+
|
86
|
+
<ox-popup-menuitem
|
87
|
+
label="expand all"
|
88
|
+
@click=${() => {
|
89
|
+
dispatchEvent(field, 'expand-all')
|
90
|
+
}}
|
91
|
+
>
|
92
|
+
<mwc-icon slot="icon">unfold_more</mwc-icon>
|
93
|
+
</ox-popup-menuitem>
|
94
|
+
`,
|
95
|
+
top: e.pageY,
|
96
|
+
left: e.pageX
|
97
|
+
})
|
98
|
+
}
|
package/src/handlers/registry.ts
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
import { GristEventHandler } from '../types'
|
2
|
+
import { ContextMenuTreeMutation } from './contextmenu-tree-mutation'
|
2
3
|
import { MoveDown } from './move-down'
|
3
4
|
import { MoveUp } from './move-up'
|
4
5
|
import { RecordCopy } from './record-copy'
|
@@ -16,7 +17,8 @@ var HANDLERS: {
|
|
16
17
|
'move-up': MoveUp as GristEventHandler,
|
17
18
|
'move-down': MoveDown as GristEventHandler,
|
18
19
|
'record-copy': RecordCopy as GristEventHandler,
|
19
|
-
'record-delete': RecordDelete as GristEventHandler
|
20
|
+
'record-delete': RecordDelete as GristEventHandler,
|
21
|
+
'contextmenu-tree-mutation': ContextMenuTreeMutation as GristEventHandler
|
20
22
|
}
|
21
23
|
|
22
24
|
export function registerGristEventHandler(type: string, handler: GristEventHandler) {
|
@@ -74,8 +74,8 @@ export class OxGristRendererTree extends OxGristRenderer {
|
|
74
74
|
border-radius: 2px;
|
75
75
|
}
|
76
76
|
|
77
|
-
span[label]
|
78
|
-
|
77
|
+
span[label] {
|
78
|
+
flex: 1;
|
79
79
|
}
|
80
80
|
|
81
81
|
span[checkbox][checked='checked']::before {
|
@@ -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
|
@@ -182,4 +182,8 @@ export class OxGristRendererTree extends OxGristRenderer {
|
|
182
182
|
|
183
183
|
this.requestUpdate()
|
184
184
|
}
|
185
|
+
|
186
|
+
get editableOnClick() {
|
187
|
+
return false
|
188
|
+
}
|
185
189
|
}
|