@things-factory/ops-master 10.1.34 → 10.1.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-client/master-change-approval.d.ts +7 -0
- package/dist-client/master-change-approval.js +16 -0
- package/dist-client/master-change-approval.js.map +1 -1
- package/dist-client/pages/master/material-definition.d.ts +4 -11
- package/dist-client/pages/master/material-definition.js +5 -53
- package/dist-client/pages/master/material-definition.js.map +1 -1
- package/dist-client/pages/master/material-revision-fields.d.ts +2 -0
- package/dist-client/pages/master/material-revision-fields.js +43 -0
- package/dist-client/pages/master/material-revision-fields.js.map +1 -0
- package/dist-client/pages/master/recipe-definition.d.ts +4 -135
- package/dist-client/pages/master/recipe-definition.js +7 -397
- package/dist-client/pages/master/recipe-definition.js.map +1 -1
- package/dist-client/pages/master/revision-comparison.d.ts +48 -0
- package/dist-client/pages/master/revision-comparison.js +553 -0
- package/dist-client/pages/master/revision-comparison.js.map +1 -0
- package/dist-client/pages/master/revision-view.d.ts +19 -0
- package/dist-client/pages/master/revision-view.js +133 -0
- package/dist-client/pages/master/revision-view.js.map +1 -0
- package/dist-client/pages/master/revision-workspace.d.ts +50 -0
- package/dist-client/pages/master/revision-workspace.js +752 -0
- package/dist-client/pages/master/revision-workspace.js.map +1 -0
- package/dist-client/pages/master/test-specification.d.ts +4 -29
- package/dist-client/pages/master/test-specification.js +5 -225
- package/dist-client/pages/master/test-specification.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/index.d.ts +12 -2
- package/dist-server/service/index.js +10 -0
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/master-axis.js +1 -1
- package/dist-server/service/master-axis.js.map +1 -1
- package/dist-server/service/master-change-policy.js +7 -2
- package/dist-server/service/master-change-policy.js.map +1 -1
- package/dist-server/service/master-conformance-resolver.js +11 -1
- package/dist-server/service/master-conformance-resolver.js.map +1 -1
- package/dist-server/service/master-crud.js +3 -0
- package/dist-server/service/master-crud.js.map +1 -1
- package/dist-server/service/master-list.js +6 -0
- package/dist-server/service/master-list.js.map +1 -1
- package/dist-server/service/material/index.d.ts +3 -2
- package/dist-server/service/material/index.js +4 -2
- package/dist-server/service/material/index.js.map +1 -1
- package/dist-server/service/material/material-axis-status.d.ts +8 -0
- package/dist-server/service/material/material-axis-status.js +19 -0
- package/dist-server/service/material/material-axis-status.js.map +1 -0
- package/dist-server/service/material/material-definition.d.ts +3 -0
- package/dist-server/service/material/material-definition.js +13 -0
- package/dist-server/service/material/material-definition.js.map +1 -1
- package/dist-server/service/material/material-effective-list.d.ts +39 -0
- package/dist-server/service/material/material-effective-list.js +54 -0
- package/dist-server/service/material/material-effective-list.js.map +1 -0
- package/dist-server/service/material/material-master-resolver.js +4 -10
- package/dist-server/service/material/material-master-resolver.js.map +1 -1
- package/dist-server/service/material/material-query.js +9 -2
- package/dist-server/service/material/material-query.js.map +1 -1
- package/dist-server/service/material/material-revision-content.d.ts +10 -0
- package/dist-server/service/material/material-revision-content.js +92 -0
- package/dist-server/service/material/material-revision-content.js.map +1 -0
- package/dist-server/service/material/material-revision-resolver.d.ts +54 -0
- package/dist-server/service/material/material-revision-resolver.js +76 -0
- package/dist-server/service/material/material-revision-resolver.js.map +1 -0
- package/dist-server/service/material/material-revision-service.d.ts +144 -0
- package/dist-server/service/material/material-revision-service.js +534 -0
- package/dist-server/service/material/material-revision-service.js.map +1 -0
- package/dist-server/service/material/material-revision.d.ts +84 -0
- package/dist-server/service/material/material-revision.js +339 -0
- package/dist-server/service/material/material-revision.js.map +1 -0
- package/dist-server/service/operation/operation-definition.js +1 -0
- package/dist-server/service/operation/operation-definition.js.map +1 -1
- package/dist-server/service/operation/operation-master-resolver.js +2 -5
- package/dist-server/service/operation/operation-master-resolver.js.map +1 -1
- package/dist-server/service/recipe/index.d.ts +3 -2
- package/dist-server/service/recipe/index.js +4 -2
- package/dist-server/service/recipe/index.js.map +1 -1
- package/dist-server/service/recipe/recipe-definition.d.ts +4 -0
- package/dist-server/service/recipe/recipe-definition.js +14 -1
- package/dist-server/service/recipe/recipe-definition.js.map +1 -1
- package/dist-server/service/recipe/recipe-effective-list.d.ts +49 -0
- package/dist-server/service/recipe/recipe-effective-list.js +96 -0
- package/dist-server/service/recipe/recipe-effective-list.js.map +1 -0
- package/dist-server/service/recipe/recipe-query.js +9 -2
- package/dist-server/service/recipe/recipe-query.js.map +1 -1
- package/dist-server/service/recipe/recipe-revision-content.d.ts +32 -0
- package/dist-server/service/recipe/recipe-revision-content.js +65 -0
- package/dist-server/service/recipe/recipe-revision-content.js.map +1 -0
- package/dist-server/service/recipe/recipe-revision-line.d.ts +30 -0
- package/dist-server/service/recipe/recipe-revision-line.js +95 -0
- package/dist-server/service/recipe/recipe-revision-line.js.map +1 -0
- package/dist-server/service/recipe/recipe-revision-resolver.d.ts +59 -0
- package/dist-server/service/recipe/recipe-revision-resolver.js +76 -0
- package/dist-server/service/recipe/recipe-revision-resolver.js.map +1 -0
- package/dist-server/service/recipe/recipe-revision-service.d.ts +147 -0
- package/dist-server/service/recipe/recipe-revision-service.js +591 -0
- package/dist-server/service/recipe/recipe-revision-service.js.map +1 -0
- package/dist-server/service/recipe/recipe-revision.d.ts +100 -0
- package/dist-server/service/recipe/recipe-revision.js +373 -0
- package/dist-server/service/recipe/recipe-revision.js.map +1 -0
- package/dist-server/service/recipe/route-definition.js +1 -0
- package/dist-server/service/recipe/route-definition.js.map +1 -1
- package/dist-server/service/resource/class-members.js +9 -0
- package/dist-server/service/resource/class-members.js.map +1 -1
- package/dist-server/service/status/master-status.js +2 -1
- package/dist-server/service/status/master-status.js.map +1 -1
- package/dist-server/service/test-spec/test-spec-effective-list.d.ts +2 -0
- package/dist-server/service/test-spec/test-spec-effective-list.js +3 -1
- package/dist-server/service/test-spec/test-spec-effective-list.js.map +1 -1
- package/dist-server/service/test-spec/test-spec-revision-resolver.d.ts +1 -0
- package/dist-server/service/test-spec/test-spec-revision-service.d.ts +21 -0
- package/dist-server/service/test-spec/test-spec-revision-service.js +19 -0
- package/dist-server/service/test-spec/test-spec-revision-service.js.map +1 -1
- package/dist-server/service/test-spec/test-spec-revision.d.ts +2 -0
- package/dist-server/service/test-spec/test-spec-revision.js +6 -1
- package/dist-server/service/test-spec/test-spec-revision.js.map +1 -1
- package/dist-server/service/test-spec/test-specification.d.ts +2 -0
- package/dist-server/service/test-spec/test-specification.js +4 -0
- package/dist-server/service/test-spec/test-specification.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -3
- package/translations/en.json +148 -0
- package/translations/ko.json +148 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revision-workspace.js","sourceRoot":"","sources":["../../../client/pages/master/revision-workspace.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist/ox-grist.js'\nimport gql from 'graphql-tag'\nimport { html, css, nothing } from 'lit'\nimport { state } from 'lit/decorators.js'\nimport { client } from '@operato/graphql'\nimport { OxPrompt } from '@operato/popup'\nimport { IDENTITY, MasterPageBase, MasterSpec } from './master-page-base.js'\nimport { requestMasterChangeApproval, masterChangeStatus, MasterChangeStatus } from '../../master-change-approval.js'\nimport { revisionText as t, revisionDate as date, revisionStyles } from './revision-comparison.js'\nimport { materialRevisionFields } from './material-revision-fields.js'\nimport { RevisionAxis, localDateTime, isoFromLocal } from './revision-view.js'\n\n/** Shared workflow, not shared domain payload. Both consumers keep their existing page/URL identities. */\nexport abstract class RevisionWorkspace extends MasterPageBase {\n protected abstract axis: RevisionAxis\n static styles = [\n ...MasterPageBase.styles,\n revisionStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n ox-grist {\n flex: 1;\n min-height: 240px;\n }\n ox-grist[hidden] {\n display: none;\n }\n .workspace {\n overflow: auto;\n flex: 1;\n padding: 20px 24px;\n }\n .bar {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n }\n .bar h2 {\n margin: 8px 0;\n font-size: var(--ui-t-title, 20px);\n flex: 1;\n overflow-wrap: anywhere;\n }\n .summary {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));\n gap: 16px;\n margin: 20px 0;\n }\n .card {\n padding: 16px;\n border: 1px solid var(--ui-line);\n border-radius: 6px;\n background: var(--md-sys-color-surface);\n }\n .card h3 {\n margin: 0 0 10px;\n }\n .card p {\n margin: 8px 0;\n }\n .current {\n border-inline-start: 4px solid var(--md-sys-color-primary);\n }\n .fields {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));\n gap: 16px;\n margin: 16px 0;\n }\n label {\n display: flex;\n flex-direction: column;\n gap: 6px;\n font-size: var(--ui-t-small, 13px);\n }\n input,\n textarea {\n box-sizing: border-box;\n width: 100%;\n padding: 8px;\n border: 1px solid var(--ui-line);\n border-radius: 4px;\n font: inherit;\n background: var(--md-sys-color-surface);\n color: inherit;\n }\n td input {\n min-width: 100px;\n }\n textarea {\n min-height: 70px;\n }\n .actions {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n margin-top: 20px;\n align-items: center;\n }\n .notice {\n padding: 12px;\n background: var(--md-sys-color-surface-container);\n border-radius: 4px;\n }\n .failure {\n padding: 12px;\n border-inline-start: 4px solid var(--md-sys-color-error);\n color: var(--md-sys-color-error);\n }\n .empty {\n padding: 24px;\n }\n .hint {\n font-size: var(--ui-t-small, 13px);\n }\n .editor {\n border-top: 1px solid var(--ui-line);\n margin-top: 20px;\n padding-top: 12px;\n }\n @media (max-width: 700px) {\n .workspace {\n padding: 12px;\n }\n .summary {\n grid-template-columns: 1fr;\n }\n .fields {\n grid-template-columns: 1fr;\n }\n }\n `\n ]\n @state() private overview: any\n @state() private draft: any\n @state() private newName = ''\n @state() private busy = false\n @state() private dirty = false\n @state() private failure = ''\n @state() private message = ''\n @state() private approvalRequired: boolean | undefined\n @state() private statuses: Record<string, MasterChangeStatus> = {}\n private serial = 0\n private get recipe() {\n return this.axis === 'recipeDefinition'\n }\n private get material() { return this.axis === 'materialDefinition' }\n private get names() {\n if (this.material) return { noun: 'material', list: 'materialDefinitions', overview: 'materialDefinitionRevisions', subject: 'materialId', create: 'createMaterialDefinitionDraft', edit: 'editMaterialDefinitionDraft', publish: 'publishMaterialDefinitionDraft' }\n return this.recipe\n ? {\n noun: 'recipe',\n list: 'recipeDefinitions',\n overview: 'recipeRevisions',\n subject: 'recipeId',\n create: 'createRecipeDraft',\n edit: 'editRecipeDraft',\n publish: 'publishRecipeDraft'\n }\n : {\n noun: 'spec',\n list: 'testSpecifications',\n overview: 'testSpecificationRevisions',\n subject: 'specId',\n create: 'createTestSpecificationDraft',\n edit: 'editTestSpecificationDraft',\n publish: 'publishTestSpecificationDraft'\n }\n }\n protected get spec(): MasterSpec {\n return {\n key: this.axis,\n title: this.material ? 'material' : this.recipe ? 'recipe' : 'test-specification',\n help: 'ops-master/' + (this.material ? 'material-definition' : this.recipe ? 'recipe-definition' : 'test-specification'),\n query: this.names.list,\n mutation: this.material ? 'updateMultipleMaterialDefinition' : this.recipe ? 'updateMultipleRecipeDefinition' : 'updateMultipleTestSpecification',\n columns: [\n ...IDENTITY,\n ...(this.material ? [\n { name: 'rootClasses', label: 'material-type', type: 'list' as const, width: 120 },\n { name: 'classPath', label: 'class-lineage', type: 'list' as const, width: 180 },\n { name: 'madeBy', label: 'made-by', type: 'list' as const, width: 180 },\n { name: 'usedIn', label: 'used-in', type: 'list' as const, width: 180 }\n ] : []),\n { name: 'revisionNumber', label: 'revision', type: 'number' as const },\n { name: 'effectiveStart', label: 'effective-start', type: 'date' as const }\n ].map(column => ({ ...column, readonly: true }))\n }\n }\n protected get pathSegmentNarrowsList() {\n return false\n }\n get context(): any {\n return {\n ...super.context,\n importable: undefined,\n exportable: this.overview || this.draft ? undefined : super.context.exportable,\n search: this.overview || this.draft ? undefined : super.context.search,\n description: t('purpose'),\n actions:\n this.draft && !this.draft.frozenAt\n ? [\n {\n title: t(this.approvalRequired ? 'request-approval' : 'publish'),\n icon: 'done',\n emphasis: { raised: true },\n disabled: this.busy || this.approvalRequired === undefined,\n action: () => this.submit()\n }\n ]\n : this.overview || this.draft\n ? []\n : [\n {\n title: t(this.material ? 'new-material' : this.recipe ? 'new-recipe' : 'new-spec'),\n icon: 'add',\n emphasis: { raised: true },\n action: () => this.startNew()\n }\n ]\n }\n }\n updated(changes: any) {\n super.updated(changes)\n if (this.active && ['overview', 'draft', 'busy', 'approvalRequired'].some(key => changes.has(key)))\n this.updateContext()\n }\n protected configOf() {\n const config = super.configOf()\n return { ...config, rows: { ...config.rows, appendable: false, selectable: { multiple: false } } }\n }\n async pageInitialized() {\n await super.pageInitialized()\n await this.openResource(this.lifecycle?.resourceId)\n }\n async pageUpdated(changes: any, after: any, before: any) {\n await super.pageUpdated()\n if (after?.resourceId !== before?.resourceId) await this.openResource(after?.resourceId)\n }\n private async openResource(key?: string) {\n if (!key) return\n await this.run(async () => {\n const response = await client.query({\n query: gql(`query($filters:[Filter!]){${this.names.list}(filters:$filters){items{id}}}`),\n variables: { filters: [{ name: 'name', operator: 'eq', value: key }] },\n fetchPolicy: 'no-cache'\n })\n this.assert(response)\n const row = response.data[this.names.list].items[0]\n if (row) await this.load(row.id)\n })\n }\n private assert(response: any) {\n if (response.errors?.length) throw new Error(response.errors.map((e: any) => e.message).join('\\n'))\n if (!response.data) throw new Error(t('no-response'))\n }\n private async run(work: () => Promise<void>) {\n if (this.busy) return\n this.busy = true\n this.failure = ''\n try {\n await work()\n } catch (error) {\n this.failure = (error as Error).message\n } finally {\n this.busy = false\n }\n }\n private async canLeave() {\n return (\n !this.dirty ||\n !!(await OxPrompt.open({\n title: t('unsaved'),\n text: t('discard-question'),\n confirmButton: { text: t('discard') },\n cancelButton: { text: t('keep-editing') }\n }))\n )\n }\n private blank() {\n return {\n version: '1',\n description: '',\n materialDefinitionName: '',\n effectiveFrom: new Date().toISOString(),\n reason: '',\n materialClassIds: [], properties: [], testSpecificationIds: [],\n criteria: [],\n inputs: [],\n outputs: []\n }\n }\n private async policy() {\n const response = await client.query({\n query: gql`\n query ($axis: String!) {\n masterChangePolicy(axis: $axis)\n }\n `,\n variables: { axis: this.axis },\n fetchPolicy: 'no-cache'\n })\n this.assert(response)\n this.approvalRequired = response.data.masterChangePolicy.approvalRequired\n }\n private async startNew() {\n if (!(await this.canLeave())) return\n await this.run(async () => {\n ++this.serial\n this.overview = undefined\n this.draft = this.blank()\n this.newName = ''\n this.dirty = false\n this.message = ''\n await this.policy()\n })\n }\n private async pick(event: CustomEvent) {\n const row = event.detail?.records?.[0] ?? event.detail?.added?.[0]\n if (!row?.id || !(await this.canLeave())) return\n await this.run(async () => {\n this.draft = undefined\n this.dirty = false\n this.message = ''\n await this.load(row.id)\n })\n }\n private async load(id: string) {\n const serial = ++this.serial\n const response = await client.query({\n query: gql(`query($id:String!){${this.names.overview}(${this.names.subject}:$id)}`),\n variables: { id },\n fetchPolicy: 'no-cache'\n })\n this.assert(response)\n if (serial !== this.serial) return\n this.overview = response.data[this.names.overview]\n await this.policy()\n const statuses: Record<string, MasterChangeStatus> = {}\n await Promise.all(\n this.overview.revisions\n .filter((row: any) => row.activityInstanceId)\n .map(async (row: any) => {\n try {\n statuses[row.id] = await masterChangeStatus(this, row.activityInstanceId)\n } catch (error) {\n statuses[row.id] = { state: 'unknown', comment: (error as Error).message }\n }\n })\n )\n if (serial === this.serial) this.statuses = statuses\n }\n private get currentSegment() {\n return this.overview?.schedule.find((s: any) => s.state === 'current')\n }\n private get current() {\n return this.overview?.revisions.find((r: any) => r.id === this.currentSegment?.revisionId)\n }\n private get comparisonBase() {\n if (this.draft?.id && (!this.dirty || this.draft.frozenAt))\n return this.overview?.revisions.find((r: any) => r.id === this.draft.baseRevisionId)\n const at = this.draft?.effectiveFrom\n const segment = this.overview?.schedule.find((s: any) => s.validFrom <= at && (!s.validTo || at < s.validTo))\n return this.overview?.revisions.find((r: any) => r.id === segment?.revisionId)\n }\n private stateOf(row: any) {\n const segment = this.overview?.schedule.find((s: any) => s.revisionId === row.id)\n return (\n segment?.state ??\n (row.activityInstanceId ? (this.statuses[row.id]?.state ?? 'unknown') : row.frozenAt ? 'approved' : 'draft')\n )\n }\n private async openRevision(row: any, fork = false) {\n if (!(await this.canLeave())) return\n this.draft = structuredClone(row ?? this.blank())\n if (fork)\n this.draft = {\n ...this.draft,\n id: undefined,\n revisionNumber: undefined,\n frozenAt: undefined,\n activityInstanceId: undefined,\n editGeneration: undefined,\n baseRevisionId: undefined,\n effectiveFrom: new Date().toISOString(),\n reason: ''\n }\n this.dirty = false\n this.message = ''\n await this.updateComplete\n this.renderRoot.querySelector('.editor')?.scrollIntoView({ block: 'start', behavior: 'smooth' })\n }\n private change(field: string, value: any) {\n this.draft = { ...this.draft, [field]: value }\n this.dirty = true\n this.message = ''\n }\n private line(section: string, index: number, field: string, value: string) {\n const rows = this.draft[section].map((row: any) => ({ ...row, limit: { ...row.limit } }))\n const numeric = ['qty', 'minimum', 'maximum'].includes(field)\n const next = numeric ? (value === '' ? undefined : Number(value)) : value\n if (section === 'criteria' && ['minimum', 'maximum', 'uom'].includes(field)) rows[index].limit[field] = next\n else rows[index][field] = next\n this.change(section, rows)\n }\n protected async save() {\n await this.run(async () => {\n await this.persist()\n this.message = t('saved')\n })\n }\n private async persist() {\n if (!this.draft || this.draft.frozenAt) return\n const invalid = this.renderRoot.querySelector('input:invalid,textarea:invalid') as HTMLInputElement\n if (invalid) {\n invalid.reportValidity()\n throw new Error(t('required-fields'))\n }\n const { version, description, criteria, inputs, outputs, materialDefinitionName, route, effectiveFrom, reason } =\n this.draft\n const content = this.material\n ? { description, materialClassIds: this.draft.materialClassIds, properties: this.draft.properties, testSpecificationIds: this.draft.testSpecificationIds, effectiveFrom, reason }\n : this.recipe\n ? { description, inputs, outputs, materialDefinitionName, route: route || null, effectiveFrom, reason }\n : { version, description, criteria, effectiveFrom, reason }\n const n = this.names\n const response = this.draft.id\n ? await client.mutate({\n mutation: gql(\n `mutation($id:String!,$generation:Int!,$content:Object!){${n.edit}(revisionId:$id,editGeneration:$generation,content:$content)}`\n ),\n variables: { id: this.draft.id, generation: this.draft.editGeneration, content }\n })\n : await client.mutate({\n mutation: gql(\n `mutation($subject:String,$name:String,$content:Object!){${n.create}(${n.subject}:$subject,name:$name,content:$content)}`\n ),\n variables: { subject: this.overview?.[n.subject], name: this.overview ? undefined : this.newName, content }\n })\n this.assert(response)\n this.draft = response.data[n.edit] ?? response.data[n.create]\n this.dirty = false\n await this.load(this.draft[n.subject])\n await this.grist?.fetch()\n }\n private async submit() {\n await this.run(async () => {\n await this.persist()\n if (!this.draft?.id || this.draft.frozenAt) return\n await this.policy()\n if (this.approvalRequired)\n await requestMasterChangeApproval(this, {\n axis: this.axis,\n revisionId: this.draft.id,\n editGeneration: this.draft.editGeneration\n })\n else {\n const response = await client.mutate({\n mutation: gql(\n `mutation($id:String!,$generation:Int!){${this.names.publish}(revisionId:$id,editGeneration:$generation)}`\n ),\n variables: { id: this.draft.id, generation: this.draft.editGeneration }\n })\n this.assert(response)\n }\n const id = this.draft.id\n await this.load(this.draft[this.names.subject])\n this.draft = this.overview.revisions.find((r: any) => r.id === id)\n await this.grist?.fetch()\n this.message = t(this.approvalRequired ? 'submitted' : 'published')\n })\n }\n private content(row: any, editable = false) {\n if (this.material) return materialRevisionFields(row, editable ? (field, value) => this.change(field, value) : undefined)\n return (this.recipe ? ['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>${t(section)}</h3>\n <div class=\"scroll\">\n <table>\n <thead>\n <tr>\n ${fields.map(field => html`<th>${t(field)}</th>`)}${editable ? html`<th>${t('actions')}</th>` : nothing}\n </tr>\n </thead>\n <tbody>\n ${(row[section] ?? []).map(\n (line: any, index: number) =>\n html`<tr>\n ${fields.map(field => {\n const value =\n section === 'criteria' && ['minimum', 'maximum', 'uom'].includes(field)\n ? line.limit?.[field]\n : line[field]\n return html`<td>\n ${editable ? html`<input aria-label=${t(section) + ' ' + (index + 1) + ' ' + t(field)} .value=${String(value ?? '')} type=${['qty', 'minimum', 'maximum'].includes(field) ? 'number' : 'text'} step=\"any\" ?required=${['id', 'material', 'qty', 'evaluatedPropertyId'].includes(field)} @input=${(e: Event) => this.line(section, index, field, (e.target as HTMLInputElement).value)} />` : (value ?? '—')}\n </td>`\n })}${\n editable\n ? html`<td>\n <button\n aria-label=${t('remove-row', { n: index + 1 })}\n @click=${() =>\n this.change(\n section,\n row[section].filter((_: any, i: number) => i !== index)\n )}\n >\n ${t('remove')}\n </button>\n </td>`\n : nothing\n }\n </tr>`\n )}\n </tbody>\n </table>\n </div>\n ${editable ? html`<button @click=${() => this.change(section, [...row[section], section === 'criteria' ? { id: '', description: '', limit: {} } : { lineKey: crypto.randomUUID(), material: '', qty: 1 }])}>${t('add-' + section)}</button>` : nothing}\n ${section === 'criteria' && row.criteria?.some((c: any) => c.expression) ? html`<p class=\"notice\">${t('expression-preserved')}</p>` : nothing}`\n })\n }\n private status(row: any) {\n const state = this.stateOf(row),\n decision = this.statuses[row.id]\n return html`<span class=\"pill\">${t(state)}</span\n >${decision?.who ? html`<span> · ${decision.who}</span>` : ''}${decision?.comment ? html`<p>${decision.comment}</p>` : ''}${decision?.open ? html`<button @click=${() => decision.open!()}>${t('approval-detail')}</button>` : ''}`\n }\n render() {\n const current = this.current\n const next = this.overview?.schedule.filter((s: any) => s.state === 'scheduled') ?? []\n const changes =\n this.overview?.revisions.filter((r: any) => !this.overview.schedule.some((s: any) => s.revisionId === r.id)) ?? []\n const readonly = !!this.draft?.frozenAt || this.busy\n return html` <ox-grist\n ?hidden=${!!this.overview || !!this.draft}\n .mode=${this.mode}\n .config=${this.gristConfig}\n .fetchHandler=${this.fetchHandler.bind(this)}\n @select-record-change=${this.pick.bind(this)}\n ></ox-grist>\n ${\n this.overview || this.draft\n ? html`<main class=\"workspace\" aria-busy=${this.busy}>\n <div class=\"bar\">\n <button\n ?disabled=${this.busy}\n @click=${async () => {\n if (await this.canLeave()) {\n this.overview = undefined\n this.draft = undefined\n this.dirty = false\n await this.grist?.fetch()\n }\n }}\n >\n ${t('back-list')}\n </button>\n <h2>${this.overview?.name ?? t(this.material ? 'new-material' : this.recipe ? 'new-recipe' : 'new-spec')}</h2>\n ${\n this.overview\n ? html`<button\n ?disabled=${this.busy}\n @click=${() =>\n this.run(async () => {\n this.message = ''\n await this.load(this.overview[this.names.subject])\n await this.grist?.fetch()\n })}\n >\n ${t('refresh')}</button\n ><button\n class=\"primary\"\n ?disabled=${this.busy}\n @click=${() => this.openRevision(current, true)}\n >\n ${t('create-change')}\n </button>`\n : ''\n }\n </div>\n ${\n this.overview\n ? html`<div class=\"summary\">\n <section class=\"card current\">\n <h3>${t('current')}</h3>\n ${\n current\n ? html`<strong>${t('revision-value', { n: current.revisionNumber })}</strong>\n <p>\n ${date(this.currentSegment.validFrom)} →\n ${this.currentSegment.validTo ? date(this.currentSegment.validTo) : t('until-change')}\n </p>\n <button @click=${() => this.openRevision(current)}>${t('view-current')}</button>`\n : html`<p>${t('no-current')}</p>`\n }\n </section>\n <section class=\"card\">\n <h3>${t('changes-in-progress')} · ${changes.length}</h3>\n ${changes.length ? changes.map((row: any) => html`<p><button @click=${() => this.openRevision(row)}>${t('revision-value', { n: row.revisionNumber })}</button> ${this.status(row)}</p>`) : html`<p class=\"muted\">${t('no-drafts')}</p>`}\n </section>\n <section class=\"card\">\n <h3>${t('scheduled')}</h3>\n ${\n next.length\n ? next.map((segment: any) => {\n const row = this.overview.revisions.find((r: any) => r.id === segment.revisionId)\n return html`<p>\n <button @click=${() => this.openRevision(row)}>\n ${t('revision-value', { n: row.revisionNumber })}\n </button>\n · ${date(segment.validFrom)}\n </p>`\n })\n : html`<p class=\"muted\">${t('no-scheduled')}</p>`\n }\n </section>\n </div>\n ${\n !this.draft && current\n ? html`<h3>${t('current-content')}</h3>\n <p>${current.description}</p>\n ${this.content(current)}`\n : ''\n }\n <details>\n <summary>${t('history')}</summary>\n <table>\n <thead>\n <tr>\n <th>${t('revision')}</th>\n <th>${t('state')}</th>\n <th>${t('effectiveFrom')}</th>\n <th>${t('reason')}</th>\n </tr>\n </thead>\n <tbody>\n ${[...this.overview.revisions].reverse().map(\n (row: any) =>\n html`<tr>\n <td><button @click=${() => this.openRevision(row)}>${row.revisionNumber}</button></td>\n <td>${this.status(row)}</td>\n <td>${date(row.effectiveFrom)}</td>\n <td>${row.reason}</td>\n </tr>`\n )}\n </tbody>\n </table>\n </details>`\n : ''\n }\n ${\n this.draft\n ? html`<section class=\"editor\">\n <div class=\"bar\">\n <h3>\n ${this.draft.id ? t('revision-value', { n: this.draft.revisionNumber }) : t('new-change')}\n </h3>\n ${this.draft.id ? this.status(this.draft) : ''}<button\n ?disabled=${this.busy}\n @click=${async () => {\n if (await this.canLeave()) {\n this.draft = undefined\n this.dirty = false\n }\n }}\n >\n ${t('close-editor')}\n </button>\n </div>\n <p class=\"notice\">${t(this.material ? 'material-impact' : this.recipe ? 'recipe-impact' : 'spec-impact')}</p>\n <div class=\"fields\">\n ${\n !this.overview\n ? html`<label\n >${t('name')}<input\n required\n .value=${this.newName}\n @input=${(e: Event) => {\n this.newName = (e.target as HTMLInputElement).value\n this.dirty = true\n }}\n /></label>`\n : ''\n }\n ${['description', ...(this.material ? [] : this.recipe ? ['materialDefinitionName', 'route'] : ['version'])].map(field => html`<label>${t(field)}<input ?disabled=${readonly} ?required=${field === 'materialDefinitionName' || field === 'version'} .value=${this.draft[field] ?? ''} @input=${(e: Event) => this.change(field, (e.target as HTMLInputElement).value)} /></label>`)}\n <label\n >${t('effectiveFrom')}<input\n type=\"datetime-local\"\n required\n ?disabled=${readonly}\n .value=${localDateTime(this.draft.effectiveFrom)}\n @change=${(e: Event) => {\n try {\n this.change('effectiveFrom', isoFromLocal((e.target as HTMLInputElement).value))\n } catch {\n this.failure = t('invalid-date')\n }\n }}\n /><span class=\"muted hint\"\n >${t('time-zone')} · ${Intl.DateTimeFormat().resolvedOptions().timeZone}</span\n ></label\n >\n <label\n >${t('reason')}<textarea\n required\n ?disabled=${readonly}\n .value=${this.draft.reason ?? ''}\n @input=${(e: Event) => this.change('reason', (e.target as HTMLTextAreaElement).value)}\n ></textarea>\n </label>\n </div>\n ${this.content(this.draft, !readonly)}\n <ops-master-revision-comparison\n .axis=${this.axis}\n .before=${this.comparisonBase}\n .after=${this.draft}\n ></ops-master-revision-comparison>\n <div class=\"actions\">\n ${this.draft.frozenAt ? html`<button ?disabled=${this.busy} @click=${() => this.openRevision(this.draft, true)}>${t('create-change')}</button>` : html`<button ?disabled=${this.busy} @click=${() => this.save()}>${t('save-draft')}</button>`}${this.dirty ? html`<span>${t('unsaved')}</span>` : ''}\n </div>\n </section>`\n : ''\n }\n ${this.message ? html`<p role=\"status\" class=\"notice\">${this.message}</p>` : ''}${this.failure ? html`<p role=\"alert\" class=\"failure\">${this.failure}</p>` : ''}\n </main>`\n : this.failure\n ? html`<p role=\"alert\" class=\"failure\">${this.failure}</p>`\n : nothing\n }`\n }\n}\n"]}
|
|
@@ -1,30 +1,5 @@
|
|
|
1
|
-
import '
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
static styles: import("lit").CSSResult[];
|
|
6
|
-
private overview?;
|
|
7
|
-
private draft?;
|
|
8
|
-
private newName;
|
|
9
|
-
private busy;
|
|
10
|
-
private dirty;
|
|
11
|
-
private loadSerial;
|
|
12
|
-
private t;
|
|
13
|
-
protected get spec(): MasterSpec;
|
|
14
|
-
get context(): any;
|
|
15
|
-
protected configOf(): any;
|
|
16
|
-
private canLeave;
|
|
17
|
-
private startNew;
|
|
18
|
-
private pick;
|
|
19
|
-
private load;
|
|
20
|
-
private assertResponse;
|
|
21
|
-
private run;
|
|
22
|
-
private openRevision;
|
|
23
|
-
private change;
|
|
24
|
-
private criterion;
|
|
25
|
-
protected save(): Promise<void>;
|
|
26
|
-
private persist;
|
|
27
|
-
private submit;
|
|
28
|
-
private criteriaTable;
|
|
29
|
-
render(): import("lit-html").TemplateResult<1>;
|
|
1
|
+
import { RevisionWorkspace } from './revision-workspace.js';
|
|
2
|
+
import { RevisionAxis } from './revision-view.js';
|
|
3
|
+
export declare class OpsMasterTestSpecification extends RevisionWorkspace {
|
|
4
|
+
protected axis: RevisionAxis;
|
|
30
5
|
}
|
|
@@ -1,232 +1,12 @@
|
|
|
1
|
-
import { __decorate
|
|
2
|
-
import '
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
import { customElement, state } from 'lit/decorators.js';
|
|
6
|
-
import { client } from '@operato/graphql';
|
|
7
|
-
import { i18next } from '@operato/i18n';
|
|
8
|
-
import { notify } from '@operato/layout';
|
|
9
|
-
import { EFFECTIVE, IDENTITY, MasterPageBase } from './master-page-base.js';
|
|
10
|
-
import { requestMasterChangeApproval } from '../../master-change-approval.js';
|
|
11
|
-
/** Identity list, approved schedule, and draft workspace are separate surfaces. */
|
|
12
|
-
let OpsMasterTestSpecification = class OpsMasterTestSpecification extends MasterPageBase {
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { customElement } from 'lit/decorators.js';
|
|
3
|
+
import { RevisionWorkspace } from './revision-workspace.js';
|
|
4
|
+
let OpsMasterTestSpecification = class OpsMasterTestSpecification extends RevisionWorkspace {
|
|
13
5
|
constructor() {
|
|
14
6
|
super(...arguments);
|
|
15
|
-
this.
|
|
16
|
-
this.busy = false;
|
|
17
|
-
this.dirty = false;
|
|
18
|
-
this.loadSerial = 0;
|
|
19
|
-
}
|
|
20
|
-
static { this.styles = [...MasterPageBase.styles, css `
|
|
21
|
-
:host { display:flex; flex-direction:column; min-height:0 }
|
|
22
|
-
ox-grist { flex:2; min-height:160px }
|
|
23
|
-
section { flex:3; overflow:auto; padding:16px; border-top:1px solid var(--ui-line,#ccd5da) }
|
|
24
|
-
.toolbar,.fields { display:flex; flex-wrap:wrap; gap:12px; align-items:end; margin-bottom:12px }
|
|
25
|
-
label { display:flex; flex-direction:column; gap:4px; font-size:13px }
|
|
26
|
-
input,button { font:inherit; padding:7px; border:1px solid var(--ui-line,#ccd5da); border-radius:3px }
|
|
27
|
-
input { min-width:100px; max-width:220px }
|
|
28
|
-
button { cursor:pointer; background:var(--ui-panel-2,#f3f6f7) }
|
|
29
|
-
button:disabled { cursor:default; opacity:.5 }
|
|
30
|
-
table { width:100%; border-collapse:collapse; margin:10px 0 18px; font-size:13px }
|
|
31
|
-
th,td { padding:7px; text-align:left; border-bottom:1px solid var(--ui-line,#ccd5da); vertical-align:top }
|
|
32
|
-
td input { width:100%; min-width:70px; box-sizing:border-box }
|
|
33
|
-
.notice { padding:10px; background:var(--ui-panel-2,#f3f6f7) }
|
|
34
|
-
.changed { background:var(--status-warning-background,#fff2d0) }
|
|
35
|
-
h3 { margin:14px 0 8px; font-size:15px }
|
|
36
|
-
`]; }
|
|
37
|
-
t(key, fallback) { return i18next.t(`test-spec-revision.${key}`, { defaultValue: fallback }); }
|
|
38
|
-
get spec() {
|
|
39
|
-
return { key: 'testSpecification', title: 'test-specification', help: 'ops-master/test-specification',
|
|
40
|
-
query: 'testSpecifications', mutation: 'updateMultipleTestSpecification',
|
|
41
|
-
columns: [...IDENTITY, { name: 'version', label: 'version', type: 'string' }, ...EFFECTIVE].map(column => ({ ...column, readonly: true })) };
|
|
42
|
-
}
|
|
43
|
-
get context() {
|
|
44
|
-
return { ...super.context, importable: undefined, actions: [{
|
|
45
|
-
title: this.t('new', '새 검사 명세'), icon: 'add', emphasis: { raised: true }, action: () => this.startNew()
|
|
46
|
-
}] };
|
|
47
|
-
}
|
|
48
|
-
configOf() {
|
|
49
|
-
const config = super.configOf();
|
|
50
|
-
return { ...config, rows: { ...config.rows, appendable: false, selectable: { multiple: false } } };
|
|
51
|
-
}
|
|
52
|
-
canLeave() { return !this.dirty || window.confirm(this.t('discard', '저장하지 않은 초안을 버리시겠습니까?')); }
|
|
53
|
-
startNew() {
|
|
54
|
-
if (this.busy || !this.canLeave())
|
|
55
|
-
return;
|
|
56
|
-
++this.loadSerial;
|
|
57
|
-
this.overview = undefined;
|
|
58
|
-
this.newName = '';
|
|
59
|
-
this.draft = { version: '1', effectiveFrom: new Date().toISOString(), reason: '', criteria: [] };
|
|
60
|
-
this.dirty = false;
|
|
61
|
-
}
|
|
62
|
-
async pick(event) {
|
|
63
|
-
const record = event.detail?.records?.[0] ?? event.detail?.added?.[0];
|
|
64
|
-
if (!record?.id || this.busy || !this.canLeave())
|
|
65
|
-
return;
|
|
66
|
-
await this.run(async () => { await this.load(record.id); this.draft = undefined; this.dirty = false; });
|
|
67
|
-
}
|
|
68
|
-
async load(specId) {
|
|
69
|
-
const serial = ++this.loadSerial;
|
|
70
|
-
const response = await client.query({ query: gql `query($specId:String!){testSpecificationRevisions(specId:$specId)}`,
|
|
71
|
-
variables: { specId }, fetchPolicy: 'no-cache' });
|
|
72
|
-
this.assertResponse(response);
|
|
73
|
-
if (serial === this.loadSerial)
|
|
74
|
-
this.overview = response.data.testSpecificationRevisions;
|
|
75
|
-
}
|
|
76
|
-
assertResponse(response) {
|
|
77
|
-
if (response?.errors?.length)
|
|
78
|
-
throw new Error(response.errors.map((error) => error.message).join('\n'));
|
|
79
|
-
if (!response?.data)
|
|
80
|
-
throw new Error(this.t('no-response', '서버 응답을 확인할 수 없습니다. 다시 조회하십시오.'));
|
|
81
|
-
}
|
|
82
|
-
async run(work) {
|
|
83
|
-
if (this.busy)
|
|
84
|
-
return;
|
|
85
|
-
this.busy = true;
|
|
86
|
-
try {
|
|
87
|
-
await work();
|
|
88
|
-
}
|
|
89
|
-
catch (error) {
|
|
90
|
-
notify({ message: error.message, level: 'error' });
|
|
91
|
-
}
|
|
92
|
-
finally {
|
|
93
|
-
this.busy = false;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
openRevision(revision, fork = false) {
|
|
97
|
-
if (this.busy || !this.canLeave())
|
|
98
|
-
return;
|
|
99
|
-
this.draft = JSON.parse(JSON.stringify(revision));
|
|
100
|
-
if (fork)
|
|
101
|
-
this.draft = { ...this.draft, id: undefined, frozenAt: undefined, activityInstanceId: undefined,
|
|
102
|
-
editGeneration: undefined, effectiveFrom: new Date().toISOString(), reason: '' };
|
|
103
|
-
this.dirty = false;
|
|
104
|
-
}
|
|
105
|
-
change(field, value) { this.draft = { ...this.draft, [field]: value }; this.dirty = true; }
|
|
106
|
-
criterion(index, field, value) {
|
|
107
|
-
const criteria = this.draft.criteria.map(row => ({ ...row, ...(row.limit ? { limit: { ...row.limit } } : {}) }));
|
|
108
|
-
if (['minimum', 'maximum', 'uom'].includes(field)) {
|
|
109
|
-
criteria[index].limit ??= {};
|
|
110
|
-
if (!value)
|
|
111
|
-
delete criteria[index].limit[field];
|
|
112
|
-
else
|
|
113
|
-
criteria[index].limit[field] = field === 'uom' ? value : Number(value);
|
|
114
|
-
if (!Object.keys(criteria[index].limit).length)
|
|
115
|
-
delete criteria[index].limit;
|
|
116
|
-
}
|
|
117
|
-
else
|
|
118
|
-
criteria[index][field] = value;
|
|
119
|
-
this.change('criteria', criteria);
|
|
120
|
-
}
|
|
121
|
-
async save() { await this.run(() => this.persist()); }
|
|
122
|
-
async persist() {
|
|
123
|
-
if (!this.draft || this.draft.frozenAt)
|
|
124
|
-
return;
|
|
125
|
-
const { version, description, effectiveFrom, reason, criteria } = this.draft;
|
|
126
|
-
const content = { version, description, effectiveFrom, reason, criteria };
|
|
127
|
-
const response = this.draft.id
|
|
128
|
-
? await client.mutate({ mutation: gql `mutation($revisionId:String!,$editGeneration:Int!,$content:Object!){editTestSpecificationDraft(revisionId:$revisionId,editGeneration:$editGeneration,content:$content)}`,
|
|
129
|
-
variables: { revisionId: this.draft.id, editGeneration: this.draft.editGeneration, content } })
|
|
130
|
-
: await client.mutate({ mutation: gql `mutation($specId:String,$name:String,$content:Object!){createTestSpecificationDraft(specId:$specId,name:$name,content:$content)}`,
|
|
131
|
-
variables: { specId: this.overview?.specId, name: this.overview ? undefined : this.newName, content } });
|
|
132
|
-
this.assertResponse(response);
|
|
133
|
-
this.draft = response.data.editTestSpecificationDraft ?? response.data.createTestSpecificationDraft;
|
|
134
|
-
this.dirty = false;
|
|
135
|
-
await this.load(this.draft.specId);
|
|
136
|
-
this.grist?.fetch();
|
|
137
|
-
}
|
|
138
|
-
async submit() {
|
|
139
|
-
await this.run(async () => {
|
|
140
|
-
await this.persist();
|
|
141
|
-
if (!this.draft?.id || this.draft.frozenAt)
|
|
142
|
-
return;
|
|
143
|
-
const policy = await client.query({ query: gql `query { masterChangePolicy(axis:"testSpecification") }`, fetchPolicy: 'no-cache' });
|
|
144
|
-
this.assertResponse(policy);
|
|
145
|
-
if (policy.data.masterChangePolicy.approvalRequired) {
|
|
146
|
-
await requestMasterChangeApproval(this, { axis: 'testSpecification', revisionId: this.draft.id, editGeneration: this.draft.editGeneration });
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
const response = await client.mutate({ mutation: gql `mutation($revisionId:String!,$editGeneration:Int!){publishTestSpecificationDraft(revisionId:$revisionId,editGeneration:$editGeneration)}`,
|
|
150
|
-
variables: { revisionId: this.draft.id, editGeneration: this.draft.editGeneration } });
|
|
151
|
-
this.assertResponse(response);
|
|
152
|
-
}
|
|
153
|
-
await this.load(this.draft.specId);
|
|
154
|
-
this.draft = this.overview.revisions.find(row => row.id === this.draft.id);
|
|
155
|
-
notify({ message: policy.data.masterChangePolicy.approvalRequired ? this.t('submitted', '승인을 요청했습니다. 승인 전에는 검사에 적용되지 않습니다.') : this.t('published', '정책에 따라 발행했습니다. 지정한 시각부터 적용됩니다.'), level: 'info' });
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
criteriaTable(revision, editable = false, before) {
|
|
159
|
-
const fields = ['id', 'description', 'evaluatedPropertyId', 'minimum', 'maximum', 'uom', 'expression'];
|
|
160
|
-
const value = (row, field) => ['minimum', 'maximum', 'uom'].includes(field) ? row.limit?.[field] : row[field];
|
|
161
|
-
return html `<table><thead><tr>${fields.map(field => html `<th>${field}</th>`)}${editable ? html `<th></th>` : ''}</tr></thead>
|
|
162
|
-
<tbody>${revision.criteria.map((row, index) => html `<tr>${fields.map(field => {
|
|
163
|
-
const prior = before?.criteria.find(item => item.id === row.id);
|
|
164
|
-
const changed = before && value(prior ?? {}, field) !== value(row, field);
|
|
165
|
-
return html `<td class=${changed ? 'changed' : ''}>${editable
|
|
166
|
-
? html `<input aria-label=${`${row.id || index + 1} ${field}`} .value=${String(value(row, field) ?? '')}
|
|
167
|
-
type=${['minimum', 'maximum'].includes(field) ? 'number' : 'text'} step="any"
|
|
168
|
-
@input=${(e) => this.criterion(index, field, e.target.value)}>`
|
|
169
|
-
: value(row, field) ?? '—'}${changed ? html `<div><small>← ${value(prior ?? {}, field) ?? '—'}</small></div>` : ''}</td>`;
|
|
170
|
-
})}${editable ? html `<td><button @click=${() => this.change('criteria', revision.criteria.filter((_, i) => i !== index))}>${this.t('remove', '삭제')}</button></td>` : ''}</tr>`)}
|
|
171
|
-
</tbody></table>`;
|
|
172
|
-
}
|
|
173
|
-
render() {
|
|
174
|
-
const current = this.overview?.schedule.find(row => row.state === 'current');
|
|
175
|
-
const currentRevision = this.overview?.revisions.find(row => row.id === current?.revisionId);
|
|
176
|
-
const readonly = !!this.draft?.frozenAt || this.busy;
|
|
177
|
-
return html `
|
|
178
|
-
<ox-grist .mode=${this.mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)} @select-record-change=${this.pick.bind(this)}></ox-grist>
|
|
179
|
-
<section aria-busy=${this.busy}>
|
|
180
|
-
${this.overview ? html `<div class="toolbar"><h3>${this.overview.name}</h3>
|
|
181
|
-
<button ?disabled=${this.busy} @click=${() => this.run(() => this.load(this.overview.specId))}>${this.t('refresh', '새로고침')}</button>
|
|
182
|
-
<button ?disabled=${this.busy} @click=${() => this.openRevision(currentRevision ?? { version: '1', effectiveFrom: new Date().toISOString(), reason: '', criteria: [] }, true)}>${this.t('fork', '변경 초안 만들기')}</button></div>
|
|
183
|
-
<h3>${this.t('schedule', '승인된 적용 시간표')}</h3>
|
|
184
|
-
<table><thead><tr><th>${this.t('state', '상태')}</th><th>${this.t('version', '버전')}</th><th>${this.t('from', '이 시각부터')}</th><th>${this.t('to', '이 시각 직전까지')}</th></tr></thead>
|
|
185
|
-
<tbody>${this.overview.schedule.map(row => html `<tr><td>${this.t(row.state, { current: '현재 적용', scheduled: '적용 예정', expired: '적용 종료' }[row.state] ?? row.state)}</td>
|
|
186
|
-
<td><button @click=${() => this.openRevision(this.overview.revisions.find(item => item.id === row.revisionId))}>${this.overview.revisions.find(item => item.id === row.revisionId)?.version}</button></td>
|
|
187
|
-
<td>${row.validFrom}</td><td>${row.validTo ?? '∞'}</td></tr>`)}</tbody></table>
|
|
188
|
-
${!current ? html `<p class="notice">${this.t('no-current', '현재 적용 가능한 승인본이 없습니다.')}</p>` : ''}
|
|
189
|
-
<h3>${this.t('drafts', '초안 · 상신본')}</h3><div class="toolbar">${this.overview.revisions.filter(row => !this.overview.schedule.some(segment => segment.revisionId === row.id)).map(row => html `
|
|
190
|
-
<button @click=${() => this.openRevision(row)}>${row.version} · ${row.frozenAt ? this.t('frozen', '상신본 — 결재 상태는 업무함에서 확인') : this.t('draft', '편집 초안')}</button>`)}</div>
|
|
191
|
-
` : !this.draft ? html `<p>${this.t('pick', '검사 명세를 선택하거나 새 명세를 만드십시오.')}</p>` : ''}
|
|
192
|
-
${this.draft ? html `<h3>${this.draft.frozenAt ? this.t('immutable', '동결된 내용 — 수정하려면 새 초안을 만드십시오') : this.t('editing', '편집 초안 — 아직 적용되지 않음')}</h3>
|
|
193
|
-
<div class="fields">
|
|
194
|
-
${!this.overview ? html `<label>${this.t('name', '명세 이름')}<input ?disabled=${readonly} .value=${this.newName} @input=${(e) => { this.newName = e.target.value; this.dirty = true; }}></label>` : ''}
|
|
195
|
-
${['version', 'description', 'effectiveFrom', 'reason'].map(field => html `<label>${this.t(field, { version: '버전', description: '설명', effectiveFrom: '적용 시작 (시간대 포함 ISO 시각)', reason: '변경 사유' }[field])}
|
|
196
|
-
<input ?disabled=${readonly} .value=${this.draft[field] ?? ''} @input=${(e) => this.change(field, e.target.value)}></label>`)}
|
|
197
|
-
</div>
|
|
198
|
-
${this.criteriaTable(this.draft, !readonly, currentRevision)}
|
|
199
|
-
${currentRevision ? html `<details><summary>${this.t('before', '현재 적용 중인 기준 전체 보기 (삭제된 항목 포함)')}</summary>${this.criteriaTable(currentRevision)}</details>` : ''}
|
|
200
|
-
<div class="toolbar">
|
|
201
|
-
<button ?disabled=${readonly} @click=${() => this.change('criteria', [...this.draft.criteria, { id: '' }])}>${this.t('add', '기준 추가')}</button>
|
|
202
|
-
<button ?disabled=${readonly} @click=${() => this.save()}>${this.t('save', '초안 저장')}</button>
|
|
203
|
-
<button ?disabled=${readonly} @click=${() => this.submit()}>${this.t('submit', '저장 후 발행 / 승인 요청')}</button>
|
|
204
|
-
${this.draft.frozenAt ? html `<button ?disabled=${this.busy} @click=${() => this.openRevision(this.draft, true)}>${this.t('fork', '변경 초안 만들기')}</button>` : ''}
|
|
205
|
-
${this.dirty ? html `<span>${this.t('unsaved', '저장하지 않은 변경이 있습니다.')}</span>` : ''}
|
|
206
|
-
</div>` : ''}
|
|
207
|
-
</section>`;
|
|
7
|
+
this.axis = 'testSpecification';
|
|
208
8
|
}
|
|
209
9
|
};
|
|
210
|
-
__decorate([
|
|
211
|
-
state(),
|
|
212
|
-
__metadata("design:type", Object)
|
|
213
|
-
], OpsMasterTestSpecification.prototype, "overview", void 0);
|
|
214
|
-
__decorate([
|
|
215
|
-
state(),
|
|
216
|
-
__metadata("design:type", Object)
|
|
217
|
-
], OpsMasterTestSpecification.prototype, "draft", void 0);
|
|
218
|
-
__decorate([
|
|
219
|
-
state(),
|
|
220
|
-
__metadata("design:type", Object)
|
|
221
|
-
], OpsMasterTestSpecification.prototype, "newName", void 0);
|
|
222
|
-
__decorate([
|
|
223
|
-
state(),
|
|
224
|
-
__metadata("design:type", Object)
|
|
225
|
-
], OpsMasterTestSpecification.prototype, "busy", void 0);
|
|
226
|
-
__decorate([
|
|
227
|
-
state(),
|
|
228
|
-
__metadata("design:type", Object)
|
|
229
|
-
], OpsMasterTestSpecification.prototype, "dirty", void 0);
|
|
230
10
|
OpsMasterTestSpecification = __decorate([
|
|
231
11
|
customElement('ops-master-test-specification')
|
|
232
12
|
], OpsMasterTestSpecification);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-specification.js","sourceRoot":"","sources":["../../../client/pages/master/test-specification.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist/ox-grist.js'\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\nimport { client } from '@operato/graphql'\nimport { i18next } from '@operato/i18n'\nimport { notify } from '@operato/layout'\nimport { EFFECTIVE, IDENTITY, MasterPageBase, MasterSpec } from './master-page-base.js'\nimport { requestMasterChangeApproval } from '../../master-change-approval.js'\n\ntype Revision = {\n id?: string; specId?: string; editGeneration?: number; frozenAt?: string; activityInstanceId?: string;\n version: string; description?: string; effectiveFrom: string; reason: string; criteria: any[];\n}\ntype Overview = { specId: string; name: string; generation: number; revisions: Revision[];\n schedule: { revisionId: string; validFrom: string; validTo?: string; state: string }[] }\n\n/** Identity list, approved schedule, and draft workspace are separate surfaces. */\n@customElement('ops-master-test-specification')\nexport class OpsMasterTestSpecification extends MasterPageBase {\n static styles = [...MasterPageBase.styles, css`\n :host { display:flex; flex-direction:column; min-height:0 }\n ox-grist { flex:2; min-height:160px }\n section { flex:3; overflow:auto; padding:16px; border-top:1px solid var(--ui-line,#ccd5da) }\n .toolbar,.fields { display:flex; flex-wrap:wrap; gap:12px; align-items:end; margin-bottom:12px }\n label { display:flex; flex-direction:column; gap:4px; font-size:13px }\n input,button { font:inherit; padding:7px; border:1px solid var(--ui-line,#ccd5da); border-radius:3px }\n input { min-width:100px; max-width:220px }\n button { cursor:pointer; background:var(--ui-panel-2,#f3f6f7) }\n button:disabled { cursor:default; opacity:.5 }\n table { width:100%; border-collapse:collapse; margin:10px 0 18px; font-size:13px }\n th,td { padding:7px; text-align:left; border-bottom:1px solid var(--ui-line,#ccd5da); vertical-align:top }\n td input { width:100%; min-width:70px; box-sizing:border-box }\n .notice { padding:10px; background:var(--ui-panel-2,#f3f6f7) }\n .changed { background:var(--status-warning-background,#fff2d0) }\n h3 { margin:14px 0 8px; font-size:15px }\n `]\n @state() private overview?: Overview\n @state() private draft?: Revision\n @state() private newName = ''\n @state() private busy = false\n @state() private dirty = false\n private loadSerial = 0\n private t(key: string, fallback: string) { return i18next.t(`test-spec-revision.${key}`, { defaultValue: fallback }) }\n protected get spec(): MasterSpec {\n return { key:'testSpecification', title:'test-specification', help:'ops-master/test-specification',\n query:'testSpecifications', mutation:'updateMultipleTestSpecification',\n columns:[...IDENTITY, { name:'version', label:'version', type:'string' as const }, ...EFFECTIVE].map(column => ({ ...column, readonly:true })) }\n }\n get context(): any {\n return { ...super.context, importable:undefined, actions:[{\n title:this.t('new','새 검사 명세'), icon:'add', emphasis:{raised:true}, action:() => this.startNew()\n }] }\n }\n protected configOf() {\n const config = super.configOf()\n return { ...config, rows:{ ...config.rows, appendable:false, selectable:{multiple:false} } }\n }\n private canLeave() { return !this.dirty || window.confirm(this.t('discard','저장하지 않은 초안을 버리시겠습니까?')) }\n private startNew() {\n if (this.busy || !this.canLeave()) return\n ++this.loadSerial\n this.overview = undefined\n this.newName = ''\n this.draft = { version:'1', effectiveFrom:new Date().toISOString(), reason:'', criteria:[] }\n this.dirty = false\n }\n private async pick(event: CustomEvent) {\n const record = event.detail?.records?.[0] ?? event.detail?.added?.[0]\n if (!record?.id || this.busy || !this.canLeave()) return\n await this.run(async () => { await this.load(record.id); this.draft = undefined; this.dirty = false })\n }\n private async load(specId: string) {\n const serial = ++this.loadSerial\n const response = await client.query({ query:gql`query($specId:String!){testSpecificationRevisions(specId:$specId)}`,\n variables:{specId}, fetchPolicy:'no-cache' })\n this.assertResponse(response)\n if (serial === this.loadSerial) this.overview = response.data.testSpecificationRevisions\n }\n private assertResponse(response: any) {\n if (response?.errors?.length) throw new Error(response.errors.map((error:any) => error.message).join('\\n'))\n if (!response?.data) throw new Error(this.t('no-response','서버 응답을 확인할 수 없습니다. 다시 조회하십시오.'))\n }\n private async run(work: () => Promise<void>) {\n if (this.busy) return\n this.busy = true\n try { await work() } catch(error) { notify({message:(error as Error).message, level:'error'}) }\n finally { this.busy = false }\n }\n private openRevision(revision: Revision, fork = false) {\n if (this.busy || !this.canLeave()) return\n this.draft = JSON.parse(JSON.stringify(revision))\n if (fork) this.draft = { ...this.draft!, id:undefined, frozenAt:undefined, activityInstanceId:undefined,\n editGeneration:undefined, effectiveFrom:new Date().toISOString(), reason:'' }\n this.dirty = false\n }\n private change(field: string, value: any) { this.draft = { ...this.draft!, [field]:value }; this.dirty = true }\n private criterion(index:number, field:string, value:string) {\n const criteria = this.draft!.criteria.map(row => ({ ...row, ...(row.limit ? { limit:{...row.limit} } : {}) }))\n if (['minimum','maximum','uom'].includes(field)) {\n criteria[index].limit ??= {}\n if (!value) delete criteria[index].limit[field]\n else criteria[index].limit[field] = field === 'uom' ? value : Number(value)\n if (!Object.keys(criteria[index].limit).length) delete criteria[index].limit\n } else criteria[index][field] = value\n this.change('criteria',criteria)\n }\n protected async save() { await this.run(() => this.persist()) }\n private async persist() {\n if (!this.draft || this.draft.frozenAt) return\n const { version, description, effectiveFrom, reason, criteria } = this.draft\n const content = { version, description, effectiveFrom, reason, criteria }\n const response = this.draft.id\n ? await client.mutate({ mutation:gql`mutation($revisionId:String!,$editGeneration:Int!,$content:Object!){editTestSpecificationDraft(revisionId:$revisionId,editGeneration:$editGeneration,content:$content)}`,\n variables:{revisionId:this.draft.id,editGeneration:this.draft.editGeneration,content} })\n : await client.mutate({ mutation:gql`mutation($specId:String,$name:String,$content:Object!){createTestSpecificationDraft(specId:$specId,name:$name,content:$content)}`,\n variables:{specId:this.overview?.specId,name:this.overview ? undefined : this.newName,content} })\n this.assertResponse(response)\n this.draft = response.data.editTestSpecificationDraft ?? response.data.createTestSpecificationDraft\n this.dirty = false\n await this.load(this.draft!.specId!)\n this.grist?.fetch()\n }\n private async submit() {\n await this.run(async () => {\n await this.persist()\n if (!this.draft?.id || this.draft.frozenAt) return\n const policy = await client.query({ query:gql`query { masterChangePolicy(axis:\"testSpecification\") }`, fetchPolicy:'no-cache' })\n this.assertResponse(policy)\n if (policy.data.masterChangePolicy.approvalRequired) {\n await requestMasterChangeApproval(this, { axis:'testSpecification', revisionId:this.draft.id, editGeneration:this.draft.editGeneration! })\n } else {\n const response = await client.mutate({ mutation:gql`mutation($revisionId:String!,$editGeneration:Int!){publishTestSpecificationDraft(revisionId:$revisionId,editGeneration:$editGeneration)}`,\n variables:{revisionId:this.draft.id,editGeneration:this.draft.editGeneration} })\n this.assertResponse(response)\n }\n await this.load(this.draft.specId!)\n this.draft = this.overview!.revisions.find(row => row.id === this.draft!.id)\n notify({message:policy.data.masterChangePolicy.approvalRequired ? this.t('submitted','승인을 요청했습니다. 승인 전에는 검사에 적용되지 않습니다.') : this.t('published','정책에 따라 발행했습니다. 지정한 시각부터 적용됩니다.'),level:'info'})\n })\n }\n private criteriaTable(revision: Revision, editable = false, before?: Revision) {\n const fields = ['id','description','evaluatedPropertyId','minimum','maximum','uom','expression']\n const value = (row:any, field:string) => ['minimum','maximum','uom'].includes(field) ? row.limit?.[field] : row[field]\n return html`<table><thead><tr>${fields.map(field => html`<th>${field}</th>`)}${editable ? html`<th></th>` : ''}</tr></thead>\n <tbody>${revision.criteria.map((row,index) => html`<tr>${fields.map(field => {\n const prior = before?.criteria.find(item => item.id === row.id)\n const changed = before && value(prior ?? {},field) !== value(row,field)\n return html`<td class=${changed ? 'changed' : ''}>${editable\n ? html`<input aria-label=${`${row.id || index+1} ${field}`} .value=${String(value(row,field) ?? '')}\n type=${['minimum','maximum'].includes(field) ? 'number' : 'text'} step=\"any\"\n @input=${(e:Event) => this.criterion(index,field,(e.target as HTMLInputElement).value)}>`\n : value(row,field) ?? '—'}${changed ? html`<div><small>← ${value(prior ?? {},field) ?? '—'}</small></div>` : ''}</td>`\n })}${editable ? html`<td><button @click=${() => this.change('criteria',revision.criteria.filter((_,i)=>i!==index))}>${this.t('remove','삭제')}</button></td>` : ''}</tr>`)}\n </tbody></table>`\n }\n render() {\n const current = this.overview?.schedule.find(row => row.state === 'current')\n const currentRevision = this.overview?.revisions.find(row => row.id === current?.revisionId)\n const readonly = !!this.draft?.frozenAt || this.busy\n return html`\n <ox-grist .mode=${this.mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)} @select-record-change=${this.pick.bind(this)}></ox-grist>\n <section aria-busy=${this.busy}>\n ${this.overview ? html`<div class=\"toolbar\"><h3>${this.overview.name}</h3>\n <button ?disabled=${this.busy} @click=${() => this.run(()=>this.load(this.overview!.specId))}>${this.t('refresh','새로고침')}</button>\n <button ?disabled=${this.busy} @click=${() => this.openRevision(currentRevision ?? {version:'1',effectiveFrom:new Date().toISOString(),reason:'',criteria:[]},true)}>${this.t('fork','변경 초안 만들기')}</button></div>\n <h3>${this.t('schedule','승인된 적용 시간표')}</h3>\n <table><thead><tr><th>${this.t('state','상태')}</th><th>${this.t('version','버전')}</th><th>${this.t('from','이 시각부터')}</th><th>${this.t('to','이 시각 직전까지')}</th></tr></thead>\n <tbody>${this.overview.schedule.map(row => html`<tr><td>${this.t(row.state, {current:'현재 적용',scheduled:'적용 예정',expired:'적용 종료'}[row.state] ?? row.state)}</td>\n <td><button @click=${()=>this.openRevision(this.overview!.revisions.find(item=>item.id===row.revisionId)!)}>${this.overview!.revisions.find(item=>item.id===row.revisionId)?.version}</button></td>\n <td>${row.validFrom}</td><td>${row.validTo ?? '∞'}</td></tr>`)}</tbody></table>\n ${!current ? html`<p class=\"notice\">${this.t('no-current','현재 적용 가능한 승인본이 없습니다.')}</p>` : ''}\n <h3>${this.t('drafts','초안 · 상신본')}</h3><div class=\"toolbar\">${this.overview.revisions.filter(row=>!this.overview!.schedule.some(segment=>segment.revisionId===row.id)).map(row=>html`\n <button @click=${()=>this.openRevision(row)}>${row.version} · ${row.frozenAt ? this.t('frozen','상신본 — 결재 상태는 업무함에서 확인') : this.t('draft','편집 초안')}</button>`)}</div>\n ` : !this.draft ? html`<p>${this.t('pick','검사 명세를 선택하거나 새 명세를 만드십시오.')}</p>` : ''}\n ${this.draft ? html`<h3>${this.draft.frozenAt ? this.t('immutable','동결된 내용 — 수정하려면 새 초안을 만드십시오') : this.t('editing','편집 초안 — 아직 적용되지 않음')}</h3>\n <div class=\"fields\">\n ${!this.overview ? html`<label>${this.t('name','명세 이름')}<input ?disabled=${readonly} .value=${this.newName} @input=${(e:Event)=>{this.newName=(e.target as HTMLInputElement).value;this.dirty=true}}></label>` : ''}\n ${['version','description','effectiveFrom','reason'].map(field=>html`<label>${this.t(field,{version:'버전',description:'설명',effectiveFrom:'적용 시작 (시간대 포함 ISO 시각)',reason:'변경 사유'}[field]!)}\n <input ?disabled=${readonly} .value=${this.draft![field] ?? ''} @input=${(e:Event)=>this.change(field,(e.target as HTMLInputElement).value)}></label>`)}\n </div>\n ${this.criteriaTable(this.draft,!readonly,currentRevision)}\n ${currentRevision ? html`<details><summary>${this.t('before','현재 적용 중인 기준 전체 보기 (삭제된 항목 포함)')}</summary>${this.criteriaTable(currentRevision)}</details>` : ''}\n <div class=\"toolbar\">\n <button ?disabled=${readonly} @click=${()=>this.change('criteria',[...this.draft!.criteria,{id:''}])}>${this.t('add','기준 추가')}</button>\n <button ?disabled=${readonly} @click=${()=>this.save()}>${this.t('save','초안 저장')}</button>\n <button ?disabled=${readonly} @click=${()=>this.submit()}>${this.t('submit','저장 후 발행 / 승인 요청')}</button>\n ${this.draft.frozenAt ? html`<button ?disabled=${this.busy} @click=${()=>this.openRevision(this.draft!,true)}>${this.t('fork','변경 초안 만들기')}</button>` : ''}\n ${this.dirty ? html`<span>${this.t('unsaved','저장하지 않은 변경이 있습니다.')}</span>` : ''}\n </div>` : ''}\n </section>`\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"test-specification.js","sourceRoot":"","sources":["../../../client/pages/master/test-specification.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAIpD,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,iBAAiB;IAA1D;;QACK,SAAI,GAAiB,mBAAmB,CAAA;IACpD,CAAC;CAAA,CAAA;AAFY,0BAA0B;IADtC,aAAa,CAAC,+BAA+B,CAAC;GAClC,0BAA0B,CAEtC","sourcesContent":["import { customElement } from 'lit/decorators.js'\nimport { RevisionWorkspace } from './revision-workspace.js'\nimport { RevisionAxis } from './revision-view.js'\n\n@customElement('ops-master-test-specification')\nexport class OpsMasterTestSpecification extends RevisionWorkspace {\n protected axis: RevisionAxis = 'testSpecification'\n}\n"]}
|