@operato/scene-legend 0.0.11

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 (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
@@ -0,0 +1 @@
1
+ declare module '*.png'
package/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
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.11](https://github.com/things-scene/operato-scene/compare/v0.0.10...v0.0.11) (2021-12-06)
7
+
8
+
9
+ ### :rocket: New Features
10
+
11
+ * add wheel-sorter, legend, timer and compass ([dc90f73](https://github.com/things-scene/operato-scene/commit/dc90f73054424c0867a1c4a28d51da6e7fab8b85))
12
+ * add wheel-sorter, legend, timer and compass ([518950c](https://github.com/things-scene/operato-scene/commit/518950cb5476048504a415a1dd0a1fd2d4359a77))
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
@@ -0,0 +1,31 @@
1
+ 범례 제공자의 범례 정보를 표현해주는 컴포넌트
2
+
3
+ 범례 제공자
4
+
5
+ - 범례 리스트
6
+ - 범례 : 컬러 또는 이미지, 레이블
7
+
8
+ properties :
9
+
10
+ - legend <= stockStatus
11
+
12
+ 범례 컴포넌트 특성
13
+
14
+ - 행 또는 열
15
+ - 행열수
16
+
17
+ 범례 컴포넌트는 범례 제공자의 범례 정보 변화이벤트에 리스너를 등록한다.
18
+
19
+ ## build
20
+
21
+ `$ yarn build`
22
+
23
+ | type | filename | for | tested |
24
+ | ---- | ------------------------- | -------------- | ------ |
25
+ | UMD | things-scene-legend.js | modern browser | O |
26
+ | UMD | things-scene-legend-ie.js | ie 11 | O |
27
+ | ESM | things-scene-legend.mjs | modern browser | O |
28
+
29
+ ## publish
30
+
31
+ `$ yarn publish`
Binary file
@@ -0,0 +1,4 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ export {};
@@ -0,0 +1,313 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import { __decorate } from "tslib";
5
+ import { LitElement, css, html } from 'lit';
6
+ import { customElement, property, state } from 'lit/decorators.js';
7
+ let EditorLegendStatus = class EditorLegendStatus extends LitElement {
8
+ constructor() {
9
+ super(...arguments);
10
+ this._ranges = [];
11
+ this._changingNow = false;
12
+ }
13
+ render() {
14
+ return html `
15
+ <legend>
16
+ <i18n-msg msgid="label.status">Status</i18n-msg>
17
+ </legend>
18
+
19
+ <label class="stock-field">
20
+ <i18n-msg msgid="label.field">Field</i18n-msg>
21
+ </label>
22
+ <input
23
+ type="text"
24
+ .value=${this._statusField || ''}
25
+ @change=${(e) => {
26
+ this._statusField = e.target.value;
27
+ }}
28
+ />
29
+ <label class="default-color">
30
+ <i18n-msg msgid="label.default-color">Default Color</i18n-msg>
31
+ </label>
32
+ <things-editor-color
33
+ name="default-color"
34
+ .value=${this._defaultColor || ''}
35
+ placeholder="default color"
36
+ @change=${(e) => {
37
+ this._defaultColor = e.target.value;
38
+ }}
39
+ ></things-editor-color>
40
+
41
+ <table>
42
+ <tr>
43
+ <th>
44
+ Min &le; <br />Field<br />
45
+ &lt; Max
46
+ </th>
47
+ <th>color</th>
48
+ <th>disp. text</th>
49
+ <th></th>
50
+ </tr>
51
+ ${this._ranges.map(item => html `
52
+ <tr data-record>
53
+ <td>
54
+ <input type="text" data-min placeholder="min" .value="${item.min}" />
55
+ <span>~</span>
56
+ <input type="text" data-max placeholder="max" .value="${item.max}" />
57
+ </td>
58
+ <td>
59
+ <things-editor-color data-color .value="${item.color}" placeholder="color"></things-editor-color>
60
+ </td>
61
+ <td>
62
+ <input type="text" data-description .value="${item.description || ''}" placeholder="display text" />
63
+ </td>
64
+ <td>
65
+ <button class="record-action" @tap=${(e) => this._delete(e)} tabindex="-1">-</button>
66
+ </td>
67
+ </tr>
68
+ `)}
69
+
70
+ <tr data-record-new class="stock-new">
71
+ <td>
72
+ <input type="text" data-min placeholder="min" value="" />
73
+ <span>~</span>
74
+ <input type="text" data-max placeholder="max" value="" />
75
+ </td>
76
+ <td>
77
+ <things-editor-color data-color value="" placeholder="color"></things-editor-color>
78
+ </td>
79
+ <td>
80
+ <input type="text" data-description value="" placeholder="display text" />
81
+ </td>
82
+ <td>
83
+ <button class="record-action" @tap=${() => this._add()} tabindex="-1">+</button>
84
+ </td>
85
+ </tr>
86
+ </table>
87
+ `;
88
+ }
89
+ connectedCallback() {
90
+ super.connectedCallback();
91
+ if (!this.boundOnChange)
92
+ this.boundOnChange = this._onChange.bind(this);
93
+ this.renderRoot.addEventListener('change', this.boundOnChange);
94
+ }
95
+ disconnectedCallback() {
96
+ super.disconnectedCallback();
97
+ this.renderRoot.removeEventListener('change', this.boundOnChange);
98
+ }
99
+ _valueChanged(value) {
100
+ var val = value || this._getDefaultValue();
101
+ this._statusField = val.field;
102
+ this._defaultColor = val.defaultColor;
103
+ this._ranges = [...val.ranges];
104
+ this.requestUpdate();
105
+ }
106
+ _onChange(e) {
107
+ e.stopPropagation();
108
+ this._changingNow = true;
109
+ var input = e.target;
110
+ var value = input.value;
111
+ var tr = input.closest('tr');
112
+ if (tr) {
113
+ if (tr.hasAttribute('data-record'))
114
+ this._build(true);
115
+ else if (tr.hasAttribute('data-record-new') && input.hasAttribute('data-color'))
116
+ this._add();
117
+ }
118
+ this.value = {
119
+ field: this._statusField,
120
+ defaultColor: this._defaultColor,
121
+ ranges: this._ranges
122
+ };
123
+ this.dispatchEvent(new CustomEvent('change', {
124
+ bubbles: true,
125
+ composed: true
126
+ }));
127
+ this.requestUpdate();
128
+ }
129
+ _build(includeNewRecord) {
130
+ if (includeNewRecord)
131
+ var records = this.renderRoot.querySelectorAll('[data-record],[data-record-new]');
132
+ else
133
+ var records = this.renderRoot.querySelectorAll('[data-record]');
134
+ var newRanges = [];
135
+ for (var i = 0; i < records.length; i++) {
136
+ var record = records[i];
137
+ var min = record.querySelector('[data-min]').value;
138
+ var max = record.querySelector('[data-max]').value;
139
+ var description = record.querySelector('[data-description]').value;
140
+ var inputs = record.querySelectorAll('[data-color]:not([style*="display: none"])');
141
+ if (!inputs || inputs.length == 0)
142
+ continue;
143
+ var input = inputs[inputs.length - 1];
144
+ var color = input.value;
145
+ if (min != undefined && max != undefined && color)
146
+ newRanges.push({
147
+ min: min.trim(),
148
+ max: max.trim(),
149
+ color: color.trim(),
150
+ description: description.trim()
151
+ });
152
+ }
153
+ newRanges.sort(function (range1, range2) {
154
+ var min1 = Number(range1.min);
155
+ var min2 = Number(range2.min);
156
+ var result = min1 - min2;
157
+ if (Number.isNaN(result)) {
158
+ var strMin1 = String(min1);
159
+ var strMin2 = String(min2);
160
+ if (strMin1 > strMin2)
161
+ result = 1;
162
+ else if (strMin1 == strMin2)
163
+ result = 0;
164
+ else
165
+ result = -1;
166
+ }
167
+ return result;
168
+ });
169
+ this._ranges = newRanges;
170
+ this.requestUpdate();
171
+ }
172
+ _add() {
173
+ this._build(true);
174
+ var inputs = this.renderRoot.querySelectorAll('[data-record-new] input:not([style*="display: none"]), [data-record-new] [data-color]:not([style*="display: none"])');
175
+ for (var i = 0; i < inputs.length; i++) {
176
+ let input = inputs[i];
177
+ input.value = '';
178
+ }
179
+ }
180
+ _delete(e) {
181
+ var record = e.target.closest('tr[data-record]');
182
+ record.querySelector('[data-min]').value = '';
183
+ record.querySelector('[data-max]').value = '';
184
+ record.querySelector('[data-color]').value = '';
185
+ this._build(false);
186
+ this.value = {
187
+ field: this._statusField,
188
+ defaultColor: this._defaultColor,
189
+ ranges: this._ranges
190
+ };
191
+ this.dispatchEvent(new CustomEvent('change', {
192
+ bubbles: true,
193
+ composed: true
194
+ }));
195
+ }
196
+ _getDefaultValue() {
197
+ return {
198
+ field: '',
199
+ defaultColor: '',
200
+ ranges: []
201
+ };
202
+ }
203
+ _onRepeaterChanged() {
204
+ var inputs = this.renderRoot.querySelectorAll('[data-record] input:not([style*="display: none"])[value=""], [data-record-new] input:not([style*="display: none"])[value=""]');
205
+ inputs[0].focus();
206
+ }
207
+ updated(changes) {
208
+ if (changes.has('value'))
209
+ this._valueChanged(this.value);
210
+ }
211
+ };
212
+ EditorLegendStatus.styles = [
213
+ css `
214
+ :host {
215
+ font-size: 0.8em;
216
+ display: grid;
217
+ grid-template-columns: repeat(10, 1fr);
218
+ grid-gap: 5px;
219
+ }
220
+
221
+ :host > * {
222
+ order: 2;
223
+ grid-column: 4 / -1;
224
+ }
225
+
226
+ :host > legend {
227
+ order: 1;
228
+ grid-column: 1 / -1;
229
+ font-size: 11px;
230
+ color: rgb(228, 108, 46);
231
+ font-weight: bold;
232
+ text-transform: capitalize;
233
+ padding: 5px 0px 0px 5px;
234
+ }
235
+
236
+ :host > label {
237
+ grid-column: 1 / 4;
238
+ text-align: right;
239
+ color: var(--primary-text-color);
240
+ }
241
+
242
+ div[data-record] input {
243
+ width: 20%;
244
+ }
245
+ :host > table {
246
+ grid-column: 1 / -1;
247
+ }
248
+ table input {
249
+ width: 25px;
250
+ margin: 3px 0 2px 0;
251
+ padding: 3px;
252
+ font-size: 12px;
253
+ }
254
+ table td span {
255
+ padding: 5px 0 0 0;
256
+ }
257
+ table td things-editor-color {
258
+ width: 81px;
259
+ height: 25px;
260
+ }
261
+ table td button {
262
+ margin-left: 0;
263
+ }
264
+ table th {
265
+ background-color: rgba(0, 0, 0, 0.1);
266
+ padding: 2px 0;
267
+ text-align: center;
268
+ }
269
+
270
+ table tr > th:first-child {
271
+ width: 40px;
272
+ }
273
+
274
+ table tr > th:nth-child(2) {
275
+ width: 85px;
276
+ }
277
+
278
+ table tr > th:nth-child(4) {
279
+ width: 30px;
280
+ }
281
+
282
+ table *.things-editor-legend-status {
283
+ float: none !important;
284
+ }
285
+ table td {
286
+ text-align: center;
287
+ border-bottom: 1px solid rgba(0, 0, 0, 0.1);
288
+ }
289
+ table tr.stock-new {
290
+ background-color: rgba(179, 145, 117, 0.3);
291
+ }
292
+ table td input[data-description] {
293
+ width: 100%;
294
+ box-sizing: border-box;
295
+ }
296
+ `
297
+ ];
298
+ __decorate([
299
+ property({ type: Object })
300
+ ], EditorLegendStatus.prototype, "value", void 0);
301
+ __decorate([
302
+ state()
303
+ ], EditorLegendStatus.prototype, "_statusField", void 0);
304
+ __decorate([
305
+ state()
306
+ ], EditorLegendStatus.prototype, "_defaultColor", void 0);
307
+ __decorate([
308
+ state()
309
+ ], EditorLegendStatus.prototype, "_ranges", void 0);
310
+ EditorLegendStatus = __decorate([
311
+ customElement('editor-legend-status')
312
+ ], EditorLegendStatus);
313
+ //# sourceMappingURL=editor-legend-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-legend-status.js","sourceRoot":"","sources":["../../src/editors/editor-legend-status.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport { LitElement, PropertyValues, css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\n@customElement('editor-legend-status')\nclass EditorLegendStatus extends LitElement {\n static styles = [\n css`\n :host {\n font-size: 0.8em;\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n grid-gap: 5px;\n }\n\n :host > * {\n order: 2;\n grid-column: 4 / -1;\n }\n\n :host > legend {\n order: 1;\n grid-column: 1 / -1;\n font-size: 11px;\n color: rgb(228, 108, 46);\n font-weight: bold;\n text-transform: capitalize;\n padding: 5px 0px 0px 5px;\n }\n\n :host > label {\n grid-column: 1 / 4;\n text-align: right;\n color: var(--primary-text-color);\n }\n\n div[data-record] input {\n width: 20%;\n }\n :host > table {\n grid-column: 1 / -1;\n }\n table input {\n width: 25px;\n margin: 3px 0 2px 0;\n padding: 3px;\n font-size: 12px;\n }\n table td span {\n padding: 5px 0 0 0;\n }\n table td things-editor-color {\n width: 81px;\n height: 25px;\n }\n table td button {\n margin-left: 0;\n }\n table th {\n background-color: rgba(0, 0, 0, 0.1);\n padding: 2px 0;\n text-align: center;\n }\n\n table tr > th:first-child {\n width: 40px;\n }\n\n table tr > th:nth-child(2) {\n width: 85px;\n }\n\n table tr > th:nth-child(4) {\n width: 30px;\n }\n\n table *.things-editor-legend-status {\n float: none !important;\n }\n table td {\n text-align: center;\n border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n }\n table tr.stock-new {\n background-color: rgba(179, 145, 117, 0.3);\n }\n table td input[data-description] {\n width: 100%;\n box-sizing: border-box;\n }\n `\n ]\n\n @property({ type: Object }) value: any\n\n @state() private _statusField?: string\n @state() private _defaultColor?: string\n @state() private _ranges: any[] = []\n\n private boundOnChange?: any\n private _changingNow: boolean = false\n\n render() {\n return html`\n <legend>\n <i18n-msg msgid=\"label.status\">Status</i18n-msg>\n </legend>\n\n <label class=\"stock-field\">\n <i18n-msg msgid=\"label.field\">Field</i18n-msg>\n </label>\n <input\n type=\"text\"\n .value=${this._statusField || ''}\n @change=${(e: Event) => {\n this._statusField = (e.target as HTMLInputElement).value\n }}\n />\n <label class=\"default-color\">\n <i18n-msg msgid=\"label.default-color\">Default Color</i18n-msg>\n </label>\n <things-editor-color\n name=\"default-color\"\n .value=${this._defaultColor || ''}\n placeholder=\"default color\"\n @change=${(e: Event) => {\n this._defaultColor = (e.target as HTMLInputElement).value\n }}\n ></things-editor-color>\n\n <table>\n <tr>\n <th>\n Min &le; <br />Field<br />\n &lt; Max\n </th>\n <th>color</th>\n <th>disp. text</th>\n <th></th>\n </tr>\n ${this._ranges.map(\n item => html`\n <tr data-record>\n <td>\n <input type=\"text\" data-min placeholder=\"min\" .value=\"${item.min}\" />\n <span>~</span>\n <input type=\"text\" data-max placeholder=\"max\" .value=\"${item.max}\" />\n </td>\n <td>\n <things-editor-color data-color .value=\"${item.color}\" placeholder=\"color\"></things-editor-color>\n </td>\n <td>\n <input type=\"text\" data-description .value=\"${item.description || ''}\" placeholder=\"display text\" />\n </td>\n <td>\n <button class=\"record-action\" @tap=${(e: TouchEvent) => this._delete(e)} tabindex=\"-1\">-</button>\n </td>\n </tr>\n `\n )}\n\n <tr data-record-new class=\"stock-new\">\n <td>\n <input type=\"text\" data-min placeholder=\"min\" value=\"\" />\n <span>~</span>\n <input type=\"text\" data-max placeholder=\"max\" value=\"\" />\n </td>\n <td>\n <things-editor-color data-color value=\"\" placeholder=\"color\"></things-editor-color>\n </td>\n <td>\n <input type=\"text\" data-description value=\"\" placeholder=\"display text\" />\n </td>\n <td>\n <button class=\"record-action\" @tap=${() => this._add()} tabindex=\"-1\">+</button>\n </td>\n </tr>\n </table>\n `\n }\n\n connectedCallback() {\n super.connectedCallback()\n if (!this.boundOnChange) this.boundOnChange = this._onChange.bind(this)\n\n this.renderRoot.addEventListener('change', this.boundOnChange)\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n this.renderRoot.removeEventListener('change', this.boundOnChange)\n }\n\n _valueChanged(value: any) {\n var val = value || this._getDefaultValue()\n this._statusField = val.field\n this._defaultColor = val.defaultColor\n this._ranges = [...val.ranges]\n\n this.requestUpdate()\n }\n\n _onChange(e: Event) {\n e.stopPropagation()\n this._changingNow = true\n\n var input = e.target as HTMLInputElement\n var value = input.value\n\n var tr = input.closest('tr')\n\n if (tr) {\n if (tr.hasAttribute('data-record')) this._build(true)\n else if (tr.hasAttribute('data-record-new') && input.hasAttribute('data-color')) this._add()\n }\n\n this.value = {\n field: this._statusField,\n defaultColor: this._defaultColor,\n ranges: this._ranges\n }\n\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true\n })\n )\n this.requestUpdate()\n }\n\n _build(includeNewRecord: boolean) {\n if (includeNewRecord) var records = this.renderRoot.querySelectorAll('[data-record],[data-record-new]')\n else var records = this.renderRoot.querySelectorAll('[data-record]')\n\n var newRanges = []\n\n for (var i = 0; i < records.length; i++) {\n var record = records[i]\n\n var min = (record.querySelector('[data-min]') as HTMLInputElement).value\n var max = (record.querySelector('[data-max]') as HTMLInputElement).value\n var description = (record.querySelector('[data-description]') as HTMLInputElement).value\n var inputs = record.querySelectorAll('[data-color]:not([style*=\"display: none\"])') as NodeListOf<HTMLInputElement>\n if (!inputs || inputs.length == 0) continue\n\n var input = inputs[inputs.length - 1]\n var color = input.value\n\n if (min != undefined && max != undefined && color)\n newRanges.push({\n min: min.trim(),\n max: max.trim(),\n color: color.trim(),\n description: description.trim()\n })\n }\n\n newRanges.sort(function (range1, range2) {\n var min1 = Number(range1.min)\n var min2 = Number(range2.min)\n\n var result = min1 - min2\n\n if (Number.isNaN(result)) {\n var strMin1 = String(min1)\n var strMin2 = String(min2)\n\n if (strMin1 > strMin2) result = 1\n else if (strMin1 == strMin2) result = 0\n else result = -1\n }\n\n return result\n })\n\n this._ranges = newRanges\n this.requestUpdate()\n }\n\n _add() {\n this._build(true)\n\n var inputs = this.renderRoot.querySelectorAll(\n '[data-record-new] input:not([style*=\"display: none\"]), [data-record-new] [data-color]:not([style*=\"display: none\"])'\n ) as NodeListOf<HTMLInputElement>\n\n for (var i = 0; i < inputs.length; i++) {\n let input = inputs[i]\n input.value = ''\n }\n }\n\n _delete(e: Event) {\n var record = (e.target as Element).closest('tr[data-record]')\n\n ;(record!.querySelector('[data-min]') as HTMLInputElement).value = ''\n ;(record!.querySelector('[data-max]') as HTMLInputElement).value = ''\n ;(record!.querySelector('[data-color]') as HTMLInputElement).value = ''\n\n this._build(false)\n\n this.value = {\n field: this._statusField,\n defaultColor: this._defaultColor,\n ranges: this._ranges\n }\n\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true\n })\n )\n }\n\n _getDefaultValue() {\n return {\n field: '',\n defaultColor: '',\n ranges: []\n }\n }\n\n _onRepeaterChanged() {\n var inputs = this.renderRoot.querySelectorAll(\n '[data-record] input:not([style*=\"display: none\"])[value=\"\"], [data-record-new] input:not([style*=\"display: none\"])[value=\"\"]'\n ) as NodeListOf<HTMLInputElement>\n\n inputs[0].focus()\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('value')) this._valueChanged(this.value)\n }\n}\n"]}
@@ -0,0 +1,5 @@
1
+ declare const _default: {
2
+ type: string;
3
+ element: string;
4
+ }[];
5
+ export default _default;
@@ -0,0 +1,11 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import { PropertyEditorLegendStatus } from './property-editor-legend-status';
5
+ export default [
6
+ {
7
+ type: 'legend-status',
8
+ element: PropertyEditorLegendStatus.is
9
+ }
10
+ ];
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/editors/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAA;AAE5E,eAAe;IACb;QACE,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,0BAA0B,CAAC,EAAE;KACvC;CACF,CAAA","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\nimport { PropertyEditorLegendStatus } from './property-editor-legend-status'\n\nexport default [\n {\n type: 'legend-status',\n element: PropertyEditorLegendStatus.is\n }\n]\n"]}
@@ -0,0 +1,7 @@
1
+ import './editor-legend-status';
2
+ import { OxPropertyEditor } from '@operato/property-editor';
3
+ import { Properties } from '@hatiolab/things-scene';
4
+ export declare class PropertyEditorLegendStatus extends OxPropertyEditor {
5
+ static get is(): string;
6
+ editorTemplate(props: Properties): import("lit-html").TemplateResult<1>;
7
+ }
@@ -0,0 +1,13 @@
1
+ import './editor-legend-status';
2
+ import { OxPropertyEditor } from '@operato/property-editor';
3
+ import { html } from 'lit-element';
4
+ export class PropertyEditorLegendStatus extends OxPropertyEditor {
5
+ static get is() {
6
+ return 'property-editor-legend-status';
7
+ }
8
+ editorTemplate(props) {
9
+ return html ` <editor-legend-status .value=${props.value} fullwidth></editor-legend-status> `;
10
+ }
11
+ }
12
+ customElements.define(PropertyEditorLegendStatus.is, PropertyEditorLegendStatus);
13
+ //# sourceMappingURL=property-editor-legend-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-editor-legend-status.js","sourceRoot":"","sources":["../../src/editors/property-editor-legend-status.ts"],"names":[],"mappings":"AAAA,OAAO,wBAAwB,CAAA;AAE/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAE3D,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,MAAM,OAAO,0BAA2B,SAAQ,gBAAgB;IAC9D,MAAM,KAAK,EAAE;QACX,OAAO,+BAA+B,CAAA;IACxC,CAAC;IAED,cAAc,CAAC,KAAiB;QAC9B,OAAO,IAAI,CAAA,iCAAiC,KAAK,CAAC,KAAK,qCAAqC,CAAA;IAC9F,CAAC;CACF;AAED,cAAc,CAAC,MAAM,CAAC,0BAA0B,CAAC,EAAE,EAAE,0BAA0B,CAAC,CAAA","sourcesContent":["import './editor-legend-status'\n\nimport { OxPropertyEditor } from '@operato/property-editor'\nimport { Properties } from '@hatiolab/things-scene'\nimport { html } from 'lit-element'\n\nexport class PropertyEditorLegendStatus extends OxPropertyEditor {\n static get is() {\n return 'property-editor-legend-status'\n }\n\n editorTemplate(props: Properties) {\n return html` <editor-legend-status .value=${props.value} fullwidth></editor-legend-status> `\n }\n}\n\ncustomElements.define(PropertyEditorLegendStatus.is, PropertyEditorLegendStatus)\n"]}
@@ -0,0 +1,2 @@
1
+ export { default as Legend } from './legend';
2
+ export { default as LegendItem } from './legend-item';
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ export { default as Legend } from './legend';
5
+ export { default as LegendItem } from './legend-item';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,eAAe,CAAA","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nexport { default as Legend } from './legend'\nexport { default as LegendItem } from './legend-item'\n"]}
@@ -0,0 +1,15 @@
1
+ import { Properties, Shape } from '@hatiolab/things-scene';
2
+ declare const LegendItem_base: typeof Shape;
3
+ export default class LegendItem extends LegendItem_base {
4
+ render(context: CanvasRenderingContext2D): void;
5
+ onchange(after: Properties): void;
6
+ get stuck(): boolean;
7
+ get capturable(): boolean;
8
+ get nature(): {
9
+ mutable: boolean;
10
+ resizable: boolean;
11
+ rotatable: boolean;
12
+ properties: never[];
13
+ };
14
+ }
15
+ export {};
@@ -0,0 +1,42 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import { Component, RectPath, Shape } from '@hatiolab/things-scene';
5
+ const NATURE = {
6
+ mutable: false,
7
+ resizable: false,
8
+ rotatable: false,
9
+ properties: []
10
+ };
11
+ export default class LegendItem extends RectPath(Shape) {
12
+ render(context) {
13
+ var { left, top, height, color } = this.model;
14
+ context.beginPath();
15
+ var c = height / 2;
16
+ var r = c / 2;
17
+ context.save();
18
+ context.fillStyle = color;
19
+ context.ellipse(left + c, top + c, r, r, 0, 0, Math.PI * 2, true);
20
+ context.shadowColor = 'rgba(0,0,0,0.15)';
21
+ context.shadowBlur = 2;
22
+ context.shadowOffsetX = 1;
23
+ context.shadowOffsetY = 2;
24
+ context.fill();
25
+ context.restore();
26
+ }
27
+ onchange(after) {
28
+ if (after.hasOwnProperty('height'))
29
+ this.set('paddingLeft', after.height);
30
+ }
31
+ get stuck() {
32
+ return true;
33
+ }
34
+ get capturable() {
35
+ return false;
36
+ }
37
+ get nature() {
38
+ return NATURE;
39
+ }
40
+ }
41
+ Component.register('legend-item', LegendItem);
42
+ //# sourceMappingURL=legend-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legend-item.js","sourceRoot":"","sources":["../src/legend-item.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAqB,QAAQ,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAEtF,MAAM,MAAM,GAAG;IACb,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,KAAK;IAChB,SAAS,EAAE,KAAK;IAChB,UAAU,EAAE,EAAE;CACf,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,QAAQ,CAAC,KAAK,CAAC;IACrD,MAAM,CAAC,OAAiC;QACtC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAA;QAE7C,OAAO,CAAC,SAAS,EAAE,CAAA;QAEnB,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,CAAA;QAClB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAEb,OAAO,CAAC,IAAI,EAAE,CAAA;QAEd,OAAO,CAAC,SAAS,GAAG,KAAK,CAAA;QACzB,OAAO,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;QACjE,OAAO,CAAC,WAAW,GAAG,kBAAkB,CAAA;QACxC,OAAO,CAAC,UAAU,GAAG,CAAC,CAAA;QACtB,OAAO,CAAC,aAAa,GAAG,CAAC,CAAA;QACzB,OAAO,CAAC,aAAa,GAAG,CAAC,CAAA;QACzB,OAAO,CAAC,IAAI,EAAE,CAAA;QAEd,OAAO,CAAC,OAAO,EAAE,CAAA;IACnB,CAAC;IAED,QAAQ,CAAC,KAAiB;QACxB,IAAI,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IAC3E,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,MAAM;QACR,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AAED,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,UAAU,CAAC,CAAA","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\nimport { Component, Model, Properties, RectPath, Shape } from '@hatiolab/things-scene'\n\nconst NATURE = {\n mutable: false,\n resizable: false,\n rotatable: false,\n properties: []\n}\n\nexport default class LegendItem extends RectPath(Shape) {\n render(context: CanvasRenderingContext2D) {\n var { left, top, height, color } = this.model\n\n context.beginPath()\n\n var c = height / 2\n var r = c / 2\n\n context.save()\n\n context.fillStyle = color\n context.ellipse(left + c, top + c, r, r, 0, 0, Math.PI * 2, true)\n context.shadowColor = 'rgba(0,0,0,0.15)'\n context.shadowBlur = 2\n context.shadowOffsetX = 1\n context.shadowOffsetY = 2\n context.fill()\n\n context.restore()\n }\n\n onchange(after: Properties) {\n if (after.hasOwnProperty('height')) this.set('paddingLeft', after.height)\n }\n\n get stuck() {\n return true\n }\n\n get capturable() {\n return false\n }\n\n get nature() {\n return NATURE\n }\n}\n\nComponent.register('legend-item', LegendItem)\n"]}
@@ -0,0 +1,40 @@
1
+ import { Component, Container, Properties } from '@hatiolab/things-scene';
2
+ export default class Legend extends Container {
3
+ ready(): void;
4
+ get showMoveHandle(): boolean;
5
+ render(context: CanvasRenderingContext2D): void;
6
+ get controls(): {
7
+ x: any;
8
+ y: any;
9
+ handler: {
10
+ ondragmove: (point: import("@hatiolab/things-scene").DIMENSION, index: number, component: Component) => void;
11
+ };
12
+ }[];
13
+ get layout(): import("@hatiolab/things-scene").LAYOUT;
14
+ get nature(): {
15
+ mutable: boolean;
16
+ resizable: boolean;
17
+ rotatable: boolean;
18
+ properties: ({
19
+ type: string;
20
+ label: string;
21
+ name: string;
22
+ property?: undefined;
23
+ } | {
24
+ type: string;
25
+ label: string;
26
+ name: string;
27
+ property: {
28
+ options: {
29
+ display: string;
30
+ value: string;
31
+ }[];
32
+ };
33
+ })[];
34
+ help: string;
35
+ };
36
+ rebuildLegendItems(): void;
37
+ get hasTextProperty(): boolean;
38
+ get textHidden(): boolean;
39
+ onchange(after: Properties, before: Properties): void;
40
+ }