@things-factory/worklist 10.1.266 → 10.1.268
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/components/activity-fields.d.ts +5 -0
- package/dist-client/components/activity-fields.js +19 -6
- package/dist-client/components/activity-fields.js.map +1 -1
- package/dist-client/components/activity-thread-timeline.d.ts +2 -2
- package/dist-client/components/decision-content.js +25 -4
- package/dist-client/components/decision-content.js.map +1 -1
- package/dist-client/components/decision-slots.d.ts +11 -0
- package/dist-client/components/decision-slots.js +11 -0
- package/dist-client/components/decision-slots.js.map +1 -1
- package/dist-client/components/source-link.d.ts +7 -1
- package/dist-client/components/source-link.js +27 -2
- package/dist-client/components/source-link.js.map +1 -1
- package/dist-client/pages/activity-approval/activity-approval-page.js +2 -1
- package/dist-client/pages/activity-approval/activity-approval-page.js.map +1 -1
- package/dist-client/pages/activity-instance/activity-instance-view.d.ts +17 -2
- package/dist-client/pages/activity-instance/activity-instance-view.js +112 -61
- package/dist-client/pages/activity-instance/activity-instance-view.js.map +1 -1
- package/dist-client/pages/activity-thread/activity-thread-page.js +2 -1
- package/dist-client/pages/activity-thread/activity-thread-page.js.map +1 -1
- package/dist-client/pages/activity-thread/activity-thread-view.d.ts +1 -1
- package/dist-client/pages/approval-progress/approval-progress-page.js +2 -1
- package/dist-client/pages/approval-progress/approval-progress-page.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/templates/activity-approval-context-template.js +6 -2
- package/dist-client/templates/activity-approval-context-template.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -12
- package/translations/en.json +3 -1
- package/translations/es.json +3 -1
- package/translations/ja.json +3 -1
- package/translations/ko.json +3 -1
- package/translations/ms.json +3 -1
- package/translations/zh.json +3 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity-instance-view.js","sourceRoot":"","sources":["../../../client/pages/activity-instance/activity-instance-view.ts"],"names":[],"mappings":"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","sourcesContent":["import '@things-factory/organization/dist-client/component/approval-line-view.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\n\nimport { QueryController } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { ScrollbarStyles } from '@operato/styles'\n\nimport { ActivityFieldsStyles, declaredLabel, inputSpecOf, outputSpecOf, renderGiven } from '../../components/activity-fields.js'\nimport { DecisionContentStyles, DecisionKeysFields, renderDecision } from '../../components/decision-content.js'\nimport { WorklistStateColors } from '../../components/state-ribon.js'\nimport { ActivityInstance } from '../../types/activity-instance.js'\nimport { ActivityThread } from '../../types/activity-thread.js'\nimport { ActivityApproval } from '../../types/activity-approval.js'\nimport { entity360Name } from '@operato/layout'\n\nfunction getSafeFormatter(locale: string, options: Intl.DateTimeFormatOptions): Intl.DateTimeFormat {\n try {\n const safeLocale = locale || 'en-US'\n return new Intl.DateTimeFormat(safeLocale, options)\n } catch (e) {\n console.warn(`Invalid locale or options provided: ${locale}, falling back to default en-US.`, e)\n return new Intl.DateTimeFormat('en-US', options)\n }\n}\n\nconst formatter = getSafeFormatter(navigator.language, { dateStyle: 'full', timeStyle: 'short' })\n@customElement('activity-instance-view')\nexport class ActivityInstanceView extends localize(i18next)(LitElement) {\n static styles = [\n ScrollbarStyles,\n WorklistStateColors,\n ActivityFieldsStyles,\n DecisionContentStyles,\n css`\n :host {\n display: flex;\n overflow: auto;\n font-size: var(--fontsize-default);\n }\n [instance-container] {\n flex: 1;\n background-color: var(--md-sys-color-background);\n border-right: var(--border-dim-color);\n padding: var(--spacing-large);\n color: var(--md-sys-color-secondary);\n }\n [thread-container] {\n flex: 2;\n padding: var(--spacing-large);\n }\n [instance-container] div {\n margin-bottom: var(--spacing-medium);\n padding-bottom: var(--spacing-medium);\n border-bottom: var(--border-dim-color);\n }\n /* The state speaks through the icon's colour on a quiet disc, as in the ribbons - a filled disc\n under an on-primary icon read under 3:1 for three states. */\n [header] md-icon {\n background-color: var(--md-sys-color-surface-container-high);\n float: left;\n margin-right: var(--spacing-medium);\n padding: var(--spacing-medium);\n border-radius: 50%;\n float: left;\n font-size: 1.8em;\n color: var(--worklist-state-color, var(--ui-muted, #57676f));\n }\n [header] strong {\n display: block;\n font: bold 22px / 1.1 var(--theme-font);\n }\n [header] {\n overflow: hidden;\n font-size: var(--fontsize-small);\n }\n [instance-container] div label {\n display: inline-block;\n margin-right: var(--spacing-medium);\n min-width: 50px;\n }\n [issuer] md-icon {\n opacity: 0.5;\n position: relative;\n top: 4px;\n font-size: 20px;\n }\n span[status] {\n width: 15px;\n height: 15px;\n position: relative;\n top: 2px;\n background-color: var(--worklist-state-color, var(--ui-muted, #57676f));\n display: inline-block;\n margin-right: var(--spacing-small);\n border-radius: 50%;\n }\n [thread-container] table {\n width: 100%;\n border-collapse: collapse;\n }\n [thread-container] th {\n color: var(--md-sys-color-on-primary-container);\n background-color: var(--md-sys-color-primary-container);\n border-top: var(--grid-header-top-border);\n border-bottom: var(--grid-header-bottom-border);\n padding: var(--grid-header-padding);\n text-overflow: ellipsis;\n font: var(--grid-header-font);\n }\n [thread-container] td {\n padding: var(--spacing-small);\n border-bottom: var(--grid-record-border-bottom);\n }\n [assignee] * {\n vertical-align: middle;\n }\n [assignee] md-icon {\n opacity: 0.5;\n }\n [subtitle] {\n display: block;\n margin: var(--spacing-large) 0 var(--spacing-small) 0;\n padding: var(--spacing-small) var(--spacing-medium);\n color: var(--md-sys-color-on-surface);\n background-color: var(--md-sys-color-surface-variant);\n font: bold 16px var(--theme-font);\n border: 2px solid var(--md-sys-color-outline);\n border-radius: 999px;\n }\n [timeline] ol {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n [timeline] li {\n display: flex;\n }\n [timeline] [info] {\n color: var(--md-sys-color-on-surface);\n background: var(--md-sys-color-surface-variant);\n\n flex: 1;\n }\n [timeline] [date] {\n opacity: 0.7;\n width: 130px;\n font-size: var(--fontsize-small);\n }\n [timeline] [info] strong {\n float: right;\n }\n [timeline] [status] {\n margin: 0 var(--spacing-small);\n display: block;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n position: relative;\n top: 3px;\n /* The ring separates the dot from the line behind it, so it is the page's own colour. */\n border: 2px solid var(--md-sys-color-surface);\n background-color: var(--worklist-state-color, var(--ui-muted, #57676f));\n }\n [timeline] [status]::before {\n content: '';\n height: 60px;\n width: 2px;\n display: block;\n position: relative;\n margin-left: 5px;\n background-color: var(--worklist-state-color, var(--ui-muted, #57676f));\n opacity: 0.2;\n }\n [timeline] [info] md-icon {\n position: relative;\n top: 3px;\n font-size: var(--fontsize-large);\n }\n [timeline] [info] p {\n /* A fixed light grey under text that follows the theme was light-on-light in the dark theme. */\n background-color: var(--md-sys-color-surface-container);\n color: var(--md-sys-color-on-surface);\n margin: var(--spacing-small) 0 var(--spacing-medium) 0;\n padding: var(--spacing-small) var(--spacing-medium);\n border-radius: var(--border-radius);\n font-size: var(--fontsize-small);\n text-align: justify;\n }\n [timeline] [info] p::before {\n content: '';\n float: right;\n margin-top: -10px;\n margin-right: 20px;\n border: 7px solid transparent;\n border-bottom-color: var(--md-sys-color-surface-container);\n border-top: 0;\n }\n [thread] div {\n border-bottom: var(--border-dim-color);\n padding: var(--spacing-small);\n text-align: right;\n overflow: hidden;\n }\n [thread] div label {\n float: left;\n width: 25%;\n text-align: left;\n }\n `\n ]\n\n @property({\n type: String,\n attribute: 'activity-instance-id'\n })\n activityInstanceId?: string\n\n /* The instance the id names (ADR-0190). */\n private instance = new QueryController(\n this,\n gql`\n query ($id: String!) {\n activityInstance(id: $id) {\n id\n name\n description\n state\n key01\n key02\n key03\n key04\n key05\n input\n output\n issuer {\n id\n name\n email\n }\n starter {\n name\n email\n }\n activity {\n id\n name\n description\n searchKeys {\n name\n description\n inputKey\n tKey\n }\n ${DecisionKeysFields}\n model {\n name\n description\n active\n tag\n inout\n type\n unit\n options\n quantifier\n spec\n hidden\n }\n }\n approvalLine {\n type\n participation\n notifyAfter\n value\n approver {\n id\n name\n description\n controlNo\n }\n }\n activityThreads {\n state\n transaction\n output\n assignee {\n id\n name\n email\n }\n round\n activityApprovals {\n round\n order\n approver {\n id\n name\n email\n }\n judgment\n participation\n comment\n createdAt\n terminatedAt\n }\n assignedAt\n startedAt\n terminatedAt\n }\n updater {\n id\n name\n }\n assignedAt\n startedAt\n terminatedAt\n updatedAt\n }\n }\n `,\n { variables: () => (this.activityInstanceId ? { id: this.activityInstanceId } : undefined) }\n )\n\n get activityInstance(): ActivityInstance | undefined {\n return this.instance.data?.activityInstance\n }\n\n render() {\n if (!this.activityInstance) {\n return html`<div>no activity instance info.</div>`\n }\n\n const { id, name, description, state, issuer, assignedAt, startedAt, activityThreads, terminatedAt, updatedAt } =\n this.activityInstance\n\n return html`\n <div instance-container>\n <div header>\n <md-icon>description</md-icon>\n <strong>${name}</strong>\n ${description}\n </div>\n\n <div>\n <label>${i18next.t('label.status')}</label>\n <span status></span>\n <strong>${i18next.t('label.activity-state-' + state)}</strong>\n </div>\n\n <div issuer>\n <label>${i18next.t('field.issuer')}</label>\n <md-icon>account_circle</md-icon>\n <strong>${entity360Name(issuer)}</strong>\n </div>\n <div>\n <label>${i18next.t('field.assigned-at')}</label>${assignedAt && formatter.format(new Date(assignedAt))}\n </div>\n <div><label>${i18next.t('field.started-at')}</label>${startedAt && formatter.format(new Date(startedAt))}</div>\n <div><label>${i18next.t('field.updated-at')}</label>${updatedAt && formatter.format(new Date(updatedAt))}</div>\n <div>\n <label>${i18next.t('field.terminated-at')}</label>${terminatedAt && formatter.format(new Date(terminatedAt))}\n </div>\n </div>\n <div thread-container>\n ${this.renderRequest()}\n ${activityThreads?.map(activityThread => this.renderActivityThread(this.activityInstance!, activityThread))}\n </div>\n `\n }\n\n /**\n * What was asked - the same drawing the task and approval screens use.\n *\n * 상신함 opens what I put up here. Without this the view showed the name, the state and the\n * history, and not the request itself: an expenditure request's payee and lines live only in its\n * decision, every model field being hidden. The declaration goes first and the given values are\n * the fallback, as on the task screen (thread-sections).\n */\n renderRequest() {\n const { activity, input } = this.activityInstance!\n const decision = renderDecision(activity?.decisionKeys, input)\n\n if (decision !== nothing) {\n return decision\n }\n\n const given = inputSpecOf(activity?.model)\n\n return given.length\n ? html`<section readonly>\n <h2>${i18next.t('label.activity-input')}</h2>\n ${renderGiven(given, input)}\n </section>`\n : nothing\n }\n\n renderActivityThread(activityInstance: ActivityInstance, activityThread: ActivityThread) {\n const {\n state,\n assignee,\n output,\n round,\n activityApprovals = [],\n assignedAt,\n startedAt,\n terminatedAt\n } = activityThread\n const { approvalLine } = activityInstance!\n const { name, email } = assignee || {}\n const approvals = activityApprovals.sort((a, b) =>\n a.round < b.round ? 1 : a.round > b.round ? -1 : a.order! < b.order! ? 1 : -1\n )\n const current = approvals[0]?.round == round ? approvals[0].order : -1\n\n return html`\n <div assignee>\n <md-icon>account_circle</md-icon>\n <strong>${name}</strong>\n </div>\n\n <div thread>\n <span subtitle>${i18next.t('label.thread-basics')}</span>\n <div>\n <label>${i18next.t('label.status')}</label>\n <span status></span>\n <strong>${i18next.t('label.activity-state-' + state)}</strong>\n </div>\n <div>\n <label>${i18next.t('field.assigned-at')}</label> ${assignedAt && formatter.format(new Date(assignedAt))}\n </div>\n <div><label>${i18next.t('field.started-at')}</label> ${startedAt && formatter.format(new Date(startedAt))}</div>\n <div>\n <label>${i18next.t('field.terminated-at')}</label> ${terminatedAt && formatter.format(new Date(terminatedAt))}\n </div>\n <div><label>${i18next.t('field.round')}</label> ${round}</div>\n </div>\n\n ${this.renderWritten(output || {})}\n <div timeline>\n <span subtitle>${i18next.t('label.timeline')}</span>\n\n <div>\n ${approvalLine\n ? html`<approval-line-view .model=${approvalLine} .current=${current}></approval-line-view>`\n : html``}\n </div>\n\n <ol>\n ${approvals.map(approval => this.renderActivityApproval(approval))}\n </ol>\n </div>\n `\n }\n\n renderActivityApproval(activityApproval: ActivityApproval) {\n const { judgment, approver, comment, round, order, createdAt, terminatedAt } = activityApproval\n const { name, email } = approver || {}\n\n return html`\n <li>\n <span date>${formatter.format(new Date(terminatedAt || createdAt!))}</span>\n <span status></span>\n <span info>\n ${i18next.t('label.activity-state-' + (judgment || 'started'))}\n <strong><md-icon>account_circle</md-icon>${name}</strong>\n <p>${comment}</p>\n </span>\n </li>\n `\n }\n\n renderSearchKeys() {\n const { activity } = this.activityInstance!\n const { searchKeys = [] } = activity! || {}\n\n return html`\n <table>\n <tr>\n <th>${i18next.t('label.name')}</th>\n <th>${i18next.t('label.value')}</th>\n </tr>\n\n ${searchKeys?.map(\n (item, index) => html`\n <tr>\n <td>${declaredLabel(item)}</td>\n <td>${this.activityInstance![`key0${index + 1}`]}</td>\n </tr>\n `\n )}\n </table>\n `\n }\n\n /**\n * What the assignee wrote - the fields the model declares as output and does not hide.\n *\n * This listed every model field by its developer name, hidden ones too, with the value read from the\n * output: an expenditure request showed requestId · month · requester · payee · lines, all empty,\n * under 「산출물」. 상신함 opens this view for anyone who put something up, so it draws what the task\n * screen draws, and nothing when the activity has nothing to write.\n */\n renderWritten(output: any) {\n const written = outputSpecOf(this.activityInstance!.activity?.model)\n\n return written.length\n ? html`<div>\n <span subtitle>${i18next.t('field.artifact')}</span>\n ${renderGiven(written, output)}\n </div>`\n : nothing\n }\n\n /* The colour of the header follows the state of the instance shown. */\n updated(changes) {\n this.setAttribute('state', this.activityInstance?.state || '')\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"activity-instance-view.js","sourceRoot":"","sources":["../../../client/pages/activity-instance/activity-instance-view.ts"],"names":[],"mappings":"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","sourcesContent":["import '@things-factory/organization/dist-client/component/approval-line-view.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\n\nimport { QueryController } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { ScrollbarStyles } from '@operato/styles'\n\nimport { ActivityFieldsStyles, declaredLabel, inputSpecOf, outputSpecOf, renderGiven } from '../../components/activity-fields.js'\nimport { DecisionContentStyles, DecisionKeysFields, renderDecision } from '../../components/decision-content.js'\nimport { renderSourceLink, SourceLinkStyles } from '../../components/source-link.js'\nimport { WorklistStateColors } from '../../components/state-ribon.js'\nimport { ActivityInstance } from '../../types/activity-instance.js'\nimport { ActivityThread } from '../../types/activity-thread.js'\nimport { ActivityApproval } from '../../types/activity-approval.js'\nimport { entity360Name } from '@operato/layout'\n\nimport { currentStepRows } from '../../../shared/approval-step.js'\nimport { whenText } from '../../when.js'\n\n@customElement('activity-instance-view')\nexport class ActivityInstanceView extends localize(i18next)(LitElement) {\n static styles = [\n ScrollbarStyles,\n WorklistStateColors,\n ActivityFieldsStyles,\n DecisionContentStyles,\n SourceLinkStyles,\n css`\n :host {\n display: flex;\n overflow: auto;\n font-size: var(--fontsize-default);\n }\n [instance-container] {\n flex: 1;\n background-color: var(--md-sys-color-background);\n border-right: var(--border-dim-color);\n padding: var(--spacing-large);\n color: var(--md-sys-color-secondary);\n }\n [thread-container] {\n flex: 2;\n padding: var(--spacing-large);\n }\n [instance-container] div {\n margin-bottom: var(--spacing-medium);\n padding-bottom: var(--spacing-medium);\n border-bottom: var(--border-dim-color);\n }\n /* The state speaks through the icon's colour on a quiet disc, as in the ribbons - a filled disc\n under an on-primary icon read under 3:1 for three states. */\n [header] md-icon {\n background-color: var(--md-sys-color-surface-container-high);\n float: left;\n margin-right: var(--spacing-medium);\n padding: var(--spacing-medium);\n border-radius: 50%;\n float: left;\n font-size: 1.8em;\n color: var(--worklist-state-color, var(--ui-muted, #57676f));\n }\n [header] strong {\n display: block;\n font: bold 22px / 1.1 var(--theme-font);\n }\n [header] {\n overflow: hidden;\n font-size: var(--fontsize-small);\n }\n [instance-container] div label {\n display: inline-block;\n margin-right: var(--spacing-medium);\n min-width: 50px;\n }\n [issuer] md-icon {\n opacity: 0.5;\n position: relative;\n top: 4px;\n font-size: 20px;\n }\n span[status] {\n width: 15px;\n height: 15px;\n position: relative;\n top: 2px;\n background-color: var(--worklist-state-color, var(--ui-muted, #57676f));\n display: inline-block;\n margin-right: var(--spacing-small);\n border-radius: 50%;\n }\n [thread-container] table {\n width: 100%;\n border-collapse: collapse;\n }\n [thread-container] th {\n color: var(--md-sys-color-on-primary-container);\n background-color: var(--md-sys-color-primary-container);\n border-top: var(--grid-header-top-border);\n border-bottom: var(--grid-header-bottom-border);\n padding: var(--grid-header-padding);\n text-overflow: ellipsis;\n font: var(--grid-header-font);\n }\n [thread-container] td {\n padding: var(--spacing-small);\n border-bottom: var(--grid-record-border-bottom);\n }\n [assignee] * {\n vertical-align: middle;\n }\n [assignee] md-icon {\n opacity: 0.5;\n }\n [subtitle] {\n display: block;\n margin: var(--spacing-large) 0 var(--spacing-small) 0;\n padding: var(--spacing-small) var(--spacing-medium);\n color: var(--md-sys-color-on-surface);\n background-color: var(--md-sys-color-surface-variant);\n font: bold 16px var(--theme-font);\n border: 2px solid var(--md-sys-color-outline);\n border-radius: 999px;\n }\n [timeline] ol {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n [timeline] li {\n display: flex;\n }\n [timeline] [info] {\n color: var(--md-sys-color-on-surface);\n background: var(--md-sys-color-surface-variant);\n\n flex: 1;\n }\n [timeline] [date] {\n opacity: 0.7;\n width: 130px;\n font-size: var(--fontsize-small);\n }\n [timeline] [info] strong {\n float: right;\n }\n [timeline] [status] {\n margin: 0 var(--spacing-small);\n display: block;\n border-radius: 50%;\n width: 12px;\n height: 12px;\n position: relative;\n top: 3px;\n /* The ring separates the dot from the line behind it, so it is the page's own colour. */\n border: 2px solid var(--md-sys-color-surface);\n background-color: var(--worklist-state-color, var(--ui-muted, #57676f));\n }\n [timeline] [status]::before {\n content: '';\n height: 60px;\n width: 2px;\n display: block;\n position: relative;\n margin-left: 5px;\n background-color: var(--worklist-state-color, var(--ui-muted, #57676f));\n opacity: 0.2;\n }\n [timeline] [info] md-icon {\n position: relative;\n top: 3px;\n font-size: var(--fontsize-large);\n }\n [timeline] [info] p {\n /* A fixed light grey under text that follows the theme was light-on-light in the dark theme. */\n background-color: var(--md-sys-color-surface-container);\n color: var(--md-sys-color-on-surface);\n margin: var(--spacing-small) 0 var(--spacing-medium) 0;\n padding: var(--spacing-small) var(--spacing-medium);\n border-radius: var(--border-radius);\n font-size: var(--fontsize-small);\n text-align: justify;\n }\n [timeline] [info] p::before {\n content: '';\n float: right;\n margin-top: -10px;\n margin-right: 20px;\n border: 7px solid transparent;\n border-bottom-color: var(--md-sys-color-surface-container);\n border-top: 0;\n }\n [thread] div {\n border-bottom: var(--border-dim-color);\n padding: var(--spacing-small);\n text-align: right;\n overflow: hidden;\n }\n [thread] div label {\n float: left;\n width: 25%;\n text-align: left;\n }\n `\n ]\n\n @property({\n type: String,\n attribute: 'activity-instance-id'\n })\n activityInstanceId?: string\n\n /* The instance the id names (ADR-0190). */\n private instance = new QueryController(\n this,\n gql`\n query ($id: String!) {\n activityInstance(id: $id) {\n id\n name\n description\n state\n key01\n key02\n key03\n key04\n key05\n input\n output\n issuer {\n id\n name\n email\n }\n starter {\n name\n email\n }\n activity {\n id\n name\n description\n searchKeys {\n name\n description\n inputKey\n tKey\n }\n ${DecisionKeysFields}\n model {\n name\n description\n active\n tag\n inout\n type\n unit\n options\n quantifier\n spec\n hidden\n }\n }\n approvalLine {\n type\n participation\n notifyAfter\n value\n approver {\n id\n name\n description\n controlNo\n }\n }\n activityThreads {\n state\n transaction\n output\n assignee {\n id\n name\n email\n }\n round\n activityApprovals {\n round\n order\n approver {\n id\n name\n email\n }\n judgment\n participation\n comment\n createdAt\n terminatedAt\n }\n assignedAt\n startedAt\n terminatedAt\n }\n updater {\n id\n name\n }\n assignedAt\n startedAt\n terminatedAt\n updatedAt\n }\n }\n `,\n { variables: () => (this.activityInstanceId ? { id: this.activityInstanceId } : undefined) }\n )\n\n get activityInstance(): ActivityInstance | undefined {\n return this.instance.data?.activityInstance\n }\n\n render() {\n if (!this.activityInstance) {\n return html`<div>no activity instance info.</div>`\n }\n\n const { state, issuer, assignedAt, startedAt, activityThreads, terminatedAt } = this.activityInstance\n const decision = this.renderRequest()\n const threads = activityThreads || []\n const several = threads.length > 1\n\n /*\n * The case once (2026-11-10). The decision already draws the title and what approving does; the\n * header here drew them again beside it, and the popup's title a third time. The header stays for\n * an activity with no decision to draw. Start is said only when it is not the assignment, finish\n * only once there is one - three rows of the same minute and an empty one told nothing.\n */\n return html`\n <div instance-container>\n ${decision === nothing ? this.renderHeader() : nothing}\n\n <div>\n <label>${i18next.t('label.status')}</label>\n <span status></span>\n <strong>${this.stateText()}</strong>\n </div>\n\n <div issuer>\n <label>${i18next.t('field.issuer')}</label>\n <md-icon>account_circle</md-icon>\n <strong>${entity360Name(issuer)}</strong>\n </div>\n <div><label>${i18next.t('field.assigned-at')}</label>${whenText(assignedAt)}</div>\n ${startedAt && !sameMinute(startedAt, assignedAt)\n ? html`<div><label>${i18next.t('field.started-at')}</label>${whenText(startedAt)}</div>`\n : nothing}\n ${terminatedAt ? html`<div><label>${i18next.t('field.terminated-at')}</label>${whenText(terminatedAt)}</div>` : nothing}\n </div>\n <div thread-container>\n ${decision}\n <!-- 결재 현황 opens a case here; the approver reaches the record from it as from the approval screen. -->\n ${renderSourceLink(this.activityInstance.input)}\n ${threads.map(activityThread => this.renderActivityThread(this.activityInstance!, activityThread, several))}\n </div>\n `\n }\n\n renderHeader() {\n const { name, description } = this.activityInstance!\n\n return html`\n <div header>\n <md-icon>description</md-icon>\n <strong>${name}</strong>\n ${description}\n </div>\n `\n }\n\n /**\n * One state for the case. While the line waits, the state that matters is whose turn it is - the\n * case said 「시작됨」 and the drafter's thread 「상위승인중」 beside it, and neither named the one\n * the case waits on. The turn is the server's rule (shared/approval-step.js).\n */\n stateText() {\n const { state, terminatedAt } = this.activityInstance!\n const waiting = terminatedAt ? [] : this.waitingNames()\n\n return waiting.length\n ? i18next.t('text.approval-waiting-on', { name: waiting.join(', ') })\n : i18next.t('label.activity-state-' + state)\n }\n\n private waitingNames(): string[] {\n const approvals = (this.activityInstance!.activityThreads || []).flatMap(thread => thread.activityApprovals || [])\n const names = currentStepRows(approvals).map(row => this.stepName(row))\n\n return [...new Set(names.filter(Boolean))]\n }\n\n /** Who a step is: its approver, or the line's step when a role holds it and no person is named. */\n private stepName(approval: ActivityApproval): string {\n const line = this.activityInstance!.approvalLine || []\n\n return (approval.approver || line[(Number(approval.order) || 0) - 1]?.approver)?.name || ''\n }\n\n /**\n * What was asked - the same drawing the task and approval screens use.\n *\n * 상신함 opens what I put up here. Without this the view showed the name, the state and the\n * history, and not the request itself: an expenditure request's payee and lines live only in its\n * decision, every model field being hidden. The declaration goes first and the given values are\n * the fallback, as on the task screen (thread-sections).\n */\n renderRequest() {\n const { activity, input } = this.activityInstance!\n const decision = renderDecision(activity?.decisionKeys, input)\n\n if (decision !== nothing) {\n return decision\n }\n\n const given = inputSpecOf(activity?.model)\n\n return given.length\n ? html`<section readonly>\n <h2>${i18next.t('label.activity-input')}</h2>\n ${renderGiven(given, input)}\n </section>`\n : nothing\n }\n\n renderActivityThread(activityInstance: ActivityInstance, activityThread: ActivityThread, several: boolean) {\n const { assignee, output, round, activityApprovals = [] } = activityThread\n const { approvalLine, issuer } = activityInstance!\n const { name } = assignee || {}\n const approvals = [...activityApprovals].sort((a, b) =>\n a.round < b.round ? 1 : a.round > b.round ? -1 : a.order! < b.order! ? 1 : -1\n )\n const current = approvals[0]?.round == round ? approvals[0].order : -1\n\n /*\n * A single thread is the case: its state and times are the ones beside it. Several threads each\n * say their own.\n */\n return html`\n ${several\n ? html`<div assignee>\n <md-icon>account_circle</md-icon>\n <strong>${name}</strong>\n </div>`\n : nothing}\n ${several ? this.renderThreadBasics(activityThread) : nothing}\n\n ${this.renderWritten(output || {})}\n <div timeline>\n <span subtitle>${i18next.t('label.timeline')}</span>\n\n <div>\n ${approvalLine\n ? html`<approval-line-view\n .model=${approvalLine}\n .current=${current}\n .drafter=${issuer?.name}\n ></approval-line-view>`\n : html``}\n </div>\n\n <ol>\n ${approvals.map(approval => this.renderActivityApproval(approval))}\n </ol>\n </div>\n `\n }\n\n renderThreadBasics(activityThread: ActivityThread) {\n const { state, round, terminatedAt } = activityThread\n\n return html`\n <div thread>\n <span subtitle>${i18next.t('label.thread-basics')}</span>\n <div>\n <label>${i18next.t('label.status')}</label>\n <span status></span>\n <strong>${i18next.t('label.activity-state-' + state)}</strong>\n </div>\n ${terminatedAt ? html`<div><label>${i18next.t('field.terminated-at')}</label> ${whenText(terminatedAt)}</div>` : nothing}\n ${Number(round) > 1 ? html`<div><label>${i18next.t('field.round')}</label> ${round}</div>` : nothing}\n </div>\n `\n }\n\n /**\n * One row of the timeline. A step not judged yet is waiting - it drew 「시작됨」 with no name when\n * a role held it, which read as if the 대표 had started something.\n */\n renderActivityApproval(activityApproval: ActivityApproval) {\n const { judgment, comment, createdAt, terminatedAt } = activityApproval\n\n return html`\n <li>\n <span date>${whenText(terminatedAt || createdAt!)}</span>\n <span status></span>\n <span info>\n ${i18next.t(judgment ? `label.activity-state-${judgment}` : 'label.approval-waiting')}\n <strong\n ><md-icon>account_circle</md-icon>${activityApproval.approver\n ? entity360Name(activityApproval.approver)\n : this.stepName(activityApproval)}</strong\n >\n ${comment ? html`<p>${comment}</p>` : nothing}\n </span>\n </li>\n `\n }\n\n renderSearchKeys() {\n const { activity } = this.activityInstance!\n const { searchKeys = [] } = activity! || {}\n\n return html`\n <table>\n <tr>\n <th>${i18next.t('label.name')}</th>\n <th>${i18next.t('label.value')}</th>\n </tr>\n\n ${searchKeys?.map(\n (item, index) => html`\n <tr>\n <td>${declaredLabel(item)}</td>\n <td>${this.activityInstance![`key0${index + 1}`]}</td>\n </tr>\n `\n )}\n </table>\n `\n }\n\n /**\n * What the assignee wrote - the fields the model declares as output and does not hide.\n *\n * This listed every model field by its developer name, hidden ones too, with the value read from the\n * output: an expenditure request showed requestId · month · requester · payee · lines, all empty,\n * under 「산출물」. 상신함 opens this view for anyone who put something up, so it draws what the task\n * screen draws, and nothing when the activity has nothing to write.\n */\n renderWritten(output: any) {\n const written = outputSpecOf(this.activityInstance!.activity?.model)\n\n return written.length\n ? html`<div>\n <span subtitle>${i18next.t('field.artifact')}</span>\n ${renderGiven(written, output)}\n </div>`\n : nothing\n }\n\n /* The colour of the header follows the state of the instance shown. */\n updated(changes) {\n this.setAttribute('state', this.activityInstance?.state || '')\n }\n}\n\n/** Two times in the same minute - a start that came with its assignment is not a fact of its own. */\nfunction sameMinute(a?: Date | string | number, b?: Date | string | number): boolean {\n if (!a || !b) return false\n return Math.floor(new Date(a).getTime() / 60_000) === Math.floor(new Date(b).getTime() / 60_000)\n}\n"]}
|
|
@@ -19,7 +19,7 @@ import { provider } from '@operato/board/board-provider.js';
|
|
|
19
19
|
import { ActivityFieldsStyles, inputSpecOf, outputSpecOf, renderGiven } from '../../components/activity-fields.js';
|
|
20
20
|
import { DecisionContentStyles, DecisionKeysFields, renderDecision } from '../../components/decision-content.js';
|
|
21
21
|
import { followupActions } from '../../../shared/task-followup.js';
|
|
22
|
-
import { renderSourceLink } from '../../components/source-link.js';
|
|
22
|
+
import { renderSourceLink, SourceLinkStyles } from '../../components/source-link.js';
|
|
23
23
|
import { drawsAnything, submittableIn, threadSectionsOf } from './thread-sections.js';
|
|
24
24
|
const ActivityThreadFetchResult = `\
|
|
25
25
|
{ id
|
|
@@ -159,6 +159,7 @@ let ActivityThreadPage = class ActivityThreadPage extends localize(i18next)(Page
|
|
|
159
159
|
ScrollbarStyles,
|
|
160
160
|
ActivityFieldsStyles,
|
|
161
161
|
DecisionContentStyles,
|
|
162
|
+
SourceLinkStyles,
|
|
162
163
|
css `
|
|
163
164
|
:host {
|
|
164
165
|
color: var(--ui-ink, #17242c);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity-thread-page.js","sourceRoot":"","sources":["../../../client/pages/activity-thread/activity-thread-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/list-state/ox-page-state.js'\nimport '@operato/property-editor/ox-properties-dynamic-view.js'\nimport '@operato/board/ox-board-viewer.js'\nimport '../../components/activity-thread-ribon.js'\nimport '../../components/activity-thread-timeline.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, nothing } from 'lit'\nimport { DirectiveResult } from 'lit/directive.js'\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { keyed } from 'lit/directives/keyed.js'\nimport { client, MutationController, QueryController } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { mutationOutcome } from '../../components/mutation-outcome.js'\nimport { ranMutation, sayFailure } from '../../components/say-outcome.js'\nimport { CustomAlert, PageView, DraftController } from '@operato/shell'\nimport { CommonButtonStyles, DocumentPageStyles, ScrollbarStyles } from '@operato/styles'\nimport { provider } from '@operato/board/board-provider.js'\n\nimport { ActivityFieldsStyles, inputSpecOf, outputSpecOf, renderGiven } from '../../components/activity-fields.js'\nimport { DecisionContentStyles, DecisionKeysFields, renderDecision } from '../../components/decision-content.js'\nimport { followupActions } from '../../../shared/task-followup.js'\nimport { renderSourceLink } from '../../components/source-link.js'\nimport { drawsAnything, submittableIn, threadSectionsOf, ThreadSections } from './thread-sections.js'\n\nconst ActivityThreadFetchResult = `\\\n{ id\n state\n dueAt\n assignedAt\n assignee { id\n name\n }\n updatedAt\n output\n round\n activityApprovals { round\n order\n approver { id name\n }\n judgment\n participation\n comment\n createdAt\n updatedAt\n terminatedAt\n }\n activityThreadHistories { transaction\n reason\n updater { id name\n }\n updatedAt\n state\n output\n }\n activityInstance { id\n name\n description\n state\n rejectionIsFinal\n activity { id\n rejectionIsFinal\n ${DecisionKeysFields}\n model { name\n description\n active\n tag\n inout\n type\n unit\n options\n quantifier\n spec\n hidden\n }\n }\n approvalLine { type\n value\n participation\n notifyAfter\n approver { id\n name\n description\n controlNo\n }\n }\n thumbnail\n input\n output\n uiType\n uiSource\n dueAt\n terminatedAt\n terminator { name\n email\n }\n createdAt\n }\n}`\n\nexport const ActivityThreadStatus = {\n Unassigned: 'unassigned',\n Assigned: 'assigned',\n Started: 'started',\n Delegated: 'delegated',\n Rejected: 'rejected',\n Ended: 'ended',\n Aborted: 'aborted'\n}\n\n@customElement('activity-thread-page')\nexport class ActivityThreadPage extends localize(i18next)(PageView) {\n static styles = [\n /* The frame owns the page shell and the reading column (ADR-0060 decision 8). */\n DocumentPageStyles,\n ScrollbarStyles,\n ActivityFieldsStyles,\n DecisionContentStyles,\n css`\n :host {\n color: var(--ui-ink, #17242c);\n font-size: var(--ui-t-body, 13px);\n }\n\n /* 카드가 담아 주므로 안에 들어오는 화면은 자기 면과 여백을 갖지 않는다. */\n /*\n * 줄어들지 않는다 — 줄어들면 본문이 잘린다.\n *\n * flex 항목인데 크기를 안 정해 두면 기본이 flex: 0 1 auto 다. **1 이 줄어든다는 뜻이다** —\n * 세로가 모자라면 브라우저가 이 칸부터 줄이는데, 여기엔 카드 모서리를 따라 자르려고\n * overflow: hidden 이 걸려 있어서 줄어든 만큼이 **스크롤도 없이 사라진다.**\n *\n * 완료 조회에서 실측했다(1400x620): 칸이 242px 로 줄고 내용은 362px 이라 「업무 내용」 절이\n * 대부분 잘렸고, 잘린 자리 바로 아래에서 타임라인이 시작하니 타임라인이 본문을 덮은 것처럼\n * 보였다. 세로가 넉넉하면 줄일 일이 없어 안 드러난다.\n *\n * 안에 오는 것은 문서다. 높이를 정해 주어야 하는 것은 board 뿐이고 board 는 이 칸을 거치지\n * 않는다(activityContent 참조). 문서는 제 높이로 서고, 모자라면 페이지 전체가 스크롤한다 —\n * :host 의 overflow: auto 가 그 자리다.\n */\n section[hosted] {\n flex: none;\n padding: 0;\n overflow: hidden;\n }\n\n ox-board-viewer {\n width: 100%;\n height: 100%;\n }\n\n activity-thread-timeline {\n margin: var(--spacing-large, 16px);\n }\n `\n ]\n\n /** The thread the address names. */\n @state() private threadId = ''\n\n /* The thread shown, read for the id the address names (ADR-0190). */\n private thread = new QueryController(\n this,\n gql`\n query activityThread($id: String!) {\n activityThread(id: $id) ${ActivityThreadFetchResult}\n }\n `,\n { variables: () => (this.threadId ? { id: this.threadId } : undefined) }\n )\n\n /* What is written here over the thread read; another thread drops it (ADR-0190 decision 2). */\n private draft = new DraftController<{ output: any }>(this, {\n read: () => this.activityThread,\n key: () => this.threadId\n })\n\n /*\n * The changes made here: each reads what it changed again once done. This screen says its own failure\n * (sayFailure), so the GraphQL link stays quiet about it (ADR-0190).\n */\n private start = new MutationController(\n this,\n gql`\n mutation ($id: String!, $output: Object) {\n startActivityThread(id: $id, output: $output) {\n id\n }\n }\n `,\n { refetch: () => [this.thread], showsError: true }\n )\n\n private restart = new MutationController(\n this,\n gql`\n mutation ($id: String!, $output: Object) {\n restartActivityThread(id: $id, output: $output) {\n id\n }\n }\n `,\n { refetch: () => [this.thread], showsError: true }\n )\n\n private save = new MutationController(\n this,\n gql`\n mutation ($id: String!, $save: ActivityThreadSave!) {\n saveActivityThread(id: $id, save: $save) {\n id\n }\n }\n `,\n { refetch: () => [this.thread], context: { hasUpload: true }, showsError: true }\n )\n\n private finish = new MutationController(\n this,\n gql`\n mutation ($id: String!, $output: Object, $reason: String) {\n submitActivityThread(id: $id, output: $output, reason: $reason) {\n id\n }\n }\n `,\n { refetch: () => [this.thread], context: { hasUpload: true }, showsError: true }\n )\n\n get activityThread(): any {\n return this.thread.data?.activityThread\n }\n\n /**\n * 조회를 마쳤나 — **「아직 안 읽었다」와 「없다」는 다르다.**\n *\n * 전에는 값이 없으면 곧바로 「업무활동 정보가 없습니다」를 그렸다. 그런데 이 화면은 열리자마자\n * 조회를 시작하므로, 응답이 오기 전까지 **없다고 단언하는 화면**이 보인다. 목록에서 줄을 눌러\n * 들어온 사람은 방금 본 건이 없다는 말을 먼저 읽는다.\n *\n * 조회가 끝난 뒤에만 그 말을 한다. 그 전에는 아무 말도 하지 않는다.\n */\n get loaded(): boolean {\n return this.thread.data !== undefined\n }\n\n /** Why the task could not be read - ox-page-state says it, with retry (ADR-0060 decision 8). */\n get loadError(): unknown {\n return this.thread.error ?? null\n }\n\n /** The custom element and the thread read it was made for: another answer makes it again. */\n private custom?: { for: any; element: any }\n\n @state() board: any\n\n get context() {\n const state = this.activityThread?.state\n\n const { restartable, abortable, sourceResubmission } = followupActions(this.activityThread)\n const savable = submittableIn(state) && !sourceResubmission\n const submittable = savable\n // const delegatable = savable\n\n return {\n /*\n * 이 화면이 어떤 틀인가 — 동작 줄이 이것을 읽고 자기 오른쪽 끝을 내용에 맞춘다\n * (ADR-0060 결정 9 보탬). 안 적으면 창 폭이고, 그것은 작업면의 모양이다.\n */\n frame: 'document',\n title: this.lifecycle?.params?.['title'] || i18next.t('title.activity'),\n help: 'worklist/activity-thread-page',\n /*\n * 이 화면은 메뉴에 없다 — 「할 일」에서 줄을 눌러 들어온다. 그래서 왼쪽 메뉴가 가리킬\n * 항목이 없고, 표시가 사라져 들어온 사람이 자기가 어디에 있는지 잃는다.\n *\n * 어느 목록에서 열리는지는 이 화면이 안다. 그것을 적어 둔다.\n */\n menu: this.lifecycle?.params?.['box'] === 'draft-list' ? 'draft-list' : 'todo-list',\n actions: [\n savable && {\n title: i18next.t('button.save'),\n action: this._saveActivityThread.bind(this),\n ...CommonButtonStyles.save\n },\n\n submittable && {\n title: i18next.t('button.submit'),\n action: this._submitActivityThread.bind(this),\n ...CommonButtonStyles.submit\n },\n\n // delegatable && { // title: i18next.t('button.delegate'),\n // action: this._delegateActivityThread.bind(this),\n // ...CommonButtonStyles.save\n // },\n\n abortable && {\n title: i18next.t('button.abort'),\n action: this._abortActivityThread.bind(this),\n ...CommonButtonStyles.cancel\n },\n\n restartable && {\n title: i18next.t(this.lifecycle?.params?.['box'] === 'draft-list' ? 'button.revise-request' : 'button.restart'),\n action: this._restartActivityThread.bind(this),\n ...CommonButtonStyles.save\n }\n /*\n * 나가기는 동작 줄에 두지 않는다 (ADR-0060 결정 9 보탬 판정 2). 탭의 × 가 이미 하는 일이고,\n * 같은 곳으로 가는 문을 둘 두면 어느 쪽이 무엇을 하는지 사람이 눌러 봐야 안다.\n */\n ].filter(Boolean /* truthy only */)\n // activityThread: this.activityThread\n }\n }\n\n render() {\n const activityThread = this.activityThread\n\n /* Reading and failing both drew nothing at all, so a failure looked like an empty screen. */\n return html`<div class=\"page\">\n <ox-page-state\n .loading=${!this.loaded && !this.loadError}\n .error=${this.loadError}\n @retry=${() => this.thread.refetch()}\n >${\n !activityThread\n ? this.loaded\n ? html`<div empty>\n <span class=\"title\">${i18next.t('text.no activity thread info')}</span>\n <span class=\"why\">${i18next.t('text.no-activity-thread-why')}</span>\n </div>`\n : nothing\n : this.renderThread(activityThread)\n }</ox-page-state\n >\n </div>`\n }\n\n private renderThread(activityThread: any) {\n return html`\n <activity-thread-ribon .activityThread=${activityThread}></activity-thread-ribon>\n ${renderSourceLink(activityThread.activityInstance?.input)}\n ${(activityThread.state === 'rejected' && !followupActions(activityThread).restartable) || followupActions(activityThread).sourceResubmission\n ? html`<p>${i18next.t('text.task-source-resubmit')}</p>` : nothing}\n ${this.activityContent()}\n <!--\n 위에 그린 것이 하나도 없으면 편다 — 그때 확인할 것은 타임라인뿐인데, 접혀 있으면 볼 것이\n 아무것도 없는 화면이 된다.\n -->\n <activity-thread-timeline\n .activityThread=${activityThread}\n ?open=${!drawsAnything(this.sections())}\n short-form\n ></activity-thread-timeline>\n `\n }\n\n /** 타임라인 위에 무엇을 그리나 — 규칙은 thread-sections 에 있다. */\n sections(): ThreadSections {\n const model = this.activityThread?.activityInstance?.activity?.model\n\n return threadSectionsOf({\n decision: this.decision() !== nothing,\n given: inputSpecOf(model).length,\n written: outputSpecOf(model).length,\n state: this.activityThread?.state\n })\n }\n\n /** 액티비티가 선언한 결재 내용 — 결재 화면과 같은 그리기다. */\n decision() {\n const activityInstance = this.activityThread?.activityInstance\n\n return renderDecision(activityInstance?.activity?.decisionKeys, activityInstance?.input)\n }\n\n activityContent() {\n switch (this.activityThread?.activityInstance?.uiType) {\n case 'template':\n return this.hostedContent(this.templateContent())\n case 'generated':\n return this.generatedContent()\n /* board 는 전체 화면을 쓰는 캔버스라 카드에 담지 않는다(hostedContent 머리말). */\n case 'board':\n return this.boardContent()\n case 'custom-element':\n return this.hostedContent(this.customElementContent())\n case 'page':\n case 'external':\n return html``\n default:\n return this.generatedContent()\n }\n }\n\n /**\n * 화면 종류가 달라도 **같은 자리에 같은 모양으로 놓인다.**\n *\n * worklist 는 네 가지로 내용을 그린다(generated · custom-element · template · board). 그중\n * generated 만 절 카드 안에 있었고 나머지 셋은 면 위에 맨몸으로 놓였다. 그래서 같은 결재 화면이\n * 액티비티에 따라 카드였다가 아니었다가 했다 — 아래의 타임라인 · 의견은 늘 카드라 위계도 어긋났다.\n *\n * board 는 뺀다. 전체 폭 · 전체 높이를 쓰는 캔버스라 카드 안에 넣으면 여백이 두 겹이 되고 크기가\n * 어긋난다.\n *\n * 카드는 여백을 두지 않는다(padding: 0). 안에 들어오는 것이 자기 조판을 갖고 있고, 두 겹으로\n * 주면 안쪽 내용이 카드 가운데로 밀린다.\n */\n hostedContent(content: unknown) {\n return html`<section hosted>${content}</section>`\n }\n\n templateContent() {\n if (!this.activityThread) {\n return html``\n }\n\n const { uiSource: template } = this.activityThread?.activityInstance\n return unsafeHTML(template)\n }\n\n generatedContent(): DirectiveResult {\n if (!this.activityThread) {\n return html``\n }\n\n var { activityInstance } = this.activityThread || {}\n var { input } = activityInstance || {}\n var output = this.draft.value('output')\n\n const model = activityInstance?.activity?.model\n const inputSpec = inputSpecOf(model)\n const outputSpec = outputSpecOf(model)\n\n if (!output) {\n output = inputSpec\n .filter(item => item.inout === 'inout')\n .reduce((output, item) => {\n output[item.tag] = input[item.tag]\n return output\n }, {})\n }\n\n /*\n * **빈 절은 그리지 않는다.**\n *\n * 처분 승인 액티비티에는 `out` 항목이 하나도 없다. 그런데도 화면이 「Output」 상자를 그려서,\n * 무엇을 적어야 하는지 없는데 적는 자리처럼 보였다. 항목이 없으면 그 절이 없는 것이다.\n *\n * 아무것도 없고 제출할 차례면 그 사실을 말한다 — 상태 ribbon 과 제출 버튼만 남은 화면은\n * 사용자에게 「덜 뜬 화면」으로 읽힌다. 제출한 뒤에는 말하지 않는다(thread-sections).\n */\n const sections = this.sections()\n\n if (sections.emptyNote) {\n return keyed(\n this.activityThread?.id,\n html`<section empty>\n <span class=\"title\">${i18next.t('text.no-activity-fields')}</span>\n <span class=\"why\">${i18next.t('text.no-activity-fields-why')}</span>\n </section>`\n )\n }\n\n if (!drawsAnything(sections)) {\n return nothing\n }\n\n return keyed(\n this.activityThread?.id,\n html`\n ${sections.decision ? this.decision() : ''}\n ${\n sections.given\n ? html`\n <section readonly>\n <h2>${i18next.t('label.activity-input')}</h2>\n ${renderGiven(inputSpec, input)}\n </section>\n `\n : ''\n }\n ${\n sections.written\n ? html`\n <section>\n <h2>${i18next.t('field.artifact')}</h2>\n <ox-properties-dynamic-view\n data-name=\"output\"\n .props=${outputSpec}\n .value=${output}\n @property-change=${e => this.draft.set('output', e.currentTarget.value)}\n ></ox-properties-dynamic-view>\n </section>\n `\n : ''\n }\n `\n )\n }\n\n boardContent(): DirectiveResult {\n if (!this.activityThread) {\n return html``\n }\n\n const { activityInstance } = this.activityThread\n const { uiSource: boardId, input } = activityInstance || {}\n const output = this.draft.value('output')\n\n if (!this.board || this.board.id !== boardId) {\n this.board = { id: boardId }\n }\n\n /* \n ox-board-viewer에서 provider에 의해 공급되는 board가 각 id별로 instance를 하나씩 밖에 가지지 않으므로,\n 동일한 id의 보드를 다른 page에 뺏기는 경우가 있다.\n 따라서, Page가 active될 때마다 타임스탬프를 refresh key로 설정하였다.\n */\n return keyed(\n this.activityThread.id,\n html`\n <ox-board-viewer\n style=\"background-color: white;\"\n .board=${this.board}\n .provider=${provider}\n .values=${{ ...input, ...output }}\n hide-fullscreen\n hide-navigation\n ></ox-board-viewer>\n `\n )\n }\n\n customElementContent() {\n if (!this.activityThread) {\n return html``\n }\n\n /* Made once per answer: what is written in it redraws the page, and a new element would drop the typing. */\n if (this.custom && this.custom.for === this.activityThread) {\n return this.custom.element\n }\n\n const { activityInstance } = this.activityThread\n const { uiSource: tagName, input } = activityInstance || {}\n\n const element = document.createElement(tagName)\n element.id = 'custom-content'\n element.activityId = activityInstance.activity.id\n element.input = input\n element.output = this.draft.value('output')\n element.activityThread = this.activityThread\n\n element.addEventListener('change', (e: CustomEvent) => this.draft.set('output', e.detail))\n\n this.custom = { for: this.activityThread, element }\n return element\n }\n\n @query('ox-board-viewer') oxBoardViewer: any\n\n getOutputFromBoard() {\n const outputSpec = outputSpecOf(this.activityThread?.activityInstance?.activity?.model)\n const data = this.oxBoardViewer.getSceneValues()\n\n return outputSpec.reduce((output, spec) => {\n output[spec.name] = data[spec.name]\n return output\n }, {})\n }\n\n async pageUpdated(changes, lifecycle, changedBefore) {\n if (this.active && lifecycle.resourceId) {\n this.threadId = lifecycle.resourceId\n }\n }\n\n /** What this task's output is to be: the board's values, or what was written over the thread read. */\n private outputToSend() {\n return this.activityThread.activityInstance?.uiType === 'board' ? this.getOutputFromBoard() : this.draft.value('output')\n }\n\n /*\n * Each change sends what is written now and reads the thread again once it went through; its answer is not kept\n * (ADR-0190 decision 2). The edits sent are cleared then, and a failure keeps them.\n */\n async _startActivityThread() {\n const { id } = this.activityThread\n const output = this.outputToSend()\n\n const done = await this.draft.submit(() => this.start.run({ id, output }))\n\n if (!done) {\n sayFailure(mutationOutcome(this.start.error))\n return\n }\n\n document.dispatchEvent(\n new CustomEvent('notify', { detail: { message: i18next.t('text.task_is_started_successfully') } })\n )\n }\n\n async _restartActivityThread() {\n const { id } = this.activityThread\n const output = this.outputToSend()\n\n const done = await this.draft.submit(() => this.restart.run({ id, output }))\n\n if (!done) {\n sayFailure(mutationOutcome(this.restart.error))\n return\n }\n\n document.dispatchEvent(\n new CustomEvent('notify', { detail: { message: i18next.t('text.task_is_restarted_successfully') } })\n )\n }\n\n async _delegateActivityThread() {\n throw 'not implemented yet'\n }\n\n async _saveActivityThread() {\n const { id } = this.activityThread\n const output = this.outputToSend()\n\n const done = await this.draft.submit(() => this.save.run({ id, save: { output } }))\n\n if (!done) {\n sayFailure(mutationOutcome(this.save.error))\n return\n }\n\n document.dispatchEvent(\n new CustomEvent('notify', { detail: { message: i18next.t('text.task_is_saved_successfully') } })\n )\n }\n\n async _submitActivityThread() {\n const { id, reason } = this.activityThread\n const output = this.outputToSend()\n\n const done = await this.draft.submit(() => this.finish.run({ id, output, reason }))\n\n if (!done) {\n sayFailure(mutationOutcome(this.finish.error))\n return\n }\n\n document.dispatchEvent(\n new CustomEvent('notify', { detail: { message: i18next.t('text.task_is_finished_successfully') } })\n )\n }\n\n async _abortActivityThread() {\n const answer = await CustomAlert({\n type: 'warning',\n title: i18next.t('button.abort'),\n text: i18next.t('text.task-abort-keeps-history'),\n confirmButton: { text: i18next.t('button.abort') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n if (!answer?.value) return\n const { id } = this.activityThread\n\n const outcome = await ranMutation(() =>\n client.mutate({\n mutation: gql`\n mutation ($id: String!, $reason: String) {\n abortActivityThread(id: $id, reason: $reason) {\n id\n }\n }\n `,\n variables: { id }\n })\n )\n\n if (outcome.ok) {\n /* Nothing more is written on an aborted task: what was typed on it goes with it. */\n this.draft.reset()\n await this.thread.refetch()\n\n document.dispatchEvent(\n new CustomEvent('notify', { detail: { message: i18next.t('text.task_is_aborted_successfully') } })\n )\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"activity-thread-page.js","sourceRoot":"","sources":["../../../client/pages/activity-thread/activity-thread-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/list-state/ox-page-state.js'\nimport '@operato/property-editor/ox-properties-dynamic-view.js'\nimport '@operato/board/ox-board-viewer.js'\nimport '../../components/activity-thread-ribon.js'\nimport '../../components/activity-thread-timeline.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, nothing } from 'lit'\nimport { DirectiveResult } from 'lit/directive.js'\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { keyed } from 'lit/directives/keyed.js'\nimport { client, MutationController, QueryController } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { mutationOutcome } from '../../components/mutation-outcome.js'\nimport { ranMutation, sayFailure } from '../../components/say-outcome.js'\nimport { CustomAlert, PageView, DraftController } from '@operato/shell'\nimport { CommonButtonStyles, DocumentPageStyles, ScrollbarStyles } from '@operato/styles'\nimport { provider } from '@operato/board/board-provider.js'\n\nimport { ActivityFieldsStyles, inputSpecOf, outputSpecOf, renderGiven } from '../../components/activity-fields.js'\nimport { DecisionContentStyles, DecisionKeysFields, renderDecision } from '../../components/decision-content.js'\nimport { followupActions } from '../../../shared/task-followup.js'\nimport { renderSourceLink, SourceLinkStyles } from '../../components/source-link.js'\nimport { drawsAnything, submittableIn, threadSectionsOf, ThreadSections } from './thread-sections.js'\n\nconst ActivityThreadFetchResult = `\\\n{ id\n state\n dueAt\n assignedAt\n assignee { id\n name\n }\n updatedAt\n output\n round\n activityApprovals { round\n order\n approver { id name\n }\n judgment\n participation\n comment\n createdAt\n updatedAt\n terminatedAt\n }\n activityThreadHistories { transaction\n reason\n updater { id name\n }\n updatedAt\n state\n output\n }\n activityInstance { id\n name\n description\n state\n rejectionIsFinal\n activity { id\n rejectionIsFinal\n ${DecisionKeysFields}\n model { name\n description\n active\n tag\n inout\n type\n unit\n options\n quantifier\n spec\n hidden\n }\n }\n approvalLine { type\n value\n participation\n notifyAfter\n approver { id\n name\n description\n controlNo\n }\n }\n thumbnail\n input\n output\n uiType\n uiSource\n dueAt\n terminatedAt\n terminator { name\n email\n }\n createdAt\n }\n}`\n\nexport const ActivityThreadStatus = {\n Unassigned: 'unassigned',\n Assigned: 'assigned',\n Started: 'started',\n Delegated: 'delegated',\n Rejected: 'rejected',\n Ended: 'ended',\n Aborted: 'aborted'\n}\n\n@customElement('activity-thread-page')\nexport class ActivityThreadPage extends localize(i18next)(PageView) {\n static styles = [\n /* The frame owns the page shell and the reading column (ADR-0060 decision 8). */\n DocumentPageStyles,\n ScrollbarStyles,\n ActivityFieldsStyles,\n DecisionContentStyles,\n SourceLinkStyles,\n css`\n :host {\n color: var(--ui-ink, #17242c);\n font-size: var(--ui-t-body, 13px);\n }\n\n /* 카드가 담아 주므로 안에 들어오는 화면은 자기 면과 여백을 갖지 않는다. */\n /*\n * 줄어들지 않는다 — 줄어들면 본문이 잘린다.\n *\n * flex 항목인데 크기를 안 정해 두면 기본이 flex: 0 1 auto 다. **1 이 줄어든다는 뜻이다** —\n * 세로가 모자라면 브라우저가 이 칸부터 줄이는데, 여기엔 카드 모서리를 따라 자르려고\n * overflow: hidden 이 걸려 있어서 줄어든 만큼이 **스크롤도 없이 사라진다.**\n *\n * 완료 조회에서 실측했다(1400x620): 칸이 242px 로 줄고 내용은 362px 이라 「업무 내용」 절이\n * 대부분 잘렸고, 잘린 자리 바로 아래에서 타임라인이 시작하니 타임라인이 본문을 덮은 것처럼\n * 보였다. 세로가 넉넉하면 줄일 일이 없어 안 드러난다.\n *\n * 안에 오는 것은 문서다. 높이를 정해 주어야 하는 것은 board 뿐이고 board 는 이 칸을 거치지\n * 않는다(activityContent 참조). 문서는 제 높이로 서고, 모자라면 페이지 전체가 스크롤한다 —\n * :host 의 overflow: auto 가 그 자리다.\n */\n section[hosted] {\n flex: none;\n padding: 0;\n overflow: hidden;\n }\n\n ox-board-viewer {\n width: 100%;\n height: 100%;\n }\n\n activity-thread-timeline {\n margin: var(--spacing-large, 16px);\n }\n `\n ]\n\n /** The thread the address names. */\n @state() private threadId = ''\n\n /* The thread shown, read for the id the address names (ADR-0190). */\n private thread = new QueryController(\n this,\n gql`\n query activityThread($id: String!) {\n activityThread(id: $id) ${ActivityThreadFetchResult}\n }\n `,\n { variables: () => (this.threadId ? { id: this.threadId } : undefined) }\n )\n\n /* What is written here over the thread read; another thread drops it (ADR-0190 decision 2). */\n private draft = new DraftController<{ output: any }>(this, {\n read: () => this.activityThread,\n key: () => this.threadId\n })\n\n /*\n * The changes made here: each reads what it changed again once done. This screen says its own failure\n * (sayFailure), so the GraphQL link stays quiet about it (ADR-0190).\n */\n private start = new MutationController(\n this,\n gql`\n mutation ($id: String!, $output: Object) {\n startActivityThread(id: $id, output: $output) {\n id\n }\n }\n `,\n { refetch: () => [this.thread], showsError: true }\n )\n\n private restart = new MutationController(\n this,\n gql`\n mutation ($id: String!, $output: Object) {\n restartActivityThread(id: $id, output: $output) {\n id\n }\n }\n `,\n { refetch: () => [this.thread], showsError: true }\n )\n\n private save = new MutationController(\n this,\n gql`\n mutation ($id: String!, $save: ActivityThreadSave!) {\n saveActivityThread(id: $id, save: $save) {\n id\n }\n }\n `,\n { refetch: () => [this.thread], context: { hasUpload: true }, showsError: true }\n )\n\n private finish = new MutationController(\n this,\n gql`\n mutation ($id: String!, $output: Object, $reason: String) {\n submitActivityThread(id: $id, output: $output, reason: $reason) {\n id\n }\n }\n `,\n { refetch: () => [this.thread], context: { hasUpload: true }, showsError: true }\n )\n\n get activityThread(): any {\n return this.thread.data?.activityThread\n }\n\n /**\n * 조회를 마쳤나 — **「아직 안 읽었다」와 「없다」는 다르다.**\n *\n * 전에는 값이 없으면 곧바로 「업무활동 정보가 없습니다」를 그렸다. 그런데 이 화면은 열리자마자\n * 조회를 시작하므로, 응답이 오기 전까지 **없다고 단언하는 화면**이 보인다. 목록에서 줄을 눌러\n * 들어온 사람은 방금 본 건이 없다는 말을 먼저 읽는다.\n *\n * 조회가 끝난 뒤에만 그 말을 한다. 그 전에는 아무 말도 하지 않는다.\n */\n get loaded(): boolean {\n return this.thread.data !== undefined\n }\n\n /** Why the task could not be read - ox-page-state says it, with retry (ADR-0060 decision 8). */\n get loadError(): unknown {\n return this.thread.error ?? null\n }\n\n /** The custom element and the thread read it was made for: another answer makes it again. */\n private custom?: { for: any; element: any }\n\n @state() board: any\n\n get context() {\n const state = this.activityThread?.state\n\n const { restartable, abortable, sourceResubmission } = followupActions(this.activityThread)\n const savable = submittableIn(state) && !sourceResubmission\n const submittable = savable\n // const delegatable = savable\n\n return {\n /*\n * 이 화면이 어떤 틀인가 — 동작 줄이 이것을 읽고 자기 오른쪽 끝을 내용에 맞춘다\n * (ADR-0060 결정 9 보탬). 안 적으면 창 폭이고, 그것은 작업면의 모양이다.\n */\n frame: 'document',\n title: this.lifecycle?.params?.['title'] || i18next.t('title.activity'),\n help: 'worklist/activity-thread-page',\n /*\n * 이 화면은 메뉴에 없다 — 「할 일」에서 줄을 눌러 들어온다. 그래서 왼쪽 메뉴가 가리킬\n * 항목이 없고, 표시가 사라져 들어온 사람이 자기가 어디에 있는지 잃는다.\n *\n * 어느 목록에서 열리는지는 이 화면이 안다. 그것을 적어 둔다.\n */\n menu: this.lifecycle?.params?.['box'] === 'draft-list' ? 'draft-list' : 'todo-list',\n actions: [\n savable && {\n title: i18next.t('button.save'),\n action: this._saveActivityThread.bind(this),\n ...CommonButtonStyles.save\n },\n\n submittable && {\n title: i18next.t('button.submit'),\n action: this._submitActivityThread.bind(this),\n ...CommonButtonStyles.submit\n },\n\n // delegatable && { // title: i18next.t('button.delegate'),\n // action: this._delegateActivityThread.bind(this),\n // ...CommonButtonStyles.save\n // },\n\n abortable && {\n title: i18next.t('button.abort'),\n action: this._abortActivityThread.bind(this),\n ...CommonButtonStyles.cancel\n },\n\n restartable && {\n title: i18next.t(this.lifecycle?.params?.['box'] === 'draft-list' ? 'button.revise-request' : 'button.restart'),\n action: this._restartActivityThread.bind(this),\n ...CommonButtonStyles.save\n }\n /*\n * 나가기는 동작 줄에 두지 않는다 (ADR-0060 결정 9 보탬 판정 2). 탭의 × 가 이미 하는 일이고,\n * 같은 곳으로 가는 문을 둘 두면 어느 쪽이 무엇을 하는지 사람이 눌러 봐야 안다.\n */\n ].filter(Boolean /* truthy only */)\n // activityThread: this.activityThread\n }\n }\n\n render() {\n const activityThread = this.activityThread\n\n /* Reading and failing both drew nothing at all, so a failure looked like an empty screen. */\n return html`<div class=\"page\">\n <ox-page-state\n .loading=${!this.loaded && !this.loadError}\n .error=${this.loadError}\n @retry=${() => this.thread.refetch()}\n >${\n !activityThread\n ? this.loaded\n ? html`<div empty>\n <span class=\"title\">${i18next.t('text.no activity thread info')}</span>\n <span class=\"why\">${i18next.t('text.no-activity-thread-why')}</span>\n </div>`\n : nothing\n : this.renderThread(activityThread)\n }</ox-page-state\n >\n </div>`\n }\n\n private renderThread(activityThread: any) {\n return html`\n <activity-thread-ribon .activityThread=${activityThread}></activity-thread-ribon>\n ${renderSourceLink(activityThread.activityInstance?.input)}\n ${(activityThread.state === 'rejected' && !followupActions(activityThread).restartable) || followupActions(activityThread).sourceResubmission\n ? html`<p>${i18next.t('text.task-source-resubmit')}</p>` : nothing}\n ${this.activityContent()}\n <!--\n 위에 그린 것이 하나도 없으면 편다 — 그때 확인할 것은 타임라인뿐인데, 접혀 있으면 볼 것이\n 아무것도 없는 화면이 된다.\n -->\n <activity-thread-timeline\n .activityThread=${activityThread}\n ?open=${!drawsAnything(this.sections())}\n short-form\n ></activity-thread-timeline>\n `\n }\n\n /** 타임라인 위에 무엇을 그리나 — 규칙은 thread-sections 에 있다. */\n sections(): ThreadSections {\n const model = this.activityThread?.activityInstance?.activity?.model\n\n return threadSectionsOf({\n decision: this.decision() !== nothing,\n given: inputSpecOf(model).length,\n written: outputSpecOf(model).length,\n state: this.activityThread?.state\n })\n }\n\n /** 액티비티가 선언한 결재 내용 — 결재 화면과 같은 그리기다. */\n decision() {\n const activityInstance = this.activityThread?.activityInstance\n\n return renderDecision(activityInstance?.activity?.decisionKeys, activityInstance?.input)\n }\n\n activityContent() {\n switch (this.activityThread?.activityInstance?.uiType) {\n case 'template':\n return this.hostedContent(this.templateContent())\n case 'generated':\n return this.generatedContent()\n /* board 는 전체 화면을 쓰는 캔버스라 카드에 담지 않는다(hostedContent 머리말). */\n case 'board':\n return this.boardContent()\n case 'custom-element':\n return this.hostedContent(this.customElementContent())\n case 'page':\n case 'external':\n return html``\n default:\n return this.generatedContent()\n }\n }\n\n /**\n * 화면 종류가 달라도 **같은 자리에 같은 모양으로 놓인다.**\n *\n * worklist 는 네 가지로 내용을 그린다(generated · custom-element · template · board). 그중\n * generated 만 절 카드 안에 있었고 나머지 셋은 면 위에 맨몸으로 놓였다. 그래서 같은 결재 화면이\n * 액티비티에 따라 카드였다가 아니었다가 했다 — 아래의 타임라인 · 의견은 늘 카드라 위계도 어긋났다.\n *\n * board 는 뺀다. 전체 폭 · 전체 높이를 쓰는 캔버스라 카드 안에 넣으면 여백이 두 겹이 되고 크기가\n * 어긋난다.\n *\n * 카드는 여백을 두지 않는다(padding: 0). 안에 들어오는 것이 자기 조판을 갖고 있고, 두 겹으로\n * 주면 안쪽 내용이 카드 가운데로 밀린다.\n */\n hostedContent(content: unknown) {\n return html`<section hosted>${content}</section>`\n }\n\n templateContent() {\n if (!this.activityThread) {\n return html``\n }\n\n const { uiSource: template } = this.activityThread?.activityInstance\n return unsafeHTML(template)\n }\n\n generatedContent(): DirectiveResult {\n if (!this.activityThread) {\n return html``\n }\n\n var { activityInstance } = this.activityThread || {}\n var { input } = activityInstance || {}\n var output = this.draft.value('output')\n\n const model = activityInstance?.activity?.model\n const inputSpec = inputSpecOf(model)\n const outputSpec = outputSpecOf(model)\n\n if (!output) {\n output = inputSpec\n .filter(item => item.inout === 'inout')\n .reduce((output, item) => {\n output[item.tag] = input[item.tag]\n return output\n }, {})\n }\n\n /*\n * **빈 절은 그리지 않는다.**\n *\n * 처분 승인 액티비티에는 `out` 항목이 하나도 없다. 그런데도 화면이 「Output」 상자를 그려서,\n * 무엇을 적어야 하는지 없는데 적는 자리처럼 보였다. 항목이 없으면 그 절이 없는 것이다.\n *\n * 아무것도 없고 제출할 차례면 그 사실을 말한다 — 상태 ribbon 과 제출 버튼만 남은 화면은\n * 사용자에게 「덜 뜬 화면」으로 읽힌다. 제출한 뒤에는 말하지 않는다(thread-sections).\n */\n const sections = this.sections()\n\n if (sections.emptyNote) {\n return keyed(\n this.activityThread?.id,\n html`<section empty>\n <span class=\"title\">${i18next.t('text.no-activity-fields')}</span>\n <span class=\"why\">${i18next.t('text.no-activity-fields-why')}</span>\n </section>`\n )\n }\n\n if (!drawsAnything(sections)) {\n return nothing\n }\n\n return keyed(\n this.activityThread?.id,\n html`\n ${sections.decision ? this.decision() : ''}\n ${\n sections.given\n ? html`\n <section readonly>\n <h2>${i18next.t('label.activity-input')}</h2>\n ${renderGiven(inputSpec, input)}\n </section>\n `\n : ''\n }\n ${\n sections.written\n ? html`\n <section>\n <h2>${i18next.t('field.artifact')}</h2>\n <ox-properties-dynamic-view\n data-name=\"output\"\n .props=${outputSpec}\n .value=${output}\n @property-change=${e => this.draft.set('output', e.currentTarget.value)}\n ></ox-properties-dynamic-view>\n </section>\n `\n : ''\n }\n `\n )\n }\n\n boardContent(): DirectiveResult {\n if (!this.activityThread) {\n return html``\n }\n\n const { activityInstance } = this.activityThread\n const { uiSource: boardId, input } = activityInstance || {}\n const output = this.draft.value('output')\n\n if (!this.board || this.board.id !== boardId) {\n this.board = { id: boardId }\n }\n\n /* \n ox-board-viewer에서 provider에 의해 공급되는 board가 각 id별로 instance를 하나씩 밖에 가지지 않으므로,\n 동일한 id의 보드를 다른 page에 뺏기는 경우가 있다.\n 따라서, Page가 active될 때마다 타임스탬프를 refresh key로 설정하였다.\n */\n return keyed(\n this.activityThread.id,\n html`\n <ox-board-viewer\n style=\"background-color: white;\"\n .board=${this.board}\n .provider=${provider}\n .values=${{ ...input, ...output }}\n hide-fullscreen\n hide-navigation\n ></ox-board-viewer>\n `\n )\n }\n\n customElementContent() {\n if (!this.activityThread) {\n return html``\n }\n\n /* Made once per answer: what is written in it redraws the page, and a new element would drop the typing. */\n if (this.custom && this.custom.for === this.activityThread) {\n return this.custom.element\n }\n\n const { activityInstance } = this.activityThread\n const { uiSource: tagName, input } = activityInstance || {}\n\n const element = document.createElement(tagName)\n element.id = 'custom-content'\n element.activityId = activityInstance.activity.id\n element.input = input\n element.output = this.draft.value('output')\n element.activityThread = this.activityThread\n\n element.addEventListener('change', (e: CustomEvent) => this.draft.set('output', e.detail))\n\n this.custom = { for: this.activityThread, element }\n return element\n }\n\n @query('ox-board-viewer') oxBoardViewer: any\n\n getOutputFromBoard() {\n const outputSpec = outputSpecOf(this.activityThread?.activityInstance?.activity?.model)\n const data = this.oxBoardViewer.getSceneValues()\n\n return outputSpec.reduce((output, spec) => {\n output[spec.name] = data[spec.name]\n return output\n }, {})\n }\n\n async pageUpdated(changes, lifecycle, changedBefore) {\n if (this.active && lifecycle.resourceId) {\n this.threadId = lifecycle.resourceId\n }\n }\n\n /** What this task's output is to be: the board's values, or what was written over the thread read. */\n private outputToSend() {\n return this.activityThread.activityInstance?.uiType === 'board' ? this.getOutputFromBoard() : this.draft.value('output')\n }\n\n /*\n * Each change sends what is written now and reads the thread again once it went through; its answer is not kept\n * (ADR-0190 decision 2). The edits sent are cleared then, and a failure keeps them.\n */\n async _startActivityThread() {\n const { id } = this.activityThread\n const output = this.outputToSend()\n\n const done = await this.draft.submit(() => this.start.run({ id, output }))\n\n if (!done) {\n sayFailure(mutationOutcome(this.start.error))\n return\n }\n\n document.dispatchEvent(\n new CustomEvent('notify', { detail: { message: i18next.t('text.task_is_started_successfully') } })\n )\n }\n\n async _restartActivityThread() {\n const { id } = this.activityThread\n const output = this.outputToSend()\n\n const done = await this.draft.submit(() => this.restart.run({ id, output }))\n\n if (!done) {\n sayFailure(mutationOutcome(this.restart.error))\n return\n }\n\n document.dispatchEvent(\n new CustomEvent('notify', { detail: { message: i18next.t('text.task_is_restarted_successfully') } })\n )\n }\n\n async _delegateActivityThread() {\n throw 'not implemented yet'\n }\n\n async _saveActivityThread() {\n const { id } = this.activityThread\n const output = this.outputToSend()\n\n const done = await this.draft.submit(() => this.save.run({ id, save: { output } }))\n\n if (!done) {\n sayFailure(mutationOutcome(this.save.error))\n return\n }\n\n document.dispatchEvent(\n new CustomEvent('notify', { detail: { message: i18next.t('text.task_is_saved_successfully') } })\n )\n }\n\n async _submitActivityThread() {\n const { id, reason } = this.activityThread\n const output = this.outputToSend()\n\n const done = await this.draft.submit(() => this.finish.run({ id, output, reason }))\n\n if (!done) {\n sayFailure(mutationOutcome(this.finish.error))\n return\n }\n\n document.dispatchEvent(\n new CustomEvent('notify', { detail: { message: i18next.t('text.task_is_finished_successfully') } })\n )\n }\n\n async _abortActivityThread() {\n const answer = await CustomAlert({\n type: 'warning',\n title: i18next.t('button.abort'),\n text: i18next.t('text.task-abort-keeps-history'),\n confirmButton: { text: i18next.t('button.abort') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n if (!answer?.value) return\n const { id } = this.activityThread\n\n const outcome = await ranMutation(() =>\n client.mutate({\n mutation: gql`\n mutation ($id: String!, $reason: String) {\n abortActivityThread(id: $id, reason: $reason) {\n id\n }\n }\n `,\n variables: { id }\n })\n )\n\n if (outcome.ok) {\n /* Nothing more is written on an aborted task: what was typed on it goes with it. */\n this.draft.reset()\n await this.thread.refetch()\n\n document.dispatchEvent(\n new CustomEvent('notify', { detail: { message: i18next.t('text.task_is_aborted_successfully') } })\n )\n }\n }\n}\n"]}
|
|
@@ -26,6 +26,6 @@ declare const ActivityThreadView_base: (new (...args: any[]) => LitElement) & ty
|
|
|
26
26
|
export declare class ActivityThreadView extends ActivityThreadView_base {
|
|
27
27
|
static styles: import("lit").CSSResult[];
|
|
28
28
|
activityThread?: ActivityThread;
|
|
29
|
-
render(): import("lit-html").TemplateResult<1
|
|
29
|
+
render(): typeof nothing | import("lit-html").TemplateResult<1>;
|
|
30
30
|
}
|
|
31
31
|
export {};
|
|
@@ -152,7 +152,8 @@ let ApprovalProgressPage = class ApprovalProgressPage extends localize(i18next)(
|
|
|
152
152
|
openPopup(html `<activity-instance-view activity-instance-id=${record.id}></activity-instance-view>`, {
|
|
153
153
|
backdrop: true,
|
|
154
154
|
size: 'large',
|
|
155
|
-
title
|
|
155
|
+
/* The case draws its own title; the popup naming it too drew it twice (2026-11-10). */
|
|
156
|
+
title: i18next.t('title.activity instance view')
|
|
156
157
|
});
|
|
157
158
|
}
|
|
158
159
|
async kindOptions() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval-progress-page.js","sourceRoot":"","sources":["../../../client/pages/approval-progress/approval-progress-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist'\nimport '@operato/data-grist/ox-filters-form.js'\nimport '../activity-instance/activity-instance-view.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, query, state } from 'lit/decorators.js'\nimport { DataGrist, FetchOption } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { openPopup } from '@operato/layout'\nimport { PageView } from '@operato/shell'\nimport { CommonGristStyles, CommonHeaderStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\n\nimport { dueCell } from '../../activity-cells.js'\nimport { waitedParts } from '../../approval-progress.js'\nimport { whenShortText } from '../../when.js'\n\nconst STATES = ['PENDING', 'APPROVED', 'REJECTED', 'ABORTED'] as const\nconst OVERDUE = 'OVERDUE'\n/** The grid column whose filter holds the chips pressed. */\nconst CHIPS = 'chips'\n\n/**\n * 결재 현황 — every approval of the domain, whatever its kind, and where each stands (ADR-0183).\n *\n * The rows, the step and whom it waits on are the server's (`approvalProgress`); this page only asks with the\n * conditions pressed and draws. A row opens the case's own view, whose door checks the reader again.\n */\n@customElement('approval-progress-page')\nexport class ApprovalProgressPage extends localize(i18next)(PageView) {\n static styles = [\n /* The work surface frame for a list screen (ADR-0060 decision 8). */\n WorkSurfacePageStyles,\n ScrollbarStyles,\n CommonGristStyles,\n CommonHeaderStyles,\n css`\n .header {\n grid-template-areas: 'filters actions';\n }\n\n .header .filters {\n padding: 0;\n background: none;\n border-radius: 0;\n gap: 12px;\n }\n `\n ]\n\n @query('ox-grist') grist!: DataGrist\n\n @state() gristConfig?: any\n @state() mode: 'GRID' | 'LIST' | 'CARD' = isMobileDevice() ? 'CARD' : 'GRID'\n\n get context() {\n return {\n title: i18next.t('title.approval progress'),\n search: {\n handler: (search: string) => {\n this.grist.searchText = search\n },\n value: this.grist?.searchText || ''\n },\n filter: {\n handler: () => {\n this.grist.toggleHeadroom()\n }\n }\n }\n }\n\n /*\n * The kind, department, raised days, the chips (states and 기한 넘김), search and page are the grid's own, kept in\n * the address (FOOTER-BUTTON-REVIEW G09): a shared link, coming back and reloading read the same list, and a change of\n * them reads page 1 again. `mode` is only how the rows are drawn, never a condition.\n */\n render() {\n return html`\n <ox-grist class=\"page-fill\" .mode=${this.mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)} ?url-params-sensitive=${this.active}>\n <div slot=\"headroom\" class=\"header\">\n <div class=\"filters\">\n <ox-filters-form class=\"filter\" without-search></ox-filters-form>\n </div>\n </div>\n </ox-grist>\n `\n }\n\n async pageInitialized() {\n this.gristConfig = {\n pagination: { pages: [50, 100, 200] },\n list: { fields: ['headline', 'activityLabel'], details: ['requesterName', 'waiting', 'waited'] },\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'assignment',\n iconOnly: false,\n title: i18next.t('button.view'),\n width: 72,\n handlers: { click: (_columns, _data, _column, record) => this.openCase(record) }\n },\n {\n /* The kind filter - the kinds that have a case here, as the server names them. */\n type: 'select',\n name: 'activityName',\n header: i18next.t('field.approval-kind'),\n hidden: true,\n filter: { operator: 'in', options: () => this.kindOptions() }\n },\n { type: 'string', name: 'activityLabel', header: i18next.t('field.approval-kind'), record: { editable: false }, width: 140 },\n { type: 'string', name: 'headline', header: i18next.t('field.approval-headline'), record: { editable: false }, filter: 'search', width: 260 },\n { type: 'string', name: 'requesterName', header: i18next.t('field.approval-requester'), record: { editable: false }, filter: 'search', width: 90 },\n {\n type: 'select',\n name: 'departmentId',\n header: i18next.t('field.approval-department'),\n hidden: true,\n filter: { operator: 'eq', options: () => this.departmentOptions() }\n },\n { type: 'string', name: 'departmentName', header: i18next.t('field.approval-department'), record: { editable: false }, width: 100 },\n { type: 'string', name: 'stateLabel', header: i18next.t('label.status'), record: { editable: false, align: 'center' }, width: 70 },\n { type: 'string', name: 'stepText', header: i18next.t('field.approval-step'), record: { editable: false, align: 'center' }, width: 60 },\n { type: 'string', name: 'waiting', header: i18next.t('field.approval-approver'), record: { editable: false }, width: 180 },\n { type: 'string', name: 'waited', header: i18next.t('field.approval-waited'), record: { editable: false }, width: 100 },\n {\n type: 'datetime',\n name: 'dueAt',\n header: i18next.t('field.approval-due-at'),\n record: { editable: false, renderer: dueCell(() => this.active) },\n width: 130\n },\n { type: 'date', name: 'raisedAt', header: i18next.t('field.approval-raised-at'), record: { editable: false, renderer: value => whenShortText(value) }, filter: { operator: 'between' }, width: 140 },\n { type: 'datetime', name: 'endedAt', header: i18next.t('field.approval-ended-at'), record: { editable: false, renderer: value => whenShortText(value) }, width: 140 },\n {\n /* The chips - the states and 기한 넘김, waiting ones first; each names itself, so no label. Their numbers are the read's. */\n type: 'string',\n name: CHIPS,\n header: i18next.t('label.status'),\n hidden: true,\n record: { editable: false },\n filter: {\n type: 'select-buttons',\n operator: 'in',\n label: '',\n value: [STATES[0]],\n options: [...STATES, OVERDUE].map(value => ({ value, display: i18next.t(`label.approval-progress-${value.toLowerCase()}`) }))\n }\n }\n ],\n rows: { appendable: false, selectable: false },\n sorters: []\n }\n }\n\n private openCase(record: any) {\n openPopup(html`<activity-instance-view activity-instance-id=${record.id}></activity-instance-view>`, {\n backdrop: true,\n size: 'large',\n title: record.headline\n })\n }\n\n private async kindOptions() {\n const response = await client.query({\n query: gql`\n query {\n approvalProgress(pagination: { page: 1, limit: 1 }) {\n kinds {\n name\n label\n labelTKey\n }\n }\n }\n `\n })\n return (response.data?.approvalProgress?.kinds || []).map((kind: any) => ({\n value: kind.name,\n display: String(i18next.t(kind.labelTKey, { defaultValue: kind.label }))\n }))\n }\n\n private async departmentOptions() {\n const response = await client.query({\n query: gql`\n query {\n departments(pagination: { page: 1, limit: 500 }, sortings: [{ name: \"name\" }]) {\n items {\n id\n name\n }\n }\n }\n `\n })\n return (response.data?.departments?.items || []).map((one: any) => ({ value: one.id, display: one.name }))\n }\n\n /** The grid's conditions as the server's filter - the column filters, the search box and the chips. */\n private filterOf(filters: any[]) {\n const valueOf = (name: string) => filters.find(one => one.name === name && one.operator !== 'search')?.value\n const kinds = valueOf('activityName')\n const [from, to] = valueOf('raisedAt') || []\n const search = filters.find(one => one.operator === 'search')?.value?.replace(/^%|%$/g, '')\n const pressed = valueOf(CHIPS)\n const chips: string[] = pressed ? [].concat(pressed) : []\n\n return {\n activityNames: kinds ? [].concat(kinds) : undefined,\n departmentIds: valueOf('departmentId') ? [valueOf('departmentId')] : undefined,\n from: from ? new Date(from) : undefined,\n /* The range's last day counts whole - the server's `to` is exclusive. */\n to: to ? new Date(new Date(to).getTime() + 24 * 3600 * 1000) : undefined,\n states: chips.filter(chip => chip !== OVERDUE),\n overdueOnly: chips.includes(OVERDUE) || undefined,\n search: search || undefined\n }\n }\n\n async fetchHandler({ page, limit, filters = [] }: FetchOption) {\n const response = await client.query({\n query: gql`\n query ($filter: ApprovalProgressFilter, $pagination: Pagination) {\n approvalProgress(filter: $filter, pagination: $pagination) {\n items {\n id\n activityName\n activityLabel\n activityLabelTKey\n headline\n requesterName\n departmentName\n state\n step\n steps\n waitingOn\n decidedBy\n waitingRole\n waitingSince\n dueAt\n overdue\n raisedAt\n endedAt\n }\n total\n counts {\n state\n count\n }\n overdue\n }\n }\n `,\n variables: { filter: this.filterOf(filters), pagination: { page, limit } },\n fetchPolicy: 'no-cache'\n })\n\n const result = response.data?.approvalProgress\n /* The chips' numbers come with the rows - handed to the grid as its counts for the chips column, which the form draws. */\n const counts = { [CHIPS]: Object.fromEntries([...(result?.counts || []).map((one: any) => [one.state, one.count]), [OVERDUE, result?.overdue ?? 0]]) }\n this.grist.counts = counts\n this.grist.dispatchEvent(new CustomEvent('counts-change', { detail: counts }))\n\n return {\n total: result?.total || 0,\n records: (result?.items || []).map((item: any) => ({\n ...item,\n activityLabel: item.activityLabelTKey ? String(i18next.t(item.activityLabelTKey, { defaultValue: item.activityLabel })) : item.activityLabel,\n stateLabel: i18next.t(`label.approval-progress-${String(item.state).toLowerCase()}`),\n stepText: item.step ? `${item.step} / ${item.steps}` : '',\n waiting: this.waitingText(item),\n waited: this.waitedText(item)\n }))\n }\n }\n\n /* Who decides it: whom a waiting case waits on, who approved last or rejected a decided one. */\n private waitingText(item: any) {\n if (item.state !== 'PENDING') return (item.decidedBy || []).join(', ')\n const names = (item.waitingOn || []).join(', ')\n return item.waitingRole ? `${item.waitingRole}${names ? ` (${names})` : ''}` : names\n }\n\n private waitedText(item: any) {\n const parts = item.state === 'PENDING' ? waitedParts(item.waitingSince) : undefined\n if (!parts) return ''\n /* Past due is the due column's to say (dueCell) - said here too, it would be said twice. */\n return parts.days\n ? i18next.t('text.waited-days', parts)\n : parts.hours\n ? i18next.t('text.waited-hours', parts)\n : i18next.t('text.waited-minutes', parts)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"approval-progress-page.js","sourceRoot":"","sources":["../../../client/pages/approval-progress/approval-progress-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist'\nimport '@operato/data-grist/ox-filters-form.js'\nimport '../activity-instance/activity-instance-view.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, query, state } from 'lit/decorators.js'\nimport { DataGrist, FetchOption } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { openPopup } from '@operato/layout'\nimport { PageView } from '@operato/shell'\nimport { CommonGristStyles, CommonHeaderStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\n\nimport { dueCell } from '../../activity-cells.js'\nimport { waitedParts } from '../../approval-progress.js'\nimport { whenShortText } from '../../when.js'\n\nconst STATES = ['PENDING', 'APPROVED', 'REJECTED', 'ABORTED'] as const\nconst OVERDUE = 'OVERDUE'\n/** The grid column whose filter holds the chips pressed. */\nconst CHIPS = 'chips'\n\n/**\n * 결재 현황 — every approval of the domain, whatever its kind, and where each stands (ADR-0183).\n *\n * The rows, the step and whom it waits on are the server's (`approvalProgress`); this page only asks with the\n * conditions pressed and draws. A row opens the case's own view, whose door checks the reader again.\n */\n@customElement('approval-progress-page')\nexport class ApprovalProgressPage extends localize(i18next)(PageView) {\n static styles = [\n /* The work surface frame for a list screen (ADR-0060 decision 8). */\n WorkSurfacePageStyles,\n ScrollbarStyles,\n CommonGristStyles,\n CommonHeaderStyles,\n css`\n .header {\n grid-template-areas: 'filters actions';\n }\n\n .header .filters {\n padding: 0;\n background: none;\n border-radius: 0;\n gap: 12px;\n }\n `\n ]\n\n @query('ox-grist') grist!: DataGrist\n\n @state() gristConfig?: any\n @state() mode: 'GRID' | 'LIST' | 'CARD' = isMobileDevice() ? 'CARD' : 'GRID'\n\n get context() {\n return {\n title: i18next.t('title.approval progress'),\n search: {\n handler: (search: string) => {\n this.grist.searchText = search\n },\n value: this.grist?.searchText || ''\n },\n filter: {\n handler: () => {\n this.grist.toggleHeadroom()\n }\n }\n }\n }\n\n /*\n * The kind, department, raised days, the chips (states and 기한 넘김), search and page are the grid's own, kept in\n * the address (FOOTER-BUTTON-REVIEW G09): a shared link, coming back and reloading read the same list, and a change of\n * them reads page 1 again. `mode` is only how the rows are drawn, never a condition.\n */\n render() {\n return html`\n <ox-grist class=\"page-fill\" .mode=${this.mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)} ?url-params-sensitive=${this.active}>\n <div slot=\"headroom\" class=\"header\">\n <div class=\"filters\">\n <ox-filters-form class=\"filter\" without-search></ox-filters-form>\n </div>\n </div>\n </ox-grist>\n `\n }\n\n async pageInitialized() {\n this.gristConfig = {\n pagination: { pages: [50, 100, 200] },\n list: { fields: ['headline', 'activityLabel'], details: ['requesterName', 'waiting', 'waited'] },\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'assignment',\n iconOnly: false,\n title: i18next.t('button.view'),\n width: 72,\n handlers: { click: (_columns, _data, _column, record) => this.openCase(record) }\n },\n {\n /* The kind filter - the kinds that have a case here, as the server names them. */\n type: 'select',\n name: 'activityName',\n header: i18next.t('field.approval-kind'),\n hidden: true,\n filter: { operator: 'in', options: () => this.kindOptions() }\n },\n { type: 'string', name: 'activityLabel', header: i18next.t('field.approval-kind'), record: { editable: false }, width: 140 },\n { type: 'string', name: 'headline', header: i18next.t('field.approval-headline'), record: { editable: false }, filter: 'search', width: 260 },\n { type: 'string', name: 'requesterName', header: i18next.t('field.approval-requester'), record: { editable: false }, filter: 'search', width: 90 },\n {\n type: 'select',\n name: 'departmentId',\n header: i18next.t('field.approval-department'),\n hidden: true,\n filter: { operator: 'eq', options: () => this.departmentOptions() }\n },\n { type: 'string', name: 'departmentName', header: i18next.t('field.approval-department'), record: { editable: false }, width: 100 },\n { type: 'string', name: 'stateLabel', header: i18next.t('label.status'), record: { editable: false, align: 'center' }, width: 70 },\n { type: 'string', name: 'stepText', header: i18next.t('field.approval-step'), record: { editable: false, align: 'center' }, width: 60 },\n { type: 'string', name: 'waiting', header: i18next.t('field.approval-approver'), record: { editable: false }, width: 180 },\n { type: 'string', name: 'waited', header: i18next.t('field.approval-waited'), record: { editable: false }, width: 100 },\n {\n type: 'datetime',\n name: 'dueAt',\n header: i18next.t('field.approval-due-at'),\n record: { editable: false, renderer: dueCell(() => this.active) },\n width: 130\n },\n { type: 'date', name: 'raisedAt', header: i18next.t('field.approval-raised-at'), record: { editable: false, renderer: value => whenShortText(value) }, filter: { operator: 'between' }, width: 140 },\n { type: 'datetime', name: 'endedAt', header: i18next.t('field.approval-ended-at'), record: { editable: false, renderer: value => whenShortText(value) }, width: 140 },\n {\n /* The chips - the states and 기한 넘김, waiting ones first; each names itself, so no label. Their numbers are the read's. */\n type: 'string',\n name: CHIPS,\n header: i18next.t('label.status'),\n hidden: true,\n record: { editable: false },\n filter: {\n type: 'select-buttons',\n operator: 'in',\n label: '',\n value: [STATES[0]],\n options: [...STATES, OVERDUE].map(value => ({ value, display: i18next.t(`label.approval-progress-${value.toLowerCase()}`) }))\n }\n }\n ],\n rows: { appendable: false, selectable: false },\n sorters: []\n }\n }\n\n private openCase(record: any) {\n openPopup(html`<activity-instance-view activity-instance-id=${record.id}></activity-instance-view>`, {\n backdrop: true,\n size: 'large',\n /* The case draws its own title; the popup naming it too drew it twice (2026-11-10). */\n title: i18next.t('title.activity instance view')\n })\n }\n\n private async kindOptions() {\n const response = await client.query({\n query: gql`\n query {\n approvalProgress(pagination: { page: 1, limit: 1 }) {\n kinds {\n name\n label\n labelTKey\n }\n }\n }\n `\n })\n return (response.data?.approvalProgress?.kinds || []).map((kind: any) => ({\n value: kind.name,\n display: String(i18next.t(kind.labelTKey, { defaultValue: kind.label }))\n }))\n }\n\n private async departmentOptions() {\n const response = await client.query({\n query: gql`\n query {\n departments(pagination: { page: 1, limit: 500 }, sortings: [{ name: \"name\" }]) {\n items {\n id\n name\n }\n }\n }\n `\n })\n return (response.data?.departments?.items || []).map((one: any) => ({ value: one.id, display: one.name }))\n }\n\n /** The grid's conditions as the server's filter - the column filters, the search box and the chips. */\n private filterOf(filters: any[]) {\n const valueOf = (name: string) => filters.find(one => one.name === name && one.operator !== 'search')?.value\n const kinds = valueOf('activityName')\n const [from, to] = valueOf('raisedAt') || []\n const search = filters.find(one => one.operator === 'search')?.value?.replace(/^%|%$/g, '')\n const pressed = valueOf(CHIPS)\n const chips: string[] = pressed ? [].concat(pressed) : []\n\n return {\n activityNames: kinds ? [].concat(kinds) : undefined,\n departmentIds: valueOf('departmentId') ? [valueOf('departmentId')] : undefined,\n from: from ? new Date(from) : undefined,\n /* The range's last day counts whole - the server's `to` is exclusive. */\n to: to ? new Date(new Date(to).getTime() + 24 * 3600 * 1000) : undefined,\n states: chips.filter(chip => chip !== OVERDUE),\n overdueOnly: chips.includes(OVERDUE) || undefined,\n search: search || undefined\n }\n }\n\n async fetchHandler({ page, limit, filters = [] }: FetchOption) {\n const response = await client.query({\n query: gql`\n query ($filter: ApprovalProgressFilter, $pagination: Pagination) {\n approvalProgress(filter: $filter, pagination: $pagination) {\n items {\n id\n activityName\n activityLabel\n activityLabelTKey\n headline\n requesterName\n departmentName\n state\n step\n steps\n waitingOn\n decidedBy\n waitingRole\n waitingSince\n dueAt\n overdue\n raisedAt\n endedAt\n }\n total\n counts {\n state\n count\n }\n overdue\n }\n }\n `,\n variables: { filter: this.filterOf(filters), pagination: { page, limit } },\n fetchPolicy: 'no-cache'\n })\n\n const result = response.data?.approvalProgress\n /* The chips' numbers come with the rows - handed to the grid as its counts for the chips column, which the form draws. */\n const counts = { [CHIPS]: Object.fromEntries([...(result?.counts || []).map((one: any) => [one.state, one.count]), [OVERDUE, result?.overdue ?? 0]]) }\n this.grist.counts = counts\n this.grist.dispatchEvent(new CustomEvent('counts-change', { detail: counts }))\n\n return {\n total: result?.total || 0,\n records: (result?.items || []).map((item: any) => ({\n ...item,\n activityLabel: item.activityLabelTKey ? String(i18next.t(item.activityLabelTKey, { defaultValue: item.activityLabel })) : item.activityLabel,\n stateLabel: i18next.t(`label.approval-progress-${String(item.state).toLowerCase()}`),\n stepText: item.step ? `${item.step} / ${item.steps}` : '',\n waiting: this.waitingText(item),\n waited: this.waitedText(item)\n }))\n }\n }\n\n /* Who decides it: whom a waiting case waits on, who approved last or rejected a decided one. */\n private waitingText(item: any) {\n if (item.state !== 'PENDING') return (item.decidedBy || []).join(', ')\n const names = (item.waitingOn || []).join(', ')\n return item.waitingRole ? `${item.waitingRole}${names ? ` (${names})` : ''}` : names\n }\n\n private waitedText(item: any) {\n const parts = item.state === 'PENDING' ? waitedParts(item.waitingSince) : undefined\n if (!parts) return ''\n /* Past due is the due column's to say (dueCell) - said here too, it would be said twice. */\n return parts.days\n ? i18next.t('text.waited-days', parts)\n : parts.hours\n ? i18next.t('text.waited-hours', parts)\n : i18next.t('text.waited-minutes', parts)\n }\n}\n"]}
|
package/dist-client/route.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export default function route(page: string): "
|
|
1
|
+
export default function route(page: string): "approval-pending-list" | "activity" | "draft-list" | "todo-list" | "done-list-calendar" | "activity-catalog" | "activity-detail" | "approval-done-list" | "pickable-list" | "starter-list" | "reporter-list" | "activity-list" | "activity-instance-start" | "activity-thread" | "activity-thread-view" | "activity-approval" | "activity-instance-list" | "approval-progress" | "activity-instance-search" | "activity-template-list" | "activity-store" | "activity-thread-list" | "activity-approval-list" | "installable-activity-list" | "activity-stats-list" | undefined;
|
|
@@ -43,9 +43,13 @@ let ActivityApprovalContextTemplate = class ActivityApprovalContextTemplate exte
|
|
|
43
43
|
return html `
|
|
44
44
|
<div flow>
|
|
45
45
|
<div approval-line>
|
|
46
|
-
<!-- 이 결재 줄의 순번이 곧 지금 단계다 — ribbon 과 같은 값을 쓴다. -->
|
|
46
|
+
<!-- 이 결재 줄의 순번이 곧 지금 단계다 — ribbon 과 같은 값을 쓴다. 읽는 사람은 결재자라 「나」 대신 기안자를 쓴다. -->
|
|
47
47
|
${approvalLine
|
|
48
|
-
? html `<approval-line-view
|
|
48
|
+
? html `<approval-line-view
|
|
49
|
+
.model=${approvalLine}
|
|
50
|
+
.current=${order}
|
|
51
|
+
.drafter=${assignee?.name}
|
|
52
|
+
></approval-line-view>`
|
|
49
53
|
: html ``}
|
|
50
54
|
</div>
|
|
51
55
|
</div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity-approval-context-template.js","sourceRoot":"","sources":["../../client/templates/activity-approval-context-template.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,wCAAwC,CAAA;AAE/C,OAAO,EAAE,IAAI,EAAO,UAAU,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sDAAsD,CAAA;AACjG,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAE9D,OAAO,0EAA0E,CAAA;AAEjF;;;;;;;;;;;;;GAaG;AACH,SAAS,YAAY,CAAC,QAAuC,EAAE,QAA4B;IACzF,IAAI,QAAQ,EAAE,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC/B,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAA;IAC9B,CAAC;IAED,OAAO,IAAI,CAAA,sBAAsB,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,SAAS,CAAA;AAC9E,CAAC;AAGD,IAAM,+BAA+B,GAArC,MAAM,+BAAgC,SAAQ,UAAU;IAAxD;;QAKU,eAAU,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"activity-approval-context-template.js","sourceRoot":"","sources":["../../client/templates/activity-approval-context-template.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '../components/activity-thread-timeline'\n\nimport { html, css, LitElement, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { ContextToolbarOverlayStyle } from '@operato/context/ox-context-toolbar-overlay-style.js'\nimport { RouteController } from '@operato/shell'\nimport { i18next } from '@operato/i18n'\n\nimport { ContextPanelStyles, valueCell, whenCell } from './context-panel.js'\nimport { personValue } from '../components/activity-fields.js'\n\nimport '@things-factory/organization/dist-client/component/approval-line-view.js'\n\n/**\n * Who judged this step.\n *\n * An empty approver on a step nobody has reached is a state, not a missing value. The row used to\n * fall through to the generic 「값 없음」, which covers \"there is none, or the screen could not fetch\n * it\" — on a step that is simply waiting, that reads as a defect. Steps chosen by role have no\n * person until someone acts, so every pending approval showed it.\n *\n * The role is not named here. The diagram two inches above already lights up the waiting step and\n * labels it 역할; repeating it in this row says the same thing twice.\n *\n * Once a judgment exists the approver is a real person, and an empty one there would be a genuine\n * gap — so that case keeps the generic fallback.\n */\nfunction approverCell(approver: { name?: string } | undefined, judgment: string | undefined) {\n if (approver?.name || judgment) {\n return personValue(approver)\n }\n\n return html`<span class=\"none\">${i18next.t('text.approver-not-yet')}</span>`\n}\n\n@customElement('activity-approval-context-template')\nclass ActivityApprovalContextTemplate extends LitElement {\n static styles = [ContextToolbarOverlayStyle, ContextPanelStyles]\n\n @property({ type: Object }) private activityApproval\n\n private _routeCtrl = new RouteController(this)\n\n render() {\n const activityApproval = this._routeCtrl.context.activityApproval || this.activityApproval || {}\n\n const { round, order, approver, judgment, createdAt, activityThread } = activityApproval || {}\n const { state, dueAt, assignedAt, assignee, activityInstance, activityApprovals } = activityThread || {}\n const { name, description, thumbnail, approvalLine } = activityInstance || {}\n\n return html`\n <div flow>\n <div approval-line>\n <!-- 이 결재 줄의 순번이 곧 지금 단계다 — ribbon 과 같은 값을 쓴다. 읽는 사람은 결재자라 「나」 대신 기안자를 쓴다. -->\n ${approvalLine\n ? html`<approval-line-view\n .model=${approvalLine}\n .current=${order}\n .drafter=${assignee?.name}\n ></approval-line-view>`\n : html``}\n </div>\n </div>\n\n <dl class=\"given\">\n <!-- 차수는 1일 때 적지 않는다. 2차 이상일 때만 「되돌아왔다」는 사실이 된다. -->\n ${Number(round) > 1\n ? html`\n <dt>${i18next.t('field.round')}</dt>\n <dd class=\"strong\">${round}</dd>\n `\n : nothing}\n\n <dt>${i18next.t('field.approval-order')}</dt>\n <dd class=\"strong\">${valueCell(order)}</dd>\n\n <dt>${i18next.t('field.wl-owner')}</dt>\n <dd class=\"strong\">${personValue(assignee)}</dd>\n\n <dt>${i18next.t('field.approver')}</dt>\n <dd class=\"strong\">${approverCell(approver, judgment)}</dd>\n\n <dt>${i18next.t('field.assigned-at')}</dt>\n <dd>${whenCell(assignedAt)}</dd>\n\n <dt>${i18next.t('field.due-at')}</dt>\n <dd>${whenCell(dueAt)}</dd>\n\n <!-- 전에는 라벨이 since 였다 — 다섯 언어를 갖춘 화면에 영문 한 낱말이 박혀 있었다. -->\n <dt>${i18next.t('field.approval-submitted-at')}</dt>\n <dd>${whenCell(createdAt)}</dd>\n </dl>\n\n ${activityApprovals && activityApprovals.length > 0\n ? html` <!--\n 팝업 안에서는 편다. 팝업은 내용에 맞춰지지 않고 60%×60% 로 고정되므로\n (@operato/popup 의 [hovering=center]), 접어 두면 아래가 흰 여백으로 남는다.\n 그리고 여기서 이력은 보조가 아니다 — 이 패널을 여는 이유의 절반이 「어떻게 여기까지 왔나」다.\n -->\n <activity-thread-timeline .activityThread=${activityThread} open short-form></activity-thread-timeline> `\n : nothing}\n ${thumbnail\n ? html` <div thumbnail>\n <img src=${thumbnail} />\n </div>`\n : html``}\n `\n }\n\n}\n"]}
|