@operato/board 8.0.0-alpha.7 → 8.0.0-alpha.9
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/CHANGELOG.md +17 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/ox-board-template-viewer.d.ts +27 -0
- package/dist/src/ox-board-template-viewer.js +178 -0
- package/dist/src/ox-board-template-viewer.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -6
- package/src/index.ts +1 -0
- package/src/ox-board-template-viewer.ts +198 -0
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@operato/board",
|
3
|
-
"version": "8.0.0-alpha.
|
3
|
+
"version": "8.0.0-alpha.9",
|
4
4
|
"description": "Webcomponent for board following open-wc recommendations",
|
5
5
|
"author": "heartyoh",
|
6
6
|
"main": "dist/src/index.js",
|
@@ -26,6 +26,7 @@
|
|
26
26
|
"./ox-board-list.js": "./dist/src/ox-board-list.js",
|
27
27
|
"./ox-board-template-list.js": "./dist/src/ox-board-template-list.js",
|
28
28
|
"./ox-board-viewer.js": "./dist/src/ox-board-viewer.js",
|
29
|
+
"./ox-board-template-viewer.js": "./dist/src/ox-board-template-viewer.js",
|
29
30
|
"./ox-board-player.js": "./dist/src/ox-board-player.js",
|
30
31
|
"./ox-board-modeller.js": "./dist/src/ox-board-modeller.js",
|
31
32
|
"./ox-editor-board-selector.js": "./dist/src/ox-editor-board-selector.js",
|
@@ -57,6 +58,9 @@
|
|
57
58
|
"ox-board-viewer.js": [
|
58
59
|
"./dist/src/ox-board-viewer.d.ts"
|
59
60
|
],
|
61
|
+
"ox-board-template-viewer.js": [
|
62
|
+
"./dist/src/ox-board-template-viewer.d.ts"
|
63
|
+
],
|
60
64
|
"ox-board-player.js": [
|
61
65
|
"./dist/src/ox-board-player.d.ts"
|
62
66
|
],
|
@@ -95,16 +99,16 @@
|
|
95
99
|
"dependencies": {
|
96
100
|
"@material/web": "^2.0.0",
|
97
101
|
"@open-wc/scoped-elements": "^2.1.3",
|
98
|
-
"@operato/app": "^8.0.0-alpha.
|
99
|
-
"@operato/data-grist": "^8.0.0-alpha.
|
100
|
-
"@operato/font": "^8.0.0-alpha.
|
102
|
+
"@operato/app": "^8.0.0-alpha.9",
|
103
|
+
"@operato/data-grist": "^8.0.0-alpha.8",
|
104
|
+
"@operato/font": "^8.0.0-alpha.9",
|
101
105
|
"@operato/graphql": "^8.0.0-alpha.0",
|
102
106
|
"@operato/i18n": "^8.0.0-alpha.0",
|
103
107
|
"@operato/input": "^8.0.0-alpha.4",
|
104
108
|
"@operato/layout": "^8.0.0-alpha.4",
|
105
109
|
"@operato/markdown": "^8.0.0-alpha.4",
|
106
110
|
"@operato/popup": "^8.0.0-alpha.4",
|
107
|
-
"@operato/property-editor": "^8.0.0-alpha.
|
111
|
+
"@operato/property-editor": "^8.0.0-alpha.9",
|
108
112
|
"@operato/styles": "^8.0.0-alpha.4",
|
109
113
|
"@operato/utils": "^8.0.0-alpha.0",
|
110
114
|
"@polymer/paper-dropdown-menu": "^3.2.0",
|
@@ -155,5 +159,5 @@
|
|
155
159
|
"prettier --write"
|
156
160
|
]
|
157
161
|
},
|
158
|
-
"gitHead": "
|
162
|
+
"gitHead": "2347cd63c237f73d1dae009e739b3c408afd58f3"
|
159
163
|
}
|
package/src/index.ts
CHANGED
@@ -0,0 +1,198 @@
|
|
1
|
+
import '@material/web/icon/icon.js'
|
2
|
+
import '@material/web/fab/fab.js'
|
3
|
+
|
4
|
+
import { css, html, LitElement, PropertyValues } from 'lit'
|
5
|
+
import { customElement, property, query, state } from 'lit/decorators.js'
|
6
|
+
|
7
|
+
import { create, SCENE_MODE } from '@hatiolab/things-scene'
|
8
|
+
import { ScrollbarStyles } from '@operato/styles'
|
9
|
+
|
10
|
+
@customElement('ox-board-template-viewer')
|
11
|
+
export class BoardTemplateViewer extends LitElement {
|
12
|
+
static styles = [
|
13
|
+
ScrollbarStyles,
|
14
|
+
css`
|
15
|
+
:host {
|
16
|
+
display: flex;
|
17
|
+
flex-direction: column;
|
18
|
+
|
19
|
+
position: relative;
|
20
|
+
|
21
|
+
width: 100%; /* 전체화면보기를 위해서 필요함. */
|
22
|
+
overflow: hidden;
|
23
|
+
}
|
24
|
+
|
25
|
+
#target {
|
26
|
+
flex: 1;
|
27
|
+
|
28
|
+
width: 100%; /* 전체화면보기를 위해서 필요함. */
|
29
|
+
height: 100%;
|
30
|
+
|
31
|
+
outline: 0;
|
32
|
+
}
|
33
|
+
|
34
|
+
@media print {
|
35
|
+
md-fab,
|
36
|
+
md-icon {
|
37
|
+
display: none;
|
38
|
+
}
|
39
|
+
}
|
40
|
+
`
|
41
|
+
]
|
42
|
+
|
43
|
+
@property({ type: Object }) boardTemplate: any = {}
|
44
|
+
|
45
|
+
@state() _scene: any = null
|
46
|
+
|
47
|
+
@query('#target') _target!: HTMLElement
|
48
|
+
|
49
|
+
render() {
|
50
|
+
return html` <div id="target"></div> `
|
51
|
+
}
|
52
|
+
|
53
|
+
private resizeHandler = () => {
|
54
|
+
this._scene && this._scene.fit()
|
55
|
+
}
|
56
|
+
|
57
|
+
connectedCallback() {
|
58
|
+
super.connectedCallback()
|
59
|
+
|
60
|
+
window.addEventListener('resize', this.resizeHandler)
|
61
|
+
|
62
|
+
window.addEventListener('orientationchange', this.resizeHandler)
|
63
|
+
}
|
64
|
+
|
65
|
+
disconnectedCallback() {
|
66
|
+
window.removeEventListener('resize', this.resizeHandler)
|
67
|
+
window.removeEventListener('orientationchange', this.resizeHandler)
|
68
|
+
|
69
|
+
super.disconnectedCallback()
|
70
|
+
|
71
|
+
this.closeScene()
|
72
|
+
}
|
73
|
+
|
74
|
+
updated(changes: PropertyValues<this>) {
|
75
|
+
if (changes.has('boardTemplate')) {
|
76
|
+
this.closeScene()
|
77
|
+
|
78
|
+
if (this.boardTemplate && this.boardTemplate.id) {
|
79
|
+
this.initScene()
|
80
|
+
}
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
initScene() {
|
85
|
+
if (!this.boardTemplate || !this.boardTemplate.id) return
|
86
|
+
|
87
|
+
this._scene = create({
|
88
|
+
model: {
|
89
|
+
...this.boardTemplate.model
|
90
|
+
},
|
91
|
+
mode: SCENE_MODE.VIEW
|
92
|
+
})
|
93
|
+
|
94
|
+
this.setupScene({ id: this.boardTemplate.id, scene: this._scene })
|
95
|
+
}
|
96
|
+
|
97
|
+
closeScene() {
|
98
|
+
if (this._scene) {
|
99
|
+
this._scene.target = null
|
100
|
+
this._scene.release && this._scene.release()
|
101
|
+
|
102
|
+
this._scene = null
|
103
|
+
}
|
104
|
+
}
|
105
|
+
|
106
|
+
releaseScene() {
|
107
|
+
this.closeScene()
|
108
|
+
}
|
109
|
+
|
110
|
+
setupScene({ id, scene }: { id: string; scene: any }) {
|
111
|
+
this._scene = scene
|
112
|
+
|
113
|
+
const backgroundColor = this._scene?.root.state.fillStyle
|
114
|
+
if (typeof backgroundColor === 'string') {
|
115
|
+
this.style.backgroundColor = backgroundColor
|
116
|
+
} else {
|
117
|
+
this.style.backgroundColor = 'initial'
|
118
|
+
}
|
119
|
+
|
120
|
+
/* scene의 기존 target을 보관한다. */
|
121
|
+
|
122
|
+
this._scene.fit(this._scene.fitMode)
|
123
|
+
this._scene.target = this._target
|
124
|
+
}
|
125
|
+
|
126
|
+
/* event handlers */
|
127
|
+
async getSceneImageData(base64 = false) {
|
128
|
+
if (!this._scene) {
|
129
|
+
return
|
130
|
+
}
|
131
|
+
|
132
|
+
var { width, height } = this._scene.model
|
133
|
+
var pixelRatio = window.devicePixelRatio
|
134
|
+
|
135
|
+
// 1. Scene의 바운드에 근거하여, 오프스크린 캔바스를 만든다.
|
136
|
+
var canvas = document.createElement('canvas')
|
137
|
+
canvas.width = Number(width)
|
138
|
+
canvas.height = Number(height)
|
139
|
+
|
140
|
+
var root = this._scene.root
|
141
|
+
// 2. 모델레이어의 원래 위치와 스케일을 저장한다.
|
142
|
+
var translate = root.get('translate')
|
143
|
+
var scale = root.get('scale')
|
144
|
+
|
145
|
+
// 3. 위치와 스케일 기본 설정.
|
146
|
+
root.set('translate', { x: 0, y: 0 })
|
147
|
+
root.set('scale', { x: 1 / pixelRatio, y: 1 / pixelRatio })
|
148
|
+
|
149
|
+
// 4. 오프스크린 캔바스의 Context2D를 구한뒤, 모델레이어를 그 위에 그린다.
|
150
|
+
var context = canvas.getContext('2d')
|
151
|
+
|
152
|
+
root.draw(context)
|
153
|
+
|
154
|
+
root.set('translate', translate)
|
155
|
+
root.set('scale', scale)
|
156
|
+
|
157
|
+
var data = base64 ? canvas.toDataURL() : context!.getImageData(0, 0, width, height).data
|
158
|
+
|
159
|
+
return {
|
160
|
+
width,
|
161
|
+
height,
|
162
|
+
data
|
163
|
+
}
|
164
|
+
}
|
165
|
+
|
166
|
+
async printTrick(image: string) {
|
167
|
+
var viewTarget: HTMLElement | null = null
|
168
|
+
var printTarget: HTMLImageElement | null = null
|
169
|
+
|
170
|
+
if (!image) {
|
171
|
+
image = (await this.getSceneImageData(true))?.data as string
|
172
|
+
}
|
173
|
+
|
174
|
+
printTarget = document.createElement('img')
|
175
|
+
printTarget.id = 'target'
|
176
|
+
printTarget.src = image
|
177
|
+
printTarget.style.width = '100%'
|
178
|
+
printTarget.style.height = '100%'
|
179
|
+
|
180
|
+
const x = (mql: MediaQueryListEvent) => {
|
181
|
+
if (mql.matches) {
|
182
|
+
if (!viewTarget) {
|
183
|
+
viewTarget = (this.renderRoot as ShadowRoot)!.getElementById('target')
|
184
|
+
this.renderRoot.replaceChild(printTarget!, viewTarget!)
|
185
|
+
}
|
186
|
+
} else {
|
187
|
+
this.renderRoot.replaceChild(viewTarget!, printTarget!)
|
188
|
+
printTarget!.remove()
|
189
|
+
mediaQueryList.removeEventListener('change', x)
|
190
|
+
}
|
191
|
+
}
|
192
|
+
|
193
|
+
if (window.matchMedia) {
|
194
|
+
var mediaQueryList = window.matchMedia('print')
|
195
|
+
mediaQueryList.addEventListener('change', x)
|
196
|
+
}
|
197
|
+
}
|
198
|
+
}
|