@things-factory/worklist 10.0.19 → 10.1.0
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/activity-cells.d.ts +21 -0
- package/dist-client/activity-cells.js +117 -0
- package/dist-client/activity-cells.js.map +1 -0
- package/dist-client/activity-summary-generator.js +57 -11
- package/dist-client/activity-summary-generator.js.map +1 -1
- package/dist-client/approval-progress.d.ts +18 -0
- package/dist-client/approval-progress.js +31 -0
- package/dist-client/approval-progress.js.map +1 -0
- package/dist-client/bootstrap.js +6 -11
- package/dist-client/bootstrap.js.map +1 -1
- package/dist-client/chip-filters.d.ts +53 -0
- package/dist-client/chip-filters.js +60 -0
- package/dist-client/chip-filters.js.map +1 -0
- package/dist-client/components/activity-approval-ribon.d.ts +19 -0
- package/dist-client/components/activity-approval-ribon.js +50 -126
- package/dist-client/components/activity-approval-ribon.js.map +1 -1
- package/dist-client/components/activity-fields.d.ts +50 -0
- package/dist-client/components/activity-fields.js +393 -0
- package/dist-client/components/activity-fields.js.map +1 -0
- package/dist-client/components/activity-instance-ribon.d.ts +19 -0
- package/dist-client/components/activity-instance-ribon.js +55 -122
- package/dist-client/components/activity-instance-ribon.js.map +1 -1
- package/dist-client/components/activity-thread-ribon.d.ts +25 -0
- package/dist-client/components/activity-thread-ribon.js +64 -121
- package/dist-client/components/activity-thread-ribon.js.map +1 -1
- package/dist-client/components/activity-thread-timeline.d.ts +14 -2
- package/dist-client/components/activity-thread-timeline.js +234 -104
- package/dist-client/components/activity-thread-timeline.js.map +1 -1
- package/dist-client/components/state-ribon.d.ts +40 -0
- package/dist-client/components/state-ribon.js +200 -0
- package/dist-client/components/state-ribon.js.map +1 -0
- package/dist-client/due.d.ts +16 -0
- package/dist-client/due.js +78 -0
- package/dist-client/due.js.map +1 -0
- package/dist-client/pages/activity/activity-list-page.js +4 -6
- package/dist-client/pages/activity/activity-list-page.js.map +1 -1
- package/dist-client/pages/activity-approval/activity-approval-list-page.js +2 -1
- package/dist-client/pages/activity-approval/activity-approval-list-page.js.map +1 -1
- package/dist-client/pages/activity-approval/activity-approval-page.d.ts +52 -5
- package/dist-client/pages/activity-approval/activity-approval-page.js +265 -118
- package/dist-client/pages/activity-approval/activity-approval-page.js.map +1 -1
- package/dist-client/pages/activity-instance/activity-instance-list-page.d.ts +0 -1
- package/dist-client/pages/activity-instance/activity-instance-list-page.js +8 -24
- package/dist-client/pages/activity-instance/activity-instance-list-page.js.map +1 -1
- package/dist-client/pages/activity-instance/activity-instance-start-page.d.ts +1 -0
- package/dist-client/pages/activity-instance/activity-instance-start-page.js +7 -0
- package/dist-client/pages/activity-instance/activity-instance-start-page.js.map +1 -1
- package/dist-client/pages/activity-instance/activity-instance-view.js +1 -1
- package/dist-client/pages/activity-instance/activity-instance-view.js.map +1 -1
- package/dist-client/pages/activity-stats/activity-stats-list-page.js +2 -1
- package/dist-client/pages/activity-stats/activity-stats-list-page.js.map +1 -1
- package/dist-client/pages/activity-thread/activity-thread-page.d.ts +30 -4
- package/dist-client/pages/activity-thread/activity-thread-page.js +142 -66
- package/dist-client/pages/activity-thread/activity-thread-page.js.map +1 -1
- package/dist-client/pages/activity-thread/activity-thread-view-page.d.ts +17 -6
- package/dist-client/pages/activity-thread/activity-thread-view-page.js +118 -65
- package/dist-client/pages/activity-thread/activity-thread-view-page.js.map +1 -1
- package/dist-client/pages/activity-thread/activity-thread-view.d.ts +24 -7
- package/dist-client/pages/activity-thread/activity-thread-view.js +84 -308
- package/dist-client/pages/activity-thread/activity-thread-view.js.map +1 -1
- package/dist-client/pages/installable-activity/installable-activity-list-page.d.ts +1 -1
- package/dist-client/pages/installable-activity/installable-activity-list-page.js +13 -9
- package/dist-client/pages/installable-activity/installable-activity-list-page.js.map +1 -1
- package/dist-client/pages/todo/approval-done-list-page.d.ts +1 -0
- package/dist-client/pages/todo/approval-done-list-page.js +111 -58
- package/dist-client/pages/todo/approval-done-list-page.js.map +1 -1
- package/dist-client/pages/todo/approval-pending-list-page.d.ts +32 -1
- package/dist-client/pages/todo/approval-pending-list-page.js +485 -130
- package/dist-client/pages/todo/approval-pending-list-page.js.map +1 -1
- package/dist-client/pages/todo/done-list-calendar-page.d.ts +2 -0
- package/dist-client/pages/todo/done-list-calendar-page.js +213 -29
- package/dist-client/pages/todo/done-list-calendar-page.js.map +1 -1
- package/dist-client/pages/todo/done-list-page.d.ts +1 -0
- package/dist-client/pages/todo/done-list-page.js +126 -62
- package/dist-client/pages/todo/done-list-page.js.map +1 -1
- package/dist-client/pages/todo/draft-list-page.d.ts +1 -0
- package/dist-client/pages/todo/draft-list-page.js +82 -34
- package/dist-client/pages/todo/draft-list-page.js.map +1 -1
- package/dist-client/pages/todo/pickable-list-page.js +6 -10
- package/dist-client/pages/todo/pickable-list-page.js.map +1 -1
- package/dist-client/pages/todo/todo-list-page.d.ts +1 -1
- package/dist-client/pages/todo/todo-list-page.js +102 -78
- package/dist-client/pages/todo/todo-list-page.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/route.js +0 -6
- package/dist-client/route.js.map +1 -1
- package/dist-client/templates/activity-approval-context-template.js +60 -138
- package/dist-client/templates/activity-approval-context-template.js.map +1 -1
- package/dist-client/templates/activity-instance-context-template.js +13 -172
- package/dist-client/templates/activity-instance-context-template.js.map +1 -1
- package/dist-client/templates/activity-thread-context-template.js +39 -131
- package/dist-client/templates/activity-thread-context-template.js.map +1 -1
- package/dist-client/templates/context-panel.d.ts +26 -0
- package/dist-client/templates/context-panel.js +182 -0
- package/dist-client/templates/context-panel.js.map +1 -0
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/when.d.ts +4 -0
- package/dist-client/when.js +72 -0
- package/dist-client/when.js.map +1 -0
- package/dist-server/controllers/activity-approval/_abort.js +2 -1
- package/dist-server/controllers/activity-approval/_abort.js.map +1 -1
- package/dist-server/controllers/activity-approval/approval-line.d.ts +106 -0
- package/dist-server/controllers/activity-approval/approval-line.js +151 -0
- package/dist-server/controllers/activity-approval/approval-line.js.map +1 -0
- package/dist-server/controllers/activity-approval/approve.js +61 -51
- package/dist-server/controllers/activity-approval/approve.js.map +1 -1
- package/dist-server/controllers/activity-approval/claim.d.ts +42 -0
- package/dist-server/controllers/activity-approval/claim.js +77 -0
- package/dist-server/controllers/activity-approval/claim.js.map +1 -0
- package/dist-server/controllers/activity-approval/create-approval.d.ts +41 -0
- package/dist-server/controllers/activity-approval/create-approval.js +78 -0
- package/dist-server/controllers/activity-approval/create-approval.js.map +1 -0
- package/dist-server/controllers/activity-approval/delegate.d.ts +16 -0
- package/dist-server/controllers/activity-approval/delegate.js +43 -7
- package/dist-server/controllers/activity-approval/delegate.js.map +1 -1
- package/dist-server/controllers/activity-approval/opinion.d.ts +10 -0
- package/dist-server/controllers/activity-approval/opinion.js +43 -0
- package/dist-server/controllers/activity-approval/opinion.js.map +1 -0
- package/dist-server/controllers/activity-approval/reject.js +21 -1
- package/dist-server/controllers/activity-approval/reject.js.map +1 -1
- package/dist-server/controllers/activity-approval/save.js +26 -2
- package/dist-server/controllers/activity-approval/save.js.map +1 -1
- package/dist-server/controllers/activity-installation/activity-installation-controller.d.ts +26 -0
- package/dist-server/controllers/activity-installation/activity-installation-controller.js +45 -0
- package/dist-server/controllers/activity-installation/activity-installation-controller.js.map +1 -1
- package/dist-server/controllers/activity-instance/approval-expectation.d.ts +34 -0
- package/dist-server/controllers/activity-instance/approval-expectation.js +18 -0
- package/dist-server/controllers/activity-instance/approval-expectation.js.map +1 -0
- package/dist-server/controllers/activity-instance/issue.js +32 -0
- package/dist-server/controllers/activity-instance/issue.js.map +1 -1
- package/dist-server/controllers/activity-thread/restart.js +17 -1
- package/dist-server/controllers/activity-thread/restart.js.map +1 -1
- package/dist-server/controllers/activity-thread/submit.js +23 -43
- package/dist-server/controllers/activity-thread/submit.js.map +1 -1
- package/dist-server/controllers/common.js +46 -0
- package/dist-server/controllers/common.js.map +1 -1
- package/dist-server/controllers/index.d.ts +1 -0
- package/dist-server/controllers/index.js +8 -0
- package/dist-server/controllers/index.js.map +1 -1
- package/dist-server/service/activity/activity-mutation.js +25 -5
- package/dist-server/service/activity/activity-mutation.js.map +1 -1
- package/dist-server/service/activity/activity-type.d.ts +14 -0
- package/dist-server/service/activity/activity-type.js +8 -0
- package/dist-server/service/activity/activity-type.js.map +1 -1
- package/dist-server/service/activity/activity.d.ts +18 -0
- package/dist-server/service/activity/activity.js +5 -0
- package/dist-server/service/activity/activity.js.map +1 -1
- package/dist-server/service/activity-approval/activity-approval-mutation.js +3 -2
- package/dist-server/service/activity-approval/activity-approval-mutation.js.map +1 -1
- package/dist-server/service/activity-approval/activity-approval-query.d.ts +19 -1
- package/dist-server/service/activity-approval/activity-approval-query.js +186 -56
- package/dist-server/service/activity-approval/activity-approval-query.js.map +1 -1
- package/dist-server/service/activity-approval/activity-approval.d.ts +29 -1
- package/dist-server/service/activity-approval/activity-approval.js +19 -0
- package/dist-server/service/activity-approval/activity-approval.js.map +1 -1
- package/dist-server/service/activity-approval/my-pending-approvals.d.ts +21 -0
- package/dist-server/service/activity-approval/my-pending-approvals.js +40 -0
- package/dist-server/service/activity-approval/my-pending-approvals.js.map +1 -0
- package/dist-server/service/activity-instance/activity-instance-type.d.ts +20 -0
- package/dist-server/service/activity-instance/activity-instance-type.js +11 -0
- package/dist-server/service/activity-instance/activity-instance-type.js.map +1 -1
- package/dist-server/service/activity-instance/activity-instance.d.ts +6 -0
- package/dist-server/service/activity-instance/activity-instance.js +5 -0
- package/dist-server/service/activity-instance/activity-instance.js.map +1 -1
- package/dist-server/service/activity-stats/activity-stats-query.d.ts +5 -0
- package/dist-server/service/activity-stats/activity-stats-query.js +149 -11
- package/dist-server/service/activity-stats/activity-stats-query.js.map +1 -1
- package/dist-server/service/activity-stats/activity-stats-type.d.ts +19 -6
- package/dist-server/service/activity-stats/activity-stats-type.js +37 -10
- package/dist-server/service/activity-stats/activity-stats-type.js.map +1 -1
- package/dist-server/service/activity-stats/event-placement.d.ts +55 -0
- package/dist-server/service/activity-stats/event-placement.js +82 -0
- package/dist-server/service/activity-stats/event-placement.js.map +1 -0
- package/dist-server/service/activity-thread/activity-thread-query.js +48 -24
- package/dist-server/service/activity-thread/activity-thread-query.js.map +1 -1
- package/dist-server/service/activity-thread/my-open-threads.d.ts +15 -0
- package/dist-server/service/activity-thread/my-open-threads.js +40 -0
- package/dist-server/service/activity-thread/my-open-threads.js.map +1 -0
- package/dist-server/service/activity-thread/todo-order.d.ts +49 -0
- package/dist-server/service/activity-thread/todo-order.js +70 -0
- package/dist-server/service/activity-thread/todo-order.js.map +1 -0
- package/dist-server/service/installable-activity/installable-activity-mutation.d.ts +6 -0
- package/dist-server/service/installable-activity/installable-activity-mutation.js +7 -24
- package/dist-server/service/installable-activity/installable-activity-mutation.js.map +1 -1
- package/dist-server/service/nulls-last.d.ts +30 -0
- package/dist-server/service/nulls-last.js +37 -0
- package/dist-server/service/nulls-last.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/helps/dataset/activity-instance-search-page.ko.md +5 -0
- package/helps/dataset/activity-instance-search-page.md +13 -0
- package/helps/worklist/activity-approval.ko.md +5 -0
- package/helps/worklist/activity-approval.md +14 -0
- package/helps/worklist/activity-bank-page.ko.md +5 -0
- package/helps/worklist/activity-bank-page.md +13 -0
- package/helps/worklist/activity-reporter-list.ko.md +5 -0
- package/helps/worklist/activity-reporter-list.md +13 -0
- package/helps/worklist/activity-store.ko.md +5 -0
- package/helps/worklist/activity-store.md +13 -0
- package/helps/worklist/activity-template.ko.md +5 -0
- package/helps/worklist/activity-template.md +13 -0
- package/helps/worklist/installable-activity.ko.md +5 -0
- package/helps/worklist/installable-activity.md +13 -0
- package/package.json +13 -12
- package/things-factory.config.js +0 -5
- package/translations/en.json +129 -51
- package/translations/ja.json +130 -52
- package/translations/ko.json +82 -4
- package/translations/ms.json +129 -51
- package/translations/zh.json +132 -54
- package/dist-client/pages/dashboard/dashboard-home.d.ts +0 -1
- package/dist-client/pages/dashboard/dashboard-home.js +0 -22
- package/dist-client/pages/dashboard/dashboard-home.js.map +0 -1
- package/dist-client/pages/worklist-home.d.ts +0 -1
- package/dist-client/pages/worklist-home.js +0 -17
- package/dist-client/pages/worklist-home.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval-pending-list-page.js","sourceRoot":"","sources":["../../../client/pages/todo/approval-pending-list-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist'\nimport '@operato/context/ox-context-page-toolbar.js'\nimport '@operato/input/ox-input-select-buttons.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { asyncReplace } from 'lit/directives/async-replace.js'\nimport { DataGrist, FetchOption, getRenderer } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { navigate, PageView } from '@operato/shell'\nimport { CommonGristStyles, CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'\nimport { adjustFilters, isMobileDevice, sleep } from '@operato/utils'\n\nimport { p13n } from '@operato/p13n'\n\nconst MIN = 60\nconst HOUR = 60 * MIN\nconst DAY = 24 * HOUR\n\n@customElement('approval-pending-list-page')\nexport class ApprovalPendingListPage extends p13n(localize(i18next)(PageView)) { static styles = [\n ScrollbarStyles,\n CommonGristStyles,\n CommonHeaderStyles,\n css`\n :host { display: flex;\n\n width: 100%;\n\n --grid-record-emphasized-background-color: #8b0000;\n --grid-record-emphasized-color: #ff6b6b;\n }\n\n ox-grist { overflow-y: auto;\n flex: 1;\n }\n\n .header { grid-template-areas: 'filters actions';\n }\n `\n ]\n\n @property({ type: Object }) gristConfig?: any\n @property({ type: String }) mode: 'GRID' | 'LIST' | 'CARD' = isMobileDevice() ? 'CARD' : 'GRID'\n\n @query('ox-grist') grist!: DataGrist\n\n @state() filters?: string[]\n\n get context() { return { title: i18next.t('title.approval pending list'),\n search: { handler: (search: string) => { this.grist.searchText = search\n },\n value: this.grist?.searchText || ''\n },\n filter: { handler: () => { this.grist.toggleHeadroom()\n }\n },\n help: 'worklist/approval-pending-list-page',\n actions: [],\n toolbar: false\n }\n }\n\n render() { const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')\n\n return html`\n <ox-grist\n .mode=${mode}\n .config=${this.gristConfig}\n .fetchHandler=${this.fetchHandler.bind(this)}\n .personalConfigProvider=${this.getPagePreferenceProvider('ox-grist')!}\n >\n <div slot=\"headroom\" class=\"header\">\n <div class=\"filters\">\n <ox-input-select-buttons\n .value=${this.filters}\n .options=${[\n { display: i18next.t('label.filter-important'),\n value: 'important'\n },\n { display: i18next.t('label.filter-due'),\n value: 'due'\n },\n { display: i18next.t('label.filter-resubmitted'),\n value: 'resubmitted'\n }\n ]}\n @change=${(e: CustomEvent) => { this.filters = (e.currentTarget as any)?.value\n this.grist.fetch()\n }}\n ></ox-input-select-buttons>\n <!-- <ox-filters-form class=\"filter\" autofocus without-search></ox-filters-form> -->\n </div>\n\n <ox-context-page-toolbar class=\"actions\" .context=${this.context}></ox-context-page-toolbar>\n </div>\n\n <ox-grist-personalizer slot=\"setting\"></ox-grist-personalizer>\n </ox-grist>\n `\n }\n\n async pageInitialized(lifecycle) { this.gristConfig = { list: { thumbnail: 'thumbnail',\n fields: ['name', 'description'],\n details: ['createdAt', 'due']\n },\n columns: [\n { type: 'gutter', gutterName: 'sequence', fixed: true },\n { type: 'gutter',\n gutterName: 'button',\n iconOnly: false,\n title: i18next.t('button.open'),\n width: 72,\n fixed: true,\n icon: record => (record && !record.comment ? 'new_label' : 'label')\n },\n { type: 'string',\n name: 'name',\n fixed: true,\n header: i18next.t('field.name'),\n record: { editable: false\n },\n filter: 'search',\n sortable: true,\n width: 250\n },\n { type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: { editable: false\n },\n filter: 'search',\n width: 275\n },\n { type: 'string',\n name: 'viewSource',\n header: i18next.t('field.view-source'),\n record: { editable: false,\n renderer: function (value, column, record, rowIndex, field) { const { viewType, viewSource } = record.activity || {}\n var type = viewType !== 'board' ? 'string' : 'board'\n return getRenderer(type)(viewSource, column, record, rowIndex, field)\n }\n },\n width: 140,\n hidden: true\n },\n { type: 'number',\n name: 'priority',\n header: i18next.t('field.priority'),\n record: { editable: false,\n align: 'center',\n renderer: function (value, column, record, rowIndex, field) { const color = ['', '#98FB98', '#87CEEB', '#FF6B6B', '#8B0000'][value || 0]\n const count = new Array(value > 4 ? 4 : value || 0).fill('')\n return html`${count.map(() => html`<md-icon style=\"color:${color};\">star</md-icon>`)}`\n }\n },\n width: 70\n },\n { type: 'number',\n name: 'round',\n header: i18next.t('field.round'),\n record: { editable: false,\n align: 'right'\n },\n width: 50\n },\n { type: 'select',\n name: 'state',\n header: i18next.t('field.status'),\n record: { editable: false,\n options: [\n { display: i18next.t('label.activity-state-submitted'), value: 'submitted' },\n { display: i18next.t('label.activity-state-escalated'), value: 'escalated' }\n ]\n },\n width: 85\n },\n { type: 'datetime',\n name: 'dueAt',\n header: i18next.t('field.due-at'),\n record: { editable: false,\n options: { year: 'numeric',\n month: 'numeric',\n day: 'numeric'\n }\n },\n width: 180\n },\n { type: 'string',\n name: 'dueIn',\n header: i18next.t('field.due-in'),\n record: { editable: false,\n renderer: (value, column, record, rowIndex, field) => { return html` <span>${asyncReplace(this.dueTimer(record.dueAt))}</span>`\n }\n },\n sortable: false,\n width: 180\n },\n { type: 'resource-object',\n name: 'creator',\n header: i18next.t('field.issuer'),\n record: { editable: false\n },\n sortable: true,\n width: 85\n },\n { type: 'resource-object',\n name: 'assignee',\n header: i18next.t('field.assignee'),\n record: { editable: false\n },\n width: 85\n },\n { type: 'datetime',\n name: 'createdAt',\n header: i18next.t('field.issued-at'),\n record: { editable: false\n },\n sortable: true,\n filter: false,\n width: 180\n },\n { type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated-at'),\n record: { editable: false\n },\n sortable: true,\n filter: false,\n width: 180\n },\n { type: 'image',\n name: 'thumbnail',\n header: i18next.t('field.thumbnail'),\n record: { editable: false },\n hidden: true,\n handlers: { click: (columns, data, column, record, rowIndex) => { const { id } = record\n this.openActivityApproval(record)\n }\n }\n }\n ],\n rows: { appendable: false,\n editable: false,\n handlers: { click: (columns, data, column, record, rowIndex) => { this.openActivityApproval(record)\n }\n }\n },\n sorters: [\n { name: 'updatedAt',\n desc: true\n }\n ]\n }\n }\n\n async pageUpdated(changes, lifecycle, changedBefore) { if (this.active) { this.grist?.fetch()\n }\n }\n\n async fetchHandler({ page, limit, sortings = [], filters = [] }: FetchOption) { if (this.filters?.includes('important')) { filters = adjustFilters(filters, [{ name: 'priority', operator: 'gte', value: 2 }])\n }\n\n if (this.filters?.includes('due')) { let tomorrow = new Date(Date.now() + 24 * 3600 * 1000).toISOString().replace('T', ' ')\n filters = adjustFilters(filters, [{ name: 'dueAt', operator: 'lte', value: tomorrow }])\n }\n\n if (this.filters?.includes('resubmitted')) { filters = adjustFilters(filters, [{ name: 'round', operator: 'gte', value: 2 }])\n }\n\n const response = await client.query({ query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) { responses: approvalPendingList(filters: $filters, pagination: $pagination, sortings: $sortings) { items { id\n round\n comment\n activityThread { activityInstance { activityId: id\n name\n description\n priority\n input\n refBy\n activityType\n viewType\n viewSource\n thumbnail\n updatedAt\n createdAt\n creator { id\n name\n }\n }\n state\n output\n dueAt\n assignee { id\n name\n }\n assignedAt\n }\n updatedAt\n }\n total\n }\n }\n `,\n variables: { filters,\n pagination: { page, limit },\n sortings\n }\n })\n\n return { total: response.data.responses.total || 0,\n records: (response.data.responses.items || []).map(item => { let thread = item.activityThread\n return { id: item.id,\n state: thread.state,\n ...thread.activityInstance,\n dueAt: thread.dueAt,\n assignee: thread.assignee,\n assignedAt: thread.assignedAt,\n output: thread.output,\n round: item.round,\n comment: item.comment,\n updatedAt: item.updatedAt\n }\n })\n }\n }\n\n openActivityApproval(activityApproval) { navigate(`activity-approval/${activityApproval.id}?title=${activityApproval.name}`)\n }\n\n async *dueTimer(exp) { while (exp && this.active) { var secs = Math.round((Number(exp) - Date.now()) / 1000)\n var positive = secs >= 0\n\n secs = Math.abs(secs)\n const days = Math.floor(secs / DAY)\n secs -= days * DAY\n const hours = Math.floor(secs / HOUR)\n secs -= hours * HOUR\n const minutes = Math.floor(secs / MIN)\n const seconds = secs - minutes * MIN\n\n yield `${positive ? '' : '- '}${days ? `${days}${i18next.t('label.days')} ` : ''}${hours ? `${hours}${i18next.t('label.hours')} ` : ''}${ minutes ? `${minutes}${i18next.t('label.minutes')} ` : ''\n }`\n\n await sleep(60 * 1000)\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"approval-pending-list-page.js","sourceRoot":"","sources":["../../../client/pages/todo/approval-pending-list-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist'\nimport '@operato/data-grist/ox-filters-form.js'\nimport '@operato/context/ox-context-page-toolbar.js'\nimport '@operato/input/ox-input-select-buttons.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { asyncReplace } from 'lit/directives/async-replace.js'\nimport { DataGrist, FetchOption, getRenderer } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { dueSoonChip, dueSoonFilters, importantChip, importantFilters } from '../../chip-filters.js'\nimport { i18next, localize } from '@operato/i18n'\nimport { navigate, PageView } from '@operato/shell'\nimport { CommonGristStyles, CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'\nimport { adjustFilters, isMobileDevice, sleep } from '@operato/utils'\n\nimport { p13n } from '@operato/p13n'\n\nimport { approvalMarks, dueCell, priorityCell, subjectCell } from '../../activity-cells.js'\n\nconst MIN = 60\nconst HOUR = 60 * MIN\nconst DAY = 24 * HOUR\n\n@customElement('approval-pending-list-page')\nexport class ApprovalPendingListPage extends p13n(localize(i18next)(PageView)) { static styles = [\n ScrollbarStyles,\n CommonGristStyles,\n CommonHeaderStyles,\n css`\n /*\n * 세로로 쌓는다 — 묶음 고르는 줄이 표 **위**에 서야 한다.\n *\n * 방향을 빼면 가로로 배치되어, 그 줄이 표 왼쪽에 세로 띠로 서고 버튼 글자가 세로 가운데에\n * 떠서 표 밑처럼 보인다. 표도 그 띠만큼 밀려 오른쪽 칸이 잘린다. 전에는 자식이 ox-grist\n * 하나뿐이라 방향이 드러나지 않았다.\n */\n :host {\n display: flex;\n flex-direction: column;\n\n width: 100%;\n\n --grid-record-emphasized-background-color: #8b0000;\n --grid-record-emphasized-color: #ff6b6b;\n }\n\n ox-grist { overflow-y: auto;\n flex: 1;\n }\n\n .header { grid-template-areas: 'filters actions';\n }\n\n /*\n * ── 헤드룸의 왼쪽 기준선은 표와 같다 ─────────────────────────────────\n * CommonHeaderStyles 의 .filters 는 배경과 모서리와 여백을 가진 영역이다. 그 배경이\n * --md-sys-color-surface 인데 이 제품에서는 바탕색과 같은 값이라, **보이지 않는 영역이\n * 자리만 차지하고** 검색창을 여백만큼(12px) 안쪽으로 밀었다.\n *\n * 실측: 표 왼쪽 끝 212 · 필터 영역 212 · 검색창 224. 화면의 왼쪽 기준선이 둘이 됐다.\n *\n * 그 규칙들은 .header 안에 중첩되어 있어(.header .filters) 밑줄 없는 .filters 로는 이길 수\n * 없다 — 특정도가 0,1,0 대 0,2,0 이다.\n */\n .header .filters {\n padding: 0;\n background: none;\n border-radius: 0;\n gap: 12px;\n }\n\n /*\n * 이 화면에는 항목 필터가 없다 — 검색은 제목줄로 올라갔고 남은 것은 칩뿐이다. 그래도\n * ox-filters-form 은 폭 0으로 남아 자리를 지키고, 그 뒤에 gap 12px 이 붙어 칩들을 밀어냈다.\n *\n * 실측: 표 셀 212 · 필터 영역 212 · 칩 224. 왼쪽 기준선이 다시 둘이 됐다.\n *\n * 컴포넌트가 스스로 [empty] 를 달아 주므로 그것으로 접는다. 필터가 생기면 그 표식이 사라져\n * 다시 나온다.\n */\n .header .filters ox-filters-form[empty] {\n display: none;\n }\n\n /*\n * 두 묶음 — 표 위. 지금 보는 쪽은 밑줄과 굵기로 말하고, 옆에 건수를 적는다.\n *\n * 건수를 안 눌러도 보이게 두는 것이 요점이다. 참조에 몇 건이 있는지 모르면 열어 볼 이유가 없다.\n *\n * ── 필터 칩보다 무거워야 한다 ─────────────────────────────────────────────\n * 처음에 13px 맨글자로 두었더니, 바로 아래 「중요·만기·재상신」 칩이 테두리를 가져서 더 세게\n * 보였다. **보는 대상을 바꾸는 것이 대상을 좁히는 것보다 약해 보였다.** 그래서 글자를 14px 로\n * 올리고(칩은 13px) 세로 여백을 넓혀 제목 다음 자리를 준다.\n *\n * 좌우 여백은 품질 화면 탭에서 베끼지 않는다 — 그 화면은 --spacing-large 라 이 화면의 왼쪽\n * 기준선 212px(표 셀과 같은 값)을 깨뜨린다. 무게만 같게 하고 기준선은 화면이 정한다.\n */\n .groups {\n flex: none;\n display: flex;\n gap: var(--spacing-large);\n padding: 0 var(--spacing-medium);\n border-bottom: 1px solid var(--ui-line, #d5dce0);\n }\n\n .groups button {\n border: none;\n background: none;\n padding: var(--spacing-medium) 2px calc(var(--spacing-medium) - 2px);\n border-bottom: 2px solid transparent;\n font: inherit;\n font-size: 14px;\n color: var(--ui-muted, #57676f);\n cursor: pointer;\n }\n\n .groups button:hover:not([data-selected]) {\n color: var(--ui-ink, #17272f);\n }\n\n /*\n * ── 색은 밑줄이 말하고, 글자는 읽히는 색으로 ──────────────────────────────\n * 고른 탭의 글자를 --ui-accent 로 두었는데, 그 토큰이 브랜드 초록(#0e8a56)이 되면서 14px\n * 글자로는 안 읽히게 됐다.\n *\n * [확인함] 초록 #0e8a56 · 배경 rgb(240 242 244) → 대비 3.91. 본문 글자 기준 4.5 미달이다.\n * 흰 바탕 기준으로는 4.39 인데, **이 앱 배경은 흰색이 아니라** 더 나쁘다.\n *\n * --ui-ink 15.1 고른 탭 글자\n * --ui-muted 5.52 안 고른 탭 글자\n * --ui-accent 3.91 밑줄 — UI 요소는 3.0 기준이라 통과한다\n *\n * 밑줄은 선택을 가장 강하게 표시하는 자리다. 브랜드색이 거기 남으면 잃는 것이 없다.\n */\n .groups button[data-selected] {\n font-weight: 600;\n color: var(--ui-ink, #17272f);\n border-bottom-color: var(--ui-accent, #262e38);\n }\n\n .groups .n {\n margin-left: 4px;\n color: var(--ui-faint, #8a959c);\n }\n\n .groups button[data-selected] .n {\n color: inherit;\n }\n\n\n `\n ]\n\n @property({ type: Object }) gristConfig?: any\n\n /**\n * 지금 어느 묶음을 보고 있나.\n *\n * ── 왜 한 화면에 두 묶음인가 ─────────────────────────────────────────────\n * 참조를 별도 화면으로 만들면 **아무도 열지 않는다.** 참조는 안 봐도 아무 일이 안 일어나므로,\n * 아침에 업무 앱을 열면 「승인 대기」를 보지 「참조」를 따로 열지 않는다. 참조를 만든 이유가 의견을\n * 듣는 것인데 안 여는 화면에 넣으면 의견이 안 온다.\n *\n * 그래서 한 화면에 두고, **두 수를 함께 보인다.** 한 곳만 열면 둘 다 눈에 든다.\n *\n * ── 그렇다고 한 목록에 섞지 않는다 ────────────────────────────────────────\n * 두 묶음의 물음이 다르다 — 「내가 결정할 것」과 「내가 알아야 할 것」. 섞으면 참조가 「내가 승인해야\n * 하나」로 읽히고, 배지에 12가 뜨는데 결정할 것은 3건이 된다. 그러면 그 수를 안 믿게 된다.\n *\n * ── 주소가 주인이다 ──────────────────────────────────────────────────────\n * `.../approval-pending-list/reference` 로 붙여 보낼 수 있다. 대상이 바뀌는 것이므로 필터와 달리\n * 주소에 담는다.\n */\n @state() private group: 'approval' | 'reference' = 'approval'\n\n /** 두 묶음의 건수. 탭에 함께 적는다 — 안 눌러도 얼마나 있는지 보여야 한다. */\n @state() private counts: { approval?: number; reference?: number } = {}\n @property({ type: String }) mode: 'GRID' | 'LIST' | 'CARD' = isMobileDevice() ? 'CARD' : 'GRID'\n\n @query('ox-grist') grist!: DataGrist\n\n @state() filters?: string[]\n\n get context() { return { title: i18next.t('title.approval pending list'),\n /*\n * 검색의 자리는 **기기가 정한다.**\n *\n * PC 에서는 화면 안으로 내린다. 상단 바에 두면 거른 조건과 걸러진 결과가 화면의 위아래 끝으로\n * 갈라지고, 지금 무엇으로 걸렀는지가 목록 옆에서 보이지 않는다.\n *\n * 좁은 화면에서는 상단 바에 그대로 둔다. 헤드룸에 두면 검색창과 필터가 목록을 그만큼 밀어\n * 내리고, 카드 두 장이 화면 밖으로 나간다. 상단 바는 그 자리를 아끼려고 있는 것이다.\n *\n * 이 저장소에는 두 방식이 다 있다 — 헤드룸 50곳, 상단 바 51곳. 정형인 것은 구조\n * (.header / .filters / .filter)이고 검색의 자리는 화면이 정한다.\n */\n /*\n * 검색은 **페이지 제목 줄의 오른쪽 끝**에 둔다 — 다른 화면들과 같은 자리다.\n *\n * 전에는 좁은 화면에서만 여기에 넣고, 넓은 화면에서는 헤드룸의 ox-filters-form 이 검색을\n * 그렸다. 그래서 같은 앱 안에서 검색 상자의 자리가 화면마다 달랐다.\n *\n * 헤드룸에는 좁히는 칩만 남는다. 폼은 without-search 로 남겨 두어, 나중에 어느 칸에\n * filter 를 달면 그 UI 가 저절로 생긴다(비면 아무것도 그리지 않는다).\n */\n search: {\n handler: (search: string) => {\n this.grist.searchText = search\n },\n value: this.grist?.searchText || ''\n },\n filter: { handler: () => { this.grist.toggleHeadroom()\n }\n },\n help: 'worklist/approval-pending-list-page',\n actions: [],\n toolbar: false\n }\n }\n\n render() { const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')\n\n return html`\n <!--\n 두 묶음 — 표 **바깥** 위에 둔다.\n\n 헤드룸에 두면 필터를 접을 때 함께 사라지고, 그러면 참조로 가는 유일한 길이 없어진다.\n 필터는 접혀도 되지만(풀면 전체가 돌아온다) 이것은 접히면 안 된다.\n -->\n <div class=\"groups\">\n ${(\n [\n ['approval', 'label.group-approval', 'text.group-approval-hint'],\n ['reference', 'label.group-reference', 'text.group-reference-hint']\n ] as const\n ).map(\n ([key, label, hint]) => html`\n <button\n ?data-selected=${this.group === key}\n title=${i18next.t(hint)}\n @click=${() => this.selectGroup(key)}\n >\n ${i18next.t(label)}\n ${this.counts[key] === undefined\n ? ''\n : html`<span class=\"n\">${this.counts[key]!.toLocaleString(i18next.language || undefined)}</span>`}\n </button>\n `\n )}\n </div>\n\n <ox-grist\n .mode=${mode}\n .config=${this.gristConfig}\n .fetchHandler=${this.fetchHandler.bind(this)}\n .personalConfigProvider=${this.getPagePreferenceProvider('ox-grist')!}\n >\n <div slot=\"headroom\" class=\"header\">\n <div class=\"filters\">\n <!-- 좁은 화면에서는 상단 바가 검색을 갖는다(위 context 주석 참조). -->\n <ox-filters-form class=\"filter\" without-search></ox-filters-form>\n <ox-input-select-buttons\n .value=${this.filters}\n .options=${[\n importantChip(),\n dueSoonChip(),\n { display: i18next.t('label.filter-resubmitted'),\n value: 'resubmitted'\n }\n ]}\n @change=${(e: CustomEvent) => { this.filters = (e.currentTarget as any)?.value\n this.grist.fetch()\n }}\n ></ox-input-select-buttons>\n <!-- <ox-filters-form class=\"filter\" autofocus without-search></ox-filters-form> -->\n </div>\n\n <ox-context-page-toolbar class=\"actions\" .context=${this.context}></ox-context-page-toolbar>\n </div>\n\n <ox-grist-personalizer slot=\"setting\"></ox-grist-personalizer>\n </ox-grist>\n `\n }\n\n /** 주소만 바꾼다 — 목록도 설정도 pageUpdated 가 한 벌로 다시 세운다. */\n private selectGroup(group: 'approval' | 'reference') {\n if (this.group === group) {\n return\n }\n\n const page = (this as any).lifecycle?.page\n navigate(group === 'approval' ? `${page}` : `${page}/${group}`)\n }\n\n private async syncGroup(key?: string) {\n const group = key === 'reference' ? 'reference' : 'approval'\n\n if (this.group === group && this.gristConfig) {\n return\n }\n\n this.group = group\n this.applyConfig()\n }\n\n /**\n * 안 보고 있는 묶음의 건수를 따로 센다 — 한 줄만 받아 `total` 을 읽는다.\n *\n * 보고 있는 쪽의 수는 목록 조회가 이미 알려 준다(fetchHandler). 그래서 여기서는 반대쪽만 묻는다.\n */\n private async countOther() {\n const other = this.group === 'approval' ? 'reference' : 'approval'\n const query = other === 'approval' ? 'approvalPendingList' : 'approvalReferenceList'\n\n const response = await client.query({\n query: gql`\n query ($pagination: Pagination) {\n responses: ${query}(pagination: $pagination) {\n total\n }\n }\n `,\n variables: { pagination: { page: 1, limit: 1 } },\n fetchPolicy: 'no-cache'\n })\n\n /*\n * A count we could not fetch is not zero.\n *\n * This read `?? 0`, and the client runs with errorPolicy: 'all' — a failed query comes back as\n * a resolved response carrying `errors`, not a rejection. So any failure drew the other tab as\n * 「0」, which says \"nothing is waiting on you\". The render already draws nothing when the count\n * is undefined, so leaving it unknown is both honest and already handled.\n */\n const total = response.errors?.length ? undefined : response.data?.responses?.total\n\n if (typeof total != 'number') {\n return\n }\n\n this.counts = { ...this.counts, [other]: total }\n }\n\n async pageInitialized(lifecycle) {\n /*\n * 주소가 묶음을 정한다. 주소로 바로 들어온 경우가 여기서 잡힌다 — pageUpdated 가 이 함수보다 먼저\n * 지나가므로 그것만 믿으면 `/reference` 링크가 결재 묶음을 보여준다.\n */\n await this.syncGroup(lifecycle?.resourceId)\n await this.countOther()\n }\n\n private applyConfig() {\n this.gristConfig = { list: { thumbnail: 'thumbnail',\n fields: ['name', 'description'],\n details: ['createdAt', 'due']\n },\n /*\n * 빈 화면이 참조를 가르친다.\n *\n * 참조를 처음 누른 사람은 여기서 그 개념을 만난다. 기본 문장 「해당하는 것이 없습니다」는\n * 참조가 무엇인지 말해 주지 않는다 — 내가 결정해야 하는 것인지, 안 봐도 되는 것인지 모른 채\n * 화면을 닫는다.\n *\n * 그래서 없을 때 그 묶음이 무엇인지 적는다.\n */\n emptyNote:\n this.group === 'reference'\n ? {\n icon: 'visibility',\n title: i18next.t('text.no-reference-title'),\n description: i18next.t('text.no-reference-description')\n }\n : {\n icon: 'task_alt',\n title: i18next.t('text.no-approval-title'),\n description: i18next.t('text.no-approval-description')\n },\n /*\n * ── 승인자가 먼저 묻는 순서대로 둔다 (2026-09-01) ─────────────────────\n *\n * 전에는 앞자리를 「열기」 버튼과 **모든 줄이 같은 값인 상태 칸**이 차지했고, 승인자가 가장 먼저\n * 묻는 「누가 올렸나」는 1200px 밖에 있었다. 실측으로 이름부터 담당까지 폭 합이 1287px 이었고\n * 보이는 폭은 1150px 이었다.\n *\n * 순서를 물음의 순서로 바꾼다 — 무엇을 · 누가 · 언제까지 · 얼마나 급한가.\n *\n * ── 「열기」 버튼을 없앤다 ─────────────────────────────────────────────\n * 줄을 누르면 이미 열린다(아래 rows.handlers.click). 같은 일을 하는 버튼이 줄마다 72px 을\n * 차지하고 있었다.\n *\n * 다만 그 버튼의 아이콘이 신호를 하나 들고 있었다 — `comment` 가 있으면 `label`, 없으면\n * `new_label`. **승인자가 보다가 메모를 남기고 미뤄 둔 것**이라는 뜻이다. 버리지 않고 이름 옆에\n * 말로 적는다. 태그 아이콘 두 개로는 아무도 그 뜻으로 읽지 않는다.\n *\n * 열람 여부는 담는 값이 없다 — `ActivityApproval` 에 `readAt` 이 없어서, 열어만 보고 나가면\n * 흔적이 남지 않는다. 지금 표시하는 것은 「메모를 남겨 뒀나」이지 「열어 봤나」가 아니다.\n */\n columns: [\n { type: 'gutter', gutterName: 'sequence', fixed: true },\n {\n type: 'string',\n name: 'name',\n fixed: true,\n header: i18next.t('field.wl-subject'),\n record: {\n editable: false,\n /*\n * 이름과 설명을 한 칸에 둔다. 둘은 함께 읽는 것인데 275px 짜리 칸으로 갈라 두면 눈이\n * 오가고, 그 사이를 우선순위·차수가 가로막고 있었다.\n */\n renderer: subjectCell(approvalMarks)\n },\n filter: 'search',\n sortable: true,\n width: 320\n },\n {\n /*\n * 설명은 제목 칸 안에서 두 줄로 보인다(activity-cells 의 subjectCell). 그래서 따로 보일 칸이\n * 필요하지 않다.\n *\n * 그런데 **칸을 없애면 설명으로 검색하는 기능이 함께 사라진다.** searchText 는\n * filter: 'search' 를 선언한 컬럼마다 필터를 만들고 hidden 은 보지 않는다\n * (data-grist.ts 의 set searchText). 실측으로 확인했다 — 컬럼을 없앤 뒤 설명에만 있는\n * 낱말로 검색하면 0건이었다.\n *\n * 그래서 감춘 칸으로 남겨 검색만 남긴다.\n */\n type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: { editable: false },\n filter: 'search',\n hidden: true\n },\n {\n type: 'resource-object',\n name: 'creator',\n header: i18next.t('field.wl-drafter'),\n record: { editable: false },\n sortable: true,\n width: 110\n },\n {\n type: 'resource-object',\n name: 'assignee',\n header: i18next.t('field.wl-owner'),\n record: { editable: false },\n width: 110\n },\n {\n /*\n * 기한 한 칸 — 남은 시간이 위, 절대 시각이 아래다.\n *\n * 전에는 「만기 시간」(180px)과 「남은 시간」(180px)이 따로 있었다. 사람이 묻는 것은 「얼마나\n * 남았나」 하나이고, 절대 시각은 그것을 확인할 때만 본다. 두 칸으로 360px 을 쓸 일이 아니다.\n */\n type: 'string',\n name: 'dueAt',\n header: i18next.t('field.wl-due'),\n record: {\n editable: false,\n renderer: dueCell(() => this.active)\n },\n sortable: true,\n width: 170\n },\n {\n type: 'number',\n name: 'priority',\n header: i18next.t('field.wl-priority'),\n record: {\n editable: false,\n align: 'center',\n renderer: priorityCell()\n },\n width: 80\n },\n {\n type: 'select',\n name: 'state',\n header: i18next.t('field.wl-state'),\n record: {\n editable: false,\n options: [\n { display: i18next.t('label.activity-state-submitted'), value: 'submitted' },\n { display: i18next.t('label.activity-state-escalated'), value: 'escalated' }\n ]\n },\n width: 90\n },\n {\n type: 'number',\n name: 'round',\n header: i18next.t('field.wl-round'),\n record: { editable: false, align: 'right' },\n width: 60\n },\n {\n type: 'datetime',\n name: 'createdAt',\n header: i18next.t('field.wl-submitted-at'),\n record: { editable: false },\n sortable: true,\n filter: false,\n width: 160\n },\n {\n type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.wl-changed-at'),\n record: { editable: false },\n sortable: true,\n filter: false,\n width: 160\n },\n {\n type: 'string',\n name: 'viewSource',\n header: i18next.t('field.wl-view-source'),\n record: {\n editable: false,\n renderer: function (value, column, record, rowIndex, field) {\n const { viewType, viewSource } = record.activity || {}\n var type = viewType !== 'board' ? 'string' : 'board'\n return getRenderer(type)(viewSource, column, record, rowIndex, field)\n }\n },\n width: 140,\n hidden: true\n },\n {\n type: 'image',\n name: 'thumbnail',\n header: i18next.t('field.thumbnail'),\n record: { editable: false },\n hidden: true,\n handlers: {\n click: (columns, data, column, record, rowIndex) => {\n this.openActivityApproval(record)\n }\n }\n }\n ],\n rows: { appendable: false,\n editable: false,\n handlers: { click: (columns, data, column, record, rowIndex) => { this.openActivityApproval(record)\n }\n }\n },\n /*\n * 급한 것부터 — 「할 일」 목록과 같은 순서다.\n *\n * 최근 변경 내림차순이었다. 받은 편지함으로는 말이 되지만 이 목록의 물음은 「무엇을 먼저\n * 판단해야 하나」다. 그 정렬에서는 나흘 지난 건이 목록 중간에 묻힌다 — 기안자가 나흘째\n * 기다리는 동안.\n *\n * 두 목록은 같은 성격이다(내가 처리해야 할 것). 순서 기준이 다르면 화면을 옮길 때마다 다른\n * 순서를 본다.\n *\n * 기한이 없는 건은 뒤로 간다 — 서버가 그 자리를 정한다(applyApprovalSortings).\n */\n sorters: [\n { name: 'dueAt',\n desc: false\n }\n ]\n }\n\n if (this.group === 'reference') {\n /*\n * ── 내 참조가 어떤 상태인가 ─────────────────────────────────────────\n * 참조 묶음에는 **끝난 건도 나온다.** 참조는 결재를 막지 않으므로 결재가 끝난 뒤에 의견이 달릴\n * 수 있고, 그래서 목록에서 끝난 것을 걸러내지 않는다. 화면이 그것을 구별해야 한다 — 안 그러면\n * 이미 끝난 건을 열어 의견을 쓰고 그것이 반영된 줄로 안다.\n *\n * **의견 없이 끝난 것을 빈 칸으로 두지 않는다.** 침묵은 동의가 아니다. 품질팀장이 아무 말 안\n * 하고 끝났으면 「반대하지 않았다」가 아니라 「말할 기회에 말하지 않았다」다. 나중에 사고 조사에서\n * 그 둘은 다르다.\n *\n * ── 「결정 후 의견」은 commentedAt 으로 판정한다 ────────────────────────\n * 처음에 `updatedAt > terminatedAt` 으로 추론하려 했다. **그 부등호는 언제나 참이다** —\n * 닫는 코드가 `terminatedAt: new Date()` 를 저장 **전에** 만들고, `updatedAt` 은\n * `@UpdateDateColumn` 이 DB 에 쓰는 순간 찍는다. 두 값이 몇 밀리초 어긋나서, 닫힌 참조가\n * 전부 「결정 후 의견」으로 보였을 것이다.\n *\n * 그래서 사실에 집을 줬다 — `ActivityApproval.commentedAt`(2eaceace25). 의견을 언제 말했나는\n * 파생으로 알 수 없는 값이다. **빈 의견에는 시각을 찍지 않는다**(서버 `stampedComment`), 그래서\n * 시각의 유무가 곧 침묵과 발언의 구별이다.\n */\n this.gristConfig.columns = [\n ...this.gristConfig.columns,\n {\n type: 'string',\n name: 'myReference',\n header: i18next.t('field.my-reference'),\n record: {\n editable: false,\n renderer: (value: any, column: any, record: any) => {\n const closed = record?.judgment === 'closed'\n const comment = (record?.comment || '').trim()\n\n if (!closed) {\n return html`<span class=\"quiet\">${i18next.t('text.reference-open')}</span>`\n }\n\n if (!comment) {\n return html`<span class=\"pill quiet\"\n ><span class=\"dot\"></span>${i18next.t('text.reference-closed-silent')}</span\n >`\n }\n\n /*\n * 의견은 있는데 시각이 없으면 **언제인지 모른다** — commentedAt 이 생기기 전에 적힌\n * 줄이다. 모르는 것을 「결정 전」으로도 「결정 후」로도 적지 않고, 의견만 보인다.\n */\n const after =\n record?.commentedAt &&\n record?.terminatedAt &&\n new Date(record.commentedAt).getTime() > new Date(record.terminatedAt).getTime()\n\n return html`\n <span class=\"line\">\n <span>${comment}</span>\n ${after ? html`<span class=\"pill warn\">${i18next.t('text.reference-after-decision')}</span>` : ''}\n </span>\n `\n }\n },\n width: 260\n }\n ]\n }\n }\n\n async pageUpdated(changes, lifecycle, changedBefore) {\n if (lifecycle?.resourceId !== changedBefore?.resourceId) {\n await this.syncGroup(lifecycle?.resourceId)\n await this.countOther()\n }\n\n if (this.active) {\n this.grist?.fetch()\n }\n }\n\n async fetchHandler({ page, limit, sortings = [], filters = [] }: FetchOption) { if (this.filters?.includes('important')) { filters = adjustFilters(filters, importantFilters())\n }\n\n if (this.filters?.includes('due')) { filters = adjustFilters(filters, dueSoonFilters())\n }\n\n if (this.filters?.includes('resubmitted')) { filters = adjustFilters(filters, [{ name: 'round', operator: 'gte', value: 2 }])\n }\n\n const response = await client.query({ query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) { responses: ${this.group === 'reference' ? 'approvalReferenceList' : 'approvalPendingList'}(filters: $filters, pagination: $pagination, sortings: $sortings) { items { id\n round\n comment\n commentedAt\n judgment\n terminatedAt\n activityThread { activityInstance { activityId: id\n name\n description\n priority\n input\n refBy\n activityType\n viewType\n viewSource\n thumbnail\n updatedAt\n createdAt\n creator { id\n name\n }\n }\n state\n output\n dueAt\n assignee { id\n name\n }\n assignedAt\n }\n updatedAt\n }\n total\n }\n }\n `,\n variables: { filters,\n pagination: { page, limit },\n sortings\n }\n })\n\n const total = response.data.responses.total || 0\n /* 보고 있는 묶음의 수는 이 조회가 알려 준다. 반대쪽만 따로 센다(countOther). */\n this.counts = { ...this.counts, [this.group]: total }\n\n return { total,\n records: (response.data.responses.items || []).map(item => { let thread = item.activityThread\n return { id: item.id,\n state: thread.state,\n ...thread.activityInstance,\n dueAt: thread.dueAt,\n assignee: thread.assignee,\n assignedAt: thread.assignedAt,\n output: thread.output,\n round: item.round,\n comment: item.comment,\n judgment: item.judgment,\n commentedAt: item.commentedAt,\n terminatedAt: item.terminatedAt,\n updatedAt: item.updatedAt\n }\n })\n }\n }\n\n openActivityApproval(activityApproval) { navigate(`activity-approval/${activityApproval.id}?title=${activityApproval.name}`)\n }\n}\n"]}
|
|
@@ -7,6 +7,8 @@ declare const DoneListCalendarPage_base: (new (...args: any[]) => import("lit").
|
|
|
7
7
|
export declare class DoneListCalendarPage extends DoneListCalendarPage_base {
|
|
8
8
|
static styles: import("lit").CSSResult[];
|
|
9
9
|
eventView: OxEventView;
|
|
10
|
+
/** 못 불러왔다 — 「없다」와 절대 섞지 않는다. 이 값이 서면 화면이 그렇게 말한다. */
|
|
11
|
+
failed: boolean;
|
|
10
12
|
get context(): {
|
|
11
13
|
title: string;
|
|
12
14
|
help: string;
|
|
@@ -3,22 +3,143 @@ import '@material/web/icon/icon.js';
|
|
|
3
3
|
import '@operato/event-view/ox-event-view.js';
|
|
4
4
|
import { html, css } from 'lit';
|
|
5
5
|
import gql from 'graphql-tag';
|
|
6
|
-
import { customElement, query } from 'lit/decorators.js';
|
|
6
|
+
import { customElement, query, state } from 'lit/decorators.js';
|
|
7
7
|
import { PageView } from '@operato/shell';
|
|
8
8
|
import { client } from '@operato/graphql';
|
|
9
9
|
import { i18next, localize } from '@operato/i18n';
|
|
10
10
|
import { OxEventView } from '@operato/event-view';
|
|
11
11
|
import { ScrollbarStyles } from '@operato/styles';
|
|
12
|
+
/** Priority 0..3. Anything outside the range clamps to the most urgent colour. */
|
|
13
|
+
const PRIORITY_COLORS = ['black', 'darkgray', 'orange', 'red'];
|
|
14
|
+
/**
|
|
15
|
+
* Which mark a finished item wears.
|
|
16
|
+
*
|
|
17
|
+
* Pending is the one that is not finished, and it reads as an empty circle: every filled mark on
|
|
18
|
+
* this calendar means "over", so a pending item must not borrow one.
|
|
19
|
+
*
|
|
20
|
+
* A state this function does not know draws nothing. The old expression ended in
|
|
21
|
+
* `: 'assignment_return'`, so anything unrecognised became sent-back — and Aborted, added to
|
|
22
|
+
* ActivityEventStatus alongside this change, would have landed there. An icon the screen cannot
|
|
23
|
+
* vouch for is worse than a blank, because the reader cannot tell an invented mark from a reported
|
|
24
|
+
* one.
|
|
25
|
+
*
|
|
26
|
+
* The case fold is a guard, not a fix for anything observed here. ActivityEvent.state is declared
|
|
27
|
+
* `@Field({ nullable: true })` with no explicit type, so type-graphql reflects it as String and the
|
|
28
|
+
* wire carries the enum's value — lowercase, as this function reads it. Declaring it
|
|
29
|
+
* `@Field(type => ActivityEventStatus)` instead is a one-word edit that would silently switch the
|
|
30
|
+
* wire to the enum's **keys**: registerEnumType publishes by key. That switch is not hypothetical.
|
|
31
|
+
* It is what organization/client/types/approval-line.ts hit, where `participation` is declared as
|
|
32
|
+
* the enum, arrives as `Reference`, and was compared against `reference` — false every time, for
|
|
33
|
+
* as long as the check had existed.
|
|
34
|
+
*/
|
|
35
|
+
function eventIcon(state, basis) {
|
|
36
|
+
switch (String(state || '').toLowerCase()) {
|
|
37
|
+
/*
|
|
38
|
+
* 안 끝난 것은 **좌표가 표를 정한다.**
|
|
39
|
+
*
|
|
40
|
+
* 기한으로 놓인 것은 시계다 — 「이 날까지」. 기한이 없어 받은 날에 놓인 것은 받은 함이다 —
|
|
41
|
+
* 「이 날 왔다」. 둘을 같은 표로 그리면 한 칸 안에서 구별이 안 되고, 결재자가 기한을 도착으로
|
|
42
|
+
* 읽고 지나치거나 도착을 기한으로 읽고 한 주를 헛되이 다시 짠다.
|
|
43
|
+
*
|
|
44
|
+
* 손댈 곳이 화면뿐이라 화면이 갈라야 한다 — 여기 오면 둘 다 그냥 date 다.
|
|
45
|
+
*/
|
|
46
|
+
case 'pending':
|
|
47
|
+
return String(basis || '').toLowerCase() == 'handed-over' ? 'move_to_inbox' : 'schedule';
|
|
48
|
+
case 'done':
|
|
49
|
+
return 'done';
|
|
50
|
+
/* Given up on, not finished. A different mark, not a missing one. */
|
|
51
|
+
case 'aborted':
|
|
52
|
+
return 'block';
|
|
53
|
+
case 'approved':
|
|
54
|
+
return 'done_all';
|
|
55
|
+
case 'rejected':
|
|
56
|
+
return 'assignment_return';
|
|
57
|
+
default:
|
|
58
|
+
return '';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 한 칸에 몇 줄까지.
|
|
63
|
+
*
|
|
64
|
+
* 이 화면은 monthly 만 쓴다. 넘치는 것을 줄로 늘리면 칸이 커지고 뒷주가 화면 밖으로 밀린다 —
|
|
65
|
+
* plant 달력이 하루 스물다섯 건에서 실제로 그렇게 됐다. 넘치면 수로 말한다.
|
|
66
|
+
*/
|
|
67
|
+
const MOST_PER_DAY = 4;
|
|
68
|
+
/** 급한 것이 앞이다 — 기한 걸린 것 · 받아 둔 것 · 끝난 것. */
|
|
69
|
+
function rank(event) {
|
|
70
|
+
if (String(event.state || '').toLowerCase() != 'pending') {
|
|
71
|
+
return 2;
|
|
72
|
+
}
|
|
73
|
+
return String(event.basis || '').toLowerCase() == 'handed-over' ? 1 : 0;
|
|
74
|
+
}
|
|
75
|
+
/** 이 날짜가 무슨 뜻인지 — 표만으로 못 읽는 사람을 위해 한 줄로. */
|
|
76
|
+
function basisText(state, basis) {
|
|
77
|
+
if (String(state || '').toLowerCase() != 'pending') {
|
|
78
|
+
return i18next.t('text.finished-on-this-day');
|
|
79
|
+
}
|
|
80
|
+
return String(basis || '').toLowerCase() == 'handed-over'
|
|
81
|
+
? i18next.t('text.handed-over-on-this-day')
|
|
82
|
+
: i18next.t('text.due-on-this-day');
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 물은 것을 실제로 받았나 — **아니면 던진다.**
|
|
86
|
+
*
|
|
87
|
+
* 이 앱의 Apollo client 는 `errorPolicy: 'all'` 로 서 있다
|
|
88
|
+
* ([읽었음] operato/webcomponents/graphql/src/graphql-client.ts:15). 질의가 실패해도 **거절되지
|
|
89
|
+
* 않는다.** `errors` 를 실은 응답이 오고 `data` 는 비거나 반만 찬다.
|
|
90
|
+
*
|
|
91
|
+
* 그래서 `if (response.data)` 로 읽으면 실패가 **빈 목록과 구별되지 않는다.** 달력에서 그것은
|
|
92
|
+
* 「이번 달에 아무것도 없다」로 그려진다 — 결재자에게 할 일이 없다고 말하는 것이라 값이 비싸다.
|
|
93
|
+
* 못 불러온 것과 없는 것은 다른 사실이고, 화면은 그 둘을 절대 섞으면 안 된다.
|
|
94
|
+
*
|
|
95
|
+
* plant 레인이 자기 달력에서 같은 구멍을 재서 알려 줬다 — 요청만 실패시키고 화면을 보니 칩은
|
|
96
|
+
* 그대로인 채 그 층만 빈 채로 그려졌다.
|
|
97
|
+
*/
|
|
98
|
+
function askedFor(response, field) {
|
|
99
|
+
if (response.errors?.length) {
|
|
100
|
+
throw new Error(`[activityEvents] ${JSON.stringify(response.errors)}`);
|
|
101
|
+
}
|
|
102
|
+
const value = response.data?.[field];
|
|
103
|
+
if (!Array.isArray(value)) {
|
|
104
|
+
throw new Error(`[activityEvents] "${field}" is missing from the response`);
|
|
105
|
+
}
|
|
106
|
+
return value;
|
|
107
|
+
}
|
|
12
108
|
let DoneListCalendarPage = class DoneListCalendarPage extends localize(i18next)(PageView) {
|
|
109
|
+
constructor() {
|
|
110
|
+
super(...arguments);
|
|
111
|
+
/** 못 불러왔다 — 「없다」와 절대 섞지 않는다. 이 값이 서면 화면이 그렇게 말한다. */
|
|
112
|
+
this.failed = false;
|
|
113
|
+
}
|
|
13
114
|
static { this.styles = [
|
|
14
115
|
ScrollbarStyles,
|
|
15
116
|
css `
|
|
16
117
|
:host {
|
|
17
118
|
display: flex;
|
|
119
|
+
flex-direction: column;
|
|
18
120
|
background-color: var(--md-sys-color-background);
|
|
19
121
|
color: var(--md-sys-color-on-background);
|
|
20
122
|
}
|
|
21
123
|
|
|
124
|
+
/* 못 불러왔다는 말은 달력 위에 선다 — 빈 달력만 보고 「없구나」 하고 닫지 않도록. */
|
|
125
|
+
.failed {
|
|
126
|
+
display: flex;
|
|
127
|
+
align-items: center;
|
|
128
|
+
gap: 6px;
|
|
129
|
+
|
|
130
|
+
margin: 10px 10px 0 10px;
|
|
131
|
+
padding: 8px 10px;
|
|
132
|
+
border-radius: 6px;
|
|
133
|
+
|
|
134
|
+
background-color: var(--md-sys-color-error-container, #ffdad6);
|
|
135
|
+
color: var(--md-sys-color-on-error-container, #410002);
|
|
136
|
+
font-size: var(--ui-t-body, 13px);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.failed md-icon {
|
|
140
|
+
font-size: 1.2em;
|
|
141
|
+
}
|
|
142
|
+
|
|
22
143
|
ox-event-view {
|
|
23
144
|
flex: 1;
|
|
24
145
|
padding: 10px;
|
|
@@ -28,12 +149,20 @@ let DoneListCalendarPage = class DoneListCalendarPage extends localize(i18next)(
|
|
|
28
149
|
]; }
|
|
29
150
|
get context() {
|
|
30
151
|
return {
|
|
31
|
-
title: i18next.t('title.
|
|
152
|
+
title: i18next.t('title.my work calendar'),
|
|
32
153
|
help: 'worklist/done-list-calendar-page'
|
|
33
154
|
};
|
|
34
155
|
}
|
|
35
156
|
render() {
|
|
36
|
-
return html `
|
|
157
|
+
return html `
|
|
158
|
+
${this.failed
|
|
159
|
+
? html `<div class="failed" role="alert">
|
|
160
|
+
<md-icon>cloud_off</md-icon>
|
|
161
|
+
<span>${i18next.t('text.calendar-not-loaded')}</span>
|
|
162
|
+
</div>`
|
|
163
|
+
: ''}
|
|
164
|
+
<ox-event-view mode="monthly" .eventProvider=${this}></ox-event-view>
|
|
165
|
+
`;
|
|
37
166
|
}
|
|
38
167
|
async fetchEventsForCalendar(calendar) {
|
|
39
168
|
const from = calendar[0].date.toISOString();
|
|
@@ -46,6 +175,7 @@ let DoneListCalendarPage = class DoneListCalendarPage extends localize(i18next)(
|
|
|
46
175
|
name
|
|
47
176
|
type
|
|
48
177
|
state
|
|
178
|
+
basis
|
|
49
179
|
priority
|
|
50
180
|
date
|
|
51
181
|
}
|
|
@@ -57,33 +187,81 @@ let DoneListCalendarPage = class DoneListCalendarPage extends localize(i18next)(
|
|
|
57
187
|
}
|
|
58
188
|
});
|
|
59
189
|
const eventMap = new Map();
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
190
|
+
let activityEvents;
|
|
191
|
+
try {
|
|
192
|
+
activityEvents = askedFor(response, 'responses');
|
|
193
|
+
this.failed = false;
|
|
194
|
+
}
|
|
195
|
+
catch (e) {
|
|
196
|
+
/*
|
|
197
|
+
* 빈 달력을 돌려주되 **빈 달력이라고 말하지는 않는다.** 위의 띠가 못 불러왔다고 적는다.
|
|
198
|
+
*/
|
|
199
|
+
this.failed = true;
|
|
200
|
+
console.error(e);
|
|
201
|
+
return eventMap;
|
|
202
|
+
}
|
|
203
|
+
calendar.forEach(({ date }) => {
|
|
204
|
+
const localDateString = date.toLocaleDateString();
|
|
205
|
+
const ofTheDay = activityEvents
|
|
206
|
+
.filter(({ date: activityDate }) => new Date(activityDate).toLocaleDateString() == localDateString)
|
|
207
|
+
/*
|
|
208
|
+
* **자르기 전에 차례를 세운다.** 상한만 두고 자르면 먼저 온 순서로 잘린다 — 기한이 걸린
|
|
209
|
+
* 결재 한 건이 끝난 스무 건 뒤에 묻히면 「+20건 더」만 보이고, 그 날 할 일이 있다는 것을
|
|
210
|
+
* 아무도 못 본다.
|
|
211
|
+
*
|
|
212
|
+
* 급한 것이 앞이다: 기한으로 놓인 안 끝난 것 → 받은 날에 놓인 안 끝난 것 → 끝난 것.
|
|
213
|
+
* 같은 자리 안에서는 우선순위가 높은 것, 그 다음 이른 시각.
|
|
214
|
+
*/
|
|
215
|
+
.sort((a, b) => rank(a) - rank(b) || (b.priority || 0) - (a.priority || 0) || (a.date > b.date ? 1 : -1));
|
|
216
|
+
const shown = ofTheDay.slice(0, MOST_PER_DAY);
|
|
217
|
+
const hidden = ofTheDay.length - shown.length;
|
|
218
|
+
const events = shown.map(({ id, name, priority, date, type, state, basis }) => {
|
|
219
|
+
const color = PRIORITY_COLORS[Math.min(Math.max(priority || 0, 0), PRIORITY_COLORS.length - 1)];
|
|
220
|
+
/*
|
|
221
|
+
* 안 끝난 것은 **하는 화면**으로 간다.
|
|
222
|
+
*
|
|
223
|
+
* activity-thread-view 는 끝난 업무를 읽는 화면이다. 아직 할 일을 거기로 보내면 손댈
|
|
224
|
+
* 데가 없는 화면에 도착한다 — 달력에서 눌렀는데 아무것도 못 한다.
|
|
225
|
+
*/
|
|
226
|
+
const pending = String(state || '').toLowerCase() == 'pending';
|
|
227
|
+
const path = type == 'activity-thread' ? (pending ? 'activity-thread' : 'activity-thread-view') : 'activity-approval';
|
|
228
|
+
const href = `${path}/${id}?title=${encodeURIComponent(name)}`;
|
|
229
|
+
const at = new Date(date).toLocaleTimeString([], {
|
|
230
|
+
hourCycle: 'h23',
|
|
231
|
+
hour: '2-digit',
|
|
232
|
+
minute: '2-digit'
|
|
83
233
|
});
|
|
84
|
-
|
|
234
|
+
const icon = eventIcon(state, basis);
|
|
235
|
+
return {
|
|
236
|
+
/*
|
|
237
|
+
* BizEvent 는 title · color 를 요구한다. 그리는 것은 template 이지만, 부품이 template
|
|
238
|
+
* 없이 그리는 길로 갈 때 쓰는 값이라 비워 두지 않는다 — 그때 이름 없는 칸이 뜬다.
|
|
239
|
+
*/
|
|
240
|
+
title: name,
|
|
241
|
+
color,
|
|
242
|
+
template: html `<a
|
|
243
|
+
href=${href}
|
|
244
|
+
title=${basisText(state, basis)}
|
|
245
|
+
style="color:${color};display:block;text-decoration:none;"
|
|
246
|
+
>${icon ? html `<md-icon style="font-size:1em;">${icon}</md-icon> ` : ''}${at} ${name}</a
|
|
247
|
+
>`
|
|
248
|
+
};
|
|
85
249
|
});
|
|
86
|
-
|
|
250
|
+
if (hidden > 0) {
|
|
251
|
+
/* 넘치면 **수로 말한다** — 줄을 늘리면 뒷주가 화면 밖으로 밀린다. */
|
|
252
|
+
const more = i18next.t('text.and-n-more', { n: hidden });
|
|
253
|
+
events.push({
|
|
254
|
+
title: more,
|
|
255
|
+
color: 'inherit',
|
|
256
|
+
template: html `<span style="opacity:0.7">${more}</span>`
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
/*
|
|
260
|
+
* **키는 받은 그 Date 객체 그대로다.** 같은 날을 새로 만들어 넣으면 조회가 빗나가고 그 칸이
|
|
261
|
+
* 빈 채로 그려진다 — 오류는 안 난다.
|
|
262
|
+
*/
|
|
263
|
+
eventMap.set(date, events);
|
|
264
|
+
});
|
|
87
265
|
return eventMap;
|
|
88
266
|
}
|
|
89
267
|
pageUpdated(changes, lifecycle, before) {
|
|
@@ -99,8 +277,14 @@ let DoneListCalendarPage = class DoneListCalendarPage extends localize(i18next)(
|
|
|
99
277
|
};
|
|
100
278
|
__decorate([
|
|
101
279
|
query('ox-event-view'),
|
|
102
|
-
__metadata("design:type", OxEventView
|
|
280
|
+
__metadata("design:type", OxEventView
|
|
281
|
+
/** 못 불러왔다 — 「없다」와 절대 섞지 않는다. 이 값이 서면 화면이 그렇게 말한다. */
|
|
282
|
+
)
|
|
103
283
|
], DoneListCalendarPage.prototype, "eventView", void 0);
|
|
284
|
+
__decorate([
|
|
285
|
+
state(),
|
|
286
|
+
__metadata("design:type", Object)
|
|
287
|
+
], DoneListCalendarPage.prototype, "failed", void 0);
|
|
104
288
|
DoneListCalendarPage = __decorate([
|
|
105
289
|
customElement('done-list-calendar-page')
|
|
106
290
|
], DoneListCalendarPage);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"done-list-calendar-page.js","sourceRoot":"","sources":["../../../client/pages/todo/done-list-calendar-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@operato/event-view/ox-event-view.js'\n\nimport { PropertyValues, html, css } from 'lit'\nimport gql from 'graphql-tag'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { PageView } from '@operato/shell'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { OxEventView } from '@operato/event-view'\nimport { ScrollbarStyles } from '@operato/styles'\nimport { BizEvent, CALENDAR } from '@operato/event-view/types.js'\n\n@customElement('done-list-calendar-page')\nexport class DoneListCalendarPage extends localize(i18next)(PageView) {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n background-color: var(--md-sys-color-background);\n color: var(--md-sys-color-on-background);\n }\n\n ox-event-view {\n flex: 1;\n padding: 10px;\n overflow: auto;\n }\n `\n ]\n\n @query('ox-event-view') eventView!: OxEventView\n\n get context() {\n return {\n title: i18next.t('title.done list calendar'),\n help: 'worklist/done-list-calendar-page'\n }\n }\n\n render() {\n return html` <ox-event-view mode=\"monthly\" .eventProvider=${this}></ox-event-view> `\n }\n\n async fetchEventsForCalendar(calendar: CALENDAR): Promise<Map<Date, BizEvent[]>> {\n const from = calendar[0].date.toISOString()\n const to = new Date(calendar[calendar.length - 1].date.getTime() + 24 * 60 * 60 * 1000).toISOString()\n\n const response = await client.query({\n query: gql`\n query ($from: String!, $to: String!) {\n responses: activityEvents(from: $from, to: $to) {\n id\n name\n type\n state\n priority\n date\n }\n }\n `,\n variables: {\n from,\n to\n }\n })\n\n const eventMap = new Map<Date, BizEvent[]>()\n\n if (response.data) {\n const activityEvents = response.data.responses\n\n calendar.forEach(({ date }) => {\n const localDateString = date.toLocaleDateString()\n\n var events = activityEvents\n .filter(({ date: activityDate }) => new Date(activityDate).toLocaleDateString() == localDateString)\n .sort((a, b) => (a.date > b.date ? 1 : -1))\n .map(({ id, name, priority, date, type, state }) => {\n const color = ['black', 'darkgray', 'orange', 'red'][priority || 0]\n const href =\n type == 'activity-thread'\n ? `activity-thread-view/${id}?title=${name}`\n : `activity-approval/${id}?title=${name}`\n const at = new Date(date).toLocaleTimeString([], {\n hourCycle: 'h23',\n hour: '2-digit',\n minute: '2-digit'\n })\n const icon = type == 'activity-thread' ? 'done' : state == 'approved' ? 'done_all' : 'assignment_return'\n\n return {\n template: html`<a href=${href} style=\"color:${color};display:block;text-decoration:none;\"\n ><md-icon style=\"font-size:1em;\">${icon}</md-icon> ${at} ${name}</a\n >`\n }\n })\n\n eventMap.set(date, events)\n })\n }\n\n return eventMap\n }\n\n pageUpdated(changes: any, lifecycle: any, before: any) {\n if (this.active) {\n /*\n * this page is activated\n */\n } else {\n /* this page is deactivated */\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"done-list-calendar-page.js","sourceRoot":"","sources":["../../../client/pages/todo/done-list-calendar-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@operato/event-view/ox-event-view.js'\n\nimport { PropertyValues, html, css } from 'lit'\nimport gql from 'graphql-tag'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { PageView } from '@operato/shell'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { OxEventView } from '@operato/event-view'\nimport { ScrollbarStyles } from '@operato/styles'\nimport { BizEvent, CALENDAR } from '@operato/event-view/types.js'\n\n/** Priority 0..3. Anything outside the range clamps to the most urgent colour. */\nconst PRIORITY_COLORS = ['black', 'darkgray', 'orange', 'red']\n\n/**\n * Which mark a finished item wears.\n *\n * Pending is the one that is not finished, and it reads as an empty circle: every filled mark on\n * this calendar means \"over\", so a pending item must not borrow one.\n *\n * A state this function does not know draws nothing. The old expression ended in\n * `: 'assignment_return'`, so anything unrecognised became sent-back — and Aborted, added to\n * ActivityEventStatus alongside this change, would have landed there. An icon the screen cannot\n * vouch for is worse than a blank, because the reader cannot tell an invented mark from a reported\n * one.\n *\n * The case fold is a guard, not a fix for anything observed here. ActivityEvent.state is declared\n * `@Field({ nullable: true })` with no explicit type, so type-graphql reflects it as String and the\n * wire carries the enum's value — lowercase, as this function reads it. Declaring it\n * `@Field(type => ActivityEventStatus)` instead is a one-word edit that would silently switch the\n * wire to the enum's **keys**: registerEnumType publishes by key. That switch is not hypothetical.\n * It is what organization/client/types/approval-line.ts hit, where `participation` is declared as\n * the enum, arrives as `Reference`, and was compared against `reference` — false every time, for\n * as long as the check had existed.\n */\nfunction eventIcon(state?: string, basis?: string): string {\n switch (String(state || '').toLowerCase()) {\n /*\n * 안 끝난 것은 **좌표가 표를 정한다.**\n *\n * 기한으로 놓인 것은 시계다 — 「이 날까지」. 기한이 없어 받은 날에 놓인 것은 받은 함이다 —\n * 「이 날 왔다」. 둘을 같은 표로 그리면 한 칸 안에서 구별이 안 되고, 결재자가 기한을 도착으로\n * 읽고 지나치거나 도착을 기한으로 읽고 한 주를 헛되이 다시 짠다.\n *\n * 손댈 곳이 화면뿐이라 화면이 갈라야 한다 — 여기 오면 둘 다 그냥 date 다.\n */\n case 'pending':\n return String(basis || '').toLowerCase() == 'handed-over' ? 'move_to_inbox' : 'schedule'\n case 'done':\n return 'done'\n /* Given up on, not finished. A different mark, not a missing one. */\n case 'aborted':\n return 'block'\n case 'approved':\n return 'done_all'\n case 'rejected':\n return 'assignment_return'\n default:\n return ''\n }\n}\n\n/**\n * 한 칸에 몇 줄까지.\n *\n * 이 화면은 monthly 만 쓴다. 넘치는 것을 줄로 늘리면 칸이 커지고 뒷주가 화면 밖으로 밀린다 —\n * plant 달력이 하루 스물다섯 건에서 실제로 그렇게 됐다. 넘치면 수로 말한다.\n */\nconst MOST_PER_DAY = 4\n\n/** 급한 것이 앞이다 — 기한 걸린 것 · 받아 둔 것 · 끝난 것. */\nfunction rank(event: { state?: string; basis?: string }): number {\n if (String(event.state || '').toLowerCase() != 'pending') {\n return 2\n }\n\n return String(event.basis || '').toLowerCase() == 'handed-over' ? 1 : 0\n}\n\n/** 이 날짜가 무슨 뜻인지 — 표만으로 못 읽는 사람을 위해 한 줄로. */\nfunction basisText(state?: string, basis?: string): string {\n if (String(state || '').toLowerCase() != 'pending') {\n return i18next.t('text.finished-on-this-day')\n }\n\n return String(basis || '').toLowerCase() == 'handed-over'\n ? i18next.t('text.handed-over-on-this-day')\n : i18next.t('text.due-on-this-day')\n}\n\n/**\n * 물은 것을 실제로 받았나 — **아니면 던진다.**\n *\n * 이 앱의 Apollo client 는 `errorPolicy: 'all'` 로 서 있다\n * ([읽었음] operato/webcomponents/graphql/src/graphql-client.ts:15). 질의가 실패해도 **거절되지\n * 않는다.** `errors` 를 실은 응답이 오고 `data` 는 비거나 반만 찬다.\n *\n * 그래서 `if (response.data)` 로 읽으면 실패가 **빈 목록과 구별되지 않는다.** 달력에서 그것은\n * 「이번 달에 아무것도 없다」로 그려진다 — 결재자에게 할 일이 없다고 말하는 것이라 값이 비싸다.\n * 못 불러온 것과 없는 것은 다른 사실이고, 화면은 그 둘을 절대 섞으면 안 된다.\n *\n * plant 레인이 자기 달력에서 같은 구멍을 재서 알려 줬다 — 요청만 실패시키고 화면을 보니 칩은\n * 그대로인 채 그 층만 빈 채로 그려졌다.\n */\nfunction askedFor<T>(response: { data?: any; errors?: readonly unknown[] }, field: string): T[] {\n if (response.errors?.length) {\n throw new Error(`[activityEvents] ${JSON.stringify(response.errors)}`)\n }\n\n const value = response.data?.[field]\n\n if (!Array.isArray(value)) {\n throw new Error(`[activityEvents] \"${field}\" is missing from the response`)\n }\n\n return value as T[]\n}\n\n@customElement('done-list-calendar-page')\nexport class DoneListCalendarPage extends localize(i18next)(PageView) {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n background-color: var(--md-sys-color-background);\n color: var(--md-sys-color-on-background);\n }\n\n /* 못 불러왔다는 말은 달력 위에 선다 — 빈 달력만 보고 「없구나」 하고 닫지 않도록. */\n .failed {\n display: flex;\n align-items: center;\n gap: 6px;\n\n margin: 10px 10px 0 10px;\n padding: 8px 10px;\n border-radius: 6px;\n\n background-color: var(--md-sys-color-error-container, #ffdad6);\n color: var(--md-sys-color-on-error-container, #410002);\n font-size: var(--ui-t-body, 13px);\n }\n\n .failed md-icon {\n font-size: 1.2em;\n }\n\n ox-event-view {\n flex: 1;\n padding: 10px;\n overflow: auto;\n }\n `\n ]\n\n @query('ox-event-view') eventView!: OxEventView\n\n /** 못 불러왔다 — 「없다」와 절대 섞지 않는다. 이 값이 서면 화면이 그렇게 말한다. */\n @state() failed = false\n\n get context() {\n return {\n title: i18next.t('title.my work calendar'),\n help: 'worklist/done-list-calendar-page'\n }\n }\n\n render() {\n return html`\n ${\n this.failed\n ? html`<div class=\"failed\" role=\"alert\">\n <md-icon>cloud_off</md-icon>\n <span>${i18next.t('text.calendar-not-loaded')}</span>\n </div>`\n : ''\n }\n <ox-event-view mode=\"monthly\" .eventProvider=${this}></ox-event-view>\n `\n }\n\n async fetchEventsForCalendar(calendar: CALENDAR): Promise<Map<Date, BizEvent[]>> {\n const from = calendar[0].date.toISOString()\n const to = new Date(calendar[calendar.length - 1].date.getTime() + 24 * 60 * 60 * 1000).toISOString()\n\n const response = await client.query({\n query: gql`\n query ($from: String!, $to: String!) {\n responses: activityEvents(from: $from, to: $to) {\n id\n name\n type\n state\n basis\n priority\n date\n }\n }\n `,\n variables: {\n from,\n to\n }\n })\n\n const eventMap = new Map<Date, BizEvent[]>()\n\n let activityEvents: any[]\n\n try {\n activityEvents = askedFor(response, 'responses')\n this.failed = false\n } catch (e) {\n /*\n * 빈 달력을 돌려주되 **빈 달력이라고 말하지는 않는다.** 위의 띠가 못 불러왔다고 적는다.\n */\n this.failed = true\n console.error(e)\n return eventMap\n }\n\n calendar.forEach(({ date }) => {\n const localDateString = date.toLocaleDateString()\n\n const ofTheDay = activityEvents\n .filter(({ date: activityDate }) => new Date(activityDate).toLocaleDateString() == localDateString)\n /*\n * **자르기 전에 차례를 세운다.** 상한만 두고 자르면 먼저 온 순서로 잘린다 — 기한이 걸린\n * 결재 한 건이 끝난 스무 건 뒤에 묻히면 「+20건 더」만 보이고, 그 날 할 일이 있다는 것을\n * 아무도 못 본다.\n *\n * 급한 것이 앞이다: 기한으로 놓인 안 끝난 것 → 받은 날에 놓인 안 끝난 것 → 끝난 것.\n * 같은 자리 안에서는 우선순위가 높은 것, 그 다음 이른 시각.\n */\n .sort((a, b) => rank(a) - rank(b) || (b.priority || 0) - (a.priority || 0) || (a.date > b.date ? 1 : -1))\n\n const shown = ofTheDay.slice(0, MOST_PER_DAY)\n const hidden = ofTheDay.length - shown.length\n\n const events: BizEvent[] = shown.map(({ id, name, priority, date, type, state, basis }) => {\n const color = PRIORITY_COLORS[Math.min(Math.max(priority || 0, 0), PRIORITY_COLORS.length - 1)]\n /*\n * 안 끝난 것은 **하는 화면**으로 간다.\n *\n * activity-thread-view 는 끝난 업무를 읽는 화면이다. 아직 할 일을 거기로 보내면 손댈\n * 데가 없는 화면에 도착한다 — 달력에서 눌렀는데 아무것도 못 한다.\n */\n const pending = String(state || '').toLowerCase() == 'pending'\n const path =\n type == 'activity-thread' ? (pending ? 'activity-thread' : 'activity-thread-view') : 'activity-approval'\n const href = `${path}/${id}?title=${encodeURIComponent(name)}`\n const at = new Date(date).toLocaleTimeString([], {\n hourCycle: 'h23',\n hour: '2-digit',\n minute: '2-digit'\n })\n const icon = eventIcon(state, basis)\n\n return {\n /*\n * BizEvent 는 title · color 를 요구한다. 그리는 것은 template 이지만, 부품이 template\n * 없이 그리는 길로 갈 때 쓰는 값이라 비워 두지 않는다 — 그때 이름 없는 칸이 뜬다.\n */\n title: name,\n color,\n template: html`<a\n href=${href}\n title=${basisText(state, basis)}\n style=\"color:${color};display:block;text-decoration:none;\"\n >${icon ? html`<md-icon style=\"font-size:1em;\">${icon}</md-icon> ` : ''}${at} ${name}</a\n >`\n }\n })\n\n if (hidden > 0) {\n /* 넘치면 **수로 말한다** — 줄을 늘리면 뒷주가 화면 밖으로 밀린다. */\n const more = i18next.t('text.and-n-more', { n: hidden })\n events.push({\n title: more,\n color: 'inherit',\n template: html`<span style=\"opacity:0.7\">${more}</span>`\n })\n }\n\n /*\n * **키는 받은 그 Date 객체 그대로다.** 같은 날을 새로 만들어 넣으면 조회가 빗나가고 그 칸이\n * 빈 채로 그려진다 — 오류는 안 난다.\n */\n eventMap.set(date, events)\n })\n\n return eventMap\n }\n\n pageUpdated(changes: any, lifecycle: any, before: any) {\n if (this.active) {\n /*\n * this page is activated\n */\n } else {\n /* this page is deactivated */\n }\n }\n}\n"]}
|