@things-factory/figure-ui 10.1.241 → 10.1.244

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 (63) hide show
  1. package/client/graphql/store.ts +3 -2
  2. package/client/modeller/editor.ts +63 -5
  3. package/client/modeller/figure-parts.ts +18 -3
  4. package/client/modeller/figure-preview.ts +1 -1
  5. package/client/modeller/figure-properties.ts +14 -7
  6. package/client/modeller/figure-save-conflict.ts +73 -0
  7. package/client/modeller/figure-section-editor.ts +3 -0
  8. package/client/modeller/keys.ts +8 -2
  9. package/client/modeller/modeller-keys.ts +4 -1
  10. package/client/modeller/product-session.ts +107 -5
  11. package/client/modeller/save-conflict.ts +91 -0
  12. package/client/pages/figure-modeller-page.ts +58 -43
  13. package/dist-client/graphql/store.js +3 -2
  14. package/dist-client/graphql/store.js.map +1 -1
  15. package/dist-client/modeller/editor.d.ts +14 -0
  16. package/dist-client/modeller/editor.js +75 -5
  17. package/dist-client/modeller/editor.js.map +1 -1
  18. package/dist-client/modeller/figure-parts.js +18 -3
  19. package/dist-client/modeller/figure-parts.js.map +1 -1
  20. package/dist-client/modeller/figure-preview.d.ts +1 -1
  21. package/dist-client/modeller/figure-preview.js.map +1 -1
  22. package/dist-client/modeller/figure-properties.d.ts +4 -2
  23. package/dist-client/modeller/figure-properties.js +16 -7
  24. package/dist-client/modeller/figure-properties.js.map +1 -1
  25. package/dist-client/modeller/figure-save-conflict.d.ts +19 -0
  26. package/dist-client/modeller/figure-save-conflict.js +76 -0
  27. package/dist-client/modeller/figure-save-conflict.js.map +1 -0
  28. package/dist-client/modeller/figure-section-editor.d.ts +2 -0
  29. package/dist-client/modeller/figure-section-editor.js +8 -0
  30. package/dist-client/modeller/figure-section-editor.js.map +1 -1
  31. package/dist-client/modeller/keys.d.ts +5 -0
  32. package/dist-client/modeller/keys.js +5 -3
  33. package/dist-client/modeller/keys.js.map +1 -1
  34. package/dist-client/modeller/modeller-keys.d.ts +2 -0
  35. package/dist-client/modeller/modeller-keys.js +2 -1
  36. package/dist-client/modeller/modeller-keys.js.map +1 -1
  37. package/dist-client/modeller/product-session.d.ts +368 -22
  38. package/dist-client/modeller/product-session.js +107 -7
  39. package/dist-client/modeller/product-session.js.map +1 -1
  40. package/dist-client/modeller/save-conflict.d.ts +12 -0
  41. package/dist-client/modeller/save-conflict.js +63 -0
  42. package/dist-client/modeller/save-conflict.js.map +1 -0
  43. package/dist-client/pages/figure-modeller-page.d.ts +11 -5
  44. package/dist-client/pages/figure-modeller-page.js +58 -49
  45. package/dist-client/pages/figure-modeller-page.js.map +1 -1
  46. package/dist-client/tsconfig.tsbuildinfo +1 -1
  47. package/package.json +5 -5
  48. package/test/browser/category-page.js +3 -1
  49. package/test/browser/category.check.mjs +6 -0
  50. package/test/browser/product-page.check.mjs +268 -6
  51. package/test/browser/product-page.js +4 -1
  52. package/test/browser/screen.check.mjs +3 -0
  53. package/test/browser/section.check.mjs +21 -0
  54. package/test/keys.test.ts +8 -0
  55. package/test/product-session.test.ts +137 -1
  56. package/test/save-conflict.test.ts +41 -0
  57. package/test/save-landed.test.ts +75 -0
  58. package/translations/en.json +12 -1
  59. package/translations/es.json +12 -1
  60. package/translations/ja.json +12 -1
  61. package/translations/ko.json +12 -1
  62. package/translations/ms.json +12 -1
  63. package/translations/zh.json +12 -1
@@ -22,8 +22,8 @@ const PLACEMENTS = ['floor', 'ceiling', 'center', 'wall'];
22
22
  * Two kinds of change leave this tab, and it does neither itself:
23
23
  * - `command` carries an authoring command (rename, where it stands, taking the mounting face off). The page runs
24
24
  * it through the session, so it is one step of the same undo history as every other edit, and is saved with it.
25
- * - `catalog` carries a change to the row (category, tags). Those are not in the asset; the page writes them
26
- * to the saved row at once, so they need a saved figure.
25
+ * - `catalog` carries a change to the row (category, tags). Those are not in the asset; the page holds them and
26
+ * 「저장」 writes them to the saved row with the figure, so they need a saved figure. They are not undone.
27
27
  */
28
28
  let FigureProperties = class FigureProperties extends localize(i18next)(LitElement) {
29
29
  constructor() {
@@ -100,8 +100,9 @@ let FigureProperties = class FigureProperties extends localize(i18next)(LitEleme
100
100
  renderName(facts) {
101
101
  return html `
102
102
  <div field>
103
- <label>${i18next.t('figure.label.name')}</label>
103
+ <label for="figure-name">${i18next.t('figure.label.name')}</label>
104
104
  <input
105
+ id="figure-name"
105
106
  .value=${facts.name}
106
107
  placeholder=${i18next.t('figure.text.figure-display-name')}
107
108
  @change=${(event) => {
@@ -126,8 +127,9 @@ let FigureProperties = class FigureProperties extends localize(i18next)(LitEleme
126
127
  const current = facts.placement ?? 'floor';
127
128
  return html `
128
129
  <div field>
129
- <label>${i18next.t('figure.label.figure-placement')}</label>
130
+ <label for="figure-placement">${i18next.t('figure.label.figure-placement')}</label>
130
131
  <select
132
+ id="figure-placement"
131
133
  .value=${live(current)}
132
134
  @change=${(event) => {
133
135
  const select = event.target;
@@ -190,17 +192,19 @@ let FigureProperties = class FigureProperties extends localize(i18next)(LitEleme
190
192
  const saved = !!this.figureId;
191
193
  return html `
192
194
  <div field>
193
- <label>${i18next.t('figure.label.category')}</label>
195
+ <label for="figure-category">${i18next.t('figure.label.category')}</label>
194
196
  ${this.figureCategories?.length
195
197
  ? html `<select
198
+ id="figure-category"
196
199
  category
197
- ?disabled=${!saved || !!this.figureCategory}
200
+ ?disabled=${!saved || !!this.figureCategorySaved}
198
201
  @change=${(e) => this.catalog({ category: e.target.value })}
199
202
  >
200
203
  ${this.figureCategory ? nothing : html `<option value="" selected disabled>${i18next.t('figure.text.category-choose')}</option>`}
201
204
  ${this.figureCategories.map(code => html `<option value=${code} ?selected=${code === this.figureCategory}>${code}</option>`)}
202
205
  </select>`
203
206
  : html `<input
207
+ id="figure-category"
204
208
  .value=${this.figureCategory ?? ''}
205
209
  ?disabled=${!saved}
206
210
  placeholder=${i18next.t('figure.text.category-placeholder')}
@@ -208,8 +212,9 @@ let FigureProperties = class FigureProperties extends localize(i18next)(LitEleme
208
212
  />`}
209
213
  </div>
210
214
  <div field>
211
- <label>${i18next.t('figure.label.tags')}</label>
215
+ <label for="figure-tags">${i18next.t('figure.label.tags')}</label>
212
216
  <input
217
+ id="figure-tags"
213
218
  .value=${(this.figureTags ?? []).join(', ')}
214
219
  ?disabled=${!saved}
215
220
  placeholder=${i18next.t('figure.text.tags-placeholder')}
@@ -242,6 +247,10 @@ __decorate([
242
247
  property({ attribute: false }),
243
248
  __metadata("design:type", Object)
244
249
  ], FigureProperties.prototype, "figureCategories", void 0);
250
+ __decorate([
251
+ property({ type: String }),
252
+ __metadata("design:type", String)
253
+ ], FigureProperties.prototype, "figureCategorySaved", void 0);
245
254
  __decorate([
246
255
  property({ type: Array }),
247
256
  __metadata("design:type", Array)
@@ -1 +1 @@
1
- {"version":3,"file":"figure-properties.js","sourceRoot":"","sources":["../../client/modeller/figure-properties.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { live } from 'lit/directives/live.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport type { FigureAuthoringAction } from '@hatiolab/figure-model'\n\nimport { tagsOf, figureFigureFacts, type Placement, type FigureFigureFacts } from './figure-facts.js'\nimport type { FigureRevision } from './revision.js'\nimport { figurePropertySections } from './property-sections.js'\nimport { SidePanelStyles } from '@things-factory/figure-viewer/dist-client/side-panel-styles.js'\nimport { ScrollbarStyles } from '@operato/styles'\n\nconst PLACEMENTS: Placement[] = ['floor', 'ceiling', 'center', 'wall']\n\n/**\n * 속성 — the modeller's figure properties.\n *\n * The tab opens with what the figure is: its name, where it stands, where the catalogue files it.\n *\n * Nothing here is set up before work can go on (user 2026-10-18, after a walk without it). The room the figure\n * takes up is declared where release asks for it, from the parts -- the bar's blockers and the verdict offer it;\n * whether the figure meets its plane is said by the release check from the parts, with no face to name. A mounting\n * face named already (by the assistant, or before) is shown with the way to take it off, and nothing more.\n *\n * Two kinds of change leave this tab, and it does neither itself:\n * - `command` carries an authoring command (rename, where it stands, taking the mounting face off). The page runs\n * it through the session, so it is one step of the same undo history as every other edit, and is saved with it.\n * - `catalog` carries a change to the row (category, tags). Those are not in the asset; the page writes them\n * to the saved row at once, so they need a saved figure.\n */\n@customElement('figure-properties')\nexport class FigureProperties extends localize(i18next)(LitElement) {\n static styles = [ScrollbarStyles, SidePanelStyles, css`\n :host {\n display: block;\n /* It stands inside the properties tab's panel, which gives the margin; a second one indented it past the type. */\n padding: 0;\n overflow: auto;\n }\n div[row] {\n display: flex;\n gap: 6px;\n align-items: center;\n }\n /* What is named, then the way to take it off at the line's end, as wide as its words. */\n div[row] > span {\n flex: 1;\n }\n div[row] > button[quiet] {\n flex: none;\n }\n `]\n\n /** The figure at the version on screen. */\n @property({ attribute: false }) revision?: FigureRevision\n /** The saved row, if any. Category and tags live on it. */\n @property({ type: String }) figureId?: string\n @property({ type: String }) figureCategory?: string\n /** The categories the server allows (LV figure-server design G5): chosen from, and fixed once set. Null: free text. */\n @property({ attribute: false }) figureCategories?: string[] | null\n @property({ type: Array }) figureTags?: string[]\n private facts(): FigureFigureFacts | undefined {\n try {\n return this.revision ? figureFigureFacts(this.revision) : undefined\n } catch {\n /* A source the format refuses has no facts to show; the verdict tab says why. */\n return undefined\n }\n }\n\n /*\n The figure's own settings are shown while no part is picked; with one picked this is out of sight, and working out its\n facts (the figure parsed and compiled) on every edit is for nobody. Out of sight it keeps what it last drew, and it\n draws again when it comes back into view.\n */\n private lastDrawn?: unknown\n private outOfSight = false\n private watch?: ResizeObserver\n connectedCallback() {\n super.connectedCallback()\n this.watch = new ResizeObserver(() => {\n if (this.outOfSight && this.checkVisibility?.() !== false) {\n this.outOfSight = false\n this.requestUpdate()\n }\n })\n this.watch.observe(this)\n }\n disconnectedCallback() {\n this.watch?.disconnect()\n super.disconnectedCallback()\n }\n\n render() {\n if (this.hasUpdated && this.checkVisibility?.() === false) {\n this.outOfSight = true\n return this.lastDrawn ?? nothing\n }\n this.lastDrawn = this.draw()\n return this.lastDrawn\n }\n\n private draw() {\n const facts = this.facts()\n if (!facts) return nothing\n /* The figure's type is the page's (it lives on the row); it is slotted into the first section. */\n return html`<section>\n <h3>${i18next.t('figure.label.group-figure')}</h3>\n <slot name=\"type\"></slot>\n ${this.renderName(facts)} ${this.renderPlacement(facts)} ${this.renderMounting(facts)}\n </section>\n <section>\n <h3>${i18next.t('figure.label.group-catalog')}</h3>\n ${this.renderCatalog()}\n </section>\n ${this.renderAppSections()}`\n }\n\n private renderName(facts: FigureFigureFacts) {\n return html`\n <div field>\n <label>${i18next.t('figure.label.name')}</label>\n <input\n .value=${facts.name}\n placeholder=${i18next.t('figure.text.figure-display-name')}\n @change=${(event: Event) => {\n const input = event.target as HTMLInputElement\n if (!input.value.trim()) {\n /* The format refuses a blank name; put the old one back rather than send a command that fails. */\n input.value = facts.name\n return\n }\n if (input.value.trim() !== facts.name) this.command({ kind: 'rename', name: input.value })\n }}\n />\n </div>\n `\n }\n\n /**\n * The face the figure is placed by. In it is part of the room declaration, so choosing one declares the room\n * again from the parts — the only way declares it — with the new face. The hint says so.\n */\n private renderPlacement(facts: FigureFigureFacts) {\n const current = facts.placement ?? 'floor'\n return html`\n <div field>\n <label>${i18next.t('figure.label.figure-placement')}</label>\n <select\n .value=${live(current)}\n @change=${(event: Event) => {\n const select = event.target as HTMLSelectElement\n /* The figure's own setting (ADR-0097): chosen with no part too, and the room is left as it is declared. */\n this.command({ kind: 'set-placement', placement: select.value as Placement })\n /* Refused, the figure is placed as it was, and the list says so; taken, the figure drawn again says the new one. */\n select.value = current\n }}\n >\n ${PLACEMENTS.map(\n one => html`<option value=${one} ?selected=${one === current}>${i18next.t('figure.label.placement-' + one)}</option>`\n )}\n </select>\n </div>\n `\n }\n\n /**\n * A mounting face named already: which, and the way to take it off. A centred figure has no plane, so the gate does\n * not check it there; the line says so rather than show a promise that is not kept.\n */\n private renderMounting(facts: FigureFigureFacts) {\n const mounting = facts.mounting\n if (!mounting) return nothing\n const said = `${mounting.part} · ${i18next.t('figure.label.face-' + mounting.face)}`\n return html`\n <div field mounting-face>\n <label>${i18next.t('figure.label.mounting-face')}</label>\n <div row>\n <span>${facts.placement === 'center' ? `${said} · ${i18next.t('figure.text.mounting-face-unchecked-at-center')}` : said}</span>\n <button quiet clear-mounting-face @click=${() => this.command({ kind: 'clear-mounting-face' })}>\n <md-icon>close</md-icon>${i18next.t('figure.button.clear-mounting-face')}\n </button>\n </div>\n </div>\n `\n }\n\n /** The sections an app added (G11), after the panel's own, for the figures they are for. A section that throws says so in its place. */\n private renderAppSections() {\n const asset = this.revision?.asset\n if (!asset) return nothing\n const figure = { id: this.figureId, category: this.figureCategory }\n return figurePropertySections().map(section => {\n try {\n if (!section.when({ asset, figure })) return nothing\n return html`<section data-section=${section.id}>\n <h3>${section.title()}</h3>\n ${section.render({ asset, figure, command: action => this.command(action) })}\n </section>`\n } catch (error) {\n console.error(`[figure-ui] the property section '${section.id}' failed`, error)\n return html`<section data-section=${section.id}>\n <p role=\"alert\">${i18next.t('figure.text.property-section-failed', { section: section.id, reason: (error as Error)?.message ?? String(error) })}</p>\n </section>`\n }\n })\n }\n\n private renderCatalog() {\n const saved = !!this.figureId\n return html`\n <div field>\n <label>${i18next.t('figure.label.category')}</label>\n ${this.figureCategories?.length\n ? html`<select\n category\n ?disabled=${!saved || !!this.figureCategory}\n @change=${(e: Event) => this.catalog({ category: (e.target as HTMLSelectElement).value })}\n >\n ${this.figureCategory ? nothing : html`<option value=\"\" selected disabled>${i18next.t('figure.text.category-choose')}</option>`}\n ${this.figureCategories.map(code => html`<option value=${code} ?selected=${code === this.figureCategory}>${code}</option>`)}\n </select>`\n : html`<input\n .value=${this.figureCategory ?? ''}\n ?disabled=${!saved}\n placeholder=${i18next.t('figure.text.category-placeholder')}\n @change=${(e: Event) => this.catalog({ category: (e.target as HTMLInputElement).value.trim() })}\n />`}\n </div>\n <div field>\n <label>${i18next.t('figure.label.tags')}</label>\n <input\n .value=${(this.figureTags ?? []).join(', ')}\n ?disabled=${!saved}\n placeholder=${i18next.t('figure.text.tags-placeholder')}\n @change=${(e: Event) => this.catalog({ tags: tagsOf((e.target as HTMLInputElement).value) })}\n />\n ${saved ? nothing : html`<small>${i18next.t('figure.text.catalog-needs-a-save')}</small>`}\n </div>\n `\n }\n\n private command(action: FigureAuthoringAction) {\n this.dispatchEvent(new CustomEvent('command', { detail: { action }, bubbles: true, composed: true }))\n }\n\n private catalog(patch: { category?: string; tags?: string[] }) {\n this.dispatchEvent(new CustomEvent('catalog', { detail: patch, bubbles: true, composed: true }))\n }\n}\n"]}
1
+ {"version":3,"file":"figure-properties.js","sourceRoot":"","sources":["../../client/modeller/figure-properties.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { live } from 'lit/directives/live.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport type { FigureAuthoringAction } from '@hatiolab/figure-model'\n\nimport { tagsOf, figureFigureFacts, type Placement, type FigureFigureFacts } from './figure-facts.js'\nimport type { FigureRevision } from './revision.js'\nimport { figurePropertySections } from './property-sections.js'\nimport { SidePanelStyles } from '@things-factory/figure-viewer/dist-client/side-panel-styles.js'\nimport { ScrollbarStyles } from '@operato/styles'\n\nconst PLACEMENTS: Placement[] = ['floor', 'ceiling', 'center', 'wall']\n\n/**\n * 속성 — the modeller's figure properties.\n *\n * The tab opens with what the figure is: its name, where it stands, where the catalogue files it.\n *\n * Nothing here is set up before work can go on (user 2026-10-18, after a walk without it). The room the figure\n * takes up is declared where release asks for it, from the parts -- the bar's blockers and the verdict offer it;\n * whether the figure meets its plane is said by the release check from the parts, with no face to name. A mounting\n * face named already (by the assistant, or before) is shown with the way to take it off, and nothing more.\n *\n * Two kinds of change leave this tab, and it does neither itself:\n * - `command` carries an authoring command (rename, where it stands, taking the mounting face off). The page runs\n * it through the session, so it is one step of the same undo history as every other edit, and is saved with it.\n * - `catalog` carries a change to the row (category, tags). Those are not in the asset; the page holds them and\n * 「저장」 writes them to the saved row with the figure, so they need a saved figure. They are not undone.\n */\n@customElement('figure-properties')\nexport class FigureProperties extends localize(i18next)(LitElement) {\n static styles = [ScrollbarStyles, SidePanelStyles, css`\n :host {\n display: block;\n /* It stands inside the properties tab's panel, which gives the margin; a second one indented it past the type. */\n padding: 0;\n overflow: auto;\n }\n div[row] {\n display: flex;\n gap: 6px;\n align-items: center;\n }\n /* What is named, then the way to take it off at the line's end, as wide as its words. */\n div[row] > span {\n flex: 1;\n }\n div[row] > button[quiet] {\n flex: none;\n }\n `]\n\n /** The figure at the version on screen. */\n @property({ attribute: false }) revision?: FigureRevision\n /** The saved row, if any. Category and tags live on it. */\n @property({ type: String }) figureId?: string\n @property({ type: String }) figureCategory?: string\n /** The categories the server allows (LV figure-server design G5): chosen from, and fixed once set. Null: free text. */\n @property({ attribute: false }) figureCategories?: string[] | null\n /** The category the server holds: with a vocabulary it is fixed; one chosen and not saved yet may be chosen again. */\n @property({ type: String }) figureCategorySaved?: string\n @property({ type: Array }) figureTags?: string[]\n private facts(): FigureFigureFacts | undefined {\n try {\n return this.revision ? figureFigureFacts(this.revision) : undefined\n } catch {\n /* A source the format refuses has no facts to show; the verdict tab says why. */\n return undefined\n }\n }\n\n /*\n The figure's own settings are shown while no part is picked; with one picked this is out of sight, and working out its\n facts (the figure parsed and compiled) on every edit is for nobody. Out of sight it keeps what it last drew, and it\n draws again when it comes back into view.\n */\n private lastDrawn?: unknown\n private outOfSight = false\n private watch?: ResizeObserver\n connectedCallback() {\n super.connectedCallback()\n this.watch = new ResizeObserver(() => {\n if (this.outOfSight && this.checkVisibility?.() !== false) {\n this.outOfSight = false\n this.requestUpdate()\n }\n })\n this.watch.observe(this)\n }\n disconnectedCallback() {\n this.watch?.disconnect()\n super.disconnectedCallback()\n }\n\n render() {\n if (this.hasUpdated && this.checkVisibility?.() === false) {\n this.outOfSight = true\n return this.lastDrawn ?? nothing\n }\n this.lastDrawn = this.draw()\n return this.lastDrawn\n }\n\n private draw() {\n const facts = this.facts()\n if (!facts) return nothing\n /* The figure's type is the page's (it lives on the row); it is slotted into the first section. */\n return html`<section>\n <h3>${i18next.t('figure.label.group-figure')}</h3>\n <slot name=\"type\"></slot>\n ${this.renderName(facts)} ${this.renderPlacement(facts)} ${this.renderMounting(facts)}\n </section>\n <section>\n <h3>${i18next.t('figure.label.group-catalog')}</h3>\n ${this.renderCatalog()}\n </section>\n ${this.renderAppSections()}`\n }\n\n private renderName(facts: FigureFigureFacts) {\n return html`\n <div field>\n <label for=\"figure-name\">${i18next.t('figure.label.name')}</label>\n <input\n id=\"figure-name\"\n .value=${facts.name}\n placeholder=${i18next.t('figure.text.figure-display-name')}\n @change=${(event: Event) => {\n const input = event.target as HTMLInputElement\n if (!input.value.trim()) {\n /* The format refuses a blank name; put the old one back rather than send a command that fails. */\n input.value = facts.name\n return\n }\n if (input.value.trim() !== facts.name) this.command({ kind: 'rename', name: input.value })\n }}\n />\n </div>\n `\n }\n\n /**\n * The face the figure is placed by. In it is part of the room declaration, so choosing one declares the room\n * again from the parts — the only way declares it — with the new face. The hint says so.\n */\n private renderPlacement(facts: FigureFigureFacts) {\n const current = facts.placement ?? 'floor'\n return html`\n <div field>\n <label for=\"figure-placement\">${i18next.t('figure.label.figure-placement')}</label>\n <select\n id=\"figure-placement\"\n .value=${live(current)}\n @change=${(event: Event) => {\n const select = event.target as HTMLSelectElement\n /* The figure's own setting (ADR-0097): chosen with no part too, and the room is left as it is declared. */\n this.command({ kind: 'set-placement', placement: select.value as Placement })\n /* Refused, the figure is placed as it was, and the list says so; taken, the figure drawn again says the new one. */\n select.value = current\n }}\n >\n ${PLACEMENTS.map(\n one => html`<option value=${one} ?selected=${one === current}>${i18next.t('figure.label.placement-' + one)}</option>`\n )}\n </select>\n </div>\n `\n }\n\n /**\n * A mounting face named already: which, and the way to take it off. A centred figure has no plane, so the gate does\n * not check it there; the line says so rather than show a promise that is not kept.\n */\n private renderMounting(facts: FigureFigureFacts) {\n const mounting = facts.mounting\n if (!mounting) return nothing\n const said = `${mounting.part} · ${i18next.t('figure.label.face-' + mounting.face)}`\n return html`\n <div field mounting-face>\n <label>${i18next.t('figure.label.mounting-face')}</label>\n <div row>\n <span>${facts.placement === 'center' ? `${said} · ${i18next.t('figure.text.mounting-face-unchecked-at-center')}` : said}</span>\n <button quiet clear-mounting-face @click=${() => this.command({ kind: 'clear-mounting-face' })}>\n <md-icon>close</md-icon>${i18next.t('figure.button.clear-mounting-face')}\n </button>\n </div>\n </div>\n `\n }\n\n /** The sections an app added (G11), after the panel's own, for the figures they are for. A section that throws says so in its place. */\n private renderAppSections() {\n const asset = this.revision?.asset\n if (!asset) return nothing\n const figure = { id: this.figureId, category: this.figureCategory }\n return figurePropertySections().map(section => {\n try {\n if (!section.when({ asset, figure })) return nothing\n return html`<section data-section=${section.id}>\n <h3>${section.title()}</h3>\n ${section.render({ asset, figure, command: action => this.command(action) })}\n </section>`\n } catch (error) {\n console.error(`[figure-ui] the property section '${section.id}' failed`, error)\n return html`<section data-section=${section.id}>\n <p role=\"alert\">${i18next.t('figure.text.property-section-failed', { section: section.id, reason: (error as Error)?.message ?? String(error) })}</p>\n </section>`\n }\n })\n }\n\n private renderCatalog() {\n const saved = !!this.figureId\n return html`\n <div field>\n <label for=\"figure-category\">${i18next.t('figure.label.category')}</label>\n ${this.figureCategories?.length\n ? html`<select\n id=\"figure-category\"\n category\n ?disabled=${!saved || !!this.figureCategorySaved}\n @change=${(e: Event) => this.catalog({ category: (e.target as HTMLSelectElement).value })}\n >\n ${this.figureCategory ? nothing : html`<option value=\"\" selected disabled>${i18next.t('figure.text.category-choose')}</option>`}\n ${this.figureCategories.map(code => html`<option value=${code} ?selected=${code === this.figureCategory}>${code}</option>`)}\n </select>`\n : html`<input\n id=\"figure-category\"\n .value=${this.figureCategory ?? ''}\n ?disabled=${!saved}\n placeholder=${i18next.t('figure.text.category-placeholder')}\n @change=${(e: Event) => this.catalog({ category: (e.target as HTMLInputElement).value.trim() })}\n />`}\n </div>\n <div field>\n <label for=\"figure-tags\">${i18next.t('figure.label.tags')}</label>\n <input\n id=\"figure-tags\"\n .value=${(this.figureTags ?? []).join(', ')}\n ?disabled=${!saved}\n placeholder=${i18next.t('figure.text.tags-placeholder')}\n @change=${(e: Event) => this.catalog({ tags: tagsOf((e.target as HTMLInputElement).value) })}\n />\n ${saved ? nothing : html`<small>${i18next.t('figure.text.catalog-needs-a-save')}</small>`}\n </div>\n `\n }\n\n private command(action: FigureAuthoringAction) {\n this.dispatchEvent(new CustomEvent('command', { detail: { action }, bubbles: true, composed: true }))\n }\n\n private catalog(patch: { category?: string; tags?: string[] }) {\n this.dispatchEvent(new CustomEvent('catalog', { detail: patch, bubbles: true, composed: true }))\n }\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import { LitElement } from 'lit';
2
+ import '@operato/popup/ox-popup-actions.js';
3
+ import '@material/web/button/filled-button.js';
4
+ import '@material/web/button/outlined-button.js';
5
+ import '@material/web/button/text-button.js';
6
+ import type { SaveConflictChanges } from './save-conflict.js';
7
+ /** What the person chose after a conflict; nothing when closed -- the edits stay, unsaved. */
8
+ export type SaveConflictChoice = 'copy' | 'latest' | 'overwrite';
9
+ /**
10
+ * A save refused because another editor saved this figure first (2026-11-01 audit item 6). The edits stay on screen;
11
+ * what differs from the server's latest is said by part, and the ways on are offered: keep the edits as a copy (first,
12
+ * since nothing is lost), look at the latest in a new tab, or write the edits over it.
13
+ */
14
+ export declare class FigureSaveConflict extends LitElement {
15
+ static styles: import("lit").CSSResult[];
16
+ /** What differs from the server's latest; null when the latest could not be read. */
17
+ changes: SaveConflictChanges | null;
18
+ render(): import("lit-html").TemplateResult<1>;
19
+ }
@@ -0,0 +1,76 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { LitElement, html, css, nothing } from 'lit';
3
+ import { customElement, property } from 'lit/decorators.js';
4
+ import { i18next } from '@operato/i18n';
5
+ import { closePopup } from '@operato/popup';
6
+ import '@operato/popup/ox-popup-actions.js';
7
+ import { CommonPopupStyles } from '@operato/styles';
8
+ import '@material/web/button/filled-button.js';
9
+ import '@material/web/button/outlined-button.js';
10
+ import '@material/web/button/text-button.js';
11
+ import { partLabelOf } from './fields.js';
12
+ /**
13
+ * A save refused because another editor saved this figure first (2026-11-01 audit item 6). The edits stay on screen;
14
+ * what differs from the server's latest is said by part, and the ways on are offered: keep the edits as a copy (first,
15
+ * since nothing is lost), look at the latest in a new tab, or write the edits over it.
16
+ */
17
+ let FigureSaveConflict = class FigureSaveConflict extends LitElement {
18
+ constructor() {
19
+ super(...arguments);
20
+ /** What differs from the server's latest; null when the latest could not be read. */
21
+ this.changes = null;
22
+ }
23
+ static { this.styles = [
24
+ CommonPopupStyles,
25
+ css `
26
+ :host {
27
+ overflow-y: auto;
28
+ }
29
+ ul {
30
+ margin: 0;
31
+ padding-inline-start: 18px;
32
+ font-size: var(--popup-font-size-small);
33
+ }
34
+ li span {
35
+ color: var(--md-sys-color-on-surface-variant);
36
+ }
37
+ div[ways] {
38
+ display: grid;
39
+ gap: 6px;
40
+ }
41
+ `
42
+ ]; }
43
+ render() {
44
+ const changes = this.changes;
45
+ const line = (key, parts) => parts.length ? html `<li><span>${i18next.t(key)}</span> ${parts.map(partLabelOf).join(', ')}</li>` : nothing;
46
+ return html `
47
+ <div class="what">${i18next.t('figure.text.save-conflict-desc')}</div>
48
+ ${changes
49
+ ? html `<ul differs>
50
+ ${line('figure.label.conflict-changed', changes.changed)} ${line('figure.label.conflict-mine-only', changes.mineOnly)}
51
+ ${line('figure.label.conflict-theirs-only', changes.theirsOnly)}
52
+ ${changes.otherChanged ? html `<li>${i18next.t('figure.text.conflict-other-changed')}</li>` : nothing}
53
+ </ul>`
54
+ : html `<div class="note">${i18next.t('figure.text.conflict-latest-unread')}</div>`}
55
+ <div ways>
56
+ <md-filled-button copy @click=${() => closePopup(this, 'copy')}>${i18next.t('figure.button.save-as-copy')}</md-filled-button>
57
+ <md-outlined-button latest @click=${() => closePopup(this, 'latest')}>${i18next.t('figure.button.open-latest')}</md-outlined-button>
58
+ ${changes
59
+ ? html `<md-text-button overwrite @click=${() => closePopup(this, 'overwrite')}>${i18next.t('figure.button.overwrite-latest')}</md-text-button>`
60
+ : nothing}
61
+ </div>
62
+ <ox-popup-actions>
63
+ <md-text-button slot="cancel" @click=${() => closePopup(this)}>${i18next.t('figure.button.keep-editing')}</md-text-button>
64
+ </ox-popup-actions>
65
+ `;
66
+ }
67
+ };
68
+ __decorate([
69
+ property({ attribute: false }),
70
+ __metadata("design:type", Object)
71
+ ], FigureSaveConflict.prototype, "changes", void 0);
72
+ FigureSaveConflict = __decorate([
73
+ customElement('figure-save-conflict')
74
+ ], FigureSaveConflict);
75
+ export { FigureSaveConflict };
76
+ //# sourceMappingURL=figure-save-conflict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figure-save-conflict.js","sourceRoot":"","sources":["../../client/modeller/figure-save-conflict.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,oCAAoC,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,uCAAuC,CAAA;AAC9C,OAAO,yCAAyC,CAAA;AAChD,OAAO,qCAAqC,CAAA;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAMzC;;;;GAIG;AAEI,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,UAAU;IAA3C;;QAsBL,qFAAqF;QACrD,YAAO,GAA+B,IAAI,CAAA;IA2B5E,CAAC;aAjDQ,WAAM,GAAG;QACd,iBAAiB;QACjB,GAAG,CAAA;;;;;;;;;;;;;;;;KAgBF;KACF,AAnBY,CAmBZ;IAKD,MAAM;QACJ,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC5B,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,KAAe,EAAE,EAAE,CAC5C,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA,aAAa,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAA;QAC7G,OAAO,IAAI,CAAA;0BACW,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC;QAC7D,OAAO;YACP,CAAC,CAAC,IAAI,CAAA;cACA,IAAI,CAAC,+BAA+B,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,iCAAiC,EAAE,OAAO,CAAC,QAAQ,CAAC;cACnH,IAAI,CAAC,mCAAmC,EAAE,OAAO,CAAC,UAAU,CAAC;cAC7D,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAA,OAAO,OAAO,CAAC,CAAC,CAAC,oCAAoC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;gBAChG;YACR,CAAC,CAAC,IAAI,CAAA,qBAAqB,OAAO,CAAC,CAAC,CAAC,oCAAoC,CAAC,QAAQ;;wCAElD,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC;4CACrE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC;UAC5G,OAAO;YACP,CAAC,CAAC,IAAI,CAAA,oCAAoC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC,mBAAmB;YAC/I,CAAC,CAAC,OAAO;;;+CAG4B,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC;;KAE3G,CAAA;IACH,CAAC;;AA1B+B;IAA/B,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;;mDAA2C;AAvB/D,kBAAkB;IAD9B,aAAa,CAAC,sBAAsB,CAAC;GACzB,kBAAkB,CAkD9B","sourcesContent":["import { LitElement, html, css, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { i18next } from '@operato/i18n'\nimport { closePopup } from '@operato/popup'\nimport '@operato/popup/ox-popup-actions.js'\nimport { CommonPopupStyles } from '@operato/styles'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/outlined-button.js'\nimport '@material/web/button/text-button.js'\n\nimport { partLabelOf } from './fields.js'\nimport type { SaveConflictChanges } from './save-conflict.js'\n\n/** What the person chose after a conflict; nothing when closed -- the edits stay, unsaved. */\nexport type SaveConflictChoice = 'copy' | 'latest' | 'overwrite'\n\n/**\n * A save refused because another editor saved this figure first (2026-11-01 audit item 6). The edits stay on screen;\n * what differs from the server's latest is said by part, and the ways on are offered: keep the edits as a copy (first,\n * since nothing is lost), look at the latest in a new tab, or write the edits over it.\n */\n@customElement('figure-save-conflict')\nexport class FigureSaveConflict extends LitElement {\n static styles = [\n CommonPopupStyles,\n css`\n :host {\n overflow-y: auto;\n }\n ul {\n margin: 0;\n padding-inline-start: 18px;\n font-size: var(--popup-font-size-small);\n }\n li span {\n color: var(--md-sys-color-on-surface-variant);\n }\n div[ways] {\n display: grid;\n gap: 6px;\n }\n `\n ]\n\n /** What differs from the server's latest; null when the latest could not be read. */\n @property({ attribute: false }) changes: SaveConflictChanges | null = null\n\n render() {\n const changes = this.changes\n const line = (key: string, parts: string[]) =>\n parts.length ? html`<li><span>${i18next.t(key)}</span> ${parts.map(partLabelOf).join(', ')}</li>` : nothing\n return html`\n <div class=\"what\">${i18next.t('figure.text.save-conflict-desc')}</div>\n ${changes\n ? html`<ul differs>\n ${line('figure.label.conflict-changed', changes.changed)} ${line('figure.label.conflict-mine-only', changes.mineOnly)}\n ${line('figure.label.conflict-theirs-only', changes.theirsOnly)}\n ${changes.otherChanged ? html`<li>${i18next.t('figure.text.conflict-other-changed')}</li>` : nothing}\n </ul>`\n : html`<div class=\"note\">${i18next.t('figure.text.conflict-latest-unread')}</div>`}\n <div ways>\n <md-filled-button copy @click=${() => closePopup(this, 'copy')}>${i18next.t('figure.button.save-as-copy')}</md-filled-button>\n <md-outlined-button latest @click=${() => closePopup(this, 'latest')}>${i18next.t('figure.button.open-latest')}</md-outlined-button>\n ${changes\n ? html`<md-text-button overwrite @click=${() => closePopup(this, 'overwrite')}>${i18next.t('figure.button.overwrite-latest')}</md-text-button>`\n : nothing}\n </div>\n <ox-popup-actions>\n <md-text-button slot=\"cancel\" @click=${() => closePopup(this)}>${i18next.t('figure.button.keep-editing')}</md-text-button>\n </ox-popup-actions>\n `\n }\n}\n"]}
@@ -50,6 +50,8 @@ export declare class FigureSectionEditor extends FigureSectionEditor_base {
50
50
  pointBlocked: string;
51
51
  /** The figure's revision now; the editor remembers the one it opened at. */
52
52
  revision: number;
53
+ /** The page in front, as the modeller has it: a page left keeps this editor on the window, and its keys are not its (2026-11-01 audit item 1). */
54
+ active: boolean;
53
55
  /** What stands on the faces the last apply takes away (ADR-0100 A8): asked here, where the edit was made. */
54
56
  faceMapping?: FigureFaceMappingNeed;
55
57
  /** Narrow: the outline or the solid behind. */
@@ -47,6 +47,8 @@ let FigureSectionEditor = class FigureSectionEditor extends localize(i18next)(Li
47
47
  this.pointBlocked = '';
48
48
  /** The figure's revision now; the editor remembers the one it opened at. */
49
49
  this.revision = 0;
50
+ /** The page in front, as the modeller has it: a page left keeps this editor on the window, and its keys are not its (2026-11-01 audit item 1). */
51
+ this.active = true;
50
52
  /** Narrow: the outline or the solid behind. */
51
53
  this.show = 'outline';
52
54
  /** Set when the space the editor stands in leaves too little beside it to see the solid. */
@@ -72,6 +74,8 @@ let FigureSectionEditor = class FigureSectionEditor extends localize(i18next)(Li
72
74
  * would take Esc as "select nothing" and Delete as "delete the part".
73
75
  */
74
76
  this.keys = (e) => {
77
+ if (!this.active)
78
+ return;
75
79
  const inField = e.composedPath()[0]?.tagName === 'INPUT';
76
80
  /* A number being typed in the inside's drawing: Esc there puts the number back, not the editor away. */
77
81
  if (inField && e.composedPath().some(el => el.tagName === 'FIGURE-CAVITY-DRAWING'))
@@ -825,6 +829,10 @@ __decorate([
825
829
  property({ type: Number }),
826
830
  __metadata("design:type", Object)
827
831
  ], FigureSectionEditor.prototype, "revision", void 0);
832
+ __decorate([
833
+ property({ type: Boolean }),
834
+ __metadata("design:type", Object)
835
+ ], FigureSectionEditor.prototype, "active", void 0);
828
836
  __decorate([
829
837
  property({ attribute: false }),
830
838
  __metadata("design:type", Object)