@operato/scene-legend 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. package/@types/global/index.d.ts +1 -0
  2. package/CHANGELOG.md +12 -0
  3. package/LICENSE +21 -0
  4. package/README.md +31 -0
  5. package/assets/legend.png +0 -0
  6. package/dist/editors/editor-legend-status.d.ts +4 -0
  7. package/dist/editors/editor-legend-status.js +313 -0
  8. package/dist/editors/editor-legend-status.js.map +1 -0
  9. package/dist/editors/index.d.ts +5 -0
  10. package/dist/editors/index.js +11 -0
  11. package/dist/editors/index.js.map +1 -0
  12. package/dist/editors/property-editor-legend-status.d.ts +7 -0
  13. package/dist/editors/property-editor-legend-status.js +13 -0
  14. package/dist/editors/property-editor-legend-status.js.map +1 -0
  15. package/dist/index.d.ts +2 -0
  16. package/dist/index.js +6 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/legend-item.d.ts +15 -0
  19. package/dist/legend-item.js +42 -0
  20. package/dist/legend-item.js.map +1 -0
  21. package/dist/legend.d.ts +40 -0
  22. package/dist/legend.js +177 -0
  23. package/dist/legend.js.map +1 -0
  24. package/dist/templates/index.d.ts +18 -0
  25. package/dist/templates/index.js +3 -0
  26. package/dist/templates/index.js.map +1 -0
  27. package/dist/templates/legend.d.ts +18 -0
  28. package/dist/templates/legend.js +19 -0
  29. package/dist/templates/legend.js.map +1 -0
  30. package/helps/scene/component/legend.ko.md +18 -0
  31. package/helps/scene/component/legend.md +18 -0
  32. package/helps/scene/component/legend.zh.md +20 -0
  33. package/helps/scene/images/legend-01.png +0 -0
  34. package/helps/scene/images/legend-02.png +0 -0
  35. package/package.json +63 -0
  36. package/src/editors/editor-legend-status.ts +339 -0
  37. package/src/editors/index.ts +11 -0
  38. package/src/editors/property-editor-legend-status.ts +17 -0
  39. package/src/index.ts +6 -0
  40. package/src/legend-item.ts +52 -0
  41. package/src/legend.ts +232 -0
  42. package/src/templates/index.ts +3 -0
  43. package/src/templates/legend.ts +19 -0
  44. package/test/basic-test.html +67 -0
  45. package/test/index.html +24 -0
  46. package/test/unit/test-legend.js +33 -0
  47. package/test/unit/util.js +22 -0
  48. package/things-scene.config.js +7 -0
  49. package/tsconfig.json +23 -0
  50. package/tsconfig.tsbuildinfo +1 -0
package/dist/legend.js ADDED
@@ -0,0 +1,177 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import { Component, Container, Model, TableLayout } from '@hatiolab/things-scene';
5
+ const NATURE = {
6
+ mutable: false,
7
+ resizable: true,
8
+ rotatable: true,
9
+ properties: [
10
+ {
11
+ type: 'number',
12
+ label: 'rows',
13
+ name: 'rows'
14
+ },
15
+ {
16
+ type: 'number',
17
+ label: 'columns',
18
+ name: 'columns'
19
+ },
20
+ {
21
+ type: 'select',
22
+ label: 'direction',
23
+ name: 'direction',
24
+ property: {
25
+ options: [
26
+ {
27
+ display: 'Horizontal',
28
+ value: 'horizontal'
29
+ },
30
+ {
31
+ display: 'Vertical',
32
+ value: 'vertical'
33
+ }
34
+ ]
35
+ }
36
+ },
37
+ {
38
+ type: 'number',
39
+ label: 'round',
40
+ name: 'round'
41
+ },
42
+ {
43
+ type: 'legend-status',
44
+ label: '',
45
+ name: 'status'
46
+ }
47
+ ],
48
+ help: 'scene/component/legend'
49
+ };
50
+ var controlHandler = {
51
+ ondragmove: function (point, index, component) {
52
+ var { left, top, width, height } = component.model;
53
+ /*
54
+ * point의 좌표는 부모 레이어 기준의 x, y 값이다.
55
+ * 따라서, 도형의 회전을 감안한 좌표로의 변환이 필요하다.
56
+ * Transcoord시에는 point좌표가 부모까지 transcoord되어있는 상태이므로,
57
+ * 컴포넌트자신에 대한 transcoord만 필요하다.(마지막 파라미터를 false로).
58
+ */
59
+ var transcoorded = component.transcoordP2S(point.x, point.y);
60
+ var round = ((transcoorded.x - left) / (width / 2)) * 100;
61
+ round = roundSet(round, width, height);
62
+ component.set({ round });
63
+ }
64
+ };
65
+ function roundSet(round, width, height) {
66
+ var max = width > height ? (height / width) * 100 : 100;
67
+ if (round >= max)
68
+ round = max;
69
+ else if (round <= 0)
70
+ round = 0;
71
+ return round;
72
+ }
73
+ export default class Legend extends Container {
74
+ ready() {
75
+ this.rebuildLegendItems();
76
+ }
77
+ get showMoveHandle() {
78
+ return false;
79
+ }
80
+ render(context) {
81
+ var { round = 0 } = this.model;
82
+ var { left, top, width, height } = this.bounds;
83
+ // 박스 그리기
84
+ context.beginPath();
85
+ round = roundSet(round, width, height);
86
+ if (round > 0) {
87
+ var radius = (round / 100) * (width / 2);
88
+ context.moveTo(left + radius, top);
89
+ context.lineTo(left + width - radius, top);
90
+ context.quadraticCurveTo(left + width, top, left + width, top + radius);
91
+ context.lineTo(left + width, top + height - radius);
92
+ context.quadraticCurveTo(left + width, top + height, left + width - radius, top + height);
93
+ context.lineTo(left + radius, top + height);
94
+ context.quadraticCurveTo(left, top + height, left, top + height - radius);
95
+ context.lineTo(left, top + radius);
96
+ context.quadraticCurveTo(left, top, left + radius, top);
97
+ this.model.padding = {
98
+ top: round / 2,
99
+ left: round / 2,
100
+ right: round / 2,
101
+ bottom: round / 2
102
+ };
103
+ }
104
+ else {
105
+ context.rect(left, top, width, height);
106
+ }
107
+ this.drawFill(context);
108
+ this.drawStroke(context);
109
+ }
110
+ get controls() {
111
+ var { left, top, width, round, height } = this.model;
112
+ round = round == undefined ? 0 : roundSet(round, width, height);
113
+ return [
114
+ {
115
+ x: left + (width / 2) * (round / 100),
116
+ y: top,
117
+ handler: controlHandler
118
+ }
119
+ ];
120
+ }
121
+ get layout() {
122
+ return TableLayout;
123
+ }
124
+ get nature() {
125
+ return NATURE;
126
+ }
127
+ rebuildLegendItems() {
128
+ if (this.components.length) {
129
+ this.components.slice().forEach(m => m.dispose());
130
+ }
131
+ var { left, top, width, height, fillStyle, strokeStyle, fontColor, fontFamily, fontSize, lineHeight, textAlign = 'left', round = 0, italic, bold, lineWidth = 0, rows, columns, status = {} } = this.model;
132
+ let statusRanges = status.ranges || [];
133
+ var count = statusRanges.length;
134
+ this.add(statusRanges.map(range => Model.compile({
135
+ type: 'legend-item',
136
+ text: range.description || `${range.min || ''} ~ ${range.max || ''}`,
137
+ width: 1,
138
+ height: 1,
139
+ color: range.color,
140
+ fontColor,
141
+ fontFamily,
142
+ fontSize,
143
+ lineHeight,
144
+ italic,
145
+ bold,
146
+ textAlign
147
+ })));
148
+ var rows, columns;
149
+ if (!columns && !rows) {
150
+ rows = count;
151
+ columns = 1;
152
+ }
153
+ else if (columns && !rows) {
154
+ rows = Math.ceil(count / Number(columns));
155
+ }
156
+ else if (rows && !columns) {
157
+ columns = Math.ceil(count / Number(rows));
158
+ }
159
+ this.set({
160
+ layoutConfig: {
161
+ rows,
162
+ columns
163
+ }
164
+ });
165
+ }
166
+ get hasTextProperty() {
167
+ return true;
168
+ }
169
+ get textHidden() {
170
+ return true;
171
+ }
172
+ onchange(after, before) {
173
+ this.rebuildLegendItems();
174
+ }
175
+ }
176
+ Component.register('legend', Legend);
177
+ //# sourceMappingURL=legend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legend.js","sourceRoot":"","sources":["../src/legend.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\nimport { Component, Container, Model, POSITION, Properties, TableLayout } from '@hatiolab/things-scene'\n\nconst NATURE = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n {\n type: 'number',\n label: 'rows',\n name: 'rows'\n },\n {\n type: 'number',\n label: 'columns',\n name: 'columns'\n },\n {\n type: 'select',\n label: 'direction',\n name: 'direction',\n property: {\n options: [\n {\n display: 'Horizontal',\n value: 'horizontal'\n },\n {\n display: 'Vertical',\n value: 'vertical'\n }\n ]\n }\n },\n {\n type: 'number',\n label: 'round',\n name: 'round'\n },\n {\n type: 'legend-status',\n label: '',\n name: 'status'\n }\n ],\n help: 'scene/component/legend'\n}\n\nvar controlHandler = {\n ondragmove: function (point: POSITION, index: number, component: Component) {\n var { left, top, width, height } = component.model\n /*\n * point의 좌표는 부모 레이어 기준의 x, y 값이다.\n * 따라서, 도형의 회전을 감안한 좌표로의 변환이 필요하다.\n * Transcoord시에는 point좌표가 부모까지 transcoord되어있는 상태이므로,\n * 컴포넌트자신에 대한 transcoord만 필요하다.(마지막 파라미터를 false로).\n */\n var transcoorded = component.transcoordP2S(point.x, point.y)\n var round = ((transcoorded.x - left) / (width / 2)) * 100\n\n round = roundSet(round, width, height)\n\n component.set({ round })\n }\n}\n\nfunction roundSet(round: number, width: number, height: number) {\n var max = width > height ? (height / width) * 100 : 100\n\n if (round >= max) round = max\n else if (round <= 0) round = 0\n\n return round\n}\n\nexport default class Legend extends Container {\n ready() {\n this.rebuildLegendItems()\n }\n\n get showMoveHandle() {\n return false\n }\n\n render(context: CanvasRenderingContext2D) {\n var { round = 0 } = this.model\n\n var { left, top, width, height } = this.bounds\n\n // 박스 그리기\n context.beginPath()\n\n round = roundSet(round, width, height)\n\n if (round > 0) {\n var radius = (round / 100) * (width / 2)\n\n context.moveTo(left + radius, top)\n context.lineTo(left + width - radius, top)\n context.quadraticCurveTo(left + width, top, left + width, top + radius)\n context.lineTo(left + width, top + height - radius)\n context.quadraticCurveTo(left + width, top + height, left + width - radius, top + height)\n context.lineTo(left + radius, top + height)\n context.quadraticCurveTo(left, top + height, left, top + height - radius)\n context.lineTo(left, top + radius)\n context.quadraticCurveTo(left, top, left + radius, top)\n\n this.model.padding = {\n top: round / 2,\n left: round / 2,\n right: round / 2,\n bottom: round / 2\n }\n } else {\n context.rect(left, top, width, height)\n }\n\n this.drawFill(context)\n this.drawStroke(context)\n }\n\n get controls() {\n var { left, top, width, round, height } = this.model\n round = round == undefined ? 0 : roundSet(round, width, height)\n\n return [\n {\n x: left + (width / 2) * (round / 100),\n y: top,\n handler: controlHandler\n }\n ]\n }\n\n get layout() {\n return TableLayout\n }\n\n get nature() {\n return NATURE\n }\n\n rebuildLegendItems() {\n if (this.components.length) {\n this.components.slice().forEach(m => m.dispose())\n }\n\n var {\n left,\n top,\n width,\n height,\n fillStyle,\n strokeStyle,\n fontColor,\n fontFamily,\n fontSize,\n lineHeight,\n textAlign = 'left',\n round = 0,\n italic,\n bold,\n lineWidth = 0,\n rows,\n columns,\n status = {}\n } = this.model\n\n let statusRanges: {\n min: string\n max: string\n description: string\n color: string\n }[] = status.ranges || []\n\n var count = statusRanges.length\n\n this.add(\n statusRanges.map(range =>\n Model.compile({\n type: 'legend-item',\n text: range.description || `${range.min || ''} ~ ${range.max || ''}`,\n width: 1,\n height: 1,\n color: range.color,\n fontColor,\n fontFamily,\n fontSize,\n lineHeight,\n italic,\n bold,\n textAlign\n })\n )\n )\n\n var rows, columns\n\n if (!columns && !rows) {\n rows = count\n columns = 1\n } else if (columns && !rows) {\n rows = Math.ceil(count / Number(columns))\n } else if (rows && !columns) {\n columns = Math.ceil(count / Number(rows))\n }\n\n this.set({\n layoutConfig: {\n rows,\n columns\n }\n })\n }\n\n get hasTextProperty() {\n return true\n }\n\n get textHidden() {\n return true\n }\n\n onchange(after: Properties, before: Properties) {\n this.rebuildLegendItems()\n }\n}\n\nComponent.register('legend', Legend)\n"]}
@@ -0,0 +1,18 @@
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
+ fillStyle: string;
13
+ direction: string;
14
+ strokeStyle: string;
15
+ lineWidth: number;
16
+ };
17
+ }[];
18
+ export default _default;
@@ -0,0 +1,3 @@
1
+ import legend from './legend';
2
+ export default [legend];
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,UAAU,CAAA;AAE7B,eAAe,CAAC,MAAM,CAAC,CAAA","sourcesContent":["import legend from './legend'\n\nexport default [legend]\n"]}
@@ -0,0 +1,18 @@
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
+ fillStyle: string;
13
+ direction: string;
14
+ strokeStyle: string;
15
+ lineWidth: number;
16
+ };
17
+ };
18
+ export default _default;
@@ -0,0 +1,19 @@
1
+ import icon from '../../assets/legend.png';
2
+ export default {
3
+ type: 'legend',
4
+ description: 'legend for visualizer',
5
+ group: 'warehouse' /* line|shape|textAndMedia|chartAndGauge|table|container|dataSource|IoT|3D|warehouse|form|etc */,
6
+ icon,
7
+ model: {
8
+ type: 'legend',
9
+ left: 100,
10
+ top: 100,
11
+ width: 200,
12
+ height: 150,
13
+ fillStyle: '#efefef',
14
+ direction: 'vertical',
15
+ strokeStyle: 'rgba(0, 0, 0, 0.3)',
16
+ lineWidth: 1
17
+ }
18
+ };
19
+ //# sourceMappingURL=legend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legend.js","sourceRoot":"","sources":["../../src/templates/legend.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,yBAAyB,CAAA;AAE1C,eAAe;IACb,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,uBAAuB;IACpC,KAAK,EAAE,WAAW,CAAC,gGAAgG;IACnH,IAAI;IACJ,KAAK,EAAE;QACL,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,GAAG;QACT,GAAG,EAAE,GAAG;QACR,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,UAAU;QACrB,WAAW,EAAE,oBAAoB;QACjC,SAAS,EAAE,CAAC;KACb;CACF,CAAA","sourcesContent":["import icon from '../../assets/legend.png'\n\nexport default {\n type: 'legend',\n description: 'legend for visualizer',\n group: 'warehouse' /* line|shape|textAndMedia|chartAndGauge|table|container|dataSource|IoT|3D|warehouse|form|etc */,\n icon,\n model: {\n type: 'legend',\n left: 100,\n top: 100,\n width: 200,\n height: 150,\n fillStyle: '#efefef',\n direction: 'vertical',\n strokeStyle: 'rgba(0, 0, 0, 0.3)',\n lineWidth: 1\n }\n}\n"]}
@@ -0,0 +1,18 @@
1
+ # legend[ko]
2
+ ![컴포넌트-Legend][legend-01]
3
+
4
+ 상태값에 대하여 설정하고, 설정된 상태에 근거하여 범주를 생성해주는 컴포넌트.
5
+
6
+ ## properties
7
+
8
+ 1. 행 : 범주를 몇 행으로 맞추어 표현할지 결정
9
+ 2. 열 : 범주를 몇 열으로 맞추어 표현할지 결정
10
+ 3. Direction : 범주가 표현될 방향
11
+ 4. 둥글게 : 모서리의 둥근 정도를 결정
12
+ 5. field : 데이터의 어떠한 필드값이 상태값을 결정하는 필드인지 지정
13
+ 6. 기본 색상 : 상태 범위에 해당되지 않을 경우 기본으로 나타낼 색상
14
+ 7. 상태설정 : 값의 상태 범위 및 색상을 지정 ![상태설정][legend-02]
15
+
16
+
17
+ [legend-01]: ../images/legend-01.png
18
+ [legend-02]: ../images/legend-02.png
@@ -0,0 +1,18 @@
1
+ # legend[en]
2
+ ![component-Legend][legend-01]
3
+
4
+ A component that sets the status value and creates a category based on the set status.
5
+
6
+ ## properties
7
+
8
+ 1. Row : Determine how many rows the category should be represented.
9
+ 2. Column : Determine how many columns the category should be represented.
10
+ 3. Direction : The direction in which the category will be represented.
11
+ 4. Round : Determine the roundness of the edges.
12
+ 5. field : Specify which field values ​​in the data are fields that determine the status value.
13
+ 6. Default color : The color to be displayed by default if it is not in the status range.
14
+ 7. Status setting : Specify the status range and color of the values. ![Status setting][legend-02]
15
+
16
+
17
+ [legend-01]: ../images/legend-01.png
18
+ [legend-02]: ../images/legend-02.png
@@ -0,0 +1,20 @@
1
+ # legend[zh]
2
+ ![组件-Legend][legend-01]
3
+
4
+ 设置状态值并根据所设置的状态创建类别的组件。
5
+
6
+
7
+ ## properties
8
+
9
+ 1. 行:决定用几个行来显示该类别。
10
+ 2. 列:决定用几个列来显示该类别。
11
+ 3. 方向:将会显示类别的方向。
12
+ 4. 圆化:确定边缘的圆度。
13
+ 5. 字段:指定数据的哪些字段值是决定状态值的字段。
14
+ 6. 默认颜色:如果不在状态范围内,就会默认显示的颜色。
15
+ 7. 状态设置:指定值的状态范围和颜色。 ![状态设置][legend-02]
16
+
17
+
18
+ [legend-01]: ../images/legend-01.png
19
+
20
+ [legend-02]: ../images/legend-02.png
Binary file
Binary file
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@operato/scene-legend",
3
+ "description": "Legend component for things-scene.",
4
+ "license": "MIT",
5
+ "author": "heartyoh",
6
+ "version": "0.0.11",
7
+ "main": "dist/index.js",
8
+ "module": "dist/index.js",
9
+ "things-scene": true,
10
+ "publishConfig": {
11
+ "access": "public",
12
+ "@oprato:registry": "https://registry.npmjs.org"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/things-scene/operato-scene.git",
17
+ "directory": "packages/legend"
18
+ },
19
+ "scripts": {
20
+ "serve": "tsc && things-factory-dev",
21
+ "start": "tsc && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wds\"",
22
+ "build": "tsc",
23
+ "prepublish": "tsc",
24
+ "lint": "eslint --ext .ts,.html . --ignore-path .gitignore && prettier \"**/*.ts\" --check --ignore-path .gitignore",
25
+ "format": "eslint --ext .ts,.html . --fix --ignore-path .gitignore && prettier \"**/*.ts\" --write --ignore-path .gitignore",
26
+ "migration": "things-factory-migration"
27
+ },
28
+ "dependencies": {
29
+ "@hatiolab/things-scene": "^2.7.23",
30
+ "lit": "^2.0.2"
31
+ },
32
+ "devDependencies": {
33
+ "@hatiolab/prettier-config": "^1.0.0",
34
+ "@hatiolab/things-scene": "^2.7.23",
35
+ "@operato/board": "^0.2.35",
36
+ "@things-factory/builder": "^4.0.10",
37
+ "@things-factory/operato-board": "^4.0.10",
38
+ "@typescript-eslint/eslint-plugin": "^4.33.0",
39
+ "@typescript-eslint/parser": "^4.33.0",
40
+ "@web/dev-server": "^0.1.28",
41
+ "concurrently": "^5.3.0",
42
+ "eslint": "^7.32.0",
43
+ "eslint-config-prettier": "^8.3.0",
44
+ "husky": "^4.3.8",
45
+ "lint-staged": "^10.5.4",
46
+ "prettier": "^2.4.1",
47
+ "tslib": "^2.3.1",
48
+ "typescript": "^4.5.2"
49
+ },
50
+ "prettier": "@hatiolab/prettier-config",
51
+ "husky": {
52
+ "hooks": {
53
+ "pre-commit": "lint-staged"
54
+ }
55
+ },
56
+ "lint-staged": {
57
+ "*.ts": [
58
+ "eslint --fix",
59
+ "prettier --write"
60
+ ]
61
+ },
62
+ "gitHead": "1421380ee3530169c280b01a21c81af8d1b9f9c4"
63
+ }