@things-factory/board-ui 10.1.256 → 10.1.258
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/dist-client/data-grist/board-renderer.js +20 -36
- package/dist-client/data-grist/board-renderer.js.map +1 -1
- package/dist-client/pages/board-list-page.d.ts +9 -2
- package/dist-client/pages/board-list-page.js +22 -18
- package/dist-client/pages/board-list-page.js.map +1 -1
- package/dist-client/pages/board-modeller-page.js +3 -3
- package/dist-client/pages/board-modeller-page.js.map +1 -1
- package/dist-client/pages/board-template/board-template-list-page.d.ts +5 -2
- package/dist-client/pages/board-template/board-template-list-page.js +12 -14
- package/dist-client/pages/board-template/board-template-list-page.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/viewparts/board-versions.d.ts +2 -3
- package/dist-client/viewparts/board-versions.js +19 -33
- package/dist-client/viewparts/board-versions.js.map +1 -1
- package/package.json +10 -10
|
@@ -14,7 +14,8 @@ import { LitElement } from 'lit';
|
|
|
14
14
|
export declare class BoardVersions extends LitElement {
|
|
15
15
|
static styles: import("lit").CSSResult[];
|
|
16
16
|
boardId?: string;
|
|
17
|
-
|
|
17
|
+
private released;
|
|
18
|
+
get versions(): any[];
|
|
18
19
|
/** version → 컴포넌트 diff 결과(펼쳐진 경우만) */
|
|
19
20
|
diffs: {
|
|
20
21
|
[version: number]: any;
|
|
@@ -22,8 +23,6 @@ export declare class BoardVersions extends LitElement {
|
|
|
22
23
|
render(): import("lit-html").TemplateResult<1>;
|
|
23
24
|
private renderDiff;
|
|
24
25
|
toggleDiff(version: number, prevVersion?: number): Promise<void>;
|
|
25
|
-
firstUpdated(): void;
|
|
26
|
-
refresh(): Promise<void>;
|
|
27
26
|
revertBoardVersion(version: number): void;
|
|
28
27
|
close(): void;
|
|
29
28
|
}
|
|
@@ -5,7 +5,7 @@ import gql from 'graphql-tag';
|
|
|
5
5
|
import { css, html, LitElement } from 'lit';
|
|
6
6
|
import { customElement, property, state } from 'lit/decorators.js';
|
|
7
7
|
import { i18next } from '@operato/i18n';
|
|
8
|
-
import { client } from '@operato/graphql';
|
|
8
|
+
import { client, QueryController } from '@operato/graphql';
|
|
9
9
|
import { privileged } from '@things-factory/auth-base/dist-client/index.js';
|
|
10
10
|
/**
|
|
11
11
|
* 보드 버전 이력 패널.
|
|
@@ -20,7 +20,21 @@ import { privileged } from '@things-factory/auth-base/dist-client/index.js';
|
|
|
20
20
|
let BoardVersions = class BoardVersions extends LitElement {
|
|
21
21
|
constructor() {
|
|
22
22
|
super(...arguments);
|
|
23
|
-
|
|
23
|
+
/* The board's released versions, read for the board shown (ADR-0190). */
|
|
24
|
+
this.released = new QueryController(this, gql `
|
|
25
|
+
query FetchBoardVersionsById($id: String!) {
|
|
26
|
+
boardVersions(id: $id) {
|
|
27
|
+
id
|
|
28
|
+
version
|
|
29
|
+
thumbnail
|
|
30
|
+
comment
|
|
31
|
+
updater {
|
|
32
|
+
name
|
|
33
|
+
}
|
|
34
|
+
updatedAt
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
`, { variables: () => (this.boardId ? { id: this.boardId } : undefined) });
|
|
24
38
|
/** version → 컴포넌트 diff 결과(펼쳐진 경우만) */
|
|
25
39
|
this.diffs = {};
|
|
26
40
|
}
|
|
@@ -241,6 +255,9 @@ let BoardVersions = class BoardVersions extends LitElement {
|
|
|
241
255
|
}
|
|
242
256
|
`
|
|
243
257
|
]; }
|
|
258
|
+
get versions() {
|
|
259
|
+
return this.released.data?.boardVersions || [];
|
|
260
|
+
}
|
|
244
261
|
render() {
|
|
245
262
|
if (this.versions.length == 0) {
|
|
246
263
|
/* 빈 상태는 프레임워크 공통 부품(ox-empty-note)을 사용 — 자체 구현 금지 */
|
|
@@ -355,33 +372,6 @@ let BoardVersions = class BoardVersions extends LitElement {
|
|
|
355
372
|
});
|
|
356
373
|
this.diffs = { ...this.diffs, [version]: response.data.boardVersionDiff };
|
|
357
374
|
}
|
|
358
|
-
firstUpdated() {
|
|
359
|
-
this.refresh();
|
|
360
|
-
}
|
|
361
|
-
async refresh() {
|
|
362
|
-
if (!this.boardId) {
|
|
363
|
-
return;
|
|
364
|
-
}
|
|
365
|
-
const response = (await client.query({
|
|
366
|
-
query: gql `
|
|
367
|
-
query FetchBoardVersionsById($id: String!) {
|
|
368
|
-
boardVersions(id: $id) {
|
|
369
|
-
id
|
|
370
|
-
version
|
|
371
|
-
thumbnail
|
|
372
|
-
comment
|
|
373
|
-
updater {
|
|
374
|
-
name
|
|
375
|
-
}
|
|
376
|
-
updatedAt
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
`,
|
|
380
|
-
variables: { id: this.boardId },
|
|
381
|
-
fetchPolicy: 'no-cache'
|
|
382
|
-
})).data;
|
|
383
|
-
this.versions = response.boardVersions || [];
|
|
384
|
-
}
|
|
385
375
|
revertBoardVersion(version) {
|
|
386
376
|
this.dispatchEvent(new CustomEvent('revert-board-version', {
|
|
387
377
|
detail: {
|
|
@@ -401,10 +391,6 @@ __decorate([
|
|
|
401
391
|
property({ type: String }),
|
|
402
392
|
__metadata("design:type", String)
|
|
403
393
|
], BoardVersions.prototype, "boardId", void 0);
|
|
404
|
-
__decorate([
|
|
405
|
-
state(),
|
|
406
|
-
__metadata("design:type", Array)
|
|
407
|
-
], BoardVersions.prototype, "versions", void 0);
|
|
408
394
|
__decorate([
|
|
409
395
|
state(),
|
|
410
396
|
__metadata("design:type", Object)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-versions.js","sourceRoot":"","sources":["../../client/viewparts/board-versions.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@operato/data-grist/ox-empty-note.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { i18next } from '@operato/i18n'\nimport { client } from '@operato/graphql'\n\nimport { privileged } from '@things-factory/auth-base/dist-client/index.js'\n\n/**\n * 보드 버전 이력 패널.\n *\n * - 릴리즈된 버전 목록(썸네일·버전배지·코멘트·작성자/시각)\n * - 각 버전을 \"앞 버전\"과 비교하는 diff(체인지로그)\n * - 과거 버전을 draft 로 복사(revert)\n *\n * 카드 상단: 썸네일(절반) 좌측 + 태그(버전·최신·작성자·시각) 우측.\n * 카드 하단: 코멘트 · 액션(diff/revert) · diff 패널 (전체 폭).\n */\n@customElement('board-versions')\nexport class BoardVersions extends LitElement {\n static styles = [\n css`\n :host {\n display: block;\n overflow-y: auto;\n box-sizing: border-box;\n background-color: var(--md-sys-color-surface);\n color: var(--md-sys-color-on-surface);\n font-size: 12px;\n line-height: 1.35;\n padding: var(--spacing-medium, 12px);\n }\n\n [list] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n [card] {\n display: flex;\n flex-direction: column;\n gap: 7px;\n padding: 10px;\n border: 1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, 0.12));\n border-radius: 10px;\n background: var(--md-sys-color-surface-container-low, var(--md-sys-color-surface));\n text-align: start;\n }\n [card][latest] {\n border-color: var(--md-sys-color-primary);\n }\n\n /* 상단: 썸네일(좌, 절반) + 태그(우) */\n [top] {\n display: flex;\n gap: 10px;\n align-items: stretch;\n }\n [thumb] {\n flex: 0 0 48%;\n max-width: 48%;\n height: 88px;\n border-radius: 8px;\n overflow: hidden;\n background: var(--md-sys-color-surface-variant, rgba(0, 0, 0, 0.04));\n display: flex;\n align-items: center;\n justify-content: center;\n }\n [thumb] img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n [thumb] md-icon {\n opacity: 0.4;\n --md-icon-size: 26px;\n }\n\n [tags] {\n flex: 1 1 auto;\n min-width: 0;\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 5px;\n }\n\n /* 아이콘 + 텍스트 수평 중심 정렬 공통 */\n [ver],\n [latest-tag],\n [meta],\n button {\n display: inline-flex;\n align-items: center;\n }\n\n [badges] {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 5px 6px;\n }\n [ver] {\n gap: 3px;\n font-weight: 700;\n font-size: 11px;\n color: var(--md-sys-color-on-primary);\n background: var(--md-sys-color-primary);\n border-radius: 999px;\n padding: 1px 8px;\n }\n [ver] md-icon {\n --md-icon-size: 13px;\n }\n [latest-tag] {\n font-size: 9px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--md-sys-color-primary);\n border: 1px solid var(--md-sys-color-primary);\n border-radius: 999px;\n padding: 0 6px;\n line-height: 1.5;\n }\n [meta] {\n gap: 4px;\n font-size: 10.5px;\n opacity: 0.68;\n min-width: 0;\n max-width: 100%;\n }\n [meta] [name] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n [meta] md-icon {\n --md-icon-size: 13px;\n flex: 0 0 auto;\n }\n\n /* 코멘트: 밀도 높은 카드에서 시선을 덜 끌도록 accent 제거한 조용한 보조 텍스트 */\n [comment] {\n white-space: pre-wrap;\n word-break: break-word;\n font-size: 11px;\n color: var(--md-sys-color-on-surface-variant, inherit);\n opacity: 0.72;\n padding: 0;\n }\n [comment][empty] {\n opacity: 0.42;\n font-style: italic;\n }\n\n [actions] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 1px;\n }\n button {\n cursor: pointer;\n font: inherit;\n font-size: 11px;\n gap: 4px;\n border: 1px solid var(--md-sys-color-outline, rgba(0, 0, 0, 0.2));\n background: transparent;\n color: inherit;\n border-radius: 999px;\n padding: 2px 11px;\n }\n button:hover {\n background: var(--md-sys-color-surface-variant, rgba(0, 0, 0, 0.05));\n }\n button md-icon {\n --md-icon-size: 14px;\n }\n button[revert] {\n margin-left: auto;\n color: var(--md-sys-color-primary);\n border-color: var(--md-sys-color-primary);\n }\n\n [diff] {\n margin-top: 3px;\n font-size: 11px;\n border-top: 1px dashed var(--md-sys-color-outline-variant, rgba(0, 0, 0, 0.12));\n padding-top: 5px;\n max-height: 220px;\n overflow-y: auto;\n }\n [summary] {\n display: flex;\n gap: 5px;\n margin-bottom: 5px;\n }\n [summary] span {\n border-radius: 999px;\n padding: 0 7px;\n font-weight: 700;\n font-size: 10.5px;\n border: 1px solid currentColor;\n }\n [add] {\n color: var(--md-sys-color-primary, #2e7d32);\n }\n [del] {\n color: var(--md-sys-color-error, #b00020);\n }\n [mod] {\n color: var(--status-warning-color, #b26a00);\n }\n [change] {\n display: block;\n padding: 1px 0;\n }\n [change][del] {\n text-decoration: line-through;\n opacity: 0.85;\n }\n [change] small {\n opacity: 0.65;\n }\n [muted] {\n opacity: 0.6;\n font-style: italic;\n }\n\n ox-empty-note {\n padding: 40px 12px;\n }\n `\n ]\n\n @property({ type: String }) boardId?: string\n\n @state() versions: any[] = []\n /** version → 컴포넌트 diff 결과(펼쳐진 경우만) */\n @state() diffs: { [version: number]: any } = {}\n\n render() {\n if (this.versions.length == 0) {\n /* 빈 상태는 프레임워크 공통 부품(ox-empty-note)을 사용 — 자체 구현 금지 */\n return html`\n <ox-empty-note icon=\"history\" title=${i18next.t('text.no released version information available')}>\n </ox-empty-note>\n `\n }\n\n return html`\n <div list>\n ${this.versions.map(\n (version, index) => html`\n <div card ?latest=${index === 0}>\n <div top>\n <div thumb>\n ${version.thumbnail\n ? html`<img src=${version.thumbnail} alt=\"v${version.version}\" />`\n : html`<md-icon>dashboard</md-icon>`}\n </div>\n <div tags>\n <div badges>\n <span ver><md-icon>sell</md-icon>v${version.version}</span>\n ${index === 0 ? html`<span latest-tag>${i18next.t('text.latest')}</span>` : ''}\n </div>\n <span meta>\n <md-icon>person</md-icon>\n <span name title=${version.updater?.name || 'anonymous'}\n >${version.updater?.name || 'anonymous'}</span\n >\n </span>\n <span meta><md-icon>schedule</md-icon>${new Date(version.updatedAt).toLocaleString()}</span>\n </div>\n </div>\n\n ${version.comment\n ? html`<div comment>${version.comment}</div>`\n : html`<div comment empty>${i18next.t('text.no comment')}</div>`}\n\n <div actions>\n <button @click=${() => this.toggleDiff(version.version, this.versions[index + 1]?.version)}>\n <md-icon>difference</md-icon>${i18next.t('button.diff with previous')}\n </button>\n ${privileged(\n { privilege: 'mutation', category: 'board' },\n html`\n <button revert @click=${() => this.revertBoardVersion(version.version)}>\n <md-icon>settings_backup_restore</md-icon>${i18next.t('button.copy to draft')}\n </button>\n `\n )}\n </div>\n\n ${this.diffs[version.version] ? this.renderDiff(this.diffs[version.version]) : ''}\n </div>\n `\n )}\n </div>\n `\n }\n\n private renderDiff(diff: any) {\n if (diff.earliest) {\n return html`<div diff><span muted>${i18next.t('text.initial version all new')}</span></div>`\n }\n\n const componentDiffs = diff.componentDiffs || []\n if (componentDiffs.length == 0) {\n return html`<div diff><span muted>${i18next.t('text.no difference from previous')}</span></div>`\n }\n\n const label = (d: any) => (d.refid == null ? d.type || 'scene' : `${d.type || 'component'} #${d.refid}`)\n\n return html`\n <div diff>\n <div summary>\n <span add>+${diff.addedCount}</span>\n <span del>−${diff.removedCount}</span>\n <span mod>~${diff.modifiedCount}</span>\n </div>\n ${componentDiffs.map((d: any) => {\n if (d.changeType == 'added') return html`<span change add>+ ${label(d)}</span>`\n if (d.changeType == 'removed') return html`<span change del>− ${label(d)}</span>`\n return html`<span change mod>~ ${label(d)} <small>(${(d.changedProps || []).join(', ')})</small></span>`\n })}\n </div>\n `\n }\n\n async toggleDiff(version: number, prevVersion?: number) {\n if (this.diffs[version]) {\n const { [version]: _removed, ...rest } = this.diffs\n this.diffs = rest\n return\n }\n\n // 앞 버전과 비교 = \"이 버전이 무엇을 바꿨나\". 최초 버전은 앞 버전이 없어 전체 신규.\n if (prevVersion === undefined || prevVersion === null) {\n this.diffs = { ...this.diffs, [version]: { earliest: true } }\n return\n }\n\n const response = await client.query({\n query: gql`\n query BoardVersionDiff($id: String!, $base: Int!, $to: Int!) {\n boardVersionDiff(id: $id, version: $base, toVersion: $to) {\n fromVersion\n toVersion\n addedCount\n removedCount\n modifiedCount\n componentDiffs {\n refid\n type\n changeType\n changedProps\n }\n }\n }\n `,\n variables: { id: this.boardId, base: prevVersion, to: version },\n fetchPolicy: 'no-cache'\n })\n\n this.diffs = { ...this.diffs, [version]: response.data.boardVersionDiff }\n }\n\n firstUpdated() {\n this.refresh()\n }\n\n async refresh() {\n if (!this.boardId) {\n return\n }\n\n const response = (\n await client.query({\n query: gql`\n query FetchBoardVersionsById($id: String!) {\n boardVersions(id: $id) {\n id\n version\n thumbnail\n comment\n updater {\n name\n }\n updatedAt\n }\n }\n `,\n variables: { id: this.boardId },\n fetchPolicy: 'no-cache'\n })\n ).data\n\n this.versions = response.boardVersions || []\n }\n\n revertBoardVersion(version: number) {\n this.dispatchEvent(\n new CustomEvent('revert-board-version', {\n detail: {\n id: this.boardId,\n version\n },\n bubbles: true,\n composed: true\n })\n )\n\n this.close()\n }\n\n close() {\n history.back()\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"board-versions.js","sourceRoot":"","sources":["../../client/viewparts/board-versions.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@operato/data-grist/ox-empty-note.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { i18next } from '@operato/i18n'\nimport { client, QueryController } from '@operato/graphql'\n\nimport { privileged } from '@things-factory/auth-base/dist-client/index.js'\n\n/**\n * 보드 버전 이력 패널.\n *\n * - 릴리즈된 버전 목록(썸네일·버전배지·코멘트·작성자/시각)\n * - 각 버전을 \"앞 버전\"과 비교하는 diff(체인지로그)\n * - 과거 버전을 draft 로 복사(revert)\n *\n * 카드 상단: 썸네일(절반) 좌측 + 태그(버전·최신·작성자·시각) 우측.\n * 카드 하단: 코멘트 · 액션(diff/revert) · diff 패널 (전체 폭).\n */\n@customElement('board-versions')\nexport class BoardVersions extends LitElement {\n static styles = [\n css`\n :host {\n display: block;\n overflow-y: auto;\n box-sizing: border-box;\n background-color: var(--md-sys-color-surface);\n color: var(--md-sys-color-on-surface);\n font-size: 12px;\n line-height: 1.35;\n padding: var(--spacing-medium, 12px);\n }\n\n [list] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n [card] {\n display: flex;\n flex-direction: column;\n gap: 7px;\n padding: 10px;\n border: 1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, 0.12));\n border-radius: 10px;\n background: var(--md-sys-color-surface-container-low, var(--md-sys-color-surface));\n text-align: start;\n }\n [card][latest] {\n border-color: var(--md-sys-color-primary);\n }\n\n /* 상단: 썸네일(좌, 절반) + 태그(우) */\n [top] {\n display: flex;\n gap: 10px;\n align-items: stretch;\n }\n [thumb] {\n flex: 0 0 48%;\n max-width: 48%;\n height: 88px;\n border-radius: 8px;\n overflow: hidden;\n background: var(--md-sys-color-surface-variant, rgba(0, 0, 0, 0.04));\n display: flex;\n align-items: center;\n justify-content: center;\n }\n [thumb] img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n [thumb] md-icon {\n opacity: 0.4;\n --md-icon-size: 26px;\n }\n\n [tags] {\n flex: 1 1 auto;\n min-width: 0;\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 5px;\n }\n\n /* 아이콘 + 텍스트 수평 중심 정렬 공통 */\n [ver],\n [latest-tag],\n [meta],\n button {\n display: inline-flex;\n align-items: center;\n }\n\n [badges] {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 5px 6px;\n }\n [ver] {\n gap: 3px;\n font-weight: 700;\n font-size: 11px;\n color: var(--md-sys-color-on-primary);\n background: var(--md-sys-color-primary);\n border-radius: 999px;\n padding: 1px 8px;\n }\n [ver] md-icon {\n --md-icon-size: 13px;\n }\n [latest-tag] {\n font-size: 9px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--md-sys-color-primary);\n border: 1px solid var(--md-sys-color-primary);\n border-radius: 999px;\n padding: 0 6px;\n line-height: 1.5;\n }\n [meta] {\n gap: 4px;\n font-size: 10.5px;\n opacity: 0.68;\n min-width: 0;\n max-width: 100%;\n }\n [meta] [name] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n [meta] md-icon {\n --md-icon-size: 13px;\n flex: 0 0 auto;\n }\n\n /* 코멘트: 밀도 높은 카드에서 시선을 덜 끌도록 accent 제거한 조용한 보조 텍스트 */\n [comment] {\n white-space: pre-wrap;\n word-break: break-word;\n font-size: 11px;\n color: var(--md-sys-color-on-surface-variant, inherit);\n opacity: 0.72;\n padding: 0;\n }\n [comment][empty] {\n opacity: 0.42;\n font-style: italic;\n }\n\n [actions] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 1px;\n }\n button {\n cursor: pointer;\n font: inherit;\n font-size: 11px;\n gap: 4px;\n border: 1px solid var(--md-sys-color-outline, rgba(0, 0, 0, 0.2));\n background: transparent;\n color: inherit;\n border-radius: 999px;\n padding: 2px 11px;\n }\n button:hover {\n background: var(--md-sys-color-surface-variant, rgba(0, 0, 0, 0.05));\n }\n button md-icon {\n --md-icon-size: 14px;\n }\n button[revert] {\n margin-left: auto;\n color: var(--md-sys-color-primary);\n border-color: var(--md-sys-color-primary);\n }\n\n [diff] {\n margin-top: 3px;\n font-size: 11px;\n border-top: 1px dashed var(--md-sys-color-outline-variant, rgba(0, 0, 0, 0.12));\n padding-top: 5px;\n max-height: 220px;\n overflow-y: auto;\n }\n [summary] {\n display: flex;\n gap: 5px;\n margin-bottom: 5px;\n }\n [summary] span {\n border-radius: 999px;\n padding: 0 7px;\n font-weight: 700;\n font-size: 10.5px;\n border: 1px solid currentColor;\n }\n [add] {\n color: var(--md-sys-color-primary, #2e7d32);\n }\n [del] {\n color: var(--md-sys-color-error, #b00020);\n }\n [mod] {\n color: var(--status-warning-color, #b26a00);\n }\n [change] {\n display: block;\n padding: 1px 0;\n }\n [change][del] {\n text-decoration: line-through;\n opacity: 0.85;\n }\n [change] small {\n opacity: 0.65;\n }\n [muted] {\n opacity: 0.6;\n font-style: italic;\n }\n\n ox-empty-note {\n padding: 40px 12px;\n }\n `\n ]\n\n @property({ type: String }) boardId?: string\n\n /* The board's released versions, read for the board shown (ADR-0190). */\n private released = new QueryController(\n this,\n gql`\n query FetchBoardVersionsById($id: String!) {\n boardVersions(id: $id) {\n id\n version\n thumbnail\n comment\n updater {\n name\n }\n updatedAt\n }\n }\n `,\n { variables: () => (this.boardId ? { id: this.boardId } : undefined) }\n )\n\n get versions(): any[] {\n return this.released.data?.boardVersions || []\n }\n\n /** version → 컴포넌트 diff 결과(펼쳐진 경우만) */\n @state() diffs: { [version: number]: any } = {}\n\n render() {\n if (this.versions.length == 0) {\n /* 빈 상태는 프레임워크 공통 부품(ox-empty-note)을 사용 — 자체 구현 금지 */\n return html`\n <ox-empty-note icon=\"history\" title=${i18next.t('text.no released version information available')}>\n </ox-empty-note>\n `\n }\n\n return html`\n <div list>\n ${this.versions.map(\n (version, index) => html`\n <div card ?latest=${index === 0}>\n <div top>\n <div thumb>\n ${version.thumbnail\n ? html`<img src=${version.thumbnail} alt=\"v${version.version}\" />`\n : html`<md-icon>dashboard</md-icon>`}\n </div>\n <div tags>\n <div badges>\n <span ver><md-icon>sell</md-icon>v${version.version}</span>\n ${index === 0 ? html`<span latest-tag>${i18next.t('text.latest')}</span>` : ''}\n </div>\n <span meta>\n <md-icon>person</md-icon>\n <span name title=${version.updater?.name || 'anonymous'}\n >${version.updater?.name || 'anonymous'}</span\n >\n </span>\n <span meta><md-icon>schedule</md-icon>${new Date(version.updatedAt).toLocaleString()}</span>\n </div>\n </div>\n\n ${version.comment\n ? html`<div comment>${version.comment}</div>`\n : html`<div comment empty>${i18next.t('text.no comment')}</div>`}\n\n <div actions>\n <button @click=${() => this.toggleDiff(version.version, this.versions[index + 1]?.version)}>\n <md-icon>difference</md-icon>${i18next.t('button.diff with previous')}\n </button>\n ${privileged(\n { privilege: 'mutation', category: 'board' },\n html`\n <button revert @click=${() => this.revertBoardVersion(version.version)}>\n <md-icon>settings_backup_restore</md-icon>${i18next.t('button.copy to draft')}\n </button>\n `\n )}\n </div>\n\n ${this.diffs[version.version] ? this.renderDiff(this.diffs[version.version]) : ''}\n </div>\n `\n )}\n </div>\n `\n }\n\n private renderDiff(diff: any) {\n if (diff.earliest) {\n return html`<div diff><span muted>${i18next.t('text.initial version all new')}</span></div>`\n }\n\n const componentDiffs = diff.componentDiffs || []\n if (componentDiffs.length == 0) {\n return html`<div diff><span muted>${i18next.t('text.no difference from previous')}</span></div>`\n }\n\n const label = (d: any) => (d.refid == null ? d.type || 'scene' : `${d.type || 'component'} #${d.refid}`)\n\n return html`\n <div diff>\n <div summary>\n <span add>+${diff.addedCount}</span>\n <span del>−${diff.removedCount}</span>\n <span mod>~${diff.modifiedCount}</span>\n </div>\n ${componentDiffs.map((d: any) => {\n if (d.changeType == 'added') return html`<span change add>+ ${label(d)}</span>`\n if (d.changeType == 'removed') return html`<span change del>− ${label(d)}</span>`\n return html`<span change mod>~ ${label(d)} <small>(${(d.changedProps || []).join(', ')})</small></span>`\n })}\n </div>\n `\n }\n\n async toggleDiff(version: number, prevVersion?: number) {\n if (this.diffs[version]) {\n const { [version]: _removed, ...rest } = this.diffs\n this.diffs = rest\n return\n }\n\n // 앞 버전과 비교 = \"이 버전이 무엇을 바꿨나\". 최초 버전은 앞 버전이 없어 전체 신규.\n if (prevVersion === undefined || prevVersion === null) {\n this.diffs = { ...this.diffs, [version]: { earliest: true } }\n return\n }\n\n const response = await client.query({\n query: gql`\n query BoardVersionDiff($id: String!, $base: Int!, $to: Int!) {\n boardVersionDiff(id: $id, version: $base, toVersion: $to) {\n fromVersion\n toVersion\n addedCount\n removedCount\n modifiedCount\n componentDiffs {\n refid\n type\n changeType\n changedProps\n }\n }\n }\n `,\n variables: { id: this.boardId, base: prevVersion, to: version },\n fetchPolicy: 'no-cache'\n })\n\n this.diffs = { ...this.diffs, [version]: response.data.boardVersionDiff }\n }\n\n revertBoardVersion(version: number) {\n this.dispatchEvent(\n new CustomEvent('revert-board-version', {\n detail: {\n id: this.boardId,\n version\n },\n bubbles: true,\n composed: true\n })\n )\n\n this.close()\n }\n\n close() {\n history.back()\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/board-ui",
|
|
3
|
-
"version": "10.1.
|
|
3
|
+
"version": "10.1.258",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"browser": "dist-client/index.js",
|
|
6
6
|
"things-factory": true,
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
"@operato/app": "^10.29.43",
|
|
32
32
|
"@operato/attachment": "^10.29.43",
|
|
33
33
|
"@operato/board": "^10.29.57",
|
|
34
|
-
"@operato/data-grist": "^10.29.
|
|
35
|
-
"@operato/graphql": "^10.29.
|
|
34
|
+
"@operato/data-grist": "^10.29.69",
|
|
35
|
+
"@operato/graphql": "^10.29.69",
|
|
36
36
|
"@operato/help": "^10.29.43",
|
|
37
37
|
"@operato/i18n": "^10.0.0",
|
|
38
38
|
"@operato/input": "^10.29.43",
|
|
@@ -41,15 +41,15 @@
|
|
|
41
41
|
"@operato/popup": "^10.29.43",
|
|
42
42
|
"@operato/pull-to-refresh": "^10.0.0",
|
|
43
43
|
"@operato/scene-ops": "^10.14.1",
|
|
44
|
-
"@operato/shell": "^10.29.
|
|
44
|
+
"@operato/shell": "^10.29.69",
|
|
45
45
|
"@operato/styles": "^10.0.0",
|
|
46
46
|
"@operato/utils": "^10.29.43",
|
|
47
|
-
"@things-factory/ai-assistant": "^10.1.
|
|
48
|
-
"@things-factory/barcode-base": "^10.1.
|
|
49
|
-
"@things-factory/board-ai": "^10.1.
|
|
50
|
-
"@things-factory/fav-base": "^10.1.
|
|
51
|
-
"@things-factory/setting-base": "^10.1.
|
|
47
|
+
"@things-factory/ai-assistant": "^10.1.258",
|
|
48
|
+
"@things-factory/barcode-base": "^10.1.258",
|
|
49
|
+
"@things-factory/board-ai": "^10.1.258",
|
|
50
|
+
"@things-factory/fav-base": "^10.1.258",
|
|
51
|
+
"@things-factory/setting-base": "^10.1.258",
|
|
52
52
|
"@things-factory/utils": "^10.1.179"
|
|
53
53
|
},
|
|
54
|
-
"gitHead": "
|
|
54
|
+
"gitHead": "c7b7e3b4e9aa1b36a246ccee312a4124a50924dd"
|
|
55
55
|
}
|