@operato/scene-grist 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +16 -0
- package/LICENSE +21 -0
- package/README.md +0 -0
- package/dist/editors/index.d.ts +2 -0
- package/dist/editors/index.js +2 -0
- package/dist/editors/index.js.map +1 -0
- package/dist/grist-action.d.ts +82 -0
- package/dist/grist-action.js +322 -0
- package/dist/grist-action.js.map +1 -0
- package/dist/grist.d.ts +56 -0
- package/dist/grist.js +258 -0
- package/dist/grist.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/templates/grist-action.d.ts +17 -0
- package/dist/templates/grist-action.js +19 -0
- package/dist/templates/grist-action.js.map +1 -0
- package/dist/templates/grist.d.ts +16 -0
- package/dist/templates/grist.js +98 -0
- package/dist/templates/grist.js.map +1 -0
- package/dist/templates/index.d.ts +30 -0
- package/dist/templates/index.js +4 -0
- package/dist/templates/index.js.map +1 -0
- package/global/index.d.ts +1 -0
- package/helps/scene/component/grist-action.ko.md +45 -0
- package/helps/scene/component/grist-action.md +43 -0
- package/helps/scene/component/grist-action.zh.md +44 -0
- package/helps/scene/component/grist.ko.md +26 -0
- package/helps/scene/component/grist.md +26 -0
- package/helps/scene/component/grist.zh.md +26 -0
- package/package.json +64 -0
- package/src/editors/index.ts +1 -0
- package/src/grist-action.ts +362 -0
- package/src/grist.ts +302 -0
- package/src/index.ts +3 -0
- package/src/templates/grist-action.png +0 -0
- package/src/templates/grist-action.ts +19 -0
- package/src/templates/grist.png +0 -0
- package/src/templates/grist.ts +98 -0
- package/src/templates/index.ts +3 -0
- package/src/uuid.d.ts +1 -0
- package/things-scene.config.js +7 -0
- package/translations/en.json +13 -0
- package/translations/ko.json +13 -0
- package/translations/ms.json +13 -0
- package/translations/zh.json +13 -0
- package/tsconfig.json +23 -0
- package/tsconfig.tsbuildinfo +1 -0
package/CHANGELOG.md
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# Change Log
|
2
|
+
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
5
|
+
|
6
|
+
### [0.0.9](https://github.com/things-scene/operato-scene/compare/v0.0.8...v0.0.9) (2021-12-03)
|
7
|
+
|
8
|
+
|
9
|
+
### :rocket: New Features
|
10
|
+
|
11
|
+
* operato/scene-grist added ([5dfb9ac](https://github.com/things-scene/operato-scene/commit/5dfb9ac35f46d0b101cbcb43dc7d90c937d8e2ff))
|
12
|
+
|
13
|
+
|
14
|
+
### :bug: Bug Fix
|
15
|
+
|
16
|
+
* ready to operato/scene-grist ([0cc9cc0](https://github.com/things-scene/operato-scene/commit/0cc9cc02d608be80ba5e39c017b5c2080e959da9))
|
package/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2021 Hearty, Oh
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/editors/index.ts"],"names":[],"mappings":"AAAA,eAAe,EAAE,CAAA","sourcesContent":["export default []\n"]}
|
@@ -0,0 +1,82 @@
|
|
1
|
+
import { Component, Properties } from '@hatiolab/things-scene';
|
2
|
+
import { GristData, GristRecord } from '@operato/data-grist/src/types.js';
|
3
|
+
import { DataGrist } from '@operato/data-grist';
|
4
|
+
import SceneGrist from './grist';
|
5
|
+
export declare enum ACTIONS {
|
6
|
+
GET_ALL_ROWS = "getAllRows",
|
7
|
+
COMMIT = "commit",
|
8
|
+
GET_SELECTED = "getSelectedRows",
|
9
|
+
GET_DIRTY = "getDirtyRows",
|
10
|
+
ADD_ROW = "addRow",
|
11
|
+
DELETE_SELECTED_ROWS = "deleteSelectedRowsSoftly",
|
12
|
+
GET_PAGE_INFO = "getPageInfo"
|
13
|
+
}
|
14
|
+
declare const GristAction_base: (new (...args: any[]) => {
|
15
|
+
value: number;
|
16
|
+
animValue: number;
|
17
|
+
animOnValueChange(value: number, animFromBase: boolean, base: number): void;
|
18
|
+
}) & typeof Component;
|
19
|
+
export default class GristAction extends GristAction_base {
|
20
|
+
static get nature(): {
|
21
|
+
mutable: boolean;
|
22
|
+
resizable: boolean;
|
23
|
+
rotatable: boolean;
|
24
|
+
properties: ({
|
25
|
+
type: string;
|
26
|
+
label: string;
|
27
|
+
name: string;
|
28
|
+
property: {
|
29
|
+
component: string;
|
30
|
+
options?: undefined;
|
31
|
+
};
|
32
|
+
} | {
|
33
|
+
type: string;
|
34
|
+
label: string;
|
35
|
+
name: string;
|
36
|
+
property: {
|
37
|
+
options: {
|
38
|
+
display: string;
|
39
|
+
value: ACTIONS;
|
40
|
+
}[];
|
41
|
+
component?: undefined;
|
42
|
+
};
|
43
|
+
} | {
|
44
|
+
type: string;
|
45
|
+
label: string;
|
46
|
+
name: string;
|
47
|
+
property?: undefined;
|
48
|
+
})[];
|
49
|
+
help: string;
|
50
|
+
};
|
51
|
+
private uuid;
|
52
|
+
private _data;
|
53
|
+
ready(): void;
|
54
|
+
dispose(): void;
|
55
|
+
onclick(): void;
|
56
|
+
onchange(after: Properties): void;
|
57
|
+
executeMappings(): void;
|
58
|
+
doDataMap(): void;
|
59
|
+
doAction(action?: ACTIONS): void;
|
60
|
+
refreshGrist(grist: DataGrist): void;
|
61
|
+
assortDirties(grist: DataGrist): {
|
62
|
+
original: import("@operato/data-grist/dist/src/types").GristRecord[];
|
63
|
+
patches: GristRecord[];
|
64
|
+
created: GristRecord[];
|
65
|
+
updated: GristRecord[];
|
66
|
+
deleted: GristRecord[];
|
67
|
+
};
|
68
|
+
getPageInfoFrom(grist: DataGrist, fetchedData?: GristData): {
|
69
|
+
page: any;
|
70
|
+
limit: any;
|
71
|
+
sorters: any;
|
72
|
+
};
|
73
|
+
buildPatches(patches: GristRecord[]): GristRecord[];
|
74
|
+
render(context: CanvasRenderingContext2D): void;
|
75
|
+
postrender(context: CanvasRenderingContext2D): void;
|
76
|
+
get controls(): never[];
|
77
|
+
get targetGristComponent(): SceneGrist;
|
78
|
+
get targetGristElement(): DataGrist | undefined;
|
79
|
+
get data(): any;
|
80
|
+
set data(data: any);
|
81
|
+
}
|
82
|
+
export {};
|
@@ -0,0 +1,322 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright © HatioLab Inc. All rights reserved.
|
3
|
+
*
|
4
|
+
* grist 컴포넌트를 보조하여 grist의 각종 동작을 수행하는 컴포넌트.
|
5
|
+
*/
|
6
|
+
import { Component, RectPath, ValueHolder } from '@hatiolab/things-scene';
|
7
|
+
import uuid from 'uuid';
|
8
|
+
export var ACTIONS;
|
9
|
+
(function (ACTIONS) {
|
10
|
+
ACTIONS["GET_ALL_ROWS"] = "getAllRows";
|
11
|
+
ACTIONS["COMMIT"] = "commit";
|
12
|
+
ACTIONS["GET_SELECTED"] = "getSelectedRows";
|
13
|
+
ACTIONS["GET_DIRTY"] = "getDirtyRows";
|
14
|
+
ACTIONS["ADD_ROW"] = "addRow";
|
15
|
+
ACTIONS["DELETE_SELECTED_ROWS"] = "deleteSelectedRowsSoftly";
|
16
|
+
ACTIONS["GET_PAGE_INFO"] = "getPageInfo";
|
17
|
+
})(ACTIONS || (ACTIONS = {}));
|
18
|
+
const NATURE = {
|
19
|
+
mutable: false,
|
20
|
+
resizable: true,
|
21
|
+
rotatable: true,
|
22
|
+
properties: [
|
23
|
+
{
|
24
|
+
// 대상 Grist
|
25
|
+
type: 'id-input',
|
26
|
+
label: 'target-grist',
|
27
|
+
name: 'target',
|
28
|
+
property: {
|
29
|
+
component: 'grist'
|
30
|
+
}
|
31
|
+
},
|
32
|
+
{
|
33
|
+
// 동작
|
34
|
+
type: 'select',
|
35
|
+
label: 'action',
|
36
|
+
name: 'action',
|
37
|
+
property: {
|
38
|
+
options: [
|
39
|
+
{
|
40
|
+
// 페이지네이션 정보 가져오기
|
41
|
+
display: 'Get page information',
|
42
|
+
value: ACTIONS.GET_PAGE_INFO
|
43
|
+
},
|
44
|
+
{
|
45
|
+
// 모든 레코드 데이터 가져오기
|
46
|
+
display: 'Get all rows',
|
47
|
+
value: ACTIONS.GET_ALL_ROWS
|
48
|
+
},
|
49
|
+
{
|
50
|
+
// 체크된 레코드 데이터 가져오기
|
51
|
+
display: 'Get selected rows',
|
52
|
+
value: ACTIONS.GET_SELECTED
|
53
|
+
},
|
54
|
+
{
|
55
|
+
// 변경 사항이 있는 데이터 가져오기
|
56
|
+
display: 'Get dirty rows',
|
57
|
+
value: ACTIONS.GET_DIRTY
|
58
|
+
},
|
59
|
+
{
|
60
|
+
// 행 추가
|
61
|
+
display: 'Add a row',
|
62
|
+
value: ACTIONS.ADD_ROW
|
63
|
+
},
|
64
|
+
{
|
65
|
+
// 선택 행 삭제
|
66
|
+
display: 'Delete selected rows',
|
67
|
+
value: ACTIONS.DELETE_SELECTED_ROWS
|
68
|
+
},
|
69
|
+
{
|
70
|
+
// 변경 사항을 데이터에 적용
|
71
|
+
display: 'Commit',
|
72
|
+
value: ACTIONS.COMMIT
|
73
|
+
}
|
74
|
+
]
|
75
|
+
}
|
76
|
+
},
|
77
|
+
{
|
78
|
+
// 뷰어 시작 시 자동 실행 여부
|
79
|
+
type: 'checkbox',
|
80
|
+
label: 'run-at-startup',
|
81
|
+
name: 'runAtStartup'
|
82
|
+
},
|
83
|
+
{
|
84
|
+
// 행 추가 시의 포맷
|
85
|
+
type: 'textarea',
|
86
|
+
label: 'record-adder-format',
|
87
|
+
name: 'recordFormat'
|
88
|
+
}
|
89
|
+
],
|
90
|
+
help: 'scene/component/grist-action'
|
91
|
+
};
|
92
|
+
export default class GristAction extends ValueHolder(RectPath(Component)) {
|
93
|
+
constructor() {
|
94
|
+
super(...arguments);
|
95
|
+
// grist의 fetchHandler를 사용할 때 이 컴포넌트를 판별할 ID
|
96
|
+
this.uuid = uuid.v4();
|
97
|
+
}
|
98
|
+
static get nature() {
|
99
|
+
return NATURE;
|
100
|
+
}
|
101
|
+
ready() {
|
102
|
+
// 뷰어 시작시에도 action 값이 getPageInfo로 되어 있을 경우 fetchHandler를 등록하기 위해 onchange를 호출함
|
103
|
+
this.onchange({ action: this.state.action });
|
104
|
+
if (this.state.runAtStartup)
|
105
|
+
this.doAction();
|
106
|
+
}
|
107
|
+
dispose() {
|
108
|
+
super.dispose();
|
109
|
+
}
|
110
|
+
onclick() {
|
111
|
+
// 컴포넌트 클릭 시 동작
|
112
|
+
this.doAction();
|
113
|
+
}
|
114
|
+
onchange(after) {
|
115
|
+
// value 값이 바뀌면 동작
|
116
|
+
if ('value' in after) {
|
117
|
+
this.doAction();
|
118
|
+
}
|
119
|
+
// action 값이 바뀌면 getPageInfo인지 확인하고 grist에 fetchHandler를 등록하거나 폐기함
|
120
|
+
if ('action' in after) {
|
121
|
+
const gristComponent = this.targetGristComponent;
|
122
|
+
if (gristComponent) {
|
123
|
+
if (after.action == ACTIONS.GET_PAGE_INFO)
|
124
|
+
//@ts-ignore
|
125
|
+
gristComponent.beforeFetchFuncs[this.uuid] = fetchedData => {
|
126
|
+
//@ts-ignore
|
127
|
+
this.data = this.getPageInfoFrom(null, fetchedData);
|
128
|
+
this.doDataMap();
|
129
|
+
};
|
130
|
+
//@ts-ignore
|
131
|
+
else
|
132
|
+
delete gristComponent.beforeFetchFuncs[this.uuid];
|
133
|
+
}
|
134
|
+
}
|
135
|
+
}
|
136
|
+
// 데이터 매핑을 수동으로 실행하기 위해 기존의 메소드를 무효화
|
137
|
+
executeMappings() {
|
138
|
+
console.debug("[@operato/data-grist] The method 'executeMappings' is overriden in the component 'grist-action', because of to prevent executing when initialize.");
|
139
|
+
}
|
140
|
+
// 데이터 매핑을 수동으로 조작하기 위한 새 메소드
|
141
|
+
doDataMap() {
|
142
|
+
super.executeMappings();
|
143
|
+
}
|
144
|
+
// action 값에 따라 동작
|
145
|
+
doAction(action) {
|
146
|
+
if (!this.app.isViewMode) {
|
147
|
+
return;
|
148
|
+
}
|
149
|
+
// 파라미터가 명시되어있지 않으면 컴포넌트 속성에서 action 값을 가져옴
|
150
|
+
var { action: storedAction } = this.state;
|
151
|
+
action = action || storedAction;
|
152
|
+
// 대상 Grist 컴포넌트
|
153
|
+
var grist = this.targetGristElement;
|
154
|
+
if (!grist)
|
155
|
+
return;
|
156
|
+
var data;
|
157
|
+
switch (action) {
|
158
|
+
case ACTIONS.GET_ALL_ROWS:
|
159
|
+
data = grist.grist.data;
|
160
|
+
break;
|
161
|
+
case ACTIONS.COMMIT:
|
162
|
+
grist.commit();
|
163
|
+
break;
|
164
|
+
case ACTIONS.GET_SELECTED:
|
165
|
+
data = {
|
166
|
+
patches: this.buildPatches(grist.selected),
|
167
|
+
original: grist.selected
|
168
|
+
};
|
169
|
+
break;
|
170
|
+
case ACTIONS.GET_DIRTY:
|
171
|
+
data = this.assortDirties(grist);
|
172
|
+
break;
|
173
|
+
case ACTIONS.ADD_ROW:
|
174
|
+
{
|
175
|
+
var records = grist.dirtyData.records || [];
|
176
|
+
let recordFormat;
|
177
|
+
try {
|
178
|
+
recordFormat = eval(`(${this.state.recordFormat})`);
|
179
|
+
}
|
180
|
+
catch (e) {
|
181
|
+
console.log('Invalid JSON format. It will be assumed as empty object.\n', e);
|
182
|
+
recordFormat = {};
|
183
|
+
}
|
184
|
+
records.push({ ...recordFormat, __dirty__: '+' });
|
185
|
+
this.refreshGrist(grist);
|
186
|
+
}
|
187
|
+
break;
|
188
|
+
case ACTIONS.DELETE_SELECTED_ROWS:
|
189
|
+
{
|
190
|
+
var records = grist.dirtyData.records || [];
|
191
|
+
//@ts-ignore
|
192
|
+
records.forEach((record, idx) => {
|
193
|
+
if (record['__selected__']) {
|
194
|
+
if (record['__dirty__'] == '+')
|
195
|
+
delete records[idx];
|
196
|
+
else
|
197
|
+
record['__dirty__'] = '-';
|
198
|
+
}
|
199
|
+
});
|
200
|
+
grist.dirtyData.records = records.flat();
|
201
|
+
this.refreshGrist(grist);
|
202
|
+
}
|
203
|
+
break;
|
204
|
+
case ACTIONS.GET_PAGE_INFO:
|
205
|
+
data = this.getPageInfoFrom(grist);
|
206
|
+
break;
|
207
|
+
}
|
208
|
+
// 이 컴포넌트의 data 값이 바뀌는 동작은 데이터 매핑까지 실행함
|
209
|
+
if (data) {
|
210
|
+
this.data = data;
|
211
|
+
this.doDataMap();
|
212
|
+
}
|
213
|
+
}
|
214
|
+
// 대상 grist 컴포넌트의 레코드를 새로고침
|
215
|
+
refreshGrist(grist) {
|
216
|
+
grist = grist || this.targetGristElement;
|
217
|
+
if (!grist)
|
218
|
+
return;
|
219
|
+
//@ts-ignore
|
220
|
+
grist.dataProvider.onRecordChange();
|
221
|
+
grist.grist.data = { ...grist.dirtyData };
|
222
|
+
}
|
223
|
+
// 변경 사항이 있는 레코드의 경우, CUD를 분류해서 반환함
|
224
|
+
assortDirties(grist) {
|
225
|
+
const dirties = grist.dirtyRecords;
|
226
|
+
var patches = this.buildPatches(dirties);
|
227
|
+
var records = {
|
228
|
+
original: dirties,
|
229
|
+
patches,
|
230
|
+
created: [],
|
231
|
+
updated: [],
|
232
|
+
deleted: []
|
233
|
+
};
|
234
|
+
patches.forEach((record) => {
|
235
|
+
switch (record['cuFlag']) {
|
236
|
+
case 'M':
|
237
|
+
records.updated.push(record);
|
238
|
+
break;
|
239
|
+
case '+':
|
240
|
+
records.created.push(record);
|
241
|
+
break;
|
242
|
+
case '-':
|
243
|
+
records.deleted.push(record);
|
244
|
+
break;
|
245
|
+
}
|
246
|
+
});
|
247
|
+
return records;
|
248
|
+
}
|
249
|
+
// 페이지네이션 정보를 가져옴
|
250
|
+
getPageInfoFrom(grist, fetchedData) {
|
251
|
+
//@ts-ignore
|
252
|
+
var { page = 1, limit = 20, sorters = [] } = fetchedData || (grist && grist.dataProvider) || pagination(grist);
|
253
|
+
sorters = sorters.map((sorter) => {
|
254
|
+
sorter.desc = sorter.desc ? true : false;
|
255
|
+
return sorter;
|
256
|
+
});
|
257
|
+
return { page, limit, sorters };
|
258
|
+
function pagination(grist) {
|
259
|
+
var config = grist && grist.config && grist.config.pagination;
|
260
|
+
if (config)
|
261
|
+
return {
|
262
|
+
page: config.page,
|
263
|
+
limit: config.limit || (config.pages && config.pages[0])
|
264
|
+
};
|
265
|
+
else
|
266
|
+
return {};
|
267
|
+
}
|
268
|
+
}
|
269
|
+
// 레코드들을 서버 공통 resolver에 맞는 포맷으로 만듦
|
270
|
+
buildPatches(patches) {
|
271
|
+
return patches.map(patch => {
|
272
|
+
let patchField = patch.id ? { id: patch.id } : {};
|
273
|
+
const dirtyFields = patch.__dirtyfields__;
|
274
|
+
for (let key in dirtyFields) {
|
275
|
+
patchField[key] = dirtyFields[key].after;
|
276
|
+
}
|
277
|
+
patchField.cuFlag = patch.__dirty__;
|
278
|
+
return patchField;
|
279
|
+
});
|
280
|
+
}
|
281
|
+
render(context) {
|
282
|
+
var { top, left, height, width, fillStyle = 'transparent' } = this.model;
|
283
|
+
// background의 색상
|
284
|
+
context.beginPath();
|
285
|
+
context.rect(left, top, width, height);
|
286
|
+
context.fillStyle = fillStyle;
|
287
|
+
context.fill();
|
288
|
+
// value의 색상
|
289
|
+
context.beginPath();
|
290
|
+
var drawValue = width - (width * Math.max(Math.min(this.animValue, 100), 0)) / 100;
|
291
|
+
drawValue = Math.max(Math.min(drawValue, width), 0);
|
292
|
+
context.rect(left + drawValue, top, width - drawValue, height);
|
293
|
+
this.drawFill(context);
|
294
|
+
context.closePath();
|
295
|
+
context.beginPath();
|
296
|
+
context.rect(left, top, width, height);
|
297
|
+
}
|
298
|
+
postrender(context) {
|
299
|
+
this.drawStroke(context);
|
300
|
+
this.drawText(context);
|
301
|
+
}
|
302
|
+
get controls() {
|
303
|
+
return [];
|
304
|
+
}
|
305
|
+
get targetGristComponent() {
|
306
|
+
var { target } = this.state;
|
307
|
+
return this.root.findById(target);
|
308
|
+
}
|
309
|
+
get targetGristElement() {
|
310
|
+
var _a;
|
311
|
+
return (_a = this.targetGristComponent) === null || _a === void 0 ? void 0 : _a.grist;
|
312
|
+
}
|
313
|
+
// @ts-ignore
|
314
|
+
get data() {
|
315
|
+
return this._data;
|
316
|
+
}
|
317
|
+
set data(data) {
|
318
|
+
this._data = data;
|
319
|
+
}
|
320
|
+
}
|
321
|
+
Component.register('grist-action', GristAction);
|
322
|
+
//# sourceMappingURL=grist-action.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"grist-action.js","sourceRoot":"","sources":["../src/grist-action.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n *\n * grist 컴포넌트를 보조하여 grist의 각종 동작을 수행하는 컴포넌트.\n */\n\nimport { Component, Properties, RectPath, ValueHolder } from '@hatiolab/things-scene'\nimport { GristData, GristRecord, SorterConfig } from '@operato/data-grist/src/types.js'\n\nimport { DataGrist } from '@operato/data-grist'\nimport SceneGrist from './grist'\nimport uuid from 'uuid'\n\nexport enum ACTIONS {\n GET_ALL_ROWS = 'getAllRows',\n COMMIT = 'commit',\n GET_SELECTED = 'getSelectedRows',\n GET_DIRTY = 'getDirtyRows',\n ADD_ROW = 'addRow',\n DELETE_SELECTED_ROWS = 'deleteSelectedRowsSoftly',\n GET_PAGE_INFO = 'getPageInfo'\n}\n\nconst NATURE = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n {\n // 대상 Grist\n type: 'id-input',\n label: 'target-grist',\n name: 'target',\n property: {\n component: 'grist'\n }\n },\n {\n // 동작\n type: 'select',\n label: 'action',\n name: 'action',\n property: {\n options: [\n {\n // 페이지네이션 정보 가져오기\n display: 'Get page information',\n value: ACTIONS.GET_PAGE_INFO\n },\n {\n // 모든 레코드 데이터 가져오기\n display: 'Get all rows',\n value: ACTIONS.GET_ALL_ROWS\n },\n {\n // 체크된 레코드 데이터 가져오기\n display: 'Get selected rows',\n value: ACTIONS.GET_SELECTED\n },\n {\n // 변경 사항이 있는 데이터 가져오기\n display: 'Get dirty rows',\n value: ACTIONS.GET_DIRTY\n },\n {\n // 행 추가\n display: 'Add a row',\n value: ACTIONS.ADD_ROW\n },\n {\n // 선택 행 삭제\n display: 'Delete selected rows',\n value: ACTIONS.DELETE_SELECTED_ROWS\n },\n {\n // 변경 사항을 데이터에 적용\n display: 'Commit',\n value: ACTIONS.COMMIT\n }\n ]\n }\n },\n {\n // 뷰어 시작 시 자동 실행 여부\n type: 'checkbox',\n label: 'run-at-startup',\n name: 'runAtStartup'\n },\n {\n // 행 추가 시의 포맷\n type: 'textarea',\n label: 'record-adder-format',\n name: 'recordFormat'\n }\n ],\n help: 'scene/component/grist-action'\n}\n\nexport default class GristAction extends ValueHolder(RectPath(Component)) {\n static get nature() {\n return NATURE\n }\n\n // grist의 fetchHandler를 사용할 때 이 컴포넌트를 판별할 ID\n private uuid = uuid.v4()\n private _data: any\n\n ready() {\n // 뷰어 시작시에도 action 값이 getPageInfo로 되어 있을 경우 fetchHandler를 등록하기 위해 onchange를 호출함\n this.onchange({ action: this.state.action })\n if (this.state.runAtStartup) this.doAction()\n }\n\n dispose() {\n super.dispose()\n }\n\n onclick() {\n // 컴포넌트 클릭 시 동작\n this.doAction()\n }\n\n onchange(after: Properties) {\n // value 값이 바뀌면 동작\n if ('value' in after) {\n this.doAction()\n }\n\n // action 값이 바뀌면 getPageInfo인지 확인하고 grist에 fetchHandler를 등록하거나 폐기함\n if ('action' in after) {\n const gristComponent = this.targetGristComponent\n\n if (gristComponent) {\n if (after.action == ACTIONS.GET_PAGE_INFO)\n //@ts-ignore\n gristComponent.beforeFetchFuncs[this.uuid] = fetchedData => {\n //@ts-ignore\n this.data = this.getPageInfoFrom(null, fetchedData)\n this.doDataMap()\n }\n //@ts-ignore\n else delete gristComponent.beforeFetchFuncs[this.uuid]\n }\n }\n }\n\n // 데이터 매핑을 수동으로 실행하기 위해 기존의 메소드를 무효화\n executeMappings() {\n console.debug(\n \"[@operato/data-grist] The method 'executeMappings' is overriden in the component 'grist-action', because of to prevent executing when initialize.\"\n )\n }\n\n // 데이터 매핑을 수동으로 조작하기 위한 새 메소드\n doDataMap() {\n super.executeMappings()\n }\n\n // action 값에 따라 동작\n doAction(action?: ACTIONS) {\n if (!this.app.isViewMode) {\n return\n }\n\n // 파라미터가 명시되어있지 않으면 컴포넌트 속성에서 action 값을 가져옴\n var { action: storedAction } = this.state\n action = action || storedAction\n\n // 대상 Grist 컴포넌트\n var grist = this.targetGristElement\n if (!grist) return\n\n var data\n switch (action) {\n case ACTIONS.GET_ALL_ROWS:\n data = grist.grist.data\n break\n case ACTIONS.COMMIT:\n grist.commit()\n break\n case ACTIONS.GET_SELECTED:\n data = {\n patches: this.buildPatches(grist.selected),\n original: grist.selected\n }\n break\n case ACTIONS.GET_DIRTY:\n data = this.assortDirties(grist)\n break\n case ACTIONS.ADD_ROW:\n {\n var records = grist.dirtyData.records || []\n\n let recordFormat\n try {\n recordFormat = eval(`(${this.state.recordFormat})`)\n } catch (e) {\n console.log('Invalid JSON format. It will be assumed as empty object.\\n', e)\n recordFormat = {}\n }\n records.push({ ...recordFormat, __dirty__: '+' })\n this.refreshGrist(grist)\n }\n break\n case ACTIONS.DELETE_SELECTED_ROWS:\n {\n var records = grist.dirtyData.records || []\n\n //@ts-ignore\n records.forEach((record, idx) => {\n if (record['__selected__']) {\n if (record['__dirty__'] == '+') delete records[idx]\n else record['__dirty__'] = '-'\n }\n })\n grist.dirtyData.records = records.flat()\n this.refreshGrist(grist)\n }\n break\n case ACTIONS.GET_PAGE_INFO:\n data = this.getPageInfoFrom(grist)\n break\n }\n\n // 이 컴포넌트의 data 값이 바뀌는 동작은 데이터 매핑까지 실행함\n if (data) {\n this.data = data\n this.doDataMap()\n }\n }\n\n // 대상 grist 컴포넌트의 레코드를 새로고침\n refreshGrist(grist: DataGrist) {\n grist = grist || this.targetGristElement\n if (!grist) return\n\n //@ts-ignore\n grist.dataProvider.onRecordChange()\n grist.grist.data = { ...grist.dirtyData }\n }\n\n // 변경 사항이 있는 레코드의 경우, CUD를 분류해서 반환함\n assortDirties(grist: DataGrist) {\n const dirties = grist.dirtyRecords\n var patches = this.buildPatches(dirties)\n var records = {\n original: dirties,\n patches,\n created: [] as GristRecord[],\n updated: [] as GristRecord[],\n deleted: [] as GristRecord[]\n }\n\n patches.forEach((record: GristRecord) => {\n switch (record['cuFlag']) {\n case 'M':\n records.updated.push(record)\n break\n case '+':\n records.created.push(record)\n break\n case '-':\n records.deleted.push(record)\n break\n }\n })\n return records\n }\n\n // 페이지네이션 정보를 가져옴\n getPageInfoFrom(grist: DataGrist, fetchedData?: GristData) {\n //@ts-ignore\n var { page = 1, limit = 20, sorters = [] } = fetchedData || (grist && grist.dataProvider) || pagination(grist)\n\n sorters = sorters.map((sorter: SorterConfig) => {\n sorter.desc = sorter.desc ? true : false\n return sorter\n })\n return { page, limit, sorters }\n\n function pagination(grist: DataGrist) {\n var config = grist && grist.config && grist.config.pagination\n if (config)\n return {\n page: config.page,\n limit: config.limit || (config.pages && config.pages[0])\n }\n else return {}\n }\n }\n\n // 레코드들을 서버 공통 resolver에 맞는 포맷으로 만듦\n buildPatches(patches: GristRecord[]): GristRecord[] {\n return patches.map(patch => {\n let patchField: { [key: string]: any } = patch.id ? { id: patch.id } : {}\n const dirtyFields = patch.__dirtyfields__\n\n for (let key in dirtyFields) {\n patchField[key] = dirtyFields[key].after\n }\n patchField.cuFlag = patch.__dirty__\n\n return patchField\n })\n }\n\n render(context: CanvasRenderingContext2D) {\n var { top, left, height, width, fillStyle = 'transparent' } = this.model\n\n // background의 색상\n context.beginPath()\n context.rect(left, top, width, height)\n\n context.fillStyle = fillStyle\n context.fill()\n\n // value의 색상\n context.beginPath()\n\n var drawValue = width - (width * Math.max(Math.min(this.animValue, 100), 0)) / 100\n drawValue = Math.max(Math.min(drawValue, width), 0)\n\n context.rect(left + drawValue, top, width - drawValue, height)\n\n this.drawFill(context)\n\n context.closePath()\n\n context.beginPath()\n\n context.rect(left, top, width, height)\n }\n\n postrender(context: CanvasRenderingContext2D) {\n this.drawStroke(context)\n this.drawText(context)\n }\n\n get controls() {\n return []\n }\n\n get targetGristComponent(): SceneGrist {\n var { target } = this.state\n return this.root.findById(target) as SceneGrist\n }\n\n get targetGristElement(): DataGrist | undefined {\n return this.targetGristComponent?.grist\n }\n\n // @ts-ignore\n get data() {\n return this._data\n }\n\n set data(data) {\n this._data = data\n }\n}\n\nComponent.register('grist-action', GristAction)\n"]}
|
package/dist/grist.d.ts
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
import '@operato/data-grist';
|
2
|
+
import { HTMLOverlayElement, Properties } from '@hatiolab/things-scene';
|
3
|
+
import { DataGrist } from '@operato/data-grist';
|
4
|
+
export default class SceneGrist extends HTMLOverlayElement {
|
5
|
+
static get nature(): {
|
6
|
+
mutable: boolean;
|
7
|
+
resizable: boolean;
|
8
|
+
rotatable: boolean;
|
9
|
+
properties: ({
|
10
|
+
type: string;
|
11
|
+
label: string;
|
12
|
+
name: string;
|
13
|
+
property: {
|
14
|
+
options: {
|
15
|
+
display: string;
|
16
|
+
value: string;
|
17
|
+
}[];
|
18
|
+
step?: undefined;
|
19
|
+
min?: undefined;
|
20
|
+
};
|
21
|
+
} | {
|
22
|
+
type: string;
|
23
|
+
label: string;
|
24
|
+
name: string;
|
25
|
+
property?: undefined;
|
26
|
+
} | {
|
27
|
+
type: string;
|
28
|
+
label: string;
|
29
|
+
name: string;
|
30
|
+
property: {
|
31
|
+
step: number;
|
32
|
+
min: number;
|
33
|
+
options?: undefined;
|
34
|
+
};
|
35
|
+
})[];
|
36
|
+
help: string;
|
37
|
+
};
|
38
|
+
private __value;
|
39
|
+
private beforeFetchFuncs;
|
40
|
+
private _listenTo?;
|
41
|
+
private _listener?;
|
42
|
+
grist?: DataGrist;
|
43
|
+
ready(): void;
|
44
|
+
removed(): void;
|
45
|
+
createElement(): void;
|
46
|
+
get value(): any;
|
47
|
+
set value(value: any);
|
48
|
+
onchange(after: Properties, before: Properties): void;
|
49
|
+
dispose(): void;
|
50
|
+
setElementProperties(grist: DataGrist): void;
|
51
|
+
setGristConfig(grist: DataGrist | undefined): void;
|
52
|
+
reposition(): void;
|
53
|
+
rescale(): void;
|
54
|
+
get config(): any;
|
55
|
+
get tagName(): string;
|
56
|
+
}
|