@operato/scene-grist 0.0.9
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/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
|
+
}
|