@things-factory/organization 10.1.27 → 10.1.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist-client/component/approval-line-items-editor-popup.js +3 -3
  2. package/dist-client/component/approval-line-items-editor-popup.js.map +1 -1
  3. package/dist-client/component/approval-line-items-editor.js +3 -3
  4. package/dist-client/component/approval-line-items-editor.js.map +1 -1
  5. package/dist-client/component/approval-line-selector.js +2 -2
  6. package/dist-client/component/approval-line-selector.js.map +1 -1
  7. package/dist-client/component/approval-line-templates-manager.js +3 -5
  8. package/dist-client/component/approval-line-templates-manager.js.map +1 -1
  9. package/dist-client/component/assignees-editor-popup.js +2 -2
  10. package/dist-client/component/assignees-editor-popup.js.map +1 -1
  11. package/dist-client/component/assignees-editor.js +3 -3
  12. package/dist-client/component/assignees-editor.js.map +1 -1
  13. package/dist-client/component/department-selector.js +2 -2
  14. package/dist-client/component/department-selector.js.map +1 -1
  15. package/dist-client/component/recipients-editor-popup.js +2 -2
  16. package/dist-client/component/recipients-editor-popup.js.map +1 -1
  17. package/dist-client/component/recipients-editor.js +3 -3
  18. package/dist-client/component/recipients-editor.js.map +1 -1
  19. package/dist-client/filters-form/ox-filter-department-object.js +1 -1
  20. package/dist-client/filters-form/ox-filter-department-object.js.map +1 -1
  21. package/dist-client/grist-editor/grist-editor-department-object.js +1 -1
  22. package/dist-client/grist-editor/grist-editor-department-object.js.map +1 -1
  23. package/dist-client/pages/approval-line/approval-line-list-page.js +4 -12
  24. package/dist-client/pages/approval-line/approval-line-list-page.js.map +1 -1
  25. package/dist-client/pages/approval-line/common-approval-line-templates-page.js +8 -13
  26. package/dist-client/pages/approval-line/common-approval-line-templates-page.js.map +1 -1
  27. package/dist-client/pages/approval-line/my-approval-line-templates-page.js +8 -13
  28. package/dist-client/pages/approval-line/my-approval-line-templates-page.js.map +1 -1
  29. package/dist-client/pages/department/department-list-page.d.ts +5 -1
  30. package/dist-client/pages/department/department-list-page.js +41 -29
  31. package/dist-client/pages/department/department-list-page.js.map +1 -1
  32. package/dist-client/pages/employee/employee-list-page.d.ts +18 -0
  33. package/dist-client/pages/employee/employee-list-page.js +435 -228
  34. package/dist-client/pages/employee/employee-list-page.js.map +1 -1
  35. package/dist-client/route.d.ts +1 -1
  36. package/dist-client/route.js +0 -6
  37. package/dist-client/route.js.map +1 -1
  38. package/dist-client/tsconfig.tsbuildinfo +1 -1
  39. package/package.json +6 -6
  40. package/tests/department-query-shape.test.ts +130 -0
  41. package/tests/screen-words.test.ts +110 -0
  42. package/things-factory.config.js +0 -2
  43. package/translations/en.json +10 -5
  44. package/translations/ja.json +10 -5
  45. package/translations/ko.json +10 -5
  46. package/translations/ms.json +11 -5
  47. package/translations/zh.json +10 -5
  48. package/dist-client/pages/department/department-tree-page.d.ts +0 -39
  49. package/dist-client/pages/department/department-tree-page.js +0 -350
  50. package/dist-client/pages/department/department-tree-page.js.map +0 -1
  51. package/dist-client/pages/employee/employees-by-department.d.ts +0 -32
  52. package/dist-client/pages/employee/employees-by-department.js +0 -435
  53. package/dist-client/pages/employee/employees-by-department.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"recipients-editor-popup.js","sourceRoot":"","sources":["../../client/component/recipients-editor-popup.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,qCAAqC,CAAA;AAC5C,OAAO,uCAAuC,CAAA;AAC9C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAS,MAAM,mBAAmB,CAAA;AAEzE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAGtD;;GAEG;AAEI,IAAM,qBAAqB,GAA3B,MAAM,qBAAsB,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC;IAAjE;;QAwCL,wEAAwE;QAChE,iBAAY,GAAoB,IAAI,CAAC,KAAK,CAAA;IAuCpD,CAAC;aA/EQ,WAAM,GAAG;QACd,kBAAkB;QAClB,iBAAiB;QACjB,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4BF;KACF,AAhCY,CAgCZ;IAUD,MAAM;QACJ,OAAO,IAAI,CAAA;;iBAEE,IAAI,CAAC,KAAK;kBACT,CAAC,CAAc,EAAE,EAAE;YAC3B,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAA;QACnC,CAAC;;;;8CAIqC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACzD,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;;iCAEJ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;mCACpD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;;KAEtF,CAAA;IACH,CAAC;IAED,YAAY;QACV,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAA;IAChC,CAAC;IAED,OAAO;QACL,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QAClD,UAAU,CAAC,IAAI,CAAC,CAAA;IAClB,CAAC;IAED,QAAQ;QACN,UAAU,CAAC,IAAI,CAAC,CAAA;IAClB,CAAC;IAED,SAAS;QACP,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAE/D,UAAU,CAAC,IAAI,CAAC,CAAA;IAClB,CAAC;;AA5C0B;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;oDAAuB;AAErB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;8DAA0D;AACzD;IAA3B,KAAK,CAAC,mBAAmB,CAAC;8BAAU,gBAAgB;IAErD,wEAAwE;;qDAFnB;AAtC1C,qBAAqB;IADjC,aAAa,CAAC,yBAAyB,CAAC;GAC5B,qBAAqB,CAgFjC","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/button/text-button.js'\nimport '@material/web/button/filled-button.js'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { CommonHeaderStyles, CommonPopupStyles } from '@operato/styles'\nimport { closePopup } from '@operato/popup'\n\nimport { RecipientsEditor } from './recipients-editor'\nimport { AssigneeItem } from '../types/org-member'\n\n/**\n * 결재선의 각 결재자 리스트를 편집한다.\n */\n@customElement('recipients-editor-popup')\nexport class RecipientsEditorPopup extends localize(i18next)(LitElement) {\n static styles = [\n CommonHeaderStyles,\n CommonPopupStyles,\n css`\n /*\n * 단추 줄은 **제품의 팝업 규약**을 쓴다(CommonPopupStyles 의 .buttons).\n *\n * 전에는 손으로 만든 .footer 였고 organization 의 팝업 다섯이 그것을 복사해 갖고 있었다.\n * 규약이 주는 것을 다 놓쳤다 — 팝업 안 단추의 알약 모서리(담는 카드가 둥그니 그 안도\n * 둥글다), 마우스와 손가락을 가르는 갈래(손가락에서는 카드 아래 폭을 채우는 액션바가 된다),\n * 단추 높이 통일.\n *\n * 단추는 Material 것으로 쓴다. 규약의 마우스 갈래는 **md-*-button 의 토큰으로만** 모양을\n * 말한다 — 평범한 button 을 두면 모서리가 0 으로 남는다(실측: 알약이어야 할 자리에 0px).\n * 제품의 다른 팝업도 같은 관용구다(operato-plant 의 maintenance-dialog).\n *\n * 「비우기」는 왼쪽에 둔다 — 되돌리는 것이라 저지르는 것들과 같은 자리에 두지 않는다.\n */\n .buttons .left {\n margin-right: auto;\n }\n :host {\n display: flex;\n flex-direction: column;\n\n background-color: var(--md-sys-color-surface);\n }\n\n recipients-editor {\n flex: 1;\n }\n `\n ]\n\n @property({ type: Array }) value?: AssigneeItem[]\n\n @property({ type: Object }) confirmCallback?: (value?: AssigneeItem[] | null) => void\n @query('recipients-editor') editor!: RecipientsEditor\n\n /* this.value는 (원인불명으로) 값이 Reset되므로, 변화값을 유지하도록 별도로 changedValue를 사용함 */\n private changedValue?: AssigneeItem[] = this.value\n\n render() {\n return html`\n <recipients-editor\n .value=${this.value}\n @change=${(e: CustomEvent) => {\n this.changedValue = [...e.detail]\n }}\n ></recipients-editor>\n\n <div class=\"buttons\">\n <md-text-button class=\"left\" @click=${this.onEmpty.bind(this)}>\n ${i18next.t('button.empty')}\n </md-text-button>\n <md-text-button @click=${this.onCancel.bind(this)}>${i18next.t('button.cancel')}</md-text-button>\n <md-filled-button @click=${this.onConfirm.bind(this)}>${i18next.t('button.confirm')}</md-filled-button>\n </div>\n `\n }\n\n firstUpdated() {\n this.changedValue = this.value\n }\n\n onEmpty() {\n this.confirmCallback && this.confirmCallback(null)\n closePopup(this)\n }\n\n onCancel() {\n closePopup(this)\n }\n\n onConfirm() {\n this.confirmCallback && this.confirmCallback(this.changedValue)\n\n closePopup(this)\n }\n}\n"]}
1
+ {"version":3,"file":"recipients-editor-popup.js","sourceRoot":"","sources":["../../client/component/recipients-editor-popup.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,qCAAqC,CAAA;AAC5C,OAAO,uCAAuC,CAAA;AAC9C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAS,MAAM,mBAAmB,CAAA;AAEzE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAGtD;;GAEG;AAEI,IAAM,qBAAqB,GAA3B,MAAM,qBAAsB,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC;IAAjE;;QAwCL,wEAAwE;QAChE,iBAAY,GAAoB,IAAI,CAAC,KAAK,CAAA;IAuCpD,CAAC;aA/EQ,WAAM,GAAG;QACd,kBAAkB;QAClB,iBAAiB;QACjB,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4BF;KACF,AAhCY,CAgCZ;IAUD,MAAM;QACJ,OAAO,IAAI,CAAA;;iBAEE,IAAI,CAAC,KAAK;kBACT,CAAC,CAAc,EAAE,EAAE;YAC3B,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAA;QACnC,CAAC;;;;8CAIqC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACzD,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;;iCAE/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;mCACpD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,gBAAgB,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;;KAEnH,CAAA;IACH,CAAC;IAED,YAAY;QACV,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAA;IAChC,CAAC;IAED,OAAO;QACL,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QAClD,UAAU,CAAC,IAAI,CAAC,CAAA;IAClB,CAAC;IAED,QAAQ;QACN,UAAU,CAAC,IAAI,CAAC,CAAA;IAClB,CAAC;IAED,SAAS;QACP,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAE/D,UAAU,CAAC,IAAI,CAAC,CAAA;IAClB,CAAC;;AA5C0B;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;oDAAuB;AAErB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;8DAA0D;AACzD;IAA3B,KAAK,CAAC,mBAAmB,CAAC;8BAAU,gBAAgB;IAErD,wEAAwE;;qDAFnB;AAtC1C,qBAAqB;IADjC,aAAa,CAAC,yBAAyB,CAAC;GAC5B,qBAAqB,CAgFjC","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/button/text-button.js'\nimport '@material/web/button/filled-button.js'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { CommonHeaderStyles, CommonPopupStyles } from '@operato/styles'\nimport { closePopup } from '@operato/popup'\n\nimport { RecipientsEditor } from './recipients-editor'\nimport { AssigneeItem } from '../types/org-member'\n\n/**\n * 결재선의 각 결재자 리스트를 편집한다.\n */\n@customElement('recipients-editor-popup')\nexport class RecipientsEditorPopup extends localize(i18next)(LitElement) {\n static styles = [\n CommonHeaderStyles,\n CommonPopupStyles,\n css`\n /*\n * 단추 줄은 **제품의 팝업 규약**을 쓴다(CommonPopupStyles 의 .buttons).\n *\n * 전에는 손으로 만든 .footer 였고 organization 의 팝업 다섯이 그것을 복사해 갖고 있었다.\n * 규약이 주는 것을 다 놓쳤다 — 팝업 안 단추의 알약 모서리(담는 카드가 둥그니 그 안도\n * 둥글다), 마우스와 손가락을 가르는 갈래(손가락에서는 카드 아래 폭을 채우는 액션바가 된다),\n * 단추 높이 통일.\n *\n * 단추는 Material 것으로 쓴다. 규약의 마우스 갈래는 **md-*-button 의 토큰으로만** 모양을\n * 말한다 — 평범한 button 을 두면 모서리가 0 으로 남는다(실측: 알약이어야 할 자리에 0px).\n * 제품의 다른 팝업도 같은 관용구다(operato-plant 의 maintenance-dialog).\n *\n * 「비우기」는 왼쪽에 둔다 — 되돌리는 것이라 저지르는 것들과 같은 자리에 두지 않는다.\n */\n .buttons .left {\n margin-right: auto;\n }\n :host {\n display: flex;\n flex-direction: column;\n\n background-color: var(--md-sys-color-surface);\n }\n\n recipients-editor {\n flex: 1;\n }\n `\n ]\n\n @property({ type: Array }) value?: AssigneeItem[]\n\n @property({ type: Object }) confirmCallback?: (value?: AssigneeItem[] | null) => void\n @query('recipients-editor') editor!: RecipientsEditor\n\n /* this.value는 (원인불명으로) 값이 Reset되므로, 변화값을 유지하도록 별도로 changedValue를 사용함 */\n private changedValue?: AssigneeItem[] = this.value\n\n render() {\n return html`\n <recipients-editor\n .value=${this.value}\n @change=${(e: CustomEvent) => {\n this.changedValue = [...e.detail]\n }}\n ></recipients-editor>\n\n <div class=\"buttons\">\n <md-text-button class=\"left\" @click=${this.onEmpty.bind(this)}>\n ${i18next.t('button.empty', { defaultValue: 'empty' })}\n </md-text-button>\n <md-text-button @click=${this.onCancel.bind(this)}>${i18next.t('button.cancel')}</md-text-button>\n <md-filled-button @click=${this.onConfirm.bind(this)}>${i18next.t('button.confirm', { defaultValue: 'confirm' })}</md-filled-button>\n </div>\n `\n }\n\n firstUpdated() {\n this.changedValue = this.value\n }\n\n onEmpty() {\n this.confirmCallback && this.confirmCallback(null)\n closePopup(this)\n }\n\n onCancel() {\n closePopup(this)\n }\n\n onConfirm() {\n this.confirmCallback && this.confirmCallback(this.changedValue)\n\n closePopup(this)\n }\n}\n"]}
@@ -89,7 +89,7 @@ let RecipientsEditor = class RecipientsEditor extends localize(i18next)(LitEleme
89
89
  {
90
90
  type: 'select',
91
91
  name: 'type',
92
- header: i18next.t('field.type'),
92
+ header: i18next.t('field.type', { defaultValue: 'type' }),
93
93
  record: {
94
94
  editable: true,
95
95
  options: ['', 'Employee', 'Department', 'Role', 'MyDepartment', 'MySupervisor', 'Myself']
@@ -99,7 +99,7 @@ let RecipientsEditor = class RecipientsEditor extends localize(i18next)(LitEleme
99
99
  {
100
100
  type: 'resource-object',
101
101
  name: 'assignee',
102
- header: i18next.t('field.assignee'),
102
+ header: i18next.t('field.assignee', { defaultValue: 'assignee' }),
103
103
  record: {
104
104
  editable: true,
105
105
  editor: function (value, column, record, rowIndex, field) {
@@ -132,7 +132,7 @@ let RecipientsEditor = class RecipientsEditor extends localize(i18next)(LitEleme
132
132
  break;
133
133
  case 'Role':
134
134
  options = {
135
- title: i18next.t('title.lookup role'),
135
+ title: i18next.t('title.lookup role', { defaultValue: 'lookup role' }),
136
136
  queryName: 'roles'
137
137
  };
138
138
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"recipients-editor.js","sourceRoot":"","sources":["../../client/component/recipients-editor.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport './recipients-view'\n\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { DataGrist, FetchOption, getEditor, getRenderer } from '@operato/data-grist'\nimport { ButtonContainerStyles, CommonHeaderStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\n\nimport { AssigneeItem } from '../types/org-member'\n\n/**\n * Assignee 리스트를 편집한다.\n */\n@customElement('recipients-editor')\nexport class RecipientsEditor extends localize(i18next)(LitElement) {\n static styles = [\n CommonHeaderStyles,\n ButtonContainerStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n\n background-color: var(--md-sys-color-surface);\n }\n\n recipients-view {\n min-height: 100px;\n }\n\n ox-grist {\n flex: 1;\n }\n `\n ]\n\n @property({ type: Array }) value?: AssigneeItem[]\n\n @state() gristConfig?: any\n\n @query('ox-grist') grist?: DataGrist\n\n render() {\n return html`\n <recipients-view .value=${this.value}></recipients-view>\n\n <ox-grist\n .mode=${isMobileDevice() ? 'CARD' : 'GRID'}\n .config=${this.gristConfig}\n .fetchHandler=${this.fetchHandler.bind(this)}\n @record-change=${e => {\n this.value = ((this.grist as any)?._data.records || [])\n .map(v => {\n return { type: v.type, assignee: v.assignee }\n })\n .filter(v => v.type)\n\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: this.value\n })\n )\n }}\n >\n <div slot=\"headroom\" class=\"header\">\n <div id=\"actions\">\n <button danger @click=${() => this.deleteDataItems()}>\n <md-icon>delete</md-icon>${i18next.t('button.delete')}\n </button>\n </div>\n </div>\n </ox-grist>\n `\n }\n\n async firstUpdated() {\n this.gristConfig = {\n list: {\n fields: ['type', 'assignee']\n },\n columns: [\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n { type: 'gutter', gutterName: 'sequence' },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'arrow_upward',\n handlers: {\n click: 'move-up'\n }\n },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'arrow_downward',\n handlers: {\n click: 'move-down'\n }\n },\n {\n type: 'select',\n name: 'type',\n header: i18next.t('field.type'),\n record: {\n editable: true,\n options: ['', 'Employee', 'Department', 'Role', 'MyDepartment', 'MySupervisor', 'Myself']\n },\n width: 140\n },\n {\n type: 'resource-object',\n name: 'assignee',\n header: i18next.t('field.assignee'),\n record: {\n editable: true,\n editor: function (value, column, record, rowIndex, field) {\n var options = {}\n switch (record.type) {\n case 'Employee':\n options = {\n title: i18next.t('title.employee list'),\n queryName: 'employees',\n columns: [\n { name: 'id', hidden: true },\n {\n name: 'controlNo',\n header: { renderer: () => i18next.t('field.control-no') },\n filter: 'search'\n },\n { name: 'name', header: { renderer: () => i18next.t('field.name') }, filter: 'search' }\n ],\n list: { fields: ['name', 'control-no'] },\n valueField: 'id',\n nameField: 'name',\n descriptionField: 'controlNo'\n }\n break\n case 'Department':\n options = {\n title: i18next.t('title.department list'),\n queryName: 'departments'\n }\n break\n case 'Role':\n options = {\n title: i18next.t('title.lookup role'),\n queryName: 'roles'\n }\n break\n default:\n options = {}\n }\n\n var dynamicRecord = { ...column.record, options }\n\n return getEditor(column.type)(value, { ...column, record: dynamicRecord }, record, rowIndex, field)\n },\n renderer: function (value, column, record, rowIndex, field) {\n var options = {}\n switch (record.type) {\n case 'Employee':\n options = {\n valueField: 'id',\n nameField: 'name',\n descriptionField: 'controlNo'\n }\n break\n case 'Department':\n case 'Role':\n default:\n break\n }\n\n var dynamicRecord = { ...column.record, options }\n\n return getRenderer(column.type)(value, { ...column, record: dynamicRecord }, record, rowIndex, field)\n }\n },\n width: 180\n }\n ],\n rows: {\n selectable: {\n multiple: true\n }\n },\n pagination: {\n infinite: true\n },\n sorters: []\n }\n }\n\n async fetchHandler({ filters, page, limit, sortings = [] }: FetchOption) {\n const value = [...(this.value || [])]\n this.value = value\n\n return {\n total: value.length,\n records: value\n }\n }\n\n async deleteDataItems() {\n this.grist?.deleteSelectedRecords(false)\n }\n}\n"]}
1
+ {"version":3,"file":"recipients-editor.js","sourceRoot":"","sources":["../../client/component/recipients-editor.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport './recipients-view'\n\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { DataGrist, FetchOption, getEditor, getRenderer } from '@operato/data-grist'\nimport { ButtonContainerStyles, CommonHeaderStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\n\nimport { AssigneeItem } from '../types/org-member'\n\n/**\n * Assignee 리스트를 편집한다.\n */\n@customElement('recipients-editor')\nexport class RecipientsEditor extends localize(i18next)(LitElement) {\n static styles = [\n CommonHeaderStyles,\n ButtonContainerStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n\n background-color: var(--md-sys-color-surface);\n }\n\n recipients-view {\n min-height: 100px;\n }\n\n ox-grist {\n flex: 1;\n }\n `\n ]\n\n @property({ type: Array }) value?: AssigneeItem[]\n\n @state() gristConfig?: any\n\n @query('ox-grist') grist?: DataGrist\n\n render() {\n return html`\n <recipients-view .value=${this.value}></recipients-view>\n\n <ox-grist\n .mode=${isMobileDevice() ? 'CARD' : 'GRID'}\n .config=${this.gristConfig}\n .fetchHandler=${this.fetchHandler.bind(this)}\n @record-change=${e => {\n this.value = ((this.grist as any)?._data.records || [])\n .map(v => {\n return { type: v.type, assignee: v.assignee }\n })\n .filter(v => v.type)\n\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: this.value\n })\n )\n }}\n >\n <div slot=\"headroom\" class=\"header\">\n <div id=\"actions\">\n <button danger @click=${() => this.deleteDataItems()}>\n <md-icon>delete</md-icon>${i18next.t('button.delete')}\n </button>\n </div>\n </div>\n </ox-grist>\n `\n }\n\n async firstUpdated() {\n this.gristConfig = {\n list: {\n fields: ['type', 'assignee']\n },\n columns: [\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n { type: 'gutter', gutterName: 'sequence' },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'arrow_upward',\n handlers: {\n click: 'move-up'\n }\n },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'arrow_downward',\n handlers: {\n click: 'move-down'\n }\n },\n {\n type: 'select',\n name: 'type',\n header: i18next.t('field.type', { defaultValue: 'type' }),\n record: {\n editable: true,\n options: ['', 'Employee', 'Department', 'Role', 'MyDepartment', 'MySupervisor', 'Myself']\n },\n width: 140\n },\n {\n type: 'resource-object',\n name: 'assignee',\n header: i18next.t('field.assignee', { defaultValue: 'assignee' }),\n record: {\n editable: true,\n editor: function (value, column, record, rowIndex, field) {\n var options = {}\n switch (record.type) {\n case 'Employee':\n options = {\n title: i18next.t('title.employee list'),\n queryName: 'employees',\n columns: [\n { name: 'id', hidden: true },\n {\n name: 'controlNo',\n header: { renderer: () => i18next.t('field.control-no') },\n filter: 'search'\n },\n { name: 'name', header: { renderer: () => i18next.t('field.name') }, filter: 'search' }\n ],\n list: { fields: ['name', 'control-no'] },\n valueField: 'id',\n nameField: 'name',\n descriptionField: 'controlNo'\n }\n break\n case 'Department':\n options = {\n title: i18next.t('title.department list'),\n queryName: 'departments'\n }\n break\n case 'Role':\n options = {\n title: i18next.t('title.lookup role', { defaultValue: 'lookup role' }),\n queryName: 'roles'\n }\n break\n default:\n options = {}\n }\n\n var dynamicRecord = { ...column.record, options }\n\n return getEditor(column.type)(value, { ...column, record: dynamicRecord }, record, rowIndex, field)\n },\n renderer: function (value, column, record, rowIndex, field) {\n var options = {}\n switch (record.type) {\n case 'Employee':\n options = {\n valueField: 'id',\n nameField: 'name',\n descriptionField: 'controlNo'\n }\n break\n case 'Department':\n case 'Role':\n default:\n break\n }\n\n var dynamicRecord = { ...column.record, options }\n\n return getRenderer(column.type)(value, { ...column, record: dynamicRecord }, record, rowIndex, field)\n }\n },\n width: 180\n }\n ],\n rows: {\n selectable: {\n multiple: true\n }\n },\n pagination: {\n infinite: true\n },\n sorters: []\n }\n }\n\n async fetchHandler({ filters, page, limit, sortings = [] }: FetchOption) {\n const value = [...(this.value || [])]\n this.value = value\n\n return {\n total: value.length,\n records: value\n }\n }\n\n async deleteDataItems() {\n this.grist?.deleteSelectedRecords(false)\n }\n}\n"]}
@@ -116,7 +116,7 @@ let OxFilterDepartmentObject = class OxFilterDepartmentObject extends OxFormFiel
116
116
  this.popup = openPopup(template, {
117
117
  backdrop: true,
118
118
  size: 'large',
119
- title: i18next.t('title.select_item')
119
+ title: i18next.t('title.select_item', { defaultValue: 'select item' })
120
120
  });
121
121
  }
122
122
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ox-filter-department-object.js","sourceRoot":"","sources":["../../client/filters-form/ox-filter-department-object.ts"],"names":[],"mappings":"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","sourcesContent":["import '../component/department-selector.js'\n\nimport { css, html, TemplateResult } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { i18next } from '@operato/i18n'\nimport { openPopup, PopupHandle } from '@operato/layout'\nimport { OxFormField } from '@operato/input'\n\n@customElement('ox-filter-department-object')\nexport class OxFilterDepartmentObject extends OxFormField {\n static styles = [\n css`\n :host {\n display: block;\n position: relative;\n /*\n * 밑줄 톤을 옆의 셀렉터와 맞춘다.\n *\n * rgba(0, 0, 0, 0.15) 를 손으로 박고 있었다. 그 값이 마침 outline-variant 와 비슷했지만\n * 토큰이 아니라 어두운 테마에서는 검정 15%가 그대로 남는다.\n *\n * operato 의 --ox-input-underline 을 쓰지 않는다. 그 토큰은 InputStyles 를 들이는 부품의\n * :host 에만 정의되고 이 부품은 그것을 안 들이므로, 참조하면 선언 전체가 무효가 되어\n * 밑줄이 사라진다. 그래서 같은 Material 토큰을 직접 가리킨다.\n */\n border-bottom: 1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, 0.15));\n min-width: 100px;\n\n --ox-select-padding: var(--spacing-tiny);\n --ox-select-font: var(--input-font);\n --ox-select-color: var(--input-color, var(--md-sys-color-on-surface-variant));\n --ox-select-icon-color: var(--theme-primary-text-color, var(--md-sys-color-on-surface-variant));\n --ox-select-icon-hover-color: var(--md-sys-color-on-primary-container, #3c3938);\n }\n\n div {\n width: 100%;\n box-sizing: border-box;\n\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n padding: var(--ox-select-padding);\n font: var(--ox-select-font);\n color: var(--ox-select-color);\n }\n\n span {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n gap: 4px;\n }\n\n md-icon {\n --md-icon-size: 16px;\n display: block;\n text-align: right;\n color: var(--ox-select-icon-color);\n opacity: 0.7;\n }\n\n div:hover md-icon {\n color: var(--md-sys-color-on-primary-container);\n }\n `\n ]\n\n @property({ type: Object }) column: any\n @property({ type: String }) value?: string\n\n @state() department?: any\n\n private popup?: PopupHandle\n private template?: TemplateResult\n\n render() {\n var { name, description } = this.department || (this.value ? { name: this.value } : {})\n\n return html`\n <div @click=${this._onclick} @keydown=${this._onkeydown}>\n <span tabindex=\"0\" style=\"flex:1\">${name || ''}${(description && `(${description})`) || ''}</span>\n <md-icon>search</md-icon>\n </div>\n `\n }\n\n _onclick(e: Event): void {\n e.stopPropagation()\n this.openSelector()\n }\n\n _onkeydown(e: KeyboardEvent): void {\n const key = e.key\n if (key == 'Enter') {\n e.stopPropagation()\n this.openSelector()\n }\n }\n\n openSelector() {\n if (this.popup) {\n delete this.popup\n }\n\n const confirmCallback = (selected?: { [field: string]: any }) => {\n this.department = selected\n ? {\n id: selected.id,\n controlNo: selected.controlNo,\n name: selected.name,\n description: selected.description\n }\n : null\n\n this.value = this.department?.name\n\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: this.value\n })\n )\n }\n\n var template =\n this.template ||\n html`\n <department-selector\n .value=${this.department || {}}\n .confirmCallback=${confirmCallback.bind(this)}\n ></department-selector>\n `\n\n this.popup = openPopup(template, {\n backdrop: true,\n size: 'large',\n title: i18next.t('title.select_item')\n })\n }\n}\n"]}
1
+ {"version":3,"file":"ox-filter-department-object.js","sourceRoot":"","sources":["../../client/filters-form/ox-filter-department-object.ts"],"names":[],"mappings":"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","sourcesContent":["import '../component/department-selector.js'\n\nimport { css, html, TemplateResult } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { i18next } from '@operato/i18n'\nimport { openPopup, PopupHandle } from '@operato/layout'\nimport { OxFormField } from '@operato/input'\n\n@customElement('ox-filter-department-object')\nexport class OxFilterDepartmentObject extends OxFormField {\n static styles = [\n css`\n :host {\n display: block;\n position: relative;\n /*\n * 밑줄 톤을 옆의 셀렉터와 맞춘다.\n *\n * rgba(0, 0, 0, 0.15) 를 손으로 박고 있었다. 그 값이 마침 outline-variant 와 비슷했지만\n * 토큰이 아니라 어두운 테마에서는 검정 15%가 그대로 남는다.\n *\n * operato 의 --ox-input-underline 을 쓰지 않는다. 그 토큰은 InputStyles 를 들이는 부품의\n * :host 에만 정의되고 이 부품은 그것을 안 들이므로, 참조하면 선언 전체가 무효가 되어\n * 밑줄이 사라진다. 그래서 같은 Material 토큰을 직접 가리킨다.\n */\n border-bottom: 1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, 0.15));\n min-width: 100px;\n\n --ox-select-padding: var(--spacing-tiny);\n --ox-select-font: var(--input-font);\n --ox-select-color: var(--input-color, var(--md-sys-color-on-surface-variant));\n --ox-select-icon-color: var(--theme-primary-text-color, var(--md-sys-color-on-surface-variant));\n --ox-select-icon-hover-color: var(--md-sys-color-on-primary-container, #3c3938);\n }\n\n div {\n width: 100%;\n box-sizing: border-box;\n\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n padding: var(--ox-select-padding);\n font: var(--ox-select-font);\n color: var(--ox-select-color);\n }\n\n span {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n gap: 4px;\n }\n\n md-icon {\n --md-icon-size: 16px;\n display: block;\n text-align: right;\n color: var(--ox-select-icon-color);\n opacity: 0.7;\n }\n\n div:hover md-icon {\n color: var(--md-sys-color-on-primary-container);\n }\n `\n ]\n\n @property({ type: Object }) column: any\n @property({ type: String }) value?: string\n\n @state() department?: any\n\n private popup?: PopupHandle\n private template?: TemplateResult\n\n render() {\n var { name, description } = this.department || (this.value ? { name: this.value } : {})\n\n return html`\n <div @click=${this._onclick} @keydown=${this._onkeydown}>\n <span tabindex=\"0\" style=\"flex:1\">${name || ''}${(description && `(${description})`) || ''}</span>\n <md-icon>search</md-icon>\n </div>\n `\n }\n\n _onclick(e: Event): void {\n e.stopPropagation()\n this.openSelector()\n }\n\n _onkeydown(e: KeyboardEvent): void {\n const key = e.key\n if (key == 'Enter') {\n e.stopPropagation()\n this.openSelector()\n }\n }\n\n openSelector() {\n if (this.popup) {\n delete this.popup\n }\n\n const confirmCallback = (selected?: { [field: string]: any }) => {\n this.department = selected\n ? {\n id: selected.id,\n controlNo: selected.controlNo,\n name: selected.name,\n description: selected.description\n }\n : null\n\n this.value = this.department?.name\n\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: this.value\n })\n )\n }\n\n var template =\n this.template ||\n html`\n <department-selector\n .value=${this.department || {}}\n .confirmCallback=${confirmCallback.bind(this)}\n ></department-selector>\n `\n\n this.popup = openPopup(template, {\n backdrop: true,\n size: 'large',\n title: i18next.t('title.select_item', { defaultValue: 'select item' })\n })\n }\n}\n"]}
@@ -55,7 +55,7 @@ let GristEditorDepartmentObject = class GristEditorDepartmentObject extends OxGr
55
55
  this.popup = openPopup(template, {
56
56
  backdrop: true,
57
57
  size: 'large',
58
- title: i18next.t('title.select_item')
58
+ title: i18next.t('title.select_item', { defaultValue: 'select item' })
59
59
  });
60
60
  }
61
61
  };
@@ -1 +1 @@
1
- {"version":3,"file":"grist-editor-department-object.js","sourceRoot":"","sources":["../../client/grist-editor/grist-editor-department-object.ts"],"names":[],"mappings":";AAAA,OAAO,qCAAqC,CAAA;AAE5C,OAAO,EAAE,IAAI,EAAkB,MAAM,KAAK,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAe,MAAM,iBAAiB,CAAA;AAGjD,IAAM,2BAA2B,GAAjC,MAAM,2BAA4B,SAAQ,aAAa;IAI5D,IAAI,cAAc;QAChB,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;QAE5C,OAAO,IAAI,CAAA;QACP,CAAC,IAAI,CAAC,KAAK;YACX,CAAC,CAAC,IAAI,CAAA,EAAE;YACR,CAAC,CAAC,IAAI,CAAA,sCAAsC,IAAI,IAAI,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI,WAAW,GAAG,CAAC,IAAI,EAAE,UAAU;KAC/G,CAAA;IACH,CAAC;IAED,QAAQ,CAAC,CAAQ;QACf,CAAC,CAAC,eAAe,EAAE,CAAA;QACnB,IAAI,CAAC,YAAY,EAAE,CAAA;IACrB,CAAC;IAED,UAAU,CAAC,CAAgB;QACzB,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAA;QACjB,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;YACnB,CAAC,CAAC,eAAe,EAAE,CAAA;YACnB,IAAI,CAAC,YAAY,EAAE,CAAA;QACrB,CAAC;IACH,CAAC;IAED,YAAY;QACV,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,KAAK,CAAA;QACnB,CAAC;QAED,MAAM,eAAe,GAAG,CAAC,QAAmC,EAAE,EAAE;YAC9D,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;gBAC9B,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE;oBACN,MAAM,EAAE,IAAI,CAAC,KAAK;oBAClB,KAAK,EAAE,QAAQ;wBACb,CAAC,CAAC;4BACE,EAAE,EAAE,QAAQ,CAAC,EAAE;4BACf,SAAS,EAAE,QAAQ,CAAC,SAAS;4BAC7B,IAAI,EAAE,QAAQ,CAAC,IAAI;4BACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;yBAClC;wBACH,CAAC,CAAC,IAAI;oBACR,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;iBACd;aACF,CAAC,CACH,CAAA;QACH,CAAC,CAAA;QAED,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;QAE5B,IAAI,QAAQ,GACV,IAAI,CAAC,QAAQ;YACb,IAAI,CAAA,gCAAgC,KAAK,qBAAqB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAA;QAEpH,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE;YAC/B,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;SACtC,CAAC,CAAA;IACJ,CAAC;CACF,CAAA;AAnEY,2BAA2B;IADvC,aAAa,CAAC,gCAAgC,CAAC;GACnC,2BAA2B,CAmEvC","sourcesContent":["import '../component/department-selector.js'\n\nimport { html, TemplateResult } from 'lit'\nimport { customElement } from 'lit/decorators.js'\n\nimport { OxGristEditor } from '@operato/data-grist'\nimport { i18next } from '@operato/i18n'\nimport { openPopup, PopupHandle } from '@operato/layout'\n\n@customElement('grist-editor-department-object')\nexport class GristEditorDepartmentObject extends OxGristEditor {\n private popup?: PopupHandle\n private template?: TemplateResult\n\n get editorTemplate() {\n var { name, description } = this.value || {}\n\n return html`\n ${!this.value\n ? html``\n : html` <span tabindex=\"0\" style=\"flex:1\">${name || ''}${(description && `(${description})`) || ''}</span> `}\n `\n }\n\n _onclick(e: Event): void {\n e.stopPropagation()\n this.openSelector()\n }\n\n _onkeydown(e: KeyboardEvent): void {\n const key = e.key\n if (key == 'Enter') {\n e.stopPropagation()\n this.openSelector()\n }\n }\n\n openSelector() {\n if (this.popup) {\n delete this.popup\n }\n\n const confirmCallback = (selected?: { [field: string]: any }) => {\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: this.value,\n after: selected\n ? {\n id: selected.id,\n controlNo: selected.controlNo,\n name: selected.name,\n description: selected.description\n }\n : null,\n record: this.record,\n column: this.column,\n row: this.row\n }\n })\n )\n }\n\n var value = this.value || {}\n\n var template =\n this.template ||\n html` <department-selector .value=${value} .confirmCallback=${confirmCallback.bind(this)}></department-selector> `\n\n this.popup = openPopup(template, {\n backdrop: true,\n size: 'large',\n title: i18next.t('title.select_item')\n })\n }\n}\n"]}
1
+ {"version":3,"file":"grist-editor-department-object.js","sourceRoot":"","sources":["../../client/grist-editor/grist-editor-department-object.ts"],"names":[],"mappings":";AAAA,OAAO,qCAAqC,CAAA;AAE5C,OAAO,EAAE,IAAI,EAAkB,MAAM,KAAK,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAe,MAAM,iBAAiB,CAAA;AAGjD,IAAM,2BAA2B,GAAjC,MAAM,2BAA4B,SAAQ,aAAa;IAI5D,IAAI,cAAc;QAChB,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;QAE5C,OAAO,IAAI,CAAA;QACP,CAAC,IAAI,CAAC,KAAK;YACX,CAAC,CAAC,IAAI,CAAA,EAAE;YACR,CAAC,CAAC,IAAI,CAAA,sCAAsC,IAAI,IAAI,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI,WAAW,GAAG,CAAC,IAAI,EAAE,UAAU;KAC/G,CAAA;IACH,CAAC;IAED,QAAQ,CAAC,CAAQ;QACf,CAAC,CAAC,eAAe,EAAE,CAAA;QACnB,IAAI,CAAC,YAAY,EAAE,CAAA;IACrB,CAAC;IAED,UAAU,CAAC,CAAgB;QACzB,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAA;QACjB,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;YACnB,CAAC,CAAC,eAAe,EAAE,CAAA;YACnB,IAAI,CAAC,YAAY,EAAE,CAAA;QACrB,CAAC;IACH,CAAC;IAED,YAAY;QACV,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,KAAK,CAAA;QACnB,CAAC;QAED,MAAM,eAAe,GAAG,CAAC,QAAmC,EAAE,EAAE;YAC9D,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,cAAc,EAAE;gBAC9B,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE;oBACN,MAAM,EAAE,IAAI,CAAC,KAAK;oBAClB,KAAK,EAAE,QAAQ;wBACb,CAAC,CAAC;4BACE,EAAE,EAAE,QAAQ,CAAC,EAAE;4BACf,SAAS,EAAE,QAAQ,CAAC,SAAS;4BAC7B,IAAI,EAAE,QAAQ,CAAC,IAAI;4BACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;yBAClC;wBACH,CAAC,CAAC,IAAI;oBACR,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;iBACd;aACF,CAAC,CACH,CAAA;QACH,CAAC,CAAA;QAED,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;QAE5B,IAAI,QAAQ,GACV,IAAI,CAAC,QAAQ;YACb,IAAI,CAAA,gCAAgC,KAAK,qBAAqB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAA;QAEpH,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE;YAC/B,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;SACvE,CAAC,CAAA;IACJ,CAAC;CACF,CAAA;AAnEY,2BAA2B;IADvC,aAAa,CAAC,gCAAgC,CAAC;GACnC,2BAA2B,CAmEvC","sourcesContent":["import '../component/department-selector.js'\n\nimport { html, TemplateResult } from 'lit'\nimport { customElement } from 'lit/decorators.js'\n\nimport { OxGristEditor } from '@operato/data-grist'\nimport { i18next } from '@operato/i18n'\nimport { openPopup, PopupHandle } from '@operato/layout'\n\n@customElement('grist-editor-department-object')\nexport class GristEditorDepartmentObject extends OxGristEditor {\n private popup?: PopupHandle\n private template?: TemplateResult\n\n get editorTemplate() {\n var { name, description } = this.value || {}\n\n return html`\n ${!this.value\n ? html``\n : html` <span tabindex=\"0\" style=\"flex:1\">${name || ''}${(description && `(${description})`) || ''}</span> `}\n `\n }\n\n _onclick(e: Event): void {\n e.stopPropagation()\n this.openSelector()\n }\n\n _onkeydown(e: KeyboardEvent): void {\n const key = e.key\n if (key == 'Enter') {\n e.stopPropagation()\n this.openSelector()\n }\n }\n\n openSelector() {\n if (this.popup) {\n delete this.popup\n }\n\n const confirmCallback = (selected?: { [field: string]: any }) => {\n this.dispatchEvent(\n new CustomEvent('field-change', {\n bubbles: true,\n composed: true,\n detail: {\n before: this.value,\n after: selected\n ? {\n id: selected.id,\n controlNo: selected.controlNo,\n name: selected.name,\n description: selected.description\n }\n : null,\n record: this.record,\n column: this.column,\n row: this.row\n }\n })\n )\n }\n\n var value = this.value || {}\n\n var template =\n this.template ||\n html` <department-selector .value=${value} .confirmCallback=${confirmCallback.bind(this)}></department-selector> `\n\n this.popup = openPopup(template, {\n backdrop: true,\n size: 'large',\n title: i18next.t('title.select_item', { defaultValue: 'select item' })\n })\n }\n}\n"]}
@@ -2,7 +2,7 @@ import { __decorate, __metadata } from "tslib";
2
2
  import '@operato/data-grist';
3
3
  import '../../component/approval-line-items-editor-popup';
4
4
  import { OxPrompt } from '@operato/popup';
5
- import { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles';
5
+ import { CommonHeaderStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles';
6
6
  import { navigate, PageView } from '@operato/shell';
7
7
  import { css, html } from 'lit';
8
8
  import { customElement, property, query, state } from 'lit/decorators.js';
@@ -95,19 +95,11 @@ let ApprovalLineListPage = class ApprovalLineListPage extends localize(i18next)(
95
95
  this.amEmployee = false;
96
96
  }
97
97
  static { this.styles = [
98
+ /* The frame owns the page shell; the grist is the content it sizes (ADR-0060 decision 8). */
99
+ WorkSurfacePageStyles,
98
100
  ScrollbarStyles,
99
101
  CommonHeaderStyles,
100
102
  css `
101
- :host {
102
- display: flex;
103
- flex-direction: column;
104
-
105
- width: 100%;
106
- }
107
-
108
- ox-grist {
109
- flex: 1;
110
- }
111
103
 
112
104
  /* 축 — 표 바깥 위. 결재함의 묶음 탭과 같은 어휘다. */
113
105
  .axes {
@@ -192,7 +184,7 @@ let ApprovalLineListPage = class ApprovalLineListPage extends localize(i18next)(
192
184
  `)}
193
185
  </div>
194
186
 
195
- <ox-grist .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}></ox-grist>
187
+ <ox-grist class="page-fill" .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}></ox-grist>
196
188
  `;
197
189
  }
198
190
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"approval-line-list-page.js","sourceRoot":"","sources":["../../../client/pages/approval-line/approval-line-list-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist'\nimport '../../component/approval-line-items-editor-popup'\n\nimport { OxPrompt } from '@operato/popup'\nimport { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'\nimport { navigate, PageView } from '@operato/shell'\nimport { css, html } from 'lit'\n\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { DataGrist, FetchOption } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { isMobileDevice } from '@operato/utils'\nimport { hasPrivilege } from '@things-factory/auth-base/dist-client'\n\nimport { ApprovalParticipation, isReferenceStep } from '../../types/approval-line'\n\nimport gql from 'graphql-tag'\n\n/** 어느 축을 보고 있나. 주소의 두 번째 토막이 이 값이다. */\ntype Axis = 'common' | 'mine'\n\n/**\n * 축마다 자기 질의와 자기 뮤테이션을 갖는다.\n *\n * 이것이 축으로 가른다는 말의 실제 내용이다 — 목록도 저장도 삭제도 섞이지 않는다. 한 「저장」이 두 종류를\n * 함께 바꾸는 일이 구조적으로 일어나지 않는다.\n */\nconst AXES: Record<Axis, { list: string; updateMultiple: string; update: string; remove: string }> = {\n common: {\n list: 'commonApprovalLines',\n updateMultiple: 'updateMultipleApprovalLine',\n update: 'updateApprovalLine',\n remove: 'deleteApprovalLines'\n },\n mine: {\n list: 'myApprovalLines',\n updateMultiple: 'updateMultipleMyApprovalLine',\n update: 'updateMyApprovalLine',\n remove: 'deleteMyApprovalLines'\n }\n}\n\n/**\n * 결재선 — **한 화면, 두 축.**\n *\n * ── 왜 한 화면인가 ─────────────────────────────────────────────────────────\n * 전에는 「공용 결재선」과 「내 결재선」이 각각 메뉴였다. 같은 것을 관리하는 두 자리라, 찾을 때마다\n * 어느 쪽에 있었는지를 먼저 기억해야 했다.\n *\n * ── 왜 섞지 않고 축으로 가르는가 ────────────────────────────────────────────\n * 두 결재선은 **바꾸는 행위의 무게가 다르다.**\n *\n * 공용 조직의 규정이다. 바꾸면 남의 결재 경로가 바뀐다. 권한이 있어야 고친다\n * 내 결재선 내 편의다. 바꿔도 나만 영향받는다\n *\n * 한 목록에 섞으면 「저장」 한 번이 내 편의 설정과 조직 규정을 함께 저지른다. 축으로 가르면 축마다\n * 질의도 저장도 따로여서 그 일이 일어나지 않는다.\n *\n * 공용 축을 감추지는 않는다 — **누구나 참조할 수 있고, 권한이 있으면 고칠 수도 있다.** 권한이 없으면\n * 그 축에서 고칠 수만 없게 한다.\n *\n * ── 주소가 축을 갖는다 ──────────────────────────────────────────────────────\n * /approval-line-list 공용\n * /approval-line-list/mine 내 결재선\n *\n * 대상이 바뀌는 것이므로 필터와 달리 주소에 담는다. 붙여 보낼 수 있고, 뒤로 가기가 앞 축으로 돌아간다.\n *\n * ── 줄마다 그 결재선이 보인다 ───────────────────────────────────────────────\n * 결재선의 내용은 **누가 몇 번째로 결재하나**다. 이름만 늘어놓고 내용을 팝업에 두면 「팀장만 거치는\n * 게 있었나」를 알려고 줄마다 열어 봐야 한다.\n *\n * 오세진 → 윤가람 [참조] → 한동수\n *\n * 결재자가 하나도 없으면 상신이 곧 완료된다 — 승인 게이트가 있는 척만 하게 된다. 그것도 줄에 적는다.\n */\n@customElement('approval-line-list-page')\nexport class ApprovalLineListPage extends localize(i18next)(ScopedElementsMixin(PageView)) {\n static styles = [\n ScrollbarStyles,\n CommonHeaderStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n\n width: 100%;\n }\n\n ox-grist {\n flex: 1;\n }\n\n /* 축 — 표 바깥 위. 결재함의 묶음 탭과 같은 어휘다. */\n .axes {\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, #d6dbe0);\n }\n\n .axes 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 .axes button:hover:not([data-selected]) {\n color: var(--ui-ink, #17272f);\n }\n\n /* 색은 밑줄이 말한다 — 브랜드 초록은 14px 글자로는 안 읽힌다(대비 3.91). */\n .axes button[data-selected] {\n font-weight: 600;\n color: var(--ui-ink, #17272f);\n border-bottom-color: var(--ui-accent, #262e38);\n }\n `\n ]\n\n @property({ type: Object }) gristConfig: any\n @property({ type: String }) mode: 'CARD' | 'GRID' | 'LIST' = isMobileDevice() ? 'CARD' : 'GRID'\n\n @query('ox-grist') private grist!: DataGrist\n\n @state() private axis: Axis = 'common'\n\n /**\n * 이 사람이 공용 결재선을 고칠 수 있나.\n *\n * `hasPrivilege` 는 프로필을 기다리는 비동기 함수인데 그리스트의 `editable` 은 동기로 불린다. 그래서\n * 한 번 물어 여기에 담는다.\n *\n * **기본값이 false 인 것이 중요하다.** 답이 오기 전 한 순간을 「고칠 수 있음」으로 그리면 그 사이에\n * 누른 사람이 거절당한다.\n */\n @state() private mayEditCommon = false\n\n /**\n * 내가 사원으로 등록되어 있나.\n *\n * 내 결재선은 사원 기록에 매인다 — 서버가 `ownerValue` 를 그 기록의 id 로 채운다. 등록되어 있지\n * 않으면 **만들 수가 없다.** 그것을 미리 알지 못하면 화면이 입력을 다 받아 놓고 저장할 때 실패한다.\n *\n * 없을 수도 있고 둘 이상일 수도 있다(`(domain, user)` 유일 제약이 없다). 여기서 필요한 것은 하나라도\n * 있느냐뿐이다.\n */\n @state() private amEmployee = false\n\n /** 지금 축을 고칠 수 있나. 공용은 권한이 있어야 하고, 내 결재선은 언제나 된다. */\n private get editable() {\n return this.axis === 'mine' ? this.amEmployee : this.mayEditCommon\n }\n\n get context() {\n return {\n title: i18next.t('title.approval-line'),\n search: {\n handler: (search: string) => {\n this.grist.searchText = search\n },\n value: this.grist?.searchText || ''\n },\n help: 'organization/approval-line',\n /*\n * 고칠 수 없는 축에서는 저장·삭제 버튼을 두지 않는다.\n *\n * 눌러 놓고 거절당하는 것보다 처음부터 없는 편이 낫다. 그리고 이 축은 **보러 온 자리**라는 것이\n * 버튼 없음으로 말해진다.\n */\n actions: this.editable\n ? [\n {\n icon: 'save',\n title: i18next.t('button.save'),\n action: this.save.bind(this)\n },\n {\n icon: 'delete',\n title: i18next.t('button.delete'),\n action: this.delete.bind(this),\n emphasis: { danger: true }\n }\n ]\n : []\n }\n }\n\n render() {\n const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')\n\n return html`\n <div class=\"axes\">\n ${(\n [\n ['common', 'label.approval-line-common'],\n ['mine', 'label.approval-line-mine']\n ] as [Axis, string][]\n ).map(\n ([axis, label]) => html`\n <button ?data-selected=${this.axis === axis} @click=${() => this.selectAxis(axis)}>\n ${i18next.t(label)}\n </button>\n `\n )}\n </div>\n\n <ox-grist .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}></ox-grist>\n `\n }\n\n /**\n * 축을 고른다 — **주소만 바꾼다.**\n *\n * 값을 여기서 세우지 않는다. 바뀐 주소를 `pageUpdated` 가 받아 세운다. 그래야 뒤로 가기와 새로 고침이\n * 같은 자리로 온다.\n */\n private selectAxis(axis: Axis) {\n if (axis === this.axis) {\n return\n }\n\n const page = this.lifecycle?.page || 'approval-line-list'\n navigate(axis === 'common' ? page : `${page}/${axis}`)\n }\n\n /** 한 사람을 무엇으로 부를까. 이름이 없으면 관리번호라도 보인다 — 빈 칸으로 두지 않는다. */\n private approverText(item: any) {\n return item?.approver?.name || item?.approver?.controlNo || i18next.t('text.approver-unknown')\n }\n\n async pageInitialized(lifecycle: any) {\n /*\n * 권한을 먼저 묻는다. 서버 지시자와 **같은 인자**다 —\n * `@privilege(category: \"organization\", privilege: \"mutation\", domainOwnerGranted: true)`.\n *\n * `superUserGranted` 는 넣지 않는다. 지시자에 없기 때문이다. 넣으면 슈퍼유저에게 고칠 수 있는 줄로\n * 그려 놓고 서버가 거절한다.\n */\n this.mayEditCommon = !!(await hasPrivilege({\n category: 'organization',\n privilege: 'mutation',\n domainOwnerGranted: true\n }))\n\n this.amEmployee = await this.askAmEmployee()\n\n this.axis = lifecycle?.resourceId === 'mine' ? 'mine' : 'common'\n this.applyConfig()\n }\n\n /**\n * 내가 사원인가를 서버에 묻는다.\n *\n * `myEmployees` 는 권한이 없다 — 「나는 누구인가」는 권한으로 가릴 사실이 아니다. `employees` 는\n * `employee:query` 를 요구해서, 정작 답이 필요한 일반 사원이 물을 수 없다.\n */\n private async askAmEmployee() {\n const response = await client.query({\n query: gql`\n query {\n myEmployees {\n id\n }\n }\n `\n })\n\n return (response.data?.myEmployees || []).length > 0\n }\n\n async pageUpdated(changes: any, after: any, before: any) {\n if (after?.resourceId === before?.resourceId) {\n return\n }\n\n this.axis = after?.resourceId === 'mine' ? 'mine' : 'common'\n this.applyConfig()\n await this.grist?.fetch()\n }\n\n private applyConfig() {\n /* 고칠 수 있는 축에서만 빈 줄을 내민다 — 적을 수 없는 자리에 적을 칸을 두지 않는다. */\n const editable = this.editable\n\n this.gristConfig = {\n list: {\n fields: ['name', 'model'],\n details: ['updatedAt']\n },\n /*\n * 빈 화면이 **왜 비었는지**를 말한다.\n *\n * 사원이 아닌 사람의 「내 결재선」은 「없는 것」이 아니라 **가질 수 없는 것**이다. 그 둘을 같은\n * 문장으로 말하면, 읽은 사람은 만들면 되는 줄 알고 적다가 저장에서 막힌다.\n */\n emptyNote: this.emptyNote(),\n rows: {\n appendable: editable,\n selectable: { multiple: true }\n },\n columns: [\n { type: 'gutter', gutterName: 'sequence', fixed: true },\n ...(editable ? [{ type: 'gutter', gutterName: 'row-selector', fixed: true, multiple: true }] : []),\n {\n type: 'gutter',\n gutterName: 'button',\n fixed: true,\n /*\n * 고칠 수 없는 축에서는 「고치기」가 아니라 「보기」다. 버튼을 없애지는 않는다 — 공용 결재선이\n * 무엇을 거치는지는 누구나 봐야 한다.\n */\n icon: (record: any) => (!record?.id ? '' : editable ? 'reorder' : 'visibility'),\n iconOnly: false,\n title: (record: any) =>\n !record?.id ? '' : editable ? i18next.t('button.edit') : i18next.t('button.view'),\n width: 72,\n handlers: {\n click: (columns: any, data: any, column: any, record: any) => {\n if (!record.id) {\n return\n }\n\n const popup = openPopup(\n html`\n <approval-line-items-editor-popup\n .confirmCallback=${editable\n ? async (model: any) => {\n await this.updateModel(record, model)\n await this.grist.fetch()\n\n return false\n }\n : undefined}\n .value=${record.model}\n ></approval-line-items-editor-popup>\n `,\n {\n backdrop: true,\n help: 'organization/approval-line-items-editor',\n size: 'large',\n title: editable ? i18next.t('title.approval-line item list') : record.name\n }\n )\n popup.onclosed = () => {\n this.grist?.fetch()\n }\n }\n }\n },\n {\n type: 'string',\n name: 'name',\n fixed: true,\n header: i18next.t('field.name'),\n record: { editable },\n filter: 'search',\n sortable: true,\n width: 220\n },\n {\n /*\n * ── 결재선 자체 ──────────────────────────────────────────────────\n * 이 칸이 이 화면의 이유다. 참조는 결재를 막지 않으므로 결재자와 같은 무게로 읽히면 안 된다 —\n * 표식을 붙여 가른다.\n *\n * 넘치면 잘리므로 `title` 에 전문을 담는다.\n */\n type: 'string',\n name: 'model',\n header: i18next.t('field.approval-line'),\n record: {\n editable: false,\n renderer: (value: any, column: any, record: any) => {\n /* 아직 없는 줄(맨 아래 빈 줄)에는 아무 말도 하지 않는다. */\n if (!record?.id) {\n return html``\n }\n\n const items = Array.isArray(value) ? value : []\n\n if (!items.length) {\n /* 결재자가 없으면 상신이 곧 완료된다. 조용히 빈 칸으로 두지 않는다. */\n return html`<span style=\"color: var(--md-sys-color-error)\"\n >${i18next.t('text.approval-line-empty')}</span\n >`\n }\n\n const plain = items\n .map(item =>\n isReferenceStep(item)\n ? `${this.approverText(item)} (${i18next.t('label.participation-reference')})`\n : this.approverText(item)\n )\n .join(' → ')\n\n return html`\n <span\n title=${plain}\n style=\"display:flex; align-items:center; gap:4px; overflow:hidden; white-space:nowrap\"\n >\n ${items.map(\n (item, index) => html`\n ${index > 0 ? html`<span style=\"color: var(--ui-faint, #8a959c)\">→</span>` : ''}\n <span style=${isReferenceStep(item) ? 'color: var(--ui-muted, #57676f)' : ''}\n >${this.approverText(item)}</span\n >\n ${isReferenceStep(item)\n ? html`<em\n style=\"font-style:normal; font-size:11px; padding:0 4px; border-radius:999px;\n border:1px solid var(--ui-line, #d6dbe0); color: var(--ui-muted, #57676f)\"\n >${i18next.t('label.participation-reference')}</em\n >`\n : ''}\n `\n )}\n </span>\n `\n }\n },\n width: 340\n },\n {\n type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: { editable },\n filter: 'search',\n width: 220\n },\n {\n type: 'resource-object',\n name: 'updater',\n header: i18next.t('field.updater'),\n record: { editable: false },\n sortable: true,\n width: 90\n },\n {\n type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n record: { editable: false },\n sortable: true,\n width: 180\n }\n ],\n sorters: [{ name: 'name' }]\n }\n }\n\n private emptyNote() {\n if (this.axis === 'common') {\n return {\n icon: 'approval',\n title: i18next.t('text.no-common-approval-line-title'),\n description: i18next.t('text.no-common-approval-line-description')\n }\n }\n\n if (!this.amEmployee) {\n return {\n icon: 'badge',\n title: i18next.t('text.not-an-employee-title'),\n description: i18next.t('text.not-an-employee-description')\n }\n }\n\n return {\n icon: 'approval',\n title: i18next.t('text.no-my-approval-line-title'),\n description: i18next.t('text.no-my-approval-line-description')\n }\n }\n\n async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [] }: FetchOption) {\n const response = await client.query({\n query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {\n responses: ${AXES[this.axis].list}(filters: $filters, pagination: $pagination, sortings: $sortings) {\n items {\n id\n name\n description\n ownerType\n model {\n type\n participation\n notifyAfter\n approver {\n id\n name\n description\n controlNo\n }\n }\n updater {\n id\n name\n }\n updatedAt\n }\n total\n }\n }\n `,\n variables: { filters, pagination: { page, limit }, sortings }\n })\n\n return {\n total: response.data.responses.total || 0,\n records: response.data.responses.items || []\n }\n }\n\n private async save() {\n const dirty = this.grist.dirtyRecords\n if (!dirty?.length) {\n return\n }\n\n const patches = dirty.map((record: any) => {\n const patch: any = record.id ? { id: record.id } : {}\n const dirtyFields = record.__dirtyfields__ || {}\n for (const key in dirtyFields) {\n patch[key] = dirtyFields[key].after\n }\n patch.cuFlag = record.__dirty__\n\n /* 공용 축에서 새로 만드는 것은 공용이다 — 서버가 그것을 값으로 안다. */\n if (this.axis === 'common') {\n patch.ownerType = 'Common'\n }\n\n return patch\n })\n\n const response = await client.mutate({\n mutation: gql`\n mutation ($patches: [ApprovalLinePatch!]!) {\n ${AXES[this.axis].updateMultiple}(patches: $patches) {\n name\n }\n }\n `,\n variables: { patches }\n })\n\n if (response.errors) {\n notify({ level: 'error', message: response.errors.map(error => error.message).join('\\n') })\n } else {\n notify({ message: i18next.t('text.saved') })\n }\n\n this.grist.fetch()\n }\n\n private async delete() {\n const ids = (this.grist.selected || []).map((record: any) => record.id).filter(Boolean)\n if (!ids.length) {\n return\n }\n\n if (!await OxPrompt.confirmDelete({ count: this.grist?.selected?.length })) {\n return\n }\n\n const response = await client.mutate({\n mutation: gql`\n mutation ($ids: [String!]!) {\n ${AXES[this.axis].remove}(ids: $ids)\n }\n `,\n variables: { ids }\n })\n\n if (response.errors) {\n notify({ level: 'error', message: response.errors.map(error => error.message).join('\\n') })\n } else {\n notify({ message: i18next.t('text.deleted') })\n }\n\n this.grist.fetch()\n }\n\n /** 결재선의 내용(누가 몇 번째로 결재하나)을 저장한다. */\n private async updateModel(record: any, model: any) {\n const response = await client.mutate({\n mutation: gql`\n mutation ($id: String!, $patch: ApprovalLinePatch!) {\n ${AXES[this.axis].update}(id: $id, patch: $patch) {\n id\n }\n }\n `,\n variables: { id: record.id, patch: { model, cuFlag: 'M' } }\n })\n\n if (response.errors) {\n notify({ level: 'error', message: response.errors.map(error => error.message).join('\\n') })\n } else {\n notify({ message: i18next.t('text.saved') })\n }\n }\n}\n"]}
1
+ {"version":3,"file":"approval-line-list-page.js","sourceRoot":"","sources":["../../../client/pages/approval-line/approval-line-list-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist'\nimport '../../component/approval-line-items-editor-popup'\n\nimport { OxPrompt } from '@operato/popup'\nimport { CommonHeaderStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { navigate, PageView } from '@operato/shell'\nimport { css, html } from 'lit'\n\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { DataGrist, FetchOption } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { isMobileDevice } from '@operato/utils'\nimport { hasPrivilege } from '@things-factory/auth-base/dist-client'\n\nimport { ApprovalParticipation, isReferenceStep } from '../../types/approval-line'\n\nimport gql from 'graphql-tag'\n\n/** 어느 축을 보고 있나. 주소의 두 번째 토막이 이 값이다. */\ntype Axis = 'common' | 'mine'\n\n/**\n * 축마다 자기 질의와 자기 뮤테이션을 갖는다.\n *\n * 이것이 축으로 가른다는 말의 실제 내용이다 — 목록도 저장도 삭제도 섞이지 않는다. 한 「저장」이 두 종류를\n * 함께 바꾸는 일이 구조적으로 일어나지 않는다.\n */\nconst AXES: Record<Axis, { list: string; updateMultiple: string; update: string; remove: string }> = {\n common: {\n list: 'commonApprovalLines',\n updateMultiple: 'updateMultipleApprovalLine',\n update: 'updateApprovalLine',\n remove: 'deleteApprovalLines'\n },\n mine: {\n list: 'myApprovalLines',\n updateMultiple: 'updateMultipleMyApprovalLine',\n update: 'updateMyApprovalLine',\n remove: 'deleteMyApprovalLines'\n }\n}\n\n/**\n * 결재선 — **한 화면, 두 축.**\n *\n * ── 왜 한 화면인가 ─────────────────────────────────────────────────────────\n * 전에는 「공용 결재선」과 「내 결재선」이 각각 메뉴였다. 같은 것을 관리하는 두 자리라, 찾을 때마다\n * 어느 쪽에 있었는지를 먼저 기억해야 했다.\n *\n * ── 왜 섞지 않고 축으로 가르는가 ────────────────────────────────────────────\n * 두 결재선은 **바꾸는 행위의 무게가 다르다.**\n *\n * 공용 조직의 규정이다. 바꾸면 남의 결재 경로가 바뀐다. 권한이 있어야 고친다\n * 내 결재선 내 편의다. 바꿔도 나만 영향받는다\n *\n * 한 목록에 섞으면 「저장」 한 번이 내 편의 설정과 조직 규정을 함께 저지른다. 축으로 가르면 축마다\n * 질의도 저장도 따로여서 그 일이 일어나지 않는다.\n *\n * 공용 축을 감추지는 않는다 — **누구나 참조할 수 있고, 권한이 있으면 고칠 수도 있다.** 권한이 없으면\n * 그 축에서 고칠 수만 없게 한다.\n *\n * ── 주소가 축을 갖는다 ──────────────────────────────────────────────────────\n * /approval-line-list 공용\n * /approval-line-list/mine 내 결재선\n *\n * 대상이 바뀌는 것이므로 필터와 달리 주소에 담는다. 붙여 보낼 수 있고, 뒤로 가기가 앞 축으로 돌아간다.\n *\n * ── 줄마다 그 결재선이 보인다 ───────────────────────────────────────────────\n * 결재선의 내용은 **누가 몇 번째로 결재하나**다. 이름만 늘어놓고 내용을 팝업에 두면 「팀장만 거치는\n * 게 있었나」를 알려고 줄마다 열어 봐야 한다.\n *\n * 오세진 → 윤가람 [참조] → 한동수\n *\n * 결재자가 하나도 없으면 상신이 곧 완료된다 — 승인 게이트가 있는 척만 하게 된다. 그것도 줄에 적는다.\n */\n@customElement('approval-line-list-page')\nexport class ApprovalLineListPage extends localize(i18next)(ScopedElementsMixin(PageView)) {\n static styles = [\n /* The frame owns the page shell; the grist is the content it sizes (ADR-0060 decision 8). */\n WorkSurfacePageStyles,\n ScrollbarStyles,\n CommonHeaderStyles,\n css`\n\n /* 축 — 표 바깥 위. 결재함의 묶음 탭과 같은 어휘다. */\n .axes {\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, #d6dbe0);\n }\n\n .axes 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 .axes button:hover:not([data-selected]) {\n color: var(--ui-ink, #17272f);\n }\n\n /* 색은 밑줄이 말한다 — 브랜드 초록은 14px 글자로는 안 읽힌다(대비 3.91). */\n .axes button[data-selected] {\n font-weight: 600;\n color: var(--ui-ink, #17272f);\n border-bottom-color: var(--ui-accent, #262e38);\n }\n `\n ]\n\n @property({ type: Object }) gristConfig: any\n @property({ type: String }) mode: 'CARD' | 'GRID' | 'LIST' = isMobileDevice() ? 'CARD' : 'GRID'\n\n @query('ox-grist') private grist!: DataGrist\n\n @state() private axis: Axis = 'common'\n\n /**\n * 이 사람이 공용 결재선을 고칠 수 있나.\n *\n * `hasPrivilege` 는 프로필을 기다리는 비동기 함수인데 그리스트의 `editable` 은 동기로 불린다. 그래서\n * 한 번 물어 여기에 담는다.\n *\n * **기본값이 false 인 것이 중요하다.** 답이 오기 전 한 순간을 「고칠 수 있음」으로 그리면 그 사이에\n * 누른 사람이 거절당한다.\n */\n @state() private mayEditCommon = false\n\n /**\n * 내가 사원으로 등록되어 있나.\n *\n * 내 결재선은 사원 기록에 매인다 — 서버가 `ownerValue` 를 그 기록의 id 로 채운다. 등록되어 있지\n * 않으면 **만들 수가 없다.** 그것을 미리 알지 못하면 화면이 입력을 다 받아 놓고 저장할 때 실패한다.\n *\n * 없을 수도 있고 둘 이상일 수도 있다(`(domain, user)` 유일 제약이 없다). 여기서 필요한 것은 하나라도\n * 있느냐뿐이다.\n */\n @state() private amEmployee = false\n\n /** 지금 축을 고칠 수 있나. 공용은 권한이 있어야 하고, 내 결재선은 언제나 된다. */\n private get editable() {\n return this.axis === 'mine' ? this.amEmployee : this.mayEditCommon\n }\n\n get context() {\n return {\n title: i18next.t('title.approval-line'),\n search: {\n handler: (search: string) => {\n this.grist.searchText = search\n },\n value: this.grist?.searchText || ''\n },\n help: 'organization/approval-line',\n /*\n * 고칠 수 없는 축에서는 저장·삭제 버튼을 두지 않는다.\n *\n * 눌러 놓고 거절당하는 것보다 처음부터 없는 편이 낫다. 그리고 이 축은 **보러 온 자리**라는 것이\n * 버튼 없음으로 말해진다.\n */\n actions: this.editable\n ? [\n {\n icon: 'save',\n title: i18next.t('button.save'),\n action: this.save.bind(this)\n },\n {\n icon: 'delete',\n title: i18next.t('button.delete'),\n action: this.delete.bind(this),\n emphasis: { danger: true }\n }\n ]\n : []\n }\n }\n\n render() {\n const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')\n\n return html`\n <div class=\"axes\">\n ${(\n [\n ['common', 'label.approval-line-common'],\n ['mine', 'label.approval-line-mine']\n ] as [Axis, string][]\n ).map(\n ([axis, label]) => html`\n <button ?data-selected=${this.axis === axis} @click=${() => this.selectAxis(axis)}>\n ${i18next.t(label)}\n </button>\n `\n )}\n </div>\n\n <ox-grist class=\"page-fill\" .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}></ox-grist>\n `\n }\n\n /**\n * 축을 고른다 — **주소만 바꾼다.**\n *\n * 값을 여기서 세우지 않는다. 바뀐 주소를 `pageUpdated` 가 받아 세운다. 그래야 뒤로 가기와 새로 고침이\n * 같은 자리로 온다.\n */\n private selectAxis(axis: Axis) {\n if (axis === this.axis) {\n return\n }\n\n const page = this.lifecycle?.page || 'approval-line-list'\n navigate(axis === 'common' ? page : `${page}/${axis}`)\n }\n\n /** 한 사람을 무엇으로 부를까. 이름이 없으면 관리번호라도 보인다 — 빈 칸으로 두지 않는다. */\n private approverText(item: any) {\n return item?.approver?.name || item?.approver?.controlNo || i18next.t('text.approver-unknown')\n }\n\n async pageInitialized(lifecycle: any) {\n /*\n * 권한을 먼저 묻는다. 서버 지시자와 **같은 인자**다 —\n * `@privilege(category: \"organization\", privilege: \"mutation\", domainOwnerGranted: true)`.\n *\n * `superUserGranted` 는 넣지 않는다. 지시자에 없기 때문이다. 넣으면 슈퍼유저에게 고칠 수 있는 줄로\n * 그려 놓고 서버가 거절한다.\n */\n this.mayEditCommon = !!(await hasPrivilege({\n category: 'organization',\n privilege: 'mutation',\n domainOwnerGranted: true\n }))\n\n this.amEmployee = await this.askAmEmployee()\n\n this.axis = lifecycle?.resourceId === 'mine' ? 'mine' : 'common'\n this.applyConfig()\n }\n\n /**\n * 내가 사원인가를 서버에 묻는다.\n *\n * `myEmployees` 는 권한이 없다 — 「나는 누구인가」는 권한으로 가릴 사실이 아니다. `employees` 는\n * `employee:query` 를 요구해서, 정작 답이 필요한 일반 사원이 물을 수 없다.\n */\n private async askAmEmployee() {\n const response = await client.query({\n query: gql`\n query {\n myEmployees {\n id\n }\n }\n `\n })\n\n return (response.data?.myEmployees || []).length > 0\n }\n\n async pageUpdated(changes: any, after: any, before: any) {\n if (after?.resourceId === before?.resourceId) {\n return\n }\n\n this.axis = after?.resourceId === 'mine' ? 'mine' : 'common'\n this.applyConfig()\n await this.grist?.fetch()\n }\n\n private applyConfig() {\n /* 고칠 수 있는 축에서만 빈 줄을 내민다 — 적을 수 없는 자리에 적을 칸을 두지 않는다. */\n const editable = this.editable\n\n this.gristConfig = {\n list: {\n fields: ['name', 'model'],\n details: ['updatedAt']\n },\n /*\n * 빈 화면이 **왜 비었는지**를 말한다.\n *\n * 사원이 아닌 사람의 「내 결재선」은 「없는 것」이 아니라 **가질 수 없는 것**이다. 그 둘을 같은\n * 문장으로 말하면, 읽은 사람은 만들면 되는 줄 알고 적다가 저장에서 막힌다.\n */\n emptyNote: this.emptyNote(),\n rows: {\n appendable: editable,\n selectable: { multiple: true }\n },\n columns: [\n { type: 'gutter', gutterName: 'sequence', fixed: true },\n ...(editable ? [{ type: 'gutter', gutterName: 'row-selector', fixed: true, multiple: true }] : []),\n {\n type: 'gutter',\n gutterName: 'button',\n fixed: true,\n /*\n * 고칠 수 없는 축에서는 「고치기」가 아니라 「보기」다. 버튼을 없애지는 않는다 — 공용 결재선이\n * 무엇을 거치는지는 누구나 봐야 한다.\n */\n icon: (record: any) => (!record?.id ? '' : editable ? 'reorder' : 'visibility'),\n iconOnly: false,\n title: (record: any) =>\n !record?.id ? '' : editable ? i18next.t('button.edit') : i18next.t('button.view'),\n width: 72,\n handlers: {\n click: (columns: any, data: any, column: any, record: any) => {\n if (!record.id) {\n return\n }\n\n const popup = openPopup(\n html`\n <approval-line-items-editor-popup\n .confirmCallback=${editable\n ? async (model: any) => {\n await this.updateModel(record, model)\n await this.grist.fetch()\n\n return false\n }\n : undefined}\n .value=${record.model}\n ></approval-line-items-editor-popup>\n `,\n {\n backdrop: true,\n help: 'organization/approval-line-items-editor',\n size: 'large',\n title: editable ? i18next.t('title.approval-line item list') : record.name\n }\n )\n popup.onclosed = () => {\n this.grist?.fetch()\n }\n }\n }\n },\n {\n type: 'string',\n name: 'name',\n fixed: true,\n header: i18next.t('field.name'),\n record: { editable },\n filter: 'search',\n sortable: true,\n width: 220\n },\n {\n /*\n * ── 결재선 자체 ──────────────────────────────────────────────────\n * 이 칸이 이 화면의 이유다. 참조는 결재를 막지 않으므로 결재자와 같은 무게로 읽히면 안 된다 —\n * 표식을 붙여 가른다.\n *\n * 넘치면 잘리므로 `title` 에 전문을 담는다.\n */\n type: 'string',\n name: 'model',\n header: i18next.t('field.approval-line'),\n record: {\n editable: false,\n renderer: (value: any, column: any, record: any) => {\n /* 아직 없는 줄(맨 아래 빈 줄)에는 아무 말도 하지 않는다. */\n if (!record?.id) {\n return html``\n }\n\n const items = Array.isArray(value) ? value : []\n\n if (!items.length) {\n /* 결재자가 없으면 상신이 곧 완료된다. 조용히 빈 칸으로 두지 않는다. */\n return html`<span style=\"color: var(--md-sys-color-error)\"\n >${i18next.t('text.approval-line-empty')}</span\n >`\n }\n\n const plain = items\n .map(item =>\n isReferenceStep(item)\n ? `${this.approverText(item)} (${i18next.t('label.participation-reference')})`\n : this.approverText(item)\n )\n .join(' → ')\n\n return html`\n <span\n title=${plain}\n style=\"display:flex; align-items:center; gap:4px; overflow:hidden; white-space:nowrap\"\n >\n ${items.map(\n (item, index) => html`\n ${index > 0 ? html`<span style=\"color: var(--ui-faint, #8a959c)\">→</span>` : ''}\n <span style=${isReferenceStep(item) ? 'color: var(--ui-muted, #57676f)' : ''}\n >${this.approverText(item)}</span\n >\n ${isReferenceStep(item)\n ? html`<em\n style=\"font-style:normal; font-size:11px; padding:0 4px; border-radius:999px;\n border:1px solid var(--ui-line, #d6dbe0); color: var(--ui-muted, #57676f)\"\n >${i18next.t('label.participation-reference')}</em\n >`\n : ''}\n `\n )}\n </span>\n `\n }\n },\n width: 340\n },\n {\n type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: { editable },\n filter: 'search',\n width: 220\n },\n {\n type: 'resource-object',\n name: 'updater',\n header: i18next.t('field.updater'),\n record: { editable: false },\n sortable: true,\n width: 90\n },\n {\n type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n record: { editable: false },\n sortable: true,\n width: 180\n }\n ],\n sorters: [{ name: 'name' }]\n }\n }\n\n private emptyNote() {\n if (this.axis === 'common') {\n return {\n icon: 'approval',\n title: i18next.t('text.no-common-approval-line-title'),\n description: i18next.t('text.no-common-approval-line-description')\n }\n }\n\n if (!this.amEmployee) {\n return {\n icon: 'badge',\n title: i18next.t('text.not-an-employee-title'),\n description: i18next.t('text.not-an-employee-description')\n }\n }\n\n return {\n icon: 'approval',\n title: i18next.t('text.no-my-approval-line-title'),\n description: i18next.t('text.no-my-approval-line-description')\n }\n }\n\n async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [] }: FetchOption) {\n const response = await client.query({\n query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {\n responses: ${AXES[this.axis].list}(filters: $filters, pagination: $pagination, sortings: $sortings) {\n items {\n id\n name\n description\n ownerType\n model {\n type\n participation\n notifyAfter\n approver {\n id\n name\n description\n controlNo\n }\n }\n updater {\n id\n name\n }\n updatedAt\n }\n total\n }\n }\n `,\n variables: { filters, pagination: { page, limit }, sortings }\n })\n\n return {\n total: response.data.responses.total || 0,\n records: response.data.responses.items || []\n }\n }\n\n private async save() {\n const dirty = this.grist.dirtyRecords\n if (!dirty?.length) {\n return\n }\n\n const patches = dirty.map((record: any) => {\n const patch: any = record.id ? { id: record.id } : {}\n const dirtyFields = record.__dirtyfields__ || {}\n for (const key in dirtyFields) {\n patch[key] = dirtyFields[key].after\n }\n patch.cuFlag = record.__dirty__\n\n /* 공용 축에서 새로 만드는 것은 공용이다 — 서버가 그것을 값으로 안다. */\n if (this.axis === 'common') {\n patch.ownerType = 'Common'\n }\n\n return patch\n })\n\n const response = await client.mutate({\n mutation: gql`\n mutation ($patches: [ApprovalLinePatch!]!) {\n ${AXES[this.axis].updateMultiple}(patches: $patches) {\n name\n }\n }\n `,\n variables: { patches }\n })\n\n if (response.errors) {\n notify({ level: 'error', message: response.errors.map(error => error.message).join('\\n') })\n } else {\n notify({ message: i18next.t('text.saved') })\n }\n\n this.grist.fetch()\n }\n\n private async delete() {\n const ids = (this.grist.selected || []).map((record: any) => record.id).filter(Boolean)\n if (!ids.length) {\n return\n }\n\n if (!await OxPrompt.confirmDelete({ count: this.grist?.selected?.length })) {\n return\n }\n\n const response = await client.mutate({\n mutation: gql`\n mutation ($ids: [String!]!) {\n ${AXES[this.axis].remove}(ids: $ids)\n }\n `,\n variables: { ids }\n })\n\n if (response.errors) {\n notify({ level: 'error', message: response.errors.map(error => error.message).join('\\n') })\n } else {\n notify({ message: i18next.t('text.deleted') })\n }\n\n this.grist.fetch()\n }\n\n /** 결재선의 내용(누가 몇 번째로 결재하나)을 저장한다. */\n private async updateModel(record: any, model: any) {\n const response = await client.mutate({\n mutation: gql`\n mutation ($id: String!, $patch: ApprovalLinePatch!) {\n ${AXES[this.axis].update}(id: $id, patch: $patch) {\n id\n }\n }\n `,\n variables: { id: record.id, patch: { model, cuFlag: 'M' } }\n })\n\n if (response.errors) {\n notify({ level: 'error', message: response.errors.map(error => error.message).join('\\n') })\n } else {\n notify({ message: i18next.t('text.saved') })\n }\n }\n}\n"]}
@@ -2,7 +2,7 @@ import { __decorate, __metadata } from "tslib";
2
2
  import '@operato/data-grist';
3
3
  import '../../component/approval-line-items-editor-popup';
4
4
  import { OxPrompt } from '@operato/popup';
5
- import { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles';
5
+ import { CommonHeaderStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles';
6
6
  import { PageView } from '@operato/shell';
7
7
  import { css, html } from 'lit';
8
8
  import { customElement, property, query } from 'lit/decorators.js';
@@ -19,19 +19,15 @@ let CommonApprovalLineTemplatesPage = class CommonApprovalLineTemplatesPage exte
19
19
  this.mode = isMobileDevice() ? 'CARD' : 'GRID';
20
20
  }
21
21
  static { this.styles = [
22
+ /* The work surface frame for a list screen (ADR-0060 decision 8). */
23
+ WorkSurfacePageStyles,
22
24
  ScrollbarStyles,
23
25
  CommonHeaderStyles,
24
26
  css `
25
- :host { display: flex;
26
-
27
- width: 100%;
28
-
27
+ :host {
29
28
  --grid-record-emphasized-background-color: #8b0000;
30
29
  --grid-record-emphasized-color: #ff6b6b;
31
- }
32
-
33
- ox-grist { flex: 1;
34
- }
30
+ }
35
31
 
36
32
  `
37
33
  ]; }
@@ -58,7 +54,7 @@ let CommonApprovalLineTemplatesPage = class CommonApprovalLineTemplatesPage exte
58
54
  render() {
59
55
  const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID');
60
56
  return html `
61
- <ox-grist .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>
57
+ <ox-grist class="page-fill" .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>
62
58
  </ox-grist>
63
59
  `;
64
60
  }
@@ -235,7 +231,7 @@ let CommonApprovalLineTemplatesPage = class CommonApprovalLineTemplatesPage exte
235
231
  });
236
232
  if (!response.errors) {
237
233
  this.grist.fetch();
238
- notify({ message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') })
234
+ notify({ message: i18next.t('text.deleted')
239
235
  });
240
236
  }
241
237
  else {
@@ -295,8 +291,7 @@ let CommonApprovalLineTemplatesPage = class CommonApprovalLineTemplatesPage exte
295
291
  }
296
292
  });
297
293
  if (!response.errors) {
298
- await document.dispatchEvent(new CustomEvent('notify', { detail: { message: i18next.t('text.info_x_successfully', { x: i18next.t('button.save')
299
- })
294
+ await document.dispatchEvent(new CustomEvent('notify', { detail: { message: i18next.t('text.saved')
300
295
  }
301
296
  }));
302
297
  }
@@ -1 +1 @@
1
- {"version":3,"file":"common-approval-line-templates-page.js","sourceRoot":"","sources":["../../../client/pages/approval-line/common-approval-line-templates-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist'\nimport '../../component/approval-line-items-editor-popup'\n\nimport { OxPrompt } from '@operato/popup'\nimport { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'\nimport { PageView } from '@operato/shell'\nimport { css, html } from 'lit'\n\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { getRenderer, DataGrist, FetchOption } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { isMobileDevice } from '@operato/utils'\n\nimport gql from 'graphql-tag'\n\n@customElement('common-approval-line-templates-page')\nexport class CommonApprovalLineTemplatesPage extends localize(i18next)(ScopedElementsMixin(PageView)) { static styles = [\n ScrollbarStyles,\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 { flex: 1;\n }\n\n `\n ]\n\n @property({ type: Object }) gristConfig: any\n @property({ type: String }) mode: 'CARD' | 'GRID' | 'LIST' = isMobileDevice() ? 'CARD' : 'GRID'\n\n @query('ox-grist') private grist!: DataGrist\n\n get context() { return { title: i18next.t('title.common-approval-line template list'),\n search: { handler: (search: string) => { this.grist.searchText = search\n },\n value: this.grist?.searchText || ''\n },\n help: 'organization/approval-line',\n actions: [\n { icon: 'save',\n title: i18next.t('button.save'),\n action: this.updateApprovalLines.bind(this)\n },\n { icon: 'delete',\n title: i18next.t('button.delete'),\n action: this.deleteApprovalLines.bind(this),\n emphasis: { danger: true\n }\n }\n ]\n }\n }\n\n render() { const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')\n\n return html`\n <ox-grist .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>\n </ox-grist>\n `\n }\n\n async pageInitialized(lifecycle: any) { this.gristConfig = { list: { fields: ['name', 'description'],\n details: ['updatedAt']\n },\n columns: [\n { type: 'gutter', gutterName: 'sequence', fixed: true },\n { type: 'gutter', gutterName: 'row-selector', fixed: true, multiple: true },\n { type: 'gutter',\n gutterName: 'button',\n fixed: true,\n icon: record => (!record ? 'reorder' : record.id ? 'reorder' : ''),\n iconOnly: false,\n title: record => (!record ? i18next.t('button.edit') : record.id ? i18next.t('button.edit') : ''),\n width: 72,\n handlers: { click: (columns, data, column, record, rowIndex) => { if (!record.id) { return\n }\n\n const { id, model } = record\n const popup = openPopup(\n html`\n <approval-line-items-editor-popup\n .confirmCallback=${async model => { await this.updateApprovalLine(id, model)\n await this.grist.fetch()\n }}\n .value=${model}\n ></approval-line-items-editor-popup>\n `,\n { backdrop: true,\n help: 'organization/approval-line-items-editor',\n size: 'large',\n title: i18next.t('title.approval-line item list')\n }\n )\n popup.onclosed = () => { this.grist?.fetch()\n }\n }\n }\n },\n { type: 'string',\n name: 'name',\n fixed: true,\n header: i18next.t('field.name'),\n record: { editable: true\n },\n filter: 'search',\n sortable: true,\n width: 300\n },\n { type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: { editable: true\n },\n filter: 'search',\n width: 325\n },\n { type: 'string',\n name: 'ownerType',\n header: i18next.t('field.owner-type'),\n width: 120\n },\n { type: 'resource-object',\n name: 'owner',\n header: i18next.t('field.owner'),\n record: { editable: false,\n renderer: function (value, column, record, rowIndex, field) { var options = {}\n switch (record.ownerType) { case 'Employee':\n options = { valueField: 'id',\n nameField: 'name',\n descriptionField: 'controlNo'\n }\n break\n case 'Common':\n default:\n return\n }\n\n var dynamicRecord = { ...column.record, options }\n\n return getRenderer(column.type)(value, { ...column, record: dynamicRecord }, record, rowIndex, field)\n }\n },\n width: 180\n },\n { type: 'resource-object',\n name: 'updater',\n header: i18next.t('field.updater'),\n sortable: true,\n width: 90\n },\n { type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n sortable: true,\n width: 180\n }\n ],\n rows: { selectable: { multiple: true\n }\n },\n sorters: [\n { name: 'name'\n }\n ]\n }\n }\n\n async pageUpdated(changes: any, lifecycle: any) { if (this.active) { // do something here when this page just became as active\n }\n }\n\n /*\n * ── 「공용만」은 서버가 정한다 ─────────────────────────────────────────────\n * 전에는 `approvalLines` 를 부르고 화면이 `ownerType eq Common` 필터를 붙였다.\n *\n * `approvalLines` 는 **관리자 축의 읽기**다 — 짝이 되는 쓰기(create·update·deleteApprovalLine)가\n * 권한을 요구하고, 도메인의 결재선을 개인 것까지 전부 준다. 그게 그 축의 뜻이다.\n *\n * 범위를 화면이 붙이면 그 조건은 **이 화면 하나의 약속**이 된다. 같은 쿼리를 다른 화면이나\n * 스크립트가 필터 없이 부르면 남의 개인 결재선이 다 나오고, 아무도 그것을 잘못이라고 말해 주지\n * 않는다.\n *\n * `commonApprovalLines` 가 서버에서 `ownerType: 'Common'` 을 걸어 준다. 쓰기는 그대로 권한 걸린\n * 뮤테이션을 쓴다 — 읽는 범위가 넓어진 것이 아니라, 좁히는 자리가 옮겨진 것이다.\n */\n async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [] }: FetchOption) { const response = await client.query({ query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) { responses: commonApprovalLines(filters: $filters, pagination: $pagination, sortings: $sortings) { items { id\n name\n description\n ownerType\n owner { id\n name\n description\n controlNo\n }\n model { type\n approver { id\n name\n description\n controlNo\n }\n }\n updater { id\n name\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 || []\n }\n }\n\n async deleteApprovalLines() { if (await OxPrompt.confirmDelete({ count: this.grist?.selected?.length })) { const ids = this.grist.selected.map(record => record.id)\n if (ids && ids.length > 0) { const response = await client.mutate({ mutation: gql`\n mutation ($ids: [String!]!) { deleteApprovalLines(ids: $ids)\n }\n `,\n variables: { ids\n }\n })\n\n if (!response.errors) { this.grist.fetch()\n notify({ message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') })\n })\n } else {\n notify({ level: 'error', message: response.errors.map(error => error.message).join('\\n') })\n }\n }\n }\n }\n\n async updateApprovalLines() { let patches = this.grist.dirtyRecords\n if (patches && patches.length) { patches = patches.map(patch => { let patchField: any = patch.id ? { id: patch.id } : {}\n const dirtyFields = patch.__dirtyfields__\n for (let key in dirtyFields) { patchField[key] = dirtyFields[key].after\n }\n\n patchField['ownerType'] = 'Common'\n patchField['owner'] = null\n\n patchField.cuFlag = patch.__dirty__\n\n return patchField\n })\n\n const response = await client.mutate({ mutation: gql`\n mutation ($patches: [ApprovalLinePatch!]!) { updateMultipleApprovalLine(patches: $patches) { name\n }\n }\n `,\n variables: { patches\n }\n })\n\n if (!response.errors) { this.grist.fetch()\n } else {\n notify({ level: 'error', message: response.errors.map(error => error.message).join('\\n') })\n }\n }\n }\n\n async updateApprovalLine(id, model) { const response = await client.mutate({ mutation: gql`\n mutation ($id: String!, $patch: ApprovalLinePatch!) { updateApprovalLine(id: $id, patch: $patch) { id\n name\n model { type\n approver { id\n name\n description\n controlNo\n }\n }\n }\n }\n `,\n variables: { id,\n patch: { model,\n cuFlag: 'M'\n }\n }\n })\n if (!response.errors) { await document.dispatchEvent(\n new CustomEvent('notify', { detail: { message: i18next.t('text.info_x_successfully', { x: i18next.t('button.save')\n })\n }\n })\n )\n } else {\n notify({ level: 'error', message: response.errors.map(error => error.message).join('\\n') })\n }\n }\n}\n"]}
1
+ {"version":3,"file":"common-approval-line-templates-page.js","sourceRoot":"","sources":["../../../client/pages/approval-line/common-approval-line-templates-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist'\nimport '../../component/approval-line-items-editor-popup'\n\nimport { OxPrompt } from '@operato/popup'\nimport { CommonHeaderStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { PageView } from '@operato/shell'\nimport { css, html } from 'lit'\n\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { getRenderer, DataGrist, FetchOption } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { isMobileDevice } from '@operato/utils'\n\nimport gql from 'graphql-tag'\n\n@customElement('common-approval-line-templates-page')\nexport class CommonApprovalLineTemplatesPage extends localize(i18next)(ScopedElementsMixin(PageView)) { static styles = [\n /* The work surface frame for a list screen (ADR-0060 decision 8). */\n WorkSurfacePageStyles,\n ScrollbarStyles,\n CommonHeaderStyles,\n css`\n :host {\n --grid-record-emphasized-background-color: #8b0000;\n --grid-record-emphasized-color: #ff6b6b;\n }\n\n `\n ]\n\n @property({ type: Object }) gristConfig: any\n @property({ type: String }) mode: 'CARD' | 'GRID' | 'LIST' = isMobileDevice() ? 'CARD' : 'GRID'\n\n @query('ox-grist') private grist!: DataGrist\n\n get context() { return { title: i18next.t('title.common-approval-line template list'),\n search: { handler: (search: string) => { this.grist.searchText = search\n },\n value: this.grist?.searchText || ''\n },\n help: 'organization/approval-line',\n actions: [\n { icon: 'save',\n title: i18next.t('button.save'),\n action: this.updateApprovalLines.bind(this)\n },\n { icon: 'delete',\n title: i18next.t('button.delete'),\n action: this.deleteApprovalLines.bind(this),\n emphasis: { danger: true\n }\n }\n ]\n }\n }\n\n render() { const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')\n\n return html`\n <ox-grist class=\"page-fill\" .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>\n </ox-grist>\n `\n }\n\n async pageInitialized(lifecycle: any) { this.gristConfig = { list: { fields: ['name', 'description'],\n details: ['updatedAt']\n },\n columns: [\n { type: 'gutter', gutterName: 'sequence', fixed: true },\n { type: 'gutter', gutterName: 'row-selector', fixed: true, multiple: true },\n { type: 'gutter',\n gutterName: 'button',\n fixed: true,\n icon: record => (!record ? 'reorder' : record.id ? 'reorder' : ''),\n iconOnly: false,\n title: record => (!record ? i18next.t('button.edit') : record.id ? i18next.t('button.edit') : ''),\n width: 72,\n handlers: { click: (columns, data, column, record, rowIndex) => { if (!record.id) { return\n }\n\n const { id, model } = record\n const popup = openPopup(\n html`\n <approval-line-items-editor-popup\n .confirmCallback=${async model => { await this.updateApprovalLine(id, model)\n await this.grist.fetch()\n }}\n .value=${model}\n ></approval-line-items-editor-popup>\n `,\n { backdrop: true,\n help: 'organization/approval-line-items-editor',\n size: 'large',\n title: i18next.t('title.approval-line item list')\n }\n )\n popup.onclosed = () => { this.grist?.fetch()\n }\n }\n }\n },\n { type: 'string',\n name: 'name',\n fixed: true,\n header: i18next.t('field.name'),\n record: { editable: true\n },\n filter: 'search',\n sortable: true,\n width: 300\n },\n { type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: { editable: true\n },\n filter: 'search',\n width: 325\n },\n { type: 'string',\n name: 'ownerType',\n header: i18next.t('field.owner-type'),\n width: 120\n },\n { type: 'resource-object',\n name: 'owner',\n header: i18next.t('field.owner'),\n record: { editable: false,\n renderer: function (value, column, record, rowIndex, field) { var options = {}\n switch (record.ownerType) { case 'Employee':\n options = { valueField: 'id',\n nameField: 'name',\n descriptionField: 'controlNo'\n }\n break\n case 'Common':\n default:\n return\n }\n\n var dynamicRecord = { ...column.record, options }\n\n return getRenderer(column.type)(value, { ...column, record: dynamicRecord }, record, rowIndex, field)\n }\n },\n width: 180\n },\n { type: 'resource-object',\n name: 'updater',\n header: i18next.t('field.updater'),\n sortable: true,\n width: 90\n },\n { type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n sortable: true,\n width: 180\n }\n ],\n rows: { selectable: { multiple: true\n }\n },\n sorters: [\n { name: 'name'\n }\n ]\n }\n }\n\n async pageUpdated(changes: any, lifecycle: any) { if (this.active) { // do something here when this page just became as active\n }\n }\n\n /*\n * ── 「공용만」은 서버가 정한다 ─────────────────────────────────────────────\n * 전에는 `approvalLines` 를 부르고 화면이 `ownerType eq Common` 필터를 붙였다.\n *\n * `approvalLines` 는 **관리자 축의 읽기**다 — 짝이 되는 쓰기(create·update·deleteApprovalLine)가\n * 권한을 요구하고, 도메인의 결재선을 개인 것까지 전부 준다. 그게 그 축의 뜻이다.\n *\n * 범위를 화면이 붙이면 그 조건은 **이 화면 하나의 약속**이 된다. 같은 쿼리를 다른 화면이나\n * 스크립트가 필터 없이 부르면 남의 개인 결재선이 다 나오고, 아무도 그것을 잘못이라고 말해 주지\n * 않는다.\n *\n * `commonApprovalLines` 가 서버에서 `ownerType: 'Common'` 을 걸어 준다. 쓰기는 그대로 권한 걸린\n * 뮤테이션을 쓴다 — 읽는 범위가 넓어진 것이 아니라, 좁히는 자리가 옮겨진 것이다.\n */\n async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [] }: FetchOption) { const response = await client.query({ query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) { responses: commonApprovalLines(filters: $filters, pagination: $pagination, sortings: $sortings) { items { id\n name\n description\n ownerType\n owner { id\n name\n description\n controlNo\n }\n model { type\n approver { id\n name\n description\n controlNo\n }\n }\n updater { id\n name\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 || []\n }\n }\n\n async deleteApprovalLines() { if (await OxPrompt.confirmDelete({ count: this.grist?.selected?.length })) { const ids = this.grist.selected.map(record => record.id)\n if (ids && ids.length > 0) { const response = await client.mutate({ mutation: gql`\n mutation ($ids: [String!]!) { deleteApprovalLines(ids: $ids)\n }\n `,\n variables: { ids\n }\n })\n\n if (!response.errors) { this.grist.fetch()\n notify({ message: i18next.t('text.deleted')\n })\n } else {\n notify({ level: 'error', message: response.errors.map(error => error.message).join('\\n') })\n }\n }\n }\n }\n\n async updateApprovalLines() { let patches = this.grist.dirtyRecords\n if (patches && patches.length) { patches = patches.map(patch => { let patchField: any = patch.id ? { id: patch.id } : {}\n const dirtyFields = patch.__dirtyfields__\n for (let key in dirtyFields) { patchField[key] = dirtyFields[key].after\n }\n\n patchField['ownerType'] = 'Common'\n patchField['owner'] = null\n\n patchField.cuFlag = patch.__dirty__\n\n return patchField\n })\n\n const response = await client.mutate({ mutation: gql`\n mutation ($patches: [ApprovalLinePatch!]!) { updateMultipleApprovalLine(patches: $patches) { name\n }\n }\n `,\n variables: { patches\n }\n })\n\n if (!response.errors) { this.grist.fetch()\n } else {\n notify({ level: 'error', message: response.errors.map(error => error.message).join('\\n') })\n }\n }\n }\n\n async updateApprovalLine(id, model) { const response = await client.mutate({ mutation: gql`\n mutation ($id: String!, $patch: ApprovalLinePatch!) { updateApprovalLine(id: $id, patch: $patch) { id\n name\n model { type\n approver { id\n name\n description\n controlNo\n }\n }\n }\n }\n `,\n variables: { id,\n patch: { model,\n cuFlag: 'M'\n }\n }\n })\n if (!response.errors) { await document.dispatchEvent(\n new CustomEvent('notify', { detail: { message: i18next.t('text.saved')\n }\n })\n )\n } else {\n notify({ level: 'error', message: response.errors.map(error => error.message).join('\\n') })\n }\n }\n}\n"]}