@things-factory/ops-master 10.1.203 → 10.1.206

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 (34) hide show
  1. package/dist-client/pages/master/revision-comparison.js +5 -2
  2. package/dist-client/pages/master/revision-comparison.js.map +1 -1
  3. package/dist-client/pages/master/revision-view.d.ts +15 -0
  4. package/dist-client/pages/master/revision-view.js +12 -0
  5. package/dist-client/pages/master/revision-view.js.map +1 -1
  6. package/dist-client/pages/master/revision-workspace.js +6 -2
  7. package/dist-client/pages/master/revision-workspace.js.map +1 -1
  8. package/dist-client/tsconfig.tsbuildinfo +1 -1
  9. package/dist-server/service/master-change-approval/approval-input.d.ts +17 -0
  10. package/dist-server/service/master-change-approval/approval-input.js +35 -0
  11. package/dist-server/service/master-change-approval/approval-input.js.map +1 -0
  12. package/dist-server/service/master-change-approval/index.d.ts +1 -0
  13. package/dist-server/service/master-change-approval/index.js +1 -0
  14. package/dist-server/service/master-change-approval/index.js.map +1 -1
  15. package/dist-server/service/material/material-revision-resolver.d.ts +1 -0
  16. package/dist-server/service/material/material-revision-service.d.ts +3 -0
  17. package/dist-server/service/material/material-revision-service.js +18 -5
  18. package/dist-server/service/material/material-revision-service.js.map +1 -1
  19. package/dist-server/service/recipe/recipe-revision-resolver.d.ts +1 -0
  20. package/dist-server/service/recipe/recipe-revision-service.d.ts +3 -0
  21. package/dist-server/service/recipe/recipe-revision-service.js +18 -5
  22. package/dist-server/service/recipe/recipe-revision-service.js.map +1 -1
  23. package/dist-server/service/test-spec/test-spec-revision-resolver.d.ts +1 -0
  24. package/dist-server/service/test-spec/test-spec-revision-service.d.ts +3 -0
  25. package/dist-server/service/test-spec/test-spec-revision-service.js +18 -5
  26. package/dist-server/service/test-spec/test-spec-revision-service.js.map +1 -1
  27. package/dist-server/tsconfig.tsbuildinfo +1 -1
  28. package/package.json +5 -5
  29. package/translations/en.json +2 -0
  30. package/translations/es.json +2 -0
  31. package/translations/ja.json +2 -0
  32. package/translations/ko.json +2 -0
  33. package/translations/ms.json +2 -0
  34. package/translations/zh.json +2 -0
@@ -7,7 +7,7 @@ import { customElement, property, state } from 'lit/decorators.js';
7
7
  import { showEntity360, hideEntity360, navigateEntity360, canGoBackEntity360 } from '@operato/layout';
8
8
  import { i18next, localize } from '@operato/i18n';
9
9
  import { ScrollbarStyles } from '@operato/styles';
10
- import { revisionDifferences, revisionDetailAddress, revisionSideAt } from './revision-view.js';
10
+ import { revisionDifferences, revisionDetailAddress, revisionSideAt, isBaseline, reasonOf } from './revision-view.js';
11
11
  export const revisionText = (key, params = {}) => String(i18next.t('revision-ui.' + key, params));
12
12
  export const revisionDate = (value) => value
13
13
  ? new Intl.DateTimeFormat(i18next.language || 'en', { dateStyle: 'medium', timeStyle: 'short' }).format(new Date(value))
@@ -524,7 +524,10 @@ let MasterRevision360 = class MasterRevision360 extends localize(i18next)(LitEle
524
524
  <dt>${revisionText('frozen')}</dt>
525
525
  <dd>${revisionDate(row.detail.frozenAt)}</dd>
526
526
  <dt>${revisionText('reason')}</dt>
527
- <dd>${row.detail.reason}</dd>
527
+ <dd>
528
+ ${reasonOf(row.detail, revisionText('first-record'))}
529
+ ${isBaseline(row.detail) ? html `<div class="muted">${revisionText('first-record-why')}</div>` : ''}
530
+ </dd>
528
531
  </dl>
529
532
  <p class="muted">${revisionText('history-scope')}</p>
530
533
  </section>
@@ -1 +1 @@
1
- {"version":3,"file":"revision-comparison.js","sourceRoot":"","sources":["../../../client/pages/master/revision-comparison.ts"],"names":[],"mappings":"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","sourcesContent":["import { addressController, writeAddress } from '@operato/utils/address.js'\nimport { materialRevisionFields } from './material-revision-fields.js'\nimport { LitElement, html, css } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { showEntity360, hideEntity360, navigateEntity360, canGoBackEntity360 } from '@operato/layout'\nimport { i18next, localize } from '@operato/i18n'\nimport { ScrollbarStyles } from '@operato/styles'\nimport {\n revisionDifferences,\n RevisionAxis,\n RevisionSide,\n revisionDetailAddress,\n revisionSideAt\n} from './revision-view.js'\n\nexport const revisionText = (key: string, params: any = {}): string => String(i18next.t('revision-ui.' + key, params))\nexport const revisionDate = (value?: string) =>\n value\n ? new Intl.DateTimeFormat(i18next.language || 'en', { dateStyle: 'medium', timeStyle: 'short' }).format(\n new Date(value)\n )\n : '—'\nexport const revisionStyles = css`\n .material-property { border: 1px solid var(--ui-line, #ddd); margin: 12px 0; padding: 12px; min-width: 0; }\n .material-property legend { font-weight: 600; padding: 0 6px; }\n .material-property-values { display: grid; grid-template-columns: minmax(70px, 1fr) minmax(0, 3fr); gap: 8px; }\n .material-property-values dt { color: var(--md-sys-color-on-surface-variant); }\n .material-property-values dd { margin: 0; overflow-wrap: anywhere; }\n :host {\n color: var(--md-sys-color-on-surface);\n font: inherit;\n }\n table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--ui-t-small, 13px);\n }\n th,\n td {\n padding: 10px 12px;\n border-bottom: 1px solid var(--ui-line);\n text-align: left;\n vertical-align: top;\n overflow-wrap: anywhere;\n }\n th {\n color: var(--md-sys-color-on-surface-variant);\n font-weight: 600;\n }\n .scroll {\n overflow: auto;\n }\n .muted {\n color: var(--md-sys-color-on-surface-variant);\n }\n .pill {\n display: inline-block;\n padding: 3px 8px;\n border-radius: 4px;\n background: var(--md-sys-color-secondary-container);\n color: var(--md-sys-color-on-secondary-container);\n }\n .before {\n color: var(--md-sys-color-on-surface-variant);\n }\n .after {\n font-weight: 600;\n }\n h3 {\n font-size: var(--ui-t-title, 16px);\n margin: 16px 0 10px;\n }\n button {\n font: inherit;\n min-height: var(--form-action-height, 32px);\n padding: 4px 12px;\n border: 1px solid var(--ui-line);\n border-radius: 4px;\n color: inherit;\n background: var(--md-sys-color-surface);\n cursor: pointer;\n }\n button.primary {\n background: var(--md-sys-color-primary);\n color: var(--md-sys-color-on-primary);\n border-color: transparent;\n }\n button:disabled {\n opacity: 0.5;\n cursor: default;\n }\n button:focus-visible,\n a:focus-visible,\n input:focus-visible,\n textarea:focus-visible,\n select:focus-visible,\n summary:focus-visible {\n outline: 2px solid var(--md-sys-color-primary);\n outline-offset: 3px;\n }\n details {\n margin: 12px 0;\n }\n summary {\n cursor: pointer;\n padding: 8px 0;\n }\n`\n@customElement('ops-master-revision-comparison')\nexport class MasterRevisionComparison extends localize(i18next)(LitElement) {\n static styles = [ScrollbarStyles, revisionStyles]\n @property() axis: RevisionAxis = 'testSpecification'\n @property({ attribute: false }) before: any\n @property({ attribute: false }) after: any\n private display(field: string, value: unknown) {\n if (value === undefined || value === null) return '—'\n if (this.axis === 'workShift') {\n if (field === 'fromDate' || field === 'toDate') return revisionText('day-offset-' + value)\n if (field === 'daysOfWeek') return String(value).split(',').map(day => revisionText('weekday-' + day)).join(', ')\n }\n return value\n }\n render() {\n const changes = revisionDifferences(this.axis, this.before, this.after)\n return html`<h3>\n ${revisionText('changes')} <span class=\"pill\">${revisionText('change-count', { count: changes.length })}</span>\n </h3>\n ${!this.before ? html`<p class=\"muted\">${revisionText('new-baseline')}</p>` : ''}\n ${\n changes.length\n ? html`<div class=\"scroll\">\n <table>\n <thead>\n <tr>\n <th>${revisionText('change-kind')}</th>\n <th>${revisionText('item')}</th>\n <th>${revisionText('before')}</th>\n <th>${revisionText('after')}</th>\n </tr>\n </thead>\n <tbody>\n ${changes.map(\n row =>\n html`<tr>\n <td><span class=\"pill\">${revisionText(row.kind)}</span></td>\n <td>\n ${revisionText(row.section)}${row.label ? ' · ' + row.label : ''}<br />${revisionText(row.field)}\n </td>\n <td class=\"before\">${this.display(row.field, row.before)}</td>\n <td class=\"after\">${this.display(row.field, row.after)}</td>\n </tr>`\n )}\n </tbody>\n </table>\n </div>`\n : html`<p>${revisionText('no-content-change')}</p>`\n }`\n }\n}\n\n/** Uses the existing Worklist custom-element slot. No Worklist dependency in the master module. */\n@customElement('ops-master-revision-review')\nexport class MasterRevisionReview extends localize(i18next)(LitElement) {\n static styles = [\n ScrollbarStyles,\n revisionStyles,\n css`\n :host {\n display: block;\n padding: 20px;\n box-sizing: border-box;\n }\n .facts {\n display: flex;\n flex-wrap: wrap;\n gap: 24px;\n margin: 20px 0;\n }\n .facts p {\n margin: 4px 0;\n }\n .impact {\n padding: 12px;\n background: var(--md-sys-color-surface-container);\n }\n h2 {\n margin: 0;\n font-size: var(--ui-t-title, 20px);\n }\n .entity-links {\n display: flex;\n flex-wrap: wrap;\n gap: 16px 32px;\n }\n .entity-links a {\n display: inline-block;\n padding: 8px 0;\n color: var(--md-sys-color-primary);\n text-underline-offset: 3px;\n }\n `\n ]\n @property({ attribute: false }) input: any\n @property({ attribute: false }) activityApproval: any\n @state() private detailError = ''\n // Worklist recreates custom views on shell updates. The common dock has a stable owner.\n private static dockOwner = {}\n private static activeReview?: MasterRevisionReview\n private static enabled = false\n private static detailPath = ''\n private static detailRevision = ''\n private static stopAddress?: () => void\n private static onAddress = () => requestAnimationFrame(() => MasterRevisionReview.activeReview?.syncDetail())\n connectedCallback() {\n super.connectedCallback()\n MasterRevisionReview.activeReview = this\n // One provider listener, not one view listener: routing may disconnect a view during dispatch.\n MasterRevisionReview.stopAddress ??= addressController().subscribe(MasterRevisionReview.onAddress, false)\n }\n disconnectedCallback() {\n if (MasterRevisionReview.activeReview === this) MasterRevisionReview.activeReview = undefined\n requestAnimationFrame(() => {\n if (!MasterRevisionReview.activeReview) {\n hideEntity360(MasterRevisionReview.dockOwner, false)\n MasterRevisionReview.enabled = false\n }\n })\n super.disconnectedCallback()\n }\n updated(changes: any) {\n super.updated(changes)\n if (changes.has('input') && MasterRevisionReview.enabled) {\n if (location.pathname !== MasterRevisionReview.detailPath ||\n this.input?.after?.detail?.revisionId !== MasterRevisionReview.detailRevision) {\n hideEntity360(MasterRevisionReview.dockOwner, false)\n MasterRevisionReview.enabled = false\n } else this.syncDetail()\n }\n }\n private syncDetail() {\n if (MasterRevisionReview.activeReview !== this || !MasterRevisionReview.enabled) return\n if (location.pathname !== MasterRevisionReview.detailPath) {\n MasterRevisionReview.enabled = false\n hideEntity360(MasterRevisionReview.dockOwner, false)\n return\n }\n try {\n const side = revisionSideAt(this.input, location.href)\n if (side) this.showDetail(side)\n else hideEntity360(MasterRevisionReview.dockOwner)\n } catch {\n hideEntity360(MasterRevisionReview.dockOwner)\n this.detailError = revisionText('detail-unavailable')\n }\n }\n private async closeDetail() {\n const url = new URL(location.href)\n url.searchParams.delete('f')\n url.searchParams.delete('revision')\n const { entity360Previous: _previous, ...state } = history.state ?? {}\n if (!(await writeAddress(url, { state, replace: true }))) return\n hideEntity360(MasterRevisionReview.dockOwner)\n }\n private showDetail(side: RevisionSide, opener?: HTMLElement) {\n const row = this.input[side]\n showEntity360(MasterRevisionReview.dockOwner, {\n key: revisionDetailAddress(this.input, side, location.href),\n title: this.input.headline,\n context: `${revisionText(side)} · ${revisionText('revision-value', { n: row.revisionNumber })}`,\n labels: { close: revisionText('dock-close'), expand: revisionText('dock-expand'), collapse: revisionText('dock-collapse'),\n resize: revisionText('dock-resize'), back: revisionText('dock-back') },\n onClose: () => (MasterRevisionReview.activeReview ?? this).closeDetail(),\n onBack: canGoBackEntity360() ? () => history.back() : undefined,\n content: html`<ops-master-revision-360 .input=${this.input} .side=${side}\n .activityApproval=${this.activityApproval}></ops-master-revision-360>`\n }, () => {\n const target = opener?.isConnected ? opener : MasterRevisionReview.activeReview?.renderRoot.querySelector<HTMLElement>(`[data-detail=\"${side}\"]`)\n target?.focus({ preventScroll: true })\n })\n }\n private async openDetail(side: RevisionSide, opener?: HTMLElement) {\n try {\n const address = revisionDetailAddress(this.input, side, location.href)\n this.detailError = ''\n if (!MasterRevisionReview.enabled && new URL(location.href).searchParams.has('f')) {\n const base = new URL(location.href)\n base.searchParams.delete('f')\n base.searchParams.delete('revision')\n const { entity360Previous: _previous, ...state } = history.state ?? {}\n if (!(await writeAddress(base, { state, replace: true }))) return\n }\n if (!(await navigateEntity360(address))) return\n MasterRevisionReview.enabled = true\n MasterRevisionReview.detailPath = location.pathname\n MasterRevisionReview.detailRevision = this.input.after.detail.revisionId\n this.showDetail(side, opener)\n } catch {\n this.detailError = revisionText('detail-unavailable')\n }\n }\n private entityLink(side: RevisionSide) {\n const row = this.input[side]\n if (!row) return html`<span>${revisionText('no-before')}</span>`\n // A URL alone never opens a modal. Inspection is always an explicit user action.\n if (!row.detail) return html`<span>${revisionText('detail-unavailable')}</span>`\n return html`<div>\n <span class=\"muted\">${revisionText(side)}</span><br />\n <a href=${revisionDetailAddress(this.input, side, location.href)} data-detail=${side}\n @click=${(event: MouseEvent) => {\n if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return\n event.preventDefault()\n this.openDetail(side, event.currentTarget as HTMLElement)\n }}>${this.input.headline} · ${revisionText('revision-value', { n: row.revisionNumber })}</a>\n </div>`\n }\n render() {\n const input = this.input\n if (!input) return html``\n const axis: RevisionAxis = input.revision?.arrangementId ? 'workShift' : input.revision?.recipeId ? 'recipeDefinition' : input.revision?.materialId ? 'materialDefinition' : 'testSpecification'\n return html`<h2>${input.headline}</h2>\n <div class=\"entity-links\">${this.entityLink('before')}${this.entityLink('after')}</div>\n ${this.detailError ? html`<p role=\"alert\">${this.detailError}</p>` : ''}\n <div class=\"facts\">\n <div>\n <span class=\"muted\">${revisionText('revision')}</span>\n <p>\n ${input.before ? revisionText('revision-value', { n: input.before.revisionNumber }) : revisionText('new')} →\n ${revisionText('revision-value', { n: input.after.revisionNumber })}\n </p>\n </div>\n <div>\n <span class=\"muted\">${revisionText('effectiveFrom')}</span>\n <p>${revisionDate(input.effectiveFrom)} · ${Intl.DateTimeFormat().resolvedOptions().timeZone}</p>\n </div>\n <div>\n <span class=\"muted\">${revisionText('reason')}</span>\n <p>${input.reason}</p>\n </div>\n </div>\n <p class=\"impact\">${revisionText(axis === 'workShift' ? 'shift-impact' : axis === 'recipeDefinition' ? 'recipe-impact' : axis === 'materialDefinition' ? 'material-impact' : 'spec-impact')}</p>\n <ops-master-revision-comparison\n .axis=${axis}\n .before=${input.before}\n .after=${input.after}\n ></ops-master-revision-comparison>\n <details>\n <summary>${revisionText('full-content')}</summary>\n ${revisionContents(input.after, axis)}\n </details>\n <p class=\"muted\">${revisionText('signed-correction')}</p>`\n }\n}\n\nexport function revisionContents(value: any, axis: RevisionAxis) {\n if (axis === 'workShift') return html`<p>${revisionText('timezone')}: ${value.timezone}</p>\n <div class=\"scroll\"><table><thead><tr>${['name','fromDate','fromTime','toDate','toTime','daysOfWeek'].map(f => html`<th>${revisionText(f)}</th>`)}</tr></thead>\n <tbody>${(value.shifts ?? []).map(row => html`<tr><td>${row.name}${row.description ? html`<br /><span class=\"muted\">${row.description}</span>` : ''}</td><td>${revisionText('day-offset-' + row.fromDate)}</td><td>${row.fromTime}</td><td>${revisionText('day-offset-' + row.toDate)}</td><td>${row.toTime}</td><td>${row.daysOfWeek ? row.daysOfWeek.split(',').map(day => revisionText('weekday-' + day)).join(', ') : revisionText('every-day')}</td></tr>`)}</tbody></table></div>`\n\n if (axis === 'materialDefinition') return materialRevisionFields(value)\n return (axis === 'recipeDefinition' ? ['inputs', 'outputs'] : ['criteria']).map(section => {\n const fields =\n section === 'criteria'\n ? ['id', 'description', 'evaluatedPropertyId', 'minimum', 'maximum', 'uom', 'expression']\n : section === 'inputs'\n ? ['material', 'qty', 'operation']\n : ['material', 'qty']\n return html`<h3>${revisionText(section)}</h3>\n <div class=\"scroll\">\n <table class=${section === 'criteria' ? 'criteria' : ''}>\n <thead>\n <tr>\n ${fields.map(field => html`<th>${revisionText(field)}</th>`)}\n </tr>\n </thead>\n <tbody>\n ${(value[section] ?? []).map(\n (row: any) =>\n html`<tr>\n ${fields.map(field => html`<td>${(section === 'criteria' && ['minimum', 'maximum', 'uom'].includes(field) ? row.limit?.[field] : row[field]) ?? '—'}</td>`)}\n </tr>`\n )}\n </tbody>\n </table>\n </div>`\n })\n}\n\n/** Read-only revision contents. Layout, scrolling and closing belong to the common dock. */\n@customElement('ops-master-revision-360')\nexport class MasterRevision360 extends localize(i18next)(LitElement) {\n static styles = [\n ...MasterRevisionReview.styles,\n css`\n :host {\n display: block;\n min-height: 0;\n }\n section {\n margin: 16px 0;\n border-top: 1px solid var(--ui-line);\n padding-top: 8px;\n }\n table.criteria { min-width: 640px; }\n th, td { overflow-wrap: normal; word-break: normal; }\n dl {\n display: grid;\n grid-template-columns: minmax(110px, 1fr) minmax(0, 3fr);\n gap: 8px 16px;\n }\n dt {\n color: var(--md-sys-color-on-surface-variant);\n }\n dd {\n margin: 0;\n overflow-wrap: anywhere;\n }\n `\n ]\n @property() side: RevisionSide = 'after'\n @property({ attribute: false }) input: any\n @property({ attribute: false }) activityApproval: any\n render() {\n const row = this.input?.[this.side]\n if (!row?.detail) return html`<p role=\"alert\">${revisionText('detail-unavailable')}</p>`\n const recipe = !!this.input.revision.recipeId\n const axis: RevisionAxis = this.input.revision.arrangementId ? 'workShift' : recipe ? 'recipeDefinition' : this.input.revision.materialId ? 'materialDefinition' : 'testSpecification'\n const state = String(this.activityApproval?.activityThread?.activityInstance?.state ?? '').toLowerCase()\n const judgment = String(this.activityApproval?.judgment ?? '').toLowerCase()\n const status =\n this.side === 'before'\n ? 'approval-baseline'\n : judgment === 'rejected'\n ? 'rejected'\n : state === 'ended'\n ? 'approved'\n : state === 'aborted'\n ? 'aborted'\n : 'pending'\n return html`<article>\n <p>\n <span class=\"pill\">${revisionText(this.side)}</span> ·\n ${revisionText('revision-value', { n: row.revisionNumber })} · ${revisionText(status)}\n </p>\n <p class=\"impact\">${revisionText('fixed-review-context')}</p>\n <section>\n <h3>${revisionText('summary')}</h3>\n <dl>\n <dt>${revisionText('description')}</dt>\n <dd>${row.description || '—'}</dd>\n ${\n recipe\n ? html`<dt>${revisionText('materialDefinitionName')}</dt>\n <dd>${row.materialDefinitionName}</dd>\n <dt>${revisionText('route')}</dt>\n <dd>${row.route || '—'}</dd>`\n : axis === 'materialDefinition' || axis === 'workShift' ? '' : html`<dt>${revisionText('version')}</dt>\n <dd>${row.version}</dd>`\n }\n </dl>\n ${revisionContents(row, axis)}\n </section>\n <section>\n <h3>${revisionText('state')}</h3>\n <dl>\n <dt>${revisionText(this.side === 'before' ? 'baseline-period' : 'proposed-start')}</dt>\n <dd>\n ${revisionDate(row.detail.validFrom ?? row.detail.effectiveFrom)}${this.side === 'before' ? html` → ${row.detail.validTo ? revisionDate(row.detail.validTo) : revisionText('until-change')}` : ''}\n </dd>\n <dt>${revisionText('time-zone')}</dt>\n <dd>${Intl.DateTimeFormat().resolvedOptions().timeZone}</dd>\n </dl>\n <p>${revisionText(this.side === 'before' ? 'baseline-period-hint' : 'proposed-start-hint')}</p>\n </section>\n <section>\n <h3>${revisionText('related-entities')}</h3>\n ${\n recipe\n ? html`<p>\n ${revisionText('inputs')}: ${[...new Set((row.inputs ?? []).map((r: any) => r.material))].join(', ')}\n </p>\n <p>\n ${revisionText('outputs')}:\n ${[...new Set((row.outputs ?? []).map((r: any) => r.material))].join(', ')}\n </p>\n <p>\n ${revisionText('operation')}:\n ${[...new Set((row.inputs ?? []).map((r: any) => r.operation).filter(Boolean))].join(', ') || '—'}\n </p>`\n : ''\n }\n <p class=\"muted\">${revisionText('relation-scope')}</p>\n </section>\n <section>\n <h3>${revisionText('history')}</h3>\n <dl>\n <dt>${revisionText('created')}</dt>\n <dd>${revisionDate(row.detail.createdAt)}</dd>\n <dt>${revisionText('frozen')}</dt>\n <dd>${revisionDate(row.detail.frozenAt)}</dd>\n <dt>${revisionText('reason')}</dt>\n <dd>${row.detail.reason}</dd>\n </dl>\n <p class=\"muted\">${revisionText('history-scope')}</p>\n </section>\n <details>\n <summary>${revisionText('technical-details')}</summary>\n <dl>\n <dt>Revision ID</dt>\n <dd>${row.detail.revisionId}</dd>\n </dl>\n </details>\n </article>`\n }\n}\n"]}
1
+ {"version":3,"file":"revision-comparison.js","sourceRoot":"","sources":["../../../client/pages/master/revision-comparison.ts"],"names":[],"mappings":"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","sourcesContent":["import { addressController, writeAddress } from '@operato/utils/address.js'\nimport { materialRevisionFields } from './material-revision-fields.js'\nimport { LitElement, html, css } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { showEntity360, hideEntity360, navigateEntity360, canGoBackEntity360 } from '@operato/layout'\nimport { i18next, localize } from '@operato/i18n'\nimport { ScrollbarStyles } from '@operato/styles'\nimport {\n revisionDifferences,\n RevisionAxis,\n RevisionSide,\n revisionDetailAddress,\n revisionSideAt,\n isBaseline,\n reasonOf\n} from './revision-view.js'\n\nexport const revisionText = (key: string, params: any = {}): string => String(i18next.t('revision-ui.' + key, params))\nexport const revisionDate = (value?: string) =>\n value\n ? new Intl.DateTimeFormat(i18next.language || 'en', { dateStyle: 'medium', timeStyle: 'short' }).format(\n new Date(value)\n )\n : '—'\nexport const revisionStyles = css`\n .material-property { border: 1px solid var(--ui-line, #ddd); margin: 12px 0; padding: 12px; min-width: 0; }\n .material-property legend { font-weight: 600; padding: 0 6px; }\n .material-property-values { display: grid; grid-template-columns: minmax(70px, 1fr) minmax(0, 3fr); gap: 8px; }\n .material-property-values dt { color: var(--md-sys-color-on-surface-variant); }\n .material-property-values dd { margin: 0; overflow-wrap: anywhere; }\n :host {\n color: var(--md-sys-color-on-surface);\n font: inherit;\n }\n table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--ui-t-small, 13px);\n }\n th,\n td {\n padding: 10px 12px;\n border-bottom: 1px solid var(--ui-line);\n text-align: left;\n vertical-align: top;\n overflow-wrap: anywhere;\n }\n th {\n color: var(--md-sys-color-on-surface-variant);\n font-weight: 600;\n }\n .scroll {\n overflow: auto;\n }\n .muted {\n color: var(--md-sys-color-on-surface-variant);\n }\n .pill {\n display: inline-block;\n padding: 3px 8px;\n border-radius: 4px;\n background: var(--md-sys-color-secondary-container);\n color: var(--md-sys-color-on-secondary-container);\n }\n .before {\n color: var(--md-sys-color-on-surface-variant);\n }\n .after {\n font-weight: 600;\n }\n h3 {\n font-size: var(--ui-t-title, 16px);\n margin: 16px 0 10px;\n }\n button {\n font: inherit;\n min-height: var(--form-action-height, 32px);\n padding: 4px 12px;\n border: 1px solid var(--ui-line);\n border-radius: 4px;\n color: inherit;\n background: var(--md-sys-color-surface);\n cursor: pointer;\n }\n button.primary {\n background: var(--md-sys-color-primary);\n color: var(--md-sys-color-on-primary);\n border-color: transparent;\n }\n button:disabled {\n opacity: 0.5;\n cursor: default;\n }\n button:focus-visible,\n a:focus-visible,\n input:focus-visible,\n textarea:focus-visible,\n select:focus-visible,\n summary:focus-visible {\n outline: 2px solid var(--md-sys-color-primary);\n outline-offset: 3px;\n }\n details {\n margin: 12px 0;\n }\n summary {\n cursor: pointer;\n padding: 8px 0;\n }\n`\n@customElement('ops-master-revision-comparison')\nexport class MasterRevisionComparison extends localize(i18next)(LitElement) {\n static styles = [ScrollbarStyles, revisionStyles]\n @property() axis: RevisionAxis = 'testSpecification'\n @property({ attribute: false }) before: any\n @property({ attribute: false }) after: any\n private display(field: string, value: unknown) {\n if (value === undefined || value === null) return '—'\n if (this.axis === 'workShift') {\n if (field === 'fromDate' || field === 'toDate') return revisionText('day-offset-' + value)\n if (field === 'daysOfWeek') return String(value).split(',').map(day => revisionText('weekday-' + day)).join(', ')\n }\n return value\n }\n render() {\n const changes = revisionDifferences(this.axis, this.before, this.after)\n return html`<h3>\n ${revisionText('changes')} <span class=\"pill\">${revisionText('change-count', { count: changes.length })}</span>\n </h3>\n ${!this.before ? html`<p class=\"muted\">${revisionText('new-baseline')}</p>` : ''}\n ${\n changes.length\n ? html`<div class=\"scroll\">\n <table>\n <thead>\n <tr>\n <th>${revisionText('change-kind')}</th>\n <th>${revisionText('item')}</th>\n <th>${revisionText('before')}</th>\n <th>${revisionText('after')}</th>\n </tr>\n </thead>\n <tbody>\n ${changes.map(\n row =>\n html`<tr>\n <td><span class=\"pill\">${revisionText(row.kind)}</span></td>\n <td>\n ${revisionText(row.section)}${row.label ? ' · ' + row.label : ''}<br />${revisionText(row.field)}\n </td>\n <td class=\"before\">${this.display(row.field, row.before)}</td>\n <td class=\"after\">${this.display(row.field, row.after)}</td>\n </tr>`\n )}\n </tbody>\n </table>\n </div>`\n : html`<p>${revisionText('no-content-change')}</p>`\n }`\n }\n}\n\n/** Uses the existing Worklist custom-element slot. No Worklist dependency in the master module. */\n@customElement('ops-master-revision-review')\nexport class MasterRevisionReview extends localize(i18next)(LitElement) {\n static styles = [\n ScrollbarStyles,\n revisionStyles,\n css`\n :host {\n display: block;\n padding: 20px;\n box-sizing: border-box;\n }\n .facts {\n display: flex;\n flex-wrap: wrap;\n gap: 24px;\n margin: 20px 0;\n }\n .facts p {\n margin: 4px 0;\n }\n .impact {\n padding: 12px;\n background: var(--md-sys-color-surface-container);\n }\n h2 {\n margin: 0;\n font-size: var(--ui-t-title, 20px);\n }\n .entity-links {\n display: flex;\n flex-wrap: wrap;\n gap: 16px 32px;\n }\n .entity-links a {\n display: inline-block;\n padding: 8px 0;\n color: var(--md-sys-color-primary);\n text-underline-offset: 3px;\n }\n `\n ]\n @property({ attribute: false }) input: any\n @property({ attribute: false }) activityApproval: any\n @state() private detailError = ''\n // Worklist recreates custom views on shell updates. The common dock has a stable owner.\n private static dockOwner = {}\n private static activeReview?: MasterRevisionReview\n private static enabled = false\n private static detailPath = ''\n private static detailRevision = ''\n private static stopAddress?: () => void\n private static onAddress = () => requestAnimationFrame(() => MasterRevisionReview.activeReview?.syncDetail())\n connectedCallback() {\n super.connectedCallback()\n MasterRevisionReview.activeReview = this\n // One provider listener, not one view listener: routing may disconnect a view during dispatch.\n MasterRevisionReview.stopAddress ??= addressController().subscribe(MasterRevisionReview.onAddress, false)\n }\n disconnectedCallback() {\n if (MasterRevisionReview.activeReview === this) MasterRevisionReview.activeReview = undefined\n requestAnimationFrame(() => {\n if (!MasterRevisionReview.activeReview) {\n hideEntity360(MasterRevisionReview.dockOwner, false)\n MasterRevisionReview.enabled = false\n }\n })\n super.disconnectedCallback()\n }\n updated(changes: any) {\n super.updated(changes)\n if (changes.has('input') && MasterRevisionReview.enabled) {\n if (location.pathname !== MasterRevisionReview.detailPath ||\n this.input?.after?.detail?.revisionId !== MasterRevisionReview.detailRevision) {\n hideEntity360(MasterRevisionReview.dockOwner, false)\n MasterRevisionReview.enabled = false\n } else this.syncDetail()\n }\n }\n private syncDetail() {\n if (MasterRevisionReview.activeReview !== this || !MasterRevisionReview.enabled) return\n if (location.pathname !== MasterRevisionReview.detailPath) {\n MasterRevisionReview.enabled = false\n hideEntity360(MasterRevisionReview.dockOwner, false)\n return\n }\n try {\n const side = revisionSideAt(this.input, location.href)\n if (side) this.showDetail(side)\n else hideEntity360(MasterRevisionReview.dockOwner)\n } catch {\n hideEntity360(MasterRevisionReview.dockOwner)\n this.detailError = revisionText('detail-unavailable')\n }\n }\n private async closeDetail() {\n const url = new URL(location.href)\n url.searchParams.delete('f')\n url.searchParams.delete('revision')\n const { entity360Previous: _previous, ...state } = history.state ?? {}\n if (!(await writeAddress(url, { state, replace: true }))) return\n hideEntity360(MasterRevisionReview.dockOwner)\n }\n private showDetail(side: RevisionSide, opener?: HTMLElement) {\n const row = this.input[side]\n showEntity360(MasterRevisionReview.dockOwner, {\n key: revisionDetailAddress(this.input, side, location.href),\n title: this.input.headline,\n context: `${revisionText(side)} · ${revisionText('revision-value', { n: row.revisionNumber })}`,\n labels: { close: revisionText('dock-close'), expand: revisionText('dock-expand'), collapse: revisionText('dock-collapse'),\n resize: revisionText('dock-resize'), back: revisionText('dock-back') },\n onClose: () => (MasterRevisionReview.activeReview ?? this).closeDetail(),\n onBack: canGoBackEntity360() ? () => history.back() : undefined,\n content: html`<ops-master-revision-360 .input=${this.input} .side=${side}\n .activityApproval=${this.activityApproval}></ops-master-revision-360>`\n }, () => {\n const target = opener?.isConnected ? opener : MasterRevisionReview.activeReview?.renderRoot.querySelector<HTMLElement>(`[data-detail=\"${side}\"]`)\n target?.focus({ preventScroll: true })\n })\n }\n private async openDetail(side: RevisionSide, opener?: HTMLElement) {\n try {\n const address = revisionDetailAddress(this.input, side, location.href)\n this.detailError = ''\n if (!MasterRevisionReview.enabled && new URL(location.href).searchParams.has('f')) {\n const base = new URL(location.href)\n base.searchParams.delete('f')\n base.searchParams.delete('revision')\n const { entity360Previous: _previous, ...state } = history.state ?? {}\n if (!(await writeAddress(base, { state, replace: true }))) return\n }\n if (!(await navigateEntity360(address))) return\n MasterRevisionReview.enabled = true\n MasterRevisionReview.detailPath = location.pathname\n MasterRevisionReview.detailRevision = this.input.after.detail.revisionId\n this.showDetail(side, opener)\n } catch {\n this.detailError = revisionText('detail-unavailable')\n }\n }\n private entityLink(side: RevisionSide) {\n const row = this.input[side]\n if (!row) return html`<span>${revisionText('no-before')}</span>`\n // A URL alone never opens a modal. Inspection is always an explicit user action.\n if (!row.detail) return html`<span>${revisionText('detail-unavailable')}</span>`\n return html`<div>\n <span class=\"muted\">${revisionText(side)}</span><br />\n <a href=${revisionDetailAddress(this.input, side, location.href)} data-detail=${side}\n @click=${(event: MouseEvent) => {\n if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return\n event.preventDefault()\n this.openDetail(side, event.currentTarget as HTMLElement)\n }}>${this.input.headline} · ${revisionText('revision-value', { n: row.revisionNumber })}</a>\n </div>`\n }\n render() {\n const input = this.input\n if (!input) return html``\n const axis: RevisionAxis = input.revision?.arrangementId ? 'workShift' : input.revision?.recipeId ? 'recipeDefinition' : input.revision?.materialId ? 'materialDefinition' : 'testSpecification'\n return html`<h2>${input.headline}</h2>\n <div class=\"entity-links\">${this.entityLink('before')}${this.entityLink('after')}</div>\n ${this.detailError ? html`<p role=\"alert\">${this.detailError}</p>` : ''}\n <div class=\"facts\">\n <div>\n <span class=\"muted\">${revisionText('revision')}</span>\n <p>\n ${input.before ? revisionText('revision-value', { n: input.before.revisionNumber }) : revisionText('new')} →\n ${revisionText('revision-value', { n: input.after.revisionNumber })}\n </p>\n </div>\n <div>\n <span class=\"muted\">${revisionText('effectiveFrom')}</span>\n <p>${revisionDate(input.effectiveFrom)} · ${Intl.DateTimeFormat().resolvedOptions().timeZone}</p>\n </div>\n <div>\n <span class=\"muted\">${revisionText('reason')}</span>\n <p>${input.reason}</p>\n </div>\n </div>\n <p class=\"impact\">${revisionText(axis === 'workShift' ? 'shift-impact' : axis === 'recipeDefinition' ? 'recipe-impact' : axis === 'materialDefinition' ? 'material-impact' : 'spec-impact')}</p>\n <ops-master-revision-comparison\n .axis=${axis}\n .before=${input.before}\n .after=${input.after}\n ></ops-master-revision-comparison>\n <details>\n <summary>${revisionText('full-content')}</summary>\n ${revisionContents(input.after, axis)}\n </details>\n <p class=\"muted\">${revisionText('signed-correction')}</p>`\n }\n}\n\nexport function revisionContents(value: any, axis: RevisionAxis) {\n if (axis === 'workShift') return html`<p>${revisionText('timezone')}: ${value.timezone}</p>\n <div class=\"scroll\"><table><thead><tr>${['name','fromDate','fromTime','toDate','toTime','daysOfWeek'].map(f => html`<th>${revisionText(f)}</th>`)}</tr></thead>\n <tbody>${(value.shifts ?? []).map(row => html`<tr><td>${row.name}${row.description ? html`<br /><span class=\"muted\">${row.description}</span>` : ''}</td><td>${revisionText('day-offset-' + row.fromDate)}</td><td>${row.fromTime}</td><td>${revisionText('day-offset-' + row.toDate)}</td><td>${row.toTime}</td><td>${row.daysOfWeek ? row.daysOfWeek.split(',').map(day => revisionText('weekday-' + day)).join(', ') : revisionText('every-day')}</td></tr>`)}</tbody></table></div>`\n\n if (axis === 'materialDefinition') return materialRevisionFields(value)\n return (axis === 'recipeDefinition' ? ['inputs', 'outputs'] : ['criteria']).map(section => {\n const fields =\n section === 'criteria'\n ? ['id', 'description', 'evaluatedPropertyId', 'minimum', 'maximum', 'uom', 'expression']\n : section === 'inputs'\n ? ['material', 'qty', 'operation']\n : ['material', 'qty']\n return html`<h3>${revisionText(section)}</h3>\n <div class=\"scroll\">\n <table class=${section === 'criteria' ? 'criteria' : ''}>\n <thead>\n <tr>\n ${fields.map(field => html`<th>${revisionText(field)}</th>`)}\n </tr>\n </thead>\n <tbody>\n ${(value[section] ?? []).map(\n (row: any) =>\n html`<tr>\n ${fields.map(field => html`<td>${(section === 'criteria' && ['minimum', 'maximum', 'uom'].includes(field) ? row.limit?.[field] : row[field]) ?? '—'}</td>`)}\n </tr>`\n )}\n </tbody>\n </table>\n </div>`\n })\n}\n\n/** Read-only revision contents. Layout, scrolling and closing belong to the common dock. */\n@customElement('ops-master-revision-360')\nexport class MasterRevision360 extends localize(i18next)(LitElement) {\n static styles = [\n ...MasterRevisionReview.styles,\n css`\n :host {\n display: block;\n min-height: 0;\n }\n section {\n margin: 16px 0;\n border-top: 1px solid var(--ui-line);\n padding-top: 8px;\n }\n table.criteria { min-width: 640px; }\n th, td { overflow-wrap: normal; word-break: normal; }\n dl {\n display: grid;\n grid-template-columns: minmax(110px, 1fr) minmax(0, 3fr);\n gap: 8px 16px;\n }\n dt {\n color: var(--md-sys-color-on-surface-variant);\n }\n dd {\n margin: 0;\n overflow-wrap: anywhere;\n }\n `\n ]\n @property() side: RevisionSide = 'after'\n @property({ attribute: false }) input: any\n @property({ attribute: false }) activityApproval: any\n render() {\n const row = this.input?.[this.side]\n if (!row?.detail) return html`<p role=\"alert\">${revisionText('detail-unavailable')}</p>`\n const recipe = !!this.input.revision.recipeId\n const axis: RevisionAxis = this.input.revision.arrangementId ? 'workShift' : recipe ? 'recipeDefinition' : this.input.revision.materialId ? 'materialDefinition' : 'testSpecification'\n const state = String(this.activityApproval?.activityThread?.activityInstance?.state ?? '').toLowerCase()\n const judgment = String(this.activityApproval?.judgment ?? '').toLowerCase()\n const status =\n this.side === 'before'\n ? 'approval-baseline'\n : judgment === 'rejected'\n ? 'rejected'\n : state === 'ended'\n ? 'approved'\n : state === 'aborted'\n ? 'aborted'\n : 'pending'\n return html`<article>\n <p>\n <span class=\"pill\">${revisionText(this.side)}</span> ·\n ${revisionText('revision-value', { n: row.revisionNumber })} · ${revisionText(status)}\n </p>\n <p class=\"impact\">${revisionText('fixed-review-context')}</p>\n <section>\n <h3>${revisionText('summary')}</h3>\n <dl>\n <dt>${revisionText('description')}</dt>\n <dd>${row.description || '—'}</dd>\n ${\n recipe\n ? html`<dt>${revisionText('materialDefinitionName')}</dt>\n <dd>${row.materialDefinitionName}</dd>\n <dt>${revisionText('route')}</dt>\n <dd>${row.route || '—'}</dd>`\n : axis === 'materialDefinition' || axis === 'workShift' ? '' : html`<dt>${revisionText('version')}</dt>\n <dd>${row.version}</dd>`\n }\n </dl>\n ${revisionContents(row, axis)}\n </section>\n <section>\n <h3>${revisionText('state')}</h3>\n <dl>\n <dt>${revisionText(this.side === 'before' ? 'baseline-period' : 'proposed-start')}</dt>\n <dd>\n ${revisionDate(row.detail.validFrom ?? row.detail.effectiveFrom)}${this.side === 'before' ? html` → ${row.detail.validTo ? revisionDate(row.detail.validTo) : revisionText('until-change')}` : ''}\n </dd>\n <dt>${revisionText('time-zone')}</dt>\n <dd>${Intl.DateTimeFormat().resolvedOptions().timeZone}</dd>\n </dl>\n <p>${revisionText(this.side === 'before' ? 'baseline-period-hint' : 'proposed-start-hint')}</p>\n </section>\n <section>\n <h3>${revisionText('related-entities')}</h3>\n ${\n recipe\n ? html`<p>\n ${revisionText('inputs')}: ${[...new Set((row.inputs ?? []).map((r: any) => r.material))].join(', ')}\n </p>\n <p>\n ${revisionText('outputs')}:\n ${[...new Set((row.outputs ?? []).map((r: any) => r.material))].join(', ')}\n </p>\n <p>\n ${revisionText('operation')}:\n ${[...new Set((row.inputs ?? []).map((r: any) => r.operation).filter(Boolean))].join(', ') || '—'}\n </p>`\n : ''\n }\n <p class=\"muted\">${revisionText('relation-scope')}</p>\n </section>\n <section>\n <h3>${revisionText('history')}</h3>\n <dl>\n <dt>${revisionText('created')}</dt>\n <dd>${revisionDate(row.detail.createdAt)}</dd>\n <dt>${revisionText('frozen')}</dt>\n <dd>${revisionDate(row.detail.frozenAt)}</dd>\n <dt>${revisionText('reason')}</dt>\n <dd>\n ${reasonOf(row.detail, revisionText('first-record'))}\n ${isBaseline(row.detail) ? html`<div class=\"muted\">${revisionText('first-record-why')}</div>` : ''}\n </dd>\n </dl>\n <p class=\"muted\">${revisionText('history-scope')}</p>\n </section>\n <details>\n <summary>${revisionText('technical-details')}</summary>\n <dl>\n <dt>Revision ID</dt>\n <dd>${row.detail.revisionId}</dd>\n </dl>\n </details>\n </article>`\n }\n}\n"]}
@@ -2,6 +2,21 @@
2
2
  /** Flatten only for comparison labels. The stored structure and sibling order remain intact. */
3
3
  export declare function materialDifferenceValues(value: any): Map<string, unknown>;
4
4
  export type RevisionAxis = 'recipeDefinition' | 'testSpecification' | 'materialDefinition' | 'workShift';
5
+ /** How a revision was published, from the plan that published it; null until then. */
6
+ export type ReleaseKind = 'approved' | 'policy' | 'baseline';
7
+ /**
8
+ * The first revision the server recorded from the row already in use, when revisions began. Nobody wrote its
9
+ * reason - the server did, for engineers - so the screen names it in the reader's words instead. Known by how it
10
+ * was published, never by its wording or its number.
11
+ */
12
+ export declare function isBaseline(row: {
13
+ releaseKind?: ReleaseKind | null;
14
+ } | null | undefined): boolean;
15
+ /** The reason as a person reads it: what its author wrote, or `baseline` for the recorded first revision. */
16
+ export declare function reasonOf(row: {
17
+ reason?: string;
18
+ releaseKind?: ReleaseKind | null;
19
+ } | null | undefined, baseline: string): string;
5
20
  export type RevisionSide = 'before' | 'after';
6
21
  /** A detail address is scoped to the already-authorized approval, not a general revision lookup. */
7
22
  export declare function revisionDetailAddress(input: any, side: RevisionSide, href: string): string;
@@ -14,6 +14,18 @@ export function materialDifferenceValues(value) {
14
14
  walk(value?.properties ?? [], 'properties');
15
15
  return entries;
16
16
  }
17
+ /**
18
+ * The first revision the server recorded from the row already in use, when revisions began. Nobody wrote its
19
+ * reason - the server did, for engineers - so the screen names it in the reader's words instead. Known by how it
20
+ * was published, never by its wording or its number.
21
+ */
22
+ export function isBaseline(row) {
23
+ return row?.releaseKind === 'baseline';
24
+ }
25
+ /** The reason as a person reads it: what its author wrote, or `baseline` for the recorded first revision. */
26
+ export function reasonOf(row, baseline) {
27
+ return isBaseline(row) ? baseline : row?.reason ?? '';
28
+ }
17
29
  /** A detail address is scoped to the already-authorized approval, not a general revision lookup. */
18
30
  export function revisionDetailAddress(input, side, href) {
19
31
  const row = input?.[side];
@@ -1 +1 @@
1
- {"version":3,"file":"revision-view.js","sourceRoot":"","sources":["../../../client/pages/master/revision-view.ts"],"names":[],"mappings":"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","sourcesContent":["/** View calculations only. IDs are comparison keys, never display labels. */\n/** Flatten only for comparison labels. The stored structure and sibling order remain intact. */\nexport function materialDifferenceValues(value: any): Map<string, unknown> {\n const entries = new Map<string, unknown>()\n for (const field of ['description', 'materialClassIds', 'testSpecificationIds']) entries.set(field, value?.[field] ?? (field === 'description' ? '' : []))\n const walk = (rows: any[], parent: string) => rows.forEach((row, index) => {\n const key = `${parent}/${row.id}${row.uom ? ' (' + row.uom + ')' : ''}`\n entries.set(key + '/position', index + 1)\n for (const field of ['description', 'value', 'dataType', 'uom', 'classPropertyId', 'source']) entries.set(key + '/' + field, row[field] ?? '')\n walk(row.children ?? [], key)\n })\n walk(value?.properties ?? [], 'properties')\n return entries\n}\nexport type RevisionAxis = 'recipeDefinition' | 'testSpecification' | 'materialDefinition' | 'workShift'\nexport type RevisionSide = 'before' | 'after'\n\n/** A detail address is scoped to the already-authorized approval, not a general revision lookup. */\nexport function revisionDetailAddress(input: any, side: RevisionSide, href: string): string {\n const row = input?.[side]\n if (!row?.detail?.revisionId) throw new Error('Revision detail is not available')\n const url = new URL(href)\n const recipe = !!input.revision?.recipeId\n url.searchParams.set(\n 'f',\n (input.revision?.arrangementId ? 'workShifts:' : recipe ? 'recipes:' : input.revision?.materialId ? 'materialDefinitions:' : 'testSpecifications:') + (input.revision.arrangementId ?? input.revision.recipeId ?? input.revision.materialId ?? input.revision.specId)\n )\n url.searchParams.set('revision', row.detail.revisionId)\n return url.href\n}\nexport function revisionSideAt(input: any, href: string): RevisionSide | undefined {\n const url = new URL(href)\n if (!url.searchParams.has('f') && !url.searchParams.has('revision')) return undefined\n for (const side of ['before', 'after'] as const) {\n if (!input?.[side]?.detail?.revisionId) continue\n const expected = new URL(revisionDetailAddress(input, side, href))\n if (\n expected.searchParams.get('f') === url.searchParams.get('f') &&\n expected.searchParams.get('revision') === url.searchParams.get('revision')\n )\n return side\n }\n throw new Error('The requested revision is not part of this approval')\n}\nexport interface Difference {\n section: string\n label: string\n field: string\n before: unknown\n after: unknown\n kind: 'added' | 'removed' | 'changed'\n}\nexport function revisionDifferences(axis: RevisionAxis, before: any, after: any): Difference[] {\n const out: Difference[] = []\n if (axis === 'workShift') {\n for (const field of ['description', 'timezone']) {\n if ((before?.[field] ?? '') !== (after?.[field] ?? '')) out.push({ section: 'general', label: '', field, before: before?.[field], after: after?.[field], kind: before ? 'changed' : 'added' })\n }\n const oldRows = before?.shifts ?? [], newRows = after?.shifts ?? []\n for (const name of new Set([...oldRows, ...newRows].map(row => row.name))) {\n const a = oldRows.find(row => row.name === name), b = newRows.find(row => row.name === name)\n for (const field of ['description','fromDate','fromTime','toDate','toTime','daysOfWeek']) {\n const display = (r: any) => r ? field === 'daysOfWeek' ? r[field] || '0,1,2,3,4,5,6' : r[field] : undefined\n if (display(a) !== display(b)) out.push({ section: 'shifts', label: String(name), field,\n before: display(a), after: display(b), kind: !a ? 'added' : !b ? 'removed' : 'changed' })\n }\n }\n return out\n }\n if (axis === 'materialDefinition') {\n const a = materialDifferenceValues(before), b = materialDifferenceValues(after)\n for (const key of new Set([...a.keys(), ...b.keys()])) {\n if (JSON.stringify(a.get(key)) === JSON.stringify(b.get(key))) continue\n const parts = key.split('/')\n out.push({ section: parts.length > 1 ? 'properties' : 'general', label: parts.slice(1, -1).join(' / '),\n field: parts[parts.length - 1], before: Array.isArray(a.get(key)) ? (a.get(key) as string[]).join(', ') : a.get(key),\n after: Array.isArray(b.get(key)) ? (b.get(key) as string[]).join(', ') : b.get(key), kind: !a.has(key) ? 'added' : !b.has(key) ? 'removed' : 'changed' })\n }\n return out\n }\n for (const field of axis === 'recipeDefinition'\n ? ['description', 'materialDefinitionName', 'route']\n : ['description', 'version']) {\n if ((before?.[field] ?? '') !== (after?.[field] ?? ''))\n out.push({\n section: 'general',\n label: '',\n field,\n before: before?.[field],\n after: after?.[field],\n kind: !before ? 'added' : 'changed'\n })\n }\n for (const section of axis === 'recipeDefinition' ? ['inputs', 'outputs'] : ['criteria']) {\n const oldRows = before?.[section] ?? [],\n newRows = after?.[section] ?? []\n const key = (row: any) => (axis === 'recipeDefinition' ? row.lineKey : row.id)\n const keys = [...new Set([...oldRows, ...newRows].map(key))]\n for (const id of keys) {\n const a = oldRows.find((row: any) => key(row) === id),\n b = newRows.find((row: any) => key(row) === id)\n const fields =\n section === 'criteria'\n ? ['id', 'description', 'evaluatedPropertyId', 'minimum', 'maximum', 'uom', 'expression']\n : section === 'inputs'\n ? ['material', 'qty', 'operation']\n : ['material', 'qty']\n if (a && b && oldRows.indexOf(a) !== newRows.indexOf(b))\n out.push({\n section,\n label: b.material || b.description || b.id || '',\n field: 'position',\n before: oldRows.indexOf(a) + 1,\n after: newRows.indexOf(b) + 1,\n kind: 'changed'\n })\n const value = (row: any, field: string) =>\n section === 'criteria' && ['minimum', 'maximum', 'uom'].includes(field) ? row?.limit?.[field] : row?.[field]\n for (const field of fields)\n if ((value(a, field) ?? '') !== (value(b, field) ?? ''))\n out.push({\n section,\n label: b?.material ?? a?.material ?? b?.description ?? a?.description ?? b?.id ?? a?.id ?? '',\n field,\n before: value(a, field),\n after: value(b, field),\n kind: !a ? 'added' : !b ? 'removed' : 'changed'\n })\n }\n }\n return out\n}\nexport function localDateTime(iso: string): string {\n const date = new Date(iso)\n if (!Number.isFinite(date.getTime())) return ''\n return new Date(date.getTime() - date.getTimezoneOffset() * 60000).toISOString().slice(0, 16)\n}\nexport function isoFromLocal(value: string): string {\n const date = new Date(value)\n if (!value || !Number.isFinite(date.getTime()) || localDateTime(date.toISOString()) !== value.slice(0, 16))\n throw new Error('Invalid local date/time')\n return date.toISOString()\n}\n"]}
1
+ {"version":3,"file":"revision-view.js","sourceRoot":"","sources":["../../../client/pages/master/revision-view.ts"],"names":[],"mappings":"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","sourcesContent":["/** View calculations only. IDs are comparison keys, never display labels. */\n/** Flatten only for comparison labels. The stored structure and sibling order remain intact. */\nexport function materialDifferenceValues(value: any): Map<string, unknown> {\n const entries = new Map<string, unknown>()\n for (const field of ['description', 'materialClassIds', 'testSpecificationIds']) entries.set(field, value?.[field] ?? (field === 'description' ? '' : []))\n const walk = (rows: any[], parent: string) => rows.forEach((row, index) => {\n const key = `${parent}/${row.id}${row.uom ? ' (' + row.uom + ')' : ''}`\n entries.set(key + '/position', index + 1)\n for (const field of ['description', 'value', 'dataType', 'uom', 'classPropertyId', 'source']) entries.set(key + '/' + field, row[field] ?? '')\n walk(row.children ?? [], key)\n })\n walk(value?.properties ?? [], 'properties')\n return entries\n}\nexport type RevisionAxis = 'recipeDefinition' | 'testSpecification' | 'materialDefinition' | 'workShift'\n/** How a revision was published, from the plan that published it; null until then. */\nexport type ReleaseKind = 'approved' | 'policy' | 'baseline'\n/**\n * The first revision the server recorded from the row already in use, when revisions began. Nobody wrote its\n * reason - the server did, for engineers - so the screen names it in the reader's words instead. Known by how it\n * was published, never by its wording or its number.\n */\nexport function isBaseline(row: { releaseKind?: ReleaseKind | null } | null | undefined): boolean {\n return row?.releaseKind === 'baseline'\n}\n/** The reason as a person reads it: what its author wrote, or `baseline` for the recorded first revision. */\nexport function reasonOf(row: { reason?: string; releaseKind?: ReleaseKind | null } | null | undefined, baseline: string): string {\n return isBaseline(row) ? baseline : row?.reason ?? ''\n}\nexport type RevisionSide = 'before' | 'after'\n\n/** A detail address is scoped to the already-authorized approval, not a general revision lookup. */\nexport function revisionDetailAddress(input: any, side: RevisionSide, href: string): string {\n const row = input?.[side]\n if (!row?.detail?.revisionId) throw new Error('Revision detail is not available')\n const url = new URL(href)\n const recipe = !!input.revision?.recipeId\n url.searchParams.set(\n 'f',\n (input.revision?.arrangementId ? 'workShifts:' : recipe ? 'recipes:' : input.revision?.materialId ? 'materialDefinitions:' : 'testSpecifications:') + (input.revision.arrangementId ?? input.revision.recipeId ?? input.revision.materialId ?? input.revision.specId)\n )\n url.searchParams.set('revision', row.detail.revisionId)\n return url.href\n}\nexport function revisionSideAt(input: any, href: string): RevisionSide | undefined {\n const url = new URL(href)\n if (!url.searchParams.has('f') && !url.searchParams.has('revision')) return undefined\n for (const side of ['before', 'after'] as const) {\n if (!input?.[side]?.detail?.revisionId) continue\n const expected = new URL(revisionDetailAddress(input, side, href))\n if (\n expected.searchParams.get('f') === url.searchParams.get('f') &&\n expected.searchParams.get('revision') === url.searchParams.get('revision')\n )\n return side\n }\n throw new Error('The requested revision is not part of this approval')\n}\nexport interface Difference {\n section: string\n label: string\n field: string\n before: unknown\n after: unknown\n kind: 'added' | 'removed' | 'changed'\n}\nexport function revisionDifferences(axis: RevisionAxis, before: any, after: any): Difference[] {\n const out: Difference[] = []\n if (axis === 'workShift') {\n for (const field of ['description', 'timezone']) {\n if ((before?.[field] ?? '') !== (after?.[field] ?? '')) out.push({ section: 'general', label: '', field, before: before?.[field], after: after?.[field], kind: before ? 'changed' : 'added' })\n }\n const oldRows = before?.shifts ?? [], newRows = after?.shifts ?? []\n for (const name of new Set([...oldRows, ...newRows].map(row => row.name))) {\n const a = oldRows.find(row => row.name === name), b = newRows.find(row => row.name === name)\n for (const field of ['description','fromDate','fromTime','toDate','toTime','daysOfWeek']) {\n const display = (r: any) => r ? field === 'daysOfWeek' ? r[field] || '0,1,2,3,4,5,6' : r[field] : undefined\n if (display(a) !== display(b)) out.push({ section: 'shifts', label: String(name), field,\n before: display(a), after: display(b), kind: !a ? 'added' : !b ? 'removed' : 'changed' })\n }\n }\n return out\n }\n if (axis === 'materialDefinition') {\n const a = materialDifferenceValues(before), b = materialDifferenceValues(after)\n for (const key of new Set([...a.keys(), ...b.keys()])) {\n if (JSON.stringify(a.get(key)) === JSON.stringify(b.get(key))) continue\n const parts = key.split('/')\n out.push({ section: parts.length > 1 ? 'properties' : 'general', label: parts.slice(1, -1).join(' / '),\n field: parts[parts.length - 1], before: Array.isArray(a.get(key)) ? (a.get(key) as string[]).join(', ') : a.get(key),\n after: Array.isArray(b.get(key)) ? (b.get(key) as string[]).join(', ') : b.get(key), kind: !a.has(key) ? 'added' : !b.has(key) ? 'removed' : 'changed' })\n }\n return out\n }\n for (const field of axis === 'recipeDefinition'\n ? ['description', 'materialDefinitionName', 'route']\n : ['description', 'version']) {\n if ((before?.[field] ?? '') !== (after?.[field] ?? ''))\n out.push({\n section: 'general',\n label: '',\n field,\n before: before?.[field],\n after: after?.[field],\n kind: !before ? 'added' : 'changed'\n })\n }\n for (const section of axis === 'recipeDefinition' ? ['inputs', 'outputs'] : ['criteria']) {\n const oldRows = before?.[section] ?? [],\n newRows = after?.[section] ?? []\n const key = (row: any) => (axis === 'recipeDefinition' ? row.lineKey : row.id)\n const keys = [...new Set([...oldRows, ...newRows].map(key))]\n for (const id of keys) {\n const a = oldRows.find((row: any) => key(row) === id),\n b = newRows.find((row: any) => key(row) === id)\n const fields =\n section === 'criteria'\n ? ['id', 'description', 'evaluatedPropertyId', 'minimum', 'maximum', 'uom', 'expression']\n : section === 'inputs'\n ? ['material', 'qty', 'operation']\n : ['material', 'qty']\n if (a && b && oldRows.indexOf(a) !== newRows.indexOf(b))\n out.push({\n section,\n label: b.material || b.description || b.id || '',\n field: 'position',\n before: oldRows.indexOf(a) + 1,\n after: newRows.indexOf(b) + 1,\n kind: 'changed'\n })\n const value = (row: any, field: string) =>\n section === 'criteria' && ['minimum', 'maximum', 'uom'].includes(field) ? row?.limit?.[field] : row?.[field]\n for (const field of fields)\n if ((value(a, field) ?? '') !== (value(b, field) ?? ''))\n out.push({\n section,\n label: b?.material ?? a?.material ?? b?.description ?? a?.description ?? b?.id ?? a?.id ?? '',\n field,\n before: value(a, field),\n after: value(b, field),\n kind: !a ? 'added' : !b ? 'removed' : 'changed'\n })\n }\n }\n return out\n}\nexport function localDateTime(iso: string): string {\n const date = new Date(iso)\n if (!Number.isFinite(date.getTime())) return ''\n return new Date(date.getTime() - date.getTimezoneOffset() * 60000).toISOString().slice(0, 16)\n}\nexport function isoFromLocal(value: string): string {\n const date = new Date(value)\n if (!value || !Number.isFinite(date.getTime()) || localDateTime(date.toISOString()) !== value.slice(0, 16))\n throw new Error('Invalid local date/time')\n return date.toISOString()\n}\n"]}
@@ -10,7 +10,7 @@ import { IDENTITY, MasterPageBase } from './master-page-base.js';
10
10
  import { requestMasterChangeApproval, masterChangeStatus } from '../../master-change-approval.js';
11
11
  import { revisionText as t, revisionDate as date, revisionStyles } from './revision-comparison.js';
12
12
  import { materialRevisionFields } from './material-revision-fields.js';
13
- import { localDateTime, isoFromLocal } from './revision-view.js';
13
+ import { localDateTime, isoFromLocal, isBaseline, reasonOf } from './revision-view.js';
14
14
  /** Shared workflow, not shared domain payload. Both consumers keep their existing page/URL identities. */
15
15
  export class RevisionWorkspace extends MasterPageBase {
16
16
  constructor() {
@@ -396,6 +396,7 @@ export class RevisionWorkspace extends MasterPageBase {
396
396
  activityInstanceId: undefined,
397
397
  editGeneration: undefined,
398
398
  baseRevisionId: undefined,
399
+ releaseKind: null,
399
400
  effectiveFrom: new Date().toISOString(),
400
401
  reason: ''
401
402
  };
@@ -637,7 +638,10 @@ export class RevisionWorkspace extends MasterPageBase {
637
638
  <td><button @click=${() => this.openRevision(row)}>${row.revisionNumber}</button></td>
638
639
  <td>${this.status(row)}</td>
639
640
  <td>${date(row.effectiveFrom)}</td>
640
- <td>${row.reason}</td>
641
+ <td>
642
+ ${reasonOf(row, t('first-record'))}
643
+ ${isBaseline(row) ? html `<div class="muted">${t('first-record-why')}</div>` : nothing}
644
+ </td>
641
645
  </tr>`)}
642
646
  </tbody>
643
647
  </table>