@things-factory/figure-library 10.1.134 → 10.1.141
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/pages/figure-library-page.js +2 -1
- package/dist-client/pages/figure-library-page.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/figure-library-release/figure-library-release.d.ts +9 -2
- package/dist-server/service/figure-library-release/figure-library-release.js +13 -2
- package/dist-server/service/figure-library-release/figure-library-release.js.map +1 -1
- package/dist-server/service/figure-library-resolver.d.ts +1 -0
- package/dist-server/service/figure-library-resolver.js +30 -7
- package/dist-server/service/figure-library-resolver.js.map +1 -1
- package/dist-server/service/index.d.ts +2 -1
- package/dist-server/service/index.js +1 -0
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/library/carriers.d.ts +43 -0
- package/dist-server/service/library/carriers.js +59 -0
- package/dist-server/service/library/carriers.js.map +1 -0
- package/dist-server/service/library/derived.d.ts +11 -3
- package/dist-server/service/library/derived.js +12 -4
- package/dist-server/service/library/derived.js.map +1 -1
- package/dist-server/service/library/inspection.d.ts +7 -0
- package/dist-server/service/library/inspection.js +6 -1
- package/dist-server/service/library/inspection.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
- package/translations/en.json +9 -0
- package/translations/ko.json +9 -0
|
@@ -702,7 +702,7 @@ let FigureLibraryPage = class FigureLibraryPage extends localize(i18next)(PageVi
|
|
|
702
702
|
</ul>
|
|
703
703
|
</div>`
|
|
704
704
|
: nothing;
|
|
705
|
-
const nothingToReport = ['missing', 'changed', 'added', 'deprecated', 'unsupported', 'dependencies'].every(key => !report[key]?.length);
|
|
705
|
+
const nothingToReport = ['missing', 'changed', 'added', 'deprecated', 'unsupported', 'dependencies', 'carrierConflicts'].every(key => !report[key]?.length);
|
|
706
706
|
return html `
|
|
707
707
|
<section class="page-section">
|
|
708
708
|
<header class="page-section-header">
|
|
@@ -725,6 +725,7 @@ let FigureLibraryPage = class FigureLibraryPage extends localize(i18next)(PageVi
|
|
|
725
725
|
${group('deprecated', report.deprecated, item => html `<span class="ref">${item.ref}</span> ${reach(item)}`)}
|
|
726
726
|
${group('unsupported', report.unsupported, item => html `<span class="ref">${item.ref}</span> ${reach(item)}`)}
|
|
727
727
|
${group('dependencies', report.dependencies, item => html `<span class="ref">${item.ref}</span> ${reach(item)}`)}
|
|
728
|
+
${group('carrierConflicts', report.carrierConflicts, item => html `${item.carrierType} ${item.lines.map((line) => html `<span class="ref">${line.ref}</span> `)}`)}
|
|
728
729
|
</div>
|
|
729
730
|
</section>
|
|
730
731
|
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"figure-library-page.js","sourceRoot":"","sources":["../../client/pages/figure-library-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/layout'\nimport '@operato/list-state/ox-page-state.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, nothing } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\n\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { PageView } from '@operato/shell'\nimport { actionHeight, DocumentPageStyles, FormFieldStyles, ScrollbarStyles } from '@operato/styles'\nimport { getPathInfo } from '@operato/utils'\n\n/*\n * Screen layout (operato-application/design/ui/page-standard.md): document frame, the tab in the address\n * (ox-url-tabs), one section per thing the operator looks at, and the decisions of each tab in the shell's\n * action bar - upload on the library tab; save, check, preview and activate on the type map tab. Activate\n * stays off until the candidate has been checked, and the button says so.\n *\n * The board server's figures (ADR-0114): the library of imported releases, and the domain type map that picks the\n * release each figure draws with. Importing puts a release into the candidate; the candidate is checked against the\n * domain's boards and activated; an archived map is activated again to roll back.\n */\n\nconst RELEASES = gql`\n query {\n figureLibraryReleases(pagination: { page: 1, limit: 1000 }, sortings: [{ name: \"ref\" }]) {\n items {\n id\n name\n ref\n namespace\n type\n version\n formatSupported\n deprecated\n supersededBy\n dependencies\n sourceUrl\n createdAt\n }\n total\n }\n }\n`\n\nconst MAPS = gql`\n query {\n figureTypeMaps {\n version\n name\n state\n revision\n activatedAt\n }\n }\n`\n\nconst LINES = gql`\n query ($version: Int!) {\n figureTypeMapEntries(version: $version) {\n name\n release {\n id\n ref\n }\n }\n }\n`\n\nconst CHECK = gql`\n query {\n figureTypeMapCheck\n }\n`\n\nconst IMPORT = gql`\n mutation ($file: Upload!) {\n importFigurePackage(file: $file) {\n problems {\n code\n path\n }\n outcomes {\n ref\n outcome\n code\n differs\n }\n }\n }\n`\n\nconst SAVE = gql`\n mutation ($lines: [FigureTypeMapLineInput!]!) {\n saveFigureTypeMapCandidate(lines: $lines) {\n version\n revision\n }\n }\n`\n\nconst ACTIVATE = gql`\n mutation ($version: Int!) {\n activateFigureTypeMap(version: $version) {\n version\n state\n }\n }\n`\n\ntype Release = {\n id: string\n name: string\n ref: string\n namespace: string\n type: string\n version: number\n formatSupported: boolean\n deprecated: boolean\n supersededBy?: string\n dependencies?: { hash: string; role: string }[]\n sourceUrl?: string\n createdAt?: string\n}\ntype TypeMap = { version: number; name: string; state: 'CANDIDATE' | 'ACTIVE' | 'ARCHIVED'; revision: number; activatedAt?: string }\ntype ImportResult = { problems: { code: string; path?: string }[]; outcomes: { ref: string; outcome: string; code?: string; differs?: string[] }[] }\n\nconst fullName = (release: Release) => `${release.namespace}/${release.type}`\n\n/** A time in the reader's language (a bare toLocaleString follows the browser, not the app). */\nconst when = (value?: string) => (value ? new Date(value).toLocaleString(i18next.language) : '')\n\n/**\n * A contract change in words. figure-model gives a code and values; `detail` is English for logs and is\n * the sentence only when this module has no words for a new code (open question P8 in figure-library.md).\n */\nconst changeText = (change: { code?: string; values?: Record<string, unknown>; detail?: string }) =>\n change.code\n ? i18next.t(`figure-library.contract.${change.code}`, { ...(change.values ?? {}), defaultValue: change.detail ?? change.code })\n : change.detail ?? ''\n\ntype Tab = 'library' | 'type-map'\n\n\n@customElement('figure-library-page')\nexport class FigureLibraryPage extends localize(i18next)(PageView) {\n static styles = [\n ScrollbarStyles,\n DocumentPageStyles,\n FormFieldStyles,\n css`\n :host {\n color: var(--ui-ink, var(--md-sys-color-on-surface));\n font-size: var(--ui-t-body, 13px);\n line-height: 1.5;\n }\n\n /* 표 — 격자와 같은 모양(머리글 · 줄 여백 · 경계선이 --grid-* 토큰). */\n table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--grid-record-fontsize, 14px);\n }\n\n th {\n padding: var(--spacing-small, 4px) var(--spacing-medium, 8px);\n border-top: var(--grid-header-top-border, 2px solid var(--md-sys-color-primary));\n border-bottom: var(--grid-header-bottom-border, 1px solid var(--md-sys-color-outline-variant));\n background: var(--grid-header-background-color, var(--md-sys-color-surface-container-low));\n font: var(--grid-header-font, 500 14px inherit);\n color: var(--grid-header-color, var(--md-sys-color-primary));\n text-align: left;\n white-space: nowrap;\n }\n\n td {\n padding: var(--grid-record-padding, 4px 8px);\n border-bottom: var(--grid-record-border-bottom, 1px solid var(--md-sys-color-outline-variant));\n vertical-align: middle;\n word-break: keep-all;\n overflow-wrap: anywhere;\n }\n\n td.thumb {\n width: 64px;\n }\n\n img[thumb] {\n display: block;\n width: 48px;\n height: 36px;\n object-fit: contain;\n }\n\n /* 식별자(정식 이름 · 발행본 참조)는 고정폭 숫자, 줄을 바꾸지 않는다. */\n .ref {\n font-family: var(--ui-mono, ui-monospace, Menlo, monospace);\n font-size: var(--ui-t-small, 11.5px);\n white-space: nowrap;\n }\n\n .sub {\n display: block;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n font-size: var(--ui-t-small, 11.5px);\n }\n\n .when {\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n }\n\n /* 상태 표 — 같은 줄에 둘 이상 붙을 수 있다(형식 미지원 · 퇴역). */\n .marks {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-small, 4px);\n }\n\n .mark {\n padding: 1px var(--spacing-medium, 8px);\n border: 1px solid var(--ui-line, var(--md-sys-color-outline-variant));\n border-radius: 999px;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n font-size: var(--ui-t-small, 11.5px);\n white-space: nowrap;\n }\n\n .mark.crit {\n border-color: color-mix(in srgb, var(--ui-crit, var(--md-sys-color-error)) 40%, transparent);\n color: var(--ui-crit, var(--md-sys-color-error));\n }\n\n .mark.on {\n border-color: var(--ui-accent, var(--md-sys-color-primary));\n color: var(--ui-accent, var(--md-sys-color-primary));\n font-weight: 600;\n }\n\n /* 찾아낸 것 · 거부 — 왼쪽 선 하나. */\n .finding {\n margin: 0;\n padding: var(--spacing-medium, 8px) 0 var(--spacing-medium, 8px) var(--spacing-large, 12px);\n border-left: 2px solid var(--ui-crit, var(--md-sys-color-error));\n }\n\n .outcomes,\n .report-list {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n .outcomes > li,\n .report-list > li {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: var(--spacing-small, 4px) var(--spacing-large, 12px);\n padding: var(--spacing-medium, 8px) 0;\n border-top: 1px solid var(--ui-line-soft, var(--md-sys-color-surface-container-high));\n }\n\n .outcomes > li:first-child,\n .report-list > li:first-child {\n padding-top: 0;\n border-top: none;\n }\n\n .outcome-refused {\n color: var(--ui-crit, var(--md-sys-color-error));\n font-weight: 600;\n }\n\n .changes {\n flex-basis: 100%;\n margin: 0;\n padding-left: 1.2em;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n\n .changes .breaking {\n color: var(--ui-crit, var(--md-sys-color-error));\n }\n\n .report-group + .report-group {\n margin-top: var(--spacing-huge, 24px);\n }\n\n .report-group h4 {\n margin: 0 0 var(--spacing-medium, 8px);\n font-size: var(--ui-t-body, 13px);\n font-weight: 600;\n }\n\n select {\n height: var(--form-element-height-medium, 30px);\n min-width: 240px;\n font-size: var(--ui-t-body, 13px);\n }\n\n .empty {\n margin: 0;\n padding: var(--spacing-huge, 24px);\n border: 1px dashed var(--ui-line, var(--md-sys-color-outline-variant));\n border-radius: var(--ui-r, 10px);\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n text-align: center;\n }\n\n /* Row buttons take the action-bar look until @operato/styles ButtonStyles is installed (ADR-0117). */\n td button {\n box-sizing: border-box;\n height: ${actionHeight('--cell-action-height')};\n padding: 0 var(--spacing-medium, 8px);\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: var(--md-sys-shape-corner-small);\n background: var(--md-sys-color-surface-container-lowest);\n color: var(--md-sys-color-on-surface);\n font: inherit;\n font-size: var(--ui-t-body, 13px);\n font-weight: 600;\n white-space: nowrap;\n cursor: pointer;\n }\n\n td button:hover:not(:disabled) {\n background: var(--md-sys-color-secondary-container);\n border-color: var(--md-sys-color-secondary);\n }\n\n td button:disabled {\n opacity: 0.38;\n cursor: default;\n }\n\n td.end {\n text-align: right;\n }\n `\n ]\n\n @state() private tab: Tab = 'library'\n @state() private releases: Release[] = []\n @state() private maps: TypeMap[] = []\n @state() private candidate: Map<string, string> = new Map()\n /** The candidate's lines as last saved — to tell an unsaved choice from a saved one. */\n @state() private saved: Map<string, string> = new Map()\n @state() private imported?: ImportResult\n @state() private report?: any\n @state() private busy = false\n @state() private loading = true\n /** The first read failed; nothing is drawn yet, so the whole screen says it could not read. */\n @state() private loadError: unknown = null\n /** A later step failed (save, activate, a re-read); what is drawn stays, this line says why. */\n @state() private failure = ''\n\n get context() {\n const candidate = this.maps.find(map => map.state === 'CANDIDATE')\n const dirty = this.isDirty()\n\n const actions =\n this.tab === 'library'\n ? [\n {\n title: i18next.t('figure-library.button.upload'),\n icon: 'upload_file',\n action: () => this.chooseFile(),\n disabled: this.busy,\n emphasis: { raised: true }\n }\n ]\n : [\n {\n title: i18next.t('figure-library.button.save-candidate'),\n icon: 'save',\n action: () => this.saveCandidate(),\n /* With no candidate yet, saving is how one is made from the active map — so it stays on. */\n disabled: this.busy || (!dirty && !!candidate)\n },\n {\n title: i18next.t('figure-library.button.check'),\n icon: 'fact_check',\n action: () => this.check(),\n disabled: this.busy || !candidate || dirty,\n disabledTitle: dirty ? i18next.t('figure-library.text.save-before-check') : ''\n },\n {\n title: i18next.t('figure-library.button.preview'),\n icon: 'open_in_new',\n action: () => this.preview(),\n disabled: !candidate || dirty,\n disabledTitle: dirty ? i18next.t('figure-library.text.save-before-check') : ''\n },\n {\n title: i18next.t('figure-library.button.activate'),\n icon: 'published_with_changes',\n action: () => candidate && this.activate(candidate.version),\n disabled: this.busy || !candidate || dirty || !this.report,\n disabledTitle: i18next.t('figure-library.text.check-before-activate'),\n emphasis: { raised: true }\n }\n ]\n\n return {\n title: i18next.t('figure-library.title'),\n description: i18next.t('figure-library.description'),\n frame: 'document',\n actions\n }\n }\n\n /*\n * Opened straight from the address, pageUpdated runs before the page stands and the first read never\n * starts - the screen sat on \"loading\" (before ox-page-state, on empty tables). pageInitialized reads too.\n */\n async pageInitialized() {\n await this.enter()\n }\n\n async pageUpdated(changes: any, lifecycle: any) {\n if (this.active) await this.enter()\n }\n\n private async enter() {\n /* ox-url-tabs reads the address on connect but announces only later changes; the body follows the same address. */\n this.tab = new URLSearchParams(location.search).get('tab') === 'type-map' ? 'type-map' : 'library'\n await this.refresh()\n }\n\n updated(changes: Map<string, unknown>) {\n /* The action bar follows the tab and what can be done now (dirty · checked · busy). */\n if (['tab', 'busy', 'report', 'maps', 'candidate', 'saved'].some(key => changes.has(key))) this.updateContext()\n }\n\n private isDirty() {\n if (this.candidate.size !== this.saved.size) return true\n for (const [name, id] of this.candidate) if (this.saved.get(name) !== id) return true\n return false\n }\n\n private async refresh() {\n try {\n const [releases, maps] = await Promise.all([\n client.query({ query: RELEASES, fetchPolicy: 'network-only' }),\n client.query({ query: MAPS, fetchPolicy: 'network-only' })\n ])\n if (releases.errors?.length || maps.errors?.length) throw releases.errors?.length ? releases.errors : maps.errors\n this.releases = releases.data.figureLibraryReleases.items\n this.maps = maps.data.figureTypeMaps\n const candidate = this.maps.find(map => map.state === 'CANDIDATE') ?? this.maps.find(map => map.state === 'ACTIVE')\n let lines = new Map<string, string>()\n if (candidate) {\n const entries = await client.query({ query: LINES, variables: { version: candidate.version }, fetchPolicy: 'network-only' })\n lines = new Map(entries.data.figureTypeMapEntries.map((line: any) => [line.name, line.release?.id]))\n }\n this.candidate = lines\n this.saved = new Map(lines)\n this.failure = ''\n this.loadError = null\n } catch (e: any) {\n if (this.loading) this.loadError = e\n else this.failure = i18next.t('figure-library.text.load-failed')\n } finally {\n this.loading = false\n }\n }\n\n render() {\n return html`\n <ox-page-state .loading=${this.loading} .error=${this.loadError} @retry=${() => this.refresh()}>\n <div class=\"page\">\n <ox-url-tabs\n .tabs=${[\n { key: 'library', label: i18next.t('figure-library.tab.library') },\n { key: 'type-map', label: i18next.t('figure-library.tab.type-map') }\n ]}\n @tab-change=${(e: CustomEvent) => (this.tab = e.detail.key as Tab)}\n ></ox-url-tabs>\n <input id=\"file\" type=\"file\" accept=\".figpkg,.zip\" hidden @change=${this.importFile} />\n ${this.failure ? html`<p class=\"finding\" role=\"alert\">${this.failure}</p>` : nothing}\n ${this.tab === 'library' ? this.renderLibrary() : this.renderTypeMap()}\n </div>\n </ox-page-state>\n `\n }\n\n private thumbnailOf(release: Release) {\n const hash = release.dependencies?.find(d => d.role === 'thumbnail')?.hash\n if (!hash) return nothing\n const { contextPath } = getPathInfo(location.pathname)\n return html`<img thumb alt=\"\" src=${`${contextPath}/figure-library-file/${hash}`} />`\n }\n\n private chooseFile() {\n ;(this.renderRoot.querySelector('#file') as HTMLInputElement | null)?.click()\n }\n\n private renderLibrary() {\n return html`\n ${this.imported ? this.renderImported(this.imported) : nothing}\n\n <section class=\"page-section\">\n <header class=\"page-section-header\">\n <h3>${i18next.t('figure-library.title.releases')}</h3>\n </header>\n ${this.releases.length\n ? html`<p class=\"page-section-note\">${i18next.t('figure-library.text.release-count', { count: this.releases.length })}</p>\n <table>\n <thead>\n <tr>\n <th></th>\n <th>${i18next.t('figure-library.label.name')}</th>\n <th>${i18next.t('figure-library.label.release')}</th>\n <th>${i18next.t('figure-library.label.source')}</th>\n <th>${i18next.t('figure-library.label.imported-at')}</th>\n <th>${i18next.t('figure-library.label.state')}</th>\n </tr>\n </thead>\n <tbody>\n ${this.releases.map(\n release => html`\n <tr>\n <td class=\"thumb\">${this.thumbnailOf(release)}</td>\n <td>${release.name}<span class=\"sub ref\">${fullName(release)}</span></td>\n <td><span class=\"ref\">${release.ref}</span></td>\n <td>${release.sourceUrl ?? ''}</td>\n <td class=\"when\">${when(release.createdAt)}</td>\n <td>\n <span class=\"marks\">\n ${release.formatSupported\n ? nothing\n : html`<span class=\"mark crit\">${i18next.t('figure-library.text.format-unsupported')}</span>`}\n ${release.deprecated ? html`<span class=\"mark\">${i18next.t('figure-library.text.deprecated')}</span>` : nothing}\n </span>\n </td>\n </tr>\n `\n )}\n </tbody>\n </table>`\n : html`<p class=\"empty\">${i18next.t('figure-library.text.no-releases')}</p>`}\n </section>\n `\n }\n\n private renderImported(result: ImportResult) {\n return html`\n <section class=\"page-section\">\n <header class=\"page-section-header\">\n <h3>${i18next.t('figure-library.title.import-result')}</h3>\n </header>\n ${result.problems.length\n ? html`<p class=\"finding\" role=\"alert\">\n ${i18next.t('figure-library.text.package-refused', { code: result.problems.map(p => p.code).join(', ') })}\n </p>`\n : html`<div class=\"page-card\">\n <ul class=\"outcomes\">\n ${result.outcomes.map(\n o => html`<li>\n <span class=\"ref\">${o.ref}</span>\n <span class=${o.outcome === 'refused' ? 'outcome-refused' : ''}>${i18next.t(`figure-library.outcome.${o.outcome}`)}</span>\n ${o.differs?.length\n ? html`<span class=\"sub\">${i18next.t('figure-library.text.differs', { fields: o.differs.join(', ') })}</span>`\n : nothing}\n ${o.outcome === 'refused' && o.code ? html`<span class=\"sub\">${o.code}</span>` : nothing}\n </li>`\n )}\n </ul>\n </div>`}\n </section>\n `\n }\n\n private importFile = async (event: Event) => {\n const input = event.target as HTMLInputElement\n const file = input.files?.[0]\n if (!file) return\n this.busy = true\n try {\n const response = await client.mutate({ mutation: IMPORT, variables: { file }, context: { hasUpload: true } })\n this.imported = response.data.importFigurePackage\n await this.refresh()\n } catch (e: any) {\n this.imported = { problems: [{ code: e?.message ?? 'error' }], outcomes: [] }\n } finally {\n this.busy = false\n input.value = ''\n }\n }\n\n private renderTypeMap() {\n const candidate = this.maps.find(map => map.state === 'CANDIDATE')\n const names = [...new Set(this.releases.map(fullName))].sort()\n const dirty = this.isDirty()\n\n return html`\n <section class=\"page-section\">\n <header class=\"page-section-header\">\n <h3>${candidate ? i18next.t('figure-library.text.candidate', { name: candidate.name }) : i18next.t('figure-library.text.new-candidate')}</h3>\n </header>\n <p class=\"page-section-note\">\n ${dirty\n ? i18next.t('figure-library.text.candidate-unsaved')\n : this.report\n ? i18next.t('figure-library.text.candidate-checked')\n : i18next.t('figure-library.text.check-before-activate')}\n </p>\n ${names.length\n ? html`<table>\n <thead>\n <tr>\n <th>${i18next.t('figure-library.label.figure')}</th>\n <th>${i18next.t('figure-library.label.release')}</th>\n </tr>\n </thead>\n <tbody>\n ${names.map(name => {\n const versions = this.releases.filter(release => fullName(release) === name).sort((a, b) => b.version - a.version)\n const chosen = this.candidate.get(name) ?? ''\n return html`\n <tr>\n <td><span class=\"ref\">${name}</span></td>\n <td>\n <select @change=${(e: Event) => this.choose(name, (e.target as HTMLSelectElement).value)}>\n <option value=\"\" ?selected=${!chosen}>${i18next.t('figure-library.text.not-in-map')}</option>\n ${versions.map(release => html`<option value=${release.id} ?selected=${chosen === release.id}>${release.ref}</option>`)}\n </select>\n </td>\n </tr>\n `\n })}\n </tbody>\n </table>`\n : html`<p class=\"empty\">${i18next.t('figure-library.text.no-releases')}</p>`}\n </section>\n\n ${this.report ? this.renderReport(this.report) : nothing}\n\n <section class=\"page-section\">\n <header class=\"page-section-header\">\n <h3>${i18next.t('figure-library.title.map-releases')}</h3>\n </header>\n ${this.maps.length\n ? html`<table>\n <thead>\n <tr>\n <th>${i18next.t('figure-library.label.type-map')}</th>\n <th>${i18next.t('figure-library.label.state')}</th>\n <th>${i18next.t('figure-library.label.activated-at')}</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n ${this.maps.map(\n map => html`\n <tr>\n <td>${map.name}</td>\n <td>\n <span class=\"mark ${map.state === 'ACTIVE' ? 'on' : ''}\">${i18next.t(`figure-library.state.${map.state.toLowerCase()}`)}</span>\n </td>\n <td class=\"when\">${when(map.activatedAt)}</td>\n <td class=\"end\">\n ${map.state === 'ARCHIVED'\n ? html`<button ?disabled=${this.busy} @click=${() => this.activate(map.version)}>\n ${i18next.t('figure-library.button.activate-again')}\n </button>`\n : nothing}\n </td>\n </tr>\n `\n )}\n </tbody>\n </table>`\n : html`<p class=\"empty\">${i18next.t('figure-library.text.no-maps')}</p>`}\n </section>\n `\n }\n\n /* A window of its own draws the candidate: its figures never mix with the active map of this one (ADR-0114 결정 12). */\n private preview = () => {\n const { contextPath } = getPathInfo(location.pathname)\n window.open(`${contextPath}/board-list?figure-map=candidate`, '_blank', 'noopener')\n }\n\n private choose(name: string, releaseId: string) {\n const next = new Map(this.candidate)\n if (releaseId) next.set(name, releaseId)\n else next.delete(name)\n this.candidate = next\n this.report = undefined\n }\n\n private saveCandidate = async () => {\n this.busy = true\n try {\n const lines = [...this.candidate].map(([name, releaseId]) => ({ name, releaseId }))\n await client.mutate({ mutation: SAVE, variables: { lines } })\n this.report = undefined\n await this.refresh()\n } catch (e: any) {\n this.failure = e?.message ?? ''\n } finally {\n this.busy = false\n }\n }\n\n private check = async () => {\n this.busy = true\n try {\n const response = await client.query({ query: CHECK, fetchPolicy: 'network-only' })\n if (response.errors?.length) throw new Error(response.errors[0].message)\n this.report = response.data.figureTypeMapCheck\n this.failure = ''\n } catch (e: any) {\n this.failure = e?.message ?? ''\n } finally {\n this.busy = false\n }\n }\n\n private async activate(version: number) {\n this.busy = true\n try {\n await client.mutate({ mutation: ACTIVATE, variables: { version } })\n this.report = undefined\n await this.refresh()\n } catch (e: any) {\n this.failure = e?.message ?? ''\n } finally {\n this.busy = false\n }\n }\n\n private renderReport(report: any) {\n const reach = (item: any) => html`<span class=\"sub\">${i18next.t('figure-library.text.reach', { boards: item.boards, nodes: item.nodes })}</span>`\n const group = (key: string, items: any[], line: (item: any) => unknown) =>\n items?.length\n ? html`<div class=\"report-group\">\n <h4>${i18next.t(`figure-library.check.${key}`)}</h4>\n <ul class=\"report-list\">\n ${items.map(item => html`<li>${line(item)}</li>`)}\n </ul>\n </div>`\n : nothing\n const nothingToReport = ['missing', 'changed', 'added', 'deprecated', 'unsupported', 'dependencies'].every(key => !report[key]?.length)\n\n return html`\n <section class=\"page-section\">\n <header class=\"page-section-header\">\n <h3>${i18next.t('figure-library.title.check-report')}</h3>\n </header>\n <div class=\"page-card\">\n ${nothingToReport ? html`<p class=\"sub\">${i18next.t('figure-library.check.nothing')}</p>` : nothing}\n ${group('missing', report.missing, item => html`<span class=\"ref\">${item.name}</span> ${reach(item)}`)}\n ${group(\n 'changed',\n report.changed,\n item => html`<span class=\"ref\">${item.from}</span> → <span class=\"ref\">${item.to}</span> ${reach(item)}\n ${item.contract.checked\n ? item.contract.changes.length\n ? html`<ul class=\"changes\">\n ${item.contract.changes.map(\n (change: any) => html`<li class=${change.blocking ? 'breaking' : ''}>\n ${changeText(change)}${change.blocking ? html` · ${i18next.t('figure-library.text.breaking')}` : nothing}\n </li>`\n )}\n </ul>`\n : nothing\n : html`<span class=\"sub\">${i18next.t('figure-library.check.uncheckable')}</span>`}`\n )}\n ${group('added', report.added, item => html`<span class=\"ref\">${item.ref}</span>`)}\n ${group('deprecated', report.deprecated, item => html`<span class=\"ref\">${item.ref}</span> ${reach(item)}`)}\n ${group('unsupported', report.unsupported, item => html`<span class=\"ref\">${item.ref}</span> ${reach(item)}`)}\n ${group('dependencies', report.dependencies, item => html`<span class=\"ref\">${item.ref}</span> ${reach(item)}`)}\n </div>\n </section>\n `\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"figure-library-page.js","sourceRoot":"","sources":["../../client/pages/figure-library-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/layout'\nimport '@operato/list-state/ox-page-state.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, nothing } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\n\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { PageView } from '@operato/shell'\nimport { actionHeight, DocumentPageStyles, FormFieldStyles, ScrollbarStyles } from '@operato/styles'\nimport { getPathInfo } from '@operato/utils'\n\n/*\n * Screen layout (operato-application/design/ui/page-standard.md): document frame, the tab in the address\n * (ox-url-tabs), one section per thing the operator looks at, and the decisions of each tab in the shell's\n * action bar - upload on the library tab; save, check, preview and activate on the type map tab. Activate\n * stays off until the candidate has been checked, and the button says so.\n *\n * The board server's figures (ADR-0114): the library of imported releases, and the domain type map that picks the\n * release each figure draws with. Importing puts a release into the candidate; the candidate is checked against the\n * domain's boards and activated; an archived map is activated again to roll back.\n */\n\nconst RELEASES = gql`\n query {\n figureLibraryReleases(pagination: { page: 1, limit: 1000 }, sortings: [{ name: \"ref\" }]) {\n items {\n id\n name\n ref\n namespace\n type\n version\n formatSupported\n deprecated\n supersededBy\n dependencies\n sourceUrl\n createdAt\n }\n total\n }\n }\n`\n\nconst MAPS = gql`\n query {\n figureTypeMaps {\n version\n name\n state\n revision\n activatedAt\n }\n }\n`\n\nconst LINES = gql`\n query ($version: Int!) {\n figureTypeMapEntries(version: $version) {\n name\n release {\n id\n ref\n }\n }\n }\n`\n\nconst CHECK = gql`\n query {\n figureTypeMapCheck\n }\n`\n\nconst IMPORT = gql`\n mutation ($file: Upload!) {\n importFigurePackage(file: $file) {\n problems {\n code\n path\n }\n outcomes {\n ref\n outcome\n code\n differs\n }\n }\n }\n`\n\nconst SAVE = gql`\n mutation ($lines: [FigureTypeMapLineInput!]!) {\n saveFigureTypeMapCandidate(lines: $lines) {\n version\n revision\n }\n }\n`\n\nconst ACTIVATE = gql`\n mutation ($version: Int!) {\n activateFigureTypeMap(version: $version) {\n version\n state\n }\n }\n`\n\ntype Release = {\n id: string\n name: string\n ref: string\n namespace: string\n type: string\n version: number\n formatSupported: boolean\n deprecated: boolean\n supersededBy?: string\n dependencies?: { hash: string; role: string }[]\n sourceUrl?: string\n createdAt?: string\n}\ntype TypeMap = { version: number; name: string; state: 'CANDIDATE' | 'ACTIVE' | 'ARCHIVED'; revision: number; activatedAt?: string }\ntype ImportResult = { problems: { code: string; path?: string }[]; outcomes: { ref: string; outcome: string; code?: string; differs?: string[] }[] }\n\nconst fullName = (release: Release) => `${release.namespace}/${release.type}`\n\n/** A time in the reader's language (a bare toLocaleString follows the browser, not the app). */\nconst when = (value?: string) => (value ? new Date(value).toLocaleString(i18next.language) : '')\n\n/**\n * A contract change in words. figure-model gives a code and values; `detail` is English for logs and is\n * the sentence only when this module has no words for a new code (open question P8 in figure-library.md).\n */\nconst changeText = (change: { code?: string; values?: Record<string, unknown>; detail?: string }) =>\n change.code\n ? i18next.t(`figure-library.contract.${change.code}`, { ...(change.values ?? {}), defaultValue: change.detail ?? change.code })\n : change.detail ?? ''\n\ntype Tab = 'library' | 'type-map'\n\n\n@customElement('figure-library-page')\nexport class FigureLibraryPage extends localize(i18next)(PageView) {\n static styles = [\n ScrollbarStyles,\n DocumentPageStyles,\n FormFieldStyles,\n css`\n :host {\n color: var(--ui-ink, var(--md-sys-color-on-surface));\n font-size: var(--ui-t-body, 13px);\n line-height: 1.5;\n }\n\n /* 표 — 격자와 같은 모양(머리글 · 줄 여백 · 경계선이 --grid-* 토큰). */\n table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--grid-record-fontsize, 14px);\n }\n\n th {\n padding: var(--spacing-small, 4px) var(--spacing-medium, 8px);\n border-top: var(--grid-header-top-border, 2px solid var(--md-sys-color-primary));\n border-bottom: var(--grid-header-bottom-border, 1px solid var(--md-sys-color-outline-variant));\n background: var(--grid-header-background-color, var(--md-sys-color-surface-container-low));\n font: var(--grid-header-font, 500 14px inherit);\n color: var(--grid-header-color, var(--md-sys-color-primary));\n text-align: left;\n white-space: nowrap;\n }\n\n td {\n padding: var(--grid-record-padding, 4px 8px);\n border-bottom: var(--grid-record-border-bottom, 1px solid var(--md-sys-color-outline-variant));\n vertical-align: middle;\n word-break: keep-all;\n overflow-wrap: anywhere;\n }\n\n td.thumb {\n width: 64px;\n }\n\n img[thumb] {\n display: block;\n width: 48px;\n height: 36px;\n object-fit: contain;\n }\n\n /* 식별자(정식 이름 · 발행본 참조)는 고정폭 숫자, 줄을 바꾸지 않는다. */\n .ref {\n font-family: var(--ui-mono, ui-monospace, Menlo, monospace);\n font-size: var(--ui-t-small, 11.5px);\n white-space: nowrap;\n }\n\n .sub {\n display: block;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n font-size: var(--ui-t-small, 11.5px);\n }\n\n .when {\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n }\n\n /* 상태 표 — 같은 줄에 둘 이상 붙을 수 있다(형식 미지원 · 퇴역). */\n .marks {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-small, 4px);\n }\n\n .mark {\n padding: 1px var(--spacing-medium, 8px);\n border: 1px solid var(--ui-line, var(--md-sys-color-outline-variant));\n border-radius: 999px;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n font-size: var(--ui-t-small, 11.5px);\n white-space: nowrap;\n }\n\n .mark.crit {\n border-color: color-mix(in srgb, var(--ui-crit, var(--md-sys-color-error)) 40%, transparent);\n color: var(--ui-crit, var(--md-sys-color-error));\n }\n\n .mark.on {\n border-color: var(--ui-accent, var(--md-sys-color-primary));\n color: var(--ui-accent, var(--md-sys-color-primary));\n font-weight: 600;\n }\n\n /* 찾아낸 것 · 거부 — 왼쪽 선 하나. */\n .finding {\n margin: 0;\n padding: var(--spacing-medium, 8px) 0 var(--spacing-medium, 8px) var(--spacing-large, 12px);\n border-left: 2px solid var(--ui-crit, var(--md-sys-color-error));\n }\n\n .outcomes,\n .report-list {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n .outcomes > li,\n .report-list > li {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: var(--spacing-small, 4px) var(--spacing-large, 12px);\n padding: var(--spacing-medium, 8px) 0;\n border-top: 1px solid var(--ui-line-soft, var(--md-sys-color-surface-container-high));\n }\n\n .outcomes > li:first-child,\n .report-list > li:first-child {\n padding-top: 0;\n border-top: none;\n }\n\n .outcome-refused {\n color: var(--ui-crit, var(--md-sys-color-error));\n font-weight: 600;\n }\n\n .changes {\n flex-basis: 100%;\n margin: 0;\n padding-left: 1.2em;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n\n .changes .breaking {\n color: var(--ui-crit, var(--md-sys-color-error));\n }\n\n .report-group + .report-group {\n margin-top: var(--spacing-huge, 24px);\n }\n\n .report-group h4 {\n margin: 0 0 var(--spacing-medium, 8px);\n font-size: var(--ui-t-body, 13px);\n font-weight: 600;\n }\n\n select {\n height: var(--form-element-height-medium, 30px);\n min-width: 240px;\n font-size: var(--ui-t-body, 13px);\n }\n\n .empty {\n margin: 0;\n padding: var(--spacing-huge, 24px);\n border: 1px dashed var(--ui-line, var(--md-sys-color-outline-variant));\n border-radius: var(--ui-r, 10px);\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n text-align: center;\n }\n\n /* Row buttons take the action-bar look until @operato/styles ButtonStyles is installed (ADR-0117). */\n td button {\n box-sizing: border-box;\n height: ${actionHeight('--cell-action-height')};\n padding: 0 var(--spacing-medium, 8px);\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: var(--md-sys-shape-corner-small);\n background: var(--md-sys-color-surface-container-lowest);\n color: var(--md-sys-color-on-surface);\n font: inherit;\n font-size: var(--ui-t-body, 13px);\n font-weight: 600;\n white-space: nowrap;\n cursor: pointer;\n }\n\n td button:hover:not(:disabled) {\n background: var(--md-sys-color-secondary-container);\n border-color: var(--md-sys-color-secondary);\n }\n\n td button:disabled {\n opacity: 0.38;\n cursor: default;\n }\n\n td.end {\n text-align: right;\n }\n `\n ]\n\n @state() private tab: Tab = 'library'\n @state() private releases: Release[] = []\n @state() private maps: TypeMap[] = []\n @state() private candidate: Map<string, string> = new Map()\n /** The candidate's lines as last saved — to tell an unsaved choice from a saved one. */\n @state() private saved: Map<string, string> = new Map()\n @state() private imported?: ImportResult\n @state() private report?: any\n @state() private busy = false\n @state() private loading = true\n /** The first read failed; nothing is drawn yet, so the whole screen says it could not read. */\n @state() private loadError: unknown = null\n /** A later step failed (save, activate, a re-read); what is drawn stays, this line says why. */\n @state() private failure = ''\n\n get context() {\n const candidate = this.maps.find(map => map.state === 'CANDIDATE')\n const dirty = this.isDirty()\n\n const actions =\n this.tab === 'library'\n ? [\n {\n title: i18next.t('figure-library.button.upload'),\n icon: 'upload_file',\n action: () => this.chooseFile(),\n disabled: this.busy,\n emphasis: { raised: true }\n }\n ]\n : [\n {\n title: i18next.t('figure-library.button.save-candidate'),\n icon: 'save',\n action: () => this.saveCandidate(),\n /* With no candidate yet, saving is how one is made from the active map — so it stays on. */\n disabled: this.busy || (!dirty && !!candidate)\n },\n {\n title: i18next.t('figure-library.button.check'),\n icon: 'fact_check',\n action: () => this.check(),\n disabled: this.busy || !candidate || dirty,\n disabledTitle: dirty ? i18next.t('figure-library.text.save-before-check') : ''\n },\n {\n title: i18next.t('figure-library.button.preview'),\n icon: 'open_in_new',\n action: () => this.preview(),\n disabled: !candidate || dirty,\n disabledTitle: dirty ? i18next.t('figure-library.text.save-before-check') : ''\n },\n {\n title: i18next.t('figure-library.button.activate'),\n icon: 'published_with_changes',\n action: () => candidate && this.activate(candidate.version),\n disabled: this.busy || !candidate || dirty || !this.report,\n disabledTitle: i18next.t('figure-library.text.check-before-activate'),\n emphasis: { raised: true }\n }\n ]\n\n return {\n title: i18next.t('figure-library.title'),\n description: i18next.t('figure-library.description'),\n frame: 'document',\n actions\n }\n }\n\n /*\n * Opened straight from the address, pageUpdated runs before the page stands and the first read never\n * starts - the screen sat on \"loading\" (before ox-page-state, on empty tables). pageInitialized reads too.\n */\n async pageInitialized() {\n await this.enter()\n }\n\n async pageUpdated(changes: any, lifecycle: any) {\n if (this.active) await this.enter()\n }\n\n private async enter() {\n /* ox-url-tabs reads the address on connect but announces only later changes; the body follows the same address. */\n this.tab = new URLSearchParams(location.search).get('tab') === 'type-map' ? 'type-map' : 'library'\n await this.refresh()\n }\n\n updated(changes: Map<string, unknown>) {\n /* The action bar follows the tab and what can be done now (dirty · checked · busy). */\n if (['tab', 'busy', 'report', 'maps', 'candidate', 'saved'].some(key => changes.has(key))) this.updateContext()\n }\n\n private isDirty() {\n if (this.candidate.size !== this.saved.size) return true\n for (const [name, id] of this.candidate) if (this.saved.get(name) !== id) return true\n return false\n }\n\n private async refresh() {\n try {\n const [releases, maps] = await Promise.all([\n client.query({ query: RELEASES, fetchPolicy: 'network-only' }),\n client.query({ query: MAPS, fetchPolicy: 'network-only' })\n ])\n if (releases.errors?.length || maps.errors?.length) throw releases.errors?.length ? releases.errors : maps.errors\n this.releases = releases.data.figureLibraryReleases.items\n this.maps = maps.data.figureTypeMaps\n const candidate = this.maps.find(map => map.state === 'CANDIDATE') ?? this.maps.find(map => map.state === 'ACTIVE')\n let lines = new Map<string, string>()\n if (candidate) {\n const entries = await client.query({ query: LINES, variables: { version: candidate.version }, fetchPolicy: 'network-only' })\n lines = new Map(entries.data.figureTypeMapEntries.map((line: any) => [line.name, line.release?.id]))\n }\n this.candidate = lines\n this.saved = new Map(lines)\n this.failure = ''\n this.loadError = null\n } catch (e: any) {\n if (this.loading) this.loadError = e\n else this.failure = i18next.t('figure-library.text.load-failed')\n } finally {\n this.loading = false\n }\n }\n\n render() {\n return html`\n <ox-page-state .loading=${this.loading} .error=${this.loadError} @retry=${() => this.refresh()}>\n <div class=\"page\">\n <ox-url-tabs\n .tabs=${[\n { key: 'library', label: i18next.t('figure-library.tab.library') },\n { key: 'type-map', label: i18next.t('figure-library.tab.type-map') }\n ]}\n @tab-change=${(e: CustomEvent) => (this.tab = e.detail.key as Tab)}\n ></ox-url-tabs>\n <input id=\"file\" type=\"file\" accept=\".figpkg,.zip\" hidden @change=${this.importFile} />\n ${this.failure ? html`<p class=\"finding\" role=\"alert\">${this.failure}</p>` : nothing}\n ${this.tab === 'library' ? this.renderLibrary() : this.renderTypeMap()}\n </div>\n </ox-page-state>\n `\n }\n\n private thumbnailOf(release: Release) {\n const hash = release.dependencies?.find(d => d.role === 'thumbnail')?.hash\n if (!hash) return nothing\n const { contextPath } = getPathInfo(location.pathname)\n return html`<img thumb alt=\"\" src=${`${contextPath}/figure-library-file/${hash}`} />`\n }\n\n private chooseFile() {\n ;(this.renderRoot.querySelector('#file') as HTMLInputElement | null)?.click()\n }\n\n private renderLibrary() {\n return html`\n ${this.imported ? this.renderImported(this.imported) : nothing}\n\n <section class=\"page-section\">\n <header class=\"page-section-header\">\n <h3>${i18next.t('figure-library.title.releases')}</h3>\n </header>\n ${this.releases.length\n ? html`<p class=\"page-section-note\">${i18next.t('figure-library.text.release-count', { count: this.releases.length })}</p>\n <table>\n <thead>\n <tr>\n <th></th>\n <th>${i18next.t('figure-library.label.name')}</th>\n <th>${i18next.t('figure-library.label.release')}</th>\n <th>${i18next.t('figure-library.label.source')}</th>\n <th>${i18next.t('figure-library.label.imported-at')}</th>\n <th>${i18next.t('figure-library.label.state')}</th>\n </tr>\n </thead>\n <tbody>\n ${this.releases.map(\n release => html`\n <tr>\n <td class=\"thumb\">${this.thumbnailOf(release)}</td>\n <td>${release.name}<span class=\"sub ref\">${fullName(release)}</span></td>\n <td><span class=\"ref\">${release.ref}</span></td>\n <td>${release.sourceUrl ?? ''}</td>\n <td class=\"when\">${when(release.createdAt)}</td>\n <td>\n <span class=\"marks\">\n ${release.formatSupported\n ? nothing\n : html`<span class=\"mark crit\">${i18next.t('figure-library.text.format-unsupported')}</span>`}\n ${release.deprecated ? html`<span class=\"mark\">${i18next.t('figure-library.text.deprecated')}</span>` : nothing}\n </span>\n </td>\n </tr>\n `\n )}\n </tbody>\n </table>`\n : html`<p class=\"empty\">${i18next.t('figure-library.text.no-releases')}</p>`}\n </section>\n `\n }\n\n private renderImported(result: ImportResult) {\n return html`\n <section class=\"page-section\">\n <header class=\"page-section-header\">\n <h3>${i18next.t('figure-library.title.import-result')}</h3>\n </header>\n ${result.problems.length\n ? html`<p class=\"finding\" role=\"alert\">\n ${i18next.t('figure-library.text.package-refused', { code: result.problems.map(p => p.code).join(', ') })}\n </p>`\n : html`<div class=\"page-card\">\n <ul class=\"outcomes\">\n ${result.outcomes.map(\n o => html`<li>\n <span class=\"ref\">${o.ref}</span>\n <span class=${o.outcome === 'refused' ? 'outcome-refused' : ''}>${i18next.t(`figure-library.outcome.${o.outcome}`)}</span>\n ${o.differs?.length\n ? html`<span class=\"sub\">${i18next.t('figure-library.text.differs', { fields: o.differs.join(', ') })}</span>`\n : nothing}\n ${o.outcome === 'refused' && o.code ? html`<span class=\"sub\">${o.code}</span>` : nothing}\n </li>`\n )}\n </ul>\n </div>`}\n </section>\n `\n }\n\n private importFile = async (event: Event) => {\n const input = event.target as HTMLInputElement\n const file = input.files?.[0]\n if (!file) return\n this.busy = true\n try {\n const response = await client.mutate({ mutation: IMPORT, variables: { file }, context: { hasUpload: true } })\n this.imported = response.data.importFigurePackage\n await this.refresh()\n } catch (e: any) {\n this.imported = { problems: [{ code: e?.message ?? 'error' }], outcomes: [] }\n } finally {\n this.busy = false\n input.value = ''\n }\n }\n\n private renderTypeMap() {\n const candidate = this.maps.find(map => map.state === 'CANDIDATE')\n const names = [...new Set(this.releases.map(fullName))].sort()\n const dirty = this.isDirty()\n\n return html`\n <section class=\"page-section\">\n <header class=\"page-section-header\">\n <h3>${candidate ? i18next.t('figure-library.text.candidate', { name: candidate.name }) : i18next.t('figure-library.text.new-candidate')}</h3>\n </header>\n <p class=\"page-section-note\">\n ${dirty\n ? i18next.t('figure-library.text.candidate-unsaved')\n : this.report\n ? i18next.t('figure-library.text.candidate-checked')\n : i18next.t('figure-library.text.check-before-activate')}\n </p>\n ${names.length\n ? html`<table>\n <thead>\n <tr>\n <th>${i18next.t('figure-library.label.figure')}</th>\n <th>${i18next.t('figure-library.label.release')}</th>\n </tr>\n </thead>\n <tbody>\n ${names.map(name => {\n const versions = this.releases.filter(release => fullName(release) === name).sort((a, b) => b.version - a.version)\n const chosen = this.candidate.get(name) ?? ''\n return html`\n <tr>\n <td><span class=\"ref\">${name}</span></td>\n <td>\n <select @change=${(e: Event) => this.choose(name, (e.target as HTMLSelectElement).value)}>\n <option value=\"\" ?selected=${!chosen}>${i18next.t('figure-library.text.not-in-map')}</option>\n ${versions.map(release => html`<option value=${release.id} ?selected=${chosen === release.id}>${release.ref}</option>`)}\n </select>\n </td>\n </tr>\n `\n })}\n </tbody>\n </table>`\n : html`<p class=\"empty\">${i18next.t('figure-library.text.no-releases')}</p>`}\n </section>\n\n ${this.report ? this.renderReport(this.report) : nothing}\n\n <section class=\"page-section\">\n <header class=\"page-section-header\">\n <h3>${i18next.t('figure-library.title.map-releases')}</h3>\n </header>\n ${this.maps.length\n ? html`<table>\n <thead>\n <tr>\n <th>${i18next.t('figure-library.label.type-map')}</th>\n <th>${i18next.t('figure-library.label.state')}</th>\n <th>${i18next.t('figure-library.label.activated-at')}</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n ${this.maps.map(\n map => html`\n <tr>\n <td>${map.name}</td>\n <td>\n <span class=\"mark ${map.state === 'ACTIVE' ? 'on' : ''}\">${i18next.t(`figure-library.state.${map.state.toLowerCase()}`)}</span>\n </td>\n <td class=\"when\">${when(map.activatedAt)}</td>\n <td class=\"end\">\n ${map.state === 'ARCHIVED'\n ? html`<button ?disabled=${this.busy} @click=${() => this.activate(map.version)}>\n ${i18next.t('figure-library.button.activate-again')}\n </button>`\n : nothing}\n </td>\n </tr>\n `\n )}\n </tbody>\n </table>`\n : html`<p class=\"empty\">${i18next.t('figure-library.text.no-maps')}</p>`}\n </section>\n `\n }\n\n /* A window of its own draws the candidate: its figures never mix with the active map of this one (ADR-0114 결정 12). */\n private preview = () => {\n const { contextPath } = getPathInfo(location.pathname)\n window.open(`${contextPath}/board-list?figure-map=candidate`, '_blank', 'noopener')\n }\n\n private choose(name: string, releaseId: string) {\n const next = new Map(this.candidate)\n if (releaseId) next.set(name, releaseId)\n else next.delete(name)\n this.candidate = next\n this.report = undefined\n }\n\n private saveCandidate = async () => {\n this.busy = true\n try {\n const lines = [...this.candidate].map(([name, releaseId]) => ({ name, releaseId }))\n await client.mutate({ mutation: SAVE, variables: { lines } })\n this.report = undefined\n await this.refresh()\n } catch (e: any) {\n this.failure = e?.message ?? ''\n } finally {\n this.busy = false\n }\n }\n\n private check = async () => {\n this.busy = true\n try {\n const response = await client.query({ query: CHECK, fetchPolicy: 'network-only' })\n if (response.errors?.length) throw new Error(response.errors[0].message)\n this.report = response.data.figureTypeMapCheck\n this.failure = ''\n } catch (e: any) {\n this.failure = e?.message ?? ''\n } finally {\n this.busy = false\n }\n }\n\n private async activate(version: number) {\n this.busy = true\n try {\n await client.mutate({ mutation: ACTIVATE, variables: { version } })\n this.report = undefined\n await this.refresh()\n } catch (e: any) {\n this.failure = e?.message ?? ''\n } finally {\n this.busy = false\n }\n }\n\n private renderReport(report: any) {\n const reach = (item: any) => html`<span class=\"sub\">${i18next.t('figure-library.text.reach', { boards: item.boards, nodes: item.nodes })}</span>`\n const group = (key: string, items: any[], line: (item: any) => unknown) =>\n items?.length\n ? html`<div class=\"report-group\">\n <h4>${i18next.t(`figure-library.check.${key}`)}</h4>\n <ul class=\"report-list\">\n ${items.map(item => html`<li>${line(item)}</li>`)}\n </ul>\n </div>`\n : nothing\n const nothingToReport = ['missing', 'changed', 'added', 'deprecated', 'unsupported', 'dependencies', 'carrierConflicts'].every(key => !report[key]?.length)\n\n return html`\n <section class=\"page-section\">\n <header class=\"page-section-header\">\n <h3>${i18next.t('figure-library.title.check-report')}</h3>\n </header>\n <div class=\"page-card\">\n ${nothingToReport ? html`<p class=\"sub\">${i18next.t('figure-library.check.nothing')}</p>` : nothing}\n ${group('missing', report.missing, item => html`<span class=\"ref\">${item.name}</span> ${reach(item)}`)}\n ${group(\n 'changed',\n report.changed,\n item => html`<span class=\"ref\">${item.from}</span> → <span class=\"ref\">${item.to}</span> ${reach(item)}\n ${item.contract.checked\n ? item.contract.changes.length\n ? html`<ul class=\"changes\">\n ${item.contract.changes.map(\n (change: any) => html`<li class=${change.blocking ? 'breaking' : ''}>\n ${changeText(change)}${change.blocking ? html` · ${i18next.t('figure-library.text.breaking')}` : nothing}\n </li>`\n )}\n </ul>`\n : nothing\n : html`<span class=\"sub\">${i18next.t('figure-library.check.uncheckable')}</span>`}`\n )}\n ${group('added', report.added, item => html`<span class=\"ref\">${item.ref}</span>`)}\n ${group('deprecated', report.deprecated, item => html`<span class=\"ref\">${item.ref}</span> ${reach(item)}`)}\n ${group('unsupported', report.unsupported, item => html`<span class=\"ref\">${item.ref}</span> ${reach(item)}`)}\n ${group('dependencies', report.dependencies, item => html`<span class=\"ref\">${item.ref}</span> ${reach(item)}`)}\n ${group(\n 'carrierConflicts',\n report.carrierConflicts,\n item => html`${item.carrierType} ${item.lines.map((line: any) => html`<span class=\"ref\">${line.ref}</span> `)}`\n )}\n </div>\n </section>\n `\n }\n}\n"]}
|