@operato/scene-table 0.0.17

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 (88) hide show
  1. package/@types/global/index.d.ts +1 -0
  2. package/CHANGELOG.md +16 -0
  3. package/LICENSE +21 -0
  4. package/README.md +33 -0
  5. package/assets/icon-data-list.png +0 -0
  6. package/assets/icon-table.png +0 -0
  7. package/dist/data-list/data-cell.d.ts +22 -0
  8. package/dist/data-list/data-cell.js +56 -0
  9. package/dist/data-list/data-cell.js.map +1 -0
  10. package/dist/data-list/data-list-layout.d.ts +10 -0
  11. package/dist/data-list/data-list-layout.js +95 -0
  12. package/dist/data-list/data-list-layout.js.map +1 -0
  13. package/dist/data-list/data-list.d.ts +56 -0
  14. package/dist/data-list/data-list.js +536 -0
  15. package/dist/data-list/data-list.js.map +1 -0
  16. package/dist/helper-functions.d.ts +37 -0
  17. package/dist/helper-functions.js +135 -0
  18. package/dist/helper-functions.js.map +1 -0
  19. package/dist/index.d.ts +3 -0
  20. package/dist/index.js +7 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/table-cell.d.ts +41 -0
  23. package/dist/table-cell.js +104 -0
  24. package/dist/table-cell.js.map +1 -0
  25. package/dist/table.d.ts +54 -0
  26. package/dist/table.js +1270 -0
  27. package/dist/table.js.map +1 -0
  28. package/dist/templates/data-list.d.ts +18 -0
  29. package/dist/templates/data-list.js +20 -0
  30. package/dist/templates/data-list.js.map +1 -0
  31. package/dist/templates/index.d.ts +18 -0
  32. package/dist/templates/index.js +4 -0
  33. package/dist/templates/index.js.map +1 -0
  34. package/dist/templates/table.d.ts +20 -0
  35. package/dist/templates/table.js +26 -0
  36. package/dist/templates/table.js.map +1 -0
  37. package/helps/scene/component/data-cell.ko.md +13 -0
  38. package/helps/scene/component/data-cell.md +13 -0
  39. package/helps/scene/component/data-cell.zh.md +13 -0
  40. package/helps/scene/component/data-list.ko.md +6 -0
  41. package/helps/scene/component/data-list.md +6 -0
  42. package/helps/scene/component/data-list.zh.md +8 -0
  43. package/helps/scene/component/table-cell.ko.md +58 -0
  44. package/helps/scene/component/table-cell.md +58 -0
  45. package/helps/scene/component/table-cell.zh.md +61 -0
  46. package/helps/scene/component/table.ko.md +68 -0
  47. package/helps/scene/component/table.md +68 -0
  48. package/helps/scene/component/table.zh.md +68 -0
  49. package/helps/scene/images/table-01.png +0 -0
  50. package/helps/scene/images/table-02.png +0 -0
  51. package/helps/scene/images/table-03.png +0 -0
  52. package/helps/scene/images/table-04.png +0 -0
  53. package/helps/scene/images/table-05.png +0 -0
  54. package/helps/scene/images/table-06.png +0 -0
  55. package/helps/scene/images/table-07.png +0 -0
  56. package/helps/scene/images/table-08.png +0 -0
  57. package/helps/scene/images/table-09.png +0 -0
  58. package/helps/scene/images/table-10.png +0 -0
  59. package/helps/scene/images/table-11.png +0 -0
  60. package/helps/scene/images/table-12.png +0 -0
  61. package/helps/scene/images/table-13.png +0 -0
  62. package/helps/scene/images/table-14.png +0 -0
  63. package/package.json +62 -0
  64. package/src/data-list/data-cell.ts +66 -0
  65. package/src/data-list/data-list-layout.ts +113 -0
  66. package/src/data-list/data-list.ts +654 -0
  67. package/src/helper-functions.ts +168 -0
  68. package/src/index.ts +6 -0
  69. package/src/table-cell.ts +126 -0
  70. package/src/table.ts +1406 -0
  71. package/src/templates/data-list.ts +20 -0
  72. package/src/templates/index.ts +4 -0
  73. package/src/templates/table.ts +26 -0
  74. package/test/basic-test.html +67 -0
  75. package/test/index.html +22 -0
  76. package/test/unit/a-test-table.js +72 -0
  77. package/test/unit/test-table-find-merged-cell.js +95 -0
  78. package/test/unit/test-table-insert-column.js +81 -0
  79. package/test/unit/test-table-insert-row.js +79 -0
  80. package/test/unit/test-table-rows-columns.js +47 -0
  81. package/test/unit/util.js +21 -0
  82. package/things-scene.config.js +5 -0
  83. package/translations/en.json +3 -0
  84. package/translations/ko.json +3 -0
  85. package/translations/ms.json +3 -0
  86. package/translations/zh.json +3 -0
  87. package/tsconfig.json +22 -0
  88. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1 @@
1
+ declare module '*.png'
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.17](https://github.com/things-scene/operato-scene/compare/v0.0.16...v0.0.17) (2021-12-11)
7
+
8
+
9
+ ### :rocket: New Features
10
+
11
+ * add @operato/scene-table ([f8a6748](https://github.com/things-scene/operato-scene/commit/f8a6748e23c0195d40c788a92b4e5f9b795d49f4))
12
+
13
+
14
+ ### :bug: Bug Fix
15
+
16
+ * upgrade operato to 0.2.45 ([0032bad](https://github.com/things-scene/operato-scene/commit/0032bad0914e7fd7eae5e8cc1574df20ce7cb851))
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,33 @@
1
+ # things-scene-table
2
+
3
+ ## node package를 설치한다.
4
+
5
+ `$ yarn`
6
+
7
+ ## 실행
8
+
9
+ `$ yarn serve`
10
+ `$ yarn serve:dev`
11
+
12
+ ## 포트를 바꾸려면, -p 3001 식으로 추가해준다.
13
+
14
+ `$ yarn serve`
15
+ `$ yarn serve -p 3001`
16
+
17
+ ## test in browser
18
+
19
+ http://localhost:3000
20
+
21
+ ## build
22
+
23
+ `$ yarn build`
24
+
25
+ | type | filename | for | tested |
26
+ | ---- | ------------------------ | -------------- | ------ |
27
+ | UMD | things-scene-table.js | modern browser | 0 |
28
+ | UMD | things-scene-table-ie.js | ie 11 | 0 |
29
+ | ESM | things-scene-table.mjs | modern browser | 0 |
30
+
31
+ ## publish
32
+
33
+ `$ yarn publish`
Binary file
Binary file
@@ -0,0 +1,22 @@
1
+ import { Component, Style } from '@hatiolab/things-scene';
2
+ declare const DataCell_base: typeof Component;
3
+ export default class DataCell extends DataCell_base {
4
+ get nature(): {
5
+ mutable: boolean;
6
+ resizable: boolean;
7
+ rotatable: boolean;
8
+ properties: {
9
+ type: string;
10
+ label: string;
11
+ name: string;
12
+ property: {
13
+ merge: boolean;
14
+ split: boolean;
15
+ };
16
+ }[];
17
+ help: string;
18
+ };
19
+ _drawBorder(context: CanvasRenderingContext2D, x: number, y: number, to_x: number, to_y: number, style: Style): void;
20
+ _draw(context: CanvasRenderingContext2D): void;
21
+ }
22
+ export {};
@@ -0,0 +1,56 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import { Component, RectPath } from '@hatiolab/things-scene';
5
+ const NATURE = {
6
+ mutable: false,
7
+ resizable: true,
8
+ rotatable: true,
9
+ properties: [
10
+ {
11
+ type: 'editor-table',
12
+ label: '',
13
+ name: '',
14
+ property: {
15
+ merge: false,
16
+ split: false
17
+ }
18
+ }
19
+ ],
20
+ help: 'scene/component/data-cell'
21
+ };
22
+ export default class DataCell extends RectPath(Component) {
23
+ get nature() {
24
+ return NATURE;
25
+ }
26
+ _drawBorder(context, x, y, to_x, to_y, style) {
27
+ if (style && style.strokeStyle && style.lineWidth && style.lineDash) {
28
+ context.beginPath();
29
+ context.moveTo(x, y);
30
+ context.lineTo(to_x, to_y);
31
+ Component.drawStroke(context, style);
32
+ }
33
+ }
34
+ _draw(context) {
35
+ var { left, top, width, height } = this.bounds;
36
+ var border = this.model.border || {};
37
+ // Cell 채우기.
38
+ context.beginPath();
39
+ context.lineWidth = 0;
40
+ context.rect(left, top, width, height);
41
+ this.drawFill(context);
42
+ // Border 그리기
43
+ var parent = this.parent;
44
+ var idx = parent.components.indexOf(this);
45
+ var columns = parent.columns || 1;
46
+ this._drawBorder(context, left, top, left + width, top, border.top);
47
+ this._drawBorder(context, left, top + height, left, top, border.left);
48
+ if ((idx + 1) % columns == 0) {
49
+ /* if this filed is right most, draw right side border. */
50
+ this._drawBorder(context, left + width, top, left + width, top + height, border.right);
51
+ }
52
+ this._drawBorder(context, left + width, top + height, left, top + height, border.bottom);
53
+ }
54
+ }
55
+ Component.register('data-cell', DataCell);
56
+ //# sourceMappingURL=data-cell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-cell.js","sourceRoot":"","sources":["../../src/data-list/data-cell.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAS,MAAM,wBAAwB,CAAA;AAInE,MAAM,MAAM,GAAG;IACb,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,UAAU,EAAE;QACV;YACE,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,EAAE;YACR,QAAQ,EAAE;gBACR,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,KAAK;aACb;SACF;KACF;IACD,IAAI,EAAE,2BAA2B;CAClC,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,QAAQ,CAAC,SAAS,CAAC;IACvD,IAAI,MAAM;QACR,OAAO,MAAM,CAAA;IACf,CAAC;IAED,WAAW,CAAC,OAAiC,EAAE,CAAS,EAAE,CAAS,EAAE,IAAY,EAAE,IAAY,EAAE,KAAY;QAC3G,IAAI,KAAK,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,EAAE;YACnE,OAAO,CAAC,SAAS,EAAE,CAAA;YACnB,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACpB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YAC1B,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;SACrC;IACH,CAAC;IAED,KAAK,CAAC,OAAiC;QACrC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;QAE9C,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAA;QAEpC,YAAY;QACZ,OAAO,CAAC,SAAS,EAAE,CAAA;QACnB,OAAO,CAAC,SAAS,GAAG,CAAC,CAAA;QACrB,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;QACtC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QAEtB,aAAa;QACb,IAAI,MAAM,GAAG,IAAI,CAAC,MAAe,CAAA;QACjC,IAAI,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACzC,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,CAAA;QAEjC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAA;QACnE,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;QACrE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,EAAE;YAC5B,0DAA0D;YAC1D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,GAAG,KAAK,EAAE,GAAG,EAAE,IAAI,GAAG,KAAK,EAAE,GAAG,GAAG,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;SACvF;QACD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,GAAG,KAAK,EAAE,GAAG,GAAG,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAC1F,CAAC;CACF;AAED,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\nimport { Component, RectPath, Style } from '@hatiolab/things-scene'\n\nimport { Table } from '..'\n\nconst NATURE = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n {\n type: 'editor-table',\n label: '',\n name: '',\n property: {\n merge: false,\n split: false\n }\n }\n ],\n help: 'scene/component/data-cell'\n}\n\nexport default class DataCell extends RectPath(Component) {\n get nature() {\n return NATURE\n }\n\n _drawBorder(context: CanvasRenderingContext2D, x: number, y: number, to_x: number, to_y: number, style: Style) {\n if (style && style.strokeStyle && style.lineWidth && style.lineDash) {\n context.beginPath()\n context.moveTo(x, y)\n context.lineTo(to_x, to_y)\n Component.drawStroke(context, style)\n }\n }\n\n _draw(context: CanvasRenderingContext2D) {\n var { left, top, width, height } = this.bounds\n\n var border = this.model.border || {}\n\n // Cell 채우기.\n context.beginPath()\n context.lineWidth = 0\n context.rect(left, top, width, height)\n this.drawFill(context)\n\n // Border 그리기\n var parent = this.parent as Table\n var idx = parent.components.indexOf(this)\n var columns = parent.columns || 1\n\n this._drawBorder(context, left, top, left + width, top, border.top)\n this._drawBorder(context, left, top + height, left, top, border.left)\n if ((idx + 1) % columns == 0) {\n /* if this filed is right most, draw right side border. */\n this._drawBorder(context, left + width, top, left + width, top + height, border.right)\n }\n this._drawBorder(context, left + width, top + height, left, top + height, border.bottom)\n }\n}\n\nComponent.register('data-cell', DataCell)\n"]}
@@ -0,0 +1,10 @@
1
+ import { Component, Container } from '@hatiolab/things-scene';
2
+ declare var DataListLayout: {
3
+ reflow: (container: Container) => void;
4
+ capturables: (container: Container) => Component[];
5
+ drawables: (container: Container) => Component[];
6
+ isStuck: (component: Component) => boolean;
7
+ keyNavigate: (container: Container, component: Component, e: KeyboardEvent) => Component | undefined;
8
+ joinType: boolean;
9
+ };
10
+ export default DataListLayout;
@@ -0,0 +1,95 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import { Layout } from '@hatiolab/things-scene';
5
+ var DataListLayout = {
6
+ reflow: function (container) {
7
+ var layoutConfig = container.get('layoutConfig');
8
+ var columns = (layoutConfig && layoutConfig.columns) || container.get('columns');
9
+ var rows = (layoutConfig && layoutConfig.rows) || container.get('rows');
10
+ var widths = (layoutConfig && layoutConfig.widths) || container.get('widths');
11
+ var heights = (layoutConfig && layoutConfig.heights) || container.get('heights');
12
+ var { offset = { x: 0, y: 0 } } = container.state;
13
+ var widths_sum = widths ? widths.filter((width, i) => i < columns).reduce((sum, width) => sum + width, 0) : columns;
14
+ var heights_sum = heights ? heights.filter((height, i) => i < rows).reduce((sum, height) => sum + height, 0) : rows;
15
+ var inside = container.textBounds;
16
+ var paddingLeft = container.get('paddingLeft') || 0;
17
+ var paddingTop = container.get('paddingTop') || 0;
18
+ var width_unit = inside.width / widths_sum;
19
+ var height_unit = inside.height / heights_sum;
20
+ var x = offset.x;
21
+ var y = offset.y;
22
+ var components = container.components;
23
+ components.forEach((component, idx) => {
24
+ let w = widths ? widths[idx % columns] : 1;
25
+ let h = heights ? heights[0] : 1;
26
+ let left = paddingLeft + x;
27
+ let top = paddingTop + y;
28
+ let width = width_unit * w;
29
+ let height = height_unit * h;
30
+ component.bounds = {
31
+ left,
32
+ top,
33
+ width,
34
+ height
35
+ };
36
+ component.set('rotation', 0);
37
+ if (idx % columns == columns - 1) {
38
+ x = 0;
39
+ y += h * height_unit;
40
+ }
41
+ else {
42
+ x += w * width_unit;
43
+ }
44
+ });
45
+ },
46
+ capturables: function (container) {
47
+ return container.components;
48
+ },
49
+ drawables: function (container) {
50
+ return container.components;
51
+ },
52
+ isStuck: function (component) {
53
+ return true;
54
+ },
55
+ /*
56
+ * 레이아웃별로, 키보드 방향키 등을 사용해서 네비게이션 할 수 있는 기능을 제공할 수 있다.
57
+ * 하나의 컴포넌트만 선택되어있고, 키보드 이벤트가 발생했을 때 호출되게 된다.
58
+ * keyNavigate 메쏘드가 정의되어 있지 않으면, 'Tab' 키에 대한 네비게이션만 작동한다.
59
+ * 'Tab'키에 의한 네비게이션은 모든 레이아웃에 공통으로 적용된다.
60
+ */
61
+ keyNavigate: function (container, component, e) {
62
+ var layoutConfig = container.get('layoutConfig');
63
+ var columns = (layoutConfig && layoutConfig.columns) || container.get('columns');
64
+ var rows = (layoutConfig && layoutConfig.rows) || container.get('rows');
65
+ var { row, column } = container.getRowColumn(component);
66
+ switch (e.code) {
67
+ case 'ArrowUp':
68
+ if (row > 0)
69
+ return container.getAt((row - 1) * columns + column);
70
+ break;
71
+ case 'ArrowDown':
72
+ if (row < rows - 1)
73
+ return container.getAt((row + 1) * columns + column);
74
+ break;
75
+ case 'ArrowRight':
76
+ if (column < columns - 1)
77
+ return container.getAt(row * columns + column + 1);
78
+ break;
79
+ case 'ArrowLeft':
80
+ if (column > 0)
81
+ return container.getAt(row * columns + column - 1);
82
+ break;
83
+ default:
84
+ return component;
85
+ }
86
+ },
87
+ /*
88
+ * 하위 컴포넌트를 영역으로 선택하는 경우에, 바운드에 join만 되어도 선택된 것으로 판단하도록 한다.
89
+ * joinType이 false이거나, 정의되어있지 않으면, 바운드에 포함되어야 선택된 것으로 판단한다.
90
+ */
91
+ joinType: true
92
+ };
93
+ Layout.register('data-list', DataListLayout);
94
+ export default DataListLayout;
95
+ //# sourceMappingURL=data-list-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-list-layout.js","sourceRoot":"","sources":["../../src/data-list/data-list-layout.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport { Component, Container, Layout } from '@hatiolab/things-scene'\n\nimport DataCell from './data-cell'\nimport DataList from './data-list'\n\nvar DataListLayout = {\n reflow: function(container: Container) {\n var layoutConfig = container.get('layoutConfig')\n\n var columns = (layoutConfig && layoutConfig.columns) || container.get('columns')\n var rows = (layoutConfig && layoutConfig.rows) || container.get('rows')\n var widths = (layoutConfig && layoutConfig.widths) || container.get('widths')\n var heights = (layoutConfig && layoutConfig.heights) || container.get('heights')\n var { offset = { x: 0, y: 0 } } = container.state\n\n var widths_sum = widths ? widths.filter((width: number, i: number) => i < columns).reduce((sum: number, width: number) => sum + width, 0) : columns\n var heights_sum = heights ? heights.filter((height: number, i: number) => i < rows).reduce((sum: number, height: number) => sum + height, 0) : rows\n\n var inside = container.textBounds\n var paddingLeft = container.get('paddingLeft') || 0\n var paddingTop = container.get('paddingTop') || 0\n\n var width_unit = inside.width / widths_sum\n var height_unit = inside.height / heights_sum\n\n var x = offset.x\n var y = offset.y\n var components = container.components\n\n components.forEach((component, idx) => {\n let w = widths ? widths[idx % columns] : 1\n let h = heights ? heights[0] : 1\n\n let left = paddingLeft + x\n let top = paddingTop + y\n let width = width_unit * w\n let height = height_unit * h\n\n component.bounds = {\n left,\n top,\n width,\n height\n }\n component.set('rotation', 0)\n\n if (idx % columns == columns - 1) {\n x = 0\n y += h * height_unit\n } else {\n x += w * width_unit\n }\n })\n },\n\n capturables: function(container: Container) {\n return container.components\n },\n\n drawables: function(container: Container) {\n return container.components\n },\n\n isStuck: function(component: Component) {\n return true\n },\n\n /*\n * 레이아웃별로, 키보드 방향키 등을 사용해서 네비게이션 할 수 있는 기능을 제공할 수 있다.\n * 하나의 컴포넌트만 선택되어있고, 키보드 이벤트가 발생했을 때 호출되게 된다.\n * keyNavigate 메쏘드가 정의되어 있지 않으면, 'Tab' 키에 대한 네비게이션만 작동한다.\n * 'Tab'키에 의한 네비게이션은 모든 레이아웃에 공통으로 적용된다.\n */\n keyNavigate: function(container: Container, component: Component, e: KeyboardEvent) {\n var layoutConfig = container.get('layoutConfig')\n\n var columns = (layoutConfig && layoutConfig.columns) || container.get('columns')\n var rows = (layoutConfig && layoutConfig.rows) || container.get('rows')\n\n var { row, column } = (container as DataList).getRowColumn(component as DataCell)\n\n switch (e.code) {\n case 'ArrowUp':\n if (row > 0) return container.getAt((row - 1) * columns + column)\n break\n case 'ArrowDown':\n if (row < rows - 1) return container.getAt((row + 1) * columns + column)\n break\n case 'ArrowRight':\n if (column < columns - 1) return container.getAt(row * columns + column + 1)\n break\n case 'ArrowLeft':\n if (column > 0) return container.getAt(row * columns + column - 1)\n break\n default:\n return component\n }\n },\n\n /*\n * 하위 컴포넌트를 영역으로 선택하는 경우에, 바운드에 join만 되어도 선택된 것으로 판단하도록 한다.\n * joinType이 false이거나, 정의되어있지 않으면, 바운드에 포함되어야 선택된 것으로 판단한다.\n */\n joinType: true\n}\n\nLayout.register('data-list', DataListLayout)\n\nexport default DataListLayout\n"]}
@@ -0,0 +1,56 @@
1
+ import './data-cell';
2
+ import './data-list-layout';
3
+ import { WHERE } from '../helper-functions';
4
+ import { Component, ComponentNature, Container, Control, State, Style } from '@hatiolab/things-scene';
5
+ export default class DataList extends Container {
6
+ postrender(context: CanvasRenderingContext2D): void;
7
+ renderScrollbar(context: CanvasRenderingContext2D): void;
8
+ created(): void;
9
+ _onwheel(e: WheelEvent): void;
10
+ private __START_OFFSET?;
11
+ private __START_Y?;
12
+ _ontouchstart(e: DragEvent): void;
13
+ _ontouchmove(e: DragEvent): void;
14
+ _ontouchend(e: DragEvent): void;
15
+ get layout(): import("@hatiolab/things-scene").LAYOUT;
16
+ containable(component: Component): boolean;
17
+ get focusible(): boolean;
18
+ get widths_sum(): number;
19
+ get heights_sum(): number;
20
+ get widths(): number[];
21
+ get heights(): number[];
22
+ get columns(): number;
23
+ get rows(): number;
24
+ get nature(): ComponentNature;
25
+ get controls(): Control[];
26
+ onchange(after: State, before: State): void;
27
+ get eventMap(): {
28
+ '(self)': {
29
+ '(all)': {
30
+ wheel: (e: WheelEvent) => void;
31
+ touchstart: (e: DragEvent) => void;
32
+ touchmove: (e: DragEvent) => void;
33
+ touchend: (e: DragEvent) => void;
34
+ };
35
+ };
36
+ };
37
+ setCellsData(): void;
38
+ setCellsStyle(cells: Component[], style: Style, where: WHERE): void;
39
+ buildCells(newcolumns: number, oldcolumns: number): void;
40
+ getRowColumn(cell: Component): {
41
+ column: number;
42
+ row: number;
43
+ };
44
+ getCellsByRow(row: number): Component[];
45
+ getCellsByColumn(column: number): Component[];
46
+ mergeCells(cells: Component[]): void;
47
+ splitCells(cells: Component[]): void;
48
+ deleteRows(cells: Component[]): void;
49
+ deleteColumns(cells: Component[]): void;
50
+ insertCellsAbove(cells: Component[]): void;
51
+ insertCellsBelow(cells: Component[]): void;
52
+ insertCellsLeft(cells: Component[]): false | undefined;
53
+ insertCellsRight(cells: Component[]): false | undefined;
54
+ distributeHorizontal(cells: Component[]): void;
55
+ distributeVertical(cells: Component[]): void;
56
+ }