@operato/scene-grist 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/LICENSE +21 -0
  3. package/README.md +0 -0
  4. package/dist/editors/index.d.ts +2 -0
  5. package/dist/editors/index.js +2 -0
  6. package/dist/editors/index.js.map +1 -0
  7. package/dist/grist-action.d.ts +82 -0
  8. package/dist/grist-action.js +322 -0
  9. package/dist/grist-action.js.map +1 -0
  10. package/dist/grist.d.ts +56 -0
  11. package/dist/grist.js +258 -0
  12. package/dist/grist.js.map +1 -0
  13. package/dist/index.d.ts +4 -0
  14. package/dist/index.js +4 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/templates/grist-action.d.ts +17 -0
  17. package/dist/templates/grist-action.js +19 -0
  18. package/dist/templates/grist-action.js.map +1 -0
  19. package/dist/templates/grist.d.ts +16 -0
  20. package/dist/templates/grist.js +98 -0
  21. package/dist/templates/grist.js.map +1 -0
  22. package/dist/templates/index.d.ts +30 -0
  23. package/dist/templates/index.js +4 -0
  24. package/dist/templates/index.js.map +1 -0
  25. package/global/index.d.ts +1 -0
  26. package/helps/scene/component/grist-action.ko.md +45 -0
  27. package/helps/scene/component/grist-action.md +43 -0
  28. package/helps/scene/component/grist-action.zh.md +44 -0
  29. package/helps/scene/component/grist.ko.md +26 -0
  30. package/helps/scene/component/grist.md +26 -0
  31. package/helps/scene/component/grist.zh.md +26 -0
  32. package/package.json +64 -0
  33. package/src/editors/index.ts +1 -0
  34. package/src/grist-action.ts +362 -0
  35. package/src/grist.ts +302 -0
  36. package/src/index.ts +3 -0
  37. package/src/templates/grist-action.png +0 -0
  38. package/src/templates/grist-action.ts +19 -0
  39. package/src/templates/grist.png +0 -0
  40. package/src/templates/grist.ts +98 -0
  41. package/src/templates/index.ts +3 -0
  42. package/src/uuid.d.ts +1 -0
  43. package/things-scene.config.js +7 -0
  44. package/translations/en.json +13 -0
  45. package/translations/ko.json +13 -0
  46. package/translations/ms.json +13 -0
  47. package/translations/zh.json +13 -0
  48. package/tsconfig.json +23 -0
  49. 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,2 @@
1
+ declare const _default: never[];
2
+ export default _default;
@@ -0,0 +1,2 @@
1
+ export default [];
2
+ //# sourceMappingURL=index.js.map
@@ -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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAc,QAAQ,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAKrF,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,MAAM,CAAN,IAAY,OAQX;AARD,WAAY,OAAO;IACjB,sCAA2B,CAAA;IAC3B,4BAAiB,CAAA;IACjB,2CAAgC,CAAA;IAChC,qCAA0B,CAAA;IAC1B,6BAAkB,CAAA;IAClB,4DAAiD,CAAA;IACjD,wCAA6B,CAAA;AAC/B,CAAC,EARW,OAAO,KAAP,OAAO,QAQlB;AAED,MAAM,MAAM,GAAG;IACb,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,UAAU,EAAE;QACV;YACE,WAAW;YACX,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,cAAc;YACrB,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE;gBACR,SAAS,EAAE,OAAO;aACnB;SACF;QACD;YACE,KAAK;YACL,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE;gBACR,OAAO,EAAE;oBACP;wBACE,iBAAiB;wBACjB,OAAO,EAAE,sBAAsB;wBAC/B,KAAK,EAAE,OAAO,CAAC,aAAa;qBAC7B;oBACD;wBACE,kBAAkB;wBAClB,OAAO,EAAE,cAAc;wBACvB,KAAK,EAAE,OAAO,CAAC,YAAY;qBAC5B;oBACD;wBACE,mBAAmB;wBACnB,OAAO,EAAE,mBAAmB;wBAC5B,KAAK,EAAE,OAAO,CAAC,YAAY;qBAC5B;oBACD;wBACE,qBAAqB;wBACrB,OAAO,EAAE,gBAAgB;wBACzB,KAAK,EAAE,OAAO,CAAC,SAAS;qBACzB;oBACD;wBACE,OAAO;wBACP,OAAO,EAAE,WAAW;wBACpB,KAAK,EAAE,OAAO,CAAC,OAAO;qBACvB;oBACD;wBACE,UAAU;wBACV,OAAO,EAAE,sBAAsB;wBAC/B,KAAK,EAAE,OAAO,CAAC,oBAAoB;qBACpC;oBACD;wBACE,iBAAiB;wBACjB,OAAO,EAAE,QAAQ;wBACjB,KAAK,EAAE,OAAO,CAAC,MAAM;qBACtB;iBACF;aACF;SACF;QACD;YACE,mBAAmB;YACnB,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,gBAAgB;YACvB,IAAI,EAAE,cAAc;SACrB;QACD;YACE,aAAa;YACb,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,qBAAqB;YAC5B,IAAI,EAAE,cAAc;SACrB;KACF;IACD,IAAI,EAAE,8BAA8B;CACrC,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAAzE;;QAKE,4CAA4C;QACpC,SAAI,GAAG,IAAI,CAAC,EAAE,EAAE,CAAA;IA+P1B,CAAC;IApQC,MAAM,KAAK,MAAM;QACf,OAAO,MAAM,CAAA;IACf,CAAC;IAMD,KAAK;QACH,+EAA+E;QAC/E,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;QAC5C,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY;YAAE,IAAI,CAAC,QAAQ,EAAE,CAAA;IAC9C,CAAC;IAED,OAAO;QACL,KAAK,CAAC,OAAO,EAAE,CAAA;IACjB,CAAC;IAED,OAAO;QACL,eAAe;QACf,IAAI,CAAC,QAAQ,EAAE,CAAA;IACjB,CAAC;IAED,QAAQ,CAAC,KAAiB;QACxB,kBAAkB;QAClB,IAAI,OAAO,IAAI,KAAK,EAAE;YACpB,IAAI,CAAC,QAAQ,EAAE,CAAA;SAChB;QAED,kEAAkE;QAClE,IAAI,QAAQ,IAAI,KAAK,EAAE;YACrB,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAA;YAEhD,IAAI,cAAc,EAAE;gBAClB,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,aAAa;oBACvC,YAAY;oBACZ,cAAc,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,EAAE;wBACzD,YAAY;wBACZ,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;wBACnD,IAAI,CAAC,SAAS,EAAE,CAAA;oBAClB,CAAC,CAAA;gBACH,YAAY;;oBACP,OAAO,cAAc,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;aACvD;SACF;IACH,CAAC;IAED,oCAAoC;IACpC,eAAe;QACb,OAAO,CAAC,KAAK,CACX,mJAAmJ,CACpJ,CAAA;IACH,CAAC;IAED,6BAA6B;IAC7B,SAAS;QACP,KAAK,CAAC,eAAe,EAAE,CAAA;IACzB,CAAC;IAED,kBAAkB;IAClB,QAAQ,CAAC,MAAgB;QACvB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE;YACxB,OAAM;SACP;QAED,2CAA2C;QAC3C,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,KAAK,CAAA;QACzC,MAAM,GAAG,MAAM,IAAI,YAAY,CAAA;QAE/B,gBAAgB;QAChB,IAAI,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAA;QACnC,IAAI,CAAC,KAAK;YAAE,OAAM;QAElB,IAAI,IAAI,CAAA;QACR,QAAQ,MAAM,EAAE;YACd,KAAK,OAAO,CAAC,YAAY;gBACvB,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAA;gBACvB,MAAK;YACP,KAAK,OAAO,CAAC,MAAM;gBACjB,KAAK,CAAC,MAAM,EAAE,CAAA;gBACd,MAAK;YACP,KAAK,OAAO,CAAC,YAAY;gBACvB,IAAI,GAAG;oBACL,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC;oBAC1C,QAAQ,EAAE,KAAK,CAAC,QAAQ;iBACzB,CAAA;gBACD,MAAK;YACP,KAAK,OAAO,CAAC,SAAS;gBACpB,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;gBAChC,MAAK;YACP,KAAK,OAAO,CAAC,OAAO;gBAClB;oBACE,IAAI,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAA;oBAE3C,IAAI,YAAY,CAAA;oBAChB,IAAI;wBACF,YAAY,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAA;qBACpD;oBAAC,OAAO,CAAC,EAAE;wBACV,OAAO,CAAC,GAAG,CAAC,4DAA4D,EAAE,CAAC,CAAC,CAAA;wBAC5E,YAAY,GAAG,EAAE,CAAA;qBAClB;oBACD,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,YAAY,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;oBACjD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;iBACzB;gBACD,MAAK;YACP,KAAK,OAAO,CAAC,oBAAoB;gBAC/B;oBACE,IAAI,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAA;oBAE3C,YAAY;oBACZ,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;wBAC9B,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE;4BAC1B,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,GAAG;gCAAE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAA;;gCAC9C,MAAM,CAAC,WAAW,CAAC,GAAG,GAAG,CAAA;yBAC/B;oBACH,CAAC,CAAC,CAAA;oBACF,KAAK,CAAC,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;oBACxC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;iBACzB;gBACD,MAAK;YACP,KAAK,OAAO,CAAC,aAAa;gBACxB,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;gBAClC,MAAK;SACR;QAED,uCAAuC;QACvC,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;YAChB,IAAI,CAAC,SAAS,EAAE,CAAA;SACjB;IACH,CAAC;IAED,2BAA2B;IAC3B,YAAY,CAAC,KAAgB;QAC3B,KAAK,GAAG,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAA;QACxC,IAAI,CAAC,KAAK;YAAE,OAAM;QAElB,YAAY;QACZ,KAAK,CAAC,YAAY,CAAC,cAAc,EAAE,CAAA;QACnC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAA;IAC3C,CAAC;IAED,mCAAmC;IACnC,aAAa,CAAC,KAAgB;QAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,CAAA;QAClC,IAAI,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;QACxC,IAAI,OAAO,GAAG;YACZ,QAAQ,EAAE,OAAO;YACjB,OAAO;YACP,OAAO,EAAE,EAAmB;YAC5B,OAAO,EAAE,EAAmB;YAC5B,OAAO,EAAE,EAAmB;SAC7B,CAAA;QAED,OAAO,CAAC,OAAO,CAAC,CAAC,MAAmB,EAAE,EAAE;YACtC,QAAQ,MAAM,CAAC,QAAQ,CAAC,EAAE;gBACxB,KAAK,GAAG;oBACN,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;oBAC5B,MAAK;gBACP,KAAK,GAAG;oBACN,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;oBAC5B,MAAK;gBACP,KAAK,GAAG;oBACN,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;oBAC5B,MAAK;aACR;QACH,CAAC,CAAC,CAAA;QACF,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,iBAAiB;IACjB,eAAe,CAAC,KAAgB,EAAE,WAAuB;QACvD,YAAY;QACZ,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE,GAAG,WAAW,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAA;QAE9G,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAoB,EAAE,EAAE;YAC7C,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAA;YACxC,OAAO,MAAM,CAAA;QACf,CAAC,CAAC,CAAA;QACF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;QAE/B,SAAS,UAAU,CAAC,KAAgB;YAClC,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,CAAA;YAC7D,IAAI,MAAM;gBACR,OAAO;oBACL,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;iBACzD,CAAA;;gBACE,OAAO,EAAE,CAAA;QAChB,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,YAAY,CAAC,OAAsB;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACzB,IAAI,UAAU,GAA2B,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;YACzE,MAAM,WAAW,GAAG,KAAK,CAAC,eAAe,CAAA;YAEzC,KAAK,IAAI,GAAG,IAAI,WAAW,EAAE;gBAC3B,UAAU,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,CAAA;aACzC;YACD,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,CAAA;YAEnC,OAAO,UAAU,CAAA;QACnB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,CAAC,OAAiC;QACtC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,aAAa,EAAE,GAAG,IAAI,CAAC,KAAK,CAAA;QAExE,iBAAiB;QACjB,OAAO,CAAC,SAAS,EAAE,CAAA;QACnB,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;QAEtC,OAAO,CAAC,SAAS,GAAG,SAAS,CAAA;QAC7B,OAAO,CAAC,IAAI,EAAE,CAAA;QAEd,YAAY;QACZ,OAAO,CAAC,SAAS,EAAE,CAAA;QAEnB,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;QAClF,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;QAEnD,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS,EAAE,GAAG,EAAE,KAAK,GAAG,SAAS,EAAE,MAAM,CAAC,CAAA;QAE9D,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QAEtB,OAAO,CAAC,SAAS,EAAE,CAAA;QAEnB,OAAO,CAAC,SAAS,EAAE,CAAA;QAEnB,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IACxC,CAAC;IAED,UAAU,CAAC,OAAiC;QAC1C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QACxB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IACxB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,EAAE,CAAA;IACX,CAAC;IAED,IAAI,oBAAoB;QACtB,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAA;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAe,CAAA;IACjD,CAAC;IAED,IAAI,kBAAkB;;QACpB,OAAO,MAAA,IAAI,CAAC,oBAAoB,0CAAE,KAAK,CAAA;IACzC,CAAC;IAED,aAAa;IACb,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,IAAI,IAAI,CAAC,IAAI;QACX,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;IACnB,CAAC;CACF;AAED,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,CAAA","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"]}
@@ -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
+ }