@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
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import '@operato/data-grist'
|
|
2
2
|
import '@material/web/icon/icon.js'
|
|
3
|
+
import '../viewparts/figure-thumb.js'
|
|
3
4
|
|
|
4
5
|
import { css, html } from 'lit'
|
|
5
6
|
import { customElement, property, query } from 'lit/decorators.js'
|
|
@@ -35,12 +36,21 @@ const CAPACITY = 'font-weight: 700; color: var(--md-sys-color-primary);'
|
|
|
35
36
|
const UNMEASURED = 'font-style: italic; color: var(--md-sys-color-outline);'
|
|
36
37
|
const RELEASED = 'font-weight: 700; color: var(--md-sys-color-primary);'
|
|
37
38
|
const DRAFT = 'color: var(--md-sys-color-tertiary);'
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
39
|
+
/**
|
|
40
|
+
* 조용히 적는 숫자. 낮은 것만 점으로 눈에 걸리게 한다.
|
|
41
|
+
*
|
|
42
|
+
* **`inline-flex` 를 쓰지 않는다.** 썼더니 점이 뜨는 카드에서만 이 값이 옆의 두 값과 밑줄이
|
|
43
|
+
* 어긋났다 — inline-flex 상자의 밑줄은 **첫 항목**에서 오는데, 첫 항목이 글자 없는 점이라
|
|
44
|
+
* 밑줄이 없어 브라우저가 상자 아래를 밑줄로 삼는다. 점이 없는 카드(50 이상)는 멀쩡했으므로
|
|
45
|
+
* 한 줄에 세 값이 나란히 설 때만 눈에 띄었다.
|
|
46
|
+
*
|
|
47
|
+
* 그냥 인라인으로 두면 이 상자의 밑줄이 곧 숫자의 밑줄이라 옆의 둘과 맞는다. 점은 제 몫으로
|
|
48
|
+
* 글자 가운데에 맞춘다.
|
|
49
|
+
*/
|
|
50
|
+
const SCORE = 'font-variant-numeric: tabular-nums;'
|
|
51
|
+
const LOW_DOT =
|
|
52
|
+
'display: inline-block; width: 5px; height: 5px; margin-right: 4px; vertical-align: middle; ' +
|
|
53
|
+
'border-radius: 50%; background-color: var(--md-sys-color-error);'
|
|
44
54
|
|
|
45
55
|
/*
|
|
46
56
|
* `as typeof PageView` 로 조이지 않는다 — 그렇게 하면 p13n 이 얹어 주는
|
|
@@ -78,6 +88,44 @@ export class FigureListPage extends FigureListPageBase {
|
|
|
78
88
|
width: 100%;
|
|
79
89
|
background-color: var(--md-sys-color-surface);
|
|
80
90
|
color: var(--md-sys-color-on-surface);
|
|
91
|
+
/* 떠 있는 단추의 기준 상자 */
|
|
92
|
+
position: relative;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/*
|
|
96
|
+
── 만들기 단추 ────────────────────────────────────────────────────────
|
|
97
|
+
이 화면의 주된 동작 하나. 목록 위에 떠 있고 자리를 먹지 않는다.
|
|
98
|
+
|
|
99
|
+
글자를 함께 둔다(extended FAB). 아이콘만 두면 처음 온 사람은 + 표가 무엇을 만드는지
|
|
100
|
+
모른다 — 이 화면에서 만들 수 있는 것이 무엇인지가 그 글자다.
|
|
101
|
+
*/
|
|
102
|
+
button[fab] {
|
|
103
|
+
position: absolute;
|
|
104
|
+
right: var(--spacing-large, 12px);
|
|
105
|
+
bottom: var(--spacing-large, 12px);
|
|
106
|
+
z-index: 10;
|
|
107
|
+
|
|
108
|
+
display: flex;
|
|
109
|
+
align-items: center;
|
|
110
|
+
gap: 6px;
|
|
111
|
+
padding: 10px 18px 10px 14px;
|
|
112
|
+
font: var(--label-font, inherit);
|
|
113
|
+
font-size: 0.82rem;
|
|
114
|
+
font-weight: 600;
|
|
115
|
+
color: var(--md-sys-color-on-primary-container);
|
|
116
|
+
background-color: var(--md-sys-color-primary-container);
|
|
117
|
+
border: none;
|
|
118
|
+
/* 떠 있는 것의 모서리는 알약이다 — 담는 면(6px)을 따르지 않는다 */
|
|
119
|
+
border-radius: var(--md-sys-shape-corner-full, 999px);
|
|
120
|
+
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.18);
|
|
121
|
+
cursor: pointer;
|
|
122
|
+
}
|
|
123
|
+
button[fab]:hover {
|
|
124
|
+
color: var(--md-sys-color-on-primary, #fff);
|
|
125
|
+
background-color: var(--md-sys-color-primary);
|
|
126
|
+
}
|
|
127
|
+
button[fab] md-icon {
|
|
128
|
+
--md-icon-size: 20px;
|
|
81
129
|
}
|
|
82
130
|
|
|
83
131
|
/* 격자가 바깥에 요구하는 것은 확정된 높이 하나뿐이다 — 스크롤은 격자가 안에서 한다 */
|
|
@@ -90,12 +138,18 @@ export class FigureListPage extends FigureListPageBase {
|
|
|
90
138
|
── 그림이 주인공인 카탈로그 ────────────────────────────────────────
|
|
91
139
|
카드 기본값은 글이 많은 목록(직원·결재함)에 맞춰져 있다. 여기서는 사람이 먼저 보는 것이
|
|
92
140
|
형상 그림이므로, 그림 칸을 비율로 잡아 카드 폭이 달라져도 그림이 나란히 읽히게 한다.
|
|
141
|
+
|
|
142
|
+
그림은 카드 끝까지 닿는다 — 위쪽 모서리만 카드와 같은 6px 로 깎아 한 장처럼 보이게 하고,
|
|
143
|
+
그림 안에 얹히는 초안 표시·삭제는 figure-thumb 이 그린다.
|
|
93
144
|
*/
|
|
94
145
|
ox-grist {
|
|
95
146
|
--data-card-min-width: 240px;
|
|
147
|
+
--data-card-record-card-border-radius: 6px;
|
|
148
|
+
--data-card-record-card-padding: 0;
|
|
96
149
|
--data-card-thumbnail-height: auto;
|
|
97
150
|
--data-card-thumbnail-aspect: 4 / 3;
|
|
98
|
-
--data-card-thumbnail-padding:
|
|
151
|
+
--data-card-thumbnail-padding: 0;
|
|
152
|
+
--data-card-thumbnail-radius: 6px 6px 0 0;
|
|
99
153
|
--data-card-thumbnail-background: var(--md-sys-color-surface-container);
|
|
100
154
|
|
|
101
155
|
/*
|
|
@@ -111,6 +165,13 @@ export class FigureListPage extends FigureListPageBase {
|
|
|
111
165
|
|
|
112
166
|
/* 상태와 성숙도는 짧은 표식이다 — 두 줄로 세우지 않고 한 줄에 뉜다 */
|
|
113
167
|
--data-card-detail-direction: row;
|
|
168
|
+
|
|
169
|
+
/*
|
|
170
|
+
맨 위로 가는 화살표를 만들기 단추 **위로** 올린다. 둘 다 오른쪽 아래에 떠 있으므로
|
|
171
|
+
그냥 두면 겹친다 — 단추(36px + 아래 여백 12px) 위에 12px 을 띄운 자리다.
|
|
172
|
+
*/
|
|
173
|
+
--data-card-fab-position-vertical: 64px;
|
|
174
|
+
--data-list-fab-position-vertical: 64px;
|
|
114
175
|
}
|
|
115
176
|
`
|
|
116
177
|
]
|
|
@@ -123,25 +184,26 @@ export class FigureListPage extends FigureListPageBase {
|
|
|
123
184
|
|
|
124
185
|
get context() {
|
|
125
186
|
return {
|
|
126
|
-
title: i18next.t('title.figures'),
|
|
187
|
+
title: i18next.t('figure.title.figures'),
|
|
127
188
|
search: {
|
|
128
189
|
handler: (search: string) => {
|
|
129
190
|
this.grist.searchText = search
|
|
130
191
|
},
|
|
131
192
|
value: this.grist?.searchText || '',
|
|
132
|
-
placeholder: i18next.t('text.search-figure
|
|
193
|
+
placeholder: i18next.t('figure.text.search-figure')
|
|
133
194
|
},
|
|
134
195
|
filter: {
|
|
135
196
|
handler: () => {
|
|
136
197
|
this.grist.toggleHeadroom()
|
|
137
198
|
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
199
|
+
}
|
|
200
|
+
/*
|
|
201
|
+
**만들기는 `actions` 가 아니라 FAB 이다.**
|
|
202
|
+
|
|
203
|
+
`context.actions` 로 두면 페이지 바닥 줄에 글자 단추로 서는데, 그 줄은 「지금 화면에 대해
|
|
204
|
+
할 일」을 늘어놓는 자리다. 만들기는 이 화면의 유일한 주된 동작이므로 줄에 섞이지 않고
|
|
205
|
+
떠 있어야 한다. 카드를 가리지 않는 오른쪽 아래, 손이 가는 자리다(아래 render 의 [fab]).
|
|
206
|
+
*/
|
|
145
207
|
}
|
|
146
208
|
}
|
|
147
209
|
|
|
@@ -149,6 +211,7 @@ export class FigureListPage extends FigureListPageBase {
|
|
|
149
211
|
return html`
|
|
150
212
|
<ox-grist
|
|
151
213
|
mode="CARD"
|
|
214
|
+
@search-tag=${(e: CustomEvent) => this.findByTag(e.detail.tag)}
|
|
152
215
|
.config=${this.gristConfig}
|
|
153
216
|
.fetchHandler=${this.fetchHandler.bind(this)}
|
|
154
217
|
.personalConfigProvider=${this.getPagePreferenceProvider('ox-grist')!}
|
|
@@ -161,9 +224,28 @@ export class FigureListPage extends FigureListPageBase {
|
|
|
161
224
|
|
|
162
225
|
<ox-grist-personalizer slot="setting"></ox-grist-personalizer>
|
|
163
226
|
</ox-grist>
|
|
227
|
+
|
|
228
|
+
<button fab title=${i18next.t('figure.button.new-figure')} @click=${() => this.openModeller()}>
|
|
229
|
+
<md-icon>add</md-icon>${i18next.t('figure.button.new-figure')}
|
|
230
|
+
</button>
|
|
164
231
|
`
|
|
165
232
|
}
|
|
166
233
|
|
|
234
|
+
/**
|
|
235
|
+
* 카드의 태그 알약을 눌렀다 — **그 태그로 목록을 거른다.**
|
|
236
|
+
*
|
|
237
|
+
* 검색창에 그 말을 채워 넣는다. 격자에 조건만 걸고 창을 비워 두면 저작자는 **왜 목록이
|
|
238
|
+
* 줄었는지 모른 채** 보게 되고, 되돌리려면 무엇을 지워야 하는지도 알 수 없다.
|
|
239
|
+
*
|
|
240
|
+
* 서버가 `tags` 뿐 아니라 이름·타입·설명·분류를 함께 훑으므로, 그 말이 다른 칸에 든 도형도
|
|
241
|
+
* 같이 온다. 태그만 정확히 거르는 것이 아니라 **찾기**다.
|
|
242
|
+
*/
|
|
243
|
+
private findByTag(tag: string) {
|
|
244
|
+
this.grist.searchText = tag
|
|
245
|
+
/* 창의 값은 `context` 에서 나온다 — 다시 알려야 헤더가 새 값을 그린다. */
|
|
246
|
+
this.updateContext()
|
|
247
|
+
}
|
|
248
|
+
|
|
167
249
|
async pageInitialized() {
|
|
168
250
|
this.gristConfig = {
|
|
169
251
|
/*
|
|
@@ -179,44 +261,42 @@ export class FigureListPage extends FigureListPageBase {
|
|
|
179
261
|
*/
|
|
180
262
|
emptyNote: {
|
|
181
263
|
icon: 'deployed_code',
|
|
182
|
-
title: i18next.t('text.no-figure-yet'),
|
|
183
|
-
description: i18next.t('text.what-a-figure-is')
|
|
264
|
+
title: i18next.t('figure.text.no-figure-yet'),
|
|
265
|
+
description: i18next.t('figure.text.what-a-figure-is')
|
|
184
266
|
},
|
|
185
267
|
|
|
186
268
|
list: {
|
|
269
|
+
/* 그림 칸은 그 컬럼의 renderer 가 그린다 — 그림 없을 때의 안내까지 `figure-thumb` 안이다 */
|
|
187
270
|
thumbnail: 'thumbnail',
|
|
188
|
-
/* 그림이 없는 카드도 자리는 지킨다 — 빈 사각형으로 두지 않고 왜 없는지 말한다 */
|
|
189
|
-
emptyThumbnail: {
|
|
190
|
-
icon: 'deployed_code',
|
|
191
|
-
label: i18next.t('text.thumbnail-not-made-yet')
|
|
192
|
-
},
|
|
193
271
|
fields: ['name', 'type'],
|
|
194
272
|
/*
|
|
195
|
-
|
|
273
|
+
── 무게를 모른 채 고르게 두지 않는다 ────────────────────────────────
|
|
274
|
+
이름과 그림만 실으면 저작자는 **이 형상이 무거운지 모른 채** 고른다. 그것을 저작면에
|
|
275
|
+
들어가서야 아는 것은 늦다. 그래서 격자로 옮기기 전 손 카드가 실었던 셋을 그대로 싣는다 —
|
|
276
|
+
몇 개까지 놓을 수 있나(배치 한도) · 성숙도 · 삼각형 수.
|
|
196
277
|
|
|
197
|
-
|
|
198
|
-
|
|
278
|
+
한 줄에 뉜다(`--data-card-detail-direction: row`). 이름표는 달지 않는다 — 값 자체가
|
|
279
|
+
「625개까지」·「삼각형 440개」로 읽히고, 성숙도만 숫자 하나여서 손이 갔을 때 이름이 뜬다.
|
|
199
280
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
값이다). 그 축별 내역과 나머지 숫자는 표 모드의 칸과 저작면에 있다.
|
|
203
|
-
|
|
204
|
-
이름표는 달지 않는다. 성숙도는 색과 숫자로 읽히고, 상태는 발행된 것에 아무 말도 하지
|
|
205
|
-
않는다(그것이 예사다) — 초안일 때만 「초안」이 뜬다.
|
|
281
|
+
상태는 이 줄에 없다. 그림 위 초안 표시가 그 일을 한다(`figure-thumb`) — 발행된 것에는
|
|
282
|
+
아무 말도 하지 않으므로 빈 칸이 생기지 않는다.
|
|
206
283
|
*/
|
|
207
|
-
details: ['
|
|
208
|
-
/* 삭제는 손이 갈 때만 나온다 — 고르려고 보는 자리에 되돌릴 수 없는 조작을 띄우지 않는다 */
|
|
209
|
-
gutters: 'hover'
|
|
284
|
+
details: ['capacity', 'score', 'triangles']
|
|
210
285
|
},
|
|
211
286
|
|
|
212
287
|
columns: [
|
|
213
288
|
{ type: 'gutter', gutterName: 'sequence', fixed: true },
|
|
214
289
|
{
|
|
290
|
+
/*
|
|
291
|
+
표 모드에서만 쓰는 삭제 칸. 카드에서는 `figure-thumb` 이 그림 위에 그리므로
|
|
292
|
+
`forList: false` 로 내린다 — 카드 아래 단추 줄은 감춰도 자리가 남는다.
|
|
293
|
+
*/
|
|
215
294
|
type: 'gutter',
|
|
216
295
|
gutterName: 'button',
|
|
217
296
|
icon: 'delete',
|
|
218
|
-
title: i18next.t('button.delete'),
|
|
297
|
+
title: i18next.t('figure.button.delete-figure'),
|
|
219
298
|
danger: true,
|
|
299
|
+
forList: false,
|
|
220
300
|
width: 40,
|
|
221
301
|
handlers: {
|
|
222
302
|
click: (_columns: any, _data: any, _column: any, record: Figure) => this.removeFigure(record)
|
|
@@ -225,7 +305,7 @@ export class FigureListPage extends FigureListPageBase {
|
|
|
225
305
|
{
|
|
226
306
|
type: 'string',
|
|
227
307
|
name: 'name',
|
|
228
|
-
header: i18next.t('label.name'),
|
|
308
|
+
header: i18next.t('figure.label.name'),
|
|
229
309
|
record: { editable: false },
|
|
230
310
|
filter: 'search',
|
|
231
311
|
sortable: true,
|
|
@@ -238,7 +318,7 @@ export class FigureListPage extends FigureListPageBase {
|
|
|
238
318
|
*/
|
|
239
319
|
type: 'string',
|
|
240
320
|
name: 'type',
|
|
241
|
-
header: i18next.t('label.type'),
|
|
321
|
+
header: i18next.t('figure.label.figure-type'),
|
|
242
322
|
record: {
|
|
243
323
|
editable: false,
|
|
244
324
|
renderer: (value: string) => html`<code>${value}</code>`
|
|
@@ -247,10 +327,35 @@ export class FigureListPage extends FigureListPageBase {
|
|
|
247
327
|
sortable: true,
|
|
248
328
|
width: 160
|
|
249
329
|
},
|
|
330
|
+
{
|
|
331
|
+
/*
|
|
332
|
+
태그 — **카드에서 곁줄로 보이고 검색에 걸린다.**
|
|
333
|
+
|
|
334
|
+
서버가 이미 `type`·`name`·`description`·`category`·`tags` 를 함께 훑는다. 그런데
|
|
335
|
+
화면에는 태그가 어디에도 안 보여서, 저작자가 적은 태그가 **자기 눈에 돌아오지 않았다** —
|
|
336
|
+
적어 둔 것이 쓰이는지 알 수 없으면 아무도 적지 않는다.
|
|
337
|
+
|
|
338
|
+
정렬은 걸지 않는다. 배열이라 무엇을 기준으로 줄을 세우는지 답할 수 없다.
|
|
339
|
+
|
|
340
|
+
**카드에서는 이 컬럼이 그리지 않는다.** 본문에 한 줄로 두었더니 태그가 있는 카드만
|
|
341
|
+
높아져 격자가 어긋났다 — 개수가 도형마다 다르므로 본문에 두는 한 남는 문제다.
|
|
342
|
+
카드에서는 `figure-thumb` 이 그림 위에 얹는다. 여기 남은 것은 표 모드의 칸이다.
|
|
343
|
+
*/
|
|
344
|
+
type: 'string',
|
|
345
|
+
name: 'tags',
|
|
346
|
+
header: i18next.t('figure.label.tags'),
|
|
347
|
+
record: {
|
|
348
|
+
editable: false,
|
|
349
|
+
renderer: (value: string[] | null) => (value || []).join(' · ')
|
|
350
|
+
},
|
|
351
|
+
filter: 'search',
|
|
352
|
+
sortable: false,
|
|
353
|
+
width: 180
|
|
354
|
+
},
|
|
250
355
|
{
|
|
251
356
|
type: 'string',
|
|
252
357
|
name: 'state',
|
|
253
|
-
header: i18next.t('label.state'),
|
|
358
|
+
header: i18next.t('figure.label.state'),
|
|
254
359
|
record: {
|
|
255
360
|
editable: false,
|
|
256
361
|
/*
|
|
@@ -263,25 +368,31 @@ export class FigureListPage extends FigureListPageBase {
|
|
|
263
368
|
*/
|
|
264
369
|
renderer: (value: string, _column: any, record: Figure, _rowIndex: number, field: Element) => {
|
|
265
370
|
if (value !== 'released') {
|
|
266
|
-
return html`<span style=${DRAFT}>${i18next.t('label.draft')}</span>`
|
|
371
|
+
return html`<span style=${DRAFT}>${i18next.t('figure.label.draft')}</span>`
|
|
267
372
|
}
|
|
268
373
|
|
|
269
374
|
/* 표에서는 칸이 비면 안 된다. 카드에서만 입을 다문다 — 그리는 자리가 알려 준다. */
|
|
270
375
|
return field?.tagName === 'OX-CARD-FIELD'
|
|
271
376
|
? ''
|
|
272
377
|
: html`<span style=${RELEASED}
|
|
273
|
-
>${i18next.t('label.released')}
|
|
274
|
-
${record.version ? i18next.t('text.version-number', { version: record.version }) : ''}</span
|
|
378
|
+
>${i18next.t('figure.label.figure-released')}
|
|
379
|
+
${record.version ? i18next.t('figure.text.version-number', { version: record.version }) : ''}</span
|
|
275
380
|
>`
|
|
276
381
|
}
|
|
277
382
|
},
|
|
278
|
-
/*
|
|
383
|
+
/*
|
|
384
|
+
전체·초안·발행됨을 단추로 고른다 — 값이 둘뿐인 조건을 펼침 목록에 넣지 않는다.
|
|
385
|
+
|
|
386
|
+
이름표는 비워 둔다. 단추에 「초안」·「발행됨」이라고 적혀 있으니 그 앞의 「상태」는
|
|
387
|
+
같은 말을 한 번 더 하는 것이고, 걸러 보기 줄에서 자리만 먹는다.
|
|
388
|
+
*/
|
|
279
389
|
filter: {
|
|
280
390
|
type: 'select-buttons',
|
|
281
391
|
operator: 'in',
|
|
392
|
+
label: '',
|
|
282
393
|
options: [
|
|
283
|
-
{ display: i18next.t('label.draft'), value: 'draft' },
|
|
284
|
-
{ display: i18next.t('label.released'), value: 'released' }
|
|
394
|
+
{ display: i18next.t('figure.label.draft'), value: 'draft' },
|
|
395
|
+
{ display: i18next.t('figure.label.figure-released'), value: 'released' }
|
|
285
396
|
]
|
|
286
397
|
},
|
|
287
398
|
width: 120
|
|
@@ -295,8 +406,7 @@ export class FigureListPage extends FigureListPageBase {
|
|
|
295
406
|
*/
|
|
296
407
|
type: 'string',
|
|
297
408
|
name: 'capacity',
|
|
298
|
-
header: i18next.t('label.
|
|
299
|
-
label: true,
|
|
409
|
+
header: i18next.t('figure.label.placement-limit'),
|
|
300
410
|
sortable: false,
|
|
301
411
|
record: {
|
|
302
412
|
editable: false,
|
|
@@ -304,10 +414,10 @@ export class FigureListPage extends FigureListPageBase {
|
|
|
304
414
|
const capacity = capacityFrom(record.groups ?? 0, record.triangles ?? 0)
|
|
305
415
|
|
|
306
416
|
return capacity
|
|
307
|
-
? html`<span style=${CAPACITY} title=${i18next.t('text.reuse-score-explained')}>
|
|
308
|
-
${i18next.t('text.fits-n-instances', { n: capacity.instances.toLocaleString() })}
|
|
417
|
+
? html`<span style=${CAPACITY} title=${i18next.t('figure.text.reuse-score-explained')}>
|
|
418
|
+
${i18next.t('figure.text.fits-n-instances', { n: capacity.instances.toLocaleString() })}
|
|
309
419
|
</span>`
|
|
310
|
-
: html`<span style=${UNMEASURED}>${i18next.t('text.not-measured-yet')}</span>`
|
|
420
|
+
: html`<span style=${UNMEASURED}>${i18next.t('figure.text.not-measured-yet')}</span>`
|
|
311
421
|
}
|
|
312
422
|
},
|
|
313
423
|
width: 120
|
|
@@ -315,23 +425,27 @@ export class FigureListPage extends FigureListPageBase {
|
|
|
315
425
|
{
|
|
316
426
|
type: 'float',
|
|
317
427
|
name: 'score',
|
|
318
|
-
header: i18next.t('label.maturity'),
|
|
428
|
+
header: i18next.t('figure.label.maturity'),
|
|
319
429
|
record: {
|
|
320
430
|
editable: false,
|
|
321
431
|
/*
|
|
322
|
-
카드에 남긴 하나뿐인 숫자. **이름표를 달지 않으므로** 무엇인지는
|
|
323
|
-
|
|
432
|
+
카드에 남긴 하나뿐인 숫자. **이름표를 달지 않으므로** 무엇인지는 손이 갔을 때 뜨는
|
|
433
|
+
말이 알려 준다.
|
|
324
434
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
435
|
+
색칠한 배지로 두지 않는다. 지금 카탈로그의 열넷 중 열셋이 0 점이라(선언된 묶음 한도
|
|
436
|
+
3 을 넘긴다) 붉은 덩어리가 카드마다 서면 목록이 시끄럽고, 그러면서 아무것도 가르지
|
|
437
|
+
못한다. 숫자는 조용히 적고 낮은 것에만 **점 하나**를 붙인다.
|
|
438
|
+
|
|
439
|
+
아직 재지 않은 것을 0 으로 보여 주지 않는다 — 0 은 「가볍다」는 뜻이 되어 버린다.
|
|
440
|
+
등급 문자(A~D)도 여기서 만들지 않는다: 경계는 `figure-model` 의 `scoreOf` 가 정하고,
|
|
441
|
+
화면이 그것을 베끼면 두 벌이 되어 목록과 저작면이 다른 등급을 말한다.
|
|
328
442
|
*/
|
|
329
443
|
renderer: (value: number | null) =>
|
|
330
444
|
value == null
|
|
331
|
-
? html`<span style=${UNMEASURED}>${i18next.t('text.not-measured-yet')}</span>`
|
|
332
|
-
: html`<span style=${
|
|
333
|
-
|
|
334
|
-
>`
|
|
445
|
+
? html`<span style=${UNMEASURED}>${i18next.t('figure.text.not-measured-yet')}</span>`
|
|
446
|
+
: html`<span style=${SCORE} title=${i18next.t('figure.label.maturity')}>
|
|
447
|
+
${value < ATTENTION_BELOW ? html`<i style=${LOW_DOT}></i>` : ''}${Math.round(value)}
|
|
448
|
+
</span>`
|
|
335
449
|
},
|
|
336
450
|
sortable: true,
|
|
337
451
|
width: 90
|
|
@@ -339,11 +453,16 @@ export class FigureListPage extends FigureListPageBase {
|
|
|
339
453
|
{
|
|
340
454
|
type: 'integer',
|
|
341
455
|
name: 'triangles',
|
|
342
|
-
header: i18next.t('label.triangles'),
|
|
343
|
-
label: true,
|
|
456
|
+
header: i18next.t('figure.label.triangles'),
|
|
344
457
|
record: {
|
|
345
458
|
editable: false,
|
|
346
|
-
|
|
459
|
+
/*
|
|
460
|
+
카드에서는 이름표 없이 서므로 숫자만 두면 옆의 성숙도와 구별되지 않는다. 무엇의
|
|
461
|
+
수인지 값이 스스로 말하게 한다 — 표 모드에서는 머리글이 그 일을 하므로 겹치지만,
|
|
462
|
+
그 겹침이 카드에서 뜻을 잃는 것보다 낫다.
|
|
463
|
+
*/
|
|
464
|
+
renderer: (value: number | null) =>
|
|
465
|
+
value == null ? '' : i18next.t('figure.text.triangle-count', { count: value })
|
|
347
466
|
},
|
|
348
467
|
sortable: true,
|
|
349
468
|
width: 110
|
|
@@ -351,16 +470,35 @@ export class FigureListPage extends FigureListPageBase {
|
|
|
351
470
|
{
|
|
352
471
|
type: 'integer',
|
|
353
472
|
name: 'groups',
|
|
354
|
-
header: i18next.t('label.budget-groups'),
|
|
473
|
+
header: i18next.t('figure.label.budget-groups'),
|
|
355
474
|
record: { editable: false },
|
|
356
475
|
hidden: true,
|
|
357
476
|
width: 0
|
|
358
477
|
},
|
|
359
478
|
{
|
|
479
|
+
/*
|
|
480
|
+
**카드의 그림 칸 전체를 이 renderer 가 그린다.**
|
|
481
|
+
|
|
482
|
+
기본 image renderer 는 그림만 그리고, 그 위에 얹혀야 하는 것(초안 표시·삭제)은 카드
|
|
483
|
+
아래 gutter 줄로 밀린다. 격자로 옮기기 전 손 카드가 그것을 그림 위에 두었고 그 편이
|
|
484
|
+
맞다 — 그래서 그림 칸을 `figure-thumb` 에게 넘긴다. hover 가 필요해 컴포넌트여야
|
|
485
|
+
하는 사연은 그 파일에 적혀 있다.
|
|
486
|
+
|
|
487
|
+
`renderEmpty` — 그림이 아직 없는 것도 자리를 지킨다. 그 카드에도 초안 표시와 삭제가
|
|
488
|
+
있어야 하고, 「그림 없음」이라고 말하는 것도 `figure-thumb` 이 한다.
|
|
489
|
+
*/
|
|
360
490
|
type: 'image',
|
|
361
491
|
name: 'thumbnail',
|
|
362
492
|
header: i18next.t('field.thumbnail'),
|
|
363
|
-
record: {
|
|
493
|
+
record: {
|
|
494
|
+
editable: false,
|
|
495
|
+
align: 'center',
|
|
496
|
+
wide: true,
|
|
497
|
+
renderEmpty: true,
|
|
498
|
+
renderer: (_value: unknown, _column: any, record: Figure) => html`
|
|
499
|
+
<figure-thumb .figure=${record} @remove=${() => this.removeFigure(record)}></figure-thumb>
|
|
500
|
+
`
|
|
501
|
+
},
|
|
364
502
|
hidden: true,
|
|
365
503
|
width: 160
|
|
366
504
|
},
|
|
@@ -459,7 +597,7 @@ export class FigureListPage extends FigureListPageBase {
|
|
|
459
597
|
/** `remove` 는 HTMLElement 의 메서드다 — 가리면 조용한 결함이 된다. */
|
|
460
598
|
private async removeFigure(figure: Figure) {
|
|
461
599
|
// 되돌릴 수 없는 조작이므로 무엇이 사라지는지 이름으로 확인한다
|
|
462
|
-
const message = i18next.t('text.delete-figure-confirm', { name: figure.name })
|
|
600
|
+
const message = i18next.t('figure.text.delete-figure-confirm', { name: figure.name })
|
|
463
601
|
if (!confirm(message)) {
|
|
464
602
|
return
|
|
465
603
|
}
|