@things-factory/figure-ui 10.1.5 โ 10.1.7
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/graphql/index.ts +36 -3
- package/client/modeller/figure-animations.ts +712 -0
- package/client/modeller/figure-ask.ts +5 -5
- package/client/modeller/figure-canvas.ts +1 -1
- package/client/modeller/figure-capabilities.ts +372 -0
- package/client/modeller/figure-history-panel.ts +171 -18
- package/client/modeller/figure-inspector.ts +439 -76
- package/client/modeller/figure-parts.ts +15 -15
- package/client/modeller/figure-preview.ts +2 -2
- package/client/modeller/figure-report.ts +102 -37
- package/client/modeller/figure-settings.ts +20 -20
- package/client/modeller/figure-side.ts +91 -15
- package/client/modeller/figure-source.test.ts +15 -1
- package/client/modeller/figure-source.ts +31 -15
- package/client/modeller/figure-thumbnail.ts +49 -4
- package/client/modeller/maturity.ts +10 -10
- package/client/pages/figure-list-page.ts +204 -66
- package/client/pages/figure-modeller-page.ts +158 -42
- package/client/types.ts +31 -0
- package/client/viewparts/figure-thumb.ts +250 -0
- package/dist-client/graphql/index.d.ts +8 -1
- package/dist-client/graphql/index.js +33 -3
- package/dist-client/graphql/index.js.map +1 -1
- package/dist-client/modeller/figure-animations.d.ts +93 -0
- package/dist-client/modeller/figure-animations.js +655 -0
- package/dist-client/modeller/figure-animations.js.map +1 -0
- package/dist-client/modeller/figure-ask.js +5 -5
- package/dist-client/modeller/figure-ask.js.map +1 -1
- package/dist-client/modeller/figure-canvas.js +1 -1
- package/dist-client/modeller/figure-canvas.js.map +1 -1
- package/dist-client/modeller/figure-capabilities.d.ts +42 -0
- package/dist-client/modeller/figure-capabilities.js +344 -0
- package/dist-client/modeller/figure-capabilities.js.map +1 -0
- package/dist-client/modeller/figure-history-panel.d.ts +15 -1
- package/dist-client/modeller/figure-history-panel.js +165 -18
- package/dist-client/modeller/figure-history-panel.js.map +1 -1
- package/dist-client/modeller/figure-inspector.d.ts +98 -0
- package/dist-client/modeller/figure-inspector.js +425 -75
- package/dist-client/modeller/figure-inspector.js.map +1 -1
- package/dist-client/modeller/figure-parts.js +15 -15
- package/dist-client/modeller/figure-parts.js.map +1 -1
- package/dist-client/modeller/figure-preview.js +2 -2
- package/dist-client/modeller/figure-preview.js.map +1 -1
- package/dist-client/modeller/figure-report.d.ts +18 -1
- package/dist-client/modeller/figure-report.js +105 -37
- package/dist-client/modeller/figure-report.js.map +1 -1
- package/dist-client/modeller/figure-settings.js +19 -19
- package/dist-client/modeller/figure-settings.js.map +1 -1
- package/dist-client/modeller/figure-side.d.ts +24 -0
- package/dist-client/modeller/figure-side.js +94 -14
- package/dist-client/modeller/figure-side.js.map +1 -1
- package/dist-client/modeller/figure-source.d.ts +15 -8
- package/dist-client/modeller/figure-source.js +16 -7
- package/dist-client/modeller/figure-source.js.map +1 -1
- package/dist-client/modeller/figure-thumbnail.js +40 -4
- package/dist-client/modeller/figure-thumbnail.js.map +1 -1
- package/dist-client/modeller/maturity.js +10 -10
- package/dist-client/modeller/maturity.js.map +1 -1
- package/dist-client/pages/figure-list-page.d.ts +11 -4
- package/dist-client/pages/figure-list-page.js +201 -63
- package/dist-client/pages/figure-list-page.js.map +1 -1
- package/dist-client/pages/figure-modeller-page.d.ts +33 -0
- package/dist-client/pages/figure-modeller-page.js +156 -42
- package/dist-client/pages/figure-modeller-page.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/types.d.ts +29 -0
- package/dist-client/types.js.map +1 -1
- package/dist-client/viewparts/figure-thumb.d.ts +29 -0
- package/dist-client/viewparts/figure-thumb.js +242 -0
- package/dist-client/viewparts/figure-thumb.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -5
- package/test/i18n-prefix-guard.test.ts +171 -0
- package/test/korean-register-guard.test.ts +83 -0
- package/translations/en.json +351 -264
- package/translations/ja.json +276 -264
- package/translations/ko.json +351 -264
- package/translations/ms.json +276 -264
- package/translations/zh.json +276 -264
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import '@material/web/icon/icon.js'
|
|
2
|
+
|
|
3
|
+
import { css, html, LitElement } from 'lit'
|
|
4
|
+
import { customElement, property } from 'lit/decorators.js'
|
|
5
|
+
|
|
6
|
+
import { i18next, localize } from '@operato/i18n'
|
|
7
|
+
import { getPathInfo } from '@operato/utils'
|
|
8
|
+
|
|
9
|
+
import type { Figure } from '../types.js'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* ๊ทธ๋ฆผ์ ๋ถ๋ฅด๋ ์ฃผ์.
|
|
13
|
+
*
|
|
14
|
+
* **base64 ๋ฅผ ๋ชฉ๋ก ์๋ต์ ์ค์ด ์ค์ง ์๋๋ค.** data URL ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์บ์ํ ์ ์์ด, ์นดํ๋ก๊ทธ๋ฅผ
|
|
15
|
+
* ์ด ๋๋ง๋ค ๊ทธ๋ฆผ ์ ๋ถ๊ฐ ๋ค์ ์จ๋ค([ํ์ธํจ] ํ๋ณธ 14๊ฐ 227KB). ์ฃผ์๋ก ๋ถ๋ฅด๋ฉด ์บ์๊ฐ ๋๊ณ , ํ์
|
|
16
|
+
* ๊ฐ๋ฆฌ๋ `v` ๊ฐ ๋ฐ๋ ๊ฒ๋ง ๋ค์ ๋ฐ๋๋ค. ๋ด์ฃผ๋ ์๋ฆฌ๋ `figure-thumbnail-router` ๋ค.
|
|
17
|
+
*
|
|
18
|
+
* ๋๋ฉ์ธ ์กฐ๊ฐ(`/domain/{subdomain}`)์ ์
ธ์ด ์ฐ๋ ๊ฒ๊ณผ ๊ฐ์ ํจ์๋ก ์ฝ๋๋ค โ ํ๋ฉด์ด ์ฃผ์๋ฅผ
|
|
19
|
+
* ์์ผ๋ก ์ง๋ง์ถ๋ฉด ๋๋ฉ์ธ์ด ๋ฐ๋๋ ๋ฐฐ์น์์ ์กฐ์ฉํ ํ๋ฆฐ๋ค.
|
|
20
|
+
*/
|
|
21
|
+
function thumbnailSrc(figure: Figure): string | undefined {
|
|
22
|
+
if (!figure.thumbnailUpdatedAt) {
|
|
23
|
+
return undefined
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const { contextPath } = getPathInfo(location.pathname)
|
|
27
|
+
const stamp = new Date(figure.thumbnailUpdatedAt).getTime()
|
|
28
|
+
|
|
29
|
+
return `${contextPath}/figure-thumbnail/${figure.id}?v=${stamp}`
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* ์นด๋์ ๊ทธ๋ฆผ ์นธ.
|
|
34
|
+
*
|
|
35
|
+
* ## ์ ์ปดํฌ๋ํธ์ธ๊ฐ
|
|
36
|
+
*
|
|
37
|
+
* ์นดํ๋ก๊ทธ๋ `ox-grist` ์ CARD ๋ชจ๋๋ก ๊ทธ๋ฆฐ๋ค. ๊ฒฉ์์๊ฒ ๊ทธ๋ฆผ ์นธ์ ์ปฌ๋ผ ํ๋์ด๊ณ , ๊ทธ ์นธ์ ๊ทธ๋ฆฌ๋
|
|
38
|
+
* ๊ฒ์ ์ปฌ๋ผ์ `record.renderer` ๋ค. ๊ทธ๋ฆผ ์์ ์นํ๋ ๊ฒ๋ค(์ด์ ํ์, ์ญ์ )์ **๊ทธ๋ฆผ ์นธ ์์**
|
|
39
|
+
* ์์ด์ผ ํ๋ฏ๋ก renderer ๊ฐ ๊ทธ๋ ค์ผ ํ๋๋ฐ, renderer ์ ๊ฒฐ๊ณผ๋ `ox-card-field` ์ shadow root
|
|
40
|
+
* ์์ผ๋ก ๋ค์ด๊ฐ๋ค โ ํ๋ฉด์ `static styles` ๊ฐ ๋ฟ์ง ์๊ณ , ์ธ๋ผ์ธ style ๋ก๋ `:hover` ๋ฅผ ์ธ ์ ์๋ค.
|
|
41
|
+
*
|
|
42
|
+
* ๊ทธ๋์ ๊ทธ๋ฆผ ์นธ๋ง ์ปดํฌ๋ํธ๋ก ๋๋ค. ์๊ธฐ ์คํ์ผ์ ๊ฐ๊ณ ์์ผ๋ hover ๋ ํ
๋ง๋ ์ ์์ผ๋ก ๋๋ค.
|
|
43
|
+
* ๊ฒฉ์๋ก ์ฎ๊ธฐ๊ธฐ ์ ์์ผ๋ก ๋ง๋ค์๋ ์นด๋์ ์์ชฝ ์ ๋ฐ์ด ๊ทธ๋๋ก ์ด ์๋ฆฌ๋ค.
|
|
44
|
+
*
|
|
45
|
+
* ## ์ญ์ ๊ฐ ์ ์ฌ๊ธฐ ์๋
|
|
46
|
+
*
|
|
47
|
+
* ๊ฒฉ์์ gutter ์ค์ ๋๋ฉด ์นด๋ ์๋์ ๋จ์ถ ์ค์ด ํ๋ ์๊ธด๋ค. ๊ฐ์ถฐ๋ ์๋ฆฌ๊ฐ ๋จ๊ณ , ์๋ฆฌ๋ฅผ ์์ ๋ฉด
|
|
48
|
+
* ๋๋ฆด ๊ณณ์ด ์ฌ๋ผ์ง๋ค. ๋๋๋ฆด ์ ์๋ ์กฐ์์ **๊ณ ๋ฅด๋ ๋๊ธธ์ ๊ฑธ๋ฆฌ์ง ์์์ผ** ํ๋ฏ๋ก ๊ทธ๋ฆผ ์ค๋ฅธ์ชฝ
|
|
49
|
+
* ์, ์์ด ๊ฐ์ ๋๋ง ๋์ค๋ ์๋ฆฌ์ ๋๋ค.
|
|
50
|
+
*/
|
|
51
|
+
@customElement('figure-thumb')
|
|
52
|
+
export class FigureThumb extends localize(i18next)(LitElement) {
|
|
53
|
+
static styles = css`
|
|
54
|
+
:host {
|
|
55
|
+
position: relative;
|
|
56
|
+
display: block;
|
|
57
|
+
width: 100%;
|
|
58
|
+
height: 100%;
|
|
59
|
+
overflow: hidden;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
img {
|
|
63
|
+
display: block;
|
|
64
|
+
width: 100%;
|
|
65
|
+
height: 100%;
|
|
66
|
+
/* ํ์์ ์๋ฅด์ง ์๋๋ค โ ๊ธด ๊ฒ(์ปจ๋ฒ ์ด์ด)๊ณผ ๋์ ๊ฒ(์๊ทธ๋ํ์)์ด ํ ์ค์ ์ ๋ค */
|
|
67
|
+
object-fit: contain;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/* ์์ง ๊ทธ๋ฆผ์ด ์๋ ๊ฒ์ ๋น ์ฌ๊ฐํ์ผ๋ก ๋์ง ์๋๋ค โ ์ ์๋์ง ๋งํ๋ค */
|
|
71
|
+
div[empty] {
|
|
72
|
+
display: flex;
|
|
73
|
+
flex-direction: column;
|
|
74
|
+
align-items: center;
|
|
75
|
+
justify-content: center;
|
|
76
|
+
gap: var(--spacing-tiny, 4px);
|
|
77
|
+
width: 100%;
|
|
78
|
+
height: 100%;
|
|
79
|
+
font: var(--label-font, inherit);
|
|
80
|
+
font-size: 0.7rem;
|
|
81
|
+
color: var(--md-sys-color-outline);
|
|
82
|
+
}
|
|
83
|
+
div[empty] md-icon {
|
|
84
|
+
--md-icon-size: 26px;
|
|
85
|
+
color: var(--md-sys-color-outline-variant);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/*
|
|
89
|
+
์ด์ ํ์.
|
|
90
|
+
|
|
91
|
+
๋ฐํ๋ ๊ฒ์๋ ์๋ฌด ๋ง๋ ํ์ง ์๋๋ค โ ์นดํ๋ก๊ทธ์ ์๋ ๊ฒ์ ๋๊ฐ ๋ฐํ๋ ๊ฒ์ด๋ผ, ์นด๋๋ง๋ค
|
|
92
|
+
ใ๋ฐํ๋จใ์ด ๋ถ์ผ๋ฉด ์๋ฌด๊ฒ๋ ๊ฐ๋ฅด์ง ์๊ณ ์๋ฆฌ๋ง ๋จน๋๋ค. ์ด์๋ง ๋งํ๋ฉด ์ด ํ์๊ฐ ์๋ ์นด๋๊ฐ
|
|
93
|
+
๊ณง ใ์์ง ์ฐ๋ฉด ์ ๋๋ ๊ฒใ์ด ๋๋ค.
|
|
94
|
+
*/
|
|
95
|
+
span[draft] {
|
|
96
|
+
position: absolute;
|
|
97
|
+
top: 6px;
|
|
98
|
+
left: 6px;
|
|
99
|
+
padding: 1px 7px;
|
|
100
|
+
font: var(--label-font, inherit);
|
|
101
|
+
font-size: 0.68rem;
|
|
102
|
+
line-height: 1.5;
|
|
103
|
+
color: var(--md-sys-color-on-secondary-container);
|
|
104
|
+
background-color: var(--md-sys-color-secondary-container);
|
|
105
|
+
border-radius: 4px;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/*
|
|
109
|
+
ํ๊ทธ โ **๊ทธ๋ฆผ ์์ ์น๋๋ค.**
|
|
110
|
+
|
|
111
|
+
์นด๋ ๋ณธ๋ฌธ์ ํ ์ค๋ก ๋์๋๋ ํ๊ทธ๊ฐ ์๋ ์นด๋๋ง ๊ทธ๋งํผ ๋์์ ธ ๊ฒฉ์๊ฐ ๋ค์ญ๋ ์ญํด์ก๋ค.
|
|
112
|
+
ํ๊ทธ๋ ๋ํ๋ง๋ค ๊ฐ์๊ฐ ๋ค๋ฅด๋ฏ๋ก ๋ณธ๋ฌธ์ ๋๋ ํ ์ด ๋ฌธ์ ๊ฐ ๋จ๋๋ค. ๊ทธ๋ฆผ ์๋ ์ด๋ฏธ ์๋ฆฌ๊ฐ
|
|
113
|
+
์กํ ์๊ณ (์ด์ ํ์ยท์ญ์ ), ์น์ด๋ ์นด๋ ๋์ด๊ฐ ๋ณํ์ง ์๋๋ค.
|
|
114
|
+
|
|
115
|
+
์๋์ชฝ์ ๋๋ค โ ์๋ ์ด์ ํ์์ ์ญ์ ๋จ์ถ๊ฐ ์ด๋ค.
|
|
116
|
+
|
|
117
|
+
**ํฌ๋ช
ํ ์์ฝ์ด๋ค.** ๋ฉด์ ๊ฝ ์ฑ์ฐ๋ฉด ๊ทธ๋ฆผ ์์ ํฐ ๋ ๊ฐ ์๊ฒจ ํ์์ ๊ฐ๋ฆฐ๋ค โ ์นดํ๋ก๊ทธ์์
|
|
118
|
+
๋จผ์ ๋ณด์์ผ ํ๋ ๊ฒ์ ํ์์ด๋ค. ๊ทธ๋์ ๋ฐํ์ ๊ฑฐ์ ๋น์ฐ๊ณ , ์ฝํ๋ ๊ฒ์ ๋ค๋ฅผ ํ๋ฆฌ๋ ๊ฒ๊ณผ
|
|
119
|
+
์ค๋ฑ ํ
๋๋ฆฌ๊ฐ ๋งก๋๋ค. ํ๋ฆผ์ด ์ ๋๋ ํ๊ฒฝ์์๋ ํ
๋๋ฆฌ๊ฐ ๋จ์ ๊ธ์๊ฐ ํ์์ ๋ฌปํ์ง ์๋๋ค.
|
|
120
|
+
*/
|
|
121
|
+
div[tags] {
|
|
122
|
+
position: absolute;
|
|
123
|
+
right: 6px;
|
|
124
|
+
bottom: 6px;
|
|
125
|
+
left: 6px;
|
|
126
|
+
display: flex;
|
|
127
|
+
flex-wrap: wrap-reverse;
|
|
128
|
+
justify-content: flex-end;
|
|
129
|
+
gap: 3px;
|
|
130
|
+
/* ํ๊ทธ๊ฐ ๋ง์๋ ๊ทธ๋ฆผ์ ๋ฎ์ง ์๋๋ค โ ๋์น๋ ๊ฒ์ ์๋ก ์๋ฆฐ๋ค */
|
|
131
|
+
max-height: 44px;
|
|
132
|
+
overflow: hidden;
|
|
133
|
+
/* ์์ฝ ์ฌ์ด์ ๋น ์๋ฆฌ๋ ๊ทธ๋ฆผ์ด ๋ฐ๋๋ค โ ๊ฑฐ๊ธฐ์ ๋๋ฅด๋ฉด ์ ์๋ฉด์ด ์ด๋ฆฐ๋ค */
|
|
134
|
+
pointer-events: none;
|
|
135
|
+
}
|
|
136
|
+
/*
|
|
137
|
+
**์์ฝ์ ๋๋ฅผ ์ ์๋ค.** ๋๋ฅด๋ฉด ๊ทธ ํ๊ทธ๋ก ๋ชฉ๋ก์ ๊ฑฐ๋ฅธ๋ค.
|
|
138
|
+
|
|
139
|
+
ํ๊ทธ๋ฅผ ๋์ ๋ณด์ด๊ฒ ํ ๋ค์์ ๋ฌผ์์ ใ๊ทธ๋์ ์ด๊ฑธ๋ก ๋ญ ํ๋ใ๋ค. ๊ฐ์ ํ๊ทธ๊ฐ ๋ถ์ ๊ฒ์
|
|
140
|
+
๋ณด๋ ค๊ณ ํ๊ทธ๋ฅผ ๋์ผ๋ก ์ฝ์ด ๊ฒ์์ฐฝ์ ์ฎ๊ฒจ ์ ๊ฒ ๋๋ฉด, ๋ณด์ฌ ์ค ๋ป์ด ์ ๋ฐ๋ง ์ฐ๋ค.
|
|
141
|
+
|
|
142
|
+
์นด๋ ์์ฒด๊ฐ ์ ์๋ฉด์ ์ฌ๋ ์๋ฆฌ์ด๋ฏ๋ก ์์ฝ์์ ๊ทธ ํด๋ฆญ์ ๋ฉ์ถ๋ค โ ์ ๋ฉ์ถ๋ฉด ํ๊ทธ๋ฅผ ๋๋ฅธ
|
|
143
|
+
์ฌ๋์ด ํธ์ง๊ธฐ๋ก ๋๋ ค๊ฐ๋ค.
|
|
144
|
+
*/
|
|
145
|
+
div[tags] button {
|
|
146
|
+
pointer-events: auto;
|
|
147
|
+
cursor: pointer;
|
|
148
|
+
padding: 0 7px;
|
|
149
|
+
font: var(--label-font, inherit);
|
|
150
|
+
font-size: 0.66rem;
|
|
151
|
+
line-height: 1.7;
|
|
152
|
+
color: var(--md-sys-color-on-surface-variant, var(--md-sys-color-on-surface));
|
|
153
|
+
background-color: color-mix(in srgb, var(--md-sys-color-surface, #fff) 34%, transparent);
|
|
154
|
+
border: 1px solid color-mix(in srgb, var(--md-sys-color-outline, #888) 42%, transparent);
|
|
155
|
+
backdrop-filter: blur(4px);
|
|
156
|
+
border-radius: 999em;
|
|
157
|
+
white-space: nowrap;
|
|
158
|
+
}
|
|
159
|
+
div[tags] button:hover,
|
|
160
|
+
div[tags] button:focus-visible {
|
|
161
|
+
color: var(--md-sys-color-on-surface);
|
|
162
|
+
background-color: color-mix(in srgb, var(--md-sys-color-surface, #fff) 72%, transparent);
|
|
163
|
+
border-color: var(--md-sys-color-primary);
|
|
164
|
+
outline: none;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
button[remove] {
|
|
168
|
+
position: absolute;
|
|
169
|
+
top: 5px;
|
|
170
|
+
right: 5px;
|
|
171
|
+
display: flex;
|
|
172
|
+
align-items: center;
|
|
173
|
+
justify-content: center;
|
|
174
|
+
padding: 3px;
|
|
175
|
+
color: var(--md-sys-color-on-surface-variant, var(--md-sys-color-on-surface));
|
|
176
|
+
/* ๊ทธ๋ฆผ์ด ๋ฐ์ ์๋ ์ด๋์ธ ์๋ ์๋ค โ ์
์ ๋ฉด์ ๊น์ ์์ด์ฝ์ด ์ด๋์๋ ์ฝํ๊ฒ ํ๋ค */
|
|
177
|
+
background-color: color-mix(in srgb, var(--md-sys-color-surface, #fff) 82%, transparent);
|
|
178
|
+
border: none;
|
|
179
|
+
border-radius: 4px;
|
|
180
|
+
cursor: pointer;
|
|
181
|
+
opacity: 0;
|
|
182
|
+
transition: opacity 0.12s ease-out;
|
|
183
|
+
}
|
|
184
|
+
button[remove] md-icon {
|
|
185
|
+
--md-icon-size: 18px;
|
|
186
|
+
}
|
|
187
|
+
:host(:hover) button[remove],
|
|
188
|
+
button[remove]:focus-visible {
|
|
189
|
+
opacity: 1;
|
|
190
|
+
}
|
|
191
|
+
button[remove]:hover {
|
|
192
|
+
color: var(--md-sys-color-on-error, #fff);
|
|
193
|
+
background-color: var(--md-sys-color-error);
|
|
194
|
+
}
|
|
195
|
+
`
|
|
196
|
+
|
|
197
|
+
@property({ type: Object }) figure!: Figure
|
|
198
|
+
|
|
199
|
+
render() {
|
|
200
|
+
const figure = this.figure
|
|
201
|
+
if (!figure) {
|
|
202
|
+
return html``
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const src = thumbnailSrc(figure)
|
|
206
|
+
|
|
207
|
+
return html`
|
|
208
|
+
${src
|
|
209
|
+
? html`<img src=${src} alt=${figure.name || ''} loading="lazy" />`
|
|
210
|
+
: html`
|
|
211
|
+
<div empty>
|
|
212
|
+
<md-icon>deployed_code</md-icon>
|
|
213
|
+
${i18next.t('figure.text.thumbnail-not-made-yet')}
|
|
214
|
+
</div>
|
|
215
|
+
`}
|
|
216
|
+
${figure.state === 'released' ? '' : html`<span draft>${i18next.t('figure.label.draft')}</span>`}
|
|
217
|
+
${figure.tags?.length
|
|
218
|
+
? html`<div tags>
|
|
219
|
+
${figure.tags.map(
|
|
220
|
+
tag => html`
|
|
221
|
+
<button
|
|
222
|
+
title=${i18next.t('figure.text.find-by-this-tag')}
|
|
223
|
+
@click=${(e: Event) => {
|
|
224
|
+
e.stopPropagation()
|
|
225
|
+
this.dispatchEvent(
|
|
226
|
+
new CustomEvent('search-tag', { detail: { tag }, bubbles: true, composed: true })
|
|
227
|
+
)
|
|
228
|
+
}}
|
|
229
|
+
>
|
|
230
|
+
${tag}
|
|
231
|
+
</button>
|
|
232
|
+
`
|
|
233
|
+
)}
|
|
234
|
+
</div>`
|
|
235
|
+
: ''}
|
|
236
|
+
|
|
237
|
+
<button
|
|
238
|
+
remove
|
|
239
|
+
title=${i18next.t('figure.button.delete-figure')}
|
|
240
|
+
@click=${(e: Event) => {
|
|
241
|
+
/* ์นด๋ ํด๋ฆญ(=์ ์๋ฉด ์ด๊ธฐ)๊น์ง ์ฌ๋ผ๊ฐ์ง ์๊ฒ ์ฌ๊ธฐ์ ๋ฉ์ถ๋ค */
|
|
242
|
+
e.stopPropagation()
|
|
243
|
+
this.dispatchEvent(new CustomEvent('remove'))
|
|
244
|
+
}}
|
|
245
|
+
>
|
|
246
|
+
<md-icon>delete</md-icon>
|
|
247
|
+
</button>
|
|
248
|
+
`
|
|
249
|
+
}
|
|
250
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Figure, FigureFinding, FigureListResult, FigurePatch, FigureProposal, FigureVersion, NewFigure } from '../types.js';
|
|
1
|
+
import type { Figure, FigureFinding, FigureInspection, FigureListResult, FigurePatch, FigureProposal, FigureVersion, NewFigure } from '../types.js';
|
|
2
2
|
/**
|
|
3
3
|
* ๋ชฉ๋ก์ ๊ฐ์ ธ์จ๋ค.
|
|
4
4
|
*
|
|
@@ -57,5 +57,12 @@ export declare function proposeFigure(request: {
|
|
|
57
57
|
export declare function releaseFigure(id: string, comment?: string): Promise<Figure>;
|
|
58
58
|
/** ์ ํ์ ์ด์์ผ๋ก ๋์ด๋ฆฐ๋ค. ์ ๋ณธยท์์ฑยท๊ทธ๋ฆผ์ด ๋์์ค๊ณ ์ด๋ฆยท์ค๋ช
์ ๊ทธ๋๋ก๋ค. */
|
|
59
59
|
export declare function revertFigureVersion(id: string, version: number): Promise<SaveResult>;
|
|
60
|
+
/**
|
|
61
|
+
* ๋ฐํํด๋ ๋๋ โ **๋๋ฅด๊ธฐ ์ ์** ๋ฌป๋๋ค.
|
|
62
|
+
*
|
|
63
|
+
* ๋ง๋ ๊ฒ์ ์๋ฒ์ `releaseFigure` ์ด๊ณ ์ด๊ฒ์ ์ด์ ๋ฅผ ๋ฏธ๋ฆฌ ๋ณด์ฌ ์ฃผ๊ธฐ ์ํ ๊ฒ์ด๋ค. ํ๊ฐ์ฆ์ด
|
|
64
|
+
* ์๋๋ฏ๋ก ์ด ๋ต์ด ํต๊ณผ๋ผ ํด๋ ๋ฐํ์ ๋ค์ ํ์ ์ ๋ฐ๋๋ค.
|
|
65
|
+
*/
|
|
66
|
+
export declare function inspectFigure(id: string): Promise<FigureInspection>;
|
|
60
67
|
/** ๋ฐํ๋ ํ๋ค โ ์ต๊ทผ ๊ฒ๋ถํฐ ์ด ๊ฐ. */
|
|
61
68
|
export declare function fetchFigureVersions(id: string): Promise<FigureVersion[]>;
|
|
@@ -23,8 +23,10 @@ function unwrap(response, field) {
|
|
|
23
23
|
/**
|
|
24
24
|
* ๋ชฉ๋ก์ ํ์ํ ํ๋๋ง ๊ฐ์ ธ์จ๋ค โ `source` ๋ ๋ฌด๊ฒ๊ณ ๋ชฉ๋ก์์ ์ฐ์ง ์๋๋ค.
|
|
25
25
|
*
|
|
26
|
-
* `
|
|
27
|
-
*
|
|
26
|
+
* **`thumbnail` ๋ ์ฌ๊ธฐ ์๋ค.** base64 ๋ฌธ์์ด์ด๋ผ ๋ชฉ๋ก ์๋ต์ ์ค์ผ๋ฉด ์นดํ๋ก๊ทธ๋ฅผ ์ด ๋๋ง๋ค ๊ทธ๋ฆผ
|
|
27
|
+
* ์ ๋ถ๊ฐ ๋ค์ ์ค๊ณ (ํ๋ณธ 14๊ฐ 227KB), data URL ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์บ์ํ์ง ๋ชปํ๋ค. ๊ทธ๋ฆผ์ ์ฃผ์๋ก
|
|
28
|
+
* ๋ถ๋ฅธ๋ค(`figure-thumbnail` ๋ผ์ฐํธ). ๋์ `thumbnailUpdatedAt` ์ ๋ฐ๋๋ค โ ๊ทธ๋ฆผ์ด ์๋ ์๋๋ฅผ
|
|
29
|
+
* ๊ทธ๊ฒ์ผ๋ก ์๊ณ , ํ์ ๊ฐ๋ฆฌ๋ ๊ฐ์ผ๋ก๋ ์ด๋ค.
|
|
28
30
|
*/
|
|
29
31
|
const FIGURE_LIST_FIELDS = `
|
|
30
32
|
id
|
|
@@ -32,12 +34,12 @@ const FIGURE_LIST_FIELDS = `
|
|
|
32
34
|
name
|
|
33
35
|
description
|
|
34
36
|
category
|
|
37
|
+
tags
|
|
35
38
|
state
|
|
36
39
|
version
|
|
37
40
|
score
|
|
38
41
|
triangles
|
|
39
42
|
groups
|
|
40
|
-
thumbnail
|
|
41
43
|
thumbnailUpdatedAt
|
|
42
44
|
updatedAt
|
|
43
45
|
updater { id name }
|
|
@@ -209,6 +211,34 @@ export async function revertFigureVersion(id, version) {
|
|
|
209
211
|
});
|
|
210
212
|
return unwrap(response, 'revertFigureVersion');
|
|
211
213
|
}
|
|
214
|
+
/**
|
|
215
|
+
* ๋ฐํํด๋ ๋๋ โ **๋๋ฅด๊ธฐ ์ ์** ๋ฌป๋๋ค.
|
|
216
|
+
*
|
|
217
|
+
* ๋ง๋ ๊ฒ์ ์๋ฒ์ `releaseFigure` ์ด๊ณ ์ด๊ฒ์ ์ด์ ๋ฅผ ๋ฏธ๋ฆฌ ๋ณด์ฌ ์ฃผ๊ธฐ ์ํ ๊ฒ์ด๋ค. ํ๊ฐ์ฆ์ด
|
|
218
|
+
* ์๋๋ฏ๋ก ์ด ๋ต์ด ํต๊ณผ๋ผ ํด๋ ๋ฐํ์ ๋ค์ ํ์ ์ ๋ฐ๋๋ค.
|
|
219
|
+
*/
|
|
220
|
+
export async function inspectFigure(id) {
|
|
221
|
+
const response = await client.query({
|
|
222
|
+
query: gql `
|
|
223
|
+
query InspectFigure($id: String!) {
|
|
224
|
+
inspectFigure(id: $id) {
|
|
225
|
+
blocked
|
|
226
|
+
findings {
|
|
227
|
+
code
|
|
228
|
+
message
|
|
229
|
+
why
|
|
230
|
+
how
|
|
231
|
+
at
|
|
232
|
+
blocking
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
`,
|
|
237
|
+
variables: { id },
|
|
238
|
+
fetchPolicy: 'network-only'
|
|
239
|
+
});
|
|
240
|
+
return unwrap(response, 'inspectFigure');
|
|
241
|
+
}
|
|
212
242
|
/** ๋ฐํ๋ ํ๋ค โ ์ต๊ทผ ๊ฒ๋ถํฐ ์ด ๊ฐ. */
|
|
213
243
|
export async function fetchFigureVersions(id) {
|
|
214
244
|
const response = await client.query({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../client/graphql/index.ts"],"names":[],"mappings":"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","sourcesContent":["import gql from 'graphql-tag'\nimport { client } from '@operato/graphql'\n\nimport type {\n Figure,\n FigureFinding,\n FigureListResult,\n FigurePatch,\n FigureProposal,\n FigureVersion,\n NewFigure\n} from '../types.js'\n\n/**\n * ์๋ต์์ ๊ฐ์ ๊บผ๋ธ๋ค. **์๋ฒ๊ฐ ๋งํ ์ฌ์ ๋ฅผ ๊ทธ๋๋ก ์ฌ๋ฆฐ๋ค.**\n *\n * ์ ์๋ `response.data.figures` ์ฒ๋ผ ๋ฐ๋ก ๊บผ๋๋ค. ์๋ฒ๊ฐ ์ค๋ฅ๋ฅผ ๋๋ ค์ฃผ๋ฉด `data` ๊ฐ\n * ์์ผ๋ฏ๋ก `Cannot read properties of undefined (reading 'figures')` ๊ฐ ๋ฌ๊ณ , ํ๋ฉด์๋\n * ๊ทธ ๋ฌธ์ฅ์ด ๊ทธ๋๋ก ๋ด๋ค. ์ฌ์ฉ์๋ ์๊ธฐ๊ฐ ๋ฌด์์ ์๋ชปํ๋์ง ์ ์ ์๋ค โ ์ค์ ๋ก AI\n * ์์ฒญ์์ ๊ทธ๋ ๊ฒ ๋ฌ๋ค.\n *\n * ๊ฐ์ด `null` ์ธ ๊ฒ์ ์ค๋ฅ๊ฐ ์๋๋ค. ์ง์ด ๊ฒ์ ๋ฌผ์์ ๋์ฒ๋ผ ์๋ ๊ฒ์ด ๋ต์ธ ๊ฒฝ์ฐ๊ฐ ์๋ค.\n * ์ฌ๊ธฐ์ ๋ง๋ ๊ฒ์ **`data` ์์ฒด๊ฐ ์๋ ๊ฒ**์ด๋ค.\n */\nfunction unwrap<T>(response: { data?: Record<string, unknown>; errors?: readonly { message: string }[] }, field: string): T {\n const said = response.errors?.[0]?.message\n if (said) throw new Error(said)\n\n if (!response.data) {\n throw new Error(`์๋ฒ๊ฐ ${field} ๋ฅผ ๋๋ ค์ฃผ์ง ์์์ต๋๋ค.`)\n }\n\n return response.data[field] as T\n}\n\n\n/**\n * ๋ชฉ๋ก์ ํ์ํ ํ๋๋ง ๊ฐ์ ธ์จ๋ค โ `source` ๋ ๋ฌด๊ฒ๊ณ ๋ชฉ๋ก์์ ์ฐ์ง ์๋๋ค.\n *\n * `score`ยท`triangles` ๋ฅผ ํจ๊ป ๋ฐ๋ ์ด์ ๋ ์นด๋์ ๊ทธ๊ฒ์ ๋ณด์ฌ ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค. ์ ์์๊ฐ\n * ๋ชฉ๋ก์์ ใ์ด Figure ๊ฐ ๋ฌด๊ฑฐ์ด๊ฐใ๋ฅผ ๋ฐ๋ก ์์์ผ ํ๋ค.\n */\nconst FIGURE_LIST_FIELDS = `\n id\n type\n name\n description\n category\n state\n version\n score\n triangles\n groups\n thumbnail\n thumbnailUpdatedAt\n updatedAt\n updater { id name }\n`\n\n/**\n * ๋ชฉ๋ก์ ๊ฐ์ ธ์จ๋ค.\n *\n * ๊ฑธ๋ฌ ๋ณด๊ธฐยท์ ๋ ฌยท์ชฝ ๋๋๊ธฐ๋ฅผ **๊ทธ๋๋ก ๋๊ธด๋ค.** ํ๋ฉด์ด `search`ยท`state` ๊ฐ์ ์ด๋ฆ์ ๋ฐ๋ก ๋ง๋ค์ด\n * filter ๋ก ์ฎ๊ธฐ๋ ๊ฒ์ ๊ทธ๋ง๋์๋ค โ ๊ทธ ์ด๋ฆ๋ค์ ๊ฒฉ์(ox-grist)๊ฐ ์ด๋ฏธ ์ปฌ๋ผ ์ค์ ์์ ๋ง๋ค์ด ์ฃผ๊ณ ,\n * ์ค๊ฐ์ ํ ๋ฒ ๋ ๋๋ฉด ๊ฒฉ์๊ฐ ์๋ ์กฐ๊ฑด๊ณผ ์๋ฒ์ ๊ฐ๋ ์กฐ๊ฑด์ด ์ด๊ธ๋๋ค.\n */\nexport async function fetchFigureList(params: {\n page?: number\n limit?: number\n filters?: unknown[]\n sortings?: { name: string; desc?: boolean }[]\n}): Promise<FigureListResult> {\n const response = await client.query({\n query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {\n figures(filters: $filters, pagination: $pagination, sortings: $sortings) {\n items { ${FIGURE_LIST_FIELDS} }\n total\n }\n }\n `,\n variables: {\n filters: params.filters ?? [],\n pagination: { page: params.page ?? 1, limit: params.limit ?? 30 },\n sortings: params.sortings?.length ? params.sortings : [{ name: 'updatedAt', desc: true }]\n },\n fetchPolicy: 'network-only'\n })\n\n return unwrap<FigureListResult>(response, 'figures')\n}\n\n/** ์ ์๋ฉด์ ํ์ํ ์ ๋ถ โ `source` ๋ฅผ ํฌํจํ๋ค. */\nexport async function fetchFigure(id: string): Promise<Figure> {\n const response = await client.query({\n query: gql`\n query ($id: String!) {\n figure(id: $id) {\n ${FIGURE_LIST_FIELDS}\n source\n properties\n }\n }\n `,\n variables: { id },\n fetchPolicy: 'network-only'\n })\n\n return unwrap<Figure>(response, 'figure')\n}\n\n/**\n * ์ด๋ฏธ ์ฐ์ด๊ณ ์๋ ํ์
์ด๋ฆ.\n *\n * `type` ์ ๋ง๋ ๋ค์ ๊ณ ์น ์ ์์ผ๋ฏ๋ก **๋ง๋ค๊ธฐ ์ ์** ์๋ ค ์ค์ผ ํ๋ค. ์ ์ฅ์ ๋๋ฌ\n * ๊ฑฐ์ ๋นํ๊ณ ๋์ ์๋ ๊ฒ์ ๋ฆ๋ค.\n */\nexport async function fetchFigureTypeNames(): Promise<string[]> {\n const response = await client.query({\n query: gql`\n query {\n figureTypeNames\n }\n `,\n fetchPolicy: 'network-only'\n })\n\n return unwrap<string[] | null>(response, 'figureTypeNames') ?? []\n}\n\nexport interface SaveResult {\n figure: Figure\n /** ๋ง์ง ์๋ ๋ฐ๊ฒฌ. ์ ์ฅ์ ๋์ง๋ง ํ๋ฉด์ด ๋ณด์ฌ ์ค์ผ ํ๋ค. */\n violations: FigureFinding[]\n}\n\nexport async function createFigure(figure: NewFigure): Promise<SaveResult> {\n const response = await client.mutate({\n mutation: gql`\n mutation ($figure: NewFigure!) {\n createFigure(figure: $figure) {\n figure { ${FIGURE_LIST_FIELDS} source }\n violations { code message at }\n }\n }\n `,\n variables: { figure }\n })\n\n return unwrap<SaveResult>(response, 'createFigure')\n}\n\nexport async function updateFigure(id: string, patch: FigurePatch): Promise<SaveResult> {\n const response = await client.mutate({\n mutation: gql`\n mutation ($id: String!, $patch: FigurePatch!) {\n updateFigure(id: $id, patch: $patch) {\n figure { ${FIGURE_LIST_FIELDS} source }\n violations { code message at }\n }\n }\n `,\n variables: { id, patch }\n })\n\n return unwrap<SaveResult>(response, 'updateFigure')\n}\n\nexport async function deleteFigure(id: string): Promise<boolean> {\n const response = await client.mutate({\n mutation: gql`\n mutation ($id: String!) {\n deleteFigure(id: $id)\n }\n `,\n variables: { id }\n })\n\n return unwrap<boolean>(response, 'deleteFigure')\n}\n\n/**\n * ์ ์ ๋ณด์กฐ์๊ฒ ํ๋ณด๋ฅผ ์ํจ๋ค.\n *\n * ํ๋ ํธ๋ฅผ **ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ๋ค.** ์๋ฒ๋ ํ๋ ํธ๋ฅผ ๋ชจ๋ฅธ๋ค โ things-scene ์ด ๊ฐ๊ณ \n * ์๋๋ฐ ๊ทธ ํจํค์ง์ node ์กฐ๊ฑด์ ํ๋ ํธ๊ฐ ์๋ ๋ฒ๋ค๋ก ๊ฐ๋ค. ๊ทธ๋ฆฌ๋ ์ชฝ์ด ์ด๋ค ํ ํฐ์\n * ํ ์ ์๋์ง ์๋ ์ ์ผํ ์๋ฆฌ์ด๋ฏ๋ก ๊ทธ์ชฝ์ด ๋ณด๋ธ๋ค.\n *\n * ๋์์ค๋ ๊ฒ์ **ํ๋ณด**๋ค. ์ ์ฅ๋์ง ์์๋ค โ ์ ์์๊ฐ ๋ฐ์์ผ ์ ๋ณธ์ด ๋๋ค.\n */\nexport async function proposeFigure(request: {\n prompt: string\n base?: string\n type?: string\n palette: string[]\n image?: File\n}): Promise<FigureProposal> {\n const response = await client.mutate({\n mutation: gql`\n mutation ProposeFigure($request: ProposeRequest!) {\n proposeFigure(request: $request) {\n source\n score\n grade\n triangles\n groups\n attempts\n violations {\n code\n message\n }\n }\n }\n `,\n variables: { request }\n })\n\n return unwrap<FigureProposal>(response, 'proposeFigure')\n}\n\n/**\n * ๋ฐํํ๋ค โ ํ ๋ฒํธ๊ฐ ์ค๋ฅด๊ณ , ๊ทธ ์๊ฐ์ด ํ๋ณธ์ผ๋ก ๋จ๋๋ค.\n *\n * ์ด๋ฏธ ๋ฐํ๋ ๊ฒ์ ๋ค์ ๋ฐํํ๋ฉด ์๋ฒ๊ฐ ๊ฑฐ์ ํ๋ค. ๊ณ ์ณ์ ๋ค์ ๋ด๋ ค๋ฉด ์ ์ฅ์ด ๋จผ์ ์ด๊ณ , ์ ์ฅ์\n * ๋ฐํ์ ํผ๋ค(์ด์์ผ๋ก ๋์์จ๋ค).\n */\nexport async function releaseFigure(id: string, comment?: string): Promise<Figure> {\n const response = await client.mutate({\n mutation: gql`\n mutation ReleaseFigure($id: String!, $comment: String) {\n releaseFigure(id: $id, comment: $comment) {\n id\n version\n state\n updatedAt\n }\n }\n `,\n variables: { id, comment }\n })\n\n return unwrap<Figure>(response, 'releaseFigure')\n}\n\n/** ์ ํ์ ์ด์์ผ๋ก ๋์ด๋ฆฐ๋ค. ์ ๋ณธยท์์ฑยท๊ทธ๋ฆผ์ด ๋์์ค๊ณ ์ด๋ฆยท์ค๋ช
์ ๊ทธ๋๋ก๋ค. */\nexport async function revertFigureVersion(id: string, version: number): Promise<SaveResult> {\n const response = await client.mutate({\n mutation: gql`\n mutation RevertFigureVersion($id: String!, $version: Float!) {\n revertFigureVersion(id: $id, version: $version) {\n figure { ${FIGURE_LIST_FIELDS} source }\n violations { code message at }\n }\n }\n `,\n variables: { id, version }\n })\n\n return unwrap<SaveResult>(response, 'revertFigureVersion')\n}\n\n/** ๋ฐํ๋ ํ๋ค โ ์ต๊ทผ ๊ฒ๋ถํฐ ์ด ๊ฐ. */\nexport async function fetchFigureVersions(id: string): Promise<FigureVersion[]> {\n const response = await client.query({\n query: gql`\n query FigureVersions($id: String!) {\n figureVersions(id: $id) {\n version\n comment\n state\n updatedAt\n updater { id name }\n score\n triangles\n groups\n }\n }\n `,\n variables: { id },\n fetchPolicy: 'network-only'\n })\n\n return unwrap<FigureVersion[]>(response, 'figureVersions') ?? []\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../client/graphql/index.ts"],"names":[],"mappings":"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","sourcesContent":["import gql from 'graphql-tag'\nimport { client } from '@operato/graphql'\n\nimport type {\n Figure,\n FigureFinding,\n FigureInspection,\n FigureListResult,\n FigurePatch,\n FigureProposal,\n FigureVersion,\n NewFigure\n} from '../types.js'\n\n/**\n * ์๋ต์์ ๊ฐ์ ๊บผ๋ธ๋ค. **์๋ฒ๊ฐ ๋งํ ์ฌ์ ๋ฅผ ๊ทธ๋๋ก ์ฌ๋ฆฐ๋ค.**\n *\n * ์ ์๋ `response.data.figures` ์ฒ๋ผ ๋ฐ๋ก ๊บผ๋๋ค. ์๋ฒ๊ฐ ์ค๋ฅ๋ฅผ ๋๋ ค์ฃผ๋ฉด `data` ๊ฐ\n * ์์ผ๋ฏ๋ก `Cannot read properties of undefined (reading 'figures')` ๊ฐ ๋ฌ๊ณ , ํ๋ฉด์๋\n * ๊ทธ ๋ฌธ์ฅ์ด ๊ทธ๋๋ก ๋ด๋ค. ์ฌ์ฉ์๋ ์๊ธฐ๊ฐ ๋ฌด์์ ์๋ชปํ๋์ง ์ ์ ์๋ค โ ์ค์ ๋ก AI\n * ์์ฒญ์์ ๊ทธ๋ ๊ฒ ๋ฌ๋ค.\n *\n * ๊ฐ์ด `null` ์ธ ๊ฒ์ ์ค๋ฅ๊ฐ ์๋๋ค. ์ง์ด ๊ฒ์ ๋ฌผ์์ ๋์ฒ๋ผ ์๋ ๊ฒ์ด ๋ต์ธ ๊ฒฝ์ฐ๊ฐ ์๋ค.\n * ์ฌ๊ธฐ์ ๋ง๋ ๊ฒ์ **`data` ์์ฒด๊ฐ ์๋ ๊ฒ**์ด๋ค.\n */\nfunction unwrap<T>(response: { data?: Record<string, unknown>; errors?: readonly { message: string }[] }, field: string): T {\n const said = response.errors?.[0]?.message\n if (said) throw new Error(said)\n\n if (!response.data) {\n throw new Error(`์๋ฒ๊ฐ ${field} ๋ฅผ ๋๋ ค์ฃผ์ง ์์์ต๋๋ค.`)\n }\n\n return response.data[field] as T\n}\n\n\n/**\n * ๋ชฉ๋ก์ ํ์ํ ํ๋๋ง ๊ฐ์ ธ์จ๋ค โ `source` ๋ ๋ฌด๊ฒ๊ณ ๋ชฉ๋ก์์ ์ฐ์ง ์๋๋ค.\n *\n * **`thumbnail` ๋ ์ฌ๊ธฐ ์๋ค.** base64 ๋ฌธ์์ด์ด๋ผ ๋ชฉ๋ก ์๋ต์ ์ค์ผ๋ฉด ์นดํ๋ก๊ทธ๋ฅผ ์ด ๋๋ง๋ค ๊ทธ๋ฆผ\n * ์ ๋ถ๊ฐ ๋ค์ ์ค๊ณ (ํ๋ณธ 14๊ฐ 227KB), data URL ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์บ์ํ์ง ๋ชปํ๋ค. ๊ทธ๋ฆผ์ ์ฃผ์๋ก\n * ๋ถ๋ฅธ๋ค(`figure-thumbnail` ๋ผ์ฐํธ). ๋์ `thumbnailUpdatedAt` ์ ๋ฐ๋๋ค โ ๊ทธ๋ฆผ์ด ์๋ ์๋๋ฅผ\n * ๊ทธ๊ฒ์ผ๋ก ์๊ณ , ํ์ ๊ฐ๋ฆฌ๋ ๊ฐ์ผ๋ก๋ ์ด๋ค.\n */\nconst FIGURE_LIST_FIELDS = `\n id\n type\n name\n description\n category\n tags\n state\n version\n score\n triangles\n groups\n thumbnailUpdatedAt\n updatedAt\n updater { id name }\n`\n\n/**\n * ๋ชฉ๋ก์ ๊ฐ์ ธ์จ๋ค.\n *\n * ๊ฑธ๋ฌ ๋ณด๊ธฐยท์ ๋ ฌยท์ชฝ ๋๋๊ธฐ๋ฅผ **๊ทธ๋๋ก ๋๊ธด๋ค.** ํ๋ฉด์ด `search`ยท`state` ๊ฐ์ ์ด๋ฆ์ ๋ฐ๋ก ๋ง๋ค์ด\n * filter ๋ก ์ฎ๊ธฐ๋ ๊ฒ์ ๊ทธ๋ง๋์๋ค โ ๊ทธ ์ด๋ฆ๋ค์ ๊ฒฉ์(ox-grist)๊ฐ ์ด๋ฏธ ์ปฌ๋ผ ์ค์ ์์ ๋ง๋ค์ด ์ฃผ๊ณ ,\n * ์ค๊ฐ์ ํ ๋ฒ ๋ ๋๋ฉด ๊ฒฉ์๊ฐ ์๋ ์กฐ๊ฑด๊ณผ ์๋ฒ์ ๊ฐ๋ ์กฐ๊ฑด์ด ์ด๊ธ๋๋ค.\n */\nexport async function fetchFigureList(params: {\n page?: number\n limit?: number\n filters?: unknown[]\n sortings?: { name: string; desc?: boolean }[]\n}): Promise<FigureListResult> {\n const response = await client.query({\n query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {\n figures(filters: $filters, pagination: $pagination, sortings: $sortings) {\n items { ${FIGURE_LIST_FIELDS} }\n total\n }\n }\n `,\n variables: {\n filters: params.filters ?? [],\n pagination: { page: params.page ?? 1, limit: params.limit ?? 30 },\n sortings: params.sortings?.length ? params.sortings : [{ name: 'updatedAt', desc: true }]\n },\n fetchPolicy: 'network-only'\n })\n\n return unwrap<FigureListResult>(response, 'figures')\n}\n\n/** ์ ์๋ฉด์ ํ์ํ ์ ๋ถ โ `source` ๋ฅผ ํฌํจํ๋ค. */\nexport async function fetchFigure(id: string): Promise<Figure> {\n const response = await client.query({\n query: gql`\n query ($id: String!) {\n figure(id: $id) {\n ${FIGURE_LIST_FIELDS}\n source\n properties\n }\n }\n `,\n variables: { id },\n fetchPolicy: 'network-only'\n })\n\n return unwrap<Figure>(response, 'figure')\n}\n\n/**\n * ์ด๋ฏธ ์ฐ์ด๊ณ ์๋ ํ์
์ด๋ฆ.\n *\n * `type` ์ ๋ง๋ ๋ค์ ๊ณ ์น ์ ์์ผ๋ฏ๋ก **๋ง๋ค๊ธฐ ์ ์** ์๋ ค ์ค์ผ ํ๋ค. ์ ์ฅ์ ๋๋ฌ\n * ๊ฑฐ์ ๋นํ๊ณ ๋์ ์๋ ๊ฒ์ ๋ฆ๋ค.\n */\nexport async function fetchFigureTypeNames(): Promise<string[]> {\n const response = await client.query({\n query: gql`\n query {\n figureTypeNames\n }\n `,\n fetchPolicy: 'network-only'\n })\n\n return unwrap<string[] | null>(response, 'figureTypeNames') ?? []\n}\n\nexport interface SaveResult {\n figure: Figure\n /** ๋ง์ง ์๋ ๋ฐ๊ฒฌ. ์ ์ฅ์ ๋์ง๋ง ํ๋ฉด์ด ๋ณด์ฌ ์ค์ผ ํ๋ค. */\n violations: FigureFinding[]\n}\n\nexport async function createFigure(figure: NewFigure): Promise<SaveResult> {\n const response = await client.mutate({\n mutation: gql`\n mutation ($figure: NewFigure!) {\n createFigure(figure: $figure) {\n figure { ${FIGURE_LIST_FIELDS} source }\n violations { code message at }\n }\n }\n `,\n variables: { figure }\n })\n\n return unwrap<SaveResult>(response, 'createFigure')\n}\n\nexport async function updateFigure(id: string, patch: FigurePatch): Promise<SaveResult> {\n const response = await client.mutate({\n mutation: gql`\n mutation ($id: String!, $patch: FigurePatch!) {\n updateFigure(id: $id, patch: $patch) {\n figure { ${FIGURE_LIST_FIELDS} source }\n violations { code message at }\n }\n }\n `,\n variables: { id, patch }\n })\n\n return unwrap<SaveResult>(response, 'updateFigure')\n}\n\nexport async function deleteFigure(id: string): Promise<boolean> {\n const response = await client.mutate({\n mutation: gql`\n mutation ($id: String!) {\n deleteFigure(id: $id)\n }\n `,\n variables: { id }\n })\n\n return unwrap<boolean>(response, 'deleteFigure')\n}\n\n/**\n * ์ ์ ๋ณด์กฐ์๊ฒ ํ๋ณด๋ฅผ ์ํจ๋ค.\n *\n * ํ๋ ํธ๋ฅผ **ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ๋ค.** ์๋ฒ๋ ํ๋ ํธ๋ฅผ ๋ชจ๋ฅธ๋ค โ things-scene ์ด ๊ฐ๊ณ \n * ์๋๋ฐ ๊ทธ ํจํค์ง์ node ์กฐ๊ฑด์ ํ๋ ํธ๊ฐ ์๋ ๋ฒ๋ค๋ก ๊ฐ๋ค. ๊ทธ๋ฆฌ๋ ์ชฝ์ด ์ด๋ค ํ ํฐ์\n * ํ ์ ์๋์ง ์๋ ์ ์ผํ ์๋ฆฌ์ด๋ฏ๋ก ๊ทธ์ชฝ์ด ๋ณด๋ธ๋ค.\n *\n * ๋์์ค๋ ๊ฒ์ **ํ๋ณด**๋ค. ์ ์ฅ๋์ง ์์๋ค โ ์ ์์๊ฐ ๋ฐ์์ผ ์ ๋ณธ์ด ๋๋ค.\n */\nexport async function proposeFigure(request: {\n prompt: string\n base?: string\n type?: string\n palette: string[]\n image?: File\n}): Promise<FigureProposal> {\n const response = await client.mutate({\n mutation: gql`\n mutation ProposeFigure($request: ProposeRequest!) {\n proposeFigure(request: $request) {\n source\n score\n grade\n triangles\n groups\n attempts\n violations {\n code\n message\n }\n }\n }\n `,\n variables: { request }\n })\n\n return unwrap<FigureProposal>(response, 'proposeFigure')\n}\n\n/**\n * ๋ฐํํ๋ค โ ํ ๋ฒํธ๊ฐ ์ค๋ฅด๊ณ , ๊ทธ ์๊ฐ์ด ํ๋ณธ์ผ๋ก ๋จ๋๋ค.\n *\n * ์ด๋ฏธ ๋ฐํ๋ ๊ฒ์ ๋ค์ ๋ฐํํ๋ฉด ์๋ฒ๊ฐ ๊ฑฐ์ ํ๋ค. ๊ณ ์ณ์ ๋ค์ ๋ด๋ ค๋ฉด ์ ์ฅ์ด ๋จผ์ ์ด๊ณ , ์ ์ฅ์\n * ๋ฐํ์ ํผ๋ค(์ด์์ผ๋ก ๋์์จ๋ค).\n */\nexport async function releaseFigure(id: string, comment?: string): Promise<Figure> {\n const response = await client.mutate({\n mutation: gql`\n mutation ReleaseFigure($id: String!, $comment: String) {\n releaseFigure(id: $id, comment: $comment) {\n id\n version\n state\n updatedAt\n }\n }\n `,\n variables: { id, comment }\n })\n\n return unwrap<Figure>(response, 'releaseFigure')\n}\n\n/** ์ ํ์ ์ด์์ผ๋ก ๋์ด๋ฆฐ๋ค. ์ ๋ณธยท์์ฑยท๊ทธ๋ฆผ์ด ๋์์ค๊ณ ์ด๋ฆยท์ค๋ช
์ ๊ทธ๋๋ก๋ค. */\nexport async function revertFigureVersion(id: string, version: number): Promise<SaveResult> {\n const response = await client.mutate({\n mutation: gql`\n mutation RevertFigureVersion($id: String!, $version: Float!) {\n revertFigureVersion(id: $id, version: $version) {\n figure { ${FIGURE_LIST_FIELDS} source }\n violations { code message at }\n }\n }\n `,\n variables: { id, version }\n })\n\n return unwrap<SaveResult>(response, 'revertFigureVersion')\n}\n\n/**\n * ๋ฐํํด๋ ๋๋ โ **๋๋ฅด๊ธฐ ์ ์** ๋ฌป๋๋ค.\n *\n * ๋ง๋ ๊ฒ์ ์๋ฒ์ `releaseFigure` ์ด๊ณ ์ด๊ฒ์ ์ด์ ๋ฅผ ๋ฏธ๋ฆฌ ๋ณด์ฌ ์ฃผ๊ธฐ ์ํ ๊ฒ์ด๋ค. ํ๊ฐ์ฆ์ด\n * ์๋๋ฏ๋ก ์ด ๋ต์ด ํต๊ณผ๋ผ ํด๋ ๋ฐํ์ ๋ค์ ํ์ ์ ๋ฐ๋๋ค.\n */\nexport async function inspectFigure(id: string): Promise<FigureInspection> {\n const response = await client.query({\n query: gql`\n query InspectFigure($id: String!) {\n inspectFigure(id: $id) {\n blocked\n findings {\n code\n message\n why\n how\n at\n blocking\n }\n }\n }\n `,\n variables: { id },\n fetchPolicy: 'network-only'\n })\n\n return unwrap<FigureInspection>(response, 'inspectFigure')\n}\n\n/** ๋ฐํ๋ ํ๋ค โ ์ต๊ทผ ๊ฒ๋ถํฐ ์ด ๊ฐ. */\nexport async function fetchFigureVersions(id: string): Promise<FigureVersion[]> {\n const response = await client.query({\n query: gql`\n query FigureVersions($id: String!) {\n figureVersions(id: $id) {\n version\n comment\n state\n updatedAt\n updater { id name }\n score\n triangles\n groups\n }\n }\n `,\n variables: { id },\n fetchPolicy: 'network-only'\n })\n\n return unwrap<FigureVersion[]>(response, 'figureVersions') ?? []\n}\n"]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { LitElement, type TemplateResult } from 'lit';
|
|
2
|
+
import type { BoardModel, PartModel } from './figure-source.js';
|
|
3
|
+
declare const FigureAnimations_base: (new (...args: any[]) => LitElement) & typeof LitElement;
|
|
4
|
+
export declare class FigureAnimations extends FigureAnimations_base {
|
|
5
|
+
static styles: import("lit").CSSResult[];
|
|
6
|
+
board?: BoardModel;
|
|
7
|
+
parts: PartModel[];
|
|
8
|
+
/** ํผ์ณ ๋ clip. ์ด๋ฆ์ด ์๋๋ผ ์๋ฆฌ๋ก ์ก๋๋ค โ ์ด๋ฆ์ ํธ์ง ์ค์ ๋ฐ๋๋ค. */
|
|
9
|
+
private open;
|
|
10
|
+
private get clips();
|
|
11
|
+
/** ๋ถํ ์ด๋ฆ โ ์ฑ๋์ด ์ด๊ฒ์ ๊ฐ๋ฆฌํจ๋ค. */
|
|
12
|
+
private get partNames();
|
|
13
|
+
/**
|
|
14
|
+
* ๋ช ๋ถํ์ด ์์ง์ด๋ โ ์ฑ๋์ด ๊ฐ๋ฆฌํค๋ **์๋ก ๋ค๋ฅธ ๋ถํ**์ ์.
|
|
15
|
+
*
|
|
16
|
+
* clip ์๊ฐ ์๋๋ค. ํ ๋ถํ์ ์ธ clip ์ด ์์ง์ฌ๋ ๊ทธ ๋ถํ ํ๋๊ฐ ๋จ๋
๋ฌถ์์ด ๋ ๋ฟ์ด๋ค.
|
|
17
|
+
* ์ฒญ์ฌ์ง์ด ๋ฌถ์์ ๊ฐ๋ฅด๋ ๊ธฐ์ค๊ณผ ๊ฐ์ ์
์ด์ด์ผ ํ๋ฉด์ ์์ ํ์ ์ ์๊ฐ ๋ง๋๋ค.
|
|
18
|
+
*/
|
|
19
|
+
private get movingParts();
|
|
20
|
+
render(): TemplateResult;
|
|
21
|
+
/**
|
|
22
|
+
* ๋น ํ๋ฉด โ **์ด ํญ์ด ๋ฌด์์ธ์ง ๊ฐ๋ฅด์น๋ ์๋ฆฌ๋ค.**
|
|
23
|
+
*
|
|
24
|
+
* ใclip ์ ์ถ๊ฐํ์ธ์ใ๋ผ๊ณ ๋ง ์ฐ๋ฉด ์ฒ์ ์ฌ๋ ์ฌ๋์ clip ์ด ๋ฌด์์ธ์ง ๋ชจ๋ฅธ ์ฑ ๋จ์ถ๋ฅผ ๋๋ฅธ๋ค.
|
|
25
|
+
* ๊ทธ๋์ ๋ฌด์์ ๋ง๋ค ์ ์๋์ง ์๋ฅผ ๋ค๊ณ , ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์์ง์ด๋์ง(์ฌ์ค์ด ๋ค์ด์จ๋ค)๋ฅผ ์ ๋๋ค.
|
|
26
|
+
*/
|
|
27
|
+
private renderEmpty;
|
|
28
|
+
private renderClips;
|
|
29
|
+
private renderClip;
|
|
30
|
+
private renderChannels;
|
|
31
|
+
/**
|
|
32
|
+
* ์ฑ๋ ํ๋ โ ์ด๋ ๋ถํ์ ์ด๋ ์์ฑ์ ์์ง์ด๋.
|
|
33
|
+
*
|
|
34
|
+
* ์๋ ๋ถํ์ ๊ฐ๋ฆฌํค๋ ์ฑ๋์ ๋ถ๊ฒ ๋ธ๋ค. ๋ถํ ์ด๋ฆ์ ๋ฐ๊พธ๋ฉด ๊ทธ ์๊ฐ ์ด๋ ๊ฒ ๋๋๋ฐ,
|
|
35
|
+
* ๊ฒ์ฆ์ ์ ์ฅํ ๋ ๋งํ๊ณ ์ฌ๊ธฐ์๋ **๊ทธ ์๋ฆฌ์์** ๋ณด์ฌ ์ค๋ค.
|
|
36
|
+
*/
|
|
37
|
+
private renderChannel;
|
|
38
|
+
/**
|
|
39
|
+
* ํ์ ์ค์ฌ โ **`rotation` ์์๋ง ๋ป์ด ์๋ค.**
|
|
40
|
+
*
|
|
41
|
+
* ๊ทธ๋์ ๊ฒฝ๋ก๊ฐ rotation ์ผ ๋๋ง ๋ธ๋ค. ์ธ์ ๋ ๋ด๋ฉด ์ ์์๊ฐ ์ฎ๊นยท๋ฐฐ์จ์๋ ์ ๊ณ , ๊ฒ์ฆ์ด
|
|
42
|
+
* ์ ์ฅํ ๋ ใ์ฐ์ด์ง ์๋๋คใ๊ณ ์๋ฆฐ๋ค. ์ ๋ณด์ด๋ฉด ์ ์ ์ผ์ด ์๋ค.
|
|
43
|
+
*/
|
|
44
|
+
private renderPivot;
|
|
45
|
+
/**
|
|
46
|
+
* ํคํ๋ ์ ํ.
|
|
47
|
+
*
|
|
48
|
+
* **๋ ๋ฏธ๋ง์ผ๋ก ๋ชป ๋ด๋ ค๊ฐ๋ค.** ํ๋๋ฟ์ด๋ฉด ์์ง์ด๋ ๊ฒ์ด ์๋๋ผ ์์ธ ํ๋์ด๊ณ , ํ์์ด
|
|
49
|
+
* ์ค๋ฅ๋ก ๋ง๋๋ค. ์ ์ฅํ๊ณ ๋์ ์๋ ค ์ฃผ๋ ๊ฒ๋ณด๋ค ์ง์ฐ๋ ๋จ์ถ๋ฅผ ์ฃฝ์ด๋ ๊ฒ์ด ๋ซ๋ค.
|
|
50
|
+
*
|
|
51
|
+
* ์๊ฐ์ด ์ค๋ฆ์ฐจ์์ด์ด์ผ ํ๋ ๊ฒ๋ ํ์์ ๊ท์น์ด๋ค. ์ฌ๊ธฐ์๋ ์ด๊ธ๋ ์ค์ ๋ถ๊ฒ ๋ด๊ณ ๊ฐ์
|
|
52
|
+
* ๊ณ ์น์ง๋ ์๋๋ค โ ์ ์์๊ฐ 3 ์ 1 ๋ก ๊ณ ์น๋ ์ค์ผ ์ ์๋ค.
|
|
53
|
+
*/
|
|
54
|
+
private renderKeys;
|
|
55
|
+
/**
|
|
56
|
+
* ์์ง์ด๋ ๋ถํ ์์ฐ.
|
|
57
|
+
*
|
|
58
|
+
* **๋์ด๋ ๋ง์ง ์๋๋ค.** ์์ง์ด๋ ๋ถํ์ ์ ๋ง๋ค ๋จ๋
๋ฌถ์์ด๋ผ draw call ์ด ๋๊ณ ํ๋ ์๋ง๋ค
|
|
59
|
+
* ๊ฐฑ์ ์ด ๋๋ค โ ๊ทธ ๋๊ฐ๊ฐ ์๋ก ๋ณด์ด๋ฉด ์ ์์๊ฐ ์๋๋ค. ๋๋๋งํฌ ์ค๋น ํ๋๋ ์ ๊ตํด๋ ๋๊ณ ,
|
|
60
|
+
* ๊ทธ ๊ฐ์ด ๋๋ฉด ์์ฐ์ ๋๋ฌ๋๋ฉด ๋๋ค.
|
|
61
|
+
*/
|
|
62
|
+
private renderBudget;
|
|
63
|
+
/**
|
|
64
|
+
* ๋ณด๋์ ์ค์ด ์ฌ๋ ค๋ณด๋ธ๋ค.
|
|
65
|
+
*
|
|
66
|
+
* `animations` ๋ ๋ํ ์ ์ฒด์ ๊ฒ์ด๋ฏ๋ก ๋ถํ ํธ์ง(`update-part`)์ด ์๋๋ผ `update-board` ๋ก
|
|
67
|
+
* ๊ฐ๋ค. ๋น ๋ฐฐ์ด์ ์นธ์ ์ง์ด๋ค โ clip ์ ๋ค ์ง์ด ๋ํ์ `animations: []` ๊ฐ ์๋๋ผ ์๋ ๊ฒ์ด๋ค.
|
|
68
|
+
*/
|
|
69
|
+
private tell;
|
|
70
|
+
private patchClip;
|
|
71
|
+
private patchChannel;
|
|
72
|
+
private addClip;
|
|
73
|
+
private renameClip;
|
|
74
|
+
private setDrive;
|
|
75
|
+
private removeClip;
|
|
76
|
+
private addChannel;
|
|
77
|
+
private setChannel;
|
|
78
|
+
/**
|
|
79
|
+
* ๊ฒฝ๋ก๋ฅผ ๋ฐ๊พผ๋ค โ **๊ฐ๊น์ง ํจ๊ป ์ฎ๊ธด๋ค.**
|
|
80
|
+
*
|
|
81
|
+
* ์ฎ๊นยทํ์ ์ 0 ์ ใ์ ์๋ฆฌใ์ธ๋ฐ ๋ฐฐ์จ์ 0 ์ **๋ถํ์ ์ง์ด๋ค.** ๊ฒฝ๋ก๋ง ๋ฐ๊พธ๊ณ ๊ฐ์ ๊ทธ๋๋ก
|
|
82
|
+
* ๋๋ฉด ์ ์์๋ ๋ถํ์ด ์ฌ๋ผ์ง ๊ฒ์ ๋ณด๊ณ ๋๊ตฌ๊ฐ ๊ณ ์ฅ ๋ ์ค ์๋ค. ๊ทธ๋์ ์ฎ๊นยทํ์ โ ๋ฐฐ์จ์
|
|
83
|
+
* ๊ฑด๋ ๋ ์์๊ฐ์ ๊ทธ ๊ฒฝ๋ก์ ์ ์๋ฆฌ๋ก ๋๋๋ฆฐ๋ค. ์๊ฐ์ ์งํจ๋ค โ ์ ์์๊ฐ ์ง ๋ฐ์๋ค.
|
|
84
|
+
*/
|
|
85
|
+
private setPath;
|
|
86
|
+
private removeChannel;
|
|
87
|
+
/** ๋ง์ง๋ง ํค์์ 1 ์ด ๋ค. ๊ฐ์ ๊ทธ ํค๋ฅผ ๊ทธ๋๋ก ๋ฐ๋๋ค โ ๋ถ์ฌ ๋๊ณ ๊ณ ์น๋ ๊ฒ์ด ์ง๊ธฐ ์ฝ๋ค. */
|
|
88
|
+
private addKey;
|
|
89
|
+
private setKey;
|
|
90
|
+
/** ๋ ๋ฏธ๋ง์ผ๋ก ๋ด๋ ค๊ฐ์ง ์๋๋ค โ ๋จ์ถ๊ฐ ์ด๋ฏธ ์ฃฝ์ด ์์ง๋ง ๋ฐ์์ ๋ถ๋ฆด ์ ์๋ค. */
|
|
91
|
+
private removeKey;
|
|
92
|
+
}
|
|
93
|
+
export {};
|