@operato/data-grist 1.0.0-alpha.47 → 1.0.0-alpha.48
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 +16 -0
- package/dist/src/const.d.ts +0 -12
- package/dist/src/const.js +0 -13
- package/dist/src/const.js.map +1 -1
- package/dist/src/data-grid/data-grid-body-style.js +1 -0
- package/dist/src/data-grid/data-grid-body-style.js.map +1 -1
- package/dist/src/data-grid/data-grid-body.d.ts +12 -1
- package/dist/src/data-grid/data-grid-body.js +171 -8
- package/dist/src/data-grid/data-grid-body.js.map +1 -1
- package/dist/src/data-grid/data-grid.d.ts +2 -2
- package/dist/src/data-grid/data-grid.js +3 -2
- package/dist/src/data-grid/data-grid.js.map +1 -1
- package/dist/src/data-grid/event-handlers/data-grid-body-keydown-handler.js +91 -34
- package/dist/src/data-grid/event-handlers/data-grid-body-keydown-handler.js.map +1 -1
- package/dist/src/data-report/event-handlers/data-report-body-keydown-handler.js +17 -13
- package/dist/src/data-report/event-handlers/data-report-body-keydown-handler.js.map +1 -1
- package/dist/src/filters/filters-form.d.ts +1 -1
- package/dist/src/filters/filters-form.js +9 -2
- package/dist/src/filters/filters-form.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
- package/src/const.ts +0 -13
- package/src/data-grid/data-grid-body-style.ts +1 -0
- package/src/data-grid/data-grid-body.ts +206 -10
- package/src/data-grid/data-grid.ts +6 -6
- package/src/data-grid/event-handlers/data-grid-body-keydown-handler.ts +88 -35
- package/src/data-report/event-handlers/data-report-body-keydown-handler.ts +17 -13
- package/src/filters/filters-form.ts +13 -4
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,22 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [1.0.0-alpha.48](https://github.com/hatiolab/operato/compare/v1.0.0-alpha.47...v1.0.0-alpha.48) (2022-04-03)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### :bug: Bug Fix
|
|
10
|
+
|
|
11
|
+
* event handling for clicking magnify icon in filters-form - fetch data forcely ([cc17a05](https://github.com/hatiolab/operato/commit/cc17a056807a6e5018ee89d1f6be91e463671bac))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### :rocket: New Features
|
|
15
|
+
|
|
16
|
+
* support copy and paste in data-grid ([9dd686f](https://github.com/hatiolab/operato/commit/9dd686f6817500863a1c36140ef01b39fcafef9f))
|
|
17
|
+
* support data-grist block selection ([b9238ae](https://github.com/hatiolab/operato/commit/b9238ae7848b9824466b2ce843d56d3eac789104))
|
|
18
|
+
* support data-grist block selection ([537577a](https://github.com/hatiolab/operato/commit/537577a160abc0aa0d9df4374eca0ddcadf0bd7f))
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
6
22
|
## [1.0.0-alpha.47](https://github.com/hatiolab/operato/compare/v1.0.0-alpha.46...v1.0.0-alpha.47) (2022-04-02)
|
|
7
23
|
|
|
8
24
|
**Note:** Version bump only for package @operato/data-grist
|
package/dist/src/const.d.ts
CHANGED
package/dist/src/const.js
CHANGED
|
@@ -1,15 +1,2 @@
|
|
|
1
1
|
export const NOOP = function () { };
|
|
2
|
-
export var KEYCODE;
|
|
3
|
-
(function (KEYCODE) {
|
|
4
|
-
KEYCODE[KEYCODE["KEY_LEFT"] = 37] = "KEY_LEFT";
|
|
5
|
-
KEYCODE[KEYCODE["KEY_UP"] = 38] = "KEY_UP";
|
|
6
|
-
KEYCODE[KEYCODE["KEY_RIGHT"] = 39] = "KEY_RIGHT";
|
|
7
|
-
KEYCODE[KEYCODE["KEY_DOWN"] = 40] = "KEY_DOWN";
|
|
8
|
-
KEYCODE[KEYCODE["KEY_ENTER"] = 13] = "KEY_ENTER";
|
|
9
|
-
KEYCODE[KEYCODE["KEY_TAP"] = 9] = "KEY_TAP";
|
|
10
|
-
KEYCODE[KEYCODE["KEY_BACKSPACE"] = 8] = "KEY_BACKSPACE";
|
|
11
|
-
KEYCODE[KEYCODE["KEY_ESC"] = 27] = "KEY_ESC";
|
|
12
|
-
KEYCODE[KEYCODE["KEY_PAGEUP"] = 33] = "KEY_PAGEUP";
|
|
13
|
-
KEYCODE[KEYCODE["KEY_PAGEDOWN"] = 34] = "KEY_PAGEDOWN";
|
|
14
|
-
})(KEYCODE || (KEYCODE = {}));
|
|
15
2
|
//# sourceMappingURL=const.js.map
|
package/dist/src/const.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../src/const.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,cAAa,CAAC,CAAA
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../src/const.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,cAAa,CAAC,CAAA","sourcesContent":["export const NOOP = function () {}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-grid-body-style.js","sourceRoot":"","sources":["../../../src/data-grid/data-grid-body-style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAEzB,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAA
|
|
1
|
+
{"version":3,"file":"data-grid-body-style.js","sourceRoot":"","sources":["../../../src/data-grid/data-grid-body-style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAEzB,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqEnC,CAAA","sourcesContent":["import { css } from 'lit'\n\nexport const dataGridBodyStyle = css`\n :host {\n display: grid;\n grid-template-columns: var(--grid-template-columns);\n grid-auto-rows: var(--grid-record-height, min-content);\n\n overflow: auto;\n outline: none;\n color: var(--grid-record-color);\n position: relative;\n }\n\n [odd] {\n background-color: var(--grid-record-odd-background-color);\n }\n\n [selected-row] {\n background-color: var(--grid-record-selected-background-color);\n color: var(--grid-record-selected-color);\n }\n\n [focused-row] {\n box-shadow: var(--grid-record-focused-box-shadow);\n font-weight: bold;\n color: var(--grid-record-focused-color);\n background-image: var(--focused-background-image);\n background-blend-mode: darken;\n }\n\n [focused] {\n border: var(--grid-record-focused-cell-border);\n }\n\n [emphasized-row],\n [emphasized-row][focused] {\n background-color: var(--grid-record-emphasized-background-color);\n color: var(--grid-record-emphasized-color);\n }\n\n [editing] {\n background-color: var(--grid-record-editing-background-color);\n }\n\n @media print {\n :host {\n grid-template-columns: var(--grid-template-print-columns);\n }\n [focused] {\n border: none;\n }\n\n [selected-row] {\n background-color: transparent;\n }\n\n [emphasized-row] {\n background-color: transparent;\n color: initial;\n }\n\n [focused-row] {\n background-color: transparent;\n color: initial;\n }\n\n [editing] {\n background-color: transparent;\n }\n }\n`\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import './data-grid-field';
|
|
2
|
-
import { LitElement, PropertyValues } from 'lit';
|
|
3
2
|
import { ColumnConfig, GristConfig, GristData, GristRecord } from '../types';
|
|
3
|
+
import { LitElement, PropertyValues } from 'lit';
|
|
4
|
+
import { DataGridField } from './data-grid-field';
|
|
4
5
|
export declare class DataGridBody extends LitElement {
|
|
5
6
|
debounce: import("lodash").DebouncedFunc<(scrollTop: number, clientHeight: number) => void>;
|
|
6
7
|
static styles: import("lit").CSSResult[];
|
|
@@ -17,9 +18,16 @@ export declare class DataGridBody extends LitElement {
|
|
|
17
18
|
} | null;
|
|
18
19
|
from: number;
|
|
19
20
|
to: number;
|
|
21
|
+
_selectBlock?: {
|
|
22
|
+
start: DataGridField;
|
|
23
|
+
end?: DataGridField;
|
|
24
|
+
};
|
|
25
|
+
selectBlock?: HTMLDivElement;
|
|
26
|
+
focusedField?: DataGridField;
|
|
20
27
|
private _focusedListener?;
|
|
21
28
|
private _recordView?;
|
|
22
29
|
private _recordViewRow?;
|
|
30
|
+
private _selectBlockWillBeReset;
|
|
23
31
|
resetEdit(): void;
|
|
24
32
|
handleOnScroll(e: WheelEvent): void;
|
|
25
33
|
render(): import("lit-html").TemplateResult<1>;
|
|
@@ -33,4 +41,7 @@ export declare class DataGridBody extends LitElement {
|
|
|
33
41
|
row: number;
|
|
34
42
|
record: GristRecord;
|
|
35
43
|
}): void;
|
|
44
|
+
getSelectedBlockValues(): Array<Array<any>> | undefined;
|
|
45
|
+
copy(): Promise<void>;
|
|
46
|
+
paste(): Promise<void>;
|
|
36
47
|
}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
2
|
import './data-grid-field';
|
|
3
|
-
import {
|
|
4
|
-
import { customElement, property } from 'lit/decorators.js';
|
|
5
|
-
import debounce from 'lodash-es/debounce';
|
|
3
|
+
import { LitElement, css, html } from 'lit';
|
|
6
4
|
import { ZERO_CONFIG, ZERO_DATA } from '../configure/zero-config';
|
|
5
|
+
import { customElement, property, query, state } from 'lit/decorators.js';
|
|
7
6
|
import { RecordViewHandler } from '../record-view/record-view-handler';
|
|
8
|
-
import {
|
|
9
|
-
import { dataGridBodyStyle } from './data-grid-body-style';
|
|
7
|
+
import { TooltipStyles } from '@operato/styles';
|
|
10
8
|
import { dataGridBodyClickHandler } from './event-handlers/data-grid-body-click-handler';
|
|
11
9
|
import { dataGridBodyDblclickHandler } from './event-handlers/data-grid-body-dblclick-handler';
|
|
12
10
|
import { dataGridBodyKeydownHandler } from './event-handlers/data-grid-body-keydown-handler';
|
|
11
|
+
import { dataGridBodyStyle } from './data-grid-body-style';
|
|
12
|
+
import debounce from 'lodash-es/debounce';
|
|
13
|
+
import { sleep } from '@operato/utils';
|
|
14
|
+
import { supportsPassive } from '../utils';
|
|
13
15
|
const THRESHOLD = 300;
|
|
14
16
|
const DATA_PADDING = 3;
|
|
15
17
|
const ROW_HEIGHT = 40;
|
|
@@ -48,6 +50,7 @@ let DataGridBody = class DataGridBody extends LitElement {
|
|
|
48
50
|
this.editTarget = null;
|
|
49
51
|
this.from = -1;
|
|
50
52
|
this.to = -1;
|
|
53
|
+
this._selectBlockWillBeReset = true;
|
|
51
54
|
}
|
|
52
55
|
resetEdit() {
|
|
53
56
|
this.editTarget = null;
|
|
@@ -67,6 +70,7 @@ let DataGridBody = class DataGridBody extends LitElement {
|
|
|
67
70
|
var data = this.data;
|
|
68
71
|
var { records } = data;
|
|
69
72
|
var { appendable, classifier } = this.config.rows;
|
|
73
|
+
const { start, end } = this._selectBlock || {};
|
|
70
74
|
/*
|
|
71
75
|
* 레코드를 추가할 수 있는 경우에는 항상 추가 레코드를 보여준다.
|
|
72
76
|
* 만약, 이전 방식처럼, 커서를 옮겨야만 새로운 레코드가 보이게 하고 싶다면, 조건부를 다음의 코드로 대체한다.
|
|
@@ -112,6 +116,7 @@ let DataGridBody = class DataGridBody extends LitElement {
|
|
|
112
116
|
></ox-grid-field>
|
|
113
117
|
`;
|
|
114
118
|
})}
|
|
119
|
+
${start && end ? html ` <div select-block></div> ` : html ``}
|
|
115
120
|
`;
|
|
116
121
|
}
|
|
117
122
|
firstUpdated() {
|
|
@@ -126,16 +131,69 @@ let DataGridBody = class DataGridBody extends LitElement {
|
|
|
126
131
|
*/
|
|
127
132
|
this.addEventListener('focusout', e => {
|
|
128
133
|
if (this._focusedListener) {
|
|
129
|
-
|
|
134
|
+
this.removeEventListener('keydown', this._focusedListener);
|
|
130
135
|
delete this._focusedListener;
|
|
131
136
|
}
|
|
132
137
|
});
|
|
133
138
|
this.addEventListener('focusin', e => {
|
|
134
139
|
if (!this._focusedListener) {
|
|
135
140
|
this._focusedListener = dataGridBodyKeydownHandler.bind(this);
|
|
136
|
-
|
|
141
|
+
this.addEventListener('keydown', this._focusedListener);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
this.renderRoot.addEventListener('mousemove', (event) => {
|
|
145
|
+
var _a;
|
|
146
|
+
const e = event;
|
|
147
|
+
if (e.buttons !== 1) {
|
|
148
|
+
this._selectBlockWillBeReset = true;
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const field = e.target;
|
|
152
|
+
if (!this._selectBlock || this._selectBlockWillBeReset) {
|
|
153
|
+
this._selectBlockWillBeReset = false;
|
|
154
|
+
this._selectBlock = { start: field };
|
|
155
|
+
this.dispatchEvent(new CustomEvent('focus-change', {
|
|
156
|
+
bubbles: true,
|
|
157
|
+
composed: true,
|
|
158
|
+
detail: undefined
|
|
159
|
+
// detail: {
|
|
160
|
+
// row: field!.rowIndex,
|
|
161
|
+
// column: field!.columnIndex
|
|
162
|
+
// }
|
|
163
|
+
}));
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
var { start, end } = this._selectBlock || {};
|
|
167
|
+
if (start !== field && !end) {
|
|
168
|
+
/* cancel all selected text */
|
|
169
|
+
(_a = window.getSelection()) === null || _a === void 0 ? void 0 : _a.removeAllRanges();
|
|
170
|
+
}
|
|
171
|
+
if (start === field && !end) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (start && end !== field) {
|
|
175
|
+
end = field;
|
|
176
|
+
const left = start.columnIndex < end.columnIndex ? start : end;
|
|
177
|
+
const right = left === start ? end : start;
|
|
178
|
+
const top = start.rowIndex < end.rowIndex ? start : end;
|
|
179
|
+
const bottom = top === start ? end : start;
|
|
180
|
+
const { offsetLeft } = left;
|
|
181
|
+
const { offsetTop } = top;
|
|
182
|
+
const width = right.offsetLeft - offsetLeft + right.offsetWidth;
|
|
183
|
+
const height = bottom.offsetTop - offsetTop + bottom.offsetHeight;
|
|
184
|
+
this.style.setProperty('--select-box-left', offsetLeft - 1 + 'px');
|
|
185
|
+
this.style.setProperty('--select-box-top', offsetTop - 1 + 'px');
|
|
186
|
+
this.style.setProperty('--select-box-width', width + 'px');
|
|
187
|
+
this.style.setProperty('--select-box-height', height + 'px');
|
|
188
|
+
this._selectBlock = {
|
|
189
|
+
start,
|
|
190
|
+
end
|
|
191
|
+
};
|
|
137
192
|
}
|
|
138
193
|
});
|
|
194
|
+
this.renderRoot.addEventListener('mouseup', (event) => {
|
|
195
|
+
this._selectBlockWillBeReset = true;
|
|
196
|
+
});
|
|
139
197
|
this.renderRoot.addEventListener('click', dataGridBodyClickHandler.bind(this));
|
|
140
198
|
this.renderRoot.addEventListener('dblclick', dataGridBodyDblclickHandler.bind(this));
|
|
141
199
|
this.addEventListener('wheel', this._onWheelEvent.bind(this), supportsPassive ? { passive: true } : false);
|
|
@@ -176,6 +234,7 @@ let DataGridBody = class DataGridBody extends LitElement {
|
|
|
176
234
|
if (!element) {
|
|
177
235
|
return;
|
|
178
236
|
}
|
|
237
|
+
this._selectBlock = undefined;
|
|
179
238
|
let { top, left } = calcScrollPos(this, element);
|
|
180
239
|
// TODO this.scroll()을 사용하면, 효과가 좋으나 left 계산에 문제가 있는 것 같음.
|
|
181
240
|
// this.scroll({
|
|
@@ -218,8 +277,103 @@ let DataGridBody = class DataGridBody extends LitElement {
|
|
|
218
277
|
delete this._recordViewRow;
|
|
219
278
|
});
|
|
220
279
|
}
|
|
280
|
+
getSelectedBlockValues() {
|
|
281
|
+
var { start, end } = this._selectBlock || {};
|
|
282
|
+
if (!(start && end)) {
|
|
283
|
+
start = this.focusedField;
|
|
284
|
+
end = start;
|
|
285
|
+
}
|
|
286
|
+
if (start && end) {
|
|
287
|
+
const startRowIndex = start.rowIndex < end.rowIndex ? start.rowIndex : end.rowIndex;
|
|
288
|
+
const endRowIndex = start.rowIndex < end.rowIndex ? end.rowIndex : start.rowIndex;
|
|
289
|
+
const startColumnIndex = start.columnIndex < end.columnIndex ? start.columnIndex : end.columnIndex;
|
|
290
|
+
const endColumnIndex = start.columnIndex < end.columnIndex ? end.columnIndex : start.columnIndex;
|
|
291
|
+
const columnArray = new Array(endColumnIndex - startColumnIndex + 1).fill(startColumnIndex);
|
|
292
|
+
const columns = this.columns.filter(column => !column.hidden);
|
|
293
|
+
return new Array(endRowIndex - startRowIndex + 1).fill(startRowIndex).map((start, index) => {
|
|
294
|
+
const rowIndex = start + index;
|
|
295
|
+
const record = this.data.records[rowIndex];
|
|
296
|
+
return columnArray.map((start, index) => {
|
|
297
|
+
const columnIndex = start + index;
|
|
298
|
+
const column = columns[columnIndex];
|
|
299
|
+
return record[column.name];
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
async copy() {
|
|
305
|
+
await navigator.clipboard.writeText(JSON.stringify(this.getSelectedBlockValues()));
|
|
306
|
+
const selectBlock = this.selectBlock;
|
|
307
|
+
if (selectBlock) {
|
|
308
|
+
selectBlock.setAttribute('data-tooltip', 'copied to clipboard!');
|
|
309
|
+
selectBlock.style.backgroundColor = 'red';
|
|
310
|
+
selectBlock.style.opacity = '0.5';
|
|
311
|
+
await sleep(500);
|
|
312
|
+
selectBlock.removeAttribute('data-tooltip');
|
|
313
|
+
selectBlock.style.backgroundColor = '';
|
|
314
|
+
selectBlock.style.opacity = '';
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
async paste() {
|
|
318
|
+
try {
|
|
319
|
+
const text = await navigator.clipboard.readText();
|
|
320
|
+
if (!text) {
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
const { row, column } = this.focused;
|
|
324
|
+
const { records } = this.data;
|
|
325
|
+
const columns = this.columns.filter(column => !column.hidden);
|
|
326
|
+
const block = JSON.parse(text);
|
|
327
|
+
if (!(block instanceof Array)) {
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
block.forEach((record, rowIndex) => {
|
|
331
|
+
if (!(record instanceof Array)) {
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
var targetRecord = records[row + rowIndex] || { __dirty__: '+' };
|
|
335
|
+
if (row + rowIndex >= records.length) {
|
|
336
|
+
records.push(targetRecord);
|
|
337
|
+
}
|
|
338
|
+
record.map((item, columnIndex) => {
|
|
339
|
+
const targetColumn = columns[column + columnIndex];
|
|
340
|
+
if (!targetColumn.gutterName) {
|
|
341
|
+
this.dispatchEvent(new CustomEvent('field-change', {
|
|
342
|
+
bubbles: true,
|
|
343
|
+
composed: true,
|
|
344
|
+
detail: {
|
|
345
|
+
before: targetRecord[targetColumn.name],
|
|
346
|
+
after: item,
|
|
347
|
+
column: targetColumn,
|
|
348
|
+
record: targetRecord,
|
|
349
|
+
row: row + rowIndex
|
|
350
|
+
}
|
|
351
|
+
}));
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
catch (e) {
|
|
357
|
+
console.error(e);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
221
360
|
};
|
|
222
|
-
DataGridBody.styles = [
|
|
361
|
+
DataGridBody.styles = [
|
|
362
|
+
TooltipStyles,
|
|
363
|
+
dataGridBodyStyle,
|
|
364
|
+
css `
|
|
365
|
+
[select-block] {
|
|
366
|
+
position: absolute;
|
|
367
|
+
left: var(--select-box-left);
|
|
368
|
+
top: var(--select-box-top);
|
|
369
|
+
width: var(--select-box-width);
|
|
370
|
+
height: var(--select-box-height);
|
|
371
|
+
border: var(--grid-record-focused-cell-border);
|
|
372
|
+
background-image: var(--focused-background-image);
|
|
373
|
+
pointer-events: none;
|
|
374
|
+
}
|
|
375
|
+
`
|
|
376
|
+
];
|
|
223
377
|
__decorate([
|
|
224
378
|
property({ type: Object })
|
|
225
379
|
], DataGridBody.prototype, "config", void 0);
|
|
@@ -241,6 +395,15 @@ __decorate([
|
|
|
241
395
|
__decorate([
|
|
242
396
|
property({ type: Number })
|
|
243
397
|
], DataGridBody.prototype, "to", void 0);
|
|
398
|
+
__decorate([
|
|
399
|
+
state()
|
|
400
|
+
], DataGridBody.prototype, "_selectBlock", void 0);
|
|
401
|
+
__decorate([
|
|
402
|
+
query('[select-block]')
|
|
403
|
+
], DataGridBody.prototype, "selectBlock", void 0);
|
|
404
|
+
__decorate([
|
|
405
|
+
query('ox-grid-field[focused]')
|
|
406
|
+
], DataGridBody.prototype, "focusedField", void 0);
|
|
244
407
|
DataGridBody = __decorate([
|
|
245
408
|
customElement('ox-grid-body')
|
|
246
409
|
], DataGridBody);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-grid-body.js","sourceRoot":"","sources":["../../../src/data-grid/data-grid-body.ts"],"names":[],"mappings":"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","sourcesContent":["import './data-grid-field'\n\nimport { html, LitElement, PropertyValues } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport debounce from 'lodash-es/debounce'\n\nimport { ZERO_CONFIG, ZERO_DATA } from '../configure/zero-config'\nimport { RecordViewHandler } from '../record-view/record-view-handler'\nimport { ColumnConfig, GristConfig, GristData, GristRecord } from '../types'\nimport { supportsPassive } from '../utils'\nimport { dataGridBodyStyle } from './data-grid-body-style'\nimport { dataGridBodyClickHandler } from './event-handlers/data-grid-body-click-handler'\nimport { dataGridBodyDblclickHandler } from './event-handlers/data-grid-body-dblclick-handler'\nimport { dataGridBodyKeydownHandler } from './event-handlers/data-grid-body-keydown-handler'\n\nconst THRESHOLD = 300\nconst DATA_PADDING = 3\nconst ROW_HEIGHT = 40\nconst GAP_SIZE = 1\n\nfunction calcScrollPos(parent: DataGridBody, child: Element) {\n /* getBoundingClientRect는 safari에서 스크롤 상태에서 다른 브라우저와는 다른 값을 리턴함 - 사파리는 약간 이상 작동함. */\n var { top: ct, left: cl, right: cr, bottom: cb } = child.getBoundingClientRect()\n var { top: pt, left: pl, right: pr, bottom: pb } = parent.getBoundingClientRect()\n var { scrollLeft, scrollTop } = parent\n var scrollbarWidth = parent.clientWidth - parent.offsetWidth\n var scrollbarHeight = parent.clientHeight - parent.offsetHeight\n\n return {\n left: cl < pl ? scrollLeft - (pl - cl) : cr > pr ? scrollLeft - (pr - cr) - scrollbarWidth : undefined,\n top: ct < pt ? scrollTop - (pt - ct) : cb > pb ? scrollTop - (pb - cb) - scrollbarHeight : undefined\n }\n}\n\nconst ZERO_FOCUS = {\n row: 0,\n column: 0\n}\n\n@customElement('ox-grid-body')\nexport class DataGridBody extends LitElement {\n debounce = debounce((scrollTop: number, clientHeight: number) => {\n const maxVisibleRows = Math.ceil(clientHeight / (ROW_HEIGHT + GAP_SIZE))\n const from = Math.max(0, Math.floor(scrollTop / (ROW_HEIGHT + GAP_SIZE)) - maxVisibleRows * DATA_PADDING)\n const to = Math.min(this.data.records?.length || 0, from + maxVisibleRows * (DATA_PADDING * 2 + 1))\n\n this.from = from\n this.to = to\n }, THRESHOLD)\n\n static styles = [dataGridBodyStyle]\n\n @property({ type: Object }) config: GristConfig = ZERO_CONFIG\n @property({ type: Array }) columns: ColumnConfig[] = []\n @property({ type: Object }) data: GristData = ZERO_DATA\n @property({ type: Object }) focused: { row: number; column: number } = ZERO_FOCUS\n @property({ type: Object }) editTarget: { row: number; column: number } | null = null\n @property({ type: Number }) from = -1\n @property({ type: Number }) to = -1\n\n private _focusedListener?: (e: KeyboardEvent) => void\n private _recordView?: any\n private _recordViewRow?: number\n\n resetEdit() {\n this.editTarget = null\n }\n\n handleOnScroll(e: WheelEvent) {\n const { scrollTop, clientHeight } = e.target as HTMLElement\n this.debounce(scrollTop, clientHeight)\n }\n\n // issue #13\n // renderOptimisticRow() {\n // return\n // }\n\n render() {\n var { row: focusedRow, column: focusedColumn } = this.focused || {}\n var { row: editingRow, column: editingColumn } = this.editTarget || {}\n\n var columns = this.columns.filter(column => !column.hidden)\n var data = this.data\n var { records } = data\n var { appendable, classifier } = this.config.rows\n\n /*\n * 레코드를 추가할 수 있는 경우에는 항상 추가 레코드를 보여준다.\n * 만약, 이전 방식처럼, 커서를 옮겨야만 새로운 레코드가 보이게 하고 싶다면, 조건부를 다음의 코드로 대체한다.\n * -- if (focusedRow == records.length)\n */\n if (appendable) {\n records = [...records, { __dirty__: '+' }]\n }\n\n return html`\n ${records.map((record, idxRow) => {\n var attrFocusedRow = idxRow === focusedRow\n var attrSelected = record['__selected__']\n var attrOdd = idxRow % 2\n var dirtyFields = record['__dirtyfields__'] || {}\n var { emphasized } = classifier.call(null, record, idxRow) || {}\n\n return html`\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-field\n .data=${data}\n .rowIndex=${idxRow}\n .columnIndex=${idxColumn}\n .column=${column}\n .record=${record}\n .emphasized=${emphasized}\n ?gutter=${column.type == 'gutter'}\n ?odd=${attrOdd}\n ?focused-row=${attrFocusedRow}\n ?selected-row=${attrSelected}\n ?focused=${idxRow === focusedRow && idxColumn === focusedColumn}\n ?editing=${idxRow === editingRow && idxColumn === editingColumn}\n .value=${record[column.name]}\n ?dirty=${!!dirtyFields[column.name]}\n ></ox-grid-field>\n `\n )}\n <ox-grid-field\n .data=${data}\n .rowIndex=${idxRow}\n .record=${record}\n .emphasized=${emphasized}\n ?odd=${attrOdd}\n ?focused-row=${attrFocusedRow}\n ?selected-row=${attrSelected}\n ></ox-grid-field>\n `\n })}\n `\n }\n\n firstUpdated() {\n // TODO issue #13\n // this.addEventListener('scroll', this.handleOnScroll.bind(this))\n\n /* focus() 를 받을 수 있도록 함. */\n this.setAttribute('tabindex', '-1')\n\n /*\n * focusout 으로 property를 변경시키는 경우, focusout에 의해 update가 발생하는 경우에는,\n * 그리드 내부의 컴포넌트가 갱신되는 현상을 초래하게 된다.\n * 따라서, focusout 핸들러에서 update를 유발하는 코드는 강력하게 금지시킨다.\n */\n this.addEventListener('focusout', e => {\n if (this._focusedListener) {\n window.removeEventListener('keydown', this._focusedListener)\n delete this._focusedListener\n }\n })\n\n this.addEventListener('focusin', e => {\n if (!this._focusedListener) {\n this._focusedListener = dataGridBodyKeydownHandler.bind(this)\n window.addEventListener('keydown', this._focusedListener)\n }\n })\n\n this.renderRoot.addEventListener('click', dataGridBodyClickHandler.bind(this))\n\n this.renderRoot.addEventListener('dblclick', dataGridBodyDblclickHandler.bind(this))\n\n this.addEventListener('wheel', this._onWheelEvent.bind(this), supportsPassive ? { passive: true } : false)\n\n const primaryColor = getComputedStyle(this).getPropertyValue('--primary-color')\n this.style.setProperty(\n '--focused-background-image',\n `url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><rect fill='${primaryColor}' x='0' y='0' width='100%' height='100%' style='opacity:.3'/></svg>\")`\n )\n\n this.addEventListener('show-record-view', (e: Event) =>\n this.popupRecordView((e as CustomEvent).detail as { row: number; record: GristRecord })\n )\n }\n\n _onWheelEvent(e: WheelEvent) {\n if (this.scrollHeight <= this.clientHeight) {\n var delta = Math.max(-1, Math.min(1, e.deltaY || 0))\n this.scrollLeft = Math.max(0, this.scrollLeft - delta * 40)\n supportsPassive || e.preventDefault()\n }\n }\n\n startEditTarget(row: number, column: number) {\n var { editable } = this.columns.filter(column => !column.hidden)[column].record\n\n if (!editable) {\n return\n }\n\n this.editTarget = {\n row,\n column\n }\n }\n\n shouldUpdate(changes: any) {\n if (!changes.has('editTarget')) {\n /*\n * 큰 변화에 대해서는 실제 update가 발생되기 전에 editTarget을 초기화한다.\n */\n this.editTarget = null\n }\n\n return super.shouldUpdate(changes)\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('focused')) {\n let element = this.renderRoot?.querySelector('[focused]')\n if (!element) {\n return\n }\n\n let { top, left } = calcScrollPos(this, element)\n // TODO this.scroll()을 사용하면, 효과가 좋으나 left 계산에 문제가 있는 것 같음.\n // this.scroll({\n // top,\n // left,\n // behavior: 'smooth'\n // })\n if (top !== undefined) {\n this.scrollTop = top\n }\n if (left !== undefined) {\n this.scrollLeft = left\n }\n }\n\n if (this._recordView) {\n this._recordView.record = this.data.records[this._recordViewRow!]\n }\n }\n\n focus() {\n super.focus()\n\n if (this.focused === ZERO_FOCUS) {\n let { records } = this.data\n let row = records.findIndex(record => record['__selected__'])\n\n this.focused = { row: row == -1 ? 0 : row, column: 0 }\n }\n }\n\n popupRecordView({ record, row }: { row: number; record: GristRecord }) {\n var titleField = this.config.list.fields[0] || 'name'\n var title = record[titleField]\n\n /* field가 오브젝트형인 경우에는 렌더러를 타이틀로 사용한다. */\n if (typeof title == 'object') {\n var column = this.config.columns.find(column => column.name == titleField)\n title = column?.record.renderer(title, column, record, row, this /* cautious */)\n }\n\n this._recordViewRow = row\n this._recordView = RecordViewHandler(\n this.config.columns,\n record,\n row,\n this,\n {\n title\n },\n () => {\n delete this._recordView\n delete this._recordViewRow\n }\n )\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"data-grid-body.js","sourceRoot":"","sources":["../../../src/data-grid/data-grid-body.ts"],"names":[],"mappings":"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","sourcesContent":["import './data-grid-field'\n\nimport { ColumnConfig, GristConfig, GristData, GristRecord } from '../types'\nimport { LitElement, PropertyValues, css, html } from 'lit'\nimport { ZERO_CONFIG, ZERO_DATA } from '../configure/zero-config'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { DataGridField } from './data-grid-field'\nimport { RecordViewHandler } from '../record-view/record-view-handler'\nimport { TooltipStyles } from '@operato/styles'\nimport { dataGridBodyClickHandler } from './event-handlers/data-grid-body-click-handler'\nimport { dataGridBodyDblclickHandler } from './event-handlers/data-grid-body-dblclick-handler'\nimport { dataGridBodyKeydownHandler } from './event-handlers/data-grid-body-keydown-handler'\nimport { dataGridBodyStyle } from './data-grid-body-style'\nimport debounce from 'lodash-es/debounce'\nimport { sleep } from '@operato/utils'\nimport { supportsPassive } from '../utils'\n\nconst THRESHOLD = 300\nconst DATA_PADDING = 3\nconst ROW_HEIGHT = 40\nconst GAP_SIZE = 1\n\nfunction calcScrollPos(parent: DataGridBody, child: Element) {\n /* getBoundingClientRect는 safari에서 스크롤 상태에서 다른 브라우저와는 다른 값을 리턴함 - 사파리는 약간 이상 작동함. */\n var { top: ct, left: cl, right: cr, bottom: cb } = child.getBoundingClientRect()\n var { top: pt, left: pl, right: pr, bottom: pb } = parent.getBoundingClientRect()\n var { scrollLeft, scrollTop } = parent\n var scrollbarWidth = parent.clientWidth - parent.offsetWidth\n var scrollbarHeight = parent.clientHeight - parent.offsetHeight\n\n return {\n left: cl < pl ? scrollLeft - (pl - cl) : cr > pr ? scrollLeft - (pr - cr) - scrollbarWidth : undefined,\n top: ct < pt ? scrollTop - (pt - ct) : cb > pb ? scrollTop - (pb - cb) - scrollbarHeight : undefined\n }\n}\n\nconst ZERO_FOCUS = {\n row: 0,\n column: 0\n}\n\n@customElement('ox-grid-body')\nexport class DataGridBody extends LitElement {\n debounce = debounce((scrollTop: number, clientHeight: number) => {\n const maxVisibleRows = Math.ceil(clientHeight / (ROW_HEIGHT + GAP_SIZE))\n const from = Math.max(0, Math.floor(scrollTop / (ROW_HEIGHT + GAP_SIZE)) - maxVisibleRows * DATA_PADDING)\n const to = Math.min(this.data.records?.length || 0, from + maxVisibleRows * (DATA_PADDING * 2 + 1))\n\n this.from = from\n this.to = to\n }, THRESHOLD)\n\n static styles = [\n TooltipStyles,\n dataGridBodyStyle,\n css`\n [select-block] {\n position: absolute;\n left: var(--select-box-left);\n top: var(--select-box-top);\n width: var(--select-box-width);\n height: var(--select-box-height);\n border: var(--grid-record-focused-cell-border);\n background-image: var(--focused-background-image);\n pointer-events: none;\n }\n `\n ]\n\n @property({ type: Object }) config: GristConfig = ZERO_CONFIG\n @property({ type: Array }) columns: ColumnConfig[] = []\n @property({ type: Object }) data: GristData = ZERO_DATA\n @property({ type: Object }) focused: { row: number; column: number } = ZERO_FOCUS\n @property({ type: Object }) editTarget: { row: number; column: number } | null = null\n @property({ type: Number }) from = -1\n @property({ type: Number }) to = -1\n\n @state() _selectBlock?: {\n start: DataGridField\n end?: DataGridField\n }\n\n @query('[select-block]') selectBlock?: HTMLDivElement\n @query('ox-grid-field[focused]') focusedField?: DataGridField\n\n private _focusedListener?: (e: KeyboardEvent) => void\n private _recordView?: any\n private _recordViewRow?: number\n private _selectBlockWillBeReset: boolean = true\n\n resetEdit() {\n this.editTarget = null\n }\n\n handleOnScroll(e: WheelEvent) {\n const { scrollTop, clientHeight } = e.target as HTMLElement\n this.debounce(scrollTop, clientHeight)\n }\n\n // issue #13\n // renderOptimisticRow() {\n // return\n // }\n\n render() {\n var { row: focusedRow, column: focusedColumn } = this.focused || {}\n var { row: editingRow, column: editingColumn } = this.editTarget || {}\n\n var columns = this.columns.filter(column => !column.hidden)\n var data = this.data\n var { records } = data\n var { appendable, classifier } = this.config.rows\n const { start, end } = this._selectBlock || {}\n\n /*\n * 레코드를 추가할 수 있는 경우에는 항상 추가 레코드를 보여준다.\n * 만약, 이전 방식처럼, 커서를 옮겨야만 새로운 레코드가 보이게 하고 싶다면, 조건부를 다음의 코드로 대체한다.\n * -- if (focusedRow == records.length)\n */\n if (appendable) {\n records = [...records, { __dirty__: '+' }]\n }\n\n return html`\n ${records.map((record, idxRow) => {\n var attrFocusedRow = idxRow === focusedRow\n var attrSelected = record['__selected__']\n var attrOdd = idxRow % 2\n var dirtyFields = record['__dirtyfields__'] || {}\n var { emphasized } = classifier.call(null, record, idxRow) || {}\n\n return html`\n ${columns.map(\n (column, idxColumn) => html`\n <ox-grid-field\n .data=${data}\n .rowIndex=${idxRow}\n .columnIndex=${idxColumn}\n .column=${column}\n .record=${record}\n .emphasized=${emphasized}\n ?gutter=${column.type == 'gutter'}\n ?odd=${attrOdd}\n ?focused-row=${attrFocusedRow}\n ?selected-row=${attrSelected}\n ?focused=${idxRow === focusedRow && idxColumn === focusedColumn}\n ?editing=${idxRow === editingRow && idxColumn === editingColumn}\n .value=${record[column.name]}\n ?dirty=${!!dirtyFields[column.name]}\n ></ox-grid-field>\n `\n )}\n <ox-grid-field\n .data=${data}\n .rowIndex=${idxRow}\n .record=${record}\n .emphasized=${emphasized}\n ?odd=${attrOdd}\n ?focused-row=${attrFocusedRow}\n ?selected-row=${attrSelected}\n ></ox-grid-field>\n `\n })}\n ${start && end ? html` <div select-block></div> ` : html``}\n `\n }\n\n firstUpdated() {\n // TODO issue #13\n // this.addEventListener('scroll', this.handleOnScroll.bind(this))\n\n /* focus() 를 받을 수 있도록 함. */\n this.setAttribute('tabindex', '-1')\n\n /*\n * focusout 으로 property를 변경시키는 경우, focusout에 의해 update가 발생하는 경우에는,\n * 그리드 내부의 컴포넌트가 갱신되는 현상을 초래하게 된다.\n * 따라서, focusout 핸들러에서 update를 유발하는 코드는 강력하게 금지시킨다.\n */\n this.addEventListener('focusout', e => {\n if (this._focusedListener) {\n this.removeEventListener('keydown', this._focusedListener)\n delete this._focusedListener\n }\n })\n\n this.addEventListener('focusin', e => {\n if (!this._focusedListener) {\n this._focusedListener = dataGridBodyKeydownHandler.bind(this)\n this.addEventListener('keydown', this._focusedListener)\n }\n })\n\n this.renderRoot.addEventListener('mousemove', (event: Event) => {\n const e = event as MouseEvent\n if (e.buttons !== 1) {\n this._selectBlockWillBeReset = true\n return\n }\n\n const field = e.target as DataGridField\n\n if (!this._selectBlock || this._selectBlockWillBeReset) {\n this._selectBlockWillBeReset = false\n this._selectBlock = { start: field }\n\n this.dispatchEvent(\n new CustomEvent('focus-change', {\n bubbles: true,\n composed: true,\n detail: undefined\n // detail: {\n // row: field!.rowIndex,\n // column: field!.columnIndex\n // }\n })\n )\n\n return\n }\n\n var { start, end } = this._selectBlock || {}\n\n if (start !== field && !end) {\n /* cancel all selected text */\n window.getSelection()?.removeAllRanges()\n }\n\n if (start === field && !end) {\n return\n }\n\n if (start && end !== field) {\n end = field\n\n const left = start.columnIndex < end.columnIndex ? start : end\n const right = left === start ? end : start\n const top = start.rowIndex < end.rowIndex ? start : end\n const bottom = top === start ? end : start\n\n const { offsetLeft } = left\n const { offsetTop } = top\n const width = right.offsetLeft - offsetLeft + right.offsetWidth\n const height = bottom.offsetTop - offsetTop + bottom.offsetHeight\n\n this.style.setProperty('--select-box-left', offsetLeft - 1 + 'px')\n this.style.setProperty('--select-box-top', offsetTop - 1 + 'px')\n this.style.setProperty('--select-box-width', width + 'px')\n this.style.setProperty('--select-box-height', height + 'px')\n\n this._selectBlock = {\n start,\n end\n }\n }\n })\n\n this.renderRoot.addEventListener('mouseup', (event: Event) => {\n this._selectBlockWillBeReset = true\n })\n\n this.renderRoot.addEventListener('click', dataGridBodyClickHandler.bind(this))\n\n this.renderRoot.addEventListener('dblclick', dataGridBodyDblclickHandler.bind(this))\n\n this.addEventListener('wheel', this._onWheelEvent.bind(this), supportsPassive ? { passive: true } : false)\n\n const primaryColor = getComputedStyle(this).getPropertyValue('--primary-color')\n this.style.setProperty(\n '--focused-background-image',\n `url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><rect fill='${primaryColor}' x='0' y='0' width='100%' height='100%' style='opacity:.3'/></svg>\")`\n )\n\n this.addEventListener('show-record-view', (e: Event) =>\n this.popupRecordView((e as CustomEvent).detail as { row: number; record: GristRecord })\n )\n }\n\n _onWheelEvent(e: WheelEvent) {\n if (this.scrollHeight <= this.clientHeight) {\n var delta = Math.max(-1, Math.min(1, e.deltaY || 0))\n this.scrollLeft = Math.max(0, this.scrollLeft - delta * 40)\n supportsPassive || e.preventDefault()\n }\n }\n\n startEditTarget(row: number, column: number) {\n var { editable } = this.columns.filter(column => !column.hidden)[column].record\n\n if (!editable) {\n return\n }\n\n this.editTarget = {\n row,\n column\n }\n }\n\n shouldUpdate(changes: any) {\n if (!changes.has('editTarget')) {\n /*\n * 큰 변화에 대해서는 실제 update가 발생되기 전에 editTarget을 초기화한다.\n */\n this.editTarget = null\n }\n\n return super.shouldUpdate(changes)\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('focused')) {\n let element = this.renderRoot?.querySelector('[focused]')\n if (!element) {\n return\n }\n\n this._selectBlock = undefined\n\n let { top, left } = calcScrollPos(this, element)\n // TODO this.scroll()을 사용하면, 효과가 좋으나 left 계산에 문제가 있는 것 같음.\n // this.scroll({\n // top,\n // left,\n // behavior: 'smooth'\n // })\n if (top !== undefined) {\n this.scrollTop = top\n }\n if (left !== undefined) {\n this.scrollLeft = left\n }\n }\n\n if (this._recordView) {\n this._recordView.record = this.data.records[this._recordViewRow!]\n }\n }\n\n focus() {\n super.focus()\n\n if (this.focused === ZERO_FOCUS) {\n let { records } = this.data\n let row = records.findIndex(record => record['__selected__'])\n\n this.focused = { row: row == -1 ? 0 : row, column: 0 }\n }\n }\n\n popupRecordView({ record, row }: { row: number; record: GristRecord }) {\n var titleField = this.config.list.fields[0] || 'name'\n var title = record[titleField]\n\n /* field가 오브젝트형인 경우에는 렌더러를 타이틀로 사용한다. */\n if (typeof title == 'object') {\n var column = this.config.columns.find(column => column.name == titleField)\n title = column?.record.renderer(title, column, record, row, this /* cautious */)\n }\n\n this._recordViewRow = row\n this._recordView = RecordViewHandler(\n this.config.columns,\n record,\n row,\n this,\n {\n title\n },\n () => {\n delete this._recordView\n delete this._recordViewRow\n }\n )\n }\n\n getSelectedBlockValues(): Array<Array<any>> | undefined {\n var { start, end } = this._selectBlock || {}\n\n if (!(start && end)) {\n start = this.focusedField\n end = start\n }\n\n if (start && end) {\n const startRowIndex = start.rowIndex < end.rowIndex ? start.rowIndex : end.rowIndex\n const endRowIndex = start.rowIndex < end.rowIndex ? end.rowIndex : start.rowIndex\n const startColumnIndex = start.columnIndex < end.columnIndex ? start.columnIndex : end.columnIndex\n const endColumnIndex = start.columnIndex < end.columnIndex ? end.columnIndex : start.columnIndex\n\n const columnArray = new Array(endColumnIndex - startColumnIndex + 1).fill(startColumnIndex)\n const columns = this.columns.filter(column => !column.hidden)\n\n return new Array(endRowIndex - startRowIndex + 1).fill(startRowIndex).map((start, index) => {\n const rowIndex = start + index\n const record = this.data.records[rowIndex]\n\n return columnArray.map((start, index) => {\n const columnIndex = start + index\n const column = columns[columnIndex]\n\n return record[column.name]\n })\n })\n }\n }\n\n async copy() {\n await navigator.clipboard.writeText(JSON.stringify(this.getSelectedBlockValues()))\n\n const selectBlock = this.selectBlock\n if (selectBlock) {\n selectBlock.setAttribute('data-tooltip', 'copied to clipboard!')\n selectBlock.style.backgroundColor = 'red'\n selectBlock.style.opacity = '0.5'\n await sleep(500)\n selectBlock.removeAttribute('data-tooltip')\n selectBlock.style.backgroundColor = ''\n selectBlock.style.opacity = ''\n }\n }\n\n async paste() {\n try {\n const text = await navigator.clipboard.readText()\n if (!text) {\n return\n }\n\n const { row, column } = this.focused\n const { records } = this.data\n const columns = this.columns.filter(column => !column.hidden)\n\n const block = JSON.parse(text)\n\n if (!(block instanceof Array)) {\n return\n }\n\n block.forEach((record, rowIndex) => {\n if (!(record instanceof Array)) {\n return\n }\n\n var targetRecord = records[row + rowIndex] || { __dirty__: '+' }\n if (row + rowIndex >= records.length) {\n records.push(targetRecord)\n }\n\n record.map((item, columnIndex) => {\n const targetColumn = columns[column + columnIndex]\n if (!targetColumn.gutterName) {\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: targetRecord[targetColumn.name],\n after: item,\n column: targetColumn,\n record: targetRecord,\n row: row + rowIndex\n }\n })\n )\n }\n })\n })\n } catch (e) {\n console.error(e)\n }\n }\n}\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import './data-grid-header';
|
|
2
2
|
import './data-grid-body';
|
|
3
3
|
import './data-grid-footer';
|
|
4
|
-
import { LitElement, PropertyValues } from 'lit';
|
|
5
|
-
import { DataManipulator } from '../data-manipulator';
|
|
6
4
|
import { ColumnConfig, GristRecord } from '../types';
|
|
5
|
+
import { LitElement, PropertyValues } from 'lit';
|
|
7
6
|
import { DataGridHeader } from './data-grid-header';
|
|
7
|
+
import { DataManipulator } from '../data-manipulator';
|
|
8
8
|
/**
|
|
9
9
|
* DataGrid
|
|
10
10
|
*/
|
|
@@ -4,8 +4,8 @@ import './data-grid-body';
|
|
|
4
4
|
import './data-grid-footer';
|
|
5
5
|
import { css, html } from 'lit';
|
|
6
6
|
import { customElement, property, query } from 'lit/decorators.js';
|
|
7
|
-
import { ScrollbarStyles } from '@operato/styles';
|
|
8
7
|
import { DataManipulator } from '../data-manipulator';
|
|
8
|
+
import { ScrollbarStyles } from '@operato/styles';
|
|
9
9
|
import { supportsPassive } from '../utils';
|
|
10
10
|
/**
|
|
11
11
|
* DataGrid
|
|
@@ -83,7 +83,8 @@ let DataGrid = class DataGrid extends DataManipulator {
|
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
|
-
|
|
86
|
+
/* grid fetch 후에 grid로 focus를 주어야 하는 지 검토가 필요하다. */
|
|
87
|
+
// this.focus()
|
|
87
88
|
}
|
|
88
89
|
calculateWidths(columns) {
|
|
89
90
|
/*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-grid.js","sourceRoot":"","sources":["../../../src/data-grid/data-grid.ts"],"names":[],"mappings":"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","sourcesContent":["import './data-grid-header'\nimport './data-grid-body'\nimport './data-grid-footer'\n\nimport { css, html, LitElement, PropertyValues } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\n\nimport { ScrollbarStyles } from '@operato/styles'\n\nimport { DataManipulator } from '../data-manipulator'\nimport { ColumnConfig, GristRecord, PaginationConfig } from '../types'\nimport { supportsPassive } from '../utils'\nimport { DataGridHeader } from './data-grid-header'\n\n/**\n * DataGrid\n */\n@customElement('ox-grid')\nexport class DataGrid extends DataManipulator {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n\n overflow: hidden;\n\n border-width: var(--grid-container-border-width);\n }\n\n ox-grid-body {\n flex: 1;\n }\n\n @media print {\n :host {\n zoom: 80%;\n }\n }\n `\n ]\n\n @property({ type: Object }) focused?: { row: number; column: number }\n\n @query('ox-grid-body', true) body!: LitElement\n @query('ox-grid-header', true) header!: DataGridHeader\n @query('ox-grid-footer', true) footer!: LitElement\n\n private _widths?: string\n\n firstUpdated() {\n /* header and body scroll synchronization */\n this.header.addEventListener('scroll', e => {\n if (this.body.scrollLeft !== this.header.scrollLeft) {\n this.body.scrollLeft = this.header.scrollLeft\n }\n })\n\n this.body.addEventListener('scroll', e => {\n if (this.body.scrollLeft !== this.header.scrollLeft) {\n this.header.scrollLeft = this.body.scrollLeft\n }\n })\n\n this.header.addEventListener('wheel', this.onWheelEvent.bind(this))\n this.footer && this.footer.addEventListener('wheel', this.onWheelEvent.bind(this))\n\n /* record selection processing */\n this.addEventListener('select-all-change', e => {\n if (this.data.records.length == 0) {\n return\n }\n\n var { selected } = (e as CustomEvent).detail\n var { records } = this.data\n\n records.forEach(record => (record['__selected__'] = selected))\n\n this.header.requestUpdate()\n this.body.requestUpdate()\n })\n\n this.addEventListener('focus-change', e => {\n this.focused = (e as CustomEvent).detail\n this.focus()\n this.requestUpdate()\n })\n }\n\n onWheelEvent(e: WheelEvent) {\n var delta = Math.max(-1, Math.min(1, e.deltaY || 0))\n this.body.scrollLeft = Math.max(0, this.body.scrollLeft - delta * 30)\n\n supportsPassive || e.preventDefault()\n }\n\n onSelectRecordChanged({\n selectedRecords,\n added,\n removed\n }: {\n selectedRecords: GristRecord[]\n added: GristRecord[]\n removed: GristRecord[]\n }): void {\n super.onSelectRecordChanged({ selectedRecords, added, removed })\n\n this.header.requestUpdate()\n this.body.requestUpdate()\n }\n\n onRecordChanged(\n recordData: GristRecord,\n row: number,\n column: ColumnConfig | null /* TODO column should be removed */\n ) {\n /* record-viewer 등 grid 외에서 변경되는 경우에도 header와 body를 refresh 하도록 한다. */\n super.onRecordChanged(recordData, row, column)\n\n this.header.requestUpdate()\n this.body.requestUpdate()\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('config') || changes.has('data')) {\n /*\n * 데이타 내용에 따라 동적으로 컬럼의 폭이 달라지는 경우(예를 들면, sequence field)가 있으므로,\n * data의 변동에 대해서도 다시 계산되어야 한다.\n */\n this.calculateWidths(this.config.columns)\n\n if (this.focused && 'row' in this.focused) {\n var { row = 0, column = 0 } = this.focused\n var { records: oldrecords = [] } = changes.get('data') as any\n var { records: newrecords } = this.data\n\n var oldrecord = oldrecords[row]\n\n if (oldrecord && oldrecord !== newrecords[row]) {\n var newrecord = newrecords.find(\n record =>\n /* TODO keyfields를 정의하고, keyfields의 동일성으로 확정해야 한다. */\n oldrecord === record ||\n ('id' in oldrecord && record.id == oldrecord.id) ||\n ('name' in oldrecord && record.name == oldrecord.name)\n )\n\n this.focused = {\n row: newrecord ? newrecords.indexOf(newrecord) : row,\n column\n }\n }\n }\n }\n\n this.focus()\n }\n\n calculateWidths(columns: ColumnConfig[]) {\n /*\n * 컬럼 모델 마지막에 'auto' cell을 추가하여, 자투리 영역을 꽉 채워서 표시한다.\n */\n this._widths = columns\n .filter(column => !column.hidden)\n .map(column => {\n switch (typeof column.width) {\n case 'number':\n return column.width + 'px'\n case 'string':\n return column.width\n case 'function':\n return column.width.call(this, column)\n default:\n return 'auto'\n }\n })\n .concat(['auto'])\n .join(' ')\n\n this.style.setProperty('--grid-template-columns', this._widths)\n this.style.setProperty('--grid-template-print-columns', this._widths.replace(/px/gi, 'fr'))\n }\n\n render() {\n var { pagination = {} as PaginationConfig, columns = [] } = this.config\n\n var paginatable = !pagination.infinite\n var data = this.data\n\n return html`\n <ox-grid-header\n .config=${this.config}\n .columns=${columns}\n .data=${data}\n @column-width-change=${(e: CustomEvent) => {\n let { idx, width } = e.detail\n columns[idx].width = width\n this.calculateWidths(columns)\n }}\n ></ox-grid-header>\n\n <ox-grid-body .config=${this.config} .columns=${columns} .data=${data} .focused=${this.focused}></ox-grid-body>\n\n ${paginatable ? html` <ox-grid-footer .config=${this.config} .data=${data}></ox-grid-footer> ` : html``}\n `\n }\n\n focus() {\n super.focus()\n\n this.body.focus()\n }\n\n get pullToRefreshTarget() {\n return this.body\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"data-grid.js","sourceRoot":"","sources":["../../../src/data-grid/data-grid.ts"],"names":[],"mappings":"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","sourcesContent":["import './data-grid-header'\nimport './data-grid-body'\nimport './data-grid-footer'\n\nimport { ColumnConfig, GristRecord, PaginationConfig } from '../types'\nimport { LitElement, PropertyValues, css, html } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\n\nimport { DataGridHeader } from './data-grid-header'\nimport { DataManipulator } from '../data-manipulator'\nimport { ScrollbarStyles } from '@operato/styles'\nimport { supportsPassive } from '../utils'\n\n/**\n * DataGrid\n */\n@customElement('ox-grid')\nexport class DataGrid extends DataManipulator {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n\n overflow: hidden;\n\n border-width: var(--grid-container-border-width);\n }\n\n ox-grid-body {\n flex: 1;\n }\n\n @media print {\n :host {\n zoom: 80%;\n }\n }\n `\n ]\n\n @property({ type: Object }) focused?: { row: number; column: number }\n\n @query('ox-grid-body', true) body!: LitElement\n @query('ox-grid-header', true) header!: DataGridHeader\n @query('ox-grid-footer', true) footer!: LitElement\n\n private _widths?: string\n\n firstUpdated() {\n /* header and body scroll synchronization */\n this.header.addEventListener('scroll', e => {\n if (this.body.scrollLeft !== this.header.scrollLeft) {\n this.body.scrollLeft = this.header.scrollLeft\n }\n })\n\n this.body.addEventListener('scroll', e => {\n if (this.body.scrollLeft !== this.header.scrollLeft) {\n this.header.scrollLeft = this.body.scrollLeft\n }\n })\n\n this.header.addEventListener('wheel', this.onWheelEvent.bind(this))\n this.footer && this.footer.addEventListener('wheel', this.onWheelEvent.bind(this))\n\n /* record selection processing */\n this.addEventListener('select-all-change', e => {\n if (this.data.records.length == 0) {\n return\n }\n\n var { selected } = (e as CustomEvent).detail\n var { records } = this.data\n\n records.forEach(record => (record['__selected__'] = selected))\n\n this.header.requestUpdate()\n this.body.requestUpdate()\n })\n\n this.addEventListener('focus-change', e => {\n this.focused = (e as CustomEvent).detail\n this.focus()\n this.requestUpdate()\n })\n }\n\n onWheelEvent(e: WheelEvent) {\n var delta = Math.max(-1, Math.min(1, e.deltaY || 0))\n this.body.scrollLeft = Math.max(0, this.body.scrollLeft - delta * 30)\n\n supportsPassive || e.preventDefault()\n }\n\n onSelectRecordChanged({\n selectedRecords,\n added,\n removed\n }: {\n selectedRecords: GristRecord[]\n added: GristRecord[]\n removed: GristRecord[]\n }): void {\n super.onSelectRecordChanged({ selectedRecords, added, removed })\n\n this.header.requestUpdate()\n this.body.requestUpdate()\n }\n\n onRecordChanged(\n recordData: GristRecord,\n row: number,\n column: ColumnConfig | null /* TODO column should be removed */\n ) {\n /* record-viewer 등 grid 외에서 변경되는 경우에도 header와 body를 refresh 하도록 한다. */\n super.onRecordChanged(recordData, row, column)\n\n this.header.requestUpdate()\n this.body.requestUpdate()\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('config') || changes.has('data')) {\n /*\n * 데이타 내용에 따라 동적으로 컬럼의 폭이 달라지는 경우(예를 들면, sequence field)가 있으므로,\n * data의 변동에 대해서도 다시 계산되어야 한다.\n */\n this.calculateWidths(this.config.columns)\n\n if (this.focused && 'row' in this.focused) {\n var { row = 0, column = 0 } = this.focused\n var { records: oldrecords = [] } = changes.get('data') as any\n var { records: newrecords } = this.data\n\n var oldrecord = oldrecords[row]\n\n if (oldrecord && oldrecord !== newrecords[row]) {\n var newrecord = newrecords.find(\n record =>\n /* TODO keyfields를 정의하고, keyfields의 동일성으로 확정해야 한다. */\n oldrecord === record ||\n ('id' in oldrecord && record.id == oldrecord.id) ||\n ('name' in oldrecord && record.name == oldrecord.name)\n )\n\n this.focused = {\n row: newrecord ? newrecords.indexOf(newrecord) : row,\n column\n }\n }\n }\n }\n\n /* grid fetch 후에 grid로 focus를 주어야 하는 지 검토가 필요하다. */\n // this.focus()\n }\n\n calculateWidths(columns: ColumnConfig[]) {\n /*\n * 컬럼 모델 마지막에 'auto' cell을 추가하여, 자투리 영역을 꽉 채워서 표시한다.\n */\n this._widths = columns\n .filter(column => !column.hidden)\n .map(column => {\n switch (typeof column.width) {\n case 'number':\n return column.width + 'px'\n case 'string':\n return column.width\n case 'function':\n return column.width.call(this, column)\n default:\n return 'auto'\n }\n })\n .concat(['auto'])\n .join(' ')\n\n this.style.setProperty('--grid-template-columns', this._widths)\n this.style.setProperty('--grid-template-print-columns', this._widths.replace(/px/gi, 'fr'))\n }\n\n render() {\n var { pagination = {} as PaginationConfig, columns = [] } = this.config\n\n var paginatable = !pagination.infinite\n var data = this.data\n\n return html`\n <ox-grid-header\n .config=${this.config}\n .columns=${columns}\n .data=${data}\n @column-width-change=${(e: CustomEvent) => {\n let { idx, width } = e.detail\n columns[idx].width = width\n this.calculateWidths(columns)\n }}\n ></ox-grid-header>\n\n <ox-grid-body .config=${this.config} .columns=${columns} .data=${data} .focused=${this.focused}></ox-grid-body>\n\n ${paginatable ? html` <ox-grid-footer .config=${this.config} .data=${data}></ox-grid-footer> ` : html``}\n `\n }\n\n focus() {\n super.focus()\n\n this.body.focus()\n }\n\n get pullToRefreshTarget() {\n return this.body\n }\n}\n"]}
|