@things-factory/board-ui 6.1.195 → 6.1.196
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/client/board-list/board-tile-list.js +3 -3
- package/client/board-list/play-group-bar.ts +143 -0
- package/client/data-grist/board-renderer.ts +2 -1
- package/client/pages/board-list-page.js +2 -2
- package/client/pages/play-list-page.js +5 -5
- package/client/viewparts/board-info-link.ts +8 -2
- package/client/viewparts/board-info.ts +4 -4
- package/client/viewparts/link-builder.ts +16 -2
- package/client/viewparts/play-group-info-link.ts +8 -2
- package/client/viewparts/play-group-info.ts +3 -3
- package/dist-client/board-list/board-tile-list.d.ts +1 -1
- package/dist-client/board-list/board-tile-list.js +3 -3
- package/dist-client/board-list/board-tile-list.js.map +1 -1
- package/dist-client/board-list/play-group-bar.d.ts +14 -9
- package/dist-client/board-list/play-group-bar.js +87 -73
- package/dist-client/board-list/play-group-bar.js.map +1 -1
- package/dist-client/data-grist/board-renderer.js +2 -1
- package/dist-client/data-grist/board-renderer.js.map +1 -1
- package/dist-client/pages/board-list-page.js +2 -2
- package/dist-client/pages/board-list-page.js.map +1 -1
- package/dist-client/pages/play-list-page.js +5 -5
- package/dist-client/pages/play-list-page.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/viewparts/board-info-link.d.ts +4 -1
- package/dist-client/viewparts/board-info-link.js +11 -4
- package/dist-client/viewparts/board-info-link.js.map +1 -1
- package/dist-client/viewparts/board-info.d.ts +4 -1
- package/dist-client/viewparts/board-info.js +7 -6
- package/dist-client/viewparts/board-info.js.map +1 -1
- package/dist-client/viewparts/link-builder.d.ts +3 -1
- package/dist-client/viewparts/link-builder.js +23 -3
- package/dist-client/viewparts/link-builder.js.map +1 -1
- package/dist-client/viewparts/play-group-info-link.d.ts +4 -1
- package/dist-client/viewparts/play-group-info-link.js +11 -4
- package/dist-client/viewparts/play-group-info-link.js.map +1 -1
- package/dist-client/viewparts/play-group-info.d.ts +4 -1
- package/dist-client/viewparts/play-group-info.js +6 -5
- package/dist-client/viewparts/play-group-info.js.map +1 -1
- package/package.json +2 -2
- package/translations/en.json +1 -0
- package/translations/ja.json +1 -0
- package/translations/ko.json +1 -0
- package/translations/ms.json +1 -0
- package/translations/zh.json +1 -0
- package/client/board-list/play-group-bar.js +0 -147
|
@@ -206,7 +206,7 @@ export default class BoardTileList extends LitElement {
|
|
|
206
206
|
iconBtn
|
|
207
207
|
info
|
|
208
208
|
@click=${e => {
|
|
209
|
-
this.infoBoard(board
|
|
209
|
+
this.infoBoard(board)
|
|
210
210
|
e.preventDefault()
|
|
211
211
|
}}
|
|
212
212
|
>info</mwc-icon
|
|
@@ -237,10 +237,10 @@ export default class BoardTileList extends LitElement {
|
|
|
237
237
|
)
|
|
238
238
|
}
|
|
239
239
|
|
|
240
|
-
infoBoard(
|
|
240
|
+
infoBoard(board) {
|
|
241
241
|
this.dispatchEvent(
|
|
242
242
|
new CustomEvent('info-board', {
|
|
243
|
-
detail:
|
|
243
|
+
detail: board
|
|
244
244
|
})
|
|
245
245
|
)
|
|
246
246
|
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import '@material/mwc-icon'
|
|
2
|
+
|
|
3
|
+
import { css, html, LitElement } from 'lit'
|
|
4
|
+
import { customElement, property, state } from 'lit/decorators.js'
|
|
5
|
+
import ScrollBooster from 'scrollbooster'
|
|
6
|
+
|
|
7
|
+
import { longpressable } from '@things-factory/utils'
|
|
8
|
+
|
|
9
|
+
@customElement('play-group-bar')
|
|
10
|
+
export default class PlayGroupBar extends LitElement {
|
|
11
|
+
static styles = [
|
|
12
|
+
css`
|
|
13
|
+
:host {
|
|
14
|
+
background-color: var(--group-bar-background-color);
|
|
15
|
+
|
|
16
|
+
overflow-x: hidden;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
ul {
|
|
20
|
+
display: flex;
|
|
21
|
+
list-style: none;
|
|
22
|
+
margin: 0;
|
|
23
|
+
padding: 0;
|
|
24
|
+
white-space: nowrap;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
li {
|
|
28
|
+
display: inline-block;
|
|
29
|
+
padding: 0px 3px;
|
|
30
|
+
|
|
31
|
+
border-bottom: var(--group-bar-line);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
li[active] {
|
|
35
|
+
border-color: var(--group-bar-active-line-color);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
li a {
|
|
39
|
+
display: block;
|
|
40
|
+
padding: 5px 4px 1px 4px;
|
|
41
|
+
text-decoration: none;
|
|
42
|
+
font: var(--group-bar-textbutton);
|
|
43
|
+
color: rgba(255, 255, 255, 0.8);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
li[active] a {
|
|
47
|
+
font: var(--group-bar-textbutton-active);
|
|
48
|
+
color: rgba(255, 255, 255, 1);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
li[padding] {
|
|
52
|
+
flex: 1;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
li[add] {
|
|
56
|
+
padding: 5px 4px 1px 4px;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
li[add] * {
|
|
60
|
+
color: rgba(255, 255, 255, 0.5);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
mwc-icon {
|
|
64
|
+
vertical-align: middle;
|
|
65
|
+
}
|
|
66
|
+
`
|
|
67
|
+
]
|
|
68
|
+
|
|
69
|
+
@property({ type: Array }) groups: { id: string; name: string }[] = []
|
|
70
|
+
@property({ type: String }) groupId: string = ''
|
|
71
|
+
@property({ type: String, attribute: 'target-page' }) targetPage: string = ''
|
|
72
|
+
|
|
73
|
+
private __sb?: ScrollBooster
|
|
74
|
+
|
|
75
|
+
render() {
|
|
76
|
+
return html`
|
|
77
|
+
<ul>
|
|
78
|
+
${(this.groups || []).map(
|
|
79
|
+
group => html`
|
|
80
|
+
<li ?active=${this.groupId === group.id} @long-press=${e => this._infoGroup(group)}>
|
|
81
|
+
<a href=${`${this.targetPage}/${group.id}`}>${group.name}</a>
|
|
82
|
+
</li>
|
|
83
|
+
`
|
|
84
|
+
)}
|
|
85
|
+
|
|
86
|
+
<li padding></li>
|
|
87
|
+
|
|
88
|
+
<li add>
|
|
89
|
+
<mwc-icon @click=${e => this._infoGroup()}>add</mwc-icon>
|
|
90
|
+
</li>
|
|
91
|
+
</ul>
|
|
92
|
+
`
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
_infoGroup(group?: { id: string; name: string }) {
|
|
96
|
+
this.dispatchEvent(
|
|
97
|
+
new CustomEvent('info-play-group', {
|
|
98
|
+
detail: group
|
|
99
|
+
})
|
|
100
|
+
)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
_onWheelEvent(e) {
|
|
104
|
+
var delta = Math.max(-1, Math.min(1, e.wheelDelta || -e.detail))
|
|
105
|
+
this.scrollLeft -= delta * 40
|
|
106
|
+
|
|
107
|
+
e.preventDefault()
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
_onClickAdd(e) {
|
|
111
|
+
// TODO Implements
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
updated(change) {
|
|
115
|
+
if (change.has('groups')) {
|
|
116
|
+
/* groups가 바뀔 때마다, contents의 폭이 달라지므로, 다시 폭을 계산해준다. */
|
|
117
|
+
this.__sb && this.__sb.updateMetrics()
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (change.has('groupId')) {
|
|
121
|
+
var active = this.renderRoot.querySelector('li[active]')
|
|
122
|
+
active && active.scrollIntoView()
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
firstUpdated() {
|
|
127
|
+
var scrollTarget = this.renderRoot.querySelector('ul')
|
|
128
|
+
|
|
129
|
+
/* long-press */
|
|
130
|
+
longpressable(scrollTarget)
|
|
131
|
+
|
|
132
|
+
scrollTarget!.addEventListener('mousewheel', this._onWheelEvent.bind(this), false)
|
|
133
|
+
|
|
134
|
+
this.__sb = new ScrollBooster({
|
|
135
|
+
viewport: this,
|
|
136
|
+
content: scrollTarget,
|
|
137
|
+
mode: 'x',
|
|
138
|
+
onUpdate: data => {
|
|
139
|
+
this.scrollLeft = data.position.x
|
|
140
|
+
}
|
|
141
|
+
})
|
|
142
|
+
}
|
|
143
|
+
}
|
|
@@ -281,11 +281,11 @@ class BoardListPage extends localize(i18next)(connect(store)(InfiniteScrollable(
|
|
|
281
281
|
})
|
|
282
282
|
}
|
|
283
283
|
|
|
284
|
-
async onInfoBoard(
|
|
284
|
+
async onInfoBoard(board) {
|
|
285
285
|
openOverlay('viewpart-info', {
|
|
286
286
|
template: html`
|
|
287
287
|
<board-info
|
|
288
|
-
.
|
|
288
|
+
.board=${board}
|
|
289
289
|
.groupId=${this.groupId}
|
|
290
290
|
?enable-modeller=${this.boardPermissions?.includes('Modeller')}
|
|
291
291
|
@clone-board=${e => this.onCloneBoard(e.detail)}
|
|
@@ -81,7 +81,7 @@ class PlayListPage extends localize(i18next)(connect(store)(PageView)) {
|
|
|
81
81
|
<play-group-bar
|
|
82
82
|
.groups=${this.groups}
|
|
83
83
|
.groupId=${this.groupId}
|
|
84
|
-
|
|
84
|
+
target-page="play-list"
|
|
85
85
|
@info-play-group=${e => this.onInfoPlayGroup(e.detail)}
|
|
86
86
|
></play-group-bar>
|
|
87
87
|
|
|
@@ -213,11 +213,11 @@ class PlayListPage extends localize(i18next)(connect(store)(PageView)) {
|
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
215
|
|
|
216
|
-
async onInfoBoard(
|
|
216
|
+
async onInfoBoard(board) {
|
|
217
217
|
openOverlay('viewpart-info', {
|
|
218
218
|
template: html`
|
|
219
219
|
<board-info
|
|
220
|
-
.
|
|
220
|
+
.board=${board}
|
|
221
221
|
.groupId=${this.groupId}
|
|
222
222
|
@update-board=${e => this.onUpdateBoard(e.detail)}
|
|
223
223
|
@delete-board=${e => this.onDeleteBoard(e.detail)}
|
|
@@ -228,11 +228,11 @@ class PlayListPage extends localize(i18next)(connect(store)(PageView)) {
|
|
|
228
228
|
})
|
|
229
229
|
}
|
|
230
230
|
|
|
231
|
-
async onInfoPlayGroup(
|
|
231
|
+
async onInfoPlayGroup(group) {
|
|
232
232
|
openOverlay('viewpart-info', {
|
|
233
233
|
template: html`
|
|
234
234
|
<play-group-info
|
|
235
|
-
.
|
|
235
|
+
.playGroup=${group}
|
|
236
236
|
@update-play-group=${e => this.onUpdatePlayGroup(e.detail)}
|
|
237
237
|
@delete-play-group=${e => this.onDeletePlayGroup(e.detail)}
|
|
238
238
|
@create-play-group=${e => this.onCreatePlayGroup(e.detail)}
|
|
@@ -29,9 +29,15 @@ export class BoardInfoLink extends LitElement {
|
|
|
29
29
|
`
|
|
30
30
|
]
|
|
31
31
|
|
|
32
|
-
@property({ type:
|
|
32
|
+
@property({ type: Object }) board?: { id: string; name: string }
|
|
33
33
|
|
|
34
34
|
render() {
|
|
35
|
-
return html`
|
|
35
|
+
return html`
|
|
36
|
+
<link-builder
|
|
37
|
+
command="headless-full"
|
|
38
|
+
target-id=${this.board?.id || ''}
|
|
39
|
+
target-name=${this.board?.name || ''}
|
|
40
|
+
></link-builder>
|
|
41
|
+
`
|
|
36
42
|
}
|
|
37
43
|
}
|
|
@@ -58,7 +58,7 @@ export class BoardInfo extends LitElement {
|
|
|
58
58
|
`
|
|
59
59
|
]
|
|
60
60
|
|
|
61
|
-
@property({ type:
|
|
61
|
+
@property({ type: Object }) board?: { id: string; name: string }
|
|
62
62
|
@property({ type: Boolean, attribute: 'enable-modeller' }) enableModeller?: boolean
|
|
63
63
|
|
|
64
64
|
@state() tab: string = 'basic'
|
|
@@ -73,12 +73,12 @@ export class BoardInfo extends LitElement {
|
|
|
73
73
|
<div content>
|
|
74
74
|
${this.tab == 'basic'
|
|
75
75
|
? html`<board-basic-info
|
|
76
|
-
boardId=${ifDefined(this.
|
|
76
|
+
boardId=${ifDefined(this.board?.id)}
|
|
77
77
|
?enable-modeller=${this.enableModeller}
|
|
78
78
|
></board-basic-info>`
|
|
79
79
|
: this.tab == 'versions'
|
|
80
|
-
? html`<board-versions boardId=${ifDefined(this.
|
|
81
|
-
: html`<board-info-link
|
|
80
|
+
? html`<board-versions boardId=${ifDefined(this.board?.id)}></board-versions>`
|
|
81
|
+
: html`<board-info-link .board=${this.board}></board-info-link>`}
|
|
82
82
|
</div>
|
|
83
83
|
`
|
|
84
84
|
}
|
|
@@ -83,13 +83,15 @@ export class LinkBuilder extends LitElement {
|
|
|
83
83
|
]
|
|
84
84
|
|
|
85
85
|
@property({ type: String, attribute: true }) command?: string
|
|
86
|
-
@property({ type: String, attribute:
|
|
86
|
+
@property({ type: String, attribute: 'target-id' }) targetId?: string
|
|
87
|
+
@property({ type: String, attribute: 'target-name' }) targetName?: string
|
|
87
88
|
|
|
88
89
|
@state() link?: string
|
|
89
90
|
@state() keyvalues: any
|
|
90
91
|
@state() appliances: any[] = []
|
|
91
92
|
@state() targetAppliance: any
|
|
92
93
|
@state() key?: string
|
|
94
|
+
@state() byname: boolean = false
|
|
93
95
|
|
|
94
96
|
private clipboard?: Clipboard
|
|
95
97
|
|
|
@@ -132,6 +134,15 @@ export class LinkBuilder extends LitElement {
|
|
|
132
134
|
<span warn>To add an access token, you need to be a domain owner or have security query permissions.</span>
|
|
133
135
|
`
|
|
134
136
|
)}
|
|
137
|
+
|
|
138
|
+
<div>
|
|
139
|
+
<input
|
|
140
|
+
type="checkbox"
|
|
141
|
+
id="by-name"
|
|
142
|
+
@change=${(e: Event) => (this.byname = !!(e.target as HTMLInputElement)?.checked)}
|
|
143
|
+
/>
|
|
144
|
+
<label for="by-name">${i18next.t('label.headless-link by-name')}</label>
|
|
145
|
+
</div>
|
|
135
146
|
</div>
|
|
136
147
|
`
|
|
137
148
|
}
|
|
@@ -147,8 +158,11 @@ export class LinkBuilder extends LitElement {
|
|
|
147
158
|
}
|
|
148
159
|
|
|
149
160
|
updated(changes: PropertyValues<this>) {
|
|
161
|
+
const command = (this.command || '') + (this.byname ? '-by-name' : '')
|
|
162
|
+
const target = encodeURIComponent((this.byname ? this.targetName : this.targetId) || '')
|
|
163
|
+
|
|
150
164
|
const baseUrl = document.querySelector('base')?.href
|
|
151
|
-
const fullUrl = new URL(
|
|
165
|
+
const fullUrl = new URL(command + '/' + target, baseUrl).href
|
|
152
166
|
|
|
153
167
|
const query = {
|
|
154
168
|
...(this.key ? { [this.key]: JSON.stringify(this.keyvalues) } : this.keyvalues),
|
|
@@ -32,9 +32,15 @@ export class PlayGroupInfoLink extends LitElement {
|
|
|
32
32
|
`
|
|
33
33
|
]
|
|
34
34
|
|
|
35
|
-
@property({ type:
|
|
35
|
+
@property({ type: Object }) playGroup?: { id: string; name: string }
|
|
36
36
|
|
|
37
37
|
render() {
|
|
38
|
-
return html`
|
|
38
|
+
return html`
|
|
39
|
+
<link-builder
|
|
40
|
+
command="headless-player"
|
|
41
|
+
target-id=${this.playGroup?.id || ''}
|
|
42
|
+
target-name=${this.playGroup?.name || ''}
|
|
43
|
+
></link-builder>
|
|
44
|
+
`
|
|
39
45
|
}
|
|
40
46
|
}
|
|
@@ -57,7 +57,7 @@ export class PlayGroupInfo extends LitElement {
|
|
|
57
57
|
`
|
|
58
58
|
]
|
|
59
59
|
|
|
60
|
-
@property({ type:
|
|
60
|
+
@property({ type: Object }) playGroup?: { id: string; name: string }
|
|
61
61
|
|
|
62
62
|
@state() tab: string = 'basic'
|
|
63
63
|
|
|
@@ -69,8 +69,8 @@ export class PlayGroupInfo extends LitElement {
|
|
|
69
69
|
</div>
|
|
70
70
|
<div content>
|
|
71
71
|
${this.tab == 'basic'
|
|
72
|
-
? html`<play-group-info-basic playGroupId=${ifDefined(this.
|
|
73
|
-
: html`<play-group-info-link
|
|
72
|
+
? html`<play-group-info-basic playGroupId=${ifDefined(this.playGroup?.id)}></play-group-info-basic>`
|
|
73
|
+
: html`<play-group-info-link .playGroup=${this.playGroup}></play-group-info-link>`}
|
|
74
74
|
</div>
|
|
75
75
|
`
|
|
76
76
|
}
|
|
@@ -19,7 +19,7 @@ export default class BoardTileList extends LitElement {
|
|
|
19
19
|
render(): import("lit-html").TemplateResult<1>;
|
|
20
20
|
updated(changes: any): void;
|
|
21
21
|
onCreateBoard(e: any): void;
|
|
22
|
-
infoBoard(
|
|
22
|
+
infoBoard(board: any): void;
|
|
23
23
|
removeFavorite(boardId: any): Promise<void>;
|
|
24
24
|
addFavorite(boardId: any): Promise<void>;
|
|
25
25
|
refreshFavorites(): Promise<void>;
|
|
@@ -185,7 +185,7 @@ export default class BoardTileList extends LitElement {
|
|
|
185
185
|
iconBtn
|
|
186
186
|
info
|
|
187
187
|
@click=${e => {
|
|
188
|
-
this.infoBoard(board
|
|
188
|
+
this.infoBoard(board);
|
|
189
189
|
e.preventDefault();
|
|
190
190
|
}}
|
|
191
191
|
>info</mwc-icon
|
|
@@ -209,9 +209,9 @@ export default class BoardTileList extends LitElement {
|
|
|
209
209
|
detail: e.detail
|
|
210
210
|
}));
|
|
211
211
|
}
|
|
212
|
-
infoBoard(
|
|
212
|
+
infoBoard(board) {
|
|
213
213
|
this.dispatchEvent(new CustomEvent('info-board', {
|
|
214
|
-
detail:
|
|
214
|
+
detail: board
|
|
215
215
|
}));
|
|
216
216
|
}
|
|
217
217
|
async removeFavorite(boardId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-tile-list.js","sourceRoot":"","sources":["../../client/board-list/board-tile-list.js"],"names":[],"mappings":"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","sourcesContent":["import '@operato/board/ox-board-creation-card.js'\nimport '@material/mwc-icon'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { keyed } from 'lit/directives/keyed.js'\n\nimport { client } from '@things-factory/shell'\n\nexport default class BoardTileList extends LitElement {\n static get styles() {\n return [\n css`\n :host {\n overflow: auto;\n padding: var(--popup-content-padding);\n display: grid;\n\n grid-template-columns: var(--card-list-template);\n grid-auto-rows: var(--card-list-rows-height);\n grid-gap: 20px;\n --mdc-button-horizontal-padding: var(--padding-default);\n }\n\n [card] {\n position: relative;\n align-items: center;\n overflow: hidden;\n }\n\n [card][create] {\n overflow: visible;\n background-color: initial;\n }\n\n [card] > a {\n display: flex;\n }\n\n [card]:hover {\n cursor: pointer;\n }\n\n [name] {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n margin-top: var(--margin-narrow);\n width: calc(100% - 45px);\n color: var(--primary-text-color);\n font-weight: bolder;\n font-size: var(--fontsize-small);\n }\n\n img {\n display: block;\n\n margin: auto;\n max-width: 100%;\n max-height: 100%;\n }\n\n mwc-icon[iconBtn] {\n float: right;\n margin-top: -20px;\n margin-left: 2px;\n color: var(--board-list-star-color);\n font-size: 1.4em;\n }\n mwc-icon[info] {\n color: var(--primary-color);\n }\n\n mwc-icon[iconBtn][favored],\n mwc-icon[info]:hover {\n color: var(--board-list-star-active-color);\n }\n\n a {\n display: block;\n border-radius: var(--card-list-border-radius);\n border: var(--border-dark-color);\n box-sizing: border-box;\n background-color: var(--card-list-background-color);\n margin: 0px;\n height: calc(100% - 25px);\n }\n\n :host > *:hover [info] {\n opacity: 1;\n -webkit-transition: opacity 0.8s;\n -moz-transition: opacity 0.8s;\n -o-transition: opacity 0.8s;\n transition: opacity 0.8s;\n }\n\n [draggable='true'] {\n cursor: grab;\n }\n\n @media screen and (max-width: 800px), screen and (max-height: 600px) {\n ox-board-creation-card {\n display: none;\n }\n }\n `\n ]\n }\n\n static get properties() {\n return {\n creatable: {\n type: Boolean,\n attribute: 'creatable'\n },\n boards: Array,\n favorites: Array,\n groups: Array,\n group: String,\n reorderable: {\n type: Boolean,\n attribute: 'reorderable'\n }\n }\n }\n\n draggingItem\n\n connectedCallback() {\n super.connectedCallback()\n\n if (this.reorderable) {\n this.renderRoot.addEventListener('dragstart', e => {\n // if (!e.target.getAttribute('draggable')) {\n // e.preventDefault()\n // }\n\n // this.draggedItem = e.target\n this.draggedItem = e.target.closest('[card]')\n e.dataTransfer.setData('text/plain', e.target.innerHTML)\n })\n\n this.renderRoot.addEventListener('dragover', e => {\n e.preventDefault()\n const targetItem = e.target.closest('[card]')\n if (targetItem !== this.draggedItem) {\n const targetRect = targetItem.getBoundingClientRect()\n const mousePos = e.clientX - targetRect.left\n\n if (mousePos < targetRect.width / 2) {\n // 마우스 위치가 아이템 좌측 반절에 있을 때\n this.renderRoot.insertBefore(this.draggedItem, targetItem)\n } else {\n // 마우스 위치가 아이템 우측 반절에 있을 때\n this.renderRoot.insertBefore(this.draggedItem, targetItem.nextSibling)\n }\n }\n })\n\n this.renderRoot.addEventListener('drop', e => {\n e.preventDefault()\n\n const boardIds = Array.from(this.renderRoot.querySelectorAll('[card]'))\n .map(board => board.getAttribute('id'))\n .filter(Boolean)\n\n this.dispatchEvent(\n new CustomEvent('reordered', {\n detail: {\n groupId: this.group,\n boardIds\n }\n })\n )\n })\n }\n }\n\n render() {\n var boards = this.boards || []\n\n return html`\n ${this.creatable\n ? html`\n <ox-board-creation-card\n .groups=${this.groups}\n .defaultGroup=${this.group}\n @create-board=${e => this.onCreateBoard(e)}\n card\n create\n ></ox-board-creation-card>\n `\n : html``}\n ${keyed(\n Date.now(),\n boards.map(\n board =>\n html`\n <div card draggable=\"true\" id=${board.id}>\n <a href=\"board-viewer/${board.id}\"> <img src=${board.thumbnail} /> </a>\n\n <div name>${board.name}</div>\n <!-- <div description>${board.description}</div> -->\n\n <mwc-icon\n iconBtn\n info\n @click=${e => {\n this.infoBoard(board.id)\n e.preventDefault()\n }}\n >info</mwc-icon\n >\n\n ${(this.favorites || []).includes(board.id)\n ? html` <mwc-icon iconBtn favored @click=${e => this.removeFavorite(board.id)}>star</mwc-icon> `\n : html` <mwc-icon iconBtn @click=${e => this.addFavorite(board.id)}>star_border</mwc-icon> `}\n </div>\n `\n )\n )}\n `\n }\n\n updated(changes) {\n var creationCard = this.shadowRoot.querySelector('ox-board-creation-card')\n if (creationCard) {\n creationCard.reset()\n }\n }\n\n onCreateBoard(e) {\n this.dispatchEvent(\n new CustomEvent('create-board', {\n detail: e.detail\n })\n )\n }\n\n infoBoard(boardId) {\n this.dispatchEvent(\n new CustomEvent('info-board', {\n detail: boardId\n })\n )\n }\n\n async removeFavorite(boardId) {\n await client.query({\n query: gql`\n mutation {\n deleteFavorite(routing: \"${boardId}\")\n }\n `\n })\n\n this.refreshFavorites()\n }\n\n async addFavorite(boardId) {\n await client.query({\n query: gql`\n mutation {\n createFavorite(favorite: {\n routing: \"${boardId}\"\n }) {\n id\n routing\n }\n }\n `\n })\n\n this.refreshFavorites()\n }\n\n async refreshFavorites() {\n this.dispatchEvent(new CustomEvent('refresh-favorites'))\n }\n}\n\nwindow.customElements.define('board-tile-list', BoardTileList)\n"]}
|
|
1
|
+
{"version":3,"file":"board-tile-list.js","sourceRoot":"","sources":["../../client/board-list/board-tile-list.js"],"names":[],"mappings":"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","sourcesContent":["import '@operato/board/ox-board-creation-card.js'\nimport '@material/mwc-icon'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { keyed } from 'lit/directives/keyed.js'\n\nimport { client } from '@things-factory/shell'\n\nexport default class BoardTileList extends LitElement {\n static get styles() {\n return [\n css`\n :host {\n overflow: auto;\n padding: var(--popup-content-padding);\n display: grid;\n\n grid-template-columns: var(--card-list-template);\n grid-auto-rows: var(--card-list-rows-height);\n grid-gap: 20px;\n --mdc-button-horizontal-padding: var(--padding-default);\n }\n\n [card] {\n position: relative;\n align-items: center;\n overflow: hidden;\n }\n\n [card][create] {\n overflow: visible;\n background-color: initial;\n }\n\n [card] > a {\n display: flex;\n }\n\n [card]:hover {\n cursor: pointer;\n }\n\n [name] {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n margin-top: var(--margin-narrow);\n width: calc(100% - 45px);\n color: var(--primary-text-color);\n font-weight: bolder;\n font-size: var(--fontsize-small);\n }\n\n img {\n display: block;\n\n margin: auto;\n max-width: 100%;\n max-height: 100%;\n }\n\n mwc-icon[iconBtn] {\n float: right;\n margin-top: -20px;\n margin-left: 2px;\n color: var(--board-list-star-color);\n font-size: 1.4em;\n }\n mwc-icon[info] {\n color: var(--primary-color);\n }\n\n mwc-icon[iconBtn][favored],\n mwc-icon[info]:hover {\n color: var(--board-list-star-active-color);\n }\n\n a {\n display: block;\n border-radius: var(--card-list-border-radius);\n border: var(--border-dark-color);\n box-sizing: border-box;\n background-color: var(--card-list-background-color);\n margin: 0px;\n height: calc(100% - 25px);\n }\n\n :host > *:hover [info] {\n opacity: 1;\n -webkit-transition: opacity 0.8s;\n -moz-transition: opacity 0.8s;\n -o-transition: opacity 0.8s;\n transition: opacity 0.8s;\n }\n\n [draggable='true'] {\n cursor: grab;\n }\n\n @media screen and (max-width: 800px), screen and (max-height: 600px) {\n ox-board-creation-card {\n display: none;\n }\n }\n `\n ]\n }\n\n static get properties() {\n return {\n creatable: {\n type: Boolean,\n attribute: 'creatable'\n },\n boards: Array,\n favorites: Array,\n groups: Array,\n group: String,\n reorderable: {\n type: Boolean,\n attribute: 'reorderable'\n }\n }\n }\n\n draggingItem\n\n connectedCallback() {\n super.connectedCallback()\n\n if (this.reorderable) {\n this.renderRoot.addEventListener('dragstart', e => {\n // if (!e.target.getAttribute('draggable')) {\n // e.preventDefault()\n // }\n\n // this.draggedItem = e.target\n this.draggedItem = e.target.closest('[card]')\n e.dataTransfer.setData('text/plain', e.target.innerHTML)\n })\n\n this.renderRoot.addEventListener('dragover', e => {\n e.preventDefault()\n const targetItem = e.target.closest('[card]')\n if (targetItem !== this.draggedItem) {\n const targetRect = targetItem.getBoundingClientRect()\n const mousePos = e.clientX - targetRect.left\n\n if (mousePos < targetRect.width / 2) {\n // 마우스 위치가 아이템 좌측 반절에 있을 때\n this.renderRoot.insertBefore(this.draggedItem, targetItem)\n } else {\n // 마우스 위치가 아이템 우측 반절에 있을 때\n this.renderRoot.insertBefore(this.draggedItem, targetItem.nextSibling)\n }\n }\n })\n\n this.renderRoot.addEventListener('drop', e => {\n e.preventDefault()\n\n const boardIds = Array.from(this.renderRoot.querySelectorAll('[card]'))\n .map(board => board.getAttribute('id'))\n .filter(Boolean)\n\n this.dispatchEvent(\n new CustomEvent('reordered', {\n detail: {\n groupId: this.group,\n boardIds\n }\n })\n )\n })\n }\n }\n\n render() {\n var boards = this.boards || []\n\n return html`\n ${this.creatable\n ? html`\n <ox-board-creation-card\n .groups=${this.groups}\n .defaultGroup=${this.group}\n @create-board=${e => this.onCreateBoard(e)}\n card\n create\n ></ox-board-creation-card>\n `\n : html``}\n ${keyed(\n Date.now(),\n boards.map(\n board =>\n html`\n <div card draggable=\"true\" id=${board.id}>\n <a href=\"board-viewer/${board.id}\"> <img src=${board.thumbnail} /> </a>\n\n <div name>${board.name}</div>\n <!-- <div description>${board.description}</div> -->\n\n <mwc-icon\n iconBtn\n info\n @click=${e => {\n this.infoBoard(board)\n e.preventDefault()\n }}\n >info</mwc-icon\n >\n\n ${(this.favorites || []).includes(board.id)\n ? html` <mwc-icon iconBtn favored @click=${e => this.removeFavorite(board.id)}>star</mwc-icon> `\n : html` <mwc-icon iconBtn @click=${e => this.addFavorite(board.id)}>star_border</mwc-icon> `}\n </div>\n `\n )\n )}\n `\n }\n\n updated(changes) {\n var creationCard = this.shadowRoot.querySelector('ox-board-creation-card')\n if (creationCard) {\n creationCard.reset()\n }\n }\n\n onCreateBoard(e) {\n this.dispatchEvent(\n new CustomEvent('create-board', {\n detail: e.detail\n })\n )\n }\n\n infoBoard(board) {\n this.dispatchEvent(\n new CustomEvent('info-board', {\n detail: board\n })\n )\n }\n\n async removeFavorite(boardId) {\n await client.query({\n query: gql`\n mutation {\n deleteFavorite(routing: \"${boardId}\")\n }\n `\n })\n\n this.refreshFavorites()\n }\n\n async addFavorite(boardId) {\n await client.query({\n query: gql`\n mutation {\n createFavorite(favorite: {\n routing: \"${boardId}\"\n }) {\n id\n routing\n }\n }\n `\n })\n\n this.refreshFavorites()\n }\n\n async refreshFavorites() {\n this.dispatchEvent(new CustomEvent('refresh-favorites'))\n }\n}\n\nwindow.customElements.define('board-tile-list', BoardTileList)\n"]}
|
|
@@ -1,16 +1,21 @@
|
|
|
1
|
+
import '@material/mwc-icon';
|
|
2
|
+
import { LitElement } from 'lit';
|
|
1
3
|
export default class PlayGroupBar extends LitElement {
|
|
2
|
-
static
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
static styles: import("lit").CSSResult[];
|
|
5
|
+
groups: {
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
}[];
|
|
9
|
+
groupId: string;
|
|
10
|
+
targetPage: string;
|
|
11
|
+
private __sb?;
|
|
8
12
|
render(): import("lit-html").TemplateResult<1>;
|
|
9
|
-
_infoGroup(
|
|
13
|
+
_infoGroup(group?: {
|
|
14
|
+
id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
}): void;
|
|
10
17
|
_onWheelEvent(e: any): void;
|
|
11
18
|
_onClickAdd(e: any): void;
|
|
12
19
|
updated(change: any): void;
|
|
13
20
|
firstUpdated(): void;
|
|
14
|
-
__sb: any;
|
|
15
21
|
}
|
|
16
|
-
import { LitElement } from "lit-element/lit-element";
|
|
@@ -1,79 +1,21 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
1
2
|
import '@material/mwc-icon';
|
|
2
3
|
import { css, html, LitElement } from 'lit';
|
|
4
|
+
import { customElement, property } from 'lit/decorators.js';
|
|
3
5
|
import ScrollBooster from 'scrollbooster';
|
|
4
6
|
import { longpressable } from '@things-factory/utils';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
overflow-x: hidden;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
ul {
|
|
16
|
-
display: flex;
|
|
17
|
-
list-style: none;
|
|
18
|
-
margin: 0;
|
|
19
|
-
padding: 0;
|
|
20
|
-
white-space: nowrap;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
li {
|
|
24
|
-
display: inline-block;
|
|
25
|
-
padding: 0px 3px;
|
|
26
|
-
|
|
27
|
-
border-bottom: var(--group-bar-line);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
li[active] {
|
|
31
|
-
border-color: var(--group-bar-active-line-color);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
li a {
|
|
35
|
-
display: block;
|
|
36
|
-
padding: 5px 4px 1px 4px;
|
|
37
|
-
text-decoration: none;
|
|
38
|
-
font: var(--group-bar-textbutton);
|
|
39
|
-
color: rgba(255, 255, 255, 0.8);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
li[active] a {
|
|
43
|
-
font: var(--group-bar-textbutton-active);
|
|
44
|
-
color: rgba(255, 255, 255, 1);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
li[padding] {
|
|
48
|
-
flex: 1;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
li[add] {
|
|
52
|
-
padding: 5px 4px 1px 4px;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
li[add] * {
|
|
56
|
-
color: rgba(255, 255, 255, 0.5);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
mwc-icon {
|
|
60
|
-
vertical-align: middle;
|
|
61
|
-
}
|
|
62
|
-
`
|
|
63
|
-
];
|
|
64
|
-
}
|
|
65
|
-
static get properties() {
|
|
66
|
-
return {
|
|
67
|
-
groups: Array,
|
|
68
|
-
groupId: String,
|
|
69
|
-
targetPage: String
|
|
70
|
-
};
|
|
7
|
+
let PlayGroupBar = class PlayGroupBar extends LitElement {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(...arguments);
|
|
10
|
+
this.groups = [];
|
|
11
|
+
this.groupId = '';
|
|
12
|
+
this.targetPage = '';
|
|
71
13
|
}
|
|
72
14
|
render() {
|
|
73
15
|
return html `
|
|
74
16
|
<ul>
|
|
75
17
|
${(this.groups || []).map(group => html `
|
|
76
|
-
<li ?active=${this.groupId === group.id} @long-press=${e => this._infoGroup(group
|
|
18
|
+
<li ?active=${this.groupId === group.id} @long-press=${e => this._infoGroup(group)}>
|
|
77
19
|
<a href=${`${this.targetPage}/${group.id}`}>${group.name}</a>
|
|
78
20
|
</li>
|
|
79
21
|
`)}
|
|
@@ -86,9 +28,9 @@ export default class PlayGroupBar extends LitElement {
|
|
|
86
28
|
</ul>
|
|
87
29
|
`;
|
|
88
30
|
}
|
|
89
|
-
_infoGroup(
|
|
31
|
+
_infoGroup(group) {
|
|
90
32
|
this.dispatchEvent(new CustomEvent('info-play-group', {
|
|
91
|
-
detail:
|
|
33
|
+
detail: group
|
|
92
34
|
}));
|
|
93
35
|
}
|
|
94
36
|
_onWheelEvent(e) {
|
|
@@ -105,12 +47,12 @@ export default class PlayGroupBar extends LitElement {
|
|
|
105
47
|
this.__sb && this.__sb.updateMetrics();
|
|
106
48
|
}
|
|
107
49
|
if (change.has('groupId')) {
|
|
108
|
-
var active = this.
|
|
50
|
+
var active = this.renderRoot.querySelector('li[active]');
|
|
109
51
|
active && active.scrollIntoView();
|
|
110
52
|
}
|
|
111
53
|
}
|
|
112
54
|
firstUpdated() {
|
|
113
|
-
var scrollTarget = this.
|
|
55
|
+
var scrollTarget = this.renderRoot.querySelector('ul');
|
|
114
56
|
/* long-press */
|
|
115
57
|
longpressable(scrollTarget);
|
|
116
58
|
scrollTarget.addEventListener('mousewheel', this._onWheelEvent.bind(this), false);
|
|
@@ -123,6 +65,78 @@ export default class PlayGroupBar extends LitElement {
|
|
|
123
65
|
}
|
|
124
66
|
});
|
|
125
67
|
}
|
|
126
|
-
}
|
|
127
|
-
|
|
68
|
+
};
|
|
69
|
+
PlayGroupBar.styles = [
|
|
70
|
+
css `
|
|
71
|
+
:host {
|
|
72
|
+
background-color: var(--group-bar-background-color);
|
|
73
|
+
|
|
74
|
+
overflow-x: hidden;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
ul {
|
|
78
|
+
display: flex;
|
|
79
|
+
list-style: none;
|
|
80
|
+
margin: 0;
|
|
81
|
+
padding: 0;
|
|
82
|
+
white-space: nowrap;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
li {
|
|
86
|
+
display: inline-block;
|
|
87
|
+
padding: 0px 3px;
|
|
88
|
+
|
|
89
|
+
border-bottom: var(--group-bar-line);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
li[active] {
|
|
93
|
+
border-color: var(--group-bar-active-line-color);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
li a {
|
|
97
|
+
display: block;
|
|
98
|
+
padding: 5px 4px 1px 4px;
|
|
99
|
+
text-decoration: none;
|
|
100
|
+
font: var(--group-bar-textbutton);
|
|
101
|
+
color: rgba(255, 255, 255, 0.8);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
li[active] a {
|
|
105
|
+
font: var(--group-bar-textbutton-active);
|
|
106
|
+
color: rgba(255, 255, 255, 1);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
li[padding] {
|
|
110
|
+
flex: 1;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
li[add] {
|
|
114
|
+
padding: 5px 4px 1px 4px;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
li[add] * {
|
|
118
|
+
color: rgba(255, 255, 255, 0.5);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
mwc-icon {
|
|
122
|
+
vertical-align: middle;
|
|
123
|
+
}
|
|
124
|
+
`
|
|
125
|
+
];
|
|
126
|
+
__decorate([
|
|
127
|
+
property({ type: Array }),
|
|
128
|
+
__metadata("design:type", Array)
|
|
129
|
+
], PlayGroupBar.prototype, "groups", void 0);
|
|
130
|
+
__decorate([
|
|
131
|
+
property({ type: String }),
|
|
132
|
+
__metadata("design:type", String)
|
|
133
|
+
], PlayGroupBar.prototype, "groupId", void 0);
|
|
134
|
+
__decorate([
|
|
135
|
+
property({ type: String, attribute: 'target-page' }),
|
|
136
|
+
__metadata("design:type", String)
|
|
137
|
+
], PlayGroupBar.prototype, "targetPage", void 0);
|
|
138
|
+
PlayGroupBar = __decorate([
|
|
139
|
+
customElement('play-group-bar')
|
|
140
|
+
], PlayGroupBar);
|
|
141
|
+
export default PlayGroupBar;
|
|
128
142
|
//# sourceMappingURL=play-group-bar.js.map
|