@things-factory/figure-library 10.1.207 → 10.1.208

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.
Files changed (60) hide show
  1. package/dist-client/figure-palette-group.d.ts +52 -0
  2. package/dist-client/figure-palette-group.js +41 -0
  3. package/dist-client/figure-palette-group.js.map +1 -0
  4. package/dist-client/figure-palette.d.ts +7 -0
  5. package/dist-client/figure-palette.js +49 -0
  6. package/dist-client/figure-palette.js.map +1 -0
  7. package/dist-client/item-types/index.d.ts +10 -0
  8. package/dist-client/item-types/index.js +48 -0
  9. package/dist-client/item-types/index.js.map +1 -0
  10. package/dist-client/item-types/item-types-editor.d.ts +9 -0
  11. package/dist-client/item-types/item-types-editor.js +49 -0
  12. package/dist-client/item-types/item-types-editor.js.map +1 -0
  13. package/dist-client/item-types/item-types-renderer.d.ts +2 -0
  14. package/dist-client/item-types/item-types-renderer.js +8 -0
  15. package/dist-client/item-types/item-types-renderer.js.map +1 -0
  16. package/dist-client/item-types/item-types-rows.d.ts +16 -0
  17. package/dist-client/item-types/item-types-rows.js +58 -0
  18. package/dist-client/item-types/item-types-rows.js.map +1 -0
  19. package/dist-client/item-types/ox-item-types-input.d.ts +24 -0
  20. package/dist-client/item-types/ox-item-types-input.js +284 -0
  21. package/dist-client/item-types/ox-item-types-input.js.map +1 -0
  22. package/dist-client/pages/figure-library-page.d.ts +3 -3
  23. package/dist-client/pages/figure-library-page.js +34 -5
  24. package/dist-client/pages/figure-library-page.js.map +1 -1
  25. package/dist-client/tsconfig.tsbuildinfo +1 -1
  26. package/dist-client/viewparts/figure-releases-popup.d.ts +10 -0
  27. package/dist-client/viewparts/figure-releases-popup.js +68 -0
  28. package/dist-client/viewparts/figure-releases-popup.js.map +1 -1
  29. package/dist-server/service/figure-library-release/figure-library-release.js +2 -2
  30. package/dist-server/service/figure-library-release/figure-library-release.js.map +1 -1
  31. package/dist-server/service/figure-library-resolver.d.ts +3 -0
  32. package/dist-server/service/figure-library-resolver.js +48 -2
  33. package/dist-server/service/figure-library-resolver.js.map +1 -1
  34. package/dist-server/service/figure-library-types.d.ts +2 -0
  35. package/dist-server/service/figure-library-types.js +8 -0
  36. package/dist-server/service/figure-library-types.js.map +1 -1
  37. package/dist-server/service/figure-type-map/figure-type-map-entry.d.ts +3 -0
  38. package/dist-server/service/figure-type-map/figure-type-map-entry.js +21 -0
  39. package/dist-server/service/figure-type-map/figure-type-map-entry.js.map +1 -1
  40. package/dist-server/service/library/blueprints.js +4 -0
  41. package/dist-server/service/library/blueprints.js.map +1 -1
  42. package/dist-server/service/library/extensions.js +3 -0
  43. package/dist-server/service/library/extensions.js.map +1 -1
  44. package/dist-server/service/library/figures.d.ts +8 -0
  45. package/dist-server/service/library/figures.js +5 -1
  46. package/dist-server/service/library/figures.js.map +1 -1
  47. package/dist-server/service/library/inspection.d.ts +1 -1
  48. package/dist-server/service/library/inspection.js +2 -0
  49. package/dist-server/service/library/inspection.js.map +1 -1
  50. package/dist-server/service/library/type-map.d.ts +15 -0
  51. package/dist-server/service/library/type-map.js +59 -0
  52. package/dist-server/service/library/type-map.js.map +1 -1
  53. package/dist-server/tsconfig.tsbuildinfo +1 -1
  54. package/package.json +9 -7
  55. package/translations/en.json +27 -2
  56. package/translations/es.json +27 -2
  57. package/translations/ja.json +27 -2
  58. package/translations/ko.json +32 -7
  59. package/translations/ms.json +27 -2
  60. package/translations/zh.json +27 -2
@@ -1,3 +1,4 @@
1
+ import '@material/web/button/text-button.js';
1
2
  import '@operato/popup/ox-popup-actions.js';
2
3
  import '@things-factory/figure-viewer/dist-client/figure-asset-viewer.js';
3
4
  import '@things-factory/figure-viewer/dist-client/figure-facts-list.js';
@@ -14,6 +15,10 @@ export declare class FigureReleasesPopup extends FigureReleasesPopup_base {
14
15
  static styles: import("lit").CSSResult[];
15
16
  /** The full figure name. */
16
17
  name: string;
18
+ /** Whether the name is archived: the action row offers to unarchive it instead of archiving it. */
19
+ archived: boolean;
20
+ /** Whether the domain draws the name as an item: the action row offers to take the mark away instead of marking it. */
21
+ item: boolean;
17
22
  /** The id of the release it draws with now; '' when nothing is in use. */
18
23
  drawing: string;
19
24
  private releases;
@@ -31,6 +36,11 @@ export declare class FigureReleasesPopup extends FigureReleasesPopup_base {
31
36
  private renderColumn;
32
37
  private renderReleaseFacts;
33
38
  private show;
39
+ private archive;
40
+ private unarchive;
41
+ private markItem;
42
+ /** Archives, unarchives or marks the name; a refusal (a board still uses it) is said at the top and the popup stays. */
43
+ private change;
34
44
  private save;
35
45
  }
36
46
  export {};
@@ -1,4 +1,5 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
+ import '@material/web/button/text-button.js';
2
3
  import '@operato/popup/ox-popup-actions.js';
3
4
  import '@things-factory/figure-viewer/dist-client/figure-asset-viewer.js';
4
5
  import '@things-factory/figure-viewer/dist-client/figure-facts-list.js';
@@ -33,6 +34,29 @@ const RELEASES_OF = gql `
33
34
  }
34
35
  }
35
36
  `;
37
+ /* Archiving is how a figure leaves the library; its releases stay (ADR-0114 결정 18 · 20). */
38
+ const ARCHIVE = gql `
39
+ mutation ($name: String!) {
40
+ archiveFigure(name: $name) {
41
+ name
42
+ }
43
+ }
44
+ `;
45
+ const UNARCHIVE = gql `
46
+ mutation ($name: String!) {
47
+ unarchiveFigure(name: $name) {
48
+ name
49
+ }
50
+ }
51
+ `;
52
+ /* Whether the domain draws the name as an item a holder holds -- a carrier in fmsim (ADR-0155 개정 1 E). */
53
+ const MARK_ITEM = gql `
54
+ mutation ($name: String!, $item: Boolean!) {
55
+ markFigureItem(name: $name, item: $item) {
56
+ name
57
+ }
58
+ }
59
+ `;
36
60
  const CHOOSE = gql `
37
61
  mutation ($name: String!, $releaseId: String!) {
38
62
  chooseFigureRelease(name: $name, releaseId: $releaseId) {
@@ -71,6 +95,10 @@ let FigureReleasesPopup = class FigureReleasesPopup extends localize(i18next)(Li
71
95
  super(...arguments);
72
96
  /** The full figure name. */
73
97
  this.name = '';
98
+ /** Whether the name is archived: the action row offers to unarchive it instead of archiving it. */
99
+ this.archived = false;
100
+ /** Whether the domain draws the name as an item: the action row offers to take the mark away instead of marking it. */
101
+ this.item = false;
74
102
  /** The id of the release it draws with now; '' when nothing is in use. */
75
103
  this.drawing = '';
76
104
  this.releases = [];
@@ -82,6 +110,9 @@ let FigureReleasesPopup = class FigureReleasesPopup extends localize(i18next)(Li
82
110
  /** The tab both columns show: choosing one in a column turns the other to it, so both are compared on one view. */
83
111
  this.tab = 'info';
84
112
  this.assets = new Map();
113
+ this.archive = () => this.change(ARCHIVE);
114
+ this.unarchive = () => this.change(UNARCHIVE);
115
+ this.markItem = () => this.change(MARK_ITEM, { item: !this.item });
85
116
  this.save = async () => {
86
117
  this.saving = true;
87
118
  try {
@@ -148,9 +179,15 @@ let FigureReleasesPopup = class FigureReleasesPopup extends localize(i18next)(Li
148
179
  flex: none;
149
180
  }
150
181
 
182
+ /*
183
+ The canvas and what a release is share the column: the canvas takes at most half of it, so its facts, size and
184
+ motion always have the other half however wide the column is (user 2026-10-22: a 4:3 canvas across a wide
185
+ column left the facts below the fold, or out of sight).
186
+ */
151
187
  section.column > figure-asset-viewer {
152
188
  flex: 1;
153
189
  min-height: 0;
190
+ --figure-asset-viewer-canvas-max: 50%;
154
191
  }
155
192
 
156
193
  section.column[picked] {
@@ -288,6 +325,12 @@ let FigureReleasesPopup = class FigureReleasesPopup extends localize(i18next)(Li
288
325
  </div>
289
326
  </div>
290
327
  <ox-popup-actions>
328
+ <md-text-button slot="start" ?disabled=${this.saving} @click=${this.archived ? this.unarchive : this.archive}>
329
+ ${i18next.t(this.archived ? 'figure-library.button.unarchive' : 'figure-library.button.archive')}
330
+ </md-text-button>
331
+ <md-text-button slot="start" ?disabled=${this.saving} @click=${this.markItem}>
332
+ ${i18next.t(this.item ? 'figure-library.button.unmark-item' : 'figure-library.button.mark-item')}
333
+ </md-text-button>
291
334
  <button slot="cancel" @click=${() => closePopup(this)}>${i18next.t('figure-library.button.cancel')}</button>
292
335
  <button slot="confirm" raised ?disabled=${!changed || this.saving} @click=${this.save}>${i18next.t('figure-library.button.save')}</button>
293
336
  </ox-popup-actions>
@@ -375,11 +418,36 @@ let FigureReleasesPopup = class FigureReleasesPopup extends localize(i18next)(Li
375
418
  next[column] = id;
376
419
  this.shown = next;
377
420
  }
421
+ /** Archives, unarchives or marks the name; a refusal (a board still uses it) is said at the top and the popup stays. */
422
+ async change(mutation, variables = {}) {
423
+ this.saving = true;
424
+ try {
425
+ const response = await client.mutate({ mutation, variables: { name: this.name, ...variables } });
426
+ if (response.errors?.length)
427
+ throw new Error(response.errors[0].message);
428
+ this.dispatchEvent(new CustomEvent('saved', { bubbles: true, composed: true }));
429
+ closePopup(this);
430
+ }
431
+ catch (e) {
432
+ this.failure = e?.message ?? '';
433
+ }
434
+ finally {
435
+ this.saving = false;
436
+ }
437
+ }
378
438
  };
379
439
  __decorate([
380
440
  property(),
381
441
  __metadata("design:type", Object)
382
442
  ], FigureReleasesPopup.prototype, "name", void 0);
443
+ __decorate([
444
+ property({ type: Boolean }),
445
+ __metadata("design:type", Object)
446
+ ], FigureReleasesPopup.prototype, "archived", void 0);
447
+ __decorate([
448
+ property({ type: Boolean }),
449
+ __metadata("design:type", Object)
450
+ ], FigureReleasesPopup.prototype, "item", void 0);
383
451
  __decorate([
384
452
  property(),
385
453
  __metadata("design:type", Object)
@@ -1 +1 @@
1
- {"version":3,"file":"figure-releases-popup.js","sourceRoot":"","sources":["../../client/viewparts/figure-releases-popup.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/popup/ox-popup-actions.js'\nimport '@things-factory/figure-viewer/dist-client/figure-asset-viewer.js'\nimport '@things-factory/figure-viewer/dist-client/figure-facts-list.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport type { FigureAsset } from '@hatiolab/figure-model'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { closePopup } from '@operato/popup'\nimport { ButtonStyles, CommonPopupStyles, FormFieldStyles, ScrollbarStyles } from '@operato/styles'\n\nimport { versionText } from './figure-version.js'\nimport { defaultPair, SIDE_BY_SIDE } from './release-pair.js'\n\nconst RELEASES_OF = gql`\n query ($name: String!) {\n figureLibraryReleasesOf(name: $name) {\n id\n name\n ref\n version\n category\n source\n formatSupported\n assetFormat\n kernelVersion\n changes\n deprecated\n supersededBy\n comment\n sourceUrl\n releasedAt\n createdAt\n }\n }\n`\n\nconst CHOOSE = gql`\n mutation ($name: String!, $releaseId: String!) {\n chooseFigureRelease(name: $name, releaseId: $releaseId) {\n name\n }\n }\n`\n\ntype Change = { code?: string; values?: Record<string, unknown>; detail?: string; blocking?: boolean }\n\n/** A time in the reader's language (a bare toLocaleString follows the browser, not the app). */\nconst when = (value?: string | null) => (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: Change) =>\n change.code\n ? i18next.t(`figure-library.contract.${change.code}`, { ...(change.values ?? {}), defaultValue: change.detail ?? change.code })\n : change.detail ?? ''\n\n/** The contract changes a release carries against its previous release, as the authoring server measured them. */\nconst changesOf = (release: any): Change[] => {\n try {\n const parsed = release.changes ? JSON.parse(release.changes) : []\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n}\n\n/**\n * Two releases of one figure on live canvases, side by side (ADR-0114, amended 2026-10-12): each drawn as a board draws\n * it, sized within its ranges, posed and played, with what it is and its places beside it -- operato-figure's preview\n * (@things-factory/figure-viewer), not a second one. With more releases, each column picks the release it shows; the\n * one in use and the latest stand first. The operator picks the release the figure draws with and saves; save stays\n * off until the pick differs. A release this server cannot read shows why instead of a canvas and cannot be picked.\n */\n@customElement('figure-releases-popup')\nexport class FigureReleasesPopup extends localize(i18next)(LitElement) {\n static styles = [\n CommonPopupStyles,\n ScrollbarStyles,\n ButtonStyles,\n FormFieldStyles,\n css`\n /*\n The popup takes the overlay's width (a share of the window, all of it on a narrow one) and never more: the two\n columns sit side by side when they have room and stack when they do not, and the actions stay in view.\n */\n :host {\n min-height: 0;\n width: 100%;\n --popup-min-width: 0;\n }\n\n /*\n Each column is as tall as the body, so its canvas stays in view while only its tab's body scrolls (user\n 2026-10-15: a clip played at the bottom of a scrolled column moved a figure no longer seen). Stacked, the body\n scrolls from one column to the next.\n */\n .body {\n flex: 1;\n overflow: auto;\n container-type: size;\n }\n\n .columns {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 380px), 1fr));\n gap: var(--spacing-large, 12px);\n align-items: start;\n }\n\n section.column {\n display: flex;\n flex-direction: column;\n min-width: 0;\n height: 100cqh;\n box-sizing: border-box;\n border: 1px solid var(--ui-line, var(--md-sys-color-outline-variant));\n border-radius: var(--ui-r, 10px);\n background: var(--ui-panel, var(--md-sys-color-surface-container-lowest));\n }\n\n section.column > * {\n flex: none;\n }\n\n section.column > figure-asset-viewer {\n flex: 1;\n min-height: 0;\n }\n\n section.column[picked] {\n border-color: var(--ui-accent, var(--md-sys-color-primary));\n box-shadow: inset 0 0 0 1px var(--ui-accent, var(--md-sys-color-primary));\n }\n\n /*\n Side by side, which release a column is stays in view while its facts scroll by. Stacked, each column's canvas\n stands right under its own header and the header leaves with its column (below two columns' width).\n */\n .head {\n position: sticky;\n top: 0;\n z-index: 1;\n border-radius: var(--ui-r, 10px) var(--ui-r, 10px) 0 0;\n background: var(--ui-panel, var(--md-sys-color-surface-container-lowest));\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--spacing-small, 4px) var(--spacing-medium, 8px);\n padding: var(--spacing-medium, 8px) 16px;\n border-bottom: 1px solid var(--ui-line, var(--md-sys-color-outline-variant));\n }\n\n @container (max-width: 771px) {\n .head {\n position: static;\n }\n }\n\n .head label {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-small, 4px);\n font-weight: 600;\n }\n\n .head select {\n height: var(--form-element-height-small, 26px);\n min-width: 72px;\n font-size: var(--ui-t-body, 13px);\n }\n\n .head strong {\n font-size: var(--ui-t-title, 15px);\n }\n\n .marks {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-small, 4px);\n }\n\n .mark {\n padding: 0 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.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 .mark.crit {\n color: var(--ui-crit, var(--md-sys-color-error));\n }\n\n .reason {\n margin: 0;\n padding: var(--spacing-huge, 24px) 16px;\n color: var(--ui-crit, var(--md-sys-color-error));\n }\n\n /* The release's own facts (note, dates, source, format, contract change) under the figure's. */\n dl.release {\n display: grid;\n grid-template-columns: 96px minmax(0, 1fr);\n gap: 3px 12px;\n margin: 0;\n padding: 10px 16px;\n line-height: 1.45;\n }\n\n dl.release dt {\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n\n dl.release dd {\n margin: 0;\n overflow-wrap: anywhere;\n }\n\n dl.release dd small {\n display: block;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n\n ul {\n margin: 0;\n padding-left: 1.2em;\n }\n\n li.breaking {\n color: var(--ui-crit, var(--md-sys-color-error));\n }\n\n .finding {\n margin: 0 0 var(--spacing-large, 12px);\n padding-left: var(--spacing-large, 12px);\n border-left: 2px solid var(--ui-crit, var(--md-sys-color-error));\n }\n `\n ]\n\n /** The full figure name. */\n @property() name = ''\n /** The id of the release it draws with now; '' when nothing is in use. */\n @property() drawing = ''\n\n @state() private releases: any[] = []\n /** The release each column shows, by id. */\n @state() private shown: string[] = []\n @state() private picked = ''\n @state() private saving = false\n @state() private failure = ''\n /** The tab both columns show: choosing one in a column turns the other to it, so both are compared on one view. */\n @state() private tab = 'info'\n\n private assets = new Map<string, FigureAsset | null>()\n\n async connectedCallback() {\n super.connectedCallback()\n this.picked = this.drawing\n const response = await client.query({ query: RELEASES_OF, variables: { name: this.name }, fetchPolicy: 'network-only' })\n this.releases = response.data?.figureLibraryReleasesOf ?? []\n this.shown = defaultPair(this.releases, this.drawing)\n }\n\n render() {\n const changed = !!this.picked && this.picked !== this.drawing\n const byId = new Map(this.releases.map(release => [release.id, release]))\n\n return html`\n <div class=\"body\">\n ${this.failure ? html`<p class=\"finding\" role=\"alert\">${this.failure}</p>` : nothing}\n <div class=\"columns\">\n ${this.shown.map((id, column) => (byId.get(id) ? this.renderColumn(byId.get(id), column) : nothing))}\n </div>\n </div>\n <ox-popup-actions>\n <button slot=\"cancel\" @click=${() => closePopup(this)}>${i18next.t('figure-library.button.cancel')}</button>\n <button slot=\"confirm\" raised ?disabled=${!changed || this.saving} @click=${this.save}>${i18next.t('figure-library.button.save')}</button>\n </ox-popup-actions>\n `\n }\n\n private assetOf(release: any): FigureAsset | null {\n if (!this.assets.has(release.id)) {\n let asset: FigureAsset | null = null\n try {\n asset = release.formatSupported ? (JSON.parse(release.source) as FigureAsset) : null\n } catch {\n asset = null\n }\n this.assets.set(release.id, asset)\n }\n return this.assets.get(release.id)!\n }\n\n private renderColumn(release: any, column: number) {\n const picked = release.id === this.picked\n /* A release this server cannot read is never used: it is shown, not picked (ADR-0114, amended 2026-10-12). */\n const asset = this.assetOf(release)\n const unusable = !asset\n const latest = release.id === this.releases[0]?.id\n const choosable = this.releases.length > SIDE_BY_SIDE\n\n return html`\n <section class=\"column\" ?picked=${picked}>\n <div class=\"head\">\n <label>\n <input type=\"radio\" name=\"release\" .checked=${picked} ?disabled=${unusable} @change=${() => (this.picked = release.id)} />\n ${choosable\n ? html`<select aria-label=${i18next.t('figure-library.label.release-shown')} @change=${(e: Event) => this.show(column, (e.target as HTMLSelectElement).value)}>\n ${this.releases.map(\n other => html`<option value=${other.id} ?selected=${other.id === release.id}>${versionText(other.version)}</option>`\n )}\n </select>`\n : html`<strong>${versionText(release.version)}</strong>`}\n </label>\n <span class=\"marks\">\n ${release.id === this.drawing ? html`<span class=\"mark on\">${i18next.t('figure-library.text.in-use')}</span>` : nothing}\n ${latest ? html`<span class=\"mark\">${i18next.t('figure-library.text.latest')}</span>` : nothing}\n ${unusable ? html`<span class=\"mark crit\">${i18next.t('figure-library.text.format-unsupported')}</span>` : nothing}\n ${release.deprecated ? html`<span class=\"mark\">${i18next.t('figure-library.text.deprecated')}</span>` : nothing}\n </span>\n </div>\n ${asset\n ? html`<figure-asset-viewer .asset=${asset} .tab=${this.tab} @tab-change=${(e: CustomEvent<{ tab: string }>) => (this.tab = e.detail.tab)}>\n <figure-facts-list slot=\"facts\" .asset=${asset} .row=${{ category: release.category }}></figure-facts-list>\n ${this.renderReleaseFacts(release, 'facts')}\n </figure-asset-viewer>`\n : html`<p class=\"reason\" role=\"note\">${i18next.t('figure-library.text.cannot-use-format', { format: release.assetFormat })}</p>\n ${this.renderReleaseFacts(release)}`}\n </section>\n `\n }\n\n private renderReleaseFacts(release: any, slot?: string) {\n const changes = changesOf(release)\n\n return html`<dl class=\"release\" slot=${slot ?? nothing}>\n ${release.comment ? html`<dt>${i18next.t('figure-library.label.release-note')}</dt><dd>${release.comment}</dd>` : nothing}\n ${release.version > 1\n ? html`<dt>${i18next.t('figure-library.text.contract-since', { version: versionText(release.version - 1) })}</dt>\n <dd>\n ${changes.length\n ? html`<ul>\n ${changes.map(\n change => 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 : i18next.t('figure-library.text.no-contract-change')}\n </dd>`\n : nothing}\n <dt>${i18next.t('figure-library.label.format')}</dt>\n <dd>\n ${release.assetFormat}\n ${release.kernelVersion ? html`<small>${i18next.t('figure-library.text.kernel', { version: release.kernelVersion })}</small>` : nothing}\n </dd>\n <dt>${i18next.t('figure-library.label.released-at')}</dt>\n <dd>${when(release.releasedAt)}</dd>\n <dt>${i18next.t('figure-library.label.imported-at')}</dt>\n <dd>${when(release.createdAt)}</dd>\n <dt>${i18next.t('figure-library.label.source')}</dt>\n <dd>${release.sourceUrl ?? ''}</dd>\n </dl>`\n }\n\n private show(column: number, id: string) {\n const next = [...this.shown]\n next[column] = id\n this.shown = next\n }\n\n private save = async () => {\n this.saving = true\n try {\n const response = await client.mutate({ mutation: CHOOSE, variables: { name: this.name, releaseId: this.picked } })\n if (response.errors?.length) throw new Error(response.errors[0].message)\n this.dispatchEvent(new CustomEvent('saved', { bubbles: true, composed: true }))\n closePopup(this)\n } catch (e: any) {\n this.failure = e?.message ?? ''\n } finally {\n this.saving = false\n }\n }\n}\n"]}
1
+ {"version":3,"file":"figure-releases-popup.js","sourceRoot":"","sources":["../../client/viewparts/figure-releases-popup.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/button/text-button.js'\nimport '@operato/popup/ox-popup-actions.js'\nimport '@things-factory/figure-viewer/dist-client/figure-asset-viewer.js'\nimport '@things-factory/figure-viewer/dist-client/figure-facts-list.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport type { FigureAsset } from '@hatiolab/figure-model'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { closePopup } from '@operato/popup'\nimport { ButtonStyles, CommonPopupStyles, FormFieldStyles, ScrollbarStyles } from '@operato/styles'\n\nimport { versionText } from './figure-version.js'\nimport { defaultPair, SIDE_BY_SIDE } from './release-pair.js'\n\nconst RELEASES_OF = gql`\n query ($name: String!) {\n figureLibraryReleasesOf(name: $name) {\n id\n name\n ref\n version\n category\n source\n formatSupported\n assetFormat\n kernelVersion\n changes\n deprecated\n supersededBy\n comment\n sourceUrl\n releasedAt\n createdAt\n }\n }\n`\n\n/* Archiving is how a figure leaves the library; its releases stay (ADR-0114 결정 18 · 20). */\nconst ARCHIVE = gql`\n mutation ($name: String!) {\n archiveFigure(name: $name) {\n name\n }\n }\n`\n\nconst UNARCHIVE = gql`\n mutation ($name: String!) {\n unarchiveFigure(name: $name) {\n name\n }\n }\n`\n\n/* Whether the domain draws the name as an item a holder holds -- a carrier in fmsim (ADR-0155 개정 1 E). */\nconst MARK_ITEM = gql`\n mutation ($name: String!, $item: Boolean!) {\n markFigureItem(name: $name, item: $item) {\n name\n }\n }\n`\n\nconst CHOOSE = gql`\n mutation ($name: String!, $releaseId: String!) {\n chooseFigureRelease(name: $name, releaseId: $releaseId) {\n name\n }\n }\n`\n\ntype Change = { code?: string; values?: Record<string, unknown>; detail?: string; blocking?: boolean }\n\n/** A time in the reader's language (a bare toLocaleString follows the browser, not the app). */\nconst when = (value?: string | null) => (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: Change) =>\n change.code\n ? i18next.t(`figure-library.contract.${change.code}`, { ...(change.values ?? {}), defaultValue: change.detail ?? change.code })\n : change.detail ?? ''\n\n/** The contract changes a release carries against its previous release, as the authoring server measured them. */\nconst changesOf = (release: any): Change[] => {\n try {\n const parsed = release.changes ? JSON.parse(release.changes) : []\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n}\n\n/**\n * Two releases of one figure on live canvases, side by side (ADR-0114, amended 2026-10-12): each drawn as a board draws\n * it, sized within its ranges, posed and played, with what it is and its places beside it -- operato-figure's preview\n * (@things-factory/figure-viewer), not a second one. With more releases, each column picks the release it shows; the\n * one in use and the latest stand first. The operator picks the release the figure draws with and saves; save stays\n * off until the pick differs. A release this server cannot read shows why instead of a canvas and cannot be picked.\n */\n@customElement('figure-releases-popup')\nexport class FigureReleasesPopup extends localize(i18next)(LitElement) {\n static styles = [\n CommonPopupStyles,\n ScrollbarStyles,\n ButtonStyles,\n FormFieldStyles,\n css`\n /*\n The popup takes the overlay's width (a share of the window, all of it on a narrow one) and never more: the two\n columns sit side by side when they have room and stack when they do not, and the actions stay in view.\n */\n :host {\n min-height: 0;\n width: 100%;\n --popup-min-width: 0;\n }\n\n /*\n Each column is as tall as the body, so its canvas stays in view while only its tab's body scrolls (user\n 2026-10-15: a clip played at the bottom of a scrolled column moved a figure no longer seen). Stacked, the body\n scrolls from one column to the next.\n */\n .body {\n flex: 1;\n overflow: auto;\n container-type: size;\n }\n\n .columns {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 380px), 1fr));\n gap: var(--spacing-large, 12px);\n align-items: start;\n }\n\n section.column {\n display: flex;\n flex-direction: column;\n min-width: 0;\n height: 100cqh;\n box-sizing: border-box;\n border: 1px solid var(--ui-line, var(--md-sys-color-outline-variant));\n border-radius: var(--ui-r, 10px);\n background: var(--ui-panel, var(--md-sys-color-surface-container-lowest));\n }\n\n section.column > * {\n flex: none;\n }\n\n /*\n The canvas and what a release is share the column: the canvas takes at most half of it, so its facts, size and\n motion always have the other half however wide the column is (user 2026-10-22: a 4:3 canvas across a wide\n column left the facts below the fold, or out of sight).\n */\n section.column > figure-asset-viewer {\n flex: 1;\n min-height: 0;\n --figure-asset-viewer-canvas-max: 50%;\n }\n\n section.column[picked] {\n border-color: var(--ui-accent, var(--md-sys-color-primary));\n box-shadow: inset 0 0 0 1px var(--ui-accent, var(--md-sys-color-primary));\n }\n\n /*\n Side by side, which release a column is stays in view while its facts scroll by. Stacked, each column's canvas\n stands right under its own header and the header leaves with its column (below two columns' width).\n */\n .head {\n position: sticky;\n top: 0;\n z-index: 1;\n border-radius: var(--ui-r, 10px) var(--ui-r, 10px) 0 0;\n background: var(--ui-panel, var(--md-sys-color-surface-container-lowest));\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--spacing-small, 4px) var(--spacing-medium, 8px);\n padding: var(--spacing-medium, 8px) 16px;\n border-bottom: 1px solid var(--ui-line, var(--md-sys-color-outline-variant));\n }\n\n @container (max-width: 771px) {\n .head {\n position: static;\n }\n }\n\n .head label {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-small, 4px);\n font-weight: 600;\n }\n\n .head select {\n height: var(--form-element-height-small, 26px);\n min-width: 72px;\n font-size: var(--ui-t-body, 13px);\n }\n\n .head strong {\n font-size: var(--ui-t-title, 15px);\n }\n\n .marks {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-small, 4px);\n }\n\n .mark {\n padding: 0 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.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 .mark.crit {\n color: var(--ui-crit, var(--md-sys-color-error));\n }\n\n .reason {\n margin: 0;\n padding: var(--spacing-huge, 24px) 16px;\n color: var(--ui-crit, var(--md-sys-color-error));\n }\n\n /* The release's own facts (note, dates, source, format, contract change) under the figure's. */\n dl.release {\n display: grid;\n grid-template-columns: 96px minmax(0, 1fr);\n gap: 3px 12px;\n margin: 0;\n padding: 10px 16px;\n line-height: 1.45;\n }\n\n dl.release dt {\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n\n dl.release dd {\n margin: 0;\n overflow-wrap: anywhere;\n }\n\n dl.release dd small {\n display: block;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n\n ul {\n margin: 0;\n padding-left: 1.2em;\n }\n\n li.breaking {\n color: var(--ui-crit, var(--md-sys-color-error));\n }\n\n .finding {\n margin: 0 0 var(--spacing-large, 12px);\n padding-left: var(--spacing-large, 12px);\n border-left: 2px solid var(--ui-crit, var(--md-sys-color-error));\n }\n `\n ]\n\n /** The full figure name. */\n @property() name = ''\n /** Whether the name is archived: the action row offers to unarchive it instead of archiving it. */\n @property({ type: Boolean }) archived = false\n /** Whether the domain draws the name as an item: the action row offers to take the mark away instead of marking it. */\n @property({ type: Boolean }) item = false\n /** The id of the release it draws with now; '' when nothing is in use. */\n @property() drawing = ''\n\n @state() private releases: any[] = []\n /** The release each column shows, by id. */\n @state() private shown: string[] = []\n @state() private picked = ''\n @state() private saving = false\n @state() private failure = ''\n /** The tab both columns show: choosing one in a column turns the other to it, so both are compared on one view. */\n @state() private tab = 'info'\n\n private assets = new Map<string, FigureAsset | null>()\n\n async connectedCallback() {\n super.connectedCallback()\n this.picked = this.drawing\n const response = await client.query({ query: RELEASES_OF, variables: { name: this.name }, fetchPolicy: 'network-only' })\n this.releases = response.data?.figureLibraryReleasesOf ?? []\n this.shown = defaultPair(this.releases, this.drawing)\n }\n\n render() {\n const changed = !!this.picked && this.picked !== this.drawing\n const byId = new Map(this.releases.map(release => [release.id, release]))\n\n return html`\n <div class=\"body\">\n ${this.failure ? html`<p class=\"finding\" role=\"alert\">${this.failure}</p>` : nothing}\n <div class=\"columns\">\n ${this.shown.map((id, column) => (byId.get(id) ? this.renderColumn(byId.get(id), column) : nothing))}\n </div>\n </div>\n <ox-popup-actions>\n <md-text-button slot=\"start\" ?disabled=${this.saving} @click=${this.archived ? this.unarchive : this.archive}>\n ${i18next.t(this.archived ? 'figure-library.button.unarchive' : 'figure-library.button.archive')}\n </md-text-button>\n <md-text-button slot=\"start\" ?disabled=${this.saving} @click=${this.markItem}>\n ${i18next.t(this.item ? 'figure-library.button.unmark-item' : 'figure-library.button.mark-item')}\n </md-text-button>\n <button slot=\"cancel\" @click=${() => closePopup(this)}>${i18next.t('figure-library.button.cancel')}</button>\n <button slot=\"confirm\" raised ?disabled=${!changed || this.saving} @click=${this.save}>${i18next.t('figure-library.button.save')}</button>\n </ox-popup-actions>\n `\n }\n\n private assetOf(release: any): FigureAsset | null {\n if (!this.assets.has(release.id)) {\n let asset: FigureAsset | null = null\n try {\n asset = release.formatSupported ? (JSON.parse(release.source) as FigureAsset) : null\n } catch {\n asset = null\n }\n this.assets.set(release.id, asset)\n }\n return this.assets.get(release.id)!\n }\n\n private renderColumn(release: any, column: number) {\n const picked = release.id === this.picked\n /* A release this server cannot read is never used: it is shown, not picked (ADR-0114, amended 2026-10-12). */\n const asset = this.assetOf(release)\n const unusable = !asset\n const latest = release.id === this.releases[0]?.id\n const choosable = this.releases.length > SIDE_BY_SIDE\n\n return html`\n <section class=\"column\" ?picked=${picked}>\n <div class=\"head\">\n <label>\n <input type=\"radio\" name=\"release\" .checked=${picked} ?disabled=${unusable} @change=${() => (this.picked = release.id)} />\n ${choosable\n ? html`<select aria-label=${i18next.t('figure-library.label.release-shown')} @change=${(e: Event) => this.show(column, (e.target as HTMLSelectElement).value)}>\n ${this.releases.map(\n other => html`<option value=${other.id} ?selected=${other.id === release.id}>${versionText(other.version)}</option>`\n )}\n </select>`\n : html`<strong>${versionText(release.version)}</strong>`}\n </label>\n <span class=\"marks\">\n ${release.id === this.drawing ? html`<span class=\"mark on\">${i18next.t('figure-library.text.in-use')}</span>` : nothing}\n ${latest ? html`<span class=\"mark\">${i18next.t('figure-library.text.latest')}</span>` : nothing}\n ${unusable ? html`<span class=\"mark crit\">${i18next.t('figure-library.text.format-unsupported')}</span>` : nothing}\n ${release.deprecated ? html`<span class=\"mark\">${i18next.t('figure-library.text.deprecated')}</span>` : nothing}\n </span>\n </div>\n ${asset\n ? html`<figure-asset-viewer .asset=${asset} .tab=${this.tab} @tab-change=${(e: CustomEvent<{ tab: string }>) => (this.tab = e.detail.tab)}>\n <figure-facts-list slot=\"facts\" .asset=${asset} .row=${{ category: release.category }}></figure-facts-list>\n ${this.renderReleaseFacts(release, 'facts')}\n </figure-asset-viewer>`\n : html`<p class=\"reason\" role=\"note\">${i18next.t('figure-library.text.cannot-use-format', { format: release.assetFormat })}</p>\n ${this.renderReleaseFacts(release)}`}\n </section>\n `\n }\n\n private renderReleaseFacts(release: any, slot?: string) {\n const changes = changesOf(release)\n\n return html`<dl class=\"release\" slot=${slot ?? nothing}>\n ${release.comment ? html`<dt>${i18next.t('figure-library.label.release-note')}</dt><dd>${release.comment}</dd>` : nothing}\n ${release.version > 1\n ? html`<dt>${i18next.t('figure-library.text.contract-since', { version: versionText(release.version - 1) })}</dt>\n <dd>\n ${changes.length\n ? html`<ul>\n ${changes.map(\n change => 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 : i18next.t('figure-library.text.no-contract-change')}\n </dd>`\n : nothing}\n <dt>${i18next.t('figure-library.label.format')}</dt>\n <dd>\n ${release.assetFormat}\n ${release.kernelVersion ? html`<small>${i18next.t('figure-library.text.kernel', { version: release.kernelVersion })}</small>` : nothing}\n </dd>\n <dt>${i18next.t('figure-library.label.released-at')}</dt>\n <dd>${when(release.releasedAt)}</dd>\n <dt>${i18next.t('figure-library.label.imported-at')}</dt>\n <dd>${when(release.createdAt)}</dd>\n <dt>${i18next.t('figure-library.label.source')}</dt>\n <dd>${release.sourceUrl ?? ''}</dd>\n </dl>`\n }\n\n private show(column: number, id: string) {\n const next = [...this.shown]\n next[column] = id\n this.shown = next\n }\n\n private archive = () => this.change(ARCHIVE)\n\n private unarchive = () => this.change(UNARCHIVE)\n\n private markItem = () => this.change(MARK_ITEM, { item: !this.item })\n\n /** Archives, unarchives or marks the name; a refusal (a board still uses it) is said at the top and the popup stays. */\n private async change(mutation: typeof ARCHIVE, variables: Record<string, unknown> = {}) {\n this.saving = true\n try {\n const response = await client.mutate({ mutation, variables: { name: this.name, ...variables } })\n if (response.errors?.length) throw new Error(response.errors[0].message)\n this.dispatchEvent(new CustomEvent('saved', { bubbles: true, composed: true }))\n closePopup(this)\n } catch (e: any) {\n this.failure = e?.message ?? ''\n } finally {\n this.saving = false\n }\n }\n\n private save = async () => {\n this.saving = true\n try {\n const response = await client.mutate({ mutation: CHOOSE, variables: { name: this.name, releaseId: this.picked } })\n if (response.errors?.length) throw new Error(response.errors[0].message)\n this.dispatchEvent(new CustomEvent('saved', { bubbles: true, composed: true }))\n closePopup(this)\n } catch (e: any) {\n this.failure = e?.message ?? ''\n } finally {\n this.saving = false\n }\n }\n}\n"]}
@@ -151,12 +151,12 @@ tslib_1.__decorate([
151
151
  ], FigureLibraryRelease.prototype, "comment", void 0);
152
152
  tslib_1.__decorate([
153
153
  (0, typeorm_1.Column)({ default: false }),
154
- (0, type_graphql_1.Field)({ description: 'Retired at the authoring server.' }),
154
+ (0, type_graphql_1.Field)({ description: 'Deprecated at the authoring server.' }),
155
155
  tslib_1.__metadata("design:type", Boolean)
156
156
  ], FigureLibraryRelease.prototype, "deprecated", void 0);
157
157
  tslib_1.__decorate([
158
158
  (0, typeorm_1.Column)({ nullable: true }),
159
- (0, type_graphql_1.Field)({ nullable: true, description: 'Full name to use instead of a retired figure.' }),
159
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Full name to use instead of a deprecated figure.' }),
160
160
  tslib_1.__metadata("design:type", String)
161
161
  ], FigureLibraryRelease.prototype, "supersededBy", void 0);
162
162
  tslib_1.__decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"figure-library-release.js","sourceRoot":"","sources":["../../../server/service/figure-library-release/figure-library-release.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n DeleteDateColumn,\n Entity,\n Index,\n ManyToOne,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\nimport { Field, Float, ID, Int, ObjectType } from 'type-graphql'\nimport { GraphQLJSON } from 'graphql-scalars'\n\nimport { User } from '@things-factory/auth-base'\nimport { Domain, longTextColumn } from '@things-factory/shell'\n\n/** A file a release depends on, as its package listed it. */\nexport interface FigureLibraryDependency {\n hash: string\n role: string\n size: number\n contentType: string\n}\n\n/**\n * A released figure this board server imported (ADR-0114 결정 3).\n *\n * The release data is immutable: the server that authored it never changes a release, so a row is added once and never\n * rewritten from a package. `formatSupported` · `checkedKernel` · `width` · `depth` · `capabilities` · `extensions` are\n * derived, recomputed when this server's kernel is another version than the one that checked them.\n * Kept as columns so a list filters on them without reading every source. There is no delete path.\n */\n@Entity()\n@Index('ix_figure_library_release_1', (release: FigureLibraryRelease) => [release.domain, release.ref], {\n unique: true,\n where: '\"deleted_at\" IS NULL'\n})\n@Index('ix_figure_library_release_2', (release: FigureLibraryRelease) => [release.domain, release.namespace, release.type])\n@ObjectType({ description: 'A released figure imported into this board server, one row per release reference.' })\nexport class FigureLibraryRelease {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier.' })\n readonly id?: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain, { nullable: true, description: 'The domain that imported the release.' })\n domain?: Domain\n\n @RelationId((release: FigureLibraryRelease) => release.domain)\n domainId?: string\n\n @Column()\n @Field({ description: 'Display name of the figure at this release.' })\n name: string\n\n @Column({ type: 'text', nullable: true })\n @Field({ nullable: true, description: 'Description of the figure at this release.' })\n description?: string\n\n @Column()\n @Field({ description: 'Release reference {namespace}/{type}@{version}.' })\n ref: string\n\n @Column()\n @Field({ description: 'Namespace of the full name.' })\n namespace: string\n\n @Column()\n @Field({ description: 'Type of the full name.' })\n type: string\n\n @Column()\n @Field(type => Int, { description: 'Release version.' })\n version: number\n\n @Column('simple-json', { nullable: true, default: null })\n @Field(type => GraphQLJSON, { nullable: true, description: 'Display names by language.' })\n names?: Record<string, string>\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Category of the figure at this release.' })\n category?: string\n\n @Column({ ...longTextColumn() })\n @Field({ description: 'The released source, as the authoring server released it.' })\n source: string\n\n @Column({ length: 64 })\n @Field({ description: 'SHA-256 of the source. Same reference and hash is the same release.' })\n contentHash: string\n\n @Column()\n @Field({ description: 'The format the source declares (figure-asset-1).' })\n assetFormat: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Kernel version that released it on the authoring server.' })\n kernelVersion?: string\n\n @Column({ nullable: true, ...longTextColumn() })\n @Field({ nullable: true, description: 'What the release measured, as JSON text.' })\n metrics?: string\n\n @Column({ nullable: true, ...longTextColumn() })\n @Field({ nullable: true, description: 'Top view of the release, as JSON text.' })\n topView?: string\n\n @Column({ nullable: true, ...longTextColumn() })\n @Field({ nullable: true, description: 'Contract changes against its previous release, as JSON text.' })\n changes?: string\n\n @Column({ default: false })\n @Field({ description: 'Derived: whether this server kernel reads the source.' })\n formatSupported: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Derived: kernel version that checked the source here.' })\n checkedKernel?: string\n\n @Column({ type: 'float', nullable: true })\n @Field(type => Float, { nullable: true, description: 'Derived: authored width (size.x) in mm. Null when unread.' })\n width?: number\n\n @Column({ type: 'float', nullable: true })\n @Field(type => Float, { nullable: true, description: 'Derived: authored depth (size.z) in mm. Null when unread.' })\n depth?: number\n\n @Column('simple-json', { nullable: true, default: null })\n @Field(type => [String], { nullable: true, description: 'Derived: the roles of the places the source declares (seat, grip), [] for none. Null when unread.' })\n capabilities?: string[]\n\n @Column('simple-json', { nullable: true, default: null })\n @Field(type => GraphQLJSON, { nullable: true, description: 'Derived: the extension properties the source carries, by key {owner}/{name} (ADR-0123). Null when none or unread.' })\n /* Not figure-model's recursive JSON type: TypeORM's deep partial of it does not end. */\n extensions?: Record<string, unknown>\n\n @Column('simple-json', { nullable: true, default: null })\n @Field(type => GraphQLJSON, { nullable: true, description: 'Files the release depends on: [{ hash, role, size, contentType }].' })\n dependencies?: FigureLibraryDependency[]\n\n @Column({ type: 'text', nullable: true })\n @Field({ nullable: true, description: 'The note the author left when releasing this version.' })\n comment?: string\n\n @Column({ default: false })\n @Field({ description: 'Retired at the authoring server.' })\n deprecated: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Full name to use instead of a retired figure.' })\n supersededBy?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Address of the figure server the package came from.' })\n sourceUrl?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Domain of the figure server the package came from.' })\n sourceDomain?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'File name of the package it was imported from.' })\n packageName?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'When the authoring server released it.' })\n releasedAt?: Date\n\n @CreateDateColumn()\n @Field({ nullable: true, description: 'Creation timestamp (when it was imported).' })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true, description: 'Last update timestamp.' })\n updatedAt?: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true, description: 'Soft-delete timestamp. Releases are not deleted.' })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'The user who imported it.' })\n creator?: User\n\n @RelationId((release: FigureLibraryRelease) => release.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'The user who last updated it.' })\n updater?: User\n\n @RelationId((release: FigureLibraryRelease) => release.updater)\n updaterId?: string\n}\n"]}
1
+ {"version":3,"file":"figure-library-release.js","sourceRoot":"","sources":["../../../server/service/figure-library-release/figure-library-release.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n DeleteDateColumn,\n Entity,\n Index,\n ManyToOne,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\nimport { Field, Float, ID, Int, ObjectType } from 'type-graphql'\nimport { GraphQLJSON } from 'graphql-scalars'\n\nimport { User } from '@things-factory/auth-base'\nimport { Domain, longTextColumn } from '@things-factory/shell'\n\n/** A file a release depends on, as its package listed it. */\nexport interface FigureLibraryDependency {\n hash: string\n role: string\n size: number\n contentType: string\n}\n\n/**\n * A released figure this board server imported (ADR-0114 결정 3).\n *\n * The release data is immutable: the server that authored it never changes a release, so a row is added once and never\n * rewritten from a package. `formatSupported` · `checkedKernel` · `width` · `depth` · `capabilities` · `extensions` are\n * derived, recomputed when this server's kernel is another version than the one that checked them.\n * Kept as columns so a list filters on them without reading every source. There is no delete path.\n */\n@Entity()\n@Index('ix_figure_library_release_1', (release: FigureLibraryRelease) => [release.domain, release.ref], {\n unique: true,\n where: '\"deleted_at\" IS NULL'\n})\n@Index('ix_figure_library_release_2', (release: FigureLibraryRelease) => [release.domain, release.namespace, release.type])\n@ObjectType({ description: 'A released figure imported into this board server, one row per release reference.' })\nexport class FigureLibraryRelease {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier.' })\n readonly id?: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain, { nullable: true, description: 'The domain that imported the release.' })\n domain?: Domain\n\n @RelationId((release: FigureLibraryRelease) => release.domain)\n domainId?: string\n\n @Column()\n @Field({ description: 'Display name of the figure at this release.' })\n name: string\n\n @Column({ type: 'text', nullable: true })\n @Field({ nullable: true, description: 'Description of the figure at this release.' })\n description?: string\n\n @Column()\n @Field({ description: 'Release reference {namespace}/{type}@{version}.' })\n ref: string\n\n @Column()\n @Field({ description: 'Namespace of the full name.' })\n namespace: string\n\n @Column()\n @Field({ description: 'Type of the full name.' })\n type: string\n\n @Column()\n @Field(type => Int, { description: 'Release version.' })\n version: number\n\n @Column('simple-json', { nullable: true, default: null })\n @Field(type => GraphQLJSON, { nullable: true, description: 'Display names by language.' })\n names?: Record<string, string>\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Category of the figure at this release.' })\n category?: string\n\n @Column({ ...longTextColumn() })\n @Field({ description: 'The released source, as the authoring server released it.' })\n source: string\n\n @Column({ length: 64 })\n @Field({ description: 'SHA-256 of the source. Same reference and hash is the same release.' })\n contentHash: string\n\n @Column()\n @Field({ description: 'The format the source declares (figure-asset-1).' })\n assetFormat: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Kernel version that released it on the authoring server.' })\n kernelVersion?: string\n\n @Column({ nullable: true, ...longTextColumn() })\n @Field({ nullable: true, description: 'What the release measured, as JSON text.' })\n metrics?: string\n\n @Column({ nullable: true, ...longTextColumn() })\n @Field({ nullable: true, description: 'Top view of the release, as JSON text.' })\n topView?: string\n\n @Column({ nullable: true, ...longTextColumn() })\n @Field({ nullable: true, description: 'Contract changes against its previous release, as JSON text.' })\n changes?: string\n\n @Column({ default: false })\n @Field({ description: 'Derived: whether this server kernel reads the source.' })\n formatSupported: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Derived: kernel version that checked the source here.' })\n checkedKernel?: string\n\n @Column({ type: 'float', nullable: true })\n @Field(type => Float, { nullable: true, description: 'Derived: authored width (size.x) in mm. Null when unread.' })\n width?: number\n\n @Column({ type: 'float', nullable: true })\n @Field(type => Float, { nullable: true, description: 'Derived: authored depth (size.z) in mm. Null when unread.' })\n depth?: number\n\n @Column('simple-json', { nullable: true, default: null })\n @Field(type => [String], { nullable: true, description: 'Derived: the roles of the places the source declares (seat, grip), [] for none. Null when unread.' })\n capabilities?: string[]\n\n @Column('simple-json', { nullable: true, default: null })\n @Field(type => GraphQLJSON, { nullable: true, description: 'Derived: the extension properties the source carries, by key {owner}/{name} (ADR-0123). Null when none or unread.' })\n /* Not figure-model's recursive JSON type: TypeORM's deep partial of it does not end. */\n extensions?: Record<string, unknown>\n\n @Column('simple-json', { nullable: true, default: null })\n @Field(type => GraphQLJSON, { nullable: true, description: 'Files the release depends on: [{ hash, role, size, contentType }].' })\n dependencies?: FigureLibraryDependency[]\n\n @Column({ type: 'text', nullable: true })\n @Field({ nullable: true, description: 'The note the author left when releasing this version.' })\n comment?: string\n\n @Column({ default: false })\n @Field({ description: 'Deprecated at the authoring server.' })\n deprecated: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Full name to use instead of a deprecated figure.' })\n supersededBy?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Address of the figure server the package came from.' })\n sourceUrl?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Domain of the figure server the package came from.' })\n sourceDomain?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'File name of the package it was imported from.' })\n packageName?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'When the authoring server released it.' })\n releasedAt?: Date\n\n @CreateDateColumn()\n @Field({ nullable: true, description: 'Creation timestamp (when it was imported).' })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true, description: 'Last update timestamp.' })\n updatedAt?: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true, description: 'Soft-delete timestamp. Releases are not deleted.' })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'The user who imported it.' })\n creator?: User\n\n @RelationId((release: FigureLibraryRelease) => release.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'The user who last updated it.' })\n updater?: User\n\n @RelationId((release: FigureLibraryRelease) => release.updater)\n updaterId?: string\n}\n"]}
@@ -18,4 +18,7 @@ export declare class FigureLibraryResolver {
18
18
  figureExtensions(key: string, context: ResolverContext): Promise<any>;
19
19
  importFigurePackage(file: FileUpload, context: ResolverContext): Promise<FigureImportResult>;
20
20
  chooseFigureRelease(name: string, releaseId: string, context: ResolverContext): Promise<FigureTypeMapEntry>;
21
+ archiveFigure(name: string, context: ResolverContext): Promise<FigureTypeMapEntry>;
22
+ markFigureItem(name: string, item: boolean, context: ResolverContext): Promise<FigureTypeMapEntry>;
23
+ unarchiveFigure(name: string, context: ResolverContext): Promise<FigureTypeMapEntry>;
21
24
  }
@@ -68,6 +68,8 @@ let FigureLibraryResolver = class FigureLibraryResolver {
68
68
  category: value('category'),
69
69
  capability: value('capability'),
70
70
  search: value('name'),
71
+ includeArchived: value('archived') === true || value('archived') === 'true',
72
+ onlyItems: value('item') === true || value('item') === 'true',
71
73
  page: params.pagination?.page,
72
74
  limit: params.pagination?.limit
73
75
  });
@@ -86,7 +88,8 @@ let FigureLibraryResolver = class FigureLibraryResolver {
86
88
  }
87
89
  async figureTypeMap(context) {
88
90
  const { domain } = context.state;
89
- return await (0, type_map_1.linesOf)((0, shell_1.getRepository)(figure_type_map_entry_1.FigureTypeMapEntry).manager, domain);
91
+ /* The tray reads this: an archived name is not offered (ADR-0114 결정 18). */
92
+ return await (0, type_map_1.inUseLinesOf)((0, shell_1.getRepository)(figure_type_map_entry_1.FigureTypeMapEntry).manager, domain);
90
93
  }
91
94
  async figureBoardRequirements(boardId, context) {
92
95
  const { domain } = context.state;
@@ -110,6 +113,18 @@ let FigureLibraryResolver = class FigureLibraryResolver {
110
113
  const { domain, user, tx } = context.state;
111
114
  return await (0, type_map_1.chooseRelease)(tx, domain, user, name, releaseId);
112
115
  }
116
+ async archiveFigure(name, context) {
117
+ const { domain, user, tx } = context.state;
118
+ return await (0, type_map_1.archiveFigure)(tx, domain, user, name);
119
+ }
120
+ async markFigureItem(name, item, context) {
121
+ const { domain, user, tx } = context.state;
122
+ return await (0, type_map_1.markFigureItem)(tx, domain, user, name, item);
123
+ }
124
+ async unarchiveFigure(name, context) {
125
+ const { domain, user, tx } = context.state;
126
+ return await (0, type_map_1.unarchiveFigure)(tx, domain, user, name);
127
+ }
113
128
  };
114
129
  exports.FigureLibraryResolver = FigureLibraryResolver;
115
130
  tslib_1.__decorate([
@@ -124,7 +139,7 @@ tslib_1.__decorate([
124
139
  tslib_1.__decorate([
125
140
  (0, type_graphql_1.Directive)('@privilege(category: "figure-library", privilege: "query", domainOwnerGranted: true)'),
126
141
  (0, type_graphql_1.Query)(returns => figure_library_types_1.FigureLibraryFigureList, {
127
- description: 'Imported figures, one per full name, with the release each draws with. Filters: category, capability ("-" for none), name (search).'
142
+ description: 'Imported figures, one per full name, with the release each draws with. Filters: category, capability ("-" for none), name (search), archived (true to include archived figures; left out by default), item (true for only the names drawn as items).'
128
143
  }),
129
144
  tslib_1.__param(0, (0, type_graphql_1.Args)()),
130
145
  tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
@@ -209,6 +224,37 @@ tslib_1.__decorate([
209
224
  tslib_1.__metadata("design:paramtypes", [String, String, Object]),
210
225
  tslib_1.__metadata("design:returntype", Promise)
211
226
  ], FigureLibraryResolver.prototype, "chooseFigureRelease", null);
227
+ tslib_1.__decorate([
228
+ (0, type_graphql_1.Directive)('@transaction'),
229
+ (0, type_graphql_1.Directive)('@privilege(category: "figure-library", privilege: "mutation", domainOwnerGranted: true)'),
230
+ (0, type_graphql_1.Mutation)(returns => figure_type_map_entry_1.FigureTypeMapEntry, { description: 'Archives a full figure name: out of the tray and the batch door, its releases kept. Refused while a board uses it.' }),
231
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('name', { description: 'Full figure name {namespace}/{type}.' })),
232
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
233
+ tslib_1.__metadata("design:type", Function),
234
+ tslib_1.__metadata("design:paramtypes", [String, Object]),
235
+ tslib_1.__metadata("design:returntype", Promise)
236
+ ], FigureLibraryResolver.prototype, "archiveFigure", null);
237
+ tslib_1.__decorate([
238
+ (0, type_graphql_1.Directive)('@transaction'),
239
+ (0, type_graphql_1.Directive)('@privilege(category: "figure-library", privilege: "mutation", domainOwnerGranted: true)'),
240
+ (0, type_graphql_1.Mutation)(returns => figure_type_map_entry_1.FigureTypeMapEntry, { description: 'Marks a full figure name as an item this domain draws (fmsim: a carrier), or takes the mark away.' }),
241
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('name', { description: 'Full figure name {namespace}/{type}.' })),
242
+ tslib_1.__param(1, (0, type_graphql_1.Arg)('item', { description: 'True to draw the name as an item, false to take the mark away.' })),
243
+ tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
244
+ tslib_1.__metadata("design:type", Function),
245
+ tslib_1.__metadata("design:paramtypes", [String, Boolean, Object]),
246
+ tslib_1.__metadata("design:returntype", Promise)
247
+ ], FigureLibraryResolver.prototype, "markFigureItem", null);
248
+ tslib_1.__decorate([
249
+ (0, type_graphql_1.Directive)('@transaction'),
250
+ (0, type_graphql_1.Directive)('@privilege(category: "figure-library", privilege: "mutation", domainOwnerGranted: true)'),
251
+ (0, type_graphql_1.Mutation)(returns => figure_type_map_entry_1.FigureTypeMapEntry, { description: 'Brings an archived full figure name back, drawing with the release its line kept.' }),
252
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('name', { description: 'Full figure name {namespace}/{type}.' })),
253
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
254
+ tslib_1.__metadata("design:type", Function),
255
+ tslib_1.__metadata("design:paramtypes", [String, Object]),
256
+ tslib_1.__metadata("design:returntype", Promise)
257
+ ], FigureLibraryResolver.prototype, "unarchiveFigure", null);
212
258
  exports.FigureLibraryResolver = FigureLibraryResolver = tslib_1.__decorate([
213
259
  (0, type_graphql_1.Resolver)(),
214
260
  (0, type_graphql_1.UseMiddleware)(shell_1.SpeakRefusals)
@@ -1 +1 @@
1
- {"version":3,"file":"figure-library-resolver.js","sourceRoot":"","sources":["../../server/service/figure-library-resolver.ts"],"names":[],"mappings":";;;;AAAA,+CAAkG;AAClG,qDAA6C;AAE7C,+FAA2D;AAE3D,iDAAmI;AAEnI,4FAAsF;AACtF,mFAA4E;AAC5E,iEAAmI;AACnI,+CAA6E;AAC7E,qDAAmD;AACnD,qDAAmD;AACnD,6CAAyE;AACzE,qDAAiE;AACjE,iDAA2D;AAE3D;;;GAGG;AACH,SAAS,WAAW,CAAC,OAAgB,EAAE,OAAY;IACjD,OAAO,OAAO,CAAC,CAAC;QACd,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAA,kBAAU,EAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC;QAClI,CAAC,CAAC,OAAO,CAAC,OAAO,CAAA;AACrB,CAAC;AAED,mDAAmD;AACnD,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAA;AAE1C,KAAK,UAAU,OAAO,CAAC,IAAgB;IACrC,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;QAClD,IAAI,IAAI,KAAK,CAAC,MAAM,CAAA;QACpB,IAAI,IAAI,GAAG,iBAAiB;YAAE,MAAM,IAAI,eAAO,CAAC,0BAA0B,EAAE,EAAE,GAAG,EAAE,iBAAiB,EAAE,EAAE,0CAA0C,CAAC,CAAA;QACnJ,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IACjC,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;AAC9B,CAAC;AAED;;;GAGG;AAGI,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAG1B,AAAN,KAAK,CAAC,qBAAqB,CAAS,MAAiB,EAAS,OAAwB;QACpF,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QACpC,MAAM,YAAY,GAAG,IAAA,qCAA6B,EAAC;YACjD,UAAU,EAAE,IAAA,qBAAa,EAAC,6CAAoB,EAAE,EAAE,CAAC;YACnD,MAAM;YACN,MAAM;YACN,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,CAAC;SACxD,CAAC,CAAA;QACF,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,YAAY,CAAC,eAAe,EAAE,CAAA;QAC3D,MAAM,OAAO,GAAG,EAAE,IAAI,IAAA,qBAAa,EAAC,6CAAoB,CAAC,CAAC,OAAO,CAAA;QACjE,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,MAAM,IAAA,oBAAO,EAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACtD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACzB,CAAC;IAMK,AAAN,KAAK,CAAC,oBAAoB,CAAS,MAAiB,EAAS,OAAwB;QACnF,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAChC,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,CAAA;YACzE,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,SAAS,CAAA;QAC7D,CAAC,CAAA;QACD,MAAM,OAAO,GAAG,IAAA,qBAAa,EAAC,0CAAkB,CAAC,CAAC,OAAO,CAAA;QACzD,MAAM,MAAM,GAAG,MAAM,IAAA,mBAAS,EAAC,OAAO,EAAE,MAAM,EAAE;YAC9C,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC;YAC3B,UAAU,EAAE,KAAK,CAAC,YAAY,CAAC;YAC/B,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACrB,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI;YAC7B,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK;SAChC,CAAC,CAAA;QACF,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAA,oBAAO,EAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;YACtD,MAAM,IAAA,oBAAO,EAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACrC,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAIK,AAAN,KAAK,CAAC,mBAAmB,CAAQ,OAAwB;QACvD,OAAO,MAAM,IAAA,wBAAc,EAAC,IAAA,qBAAa,EAAC,0CAAkB,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC9F,CAAC;IAIK,AAAN,KAAK,CAAC,uBAAuB,CAAc,IAAY,EAAS,OAAwB;QACtF,OAAO,MAAM,IAAA,wBAAc,EAAC,IAAA,qBAAa,EAAC,6CAAoB,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACtG,CAAC;IAIK,AAAN,KAAK,CAAC,aAAa,CAAQ,OAAwB;QACjD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAChC,OAAO,MAAM,IAAA,kBAAO,EAAC,IAAA,qBAAa,EAAC,0CAAkB,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACzE,CAAC;IAIK,AAAN,KAAK,CAAC,uBAAuB,CAAiB,OAAe,EAAS,OAAwB;QAC5F,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAChC,OAAO,MAAM,IAAA,8BAAiB,EAAC,IAAA,qBAAa,EAAC,0CAAkB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5F,CAAC;IAOK,AAAN,KAAK,CAAC,gBAAgB,CACmF,KAAe,EAC/G,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAChC,OAAO,MAAM,IAAA,yBAAY,EAAC,IAAA,qBAAa,EAAC,0CAAkB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;IAC/H,CAAC;IAOK,AAAN,KAAK,CAAC,gBAAgB,CACiE,GAAW,EACzF,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAChC,OAAO,MAAM,IAAA,yBAAY,EAAC,IAAA,qBAAa,EAAC,0CAAkB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;IACnF,CAAC;IAKK,AAAN,KAAK,CAAC,mBAAmB,CAAmC,IAAgB,EAAS,OAAwB;QAC3G,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAA;QACzB,IAAA,0BAAiB,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAClC,OAAO,MAAM,IAAA,4BAAmB,EAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC5F,CAAC;IAKK,AAAN,KAAK,CAAC,mBAAmB,CAC+C,IAAY,EACJ,SAAiB,EACxF,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,OAAO,MAAM,IAAA,wBAAa,EAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAA;IAC/D,CAAC;CACF,CAAA;AApHY,sDAAqB;AAG1B;IAFL,IAAA,wBAAS,EAAC,sFAAsF,CAAC;IACjG,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,+CAAwB,EAAE,EAAE,WAAW,EAAE,+CAA+C,EAAE,CAAC;IAChF,mBAAA,IAAA,mBAAI,GAAE,CAAA;IAAqB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAjB,iBAAS;;kEAapD;AAMK;IAJL,IAAA,wBAAS,EAAC,sFAAsF,CAAC;IACjG,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,8CAAuB,EAAE;QACzC,WAAW,EAAE,qIAAqI;KACnJ,CAAC;IAC0B,mBAAA,IAAA,mBAAI,GAAE,CAAA;IAAqB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAjB,iBAAS;;iEAmBnD;AAIK;IAFL,IAAA,wBAAS,EAAC,sFAAsF,CAAC;IACjG,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,0CAAmB,EAAE,EAAE,WAAW,EAAE,2DAA2D,EAAE,CAAC;IACzF,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;gEAE/B;AAIK;IAFL,IAAA,wBAAS,EAAC,sFAAsF,CAAC;IACjG,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,6CAAoB,CAAC,EAAE,EAAE,WAAW,EAAE,+DAA+D,EAAE,CAAC;IAC5F,mBAAA,IAAA,kBAAG,EAAC,MAAM,CAAC,CAAA;IAAgB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;oEAE9D;AAIK;IAFL,IAAA,wBAAS,EAAC,sFAAsF,CAAC;IACjG,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,0CAAkB,CAAC,EAAE,EAAE,WAAW,EAAE,6FAA6F,EAAE,CAAC;IAClI,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;0DAGzB;AAIK;IAFL,IAAA,wBAAS,EAAC,sFAAsF,CAAC;IACjG,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,6BAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,iFAAiF,EAAE,CAAC;IACnH,mBAAA,IAAA,kBAAG,EAAC,SAAS,CAAC,CAAA;IAAmB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;oEAGpE;AAOK;IALL,IAAA,wBAAS,EAAC,wFAAwF,CAAC;IACnG,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,6BAAW,EAAE;QAC7B,WAAW,EACT,uKAAuK;KAC1K,CAAC;IAEC,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,oDAAoD,EAAE,CAAC,CAAA;IACrG,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;6DAIP;AAOK;IALL,IAAA,wBAAS,EAAC,wFAAwF,CAAC;IACnG,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,6BAAW,EAAE;QAC7B,WAAW,EACT,oOAAoO;KACvO,CAAC;IAEC,mBAAA,IAAA,kBAAG,EAAC,KAAK,EAAE,EAAE,WAAW,EAAE,sDAAsD,EAAE,CAAC,CAAA;IACnF,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;6DAIP;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,yFAAyF,CAAC;IACpG,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,yCAAkB,EAAE,EAAE,WAAW,EAAE,oIAAoI,EAAE,CAAC;IACpK,mBAAA,IAAA,kBAAG,EAAC,MAAM,EAAE,GAAG,EAAE,CAAC,0BAAa,CAAC,CAAA;IAAoB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;gEAKnF;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,yFAAyF,CAAC;IACpG,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,0CAAkB,EAAE,EAAE,WAAW,EAAE,6DAA6D,EAAE,CAAC;IAErH,mBAAA,IAAA,kBAAG,EAAC,MAAM,EAAE,EAAE,WAAW,EAAE,sCAAsC,EAAE,CAAC,CAAA;IACpE,mBAAA,IAAA,kBAAG,EAAC,WAAW,EAAE,EAAE,WAAW,EAAE,yCAAyC,EAAE,CAAC,CAAA;IAC5E,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;gEAIP;gCAnHU,qBAAqB;IAFjC,IAAA,uBAAQ,GAAE;IACV,IAAA,4BAAa,EAAC,qBAAa,CAAC;GAChB,qBAAqB,CAoHjC","sourcesContent":["import { Arg, Args, Ctx, Directive, Mutation, Query, Resolver, UseMiddleware } from 'type-graphql'\nimport { GraphQLJSON } from 'graphql-scalars'\nimport type { FileUpload } from 'graphql-upload/GraphQLUpload.js'\nimport GraphQLUpload from 'graphql-upload/GraphQLUpload.js'\n\nimport { getQueryBuilderFromListParams, getRepository, ListParam, Refusal, refusalKey, SpeakRefusals } from '@things-factory/shell'\n\nimport { FigureLibraryRelease } from './figure-library-release/figure-library-release'\nimport { FigureTypeMapEntry } from './figure-type-map/figure-type-map-entry'\nimport { FigureImportResult, FigureLibraryFacets, FigureLibraryFigureList, FigureLibraryReleaseList } from './figure-library-types'\nimport { figureFacetsOf, figuresOf, releasesOfName } from './library/figures'\nimport { blueprintsOf } from './library/blueprints'\nimport { extensionsOf } from './library/extensions'\nimport { assertPackageName, importFigurePackage } from './library/import'\nimport { boardRequirements, freshen } from './library/inspection'\nimport { chooseRelease, linesOf } from './library/type-map'\n\n/**\n * A refusal in the asker's language as plain text: a board draws it on a canvas, not into HTML, so the values in it\n * (a name with `/`) are not escaped.\n */\nfunction plainTextOf(refusal: Refusal, context: any): string {\n return context.t\n ? context.t(refusalKey(refusal.code), { ...refusal.params, defaultValue: refusal.message, interpolation: { escapeValue: false } })\n : refusal.message\n}\n\n/** The most bytes one package upload may carry. */\nconst PACKAGE_MAX_BYTES = 64 * 1024 * 1024\n\nasync function bytesOf(file: FileUpload): Promise<Buffer> {\n const chunks: Buffer[] = []\n let size = 0\n for await (const chunk of file.createReadStream()) {\n size += chunk.length\n if (size > PACKAGE_MAX_BYTES) throw new Refusal('figure-package-too-large', { max: PACKAGE_MAX_BYTES }, 'a figure package is at most {max} bytes.')\n chunks.push(Buffer.from(chunk))\n }\n return Buffer.concat(chunks)\n}\n\n/**\n * The library and the type map of a board server (ADR-0114). Reading is `figure-library` query; changing is its\n * mutation. Boards ask `figureBlueprints` under `figure-published`, the door every figure consumer asks through.\n */\n@Resolver()\n@UseMiddleware(SpeakRefusals)\nexport class FigureLibraryResolver {\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => FigureLibraryReleaseList, { description: 'Lists the releases imported into this domain.' })\n async figureLibraryReleases(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<FigureLibraryReleaseList> {\n const { domain, tx } = context.state\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(FigureLibraryRelease, tx),\n params,\n domain,\n alias: 'release',\n searchables: ['ref', 'name', 'description', 'category']\n })\n const [items, total] = await queryBuilder.getManyAndCount()\n const manager = tx ?? getRepository(FigureLibraryRelease).manager\n for (const item of items) await freshen(manager, item)\n return { items, total }\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => FigureLibraryFigureList, {\n description: 'Imported figures, one per full name, with the release each draws with. Filters: category, capability (\"-\" for none), name (search).'\n })\n async figureLibraryFigures(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<FigureLibraryFigureList> {\n const { domain } = context.state\n const value = (name: string) => {\n const found = params.filters?.find(filter => filter.name === name)?.value\n return Array.isArray(found) ? found[0] : found ?? undefined\n }\n const manager = getRepository(FigureTypeMapEntry).manager\n const result = await figuresOf(manager, domain, {\n category: value('category'),\n capability: value('capability'),\n search: value('name'),\n page: params.pagination?.page,\n limit: params.pagination?.limit\n })\n for (const item of result.items) {\n if (item.release) await freshen(manager, item.release)\n await freshen(manager, item.latest)\n }\n return result\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => FigureLibraryFacets, { description: 'The categories and capabilities the figure filters offer.' })\n async figureLibraryFacets(@Ctx() context: ResolverContext): Promise<FigureLibraryFacets> {\n return await figureFacetsOf(getRepository(FigureTypeMapEntry).manager, context.state.domain)\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => [FigureLibraryRelease], { description: 'Every imported release of one full figure name, newest first.' })\n async figureLibraryReleasesOf(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<FigureLibraryRelease[]> {\n return await releasesOfName(getRepository(FigureLibraryRelease).manager, context.state.domain, name)\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => [FigureTypeMapEntry], { description: 'The type map of this domain: one line per full figure name, with the release it draws with.' })\n async figureTypeMap(@Ctx() context: ResolverContext): Promise<FigureTypeMapEntry[]> {\n const { domain } = context.state\n return await linesOf(getRepository(FigureTypeMapEntry).manager, domain)\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => GraphQLJSON, { nullable: true, description: 'What one board needs from the type map: each figure, its status and node count.' })\n async figureBoardRequirements(@Arg('boardId') boardId: string, @Ctx() context: ResolverContext): Promise<any> {\n const { domain } = context.state\n return await boardRequirements(getRepository(FigureTypeMapEntry).manager, domain, boardId)\n }\n\n @Directive('@privilege(category: \"figure-published\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => GraphQLJSON, {\n description:\n 'Figures a board asks for together by full name {namespace}/{type}, answered from the type map: { items: [{ type, ref, asset }], refused: [{ type, code, message }] }.'\n })\n async figureBlueprints(\n @Arg('types', type => [String], { description: 'Full figure names {namespace}/{type}. At most 500.' }) types: string[],\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const { domain } = context.state\n return await blueprintsOf(getRepository(FigureTypeMapEntry).manager, domain, types, refusal => plainTextOf(refusal, context))\n }\n\n @Directive('@privilege(category: \"figure-published\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => GraphQLJSON, {\n description:\n 'The type map lines whose release carries one extension key (ADR-0123): { items: [{ name, ref, value }], unread: [{ name, ref }] }. name is the canonical name a board draws by; unread lines are releases this server cannot read.'\n })\n async figureExtensions(\n @Arg('key', { description: 'An extension key {owner}/{name}, e.g. fmsim/carrier.' }) key: string,\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const { domain } = context.state\n return await extensionsOf(getRepository(FigureTypeMapEntry).manager, domain, key)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"figure-library\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FigureImportResult, { description: 'Imports a figure package into this domain library. A release newer than the one its name draws with becomes the one it draws with.' })\n async importFigurePackage(@Arg('file', () => GraphQLUpload) file: FileUpload, @Ctx() context: ResolverContext): Promise<FigureImportResult> {\n const { domain, user, tx } = context.state\n const upload = await file\n assertPackageName(upload.filename)\n return await importFigurePackage(tx, domain, user, await bytesOf(upload), upload.filename)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"figure-library\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FigureTypeMapEntry, { description: 'Chooses the imported release a full figure name draws with.' })\n async chooseFigureRelease(\n @Arg('name', { description: 'Full figure name {namespace}/{type}.' }) name: string,\n @Arg('releaseId', { description: 'Id of an imported release of that name.' }) releaseId: string,\n @Ctx() context: ResolverContext\n ): Promise<FigureTypeMapEntry> {\n const { domain, user, tx } = context.state\n return await chooseRelease(tx, domain, user, name, releaseId)\n }\n}\n"]}
1
+ {"version":3,"file":"figure-library-resolver.js","sourceRoot":"","sources":["../../server/service/figure-library-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, Mutation, Query, Resolver, UseMiddleware } from 'type-graphql'\nimport { GraphQLJSON } from 'graphql-scalars'\nimport type { FileUpload } from 'graphql-upload/GraphQLUpload.js'\nimport GraphQLUpload from 'graphql-upload/GraphQLUpload.js'\n\nimport { getQueryBuilderFromListParams, getRepository, ListParam, Refusal, refusalKey, SpeakRefusals } from '@things-factory/shell'\n\nimport { FigureLibraryRelease } from './figure-library-release/figure-library-release'\nimport { FigureTypeMapEntry } from './figure-type-map/figure-type-map-entry'\nimport { FigureImportResult, FigureLibraryFacets, FigureLibraryFigureList, FigureLibraryReleaseList } from './figure-library-types'\nimport { figureFacetsOf, figuresOf, releasesOfName } from './library/figures'\nimport { blueprintsOf } from './library/blueprints'\nimport { extensionsOf } from './library/extensions'\nimport { assertPackageName, importFigurePackage } from './library/import'\nimport { boardRequirements, freshen } from './library/inspection'\nimport { chooseRelease, inUseLinesOf, unarchiveFigure, archiveFigure, markFigureItem } from './library/type-map'\n\n/**\n * A refusal in the asker's language as plain text: a board draws it on a canvas, not into HTML, so the values in it\n * (a name with `/`) are not escaped.\n */\nfunction plainTextOf(refusal: Refusal, context: any): string {\n return context.t\n ? context.t(refusalKey(refusal.code), { ...refusal.params, defaultValue: refusal.message, interpolation: { escapeValue: false } })\n : refusal.message\n}\n\n/** The most bytes one package upload may carry. */\nconst PACKAGE_MAX_BYTES = 64 * 1024 * 1024\n\nasync function bytesOf(file: FileUpload): Promise<Buffer> {\n const chunks: Buffer[] = []\n let size = 0\n for await (const chunk of file.createReadStream()) {\n size += chunk.length\n if (size > PACKAGE_MAX_BYTES) throw new Refusal('figure-package-too-large', { max: PACKAGE_MAX_BYTES }, 'a figure package is at most {max} bytes.')\n chunks.push(Buffer.from(chunk))\n }\n return Buffer.concat(chunks)\n}\n\n/**\n * The library and the type map of a board server (ADR-0114). Reading is `figure-library` query; changing is its\n * mutation. Boards ask `figureBlueprints` under `figure-published`, the door every figure consumer asks through.\n */\n@Resolver()\n@UseMiddleware(SpeakRefusals)\nexport class FigureLibraryResolver {\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => FigureLibraryReleaseList, { description: 'Lists the releases imported into this domain.' })\n async figureLibraryReleases(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<FigureLibraryReleaseList> {\n const { domain, tx } = context.state\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(FigureLibraryRelease, tx),\n params,\n domain,\n alias: 'release',\n searchables: ['ref', 'name', 'description', 'category']\n })\n const [items, total] = await queryBuilder.getManyAndCount()\n const manager = tx ?? getRepository(FigureLibraryRelease).manager\n for (const item of items) await freshen(manager, item)\n return { items, total }\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => FigureLibraryFigureList, {\n description: 'Imported figures, one per full name, with the release each draws with. Filters: category, capability (\"-\" for none), name (search), archived (true to include archived figures; left out by default), item (true for only the names drawn as items).'\n })\n async figureLibraryFigures(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<FigureLibraryFigureList> {\n const { domain } = context.state\n const value = (name: string) => {\n const found = params.filters?.find(filter => filter.name === name)?.value\n return Array.isArray(found) ? found[0] : found ?? undefined\n }\n const manager = getRepository(FigureTypeMapEntry).manager\n const result = await figuresOf(manager, domain, {\n category: value('category'),\n capability: value('capability'),\n search: value('name'),\n includeArchived: value('archived') === true || value('archived') === 'true',\n onlyItems: value('item') === true || value('item') === 'true',\n page: params.pagination?.page,\n limit: params.pagination?.limit\n })\n for (const item of result.items) {\n if (item.release) await freshen(manager, item.release)\n await freshen(manager, item.latest)\n }\n return result\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => FigureLibraryFacets, { description: 'The categories and capabilities the figure filters offer.' })\n async figureLibraryFacets(@Ctx() context: ResolverContext): Promise<FigureLibraryFacets> {\n return await figureFacetsOf(getRepository(FigureTypeMapEntry).manager, context.state.domain)\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => [FigureLibraryRelease], { description: 'Every imported release of one full figure name, newest first.' })\n async figureLibraryReleasesOf(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<FigureLibraryRelease[]> {\n return await releasesOfName(getRepository(FigureLibraryRelease).manager, context.state.domain, name)\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => [FigureTypeMapEntry], { description: 'The type map of this domain: one line per full figure name, with the release it draws with.' })\n async figureTypeMap(@Ctx() context: ResolverContext): Promise<FigureTypeMapEntry[]> {\n const { domain } = context.state\n /* The tray reads this: an archived name is not offered (ADR-0114 결정 18). */\n return await inUseLinesOf(getRepository(FigureTypeMapEntry).manager, domain)\n }\n\n @Directive('@privilege(category: \"figure-library\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => GraphQLJSON, { nullable: true, description: 'What one board needs from the type map: each figure, its status and node count.' })\n async figureBoardRequirements(@Arg('boardId') boardId: string, @Ctx() context: ResolverContext): Promise<any> {\n const { domain } = context.state\n return await boardRequirements(getRepository(FigureTypeMapEntry).manager, domain, boardId)\n }\n\n @Directive('@privilege(category: \"figure-published\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => GraphQLJSON, {\n description:\n 'Figures a board asks for together by full name {namespace}/{type}, answered from the type map: { items: [{ type, ref, asset }], refused: [{ type, code, message }] }.'\n })\n async figureBlueprints(\n @Arg('types', type => [String], { description: 'Full figure names {namespace}/{type}. At most 500.' }) types: string[],\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const { domain } = context.state\n return await blueprintsOf(getRepository(FigureTypeMapEntry).manager, domain, types, refusal => plainTextOf(refusal, context))\n }\n\n @Directive('@privilege(category: \"figure-published\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => GraphQLJSON, {\n description:\n 'The type map lines whose release carries one extension key (ADR-0123): { items: [{ name, ref, value }], unread: [{ name, ref }] }. name is the canonical name a board draws by; unread lines are releases this server cannot read.'\n })\n async figureExtensions(\n @Arg('key', { description: 'An extension key {owner}/{name}, e.g. fmsim/carrier.' }) key: string,\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const { domain } = context.state\n return await extensionsOf(getRepository(FigureTypeMapEntry).manager, domain, key)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"figure-library\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FigureImportResult, { description: 'Imports a figure package into this domain library. A release newer than the one its name draws with becomes the one it draws with.' })\n async importFigurePackage(@Arg('file', () => GraphQLUpload) file: FileUpload, @Ctx() context: ResolverContext): Promise<FigureImportResult> {\n const { domain, user, tx } = context.state\n const upload = await file\n assertPackageName(upload.filename)\n return await importFigurePackage(tx, domain, user, await bytesOf(upload), upload.filename)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"figure-library\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FigureTypeMapEntry, { description: 'Chooses the imported release a full figure name draws with.' })\n async chooseFigureRelease(\n @Arg('name', { description: 'Full figure name {namespace}/{type}.' }) name: string,\n @Arg('releaseId', { description: 'Id of an imported release of that name.' }) releaseId: string,\n @Ctx() context: ResolverContext\n ): Promise<FigureTypeMapEntry> {\n const { domain, user, tx } = context.state\n return await chooseRelease(tx, domain, user, name, releaseId)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"figure-library\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FigureTypeMapEntry, { description: 'Archives a full figure name: out of the tray and the batch door, its releases kept. Refused while a board uses it.' })\n async archiveFigure(@Arg('name', { description: 'Full figure name {namespace}/{type}.' }) name: string, @Ctx() context: ResolverContext): Promise<FigureTypeMapEntry> {\n const { domain, user, tx } = context.state\n return await archiveFigure(tx, domain, user, name)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"figure-library\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FigureTypeMapEntry, { description: 'Marks a full figure name as an item this domain draws (fmsim: a carrier), or takes the mark away.' })\n async markFigureItem(\n @Arg('name', { description: 'Full figure name {namespace}/{type}.' }) name: string,\n @Arg('item', { description: 'True to draw the name as an item, false to take the mark away.' }) item: boolean,\n @Ctx() context: ResolverContext\n ): Promise<FigureTypeMapEntry> {\n const { domain, user, tx } = context.state\n return await markFigureItem(tx, domain, user, name, item)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"figure-library\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => FigureTypeMapEntry, { description: 'Brings an archived full figure name back, drawing with the release its line kept.' })\n async unarchiveFigure(@Arg('name', { description: 'Full figure name {namespace}/{type}.' }) name: string, @Ctx() context: ResolverContext): Promise<FigureTypeMapEntry> {\n const { domain, user, tx } = context.state\n return await unarchiveFigure(tx, domain, user, name)\n }\n}\n"]}
@@ -23,6 +23,8 @@ export declare class FigureLibraryFigure {
23
23
  latest: FigureLibraryRelease;
24
24
  latestVersion: number;
25
25
  releaseCount: number;
26
+ archivedAt?: Date | null;
27
+ item: boolean;
26
28
  }
27
29
  export declare class FigureLibraryFigureList {
28
30
  items: FigureLibraryFigure[];
@@ -91,6 +91,14 @@ tslib_1.__decorate([
91
91
  (0, type_graphql_1.Field)(type => type_graphql_1.Int, { description: 'How many releases of this name are imported.' }),
92
92
  tslib_1.__metadata("design:type", Number)
93
93
  ], FigureLibraryFigure.prototype, "releaseCount", void 0);
94
+ tslib_1.__decorate([
95
+ (0, type_graphql_1.Field)({ nullable: true, description: 'When the name was archived; null while in use.' }),
96
+ tslib_1.__metadata("design:type", Date)
97
+ ], FigureLibraryFigure.prototype, "archivedAt", void 0);
98
+ tslib_1.__decorate([
99
+ (0, type_graphql_1.Field)({ description: 'Whether this domain draws the name as an item a holder holds (fmsim: a carrier).' }),
100
+ tslib_1.__metadata("design:type", Boolean)
101
+ ], FigureLibraryFigure.prototype, "item", void 0);
94
102
  exports.FigureLibraryFigure = FigureLibraryFigure = tslib_1.__decorate([
95
103
  (0, type_graphql_1.ObjectType)({ description: 'An imported figure: its full name, the release it draws with, its latest version and how many releases are imported.' })
96
104
  ], FigureLibraryFigure);
@@ -1 +1 @@
1
- {"version":3,"file":"figure-library-types.js","sourceRoot":"","sources":["../../server/service/figure-library-types.ts"],"names":[],"mappings":"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","sourcesContent":["import { Field, Int, ObjectType } from 'type-graphql'\n\nimport { FigureLibraryRelease } from './figure-library-release/figure-library-release'\n\n@ObjectType({ description: 'A page of imported releases.' })\nexport class FigureLibraryReleaseList {\n @Field(type => [FigureLibraryRelease], { description: 'The releases on this page.' })\n items: FigureLibraryRelease[]\n\n @Field(type => Int, { description: 'Total number of releases matching the query.' })\n total: number\n}\n\n@ObjectType({ description: 'What became of one release of an imported package.' })\nexport class FigureImportOutcome {\n @Field({ description: 'Release reference {namespace}/{type}@{version}.' })\n ref: string\n\n @Field({ description: 'added, skipped or refused.' })\n outcome: string\n\n @Field({ nullable: true, description: 'Why it was refused, or skipped-metadata-differs.' })\n code?: string\n\n @Field(type => [String], { nullable: true, description: 'For a skipped release: the fields the package gave differently.' })\n differs?: string[]\n}\n\n@ObjectType({ description: 'A fault that refused a whole package.' })\nexport class FigureImportProblem {\n @Field({ description: 'What is wrong with the package.' })\n code: string\n\n @Field({ nullable: true, description: 'The file inside the package it concerns.' })\n path?: string\n}\n\n@ObjectType({ description: 'The result of importing a figure package.' })\nexport class FigureImportResult {\n @Field(type => [FigureImportProblem], { description: 'Faults that refused the whole package; nothing was imported when there is one.' })\n problems: FigureImportProblem[]\n\n @Field(type => [FigureImportOutcome], { description: 'What became of each release.' })\n outcomes: FigureImportOutcome[]\n}\n\n@ObjectType({ description: 'An imported figure: its full name, the release it draws with, its latest version and how many releases are imported.' })\nexport class FigureLibraryFigure {\n @Field({ description: 'Full figure name {namespace}/{type}.' })\n name: string\n\n @Field(type => FigureLibraryRelease, { nullable: true, description: 'The release this name draws with; null when none of its releases can be drawn here.' })\n release: FigureLibraryRelease | null\n\n @Field(type => FigureLibraryRelease, { description: 'The newest release imported of this name, drawable or not.' })\n latest: FigureLibraryRelease\n\n @Field(type => Int, { description: 'The newest version imported of this name.' })\n latestVersion: number\n\n @Field(type => Int, { description: 'How many releases of this name are imported.' })\n releaseCount: number\n}\n\n@ObjectType({ description: 'A page of imported figures.' })\nexport class FigureLibraryFigureList {\n @Field(type => [FigureLibraryFigure], { description: 'The figures on this page.' })\n items: FigureLibraryFigure[]\n\n @Field(type => Int, { description: 'Total number of figures matching the query.' })\n total: number\n}\n\n@ObjectType({ description: 'What the figure filters offer.' })\nexport class FigureLibraryFacets {\n @Field(type => [String], { description: 'Categories of the releases that draw.' })\n categories: string[]\n\n @Field({ description: 'Whether a release that draws has no category.' })\n uncategorized: boolean\n\n @Field(type => [String], { description: 'Place roles (seat, grip) the releases that draw declare.' })\n capabilities: string[]\n\n @Field({ description: 'Whether a release that draws declares no place.' })\n incapable: boolean\n}\n"]}
1
+ {"version":3,"file":"figure-library-types.js","sourceRoot":"","sources":["../../server/service/figure-library-types.ts"],"names":[],"mappings":"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","sourcesContent":["import { Field, Int, ObjectType } from 'type-graphql'\n\nimport { FigureLibraryRelease } from './figure-library-release/figure-library-release'\n\n@ObjectType({ description: 'A page of imported releases.' })\nexport class FigureLibraryReleaseList {\n @Field(type => [FigureLibraryRelease], { description: 'The releases on this page.' })\n items: FigureLibraryRelease[]\n\n @Field(type => Int, { description: 'Total number of releases matching the query.' })\n total: number\n}\n\n@ObjectType({ description: 'What became of one release of an imported package.' })\nexport class FigureImportOutcome {\n @Field({ description: 'Release reference {namespace}/{type}@{version}.' })\n ref: string\n\n @Field({ description: 'added, skipped or refused.' })\n outcome: string\n\n @Field({ nullable: true, description: 'Why it was refused, or skipped-metadata-differs.' })\n code?: string\n\n @Field(type => [String], { nullable: true, description: 'For a skipped release: the fields the package gave differently.' })\n differs?: string[]\n}\n\n@ObjectType({ description: 'A fault that refused a whole package.' })\nexport class FigureImportProblem {\n @Field({ description: 'What is wrong with the package.' })\n code: string\n\n @Field({ nullable: true, description: 'The file inside the package it concerns.' })\n path?: string\n}\n\n@ObjectType({ description: 'The result of importing a figure package.' })\nexport class FigureImportResult {\n @Field(type => [FigureImportProblem], { description: 'Faults that refused the whole package; nothing was imported when there is one.' })\n problems: FigureImportProblem[]\n\n @Field(type => [FigureImportOutcome], { description: 'What became of each release.' })\n outcomes: FigureImportOutcome[]\n}\n\n@ObjectType({ description: 'An imported figure: its full name, the release it draws with, its latest version and how many releases are imported.' })\nexport class FigureLibraryFigure {\n @Field({ description: 'Full figure name {namespace}/{type}.' })\n name: string\n\n @Field(type => FigureLibraryRelease, { nullable: true, description: 'The release this name draws with; null when none of its releases can be drawn here.' })\n release: FigureLibraryRelease | null\n\n @Field(type => FigureLibraryRelease, { description: 'The newest release imported of this name, drawable or not.' })\n latest: FigureLibraryRelease\n\n @Field(type => Int, { description: 'The newest version imported of this name.' })\n latestVersion: number\n\n @Field(type => Int, { description: 'How many releases of this name are imported.' })\n releaseCount: number\n\n @Field({ nullable: true, description: 'When the name was archived; null while in use.' })\n archivedAt?: Date | null\n\n @Field({ description: 'Whether this domain draws the name as an item a holder holds (fmsim: a carrier).' })\n item: boolean\n}\n\n@ObjectType({ description: 'A page of imported figures.' })\nexport class FigureLibraryFigureList {\n @Field(type => [FigureLibraryFigure], { description: 'The figures on this page.' })\n items: FigureLibraryFigure[]\n\n @Field(type => Int, { description: 'Total number of figures matching the query.' })\n total: number\n}\n\n@ObjectType({ description: 'What the figure filters offer.' })\nexport class FigureLibraryFacets {\n @Field(type => [String], { description: 'Categories of the releases that draw.' })\n categories: string[]\n\n @Field({ description: 'Whether a release that draws has no category.' })\n uncategorized: boolean\n\n @Field(type => [String], { description: 'Place roles (seat, grip) the releases that draw declare.' })\n capabilities: string[]\n\n @Field({ description: 'Whether a release that draws declares no place.' })\n incapable: boolean\n}\n"]}