@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,135 @@
|
|
|
1
|
+
import { Model } from '@hatiolab/things-scene';
|
|
2
|
+
export const SIDES = {
|
|
3
|
+
all: ['top', 'left', 'bottom', 'right'],
|
|
4
|
+
out: ['top', 'left', 'bottom', 'right'],
|
|
5
|
+
left: ['left'],
|
|
6
|
+
right: ['right'],
|
|
7
|
+
top: ['top'],
|
|
8
|
+
bottom: ['bottom'],
|
|
9
|
+
leftright: ['left', 'right'],
|
|
10
|
+
topbottom: ['top', 'bottom']
|
|
11
|
+
};
|
|
12
|
+
export const CLEAR_STYLE = {
|
|
13
|
+
strokeStyle: '',
|
|
14
|
+
lineDash: 'solid',
|
|
15
|
+
lineWidth: 0
|
|
16
|
+
};
|
|
17
|
+
export const DEFAULT_STYLE = {
|
|
18
|
+
strokeStyle: '#999',
|
|
19
|
+
lineDash: 'solid',
|
|
20
|
+
lineWidth: 1
|
|
21
|
+
};
|
|
22
|
+
export function buildNewCell(type, app) {
|
|
23
|
+
return Model.compile({
|
|
24
|
+
type,
|
|
25
|
+
strokeStyle: 'blue',
|
|
26
|
+
left: 0,
|
|
27
|
+
top: 0,
|
|
28
|
+
width: 1,
|
|
29
|
+
height: 1,
|
|
30
|
+
textWrap: true,
|
|
31
|
+
border: buildBorderStyle(DEFAULT_STYLE, 'all')
|
|
32
|
+
}, app);
|
|
33
|
+
}
|
|
34
|
+
export function buildCopiedCell(copy, app) {
|
|
35
|
+
var obj = JSON.parse(JSON.stringify(copy));
|
|
36
|
+
delete obj.text;
|
|
37
|
+
return Model.compile(obj, app);
|
|
38
|
+
}
|
|
39
|
+
export function buildBorderStyle(style, where) {
|
|
40
|
+
return (SIDES[where] || []).reduce((border, side) => {
|
|
41
|
+
border[side] = style;
|
|
42
|
+
return border;
|
|
43
|
+
}, {});
|
|
44
|
+
}
|
|
45
|
+
export function setCellBorder(cell, style, where) {
|
|
46
|
+
if (!cell)
|
|
47
|
+
return;
|
|
48
|
+
cell.set('border', Object.assign({}, cell.get('border') || {}, buildBorderStyle(style, where)));
|
|
49
|
+
}
|
|
50
|
+
export function isLeftMost(total, columns, indices, i) {
|
|
51
|
+
return i == 0 || !(i % columns) || indices.indexOf(i - 1) == -1;
|
|
52
|
+
}
|
|
53
|
+
export function isRightMost(total, columns, indices, i) {
|
|
54
|
+
return i == total - 1 || i % columns == columns - 1 || indices.indexOf(i + 1) == -1;
|
|
55
|
+
}
|
|
56
|
+
export function isTopMost(total, columns, indices, i) {
|
|
57
|
+
return i < columns || indices.indexOf(i - columns) == -1;
|
|
58
|
+
}
|
|
59
|
+
export function isBottomMost(total, columns, indices, i) {
|
|
60
|
+
return i > total - columns - 1 || indices.indexOf(i + columns) == -1;
|
|
61
|
+
}
|
|
62
|
+
export function above(columns, i) {
|
|
63
|
+
return i - columns;
|
|
64
|
+
}
|
|
65
|
+
export function below(columns, i) {
|
|
66
|
+
return i + columns;
|
|
67
|
+
}
|
|
68
|
+
export function before(columns, i) {
|
|
69
|
+
return !(i % columns) ? -1 : i - 1;
|
|
70
|
+
}
|
|
71
|
+
export function after(columns, i) {
|
|
72
|
+
return !((i + 1) % columns) ? -1 : i + 1;
|
|
73
|
+
}
|
|
74
|
+
export function array(value, size) {
|
|
75
|
+
var arr = [];
|
|
76
|
+
for (let i = 0; i < size; i++)
|
|
77
|
+
arr.push(1);
|
|
78
|
+
return arr;
|
|
79
|
+
}
|
|
80
|
+
export var columnControlHandler = {
|
|
81
|
+
ondragmove: function (point, index, component) {
|
|
82
|
+
var { left, width } = component.textBounds;
|
|
83
|
+
var widths_sum = component.widths_sum;
|
|
84
|
+
var widths = component.widths.slice();
|
|
85
|
+
/* 컨트롤의 원래 위치를 구한다. */
|
|
86
|
+
var origin_pos_unit = widths.slice(0, index + 1).reduce((sum, width) => sum + width, 0);
|
|
87
|
+
var origin_offset = left + (origin_pos_unit / widths_sum) * width;
|
|
88
|
+
/*
|
|
89
|
+
* point의 좌표는 부모 레이어 기준의 x, y 값이다.
|
|
90
|
+
* 따라서, 도형의 회전을 감안한 좌표로의 변환이 필요하다.
|
|
91
|
+
* Transcoord시에는 point좌표가 부모까지 transcoord되어있는 상태이므로,
|
|
92
|
+
* 컴포넌트자신에 대한 transcoord만 필요하다.(마지막 파라미터를 false로).
|
|
93
|
+
*/
|
|
94
|
+
var transcoorded = component.transcoordP2S(point.x, point.y);
|
|
95
|
+
var diff = transcoorded.x - origin_offset;
|
|
96
|
+
var diff_unit = (diff / width) * widths_sum;
|
|
97
|
+
var min_width_unit = (widths_sum / width) * 10; // 10픽셀정도를 최소로
|
|
98
|
+
if (diff_unit < 0)
|
|
99
|
+
diff_unit = -Math.min(widths[index] - min_width_unit, -diff_unit);
|
|
100
|
+
else
|
|
101
|
+
diff_unit = Math.min(widths[index + 1] - min_width_unit, diff_unit);
|
|
102
|
+
widths[index] = Math.round((widths[index] + diff_unit) * 100) / 100;
|
|
103
|
+
widths[index + 1] = Math.round((widths[index + 1] - diff_unit) * 100) / 100;
|
|
104
|
+
component.set('widths', widths);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
export var rowControlHandler = {
|
|
108
|
+
ondragmove: function (point, index, component) {
|
|
109
|
+
var { top, height } = component.textBounds;
|
|
110
|
+
var heights_sum = component.heights_sum;
|
|
111
|
+
var heights = component.heights.slice();
|
|
112
|
+
/* 컨트롤의 원래 위치를 구한다. */
|
|
113
|
+
index -= component.columns - 1;
|
|
114
|
+
var origin_pos_unit = heights.slice(0, index + 1).reduce((sum, height) => sum + height, 0);
|
|
115
|
+
var origin_offset = top + (origin_pos_unit / heights_sum) * height;
|
|
116
|
+
/*
|
|
117
|
+
* point의 좌표는 부모 레이어 기준의 x, y 값이다.
|
|
118
|
+
* 따라서, 도형의 회전을 감안한 좌표로의 변환이 필요하다.
|
|
119
|
+
* Transcoord시에는 point좌표가 부모까지 transcoord되어있는 상태이므로,
|
|
120
|
+
* 컴포넌트자신에 대한 transcoord만 필요하다.(마지막 파라미터를 false로).
|
|
121
|
+
*/
|
|
122
|
+
var transcoorded = component.transcoordP2S(point.x, point.y);
|
|
123
|
+
var diff = transcoorded.y - origin_offset;
|
|
124
|
+
var diff_unit = (diff / height) * heights_sum;
|
|
125
|
+
var min_height_unit = (heights_sum / height) * 10; // 10픽셀정도를 최소로
|
|
126
|
+
if (diff_unit < 0)
|
|
127
|
+
diff_unit = -Math.min(heights[index] - min_height_unit, -diff_unit);
|
|
128
|
+
else
|
|
129
|
+
diff_unit = Math.min(heights[index + 1] - min_height_unit, diff_unit);
|
|
130
|
+
heights[index] = Math.round((heights[index] + diff_unit) * 100) / 100;
|
|
131
|
+
heights[index + 1] = Math.round((heights[index + 1] - diff_unit) * 100) / 100;
|
|
132
|
+
component.set('heights', heights);
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
//# sourceMappingURL=helper-functions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper-functions.js","sourceRoot":"","sources":["../src/helper-functions.ts"],"names":[],"mappings":"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","sourcesContent":["import { ApplicationContext, Component, Model, POINT, Style } from '@hatiolab/things-scene'\nimport { Table, TableCell } from '.'\n\nexport type WHERE = 'all' | 'in' | 'out' | 'left' | 'right' | 'center' | 'middle' | 'top' | 'bottom' | 'clear'\n\nexport const SIDES: {[key: string]: string[]} = {\n all: ['top', 'left', 'bottom', 'right'],\n out: ['top', 'left', 'bottom', 'right'],\n left: ['left'],\n right: ['right'],\n top: ['top'],\n bottom: ['bottom'],\n leftright: ['left', 'right'],\n topbottom: ['top', 'bottom']\n}\n\nexport const CLEAR_STYLE = {\n strokeStyle: '',\n lineDash: 'solid',\n lineWidth: 0\n}\n\nexport const DEFAULT_STYLE = {\n strokeStyle: '#999',\n lineDash: 'solid',\n lineWidth: 1\n}\n\nexport function buildNewCell(type: string, app: ApplicationContext): TableCell {\n return Model.compile(\n {\n type,\n strokeStyle: 'blue',\n left: 0,\n top: 0,\n width: 1,\n height: 1,\n textWrap: true,\n border: buildBorderStyle(DEFAULT_STYLE, 'all')\n },\n app\n ) as TableCell\n}\n\nexport function buildCopiedCell(copy: Model, app: ApplicationContext): TableCell {\n var obj = JSON.parse(JSON.stringify(copy))\n delete obj.text\n return Model.compile(obj, app) as TableCell\n}\n\nexport function buildBorderStyle(style: Style, where: string) {\n return (SIDES[where] || []).reduce((border: { [key: string]: any }, side: string) => {\n border[side] = style\n return border\n }, {} as { [key: string]: any })\n}\n\nexport function setCellBorder(cell: any, style: Style, where: string) {\n if (!cell) return\n cell.set('border', Object.assign({}, cell.get('border') || {}, buildBorderStyle(style, where)))\n}\n\nexport function isLeftMost(total: number, columns: number, indices: number[], i: number) {\n return i == 0 || !(i % columns) || indices.indexOf(i - 1) == -1\n}\n\nexport function isRightMost(total: number, columns: number, indices: number[], i: number) {\n return i == total - 1 || i % columns == columns - 1 || indices.indexOf(i + 1) == -1\n}\n\nexport function isTopMost(total: number, columns: number, indices: number[], i: number) {\n return i < columns || indices.indexOf(i - columns) == -1\n}\n\nexport function isBottomMost(total: number, columns: number, indices: number[], i: number) {\n return i > total - columns - 1 || indices.indexOf(i + columns) == -1\n}\n\nexport function above(columns: number, i: number) {\n return i - columns\n}\n\nexport function below(columns: number, i: number) {\n return i + columns\n}\n\nexport function before(columns: number, i: number) {\n return !(i % columns) ? -1 : i - 1\n}\n\nexport function after(columns: number, i: number) {\n return !((i + 1) % columns) ? -1 : i + 1\n}\n\nexport function array(value: any, size: number) {\n var arr = []\n for (let i = 0; i < size; i++) arr.push(1)\n return arr\n}\n\nexport var columnControlHandler = {\n ondragmove: function(point: POINT, index: number, component: Table) {\n var { left, width } = component.textBounds\n var widths_sum = component.widths_sum\n\n var widths = component.widths.slice()\n\n /* 컨트롤의 원래 위치를 구한다. */\n var origin_pos_unit = widths.slice(0, index + 1).reduce((sum: number, width: number) => sum + width, 0)\n var origin_offset = left + (origin_pos_unit / widths_sum) * width\n\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 diff = transcoorded.x - origin_offset\n\n var diff_unit = (diff / width) * widths_sum\n\n var min_width_unit = (widths_sum / width) * 10 // 10픽셀정도를 최소로\n\n if (diff_unit < 0) diff_unit = -Math.min(widths[index] - min_width_unit, -diff_unit)\n else diff_unit = Math.min(widths[index + 1] - min_width_unit, diff_unit)\n\n widths[index] = Math.round((widths[index] + diff_unit) * 100) / 100\n widths[index + 1] = Math.round((widths[index + 1] - diff_unit) * 100) / 100\n\n component.set('widths', widths)\n }\n}\n\nexport var rowControlHandler = {\n ondragmove: function(point: POINT, index: number, component: Table) {\n var { top, height } = component.textBounds\n var heights_sum = component.heights_sum\n\n var heights = component.heights.slice()\n\n /* 컨트롤의 원래 위치를 구한다. */\n index -= component.columns - 1\n var origin_pos_unit = heights.slice(0, index + 1).reduce((sum: number, height: number) => sum + height, 0)\n var origin_offset = top + (origin_pos_unit / heights_sum) * height\n\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 diff = transcoorded.y - origin_offset\n\n var diff_unit = (diff / height) * heights_sum\n\n var min_height_unit = (heights_sum / height) * 10 // 10픽셀정도를 최소로\n\n if (diff_unit < 0) diff_unit = -Math.min(heights[index] - min_height_unit, -diff_unit)\n else diff_unit = Math.min(heights[index + 1] - min_height_unit, diff_unit)\n\n heights[index] = Math.round((heights[index] + diff_unit) * 100) / 100\n heights[index + 1] = Math.round((heights[index + 1] - diff_unit) * 100) / 100\n\n component.set('heights', heights)\n }\n}\n"]}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,uBAAuB,CAAA","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\nexport { default as Table } from './table'\nexport { default as TableCell } from './table-cell'\nexport { default as DataList } from './data-list/data-list'\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Component } from '@hatiolab/things-scene';
|
|
2
|
+
declare type Style = {
|
|
3
|
+
[style: string]: any;
|
|
4
|
+
};
|
|
5
|
+
declare const TableCell_base: typeof Component;
|
|
6
|
+
/**
|
|
7
|
+
* 1. 스타일을 상속 받아야 함. (cascade-style)
|
|
8
|
+
* 2. 스타일을 동적처리할 수 있음. (로직처리)
|
|
9
|
+
* 3. 데이타를 받을 수 있음.
|
|
10
|
+
*/
|
|
11
|
+
export default class TableCell extends TableCell_base {
|
|
12
|
+
get nature(): {
|
|
13
|
+
mutable: boolean;
|
|
14
|
+
resizable: boolean;
|
|
15
|
+
rotatable: boolean;
|
|
16
|
+
properties: ({
|
|
17
|
+
type: string;
|
|
18
|
+
label: string;
|
|
19
|
+
name: string;
|
|
20
|
+
property: {
|
|
21
|
+
merge: boolean;
|
|
22
|
+
split: boolean;
|
|
23
|
+
};
|
|
24
|
+
} | {
|
|
25
|
+
type: string;
|
|
26
|
+
label: string;
|
|
27
|
+
name: string;
|
|
28
|
+
property: string;
|
|
29
|
+
})[];
|
|
30
|
+
help: string;
|
|
31
|
+
};
|
|
32
|
+
set merged(merged: any);
|
|
33
|
+
get merged(): any;
|
|
34
|
+
set rowspan(rowspan: any);
|
|
35
|
+
get rowspan(): any;
|
|
36
|
+
set colspan(colspan: any);
|
|
37
|
+
get colspan(): any;
|
|
38
|
+
_drawBorder(context: CanvasRenderingContext2D, x: number, y: number, to_x: number, to_y: number, style: Style): void;
|
|
39
|
+
_draw(context: CanvasRenderingContext2D): void;
|
|
40
|
+
}
|
|
41
|
+
export {};
|
|
@@ -0,0 +1,104 @@
|
|
|
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: true,
|
|
16
|
+
split: true
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
type: 'string',
|
|
21
|
+
label: 'data-key',
|
|
22
|
+
name: 'dataKey',
|
|
23
|
+
property: 'dataKey'
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
type: 'number',
|
|
27
|
+
label: 'data-index',
|
|
28
|
+
name: 'dataIndex',
|
|
29
|
+
property: 'dataIndex'
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
help: 'scene/component/table-cell'
|
|
33
|
+
};
|
|
34
|
+
const EMPTY_BORDER = {};
|
|
35
|
+
function isBottomMost(idx, rows, columns, components) {
|
|
36
|
+
return idx >= (rows - 1) * columns || (components[idx + columns] && components[idx + columns].hidden);
|
|
37
|
+
}
|
|
38
|
+
function isRightMost(idx, rows, columns, components) {
|
|
39
|
+
return (idx + 1) % columns == 0 || (components[idx + 1] && components[idx + 1].hidden);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 1. 스타일을 상속 받아야 함. (cascade-style)
|
|
43
|
+
* 2. 스타일을 동적처리할 수 있음. (로직처리)
|
|
44
|
+
* 3. 데이타를 받을 수 있음.
|
|
45
|
+
*/
|
|
46
|
+
export default class TableCell extends RectPath(Component) {
|
|
47
|
+
// export default class TableCell extends Container {
|
|
48
|
+
// get layout() {
|
|
49
|
+
// return Layout.get(this.get('layout') || 'card')
|
|
50
|
+
// }
|
|
51
|
+
get nature() {
|
|
52
|
+
return NATURE;
|
|
53
|
+
}
|
|
54
|
+
set merged(merged) {
|
|
55
|
+
this.set('merged', !!merged);
|
|
56
|
+
if (merged)
|
|
57
|
+
this.set('text', '');
|
|
58
|
+
}
|
|
59
|
+
get merged() {
|
|
60
|
+
return this.get('merged');
|
|
61
|
+
}
|
|
62
|
+
set rowspan(rowspan) {
|
|
63
|
+
this.set('rowspan', rowspan);
|
|
64
|
+
}
|
|
65
|
+
get rowspan() {
|
|
66
|
+
return this.get('rowspan');
|
|
67
|
+
}
|
|
68
|
+
set colspan(colspan) {
|
|
69
|
+
this.set('colspan', colspan);
|
|
70
|
+
}
|
|
71
|
+
get colspan() {
|
|
72
|
+
return this.get('colspan');
|
|
73
|
+
}
|
|
74
|
+
_drawBorder(context, x, y, to_x, to_y, style) {
|
|
75
|
+
if (style && style.strokeStyle && style.lineWidth && style.lineDash) {
|
|
76
|
+
context.beginPath();
|
|
77
|
+
context.moveTo(x, y);
|
|
78
|
+
context.lineTo(to_x, to_y);
|
|
79
|
+
Component.drawStroke(context, style);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
_draw(context) {
|
|
83
|
+
var { left, top, width, height } = this.model;
|
|
84
|
+
var border = this.model.border || {};
|
|
85
|
+
// Cell 채우기.
|
|
86
|
+
context.beginPath();
|
|
87
|
+
context.lineWidth = 0;
|
|
88
|
+
context.rect(left, top, width, height);
|
|
89
|
+
this.drawFill(context);
|
|
90
|
+
// Border 그리기
|
|
91
|
+
var parent = this.parent;
|
|
92
|
+
var idx = parent.components.indexOf(this);
|
|
93
|
+
var columns = parent.columns || 1;
|
|
94
|
+
var rows = parent.rows || 1;
|
|
95
|
+
this._drawBorder(context, left, top, left + width, top, border.top);
|
|
96
|
+
this._drawBorder(context, left, top + height, left, top, border.left);
|
|
97
|
+
if (isRightMost(idx, rows, columns, parent.components))
|
|
98
|
+
this._drawBorder(context, left + width, top, left + width, top + height, border.right);
|
|
99
|
+
if (isBottomMost(idx, rows, columns, parent.components))
|
|
100
|
+
this._drawBorder(context, left + width, top + height, left, top + height, border.bottom);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
Component.register('table-cell', TableCell);
|
|
104
|
+
//# sourceMappingURL=table-cell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-cell.js","sourceRoot":"","sources":["../src/table-cell.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\nimport { Component, Container, Layout, RectPath } from '@hatiolab/things-scene'\n\nimport Table from './table'\n\ntype Style = { [style: string]: any }\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: true,\n split: true\n }\n },\n {\n type: 'string',\n label: 'data-key',\n name: 'dataKey',\n property: 'dataKey'\n },\n {\n type: 'number',\n label: 'data-index',\n name: 'dataIndex',\n property: 'dataIndex'\n }\n ],\n help: 'scene/component/table-cell'\n}\n\nconst EMPTY_BORDER = {}\n\nfunction isBottomMost(idx: number, rows: number, columns: number, components: Component[]) {\n return idx >= (rows - 1) * columns || (components[idx + columns] && components[idx + columns].hidden)\n}\n\nfunction isRightMost(idx: number, rows: number, columns: number, components: Component[]) {\n return (idx + 1) % columns == 0 || (components[idx + 1] && components[idx + 1].hidden)\n}\n\n/**\n * 1. 스타일을 상속 받아야 함. (cascade-style)\n * 2. 스타일을 동적처리할 수 있음. (로직처리)\n * 3. 데이타를 받을 수 있음.\n */\nexport default class TableCell extends RectPath(Component) {\n // export default class TableCell extends Container {\n\n // get layout() {\n // return Layout.get(this.get('layout') || 'card')\n // }\n\n get nature() {\n return NATURE\n }\n\n set merged(merged) {\n this.set('merged', !!merged)\n if (merged) this.set('text', '')\n }\n\n get merged() {\n return this.get('merged')\n }\n\n set rowspan(rowspan) {\n this.set('rowspan', rowspan)\n }\n\n get rowspan() {\n return this.get('rowspan')\n }\n\n set colspan(colspan) {\n this.set('colspan', colspan)\n }\n\n get colspan() {\n return this.get('colspan')\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.model\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 var rows = parent.rows || 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 (isRightMost(idx, rows, columns, parent.components))\n this._drawBorder(context, left + width, top, left + width, top + height, border.right)\n if (isBottomMost(idx, rows, columns, parent.components))\n this._drawBorder(context, left + width, top + height, left, top + height, border.bottom)\n }\n}\n\nComponent.register('table-cell', TableCell)\n"]}
|
package/dist/table.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { WHERE } from './helper-functions';
|
|
2
|
+
import { Component, ComponentNature, Container, Control, State, Style } from '@hatiolab/things-scene';
|
|
3
|
+
import { TableCell } from '.';
|
|
4
|
+
export default class Table extends Container {
|
|
5
|
+
created(): void;
|
|
6
|
+
containable(component: Component): boolean;
|
|
7
|
+
get focusible(): boolean;
|
|
8
|
+
get widths(): any;
|
|
9
|
+
get heights(): any;
|
|
10
|
+
buildCells(newrows: number, newcolumns: number, oldrows: number, oldcolumns: number): void;
|
|
11
|
+
get layout(): import("@hatiolab/things-scene").LAYOUT;
|
|
12
|
+
get rows(): number;
|
|
13
|
+
setCellsStyle(cells: TableCell[], style: Style, where: WHERE): void;
|
|
14
|
+
setCellsData(): void;
|
|
15
|
+
getRowColumn(cell: TableCell): {
|
|
16
|
+
column: number;
|
|
17
|
+
row: number;
|
|
18
|
+
};
|
|
19
|
+
getCellsByRow(row: number): Component[];
|
|
20
|
+
getCellsByColumn(column: number): Component[];
|
|
21
|
+
findMergedCellByX(row: number): TableCell[];
|
|
22
|
+
findMergedCellByY(column: number): TableCell[];
|
|
23
|
+
mergeCells(cells: TableCell[]): false | undefined;
|
|
24
|
+
splitCells(cells: TableCell[]): void;
|
|
25
|
+
deleteRows(cells: TableCell[]): false | undefined;
|
|
26
|
+
deleteColumns(cells: TableCell[]): false | undefined;
|
|
27
|
+
insertCellsAbove(cells: TableCell[]): false | undefined;
|
|
28
|
+
insertCellsBelow(cells: TableCell[]): false | undefined;
|
|
29
|
+
insertCellsLeft(cells: TableCell[]): false | undefined;
|
|
30
|
+
insertCellsRight(cells: TableCell[]): false | undefined;
|
|
31
|
+
distributeHorizontal(cells: TableCell[]): void;
|
|
32
|
+
distributeVertical(cells: TableCell[]): void;
|
|
33
|
+
toObjectArrayValue(array: any[]): any[] | null;
|
|
34
|
+
get columns(): number;
|
|
35
|
+
get lefts(): Component[];
|
|
36
|
+
get centers(): Component[];
|
|
37
|
+
get rights(): Component[];
|
|
38
|
+
get tops(): Component[];
|
|
39
|
+
get middles(): Component[];
|
|
40
|
+
get bottoms(): Component[];
|
|
41
|
+
get widths_sum(): number;
|
|
42
|
+
get heights_sum(): number;
|
|
43
|
+
get nature(): ComponentNature;
|
|
44
|
+
get controls(): Control[];
|
|
45
|
+
onchange(after: State, before: State): void;
|
|
46
|
+
get eventMap(): {
|
|
47
|
+
'(self)': {
|
|
48
|
+
'(descendant)': {
|
|
49
|
+
change: (after: import("@hatiolab/things-scene").Properties, before: import("@hatiolab/things-scene").Properties) => void;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
oncellchanged(after: State, before: State): void;
|
|
54
|
+
}
|