@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,168 @@
1
+ import { ApplicationContext, Component, Model, POINT, Style } from '@hatiolab/things-scene'
2
+ import { Table, TableCell } from '.'
3
+
4
+ export type WHERE = 'all' | 'in' | 'out' | 'left' | 'right' | 'center' | 'middle' | 'top' | 'bottom' | 'clear'
5
+
6
+ export const SIDES: {[key: string]: string[]} = {
7
+ all: ['top', 'left', 'bottom', 'right'],
8
+ out: ['top', 'left', 'bottom', 'right'],
9
+ left: ['left'],
10
+ right: ['right'],
11
+ top: ['top'],
12
+ bottom: ['bottom'],
13
+ leftright: ['left', 'right'],
14
+ topbottom: ['top', 'bottom']
15
+ }
16
+
17
+ export const CLEAR_STYLE = {
18
+ strokeStyle: '',
19
+ lineDash: 'solid',
20
+ lineWidth: 0
21
+ }
22
+
23
+ export const DEFAULT_STYLE = {
24
+ strokeStyle: '#999',
25
+ lineDash: 'solid',
26
+ lineWidth: 1
27
+ }
28
+
29
+ export function buildNewCell(type: string, app: ApplicationContext): TableCell {
30
+ return Model.compile(
31
+ {
32
+ type,
33
+ strokeStyle: 'blue',
34
+ left: 0,
35
+ top: 0,
36
+ width: 1,
37
+ height: 1,
38
+ textWrap: true,
39
+ border: buildBorderStyle(DEFAULT_STYLE, 'all')
40
+ },
41
+ app
42
+ ) as TableCell
43
+ }
44
+
45
+ export function buildCopiedCell(copy: Model, app: ApplicationContext): TableCell {
46
+ var obj = JSON.parse(JSON.stringify(copy))
47
+ delete obj.text
48
+ return Model.compile(obj, app) as TableCell
49
+ }
50
+
51
+ export function buildBorderStyle(style: Style, where: string) {
52
+ return (SIDES[where] || []).reduce((border: { [key: string]: any }, side: string) => {
53
+ border[side] = style
54
+ return border
55
+ }, {} as { [key: string]: any })
56
+ }
57
+
58
+ export function setCellBorder(cell: any, style: Style, where: string) {
59
+ if (!cell) return
60
+ cell.set('border', Object.assign({}, cell.get('border') || {}, buildBorderStyle(style, where)))
61
+ }
62
+
63
+ export function isLeftMost(total: number, columns: number, indices: number[], i: number) {
64
+ return i == 0 || !(i % columns) || indices.indexOf(i - 1) == -1
65
+ }
66
+
67
+ export function isRightMost(total: number, columns: number, indices: number[], i: number) {
68
+ return i == total - 1 || i % columns == columns - 1 || indices.indexOf(i + 1) == -1
69
+ }
70
+
71
+ export function isTopMost(total: number, columns: number, indices: number[], i: number) {
72
+ return i < columns || indices.indexOf(i - columns) == -1
73
+ }
74
+
75
+ export function isBottomMost(total: number, columns: number, indices: number[], i: number) {
76
+ return i > total - columns - 1 || indices.indexOf(i + columns) == -1
77
+ }
78
+
79
+ export function above(columns: number, i: number) {
80
+ return i - columns
81
+ }
82
+
83
+ export function below(columns: number, i: number) {
84
+ return i + columns
85
+ }
86
+
87
+ export function before(columns: number, i: number) {
88
+ return !(i % columns) ? -1 : i - 1
89
+ }
90
+
91
+ export function after(columns: number, i: number) {
92
+ return !((i + 1) % columns) ? -1 : i + 1
93
+ }
94
+
95
+ export function array(value: any, size: number) {
96
+ var arr = []
97
+ for (let i = 0; i < size; i++) arr.push(1)
98
+ return arr
99
+ }
100
+
101
+ export var columnControlHandler = {
102
+ ondragmove: function(point: POINT, index: number, component: Table) {
103
+ var { left, width } = component.textBounds
104
+ var widths_sum = component.widths_sum
105
+
106
+ var widths = component.widths.slice()
107
+
108
+ /* 컨트롤의 원래 위치를 구한다. */
109
+ var origin_pos_unit = widths.slice(0, index + 1).reduce((sum: number, width: number) => sum + width, 0)
110
+ var origin_offset = left + (origin_pos_unit / widths_sum) * width
111
+
112
+ /*
113
+ * point의 좌표는 부모 레이어 기준의 x, y 값이다.
114
+ * 따라서, 도형의 회전을 감안한 좌표로의 변환이 필요하다.
115
+ * Transcoord시에는 point좌표가 부모까지 transcoord되어있는 상태이므로,
116
+ * 컴포넌트자신에 대한 transcoord만 필요하다.(마지막 파라미터를 false로).
117
+ */
118
+ var transcoorded = component.transcoordP2S(point.x, point.y)
119
+ var diff = transcoorded.x - origin_offset
120
+
121
+ var diff_unit = (diff / width) * widths_sum
122
+
123
+ var min_width_unit = (widths_sum / width) * 10 // 10픽셀정도를 최소로
124
+
125
+ if (diff_unit < 0) diff_unit = -Math.min(widths[index] - min_width_unit, -diff_unit)
126
+ else diff_unit = Math.min(widths[index + 1] - min_width_unit, diff_unit)
127
+
128
+ widths[index] = Math.round((widths[index] + diff_unit) * 100) / 100
129
+ widths[index + 1] = Math.round((widths[index + 1] - diff_unit) * 100) / 100
130
+
131
+ component.set('widths', widths)
132
+ }
133
+ }
134
+
135
+ export var rowControlHandler = {
136
+ ondragmove: function(point: POINT, index: number, component: Table) {
137
+ var { top, height } = component.textBounds
138
+ var heights_sum = component.heights_sum
139
+
140
+ var heights = component.heights.slice()
141
+
142
+ /* 컨트롤의 원래 위치를 구한다. */
143
+ index -= component.columns - 1
144
+ var origin_pos_unit = heights.slice(0, index + 1).reduce((sum: number, height: number) => sum + height, 0)
145
+ var origin_offset = top + (origin_pos_unit / heights_sum) * height
146
+
147
+ /*
148
+ * point의 좌표는 부모 레이어 기준의 x, y 값이다.
149
+ * 따라서, 도형의 회전을 감안한 좌표로의 변환이 필요하다.
150
+ * Transcoord시에는 point좌표가 부모까지 transcoord되어있는 상태이므로,
151
+ * 컴포넌트자신에 대한 transcoord만 필요하다.(마지막 파라미터를 false로).
152
+ */
153
+ var transcoorded = component.transcoordP2S(point.x, point.y)
154
+ var diff = transcoorded.y - origin_offset
155
+
156
+ var diff_unit = (diff / height) * heights_sum
157
+
158
+ var min_height_unit = (heights_sum / height) * 10 // 10픽셀정도를 최소로
159
+
160
+ if (diff_unit < 0) diff_unit = -Math.min(heights[index] - min_height_unit, -diff_unit)
161
+ else diff_unit = Math.min(heights[index + 1] - min_height_unit, diff_unit)
162
+
163
+ heights[index] = Math.round((heights[index] + diff_unit) * 100) / 100
164
+ heights[index + 1] = Math.round((heights[index + 1] - diff_unit) * 100) / 100
165
+
166
+ component.set('heights', heights)
167
+ }
168
+ }
package/src/index.ts ADDED
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ export { default as Table } from './table'
5
+ export { default as TableCell } from './table-cell'
6
+ export { default as DataList } from './data-list/data-list'
@@ -0,0 +1,126 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import { Component, Container, Layout, RectPath } from '@hatiolab/things-scene'
5
+
6
+ import Table from './table'
7
+
8
+ type Style = { [style: string]: any }
9
+
10
+ const NATURE = {
11
+ mutable: false,
12
+ resizable: true,
13
+ rotatable: true,
14
+ properties: [
15
+ {
16
+ type: 'editor-table',
17
+ label: '',
18
+ name: '',
19
+ property: {
20
+ merge: true,
21
+ split: true
22
+ }
23
+ },
24
+ {
25
+ type: 'string',
26
+ label: 'data-key',
27
+ name: 'dataKey',
28
+ property: 'dataKey'
29
+ },
30
+ {
31
+ type: 'number',
32
+ label: 'data-index',
33
+ name: 'dataIndex',
34
+ property: 'dataIndex'
35
+ }
36
+ ],
37
+ help: 'scene/component/table-cell'
38
+ }
39
+
40
+ const EMPTY_BORDER = {}
41
+
42
+ function isBottomMost(idx: number, rows: number, columns: number, components: Component[]) {
43
+ return idx >= (rows - 1) * columns || (components[idx + columns] && components[idx + columns].hidden)
44
+ }
45
+
46
+ function isRightMost(idx: number, rows: number, columns: number, components: Component[]) {
47
+ return (idx + 1) % columns == 0 || (components[idx + 1] && components[idx + 1].hidden)
48
+ }
49
+
50
+ /**
51
+ * 1. 스타일을 상속 받아야 함. (cascade-style)
52
+ * 2. 스타일을 동적처리할 수 있음. (로직처리)
53
+ * 3. 데이타를 받을 수 있음.
54
+ */
55
+ export default class TableCell extends RectPath(Component) {
56
+ // export default class TableCell extends Container {
57
+
58
+ // get layout() {
59
+ // return Layout.get(this.get('layout') || 'card')
60
+ // }
61
+
62
+ get nature() {
63
+ return NATURE
64
+ }
65
+
66
+ set merged(merged) {
67
+ this.set('merged', !!merged)
68
+ if (merged) this.set('text', '')
69
+ }
70
+
71
+ get merged() {
72
+ return this.get('merged')
73
+ }
74
+
75
+ set rowspan(rowspan) {
76
+ this.set('rowspan', rowspan)
77
+ }
78
+
79
+ get rowspan() {
80
+ return this.get('rowspan')
81
+ }
82
+
83
+ set colspan(colspan) {
84
+ this.set('colspan', colspan)
85
+ }
86
+
87
+ get colspan() {
88
+ return this.get('colspan')
89
+ }
90
+
91
+ _drawBorder(context: CanvasRenderingContext2D, x: number, y: number, to_x: number, to_y: number, style: Style) {
92
+ if (style && style.strokeStyle && style.lineWidth && style.lineDash) {
93
+ context.beginPath()
94
+ context.moveTo(x, y)
95
+ context.lineTo(to_x, to_y)
96
+ Component.drawStroke(context, style)
97
+ }
98
+ }
99
+
100
+ _draw(context: CanvasRenderingContext2D) {
101
+ var { left, top, width, height } = this.model
102
+
103
+ var border = this.model.border || {}
104
+
105
+ // Cell 채우기.
106
+ context.beginPath()
107
+ context.lineWidth = 0
108
+ context.rect(left, top, width, height)
109
+ this.drawFill(context)
110
+
111
+ // Border 그리기
112
+ var parent = this.parent as Table
113
+ var idx = parent.components.indexOf(this)
114
+ var columns = parent.columns || 1
115
+ var rows = parent.rows || 1
116
+
117
+ this._drawBorder(context, left, top, left + width, top, border.top)
118
+ this._drawBorder(context, left, top + height, left, top, border.left)
119
+ if (isRightMost(idx, rows, columns, parent.components))
120
+ this._drawBorder(context, left + width, top, left + width, top + height, border.right)
121
+ if (isBottomMost(idx, rows, columns, parent.components))
122
+ this._drawBorder(context, left + width, top + height, left, top + height, border.bottom)
123
+ }
124
+ }
125
+
126
+ Component.register('table-cell', TableCell)