@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
@@ -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
+ }
@@ -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.record
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
+ }
@@ -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][selected] {
78
- background-color: var(--primary-color, #1890ff);
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__ ? '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
@@ -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
  }