@things-factory/organization 10.1.26 → 10.1.27

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 (24) hide show
  1. package/dist-client/component/approval-line-templates-manager.js +2 -1
  2. package/dist-client/component/approval-line-templates-manager.js.map +1 -1
  3. package/dist-client/pages/approval-line/approval-line-list-page.d.ts +0 -3
  4. package/dist-client/pages/approval-line/approval-line-list-page.js +2 -6
  5. package/dist-client/pages/approval-line/approval-line-list-page.js.map +1 -1
  6. package/dist-client/pages/approval-line/common-approval-line-templates-page.d.ts +0 -3
  7. package/dist-client/pages/approval-line/common-approval-line-templates-page.js +2 -5
  8. package/dist-client/pages/approval-line/common-approval-line-templates-page.js.map +1 -1
  9. package/dist-client/pages/approval-line/my-approval-line-templates-page.d.ts +0 -3
  10. package/dist-client/pages/approval-line/my-approval-line-templates-page.js +2 -5
  11. package/dist-client/pages/approval-line/my-approval-line-templates-page.js.map +1 -1
  12. package/dist-client/pages/department/department-tree-page.d.ts +5 -9
  13. package/dist-client/pages/department/department-tree-page.js +42 -28
  14. package/dist-client/pages/department/department-tree-page.js.map +1 -1
  15. package/dist-client/pages/employee/employee-list-page.js +2 -1
  16. package/dist-client/pages/employee/employee-list-page.js.map +1 -1
  17. package/dist-client/tsconfig.tsbuildinfo +1 -1
  18. package/dist-server/tsconfig.tsbuildinfo +1 -1
  19. package/package.json +9 -6
  20. package/translations/en.json +3 -1
  21. package/translations/ja.json +3 -1
  22. package/translations/ko.json +3 -1
  23. package/translations/ms.json +3 -1
  24. package/translations/zh.json +3 -1
@@ -3,6 +3,7 @@ import '@material/web/icon/icon.js';
3
3
  import gql from 'graphql-tag';
4
4
  import { css, html, LitElement } from 'lit';
5
5
  import { customElement, property, query } from 'lit/decorators.js';
6
+ import { OxPrompt } from '@operato/popup';
6
7
  import { client } from '@operato/graphql';
7
8
  import { i18next, localize } from '@operato/i18n';
8
9
  import { getEditor, getRenderer } from '@operato/data-grist';
@@ -197,7 +198,7 @@ let ApprovalLineTemplatesManager = class ApprovalLineTemplatesManager extends lo
197
198
  }
198
199
  }
199
200
  async _deleteDataItems() {
200
- if (!confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {
201
+ if (!await OxPrompt.confirmDelete()) {
201
202
  return;
202
203
  }
203
204
  this.grist?.deleteSelectedRecords(false);
@@ -1 +1 @@
1
- {"version":3,"file":"approval-line-templates-manager.js","sourceRoot":"","sources":["../../client/component/approval-line-templates-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\n\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { FetchOption, getEditor, getRenderer } from '@operato/data-grist'\nimport { isMobileDevice } from '@operato/utils'\nimport { CommonHeaderStyles } from '@operato/styles'\n\nimport { ApprovalLine } from '../types/approval-line'\n\n/**\n * 결재선 관리를 위해서\n * 1. 결재선 리스트를 조회한다.\n * 2. 결재선을 생성, 삭제, 수정한다.\n */\n@customElement('approval-line-templates-manager')\nexport class ApprovalLineTemplatesManager extends localize(i18next)(LitElement) {\n static styles = [\n CommonHeaderStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n\n background-color: var(--md-sys-color-surface);\n }\n\n ox-grist {\n flex: 1;\n }\n `\n ]\n\n @property({ type: Object }) gristConfig?: any\n @property({ type: Object }) approvalLine?: ApprovalLine\n\n @query('ox-grist') grist?: HTMLElement & { fetch: any; commit: any; deleteSelectedRecords: any; data: any }\n\n render() {\n return html`\n <ox-grist\n .mode=${isMobileDevice() ? 'CARD' : 'GRID'}\n .config=${this.gristConfig}\n .fetchHandler=${this.fetchHandler.bind(this)}\n ></ox-grist>\n\n <div class=\"footer\">\n <button danger @click=${this._deleteDataItems.bind(this)}>\n <md-icon>delete</md-icon>${i18next.t('button.delete')}\n </button>\n <button @click=${this._updateDataItems.bind(this)} done>\n <md-icon>save</md-icon>${i18next.t('button.save')}\n </button>\n </div>\n `\n }\n\n async firstUpdated() {\n this.gristConfig = {\n list: {\n fields: ['name', 'description', 'active']\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']\n },\n width: 140\n },\n {\n type: 'resource-object',\n name: 'approver',\n header: i18next.t('field.approver'),\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 model = this.approvalLine?.model || []\n\n return {\n total: model.length,\n records: model\n }\n }\n\n async _updateDataItems() {\n this.grist?.commit()\n\n const response = await client.mutate({\n mutation: gql`\n mutation ($id: String!, $patch: ApprovalLinePatch!) {\n updateApprovalLine(id: $id, patch: $patch) {\n name\n }\n }\n `,\n variables: {\n id: this.approvalLine!.id,\n patch: {\n model: this.grist?.data.records,\n cuFlag: 'M'\n }\n }\n })\n\n if (!response.errors) {\n await document.dispatchEvent(\n new CustomEvent('notify', {\n detail: {\n message: i18next.t('text.info_x_successfully', {\n x: i18next.t('button.save')\n })\n }\n })\n )\n }\n }\n\n async _deleteDataItems() {\n if (!confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {\n return\n }\n\n this.grist?.deleteSelectedRecords(false)\n }\n}\n"]}
1
+ {"version":3,"file":"approval-line-templates-manager.js","sourceRoot":"","sources":["../../client/component/approval-line-templates-manager.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AAEnC,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAElE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAe,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAErD;;;;GAIG;AAEI,IAAM,4BAA4B,GAAlC,MAAM,4BAA6B,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC;aACtE,WAAM,GAAG;QACd,kBAAkB;QAClB,GAAG,CAAA;;;;;;;;;;;KAWF;KACF,AAdY,CAcZ;IAOD,MAAM;QACJ,OAAO,IAAI,CAAA;;gBAEC,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;kBAChC,IAAI,CAAC,WAAW;wBACV,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;;;gCAIpB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;qCAC3B,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;;yBAEtC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;mCACtB,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;;;KAGtD,CAAA;IACH,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,WAAW,GAAG;YACjB,IAAI,EAAE;gBACJ,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC;aAC1C;YACD,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC9D,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE;gBAC1C;oBACE,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,QAAQ;oBACpB,IAAI,EAAE,cAAc;oBACpB,QAAQ,EAAE;wBACR,KAAK,EAAE,SAAS;qBACjB;iBACF;gBACD;oBACE,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,QAAQ;oBACpB,IAAI,EAAE,gBAAgB;oBACtB,QAAQ,EAAE;wBACR,KAAK,EAAE,WAAW;qBACnB;iBACF;gBACD;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;oBAC/B,MAAM,EAAE;wBACN,QAAQ,EAAE,IAAI;wBACd,OAAO,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC;qBAChD;oBACD,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE,IAAI,EAAE,iBAAiB;oBACvB,IAAI,EAAE,UAAU;oBAChB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;oBACnC,MAAM,EAAE;wBACN,QAAQ,EAAE,IAAI;wBACd,MAAM,EAAE,UAAU,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK;4BACtD,IAAI,OAAO,GAAG,EAAE,CAAA;4BAChB,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;gCACpB,KAAK,UAAU;oCACb,OAAO,GAAG;wCACR,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;wCACvC,SAAS,EAAE,WAAW;wCACtB,OAAO,EAAE;4CACP,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;4CAC5B;gDACE,IAAI,EAAE,WAAW;gDACjB,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,EAAE;gDACzD,MAAM,EAAE,QAAQ;6CACjB;4CACD,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;yCACxF;wCACD,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE;wCACxC,UAAU,EAAE,IAAI;wCAChB,SAAS,EAAE,MAAM;wCACjB,gBAAgB,EAAE,WAAW;qCAC9B,CAAA;oCACD,MAAK;gCACP,KAAK,YAAY;oCACf,OAAO,GAAG;wCACR,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;wCACzC,SAAS,EAAE,aAAa;qCACzB,CAAA;oCACD,MAAK;gCACP,KAAK,MAAM;oCACT,OAAO,GAAG;wCACR,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;wCACrC,SAAS,EAAE,OAAO;qCACnB,CAAA;oCACD,MAAK;gCACP;oCACE,OAAO,GAAG,EAAE,CAAA;4BAChB,CAAC;4BAED,IAAI,aAAa,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAA;4BAEjD,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;wBACrG,CAAC;wBACD,QAAQ,EAAE,UAAU,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK;4BACxD,IAAI,OAAO,GAAG,EAAE,CAAA;4BAChB,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;gCACpB,KAAK,UAAU;oCACb,OAAO,GAAG;wCACR,UAAU,EAAE,IAAI;wCAChB,SAAS,EAAE,MAAM;wCACjB,gBAAgB,EAAE,WAAW;qCAC9B,CAAA;oCACD,MAAK;gCACP,KAAK,YAAY,CAAC;gCAClB,KAAK,MAAM,CAAC;gCACZ;oCACE,MAAK;4BACT,CAAC;4BAED,IAAI,aAAa,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAA;4BAEjD,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;wBACvG,CAAC;qBACF;oBACD,KAAK,EAAE,GAAG;iBACX;aACF;YACD,IAAI,EAAE;gBACJ,UAAU,EAAE;oBACV,QAAQ,EAAE,IAAI;iBACf;aACF;YACD,UAAU,EAAE;gBACV,QAAQ,EAAE,IAAI;aACf;YACD,OAAO,EAAE,EAAE;SACZ,CAAA;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,GAAG,EAAE,EAAe;QACrE,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAA;QAE5C,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,OAAO,EAAE,KAAK;SACf,CAAA;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAA;QAEpB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,GAAG,CAAA;;;;;;OAMZ;YACD,SAAS,EAAE;gBACT,EAAE,EAAE,IAAI,CAAC,YAAa,CAAC,EAAE;gBACzB,KAAK,EAAE;oBACL,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO;oBAC/B,MAAM,EAAE,GAAG;iBACZ;aACF;SACF,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,QAAQ,CAAC,aAAa,CAC1B,IAAI,WAAW,CAAC,QAAQ,EAAE;gBACxB,MAAM,EAAE;oBACN,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,0BAA0B,EAAE;wBAC7C,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;qBAC5B,CAAC;iBACH;aACF,CAAC,CACH,CAAA;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,IAAI,CAAC,MAAM,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC;YACpC,OAAM;QACR,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,qBAAqB,CAAC,KAAK,CAAC,CAAA;IAC1C,CAAC;;AA9L2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;iEAAkB;AACjB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8BAAgB,YAAY;kEAAA;AAEpC;IAAlB,KAAK,CAAC,UAAU,CAAC;;2DAAyF;AApBhG,4BAA4B;IADxC,aAAa,CAAC,iCAAiC,CAAC;GACpC,4BAA4B,CAgNxC","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\n\nimport { OxPrompt } from '@operato/popup'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { FetchOption, getEditor, getRenderer } from '@operato/data-grist'\nimport { isMobileDevice } from '@operato/utils'\nimport { CommonHeaderStyles } from '@operato/styles'\n\nimport { ApprovalLine } from '../types/approval-line'\n\n/**\n * 결재선 관리를 위해서\n * 1. 결재선 리스트를 조회한다.\n * 2. 결재선을 생성, 삭제, 수정한다.\n */\n@customElement('approval-line-templates-manager')\nexport class ApprovalLineTemplatesManager extends localize(i18next)(LitElement) {\n static styles = [\n CommonHeaderStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n\n background-color: var(--md-sys-color-surface);\n }\n\n ox-grist {\n flex: 1;\n }\n `\n ]\n\n @property({ type: Object }) gristConfig?: any\n @property({ type: Object }) approvalLine?: ApprovalLine\n\n @query('ox-grist') grist?: HTMLElement & { fetch: any; commit: any; deleteSelectedRecords: any; data: any }\n\n render() {\n return html`\n <ox-grist\n .mode=${isMobileDevice() ? 'CARD' : 'GRID'}\n .config=${this.gristConfig}\n .fetchHandler=${this.fetchHandler.bind(this)}\n ></ox-grist>\n\n <div class=\"footer\">\n <button danger @click=${this._deleteDataItems.bind(this)}>\n <md-icon>delete</md-icon>${i18next.t('button.delete')}\n </button>\n <button @click=${this._updateDataItems.bind(this)} done>\n <md-icon>save</md-icon>${i18next.t('button.save')}\n </button>\n </div>\n `\n }\n\n async firstUpdated() {\n this.gristConfig = {\n list: {\n fields: ['name', 'description', 'active']\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']\n },\n width: 140\n },\n {\n type: 'resource-object',\n name: 'approver',\n header: i18next.t('field.approver'),\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 model = this.approvalLine?.model || []\n\n return {\n total: model.length,\n records: model\n }\n }\n\n async _updateDataItems() {\n this.grist?.commit()\n\n const response = await client.mutate({\n mutation: gql`\n mutation ($id: String!, $patch: ApprovalLinePatch!) {\n updateApprovalLine(id: $id, patch: $patch) {\n name\n }\n }\n `,\n variables: {\n id: this.approvalLine!.id,\n patch: {\n model: this.grist?.data.records,\n cuFlag: 'M'\n }\n }\n })\n\n if (!response.errors) {\n await document.dispatchEvent(\n new CustomEvent('notify', {\n detail: {\n message: i18next.t('text.info_x_successfully', {\n x: i18next.t('button.save')\n })\n }\n })\n )\n }\n }\n\n async _deleteDataItems() {\n if (!await OxPrompt.confirmDelete()) {\n return\n }\n\n this.grist?.deleteSelectedRecords(false)\n }\n}\n"]}
@@ -70,9 +70,6 @@ export declare class ApprovalLineListPage extends ApprovalLineListPage_base {
70
70
  handler: (search: string) => void;
71
71
  value: string;
72
72
  };
73
- filter: {
74
- handler: () => void;
75
- };
76
73
  help: string;
77
74
  actions: ({
78
75
  icon: string;
@@ -1,6 +1,7 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
2
  import '@operato/data-grist';
3
3
  import '../../component/approval-line-items-editor-popup';
4
+ import { OxPrompt } from '@operato/popup';
4
5
  import { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles';
5
6
  import { navigate, PageView } from '@operato/shell';
6
7
  import { css, html } from 'lit';
@@ -153,11 +154,6 @@ let ApprovalLineListPage = class ApprovalLineListPage extends localize(i18next)(
153
154
  },
154
155
  value: this.grist?.searchText || ''
155
156
  },
156
- filter: {
157
- handler: () => {
158
- this.grist.toggleHeadroom();
159
- }
160
- },
161
157
  help: 'organization/approval-line',
162
158
  /*
163
159
  * 고칠 수 없는 축에서는 저장·삭제 버튼을 두지 않는다.
@@ -513,7 +509,7 @@ let ApprovalLineListPage = class ApprovalLineListPage extends localize(i18next)(
513
509
  if (!ids.length) {
514
510
  return;
515
511
  }
516
- if (!confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {
512
+ if (!await OxPrompt.confirmDelete({ count: this.grist?.selected?.length })) {
517
513
  return;
518
514
  }
519
515
  const response = await client.mutate({
@@ -1 +1 @@
1
- {"version":3,"file":"approval-line-list-page.js","sourceRoot":"","sources":["../../../client/pages/approval-line/approval-line-list-page.ts"],"names":[],"mappings":";AAAA,OAAO,qBAAqB,CAAA;AAC5B,OAAO,kDAAkD,CAAA;AAEzD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAE/B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAe,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAA;AAEpE,OAAO,EAAyB,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAElF,OAAO,GAAG,MAAM,aAAa,CAAA;AAK7B;;;;;GAKG;AACH,MAAM,IAAI,GAA2F;IACnG,MAAM,EAAE;QACN,IAAI,EAAE,qBAAqB;QAC3B,cAAc,EAAE,4BAA4B;QAC5C,MAAM,EAAE,oBAAoB;QAC5B,MAAM,EAAE,qBAAqB;KAC9B;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,iBAAiB;QACvB,cAAc,EAAE,8BAA8B;QAC9C,MAAM,EAAE,sBAAsB;QAC9B,MAAM,EAAE,uBAAuB;KAChC;CACF,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEI,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAAnF;;QAkDuB,SAAI,GAA6B,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;QAI9E,SAAI,GAAS,QAAQ,CAAA;QAEtC;;;;;;;;WAQG;QACc,kBAAa,GAAG,KAAK,CAAA;QAEtC;;;;;;;;WAQG;QACc,eAAU,GAAG,KAAK,CAAA;IA8crC,CAAC;aAzhBQ,WAAM,GAAG;QACd,eAAe;QACf,kBAAkB;QAClB,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA0CF;KACF,AA9CY,CA8CZ;IA+BD,oDAAoD;IACpD,IAAY,QAAQ;QAClB,OAAO,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAA;IACpE,CAAC;IAED,IAAI,OAAO;QACT,OAAO;YACL,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;YACvC,MAAM,EAAE;gBACN,OAAO,EAAE,CAAC,MAAc,EAAE,EAAE;oBAC1B,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAA;gBAChC,CAAC;gBACD,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,EAAE;aACpC;YACD,MAAM,EAAE;gBACN,OAAO,EAAE,GAAG,EAAE;oBACZ,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAA;gBAC7B,CAAC;aACF;YACD,IAAI,EAAE,4BAA4B;YAClC;;;;;eAKG;YACH,OAAO,EAAE,IAAI,CAAC,QAAQ;gBACpB,CAAC,CAAC;oBACE;wBACE,IAAI,EAAE,MAAM;wBACZ,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;wBAC/B,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;qBAC7B;oBACD;wBACE,IAAI,EAAE,QAAQ;wBACd,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;wBACjC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;wBAC9B,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;qBAC3B;iBACF;gBACH,CAAC,CAAC,EAAE;SACP,CAAA;IACH,CAAC;IAED,MAAM;QACJ,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAE9D,OAAO,IAAI,CAAA;;UAGL;YACE,CAAC,QAAQ,EAAE,4BAA4B,CAAC;YACxC,CAAC,MAAM,EAAE,0BAA0B,CAAC;SAEvC,CAAC,GAAG,CACH,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAA;qCACI,IAAI,CAAC,IAAI,KAAK,IAAI,WAAW,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAC7E,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;;WAErB,CACF;;;wBAGe,IAAI,YAAY,IAAI,CAAC,WAAW,kBAAkB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;KACjG,CAAA;IACH,CAAC;IAED;;;;;OAKG;IACK,UAAU,CAAC,IAAU;QAC3B,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACvB,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,oBAAoB,CAAA;QACzD,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAA;IACxD,CAAC;IAED,yDAAyD;IACjD,YAAY,CAAC,IAAS;QAC5B,OAAO,IAAI,EAAE,QAAQ,EAAE,IAAI,IAAI,IAAI,EAAE,QAAQ,EAAE,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAA;IAChG,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAAc;QAClC;;;;;;WAMG;QACH,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC;YACzC,QAAQ,EAAE,cAAc;YACxB,SAAS,EAAE,UAAU;YACrB,kBAAkB,EAAE,IAAI;SACzB,CAAC,CAAC,CAAA;QAEH,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAA;QAE5C,IAAI,CAAC,IAAI,GAAG,SAAS,EAAE,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAA;QAChE,IAAI,CAAC,WAAW,EAAE,CAAA;IACpB,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,aAAa;QACzB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;YAClC,KAAK,EAAE,GAAG,CAAA;;;;;;OAMT;SACF,CAAC,CAAA;QAEF,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;IACtD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAY,EAAE,KAAU,EAAE,MAAW;QACrD,IAAI,KAAK,EAAE,UAAU,KAAK,MAAM,EAAE,UAAU,EAAE,CAAC;YAC7C,OAAM;QACR,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAA;QAC5D,IAAI,CAAC,WAAW,EAAE,CAAA;QAClB,MAAM,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAA;IAC3B,CAAC;IAEO,WAAW;QACjB,uDAAuD;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAE9B,IAAI,CAAC,WAAW,GAAG;YACjB,IAAI,EAAE;gBACJ,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;gBACzB,OAAO,EAAE,CAAC,WAAW,CAAC;aACvB;YACD;;;;;eAKG;YACH,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;YAC3B,IAAI,EAAE;gBACJ,UAAU,EAAE,QAAQ;gBACpB,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;aAC/B;YACD,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE;gBACvD,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClG;oBACE,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,IAAI;oBACX;;;uBAGG;oBACH,IAAI,EAAE,CAAC,MAAW,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;oBAC/E,QAAQ,EAAE,KAAK;oBACf,KAAK,EAAE,CAAC,MAAW,EAAE,EAAE,CACrB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;oBACnF,KAAK,EAAE,EAAE;oBACT,QAAQ,EAAE;wBACR,KAAK,EAAE,CAAC,OAAY,EAAE,IAAS,EAAE,MAAW,EAAE,MAAW,EAAE,EAAE;4BAC3D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gCACf,OAAM;4BACR,CAAC;4BAED,MAAM,KAAK,GAAG,SAAS,CACrB,IAAI,CAAA;;uCAEmB,QAAQ;gCACzB,CAAC,CAAC,KAAK,EAAE,KAAU,EAAE,EAAE;oCACnB,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;oCACrC,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;oCAExB,OAAO,KAAK,CAAA;gCACd,CAAC;gCACH,CAAC,CAAC,SAAS;6BACJ,MAAM,CAAC,KAAK;;iBAExB,EACD;gCACE,QAAQ,EAAE,IAAI;gCACd,IAAI,EAAE,yCAAyC;gCAC/C,IAAI,EAAE,OAAO;gCACb,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI;6BAC3E,CACF,CAAA;4BACD,KAAK,CAAC,QAAQ,GAAG,GAAG,EAAE;gCACpB,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAA;4BACrB,CAAC,CAAA;wBACH,CAAC;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;oBAC/B,MAAM,EAAE,EAAE,QAAQ,EAAE;oBACpB,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE;;;;;;uBAMG;oBACH,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;oBACxC,MAAM,EAAE;wBACN,QAAQ,EAAE,KAAK;wBACf,QAAQ,EAAE,CAAC,KAAU,EAAE,MAAW,EAAE,MAAW,EAAE,EAAE;4BACjD,uCAAuC;4BACvC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;gCAChB,OAAO,IAAI,CAAA,EAAE,CAAA;4BACf,CAAC;4BAED,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;4BAE/C,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gCAClB,4CAA4C;gCAC5C,OAAO,IAAI,CAAA;qBACN,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;kBACxC,CAAA;4BACJ,CAAC;4BAED,MAAM,KAAK,GAAG,KAAK;iCAChB,GAAG,CAAC,IAAI,CAAC,EAAE,CACV,eAAe,CAAC,IAAI,CAAC;gCACnB,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC,GAAG;gCAC9E,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAC5B;iCACA,IAAI,CAAC,KAAK,CAAC,CAAA;4BAEd,OAAO,IAAI,CAAA;;0BAEC,KAAK;;;oBAGX,KAAK,CAAC,GAAG,CACT,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAA;wBACjB,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA,wDAAwD,CAAC,CAAC,CAAC,EAAE;oCACjE,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,EAAE;2BACvE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;;wBAE1B,eAAe,CAAC,IAAI,CAAC;gCACrB,CAAC,CAAC,IAAI,CAAA;;;+BAGC,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC;4BAC7C;gCACJ,CAAC,CAAC,EAAE;qBACP,CACF;;eAEJ,CAAA;wBACH,CAAC;qBACF;oBACD,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,aAAa;oBACnB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;oBACtC,MAAM,EAAE,EAAE,QAAQ,EAAE;oBACpB,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE,IAAI,EAAE,iBAAiB;oBACvB,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;oBAClC,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;oBAC3B,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,EAAE;iBACV;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,WAAW;oBACjB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;oBACrC,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;oBAC3B,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,GAAG;iBACX;aACF;YACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SAC5B,CAAA;IACH,CAAC;IAEO,SAAS;QACf,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,oCAAoC,CAAC;gBACtD,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,0CAA0C,CAAC;aACnE,CAAA;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC;gBAC9C,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,kCAAkC,CAAC;aAC3D,CAAA;QACH,CAAC;QAED,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC;YAClD,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,sCAAsC,CAAC;SAC/D,CAAA;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,EAAE,QAAQ,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAe;QACpF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;YAClC,KAAK,EAAE,GAAG,CAAA;;uBAEO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BpC;YACD,SAAS,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE;SAC9D,CAAC,CAAA;QAEF,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;YACzC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;SAC7C,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAA;QACrC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;YACnB,OAAM;QACR,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,MAAW,EAAE,EAAE;YACxC,MAAM,KAAK,GAAQ,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;YACrD,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,IAAI,EAAE,CAAA;YAChD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;gBAC9B,KAAK,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,CAAA;YACrC,CAAC;YACD,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAA;YAE/B,6CAA6C;YAC7C,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAA;YAC5B,CAAC;YAED,OAAO,KAAK,CAAA;QACd,CAAC,CAAC,CAAA;QAEF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,GAAG,CAAA;;YAEP,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,cAAc;;;;OAInC;YACD,SAAS,EAAE,EAAE,OAAO,EAAE;SACvB,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC7F,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;QAC9C,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;IAEO,KAAK,CAAC,MAAM;QAClB,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAW,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACvF,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAChB,OAAM;QACR,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC3E,OAAM;QACR,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,GAAG,CAAA;;YAEP,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM;;OAE3B;YACD,SAAS,EAAE,EAAE,GAAG,EAAE;SACnB,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC7F,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,CAAA;QAChD,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;IAED,oCAAoC;IAC5B,KAAK,CAAC,WAAW,CAAC,MAAW,EAAE,KAAU;QAC/C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,GAAG,CAAA;;YAEP,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM;;;;OAI3B;YACD,SAAS,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;SAC5D,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC7F,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;;AAxe2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;yDAAiB;AAChB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;kDAAoE;AAEpE;IAA1B,KAAK,CAAC,UAAU,CAAC;8BAAiB,SAAS;mDAAA;AAE3B;IAAhB,KAAK,EAAE;;kDAA8B;AAWrB;IAAhB,KAAK,EAAE;;2DAA8B;AAWrB;IAAhB,KAAK,EAAE;;wDAA2B;AA5ExB,oBAAoB;IADhC,aAAa,CAAC,yBAAyB,CAAC;GAC5B,oBAAoB,CA0hBhC","sourcesContent":["import '@operato/data-grist'\nimport '../../component/approval-line-items-editor-popup'\n\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 filter: {\n handler: () => {\n this.grist.toggleHeadroom()\n }\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 (!confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {\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 } 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"]}
@@ -14,9 +14,6 @@ export declare class CommonApprovalLineTemplatesPage extends CommonApprovalLineT
14
14
  handler: (search: string) => void;
15
15
  value: string;
16
16
  };
17
- filter: {
18
- handler: () => void;
19
- };
20
17
  help: string;
21
18
  actions: ({
22
19
  icon: string;
@@ -1,6 +1,7 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
2
  import '@operato/data-grist';
3
3
  import '../../component/approval-line-items-editor-popup';
4
+ import { OxPrompt } from '@operato/popup';
4
5
  import { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles';
5
6
  import { PageView } from '@operato/shell';
6
7
  import { css, html } from 'lit';
@@ -40,10 +41,6 @@ let CommonApprovalLineTemplatesPage = class CommonApprovalLineTemplatesPage exte
40
41
  this.grist.searchText = search;
41
42
  },
42
43
  value: this.grist?.searchText || '' },
43
- filter: { handler: () => {
44
- this.grist.toggleHeadroom();
45
- }
46
- },
47
44
  help: 'organization/approval-line',
48
45
  actions: [
49
46
  { icon: 'save',
@@ -226,7 +223,7 @@ let CommonApprovalLineTemplatesPage = class CommonApprovalLineTemplatesPage exte
226
223
  };
227
224
  }
228
225
  async deleteApprovalLines() {
229
- if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {
226
+ if (await OxPrompt.confirmDelete({ count: this.grist?.selected?.length })) {
230
227
  const ids = this.grist.selected.map(record => record.id);
231
228
  if (ids && ids.length > 0) {
232
229
  const response = await client.mutate({ mutation: gql `
@@ -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 { 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 filter: { handler: () => { this.grist.toggleHeadroom()\n }\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 (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) { 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":";AAAA,OAAO,qBAAqB,CAAA;AAC5B,OAAO,kDAAkD,CAAA;AAEzD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAE/B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAe,MAAM,qBAAqB,CAAA;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C,OAAO,GAAG,MAAM,aAAa,CAAA;AAGtB,IAAM,+BAA+B,GAArC,MAAM,+BAAgC,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAA9F;;QAmBuB,SAAI,GAA6B,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;IAgRjG,CAAC;aAnSgH,WAAM,GAAG;QACtH,eAAe;QACf,kBAAkB;QAClB,GAAG,CAAA;;;;;;;;;;;;KAYF;KACF,AAhBoH,CAgBpH;IAOD,IAAI,OAAO;QAAS,OAAO,EAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,0CAA0C,CAAC;YAC3F,MAAM,EAAE,EAAU,OAAO,EAAE,CAAC,MAAc,EAAE,EAAE;oBAAa,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAA;gBAC9F,CAAC;gBACM,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,EAAE,EACzC;YACI,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE;gBACP,EAAY,IAAI,EAAE,MAAM;oBACtB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;oBAC/B,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;iBACnD;gBACM,EAAY,IAAI,EAAE,QAAQ;oBACxB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;oBACjC,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC3C,QAAQ,EAAE,EAAc,MAAM,EAAE,IAAI;qBAC5C;iBACA;aACK,EACL,CAAA;IACD,CAAC;IAEA,MAAM;QAAS,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAE3E,OAAO,IAAI,CAAA;wBACS,IAAI,YAAY,IAAI,CAAC,WAAW,kBAAkB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;KAEjG,CAAA;IACJ,CAAC;IAEA,KAAK,CAAC,eAAe,CAAC,SAAc;QAAQ,IAAI,CAAC,WAAW,GAAG,EAAQ,IAAI,EAAE,EAAU,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;gBAChH,OAAO,EAAE,CAAC,WAAW,CAAC;aAC5B;YACI,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE;gBACvD,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC3E,EAAY,IAAI,EAAE,QAAQ;oBACxB,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,IAAI;oBACX,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;oBAClE,QAAQ,EAAE,KAAK;oBACf,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjG,KAAK,EAAE,EAAE;oBACT,QAAQ,EAAE,EAAc,KAAK,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;4BAAiB,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gCAAiB,OAAM;4BAC7I,CAAC;4BAEY,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,MAAM,CAAA;4BAC5B,MAAM,KAAK,GAAG,SAAS,CACrB,IAAI,CAAA;;uCAEmB,KAAK,EAAC,KAAK,EAAC,EAAE;gCAAyB,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;gCAChG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;4BAC7C,CAAC;6BAC2B,KAAK;;iBAEjB,EACD,EAAoB,QAAQ,EAAE,IAAI;gCAChC,IAAI,EAAE,yCAAyC;gCAC/C,IAAI,EAAE,OAAO;gCACb,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC;6BACjE,CACa,CAAA;4BACD,KAAK,CAAC,QAAQ,GAAG,GAAG,EAAE;gCAAmB,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAA;4BACzE,CAAC,CAAA;wBACD,CAAC;qBACA;iBACA;gBACM,EAAY,IAAI,EAAE,QAAQ;oBACxB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;oBAC/B,MAAM,EAAE,EAAc,QAAQ,EAAE,IAAI;qBAC5C;oBACQ,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,GAAG;iBAClB;gBACM,EAAY,IAAI,EAAE,QAAQ;oBACxB,IAAI,EAAE,aAAa;oBACnB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;oBACtC,MAAM,EAAE,EAAc,QAAQ,EAAE,IAAI;qBAC5C;oBACQ,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,GAAG;iBAClB;gBACM,EAAY,IAAI,EAAE,QAAQ;oBACxB,IAAI,EAAE,WAAW;oBACjB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;oBACrC,KAAK,EAAE,GAAG;iBAClB;gBACM,EAAY,IAAI,EAAE,iBAAiB;oBACjC,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;oBAChC,MAAM,EAAE,EAAc,QAAQ,EAAE,KAAK;wBACnC,QAAQ,EAAE,UAAU,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK;4BAAkB,IAAI,OAAO,GAAG,EAAE,CAAA;4BAC1F,QAAQ,MAAM,CAAC,SAAS,EAAE,CAAC;gCAAiB,KAAK,UAAU;oCACvD,OAAO,GAAG,EAAsB,UAAU,EAAE,IAAI;wCAC9C,SAAS,EAAE,MAAM;wCACjB,gBAAgB,EAAE,WAAW;qCAC/C,CAAA;oCACgB,MAAK;gCACP,KAAK,QAAQ,CAAC;gCACd;oCACE,OAAM;4BACvB,CAAC;4BAEY,IAAI,aAAa,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAA;4BAEjD,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;wBAClH,CAAC;qBACA;oBACQ,KAAK,EAAE,GAAG;iBAClB;gBACM,EAAY,IAAI,EAAE,iBAAiB;oBACjC,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;oBAClC,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,EAAE;iBACjB;gBACM,EAAY,IAAI,EAAE,UAAU;oBAC1B,IAAI,EAAE,WAAW;oBACjB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;oBACrC,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,GAAG;iBAClB;aACK;YACD,IAAI,EAAE,EAAU,UAAU,EAAE,EAAY,QAAQ,EAAE,IAAI;iBAC1D;aACA;YACI,OAAO,EAAE;gBACP,EAAY,IAAI,EAAE,MAAM;iBAC9B;aACK;SACL,CAAA;IACD,CAAC;IAEA,KAAK,CAAC,WAAW,CAAC,OAAY,EAAE,SAAc;QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAO,yDAAyD;QACzI,CAAC;IACD,CAAC;IAEA;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,YAAY,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,EAAE,QAAQ,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAe;QAAQ,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAQ,KAAK,EAAE,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;OAyB/I;YACD,SAAS,EAAE,EAAU,OAAO;gBAC1B,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;gBAC3B,QAAQ;aACd;SACA,CAAC,CAAA;QAEC,OAAO,EAAQ,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;YACtD,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;SAChD,CAAA;IACD,CAAC;IAEA,KAAK,CAAC,mBAAmB;QAAS,IAAI,MAAM,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YAAO,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACzK,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAAS,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAY,QAAQ,EAAE,GAAG,CAAA;;;WAG9F;oBACD,SAAS,EAAE,EAAc,GAAG;qBACpC;iBACA,CAAC,CAAA;gBAEK,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;oBAAW,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;oBAClD,MAAM,CAAC,EAAc,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,0BAA0B,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC;qBAC5G,CAAC,CAAA;gBACF,CAAC;qBAAM,CAAC;oBACC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACpG,CAAC;YACD,CAAC;QACD,CAAC;IACD,CAAC;IAEA,KAAK,CAAC,mBAAmB;QAAS,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAA;QACrE,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAAO,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;gBAAW,IAAI,UAAU,GAAQ,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;gBAClI,MAAM,WAAW,GAAG,KAAK,CAAC,eAAe,CAAA;gBACzC,KAAK,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;oBAAW,UAAU,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,CAAA;gBACxF,CAAC;gBAEM,UAAU,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAA;gBAClC,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;gBAE1B,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,CAAA;gBAEnC,OAAO,UAAU,CAAA;YACxB,CAAC,CAAC,CAAA;YAEG,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAU,QAAQ,EAAE,GAAG,CAAA;;;;SAIzD;gBACD,SAAS,EAAE,EAAY,OAAO;iBACpC;aACA,CAAC,CAAA;YAEG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAAS,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;YACvD,CAAC;iBAAM,CAAC;gBACD,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAClG,CAAC;QACD,CAAC;IACD,CAAC;IAEA,KAAK,CAAC,kBAAkB,CAAC,EAAE,EAAE,KAAK;QAAQ,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAQ,QAAQ,EAAE,GAAG,CAAA;;;;;;;;;;;;OAY/F;YACD,SAAS,EAAE,EAAU,EAAE;gBACrB,KAAK,EAAE,EAAY,KAAK;oBACtB,MAAM,EAAE,GAAG;iBACnB;aACA;SACA,CAAC,CAAA;QACC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAAO,MAAM,QAAQ,CAAC,aAAa,CACtD,IAAI,WAAW,CAAC,QAAQ,EAAE,EAAY,MAAM,EAAE,EAAc,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,0BAA0B,EAAE,EAAgB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;qBAC5J,CAAC;iBACD;aACA,CAAC,CACI,CAAA;QACN,CAAC;aAAM,CAAC;YACH,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAChG,CAAC;IACD,CAAC;;AAhR4B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;oEAAiB;AAChB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;6DAAoE;AAEpE;IAA1B,KAAK,CAAC,UAAU,CAAC;8BAAiB,SAAS;8DAAA;AArBjC,+BAA+B;IAD3C,aAAa,CAAC,qCAAqC,CAAC;GACxC,+BAA+B,CAmS3C","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"]}
@@ -14,9 +14,6 @@ export declare class MyApprovalLineTemplatesPage extends MyApprovalLineTemplates
14
14
  handler: (search: string) => void;
15
15
  value: string;
16
16
  };
17
- filter: {
18
- handler: () => void;
19
- };
20
17
  help: string;
21
18
  actions: ({
22
19
  icon: string;
@@ -1,6 +1,7 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
2
  import '@operato/data-grist';
3
3
  import '../../component/approval-line-items-editor-popup';
4
+ import { OxPrompt } from '@operato/popup';
4
5
  import { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles';
5
6
  import { PageView } from '@operato/shell';
6
7
  import { css, html } from 'lit';
@@ -40,10 +41,6 @@ let MyApprovalLineTemplatesPage = class MyApprovalLineTemplatesPage extends loca
40
41
  this.grist.searchText = search;
41
42
  },
42
43
  value: this.grist?.searchText || '' },
43
- filter: { handler: () => {
44
- this.grist.toggleHeadroom();
45
- }
46
- },
47
44
  help: 'organization/approval-line',
48
45
  actions: [
49
46
  { icon: 'save',
@@ -217,7 +214,7 @@ let MyApprovalLineTemplatesPage = class MyApprovalLineTemplatesPage extends loca
217
214
  };
218
215
  }
219
216
  async deleteApprovalLines() {
220
- if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {
217
+ if (await OxPrompt.confirmDelete({ count: this.grist?.selected?.length })) {
221
218
  const ids = this.grist.selected.map(record => record.id);
222
219
  if (ids && ids.length > 0) {
223
220
  const response = await client.mutate({ mutation: gql `
@@ -1 +1 @@
1
- {"version":3,"file":"my-approval-line-templates-page.js","sourceRoot":"","sources":["../../../client/pages/approval-line/my-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 { 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('my-approval-line-templates-page')\nexport class MyApprovalLineTemplatesPage 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.my-approval-line template 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: '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 return false\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 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 record: { editable: false\n },\n sortable: true,\n width: 90\n },\n { type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n record: { editable: false\n },\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 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: myApprovalLines(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 (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) { 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!]!) { deleteMyApprovalLines(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 patchField.cuFlag = patch.__dirty__\n\n return patchField\n })\n\n const response = await client.mutate({ mutation: gql`\n mutation ($patches: [ApprovalLinePatch!]!) { updateMultipleMyApprovalLine(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 /*\n * ── 내 결재선은 `updateMyApprovalLine` 으로 고친다 ─────────────────────────\n * 여기서 `updateApprovalLine` 을 부르고 있었다. 그것은 **관리자 축의 쓰기**다 —\n * `@privilege(category: \"organization\", privilege: \"mutation\", domainOwnerGranted: true)`.\n *\n * 그래서 일반 사원이 **자기 결재선의 내용을 고치면 거절당했다.** 목록 저장은\n * `updateMultipleMyApprovalLine`(권한 없음)으로 제대로 갔는데, 줄을 열어 결재선을 고치는 쪽만\n * 관리자 뮤테이션으로 갔다. 도메인 소유자로 시험하면 `domainOwnerGranted` 로 통과하므로 드러나지\n * 않는다.\n *\n * `updateMyApprovalLine` 은 인자가 같고 권한이 없으며, `ownerType`·`ownerValue` 를 부른 사람의\n * 것으로 강제한다 — 남의 것을 고칠 수 없다.\n */\n async updateApprovalLine(id, model) { const response = await client.mutate({ mutation: gql`\n mutation ($id: String!, $patch: ApprovalLinePatch!) { updateMyApprovalLine(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 /*\n * 실패를 말한다.\n *\n * 전에는 성공했을 때만 알리고 실패하면 아무 말도 없었다. 저장을 눌렀는데 메시지도 없고 저장도\n * 안 된 상태로 남아, 사용자는 저장된 줄로 안다.\n */\n notify({\n level: 'error',\n message: response.errors.map(error => error.message).join('\\n')\n })\n }\n }\n}\n"]}
1
+ {"version":3,"file":"my-approval-line-templates-page.js","sourceRoot":"","sources":["../../../client/pages/approval-line/my-approval-line-templates-page.ts"],"names":[],"mappings":";AAAA,OAAO,qBAAqB,CAAA;AAC5B,OAAO,kDAAkD,CAAA;AAEzD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAE/B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAe,MAAM,qBAAqB,CAAA;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C,OAAO,GAAG,MAAM,aAAa,CAAA;AAGtB,IAAM,2BAA2B,GAAjC,MAAM,2BAA4B,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAA1F;;QAmBuB,SAAI,GAA6B,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;IAyRjG,CAAC;aA5S4G,WAAM,GAAG;QAClH,eAAe;QACf,kBAAkB;QAClB,GAAG,CAAA;;;;;;;;;;;;KAYF;KACF,AAhBgH,CAgBhH;IAOD,IAAI,OAAO;QAAS,OAAO,EAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,sCAAsC,CAAC;YACvF,MAAM,EAAE,EAAU,OAAO,EAAE,CAAC,MAAc,EAAE,EAAE;oBAAa,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAA;gBAC9F,CAAC;gBACM,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,EAAE,EACzC;YACI,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE;gBACP,EAAY,IAAI,EAAE,MAAM;oBACtB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;oBAC/B,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;iBACnD;gBACM,EAAY,IAAI,EAAE,QAAQ;oBACxB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;oBACjC,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC3C,QAAQ,EAAE,EAAc,MAAM,EAAE,IAAI;qBAC5C;iBACA;aACK,EACL,CAAA;IACD,CAAC;IAEA,MAAM;QAAS,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAE3E,OAAO,IAAI,CAAA;wBACS,IAAI,YAAY,IAAI,CAAC,WAAW,kBAAkB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;KAEjG,CAAA;IACJ,CAAC;IAEA,KAAK,CAAC,eAAe,CAAC,SAAc;QAAQ,IAAI,CAAC,WAAW,GAAG,EAAQ,IAAI,EAAE,EAAU,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;gBAChH,OAAO,EAAE,CAAC,WAAW,CAAC;aAC5B;YACI,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE;gBACvD,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC3E,EAAY,IAAI,EAAE,QAAQ;oBACxB,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,IAAI;oBACX,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;oBAClE,QAAQ,EAAE,KAAK;oBACf,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjG,KAAK,EAAE,EAAE;oBACT,QAAQ,EAAE,EAAc,KAAK,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;4BAAiB,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gCAAiB,OAAM;4BAC7I,CAAC;4BAEY,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,MAAM,CAAA;4BAC5B,MAAM,KAAK,GAAG,SAAS,CACrB,IAAI,CAAA;;uCAEmB,KAAK,EAAC,KAAK,EAAC,EAAE;gCAAyB,MAAM,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;gCAChG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;gCAExB,OAAO,KAAK,CAAA;4BACjC,CAAC;6BAC2B,KAAK;;iBAEjB,EACD,EAAoB,QAAQ,EAAE,IAAI;gCAChC,IAAI,EAAE,yCAAyC;gCAC/C,IAAI,EAAE,OAAO;gCACb,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC;6BACjE,CACa,CAAA;4BACD,KAAK,CAAC,QAAQ,GAAG,GAAG,EAAE;gCAAmB,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAA;4BACzE,CAAC,CAAA;wBACD,CAAC;qBACA;iBACA;gBACM,EAAY,IAAI,EAAE,QAAQ;oBACxB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;oBAC/B,MAAM,EAAE,EAAc,QAAQ,EAAE,IAAI;qBAC5C;oBACQ,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,GAAG;iBAClB;gBACM,EAAY,IAAI,EAAE,QAAQ;oBACxB,IAAI,EAAE,aAAa;oBACnB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;oBACtC,MAAM,EAAE,EAAc,QAAQ,EAAE,IAAI;qBAC5C;oBACQ,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,GAAG;iBAClB;gBACM,EAAY,IAAI,EAAE,QAAQ;oBACxB,IAAI,EAAE,WAAW;oBACjB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;oBACrC,KAAK,EAAE,GAAG;iBAClB;gBACM,EAAY,IAAI,EAAE,iBAAiB;oBACjC,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;oBAChC,MAAM,EAAE,EAAc,QAAQ,EAAE,KAAK;wBACnC,QAAQ,EAAE,UAAU,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK;4BAAkB,IAAI,OAAO,GAAG,EAAE,CAAA;4BAC1F,QAAQ,MAAM,CAAC,SAAS,EAAE,CAAC;gCAAiB,KAAK,UAAU;oCACvD,OAAO,GAAG,EAAsB,UAAU,EAAE,IAAI;wCAC9C,SAAS,EAAE,MAAM;wCACjB,gBAAgB,EAAE,WAAW;qCAC/C,CAAA;oCACgB,MAAK;gCACP,KAAK,QAAQ,CAAC;gCACd;oCACE,OAAM;4BACvB,CAAC;4BAEY,IAAI,aAAa,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAA;4BACjD,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;wBAClH,CAAC;qBACA;oBACQ,KAAK,EAAE,GAAG;iBAClB;gBACM,EAAY,IAAI,EAAE,iBAAiB;oBACjC,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;oBAClC,MAAM,EAAE,EAAc,QAAQ,EAAE,KAAK;qBAC7C;oBACQ,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,EAAE;iBACjB;gBACM,EAAY,IAAI,EAAE,UAAU;oBAC1B,IAAI,EAAE,WAAW;oBACjB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;oBACrC,MAAM,EAAE,EAAc,QAAQ,EAAE,KAAK;qBAC7C;oBACQ,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,GAAG;iBAClB;aACK;YACD,IAAI,EAAE,EAAU,UAAU,EAAE,EAAY,QAAQ,EAAE,IAAI;iBAC1D;aACA;YACI,OAAO,EAAE;gBACP,EAAY,IAAI,EAAE,MAAM;iBAC9B;aACK;SACL,CAAA;IACD,CAAC;IAEA,KAAK,CAAC,WAAW,CAAC,OAAY,EAAE,SAAc;QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAO,yDAAyD;QACzI,CAAC;IACD,CAAC;IAEA,KAAK,CAAC,YAAY,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,EAAE,QAAQ,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAe;QAAQ,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAQ,KAAK,EAAE,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;OAyB/I;YACD,SAAS,EAAE,EAAU,OAAO;gBAC1B,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;gBAC3B,QAAQ;aACd;SACA,CAAC,CAAA;QAEC,OAAO,EAAQ,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;YACtD,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;SAChD,CAAA;IACD,CAAC;IAEA,KAAK,CAAC,mBAAmB;QAAS,IAAI,MAAM,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YAAO,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACzK,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAAS,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAY,QAAQ,EAAE,GAAG,CAAA;;;WAG9F;oBACD,SAAS,EAAE,EAAc,GAAG;qBACpC;iBACA,CAAC,CAAA;gBAEK,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;oBAAW,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;oBAClD,MAAM,CAAC,EAAc,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,0BAA0B,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC;qBAC5G,CAAC,CAAA;gBACF,CAAC;qBAAM,CAAC;oBACC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACpG,CAAC;YACD,CAAC;QACD,CAAC;IACD,CAAC;IAEA,KAAK,CAAC,mBAAmB;QAAS,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAA;QACrE,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAAO,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;gBAAW,IAAI,UAAU,GAAQ,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;gBAClI,MAAM,WAAW,GAAG,KAAK,CAAC,eAAe,CAAA;gBACzC,KAAK,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;oBAAW,UAAU,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,CAAA;gBACxF,CAAC;gBACM,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,CAAA;gBAEnC,OAAO,UAAU,CAAA;YACxB,CAAC,CAAC,CAAA;YAEG,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAU,QAAQ,EAAE,GAAG,CAAA;;;;SAIzD;gBACD,SAAS,EAAE,EAAY,OAAO;iBACpC;aACA,CAAC,CAAA;YAEG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAAS,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;YACvD,CAAC;iBAAM,CAAC;gBACD,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAClG,CAAC;QACD,CAAC;IACD,CAAC;IAEA;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,kBAAkB,CAAC,EAAE,EAAE,KAAK;QAAQ,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAQ,QAAQ,EAAE,GAAG,CAAA;;;;;;;;;;;;OAY/F;YACD,SAAS,EAAE,EAAU,EAAE;gBACrB,KAAK,EAAE,EAAY,KAAK;oBACtB,MAAM,EAAE,GAAG;iBACnB;aACA;SACA,CAAC,CAAA;QACC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAAO,MAAM,QAAQ,CAAC,aAAa,CACtD,IAAI,WAAW,CAAC,QAAQ,EAAE,EAAY,MAAM,EAAE,EAAc,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,0BAA0B,EAAE,EAAgB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;qBAC5J,CAAC;iBACD;aACA,CAAC,CACI,CAAA;QACN,CAAC;aAAM,CAAC;YACH;;;;;eAKG;YACH,MAAM,CAAC;gBACL,KAAK,EAAE,OAAO;gBACd,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;aACrE,CAAC,CAAA;QACF,CAAC;IACD,CAAC;;AAzR4B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;gEAAiB;AAChB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;yDAAoE;AAEpE;IAA1B,KAAK,CAAC,UAAU,CAAC;8BAAiB,SAAS;0DAAA;AArBjC,2BAA2B;IADvC,aAAa,CAAC,iCAAiC,CAAC;GACpC,2BAA2B,CA4SvC","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('my-approval-line-templates-page')\nexport class MyApprovalLineTemplatesPage 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.my-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 return false\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 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 record: { editable: false\n },\n sortable: true,\n width: 90\n },\n { type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n record: { editable: false\n },\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 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: myApprovalLines(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!]!) { deleteMyApprovalLines(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 patchField.cuFlag = patch.__dirty__\n\n return patchField\n })\n\n const response = await client.mutate({ mutation: gql`\n mutation ($patches: [ApprovalLinePatch!]!) { updateMultipleMyApprovalLine(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 /*\n * ── 내 결재선은 `updateMyApprovalLine` 으로 고친다 ─────────────────────────\n * 여기서 `updateApprovalLine` 을 부르고 있었다. 그것은 **관리자 축의 쓰기**다 —\n * `@privilege(category: \"organization\", privilege: \"mutation\", domainOwnerGranted: true)`.\n *\n * 그래서 일반 사원이 **자기 결재선의 내용을 고치면 거절당했다.** 목록 저장은\n * `updateMultipleMyApprovalLine`(권한 없음)으로 제대로 갔는데, 줄을 열어 결재선을 고치는 쪽만\n * 관리자 뮤테이션으로 갔다. 도메인 소유자로 시험하면 `domainOwnerGranted` 로 통과하므로 드러나지\n * 않는다.\n *\n * `updateMyApprovalLine` 은 인자가 같고 권한이 없으며, `ownerType`·`ownerValue` 를 부른 사람의\n * 것으로 강제한다 — 남의 것을 고칠 수 없다.\n */\n async updateApprovalLine(id, model) { const response = await client.mutate({ mutation: gql`\n mutation ($id: String!, $patch: ApprovalLinePatch!) { updateMyApprovalLine(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 /*\n * 실패를 말한다.\n *\n * 전에는 성공했을 때만 알리고 실패하면 아무 말도 없었다. 저장을 눌렀는데 메시지도 없고 저장도\n * 안 된 상태로 남아, 사용자는 저장된 줄로 안다.\n */\n notify({\n level: 'error',\n message: response.errors.map(error => error.message).join('\\n')\n })\n }\n }\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import '@operato/data-tree';
2
+ import '@operato/list-state/ox-page-state.js';
2
3
  import { PropertyValues } from 'lit';
3
4
  import { PageView } from '@operato/shell';
4
5
  import { DepartmentImporter } from './department-importer';
@@ -15,17 +16,14 @@ export declare class DepartmentTreePage extends DepartmentTreePage_base {
15
16
  department?: Department;
16
17
  modified: boolean;
17
18
  appendable: boolean;
19
+ /** The first read of the tree; a refresh keeps the tree it has on screen. */
20
+ loading: boolean;
21
+ /** Why the tree could not be read - shown instead of an empty tree (ADR-0060 decision 8). */
22
+ loadError: unknown;
18
23
  departmentView: DepartmentView;
19
24
  get context(): {
20
25
  title: string;
21
26
  help: string;
22
- exportable: {
23
- name: string;
24
- data: () => Promise<void>;
25
- };
26
- importable: {
27
- handler: (records: any) => Promise<void>;
28
- };
29
27
  };
30
28
  render(): import("lit-html").TemplateResult<1>;
31
29
  updated(changes: PropertyValues<this>): void;
@@ -37,7 +35,5 @@ export declare class DepartmentTreePage extends DepartmentTreePage_base {
37
35
  pageInitialized(lifecycle: any): Promise<void>;
38
36
  pageUpdated(changes: any, lifecycle: any): Promise<void>;
39
37
  fetch(): Promise<void>;
40
- exportHandler(): Promise<void>;
41
- importHandler(records: any): Promise<void>;
42
38
  }
43
39
  export {};