@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.
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/dist/grist.js ADDED
@@ -0,0 +1,258 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ const NATURE = {
5
+ mutable: false,
6
+ resizable: true,
7
+ rotatable: true,
8
+ properties: [
9
+ {
10
+ type: 'select',
11
+ label: 'grist-mode',
12
+ name: 'mode',
13
+ property: {
14
+ options: [
15
+ {
16
+ display: 'Grid',
17
+ value: 'GRID'
18
+ },
19
+ {
20
+ display: 'List',
21
+ value: 'LIST'
22
+ },
23
+ {
24
+ display: 'Depends on device',
25
+ value: 'DEVICE'
26
+ }
27
+ ]
28
+ }
29
+ },
30
+ {
31
+ type: 'textarea',
32
+ label: 'config',
33
+ name: 'config'
34
+ },
35
+ {
36
+ type: 'checkbox',
37
+ label: 'appendable',
38
+ name: 'appendable'
39
+ },
40
+ {
41
+ type: 'checkbox',
42
+ label: 'paginatable',
43
+ name: 'paginatable'
44
+ },
45
+ {
46
+ type: 'number',
47
+ label: 'content-scale',
48
+ name: 'contentScale',
49
+ property: {
50
+ step: 0.1,
51
+ min: 0.1
52
+ }
53
+ },
54
+ {
55
+ type: 'select',
56
+ label: 'bound-data',
57
+ name: 'boundData',
58
+ property: {
59
+ options: [
60
+ {
61
+ display: '',
62
+ value: ''
63
+ },
64
+ {
65
+ display: 'Focused Row',
66
+ value: 'focused-row'
67
+ },
68
+ {
69
+ display: 'Selected Rows',
70
+ value: 'selected-rows'
71
+ }
72
+ ]
73
+ }
74
+ }
75
+ ],
76
+ help: 'scene/component/grist'
77
+ };
78
+ import '@operato/data-grist';
79
+ import { Component, HTMLOverlayElement, error } from '@hatiolab/things-scene';
80
+ const isMobileDevice = () => false;
81
+ export default class SceneGrist extends HTMLOverlayElement {
82
+ constructor() {
83
+ super(...arguments);
84
+ this.__value = {};
85
+ this.beforeFetchFuncs = {};
86
+ }
87
+ static get nature() {
88
+ return NATURE;
89
+ }
90
+ ready() {
91
+ super.ready();
92
+ if (this.rootModel) {
93
+ this._listenTo = this.rootModel;
94
+ this._listener = function (after) {
95
+ after.scale && this.rescale();
96
+ }.bind(this);
97
+ this.rootModel.on('change', this._listener);
98
+ }
99
+ }
100
+ removed() {
101
+ if (this._listenTo) {
102
+ this._listenTo.off('change', this._listener);
103
+ delete this._listenTo;
104
+ delete this._listener;
105
+ }
106
+ }
107
+ createElement() {
108
+ super.createElement();
109
+ this.grist = document.createElement('ox-data-grist');
110
+ this.grist.style.setProperty('--grist-padding', '0');
111
+ this.element.appendChild(this.grist);
112
+ this.rescale();
113
+ const grist = this.grist;
114
+ this.setGristConfig(grist);
115
+ //@ts-ignore
116
+ grist.fetchHandler = ({ page, limit, sorters, options }) => {
117
+ Object.values(this.beforeFetchFuncs).forEach((func) => func({ page, limit, sorters, options }));
118
+ var { total = 0, records = [] } = grist.data || {};
119
+ return {
120
+ page,
121
+ limit,
122
+ total,
123
+ records
124
+ };
125
+ };
126
+ grist.addEventListener('select-record-change', e => {
127
+ var _a;
128
+ if (this.state.boundData === 'selected-rows') {
129
+ this.data = ((_a = e.target) === null || _a === void 0 ? void 0 : _a.selected) || [];
130
+ }
131
+ });
132
+ grist.addEventListener('select-all-change', e => {
133
+ var _a;
134
+ if (this.state.boundData === 'selected-rows') {
135
+ this.data = ((_a = e.target) === null || _a === void 0 ? void 0 : _a.selected) || [];
136
+ }
137
+ });
138
+ grist.addEventListener('focus-change', (e) => {
139
+ var _a, _b;
140
+ if (this.state.boundData === 'focused-row') {
141
+ this.data = (((_b = (_a = e.target) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.records) || [])[e.detail.row];
142
+ }
143
+ });
144
+ }
145
+ get value() {
146
+ return this.__value;
147
+ }
148
+ set value(value) {
149
+ this.__value = value;
150
+ if (!this.grist || typeof value !== 'object')
151
+ return;
152
+ var { page, limit } = this.config.pagination || {};
153
+ this.grist.data =
154
+ value instanceof Array
155
+ ? {
156
+ page,
157
+ limit,
158
+ ...this.grist._data,
159
+ total: value.length,
160
+ records: Array.from(value)
161
+ }
162
+ : {
163
+ page,
164
+ limit,
165
+ ...this.grist._data,
166
+ ...value
167
+ };
168
+ }
169
+ onchange(after, before) {
170
+ if ('mode' in after || 'appendable' in after || 'paginatable' in after || 'config' in after) {
171
+ this.setGristConfig(this.grist);
172
+ }
173
+ this.rescale();
174
+ }
175
+ dispose() {
176
+ super.dispose();
177
+ delete this.grist;
178
+ }
179
+ /*
180
+ * 컴포넌트의 생성 또는 속성 변화 시에 호출되며,
181
+ * 그에 따른 html element의 반영이 필요한 부분을 구현한다.
182
+ *
183
+ * ThingsComponent state => HTML element properties
184
+ */
185
+ setElementProperties(grist) {
186
+ this.rescale();
187
+ }
188
+ setGristConfig(grist) {
189
+ if (!grist) {
190
+ return;
191
+ }
192
+ var { mode } = this.state;
193
+ if (mode != 'DEVICE') {
194
+ grist.mode = mode;
195
+ }
196
+ else {
197
+ grist.mode = isMobileDevice() ? 'LIST' : 'GRID';
198
+ }
199
+ grist.config = this.config;
200
+ }
201
+ /*
202
+ * 컴포넌트가 ready 상태가 되거나, 컴포넌트의 속성이 변화될 시 setElementProperties 뒤에 호출된다.
203
+ * 변화에 따른 기본적인 html 속성이 super.reposition()에서 진행되고, 그 밖의 작업이 필요할 때, 오버라이드 한다.
204
+ */
205
+ reposition() {
206
+ super.reposition();
207
+ }
208
+ /*
209
+ * grist는 부모의 스케일의 역으로 transform해서, scale을 1로 맞춘다.
210
+ */
211
+ rescale() {
212
+ var grist = this.grist;
213
+ if (!grist) {
214
+ return;
215
+ }
216
+ const scale = this.getState('contentScale') || 1;
217
+ const sx = scale;
218
+ const sy = scale;
219
+ const transform = `scale(${sx}, ${sy})`;
220
+ ['-webkit-', '-moz-', '-ms-', '-o-', ''].forEach((prefix) => {
221
+ grist.style.setProperty(prefix + 'transform', transform);
222
+ grist.style.setProperty(prefix + 'transform-origin', '0px 0px');
223
+ });
224
+ const { width, height } = this.state;
225
+ grist.style.width = Math.round(width / scale) + 'px';
226
+ grist.style.height = Math.round(height / scale) + 'px';
227
+ }
228
+ get config() {
229
+ var { config, appendable, paginatable } = this.state;
230
+ if (typeof config !== 'object') {
231
+ try {
232
+ config = eval(`(${config})`);
233
+ }
234
+ catch (e) {
235
+ error(e);
236
+ }
237
+ }
238
+ if (paginatable) {
239
+ if (config.pagination && !config.pagination.limit && config.pagination.pages && config.pagination.pages.length) {
240
+ config.pagination.limit = config.pagination.pages[0];
241
+ }
242
+ }
243
+ config.pagination = {
244
+ ...config.pagination,
245
+ infinite: !paginatable
246
+ };
247
+ config.rows = {
248
+ ...config.rows,
249
+ appendable: !!appendable
250
+ };
251
+ return config;
252
+ }
253
+ get tagName() {
254
+ return 'div';
255
+ }
256
+ }
257
+ Component.register('grist', SceneGrist);
258
+ //# sourceMappingURL=grist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grist.js","sourceRoot":"","sources":["../src/grist.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nconst NATURE = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n {\n type: 'select',\n label: 'grist-mode',\n name: 'mode',\n property: {\n options: [\n {\n display: 'Grid',\n value: 'GRID'\n },\n {\n display: 'List',\n value: 'LIST'\n },\n {\n display: 'Depends on device',\n value: 'DEVICE'\n }\n ]\n }\n },\n {\n type: 'textarea',\n label: 'config',\n name: 'config'\n },\n {\n type: 'checkbox',\n label: 'appendable',\n name: 'appendable'\n },\n {\n type: 'checkbox',\n label: 'paginatable',\n name: 'paginatable'\n },\n {\n type: 'number',\n label: 'content-scale',\n name: 'contentScale',\n property: {\n step: 0.1,\n min: 0.1\n }\n },\n {\n type: 'select',\n label: 'bound-data',\n name: 'boundData',\n property: {\n options: [\n {\n display: '',\n value: ''\n },\n {\n display: 'Focused Row',\n value: 'focused-row'\n },\n {\n display: 'Selected Rows',\n value: 'selected-rows'\n }\n ]\n }\n }\n ],\n help: 'scene/component/grist'\n}\n\nimport '@operato/data-grist'\n\nimport { Component, HTMLOverlayElement, Properties, error } from '@hatiolab/things-scene'\n\nimport { DataGrist } from '@operato/data-grist'\n\nconst isMobileDevice = () => false\n\nexport default class SceneGrist extends HTMLOverlayElement {\n static get nature() {\n return NATURE\n }\n\n private __value: any = {}\n private beforeFetchFuncs: any = {}\n private _listenTo?: any\n private _listener?: any\n\n public grist?: DataGrist\n\n ready() {\n super.ready()\n\n if (this.rootModel) {\n this._listenTo = this.rootModel\n this._listener = function (this: SceneGrist, after: Properties) {\n after.scale && this.rescale()\n }.bind(this)\n this.rootModel.on('change', this._listener)\n }\n }\n\n removed() {\n if (this._listenTo) {\n this._listenTo.off('change', this._listener)\n\n delete this._listenTo\n delete this._listener\n }\n }\n\n createElement() {\n super.createElement()\n\n this.grist = document.createElement('ox-data-grist') as DataGrist\n this.grist.style.setProperty('--grist-padding', '0')\n\n this.element.appendChild(this.grist)\n\n this.rescale()\n\n const grist = this.grist\n\n this.setGristConfig(grist)\n\n //@ts-ignore\n grist.fetchHandler = ({ page, limit, sorters, options }) => {\n Object.values(this.beforeFetchFuncs).forEach((func: any) => func({ page, limit, sorters, options }))\n var { total = 0, records = [] } = grist.data || {}\n return {\n page,\n limit,\n total,\n records\n }\n }\n\n grist.addEventListener('select-record-change', e => {\n if (this.state.boundData === 'selected-rows') {\n this.data = (e.target as DataGrist)?.selected || []\n }\n })\n\n grist.addEventListener('select-all-change', e => {\n if (this.state.boundData === 'selected-rows') {\n this.data = (e.target as DataGrist)?.selected || []\n }\n })\n\n grist.addEventListener('focus-change', (e: Event) => {\n if (this.state.boundData === 'focused-row') {\n this.data = ((e.target as DataGrist)?.data?.records || [])[(e as CustomEvent).detail.row]\n }\n })\n }\n\n get value() {\n return this.__value\n }\n\n set value(value) {\n this.__value = value\n if (!this.grist || typeof value !== 'object') return\n\n var { page, limit } = this.config.pagination || {}\n\n this.grist.data =\n value instanceof Array\n ? {\n page,\n limit,\n ...this.grist._data,\n total: value.length,\n records: Array.from(value)\n }\n : {\n page,\n limit,\n ...this.grist._data,\n ...value\n }\n }\n\n onchange(after: Properties, before: Properties) {\n if ('mode' in after || 'appendable' in after || 'paginatable' in after || 'config' in after) {\n this.setGristConfig(this.grist)\n }\n\n this.rescale()\n }\n\n dispose() {\n super.dispose()\n\n delete this.grist\n }\n\n /*\n * 컴포넌트의 생성 또는 속성 변화 시에 호출되며,\n * 그에 따른 html element의 반영이 필요한 부분을 구현한다.\n *\n * ThingsComponent state => HTML element properties\n */\n setElementProperties(grist: DataGrist) {\n this.rescale()\n }\n\n setGristConfig(grist: DataGrist | undefined) {\n if (!grist) {\n return\n }\n\n var { mode } = this.state\n\n if (mode != 'DEVICE') {\n grist.mode = mode\n } else {\n grist.mode = isMobileDevice() ? 'LIST' : 'GRID'\n }\n\n grist.config = this.config\n }\n\n /*\n * 컴포넌트가 ready 상태가 되거나, 컴포넌트의 속성이 변화될 시 setElementProperties 뒤에 호출된다.\n * 변화에 따른 기본적인 html 속성이 super.reposition()에서 진행되고, 그 밖의 작업이 필요할 때, 오버라이드 한다.\n */\n reposition() {\n super.reposition()\n }\n\n /*\n * grist는 부모의 스케일의 역으로 transform해서, scale을 1로 맞춘다.\n */\n rescale() {\n var grist = this.grist\n if (!grist) {\n return\n }\n\n const scale = this.getState('contentScale') || 1\n\n const sx = scale\n const sy = scale\n\n const transform = `scale(${sx}, ${sy})`\n\n ;['-webkit-', '-moz-', '-ms-', '-o-', ''].forEach((prefix: string) => {\n grist!.style.setProperty(prefix + 'transform', transform)\n grist!.style.setProperty(prefix + 'transform-origin', '0px 0px')\n })\n\n const { width, height } = this.state\n grist.style.width = Math.round(width / scale) + 'px'\n grist.style.height = Math.round(height / scale) + 'px'\n }\n\n get config() {\n var { config, appendable, paginatable } = this.state\n\n if (typeof config !== 'object') {\n try {\n config = eval(`(${config})`)\n } catch (e) {\n error(e)\n }\n }\n\n if (paginatable) {\n if (config.pagination && !config.pagination.limit && config.pagination.pages && config.pagination.pages.length) {\n config.pagination.limit = config.pagination.pages[0]\n }\n }\n\n config.pagination = {\n ...config.pagination,\n infinite: !paginatable\n }\n\n config.rows = {\n ...config.rows,\n appendable: !!appendable\n }\n\n return config\n }\n\n get tagName() {\n return 'div'\n }\n}\n\nComponent.register('grist', SceneGrist)\n"]}
@@ -0,0 +1,4 @@
1
+ import Grist from './grist';
2
+ import GristAction from './grist-action';
3
+ declare const _default: (typeof GristAction | typeof Grist)[];
4
+ export default _default;
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ import Grist from './grist';
2
+ import GristAction from './grist-action';
3
+ export default [Grist, GristAction];
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,SAAS,CAAA;AAC3B,OAAO,WAAW,MAAM,gBAAgB,CAAA;AACxC,eAAe,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA","sourcesContent":["import Grist from './grist'\nimport GristAction from './grist-action'\nexport default [Grist, GristAction]\n"]}
@@ -0,0 +1,17 @@
1
+ import { ACTIONS } from '../grist-action';
2
+ declare const _default: {
3
+ type: string;
4
+ description: string;
5
+ group: string;
6
+ icon: any;
7
+ model: {
8
+ type: string;
9
+ left: number;
10
+ top: number;
11
+ width: number;
12
+ height: number;
13
+ strokeStyle: string;
14
+ action: ACTIONS;
15
+ };
16
+ };
17
+ export default _default;
@@ -0,0 +1,19 @@
1
+ import { ACTIONS } from '../grist-action';
2
+ import icon from './grist-action.png';
3
+ export default {
4
+ type: 'grist-action',
5
+ description: 'grist-action',
6
+ group: 'table',
7
+ /* line|shape|textAndMedia|chartAndGauge|table|container|dataSource|IoT|3D|warehouse|form|etc */
8
+ icon,
9
+ model: {
10
+ type: 'grist-action',
11
+ left: 10,
12
+ top: 10,
13
+ width: 100,
14
+ height: 100,
15
+ strokeStyle: 'darkgray',
16
+ action: ACTIONS.GET_SELECTED
17
+ }
18
+ };
19
+ //# sourceMappingURL=grist-action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grist-action.js","sourceRoot":"","sources":["../../src/templates/grist-action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,IAAI,MAAM,oBAAoB,CAAA;AAErC,eAAe;IACb,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,cAAc;IAC3B,KAAK,EAAE,OAAO;IACd,gGAAgG;IAChG,IAAI;IACJ,KAAK,EAAE;QACL,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,EAAE;QACR,GAAG,EAAE,EAAE;QACP,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,UAAU;QACvB,MAAM,EAAE,OAAO,CAAC,YAAY;KAC7B;CACF,CAAA","sourcesContent":["import { ACTIONS } from '../grist-action'\nimport icon from './grist-action.png'\n\nexport default {\n type: 'grist-action',\n description: 'grist-action',\n group: 'table',\n /* line|shape|textAndMedia|chartAndGauge|table|container|dataSource|IoT|3D|warehouse|form|etc */\n icon,\n model: {\n type: 'grist-action',\n left: 10,\n top: 10,\n width: 100,\n height: 100,\n strokeStyle: 'darkgray',\n action: ACTIONS.GET_SELECTED\n }\n}\n"]}
@@ -0,0 +1,16 @@
1
+ declare const _default: {
2
+ type: string;
3
+ description: string;
4
+ group: string;
5
+ icon: any;
6
+ model: {
7
+ type: string;
8
+ left: number;
9
+ top: number;
10
+ width: number;
11
+ height: number;
12
+ mode: string;
13
+ config: string;
14
+ };
15
+ };
16
+ export default _default;
@@ -0,0 +1,98 @@
1
+ import icon from './grist.png';
2
+ export default {
3
+ type: 'grist',
4
+ description: 'grist',
5
+ group: 'table',
6
+ /* line|shape|textAndMedia|chartAndGauge|table|container|dataSource|IoT|3D|warehouse|form|etc */
7
+ icon,
8
+ model: {
9
+ type: 'grist',
10
+ left: 10,
11
+ top: 10,
12
+ width: 400,
13
+ height: 300,
14
+ mode: 'GRID',
15
+ config: `{
16
+ columns: [
17
+ {
18
+ type: 'gutter',
19
+ gutterName: 'dirty'
20
+ },
21
+ {
22
+ type: 'gutter',
23
+ gutterName: 'sequence'
24
+ },
25
+ {
26
+ type: 'gutter',
27
+ gutterName: 'row-selector',
28
+ multiple: true
29
+ },
30
+ {
31
+ type: 'string',
32
+ name: 'id',
33
+ hidden: true
34
+ },
35
+ {
36
+ type: 'string',
37
+ name: 'name',
38
+ header: 'name',
39
+ record: {
40
+ editable: true
41
+ },
42
+ sortable: true,
43
+ width: 120
44
+ },
45
+ {
46
+ type: 'string',
47
+ name: 'description',
48
+ header: 'description',
49
+ record: {
50
+ align: 'left',
51
+ editable: true
52
+ },
53
+ width: 200
54
+ },
55
+ {
56
+ type: 'boolean',
57
+ name: 'active',
58
+ header: 'active',
59
+ record: {
60
+ editable: true
61
+ },
62
+ sortable: true,
63
+ width: 60
64
+ },
65
+ {
66
+ type: 'datetime',
67
+ name: 'updatedAt',
68
+ header: 'updated at',
69
+ width: 180
70
+ },
71
+ {
72
+ type: 'datetime',
73
+ name: 'createdAt',
74
+ header: 'created at',
75
+ width: 180
76
+ }
77
+ ],
78
+ rows: {
79
+ selectable: {
80
+ multiple: true
81
+ },
82
+ handlers: {
83
+ click: 'select-row-toggle'
84
+ }
85
+ },
86
+ sorters: [
87
+ {
88
+ name: 'name',
89
+ desc: true
90
+ }
91
+ ],
92
+ pagination: {
93
+ pages: [20, 30, 50, 100, 200]
94
+ }
95
+ }`
96
+ }
97
+ };
98
+ //# sourceMappingURL=grist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grist.js","sourceRoot":"","sources":["../../src/templates/grist.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,aAAa,CAAA;AAE9B,eAAe;IACb,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,OAAO;IACpB,KAAK,EAAE,OAAO;IACd,gGAAgG;IAChG,IAAI;IACJ,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,EAAE;QACR,GAAG,EAAE,EAAE;QACP,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgFV;KACC;CACF,CAAA","sourcesContent":["import icon from './grist.png'\n\nexport default {\n type: 'grist',\n description: 'grist',\n group: 'table',\n /* line|shape|textAndMedia|chartAndGauge|table|container|dataSource|IoT|3D|warehouse|form|etc */\n icon,\n model: {\n type: 'grist',\n left: 10,\n top: 10,\n width: 400,\n height: 300,\n mode: 'GRID',\n config: `{\n columns: [\n {\n type: 'gutter',\n gutterName: 'dirty'\n },\n {\n type: 'gutter',\n gutterName: 'sequence'\n },\n {\n type: 'gutter',\n gutterName: 'row-selector',\n multiple: true\n },\n {\n type: 'string',\n name: 'id',\n hidden: true\n },\n {\n type: 'string',\n name: 'name',\n header: 'name',\n record: {\n editable: true\n },\n sortable: true,\n width: 120\n },\n {\n type: 'string',\n name: 'description',\n header: 'description',\n record: {\n align: 'left',\n editable: true\n },\n width: 200\n },\n {\n type: 'boolean',\n name: 'active',\n header: 'active',\n record: {\n editable: true\n },\n sortable: true,\n width: 60\n },\n {\n type: 'datetime',\n name: 'updatedAt',\n header: 'updated at',\n width: 180\n },\n {\n type: 'datetime',\n name: 'createdAt',\n header: 'created at',\n width: 180\n }\n ],\n rows: {\n selectable: {\n multiple: true\n },\n handlers: {\n click: 'select-row-toggle'\n }\n },\n sorters: [\n {\n name: 'name',\n desc: true\n }\n ],\n pagination: {\n pages: [20, 30, 50, 100, 200]\n }\n}`\n }\n}\n"]}
@@ -0,0 +1,30 @@
1
+ declare const _default: ({
2
+ type: string;
3
+ description: string;
4
+ group: string;
5
+ icon: any;
6
+ model: {
7
+ type: string;
8
+ left: number;
9
+ top: number;
10
+ width: number;
11
+ height: number;
12
+ mode: string;
13
+ config: string;
14
+ };
15
+ } | {
16
+ type: string;
17
+ description: string;
18
+ group: string;
19
+ icon: any;
20
+ model: {
21
+ type: string;
22
+ left: number;
23
+ top: number;
24
+ width: number;
25
+ height: number;
26
+ strokeStyle: string;
27
+ action: import("../grist-action").ACTIONS;
28
+ };
29
+ })[];
30
+ export default _default;
@@ -0,0 +1,4 @@
1
+ import grist from "./grist";
2
+ import gristAction from "./grist-action";
3
+ export default [grist, gristAction];
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,SAAS,CAAC;AAC5B,OAAO,WAAW,MAAM,gBAAgB,CAAC;AACzC,eAAe,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC","sourcesContent":["import grist from \"./grist\";\nimport gristAction from \"./grist-action\";\nexport default [grist, gristAction];"]}
@@ -0,0 +1 @@
1
+ declare module '*.png'
@@ -0,0 +1,45 @@
1
+ # grist action
2
+
3
+ 특정 Grist 컴포넌트에 연결되어 사용자의 마우스클릭(또는 탭) 이벤트가 발생했을 때, grist의 데이타를 가져오거나,
4
+ grist에 동작을 지시하는 컴포넌트이다.
5
+
6
+ 그 밖의 일반적인 기능은 Rect(사각형) 컴포넌트와 동일하게 동작한다.
7
+
8
+ ## Properties
9
+
10
+ - target grist
11
+ - 연결하고자하는 grist의 아이디를 설정한다.
12
+ - action
13
+ - Get page information
14
+ - 페이지네이션 정보 가져오기
15
+ - graphql query resolver 에 직접 사용될 수 있는 입력 변수 형식으로 가공된 데이타로 제공됨
16
+ ```
17
+ {
18
+ page,
19
+ limit,
20
+ sorters
21
+ }
22
+ ```
23
+ - Get all rows
24
+ - 모든 레코드 데이터 가져오기
25
+ - Get selected rows
26
+ - 체크된 레코드 데이터 가져오기
27
+ ```
28
+ {
29
+ patches, /* 다중 레코드 업데이트용 graphql mutation resolver에 직접 사용될 수 있는 patch 데이타 형식으로 가공된 데이타 */
30
+ original /* 체크된 레코드 데이터 */
31
+ }
32
+ ```
33
+ - Get dirty rows
34
+ - 변경 사항이 있는 데이터 가져오기
35
+ - 다중 레코드 업데이트용 graphql mutation resolver에 직접 사용될 수 있는 patch 데이타 형식으로 가공된 데이타로 제공됨
36
+ - Add a row
37
+ - 행 추가
38
+ - Delete selected rows
39
+ - 선택 행 삭제
40
+ - Commit
41
+ - 변경 사항을 데이터에 적용
42
+ - run at startup
43
+ - 뷰어 시작 시 자동 실행 여부
44
+ - record adder format
45
+ - 행 추가 시의 포맷
@@ -0,0 +1,43 @@
1
+ # grist action
2
+
3
+ When a user's mouse click (or tap) event occurs when connected to a specific Grist component, the grist data is retrieved, or it is a component that directs the operation to grist.
4
+
5
+ 그 밖의 일반적인 기능은 Rect(사각형) 컴포넌트와 동일하게 동작한다.
6
+
7
+ ## Properties
8
+
9
+ - target grist
10
+ - Set the ID of grist to connect to.
11
+ - action
12
+ - Get page information
13
+ - Get pagination information
14
+ - Provided as processed data in the form of input variables that can be used directly in graphql query resolver
15
+ ```js
16
+ {
17
+ page,
18
+ limit,
19
+ sorters
20
+ }
21
+ ```
22
+ - Get all rows
23
+ - Get all record data
24
+ - Get selected rows
25
+ - Get checked record data
26
+ ```ts
27
+ {
28
+ patches, /* Processed data in patch data format that can be used directly in the graphql mutation resolver for multiple record updates. */
29
+ original /* Checked record data */
30
+ }
31
+ ```
32
+ - Get dirty rows
33
+ - Get data with changes
34
+ - Provided as processed data in patch data format that can be used directly in graphql mutation resolver for multi-record update
35
+ - Add a row
36
+ - Add a row
37
+ - Delete selected rows
38
+ - Commit
39
+ - Apply changes to the data
40
+ - run at startup
41
+ - Whether to run automatically when the viewer starts
42
+ - record adder format
43
+ - data format when adding rows
@@ -0,0 +1,44 @@
1
+ # grist action
2
+
3
+ 当通过连接到特定的Grist组件而发生用户的Click(或Tap)Event时,获取grist数据或提供操作指示给grist。
4
+
5
+ 其他功能与Rect(矩形)组件相同。
6
+
7
+ ## Properties
8
+
9
+ - target grist
10
+ - 设置要连接的grist的ID。
11
+ - action
12
+ - Get page information
13
+ - 获取分页信息
14
+ - 提供可以在graphql query resolver上直接使用的已加工的数据
15
+ ```js
16
+ {
17
+ page,
18
+ limit,
19
+ sorters
20
+ }
21
+ ```
22
+ - Get all rows
23
+ - 获取所有数据
24
+ - Get selected rows
25
+ - 获取已选择的数据
26
+ ```ts
27
+ {
28
+ patches, /* 提供多行更新用的graphql mutation resolver上直接使用的已加工的数据*/
29
+ original /* 获取已选择的数据 */
30
+ }
31
+ ```
32
+ - Get dirty rows
33
+ - 取得变更资料
34
+ - 提供多行更新用的graphql mutation resolver上直接使用的已加工的数据
35
+ - Add a row
36
+ - 添加行
37
+ - Delete selected rows
38
+ - 删除选择行
39
+ - Commit
40
+ - 将数据
41
+ - run at startup
42
+ - 是否在画面打开时执行
43
+ - record adder format
44
+ - 添加新行时的Format
@@ -0,0 +1,26 @@
1
+ # grist
2
+
3
+ 데이타그리드 또는 데이타리스트 형태로 멀티플 레코드 데이타를 표현하는 컴포넌트이다.
4
+ 데이타그리드는 웹어플리케이션 UI에 적합한 형태이며, 데이타리스트는 모바일 앱에 적합한 형태이다.
5
+ 이는 grist mode 속성으로 설정할 수 있다.
6
+
7
+ ## Properties
8
+
9
+ - grist mode
10
+ - Grid: 멀티컬럼을 테이블형태로 구성하는 데이타그리드 형태
11
+ - list: 멀티컬럼 정보를 아이템 블록 형태로 구성하는 데이타리스트 형태
12
+ - Depends on device : 현재 디스플레이에 따라 데이타그리드 또는 데이타리스트 형태로 자동 선택된다
13
+ - config
14
+ - grist 구성을 위한 컨피규레이션
15
+ - 컬럼정보, 헤더정보, 레코드 정보, 페이지네이션 정보로 구성된다.
16
+ - appendable
17
+ - 새로운 레코드를 추가할 수 있도록 UI기능을 제공할 것인지 설정
18
+ - paginatable
19
+ - footer영역에 페이지네이션 기능을 제공하는 footer 영역 UI 기능을 제공할 것인지 설정
20
+ - scale
21
+ - grist 내부 내용의 크기 비율을 설정
22
+ - 0.1부터 0.1단위로 설정할 수 있음
23
+ - 기본값은 1
24
+ - bound data
25
+ - focused row : 사용자가 마우스나 키보드로 선택 또는 이동한 현재 레코드가 데이타 속성으로 보내진다. 하나의 레코드만 포커스되므로 데이타는 단일 오브젝트 형태가 된다.
26
+ - selected rows : 사용자가 선택 체크박스를 통해서 선택한 레코드들이 데이타 속성으로 보내진다. 여러 레코드가 선택될 수 있으므로 데이타는 레코드의 배열 형태가 된다.