@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.
- package/@types/global/index.d.ts +1 -0
- package/CHANGELOG.md +16 -0
- package/LICENSE +21 -0
- package/README.md +33 -0
- package/assets/icon-data-list.png +0 -0
- package/assets/icon-table.png +0 -0
- package/dist/data-list/data-cell.d.ts +22 -0
- package/dist/data-list/data-cell.js +56 -0
- package/dist/data-list/data-cell.js.map +1 -0
- package/dist/data-list/data-list-layout.d.ts +10 -0
- package/dist/data-list/data-list-layout.js +95 -0
- package/dist/data-list/data-list-layout.js.map +1 -0
- package/dist/data-list/data-list.d.ts +56 -0
- package/dist/data-list/data-list.js +536 -0
- package/dist/data-list/data-list.js.map +1 -0
- package/dist/helper-functions.d.ts +37 -0
- package/dist/helper-functions.js +135 -0
- package/dist/helper-functions.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/table-cell.d.ts +41 -0
- package/dist/table-cell.js +104 -0
- package/dist/table-cell.js.map +1 -0
- package/dist/table.d.ts +54 -0
- package/dist/table.js +1270 -0
- package/dist/table.js.map +1 -0
- package/dist/templates/data-list.d.ts +18 -0
- package/dist/templates/data-list.js +20 -0
- package/dist/templates/data-list.js.map +1 -0
- package/dist/templates/index.d.ts +18 -0
- package/dist/templates/index.js +4 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/table.d.ts +20 -0
- package/dist/templates/table.js +26 -0
- package/dist/templates/table.js.map +1 -0
- package/helps/scene/component/data-cell.ko.md +13 -0
- package/helps/scene/component/data-cell.md +13 -0
- package/helps/scene/component/data-cell.zh.md +13 -0
- package/helps/scene/component/data-list.ko.md +6 -0
- package/helps/scene/component/data-list.md +6 -0
- package/helps/scene/component/data-list.zh.md +8 -0
- package/helps/scene/component/table-cell.ko.md +58 -0
- package/helps/scene/component/table-cell.md +58 -0
- package/helps/scene/component/table-cell.zh.md +61 -0
- package/helps/scene/component/table.ko.md +68 -0
- package/helps/scene/component/table.md +68 -0
- package/helps/scene/component/table.zh.md +68 -0
- package/helps/scene/images/table-01.png +0 -0
- package/helps/scene/images/table-02.png +0 -0
- package/helps/scene/images/table-03.png +0 -0
- package/helps/scene/images/table-04.png +0 -0
- package/helps/scene/images/table-05.png +0 -0
- package/helps/scene/images/table-06.png +0 -0
- package/helps/scene/images/table-07.png +0 -0
- package/helps/scene/images/table-08.png +0 -0
- package/helps/scene/images/table-09.png +0 -0
- package/helps/scene/images/table-10.png +0 -0
- package/helps/scene/images/table-11.png +0 -0
- package/helps/scene/images/table-12.png +0 -0
- package/helps/scene/images/table-13.png +0 -0
- package/helps/scene/images/table-14.png +0 -0
- package/package.json +62 -0
- package/src/data-list/data-cell.ts +66 -0
- package/src/data-list/data-list-layout.ts +113 -0
- package/src/data-list/data-list.ts +654 -0
- package/src/helper-functions.ts +168 -0
- package/src/index.ts +6 -0
- package/src/table-cell.ts +126 -0
- package/src/table.ts +1406 -0
- package/src/templates/data-list.ts +20 -0
- package/src/templates/index.ts +4 -0
- package/src/templates/table.ts +26 -0
- package/test/basic-test.html +67 -0
- package/test/index.html +22 -0
- package/test/unit/a-test-table.js +72 -0
- package/test/unit/test-table-find-merged-cell.js +95 -0
- package/test/unit/test-table-insert-column.js +81 -0
- package/test/unit/test-table-insert-row.js +79 -0
- package/test/unit/test-table-rows-columns.js +47 -0
- package/test/unit/util.js +21 -0
- package/things-scene.config.js +5 -0
- package/translations/en.json +3 -0
- package/translations/ko.json +3 -0
- package/translations/ms.json +3 -0
- package/translations/zh.json +3 -0
- package/tsconfig.json +22 -0
- 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
|
+
}
|