@things-factory/organization 10.0.19 → 10.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist-client/component/approval-line-brief.js +93 -36
  2. package/dist-client/component/approval-line-brief.js.map +1 -1
  3. package/dist-client/component/approval-line-items-editor-popup.d.ts +2 -0
  4. package/dist-client/component/approval-line-items-editor-popup.js +27 -9
  5. package/dist-client/component/approval-line-items-editor-popup.js.map +1 -1
  6. package/dist-client/component/approval-line-items-editor.d.ts +7 -1
  7. package/dist-client/component/approval-line-items-editor.js +67 -3
  8. package/dist-client/component/approval-line-items-editor.js.map +1 -1
  9. package/dist-client/component/approval-line-selector.d.ts +2 -0
  10. package/dist-client/component/approval-line-selector.js +40 -9
  11. package/dist-client/component/approval-line-selector.js.map +1 -1
  12. package/dist-client/component/approval-line-view.d.ts +15 -0
  13. package/dist-client/component/approval-line-view.js +177 -41
  14. package/dist-client/component/approval-line-view.js.map +1 -1
  15. package/dist-client/component/assignees-editor-popup.d.ts +2 -0
  16. package/dist-client/component/assignees-editor-popup.js +27 -8
  17. package/dist-client/component/assignees-editor-popup.js.map +1 -1
  18. package/dist-client/component/department-selector.d.ts +2 -0
  19. package/dist-client/component/department-selector.js +27 -8
  20. package/dist-client/component/department-selector.js.map +1 -1
  21. package/dist-client/component/recipients-editor-popup.d.ts +2 -0
  22. package/dist-client/component/recipients-editor-popup.js +27 -8
  23. package/dist-client/component/recipients-editor-popup.js.map +1 -1
  24. package/dist-client/filters-form/ox-filter-department-object.js +11 -1
  25. package/dist-client/filters-form/ox-filter-department-object.js.map +1 -1
  26. package/dist-client/pages/approval-line/approval-line-list-page.d.ts +121 -0
  27. package/dist-client/pages/approval-line/approval-line-list-page.js +583 -0
  28. package/dist-client/pages/approval-line/approval-line-list-page.js.map +1 -0
  29. package/dist-client/pages/approval-line/common-approval-line-templates-page.d.ts +0 -2
  30. package/dist-client/pages/approval-line/common-approval-line-templates-page.js +27 -11
  31. package/dist-client/pages/approval-line/common-approval-line-templates-page.js.map +1 -1
  32. package/dist-client/pages/approval-line/my-approval-line-templates-page.d.ts +0 -2
  33. package/dist-client/pages/approval-line/my-approval-line-templates-page.js +33 -9
  34. package/dist-client/pages/approval-line/my-approval-line-templates-page.js.map +1 -1
  35. package/dist-client/pages/department/department-list-page.d.ts +0 -2
  36. package/dist-client/pages/department/department-list-page.js +2 -6
  37. package/dist-client/pages/department/department-list-page.js.map +1 -1
  38. package/dist-client/pages/department/department-tree-page.d.ts +0 -10
  39. package/dist-client/pages/department/department-tree-page.js +35 -16
  40. package/dist-client/pages/department/department-tree-page.js.map +1 -1
  41. package/dist-client/pages/employee/employee-list-page.d.ts +0 -2
  42. package/dist-client/pages/employee/employee-list-page.js +2 -6
  43. package/dist-client/pages/employee/employee-list-page.js.map +1 -1
  44. package/dist-client/route.d.ts +1 -1
  45. package/dist-client/route.js +9 -0
  46. package/dist-client/route.js.map +1 -1
  47. package/dist-client/tsconfig.tsbuildinfo +1 -1
  48. package/dist-client/types/approval-line.d.ts +64 -0
  49. package/dist-client/types/approval-line.js +67 -0
  50. package/dist-client/types/approval-line.js.map +1 -1
  51. package/dist-server/service/approval-line/approval-line-item.d.ts +40 -0
  52. package/dist-server/service/approval-line/approval-line-item.js +42 -2
  53. package/dist-server/service/approval-line/approval-line-item.js.map +1 -1
  54. package/dist-server/service/approval-line/approval-line-mutation.js +24 -33
  55. package/dist-server/service/approval-line/approval-line-mutation.js.map +1 -1
  56. package/dist-server/service/approval-line/approval-line-query.js +36 -21
  57. package/dist-server/service/approval-line/approval-line-query.js.map +1 -1
  58. package/dist-server/service/employee/employee-query.d.ts +25 -0
  59. package/dist-server/service/employee/employee-query.js +41 -0
  60. package/dist-server/service/employee/employee-query.js.map +1 -1
  61. package/dist-server/service/employee/index.d.ts +1 -0
  62. package/dist-server/service/employee/index.js +3 -0
  63. package/dist-server/service/employee/index.js.map +1 -1
  64. package/dist-server/service/employee/my-employee-refusal.d.ts +22 -0
  65. package/dist-server/service/employee/my-employee-refusal.js +56 -0
  66. package/dist-server/service/employee/my-employee-refusal.js.map +1 -0
  67. package/dist-server/service/employee/my-employee.d.ts +22 -0
  68. package/dist-server/service/employee/my-employee.js +43 -0
  69. package/dist-server/service/employee/my-employee.js.map +1 -0
  70. package/dist-server/tsconfig.tsbuildinfo +1 -1
  71. package/package.json +6 -6
  72. package/spec/unit/my-employee.spec.ts +102 -0
  73. package/things-factory.config.js +1 -0
  74. package/translations/en.json +44 -17
  75. package/translations/ja.json +44 -17
  76. package/translations/ko.json +46 -19
  77. package/translations/ms.json +43 -16
  78. package/translations/zh.json +43 -16
@@ -1,6 +1,5 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
2
  import '@operato/data-tree';
3
- import '@operato/context/ox-context-page-toolbar.js';
4
3
  import { css, html } from 'lit';
5
4
  import { customElement, query, state } from 'lit/decorators.js';
6
5
  import { ScopedElementsMixin } from '@open-wc/scoped-elements';
@@ -79,31 +78,28 @@ let DepartmentTreePage = class DepartmentTreePage extends localize(i18next)(Scop
79
78
  return { 'department-importer': DepartmentImporter
80
79
  };
81
80
  }
81
+ /*
82
+ * 「삭제」는 여기 없다 — 편집 판의 아래 줄에 있다.
83
+ *
84
+ * 이 화면의 삭제는 **선택한 부서 하나**를 지운다. 「저장」·「추가」와 대상이 같다. 전역 버튼 줄에
85
+ * 두면 그 판의 아래 줄 바로 밑에 또 한 줄이 서서, 같은 대상을 다루는 버튼 셋이 두 줄로 갈린다.
86
+ *
87
+ * 대상에서 떨어져 있었다는 표시가 코드에 남아 있었다 — 아무것도 안 고른 채로 누를 수 있어서
88
+ * 「부서를 먼저 선택하세요」 경고창을 띄웠다. 대상 옆에 두고 선택이 없으면 못 누르게 하면 그
89
+ * 경고가 필요 없다.
90
+ */
82
91
  get context() {
83
92
  return { title: i18next.t('title.department list'),
84
93
  help: 'organization/department',
85
- actions: [
86
- { icon: 'delete',
87
- title: i18next.t('button.delete'),
88
- action: this.delete.bind(this),
89
- emphasis: { danger: true
90
- }
91
- }
92
- ].filter(Boolean),
93
94
  exportable: { name: i18next.t('title.department list'),
94
95
  data: this.exportHandler.bind(this)
95
96
  },
96
97
  importable: { handler: this.importHandler.bind(this)
97
- },
98
- toolbar: false
98
+ }
99
99
  };
100
100
  }
101
101
  render() {
102
102
  return html `
103
- <div class="header">
104
- <ox-context-page-toolbar class="actions" .context=${this.context}></ox-context-page-toolbar>
105
- </div>
106
-
107
103
  <content>
108
104
  <ox-tree-vertical
109
105
  .data=${this.root}
@@ -132,6 +128,18 @@ let DepartmentTreePage = class DepartmentTreePage extends localize(i18next)(Scop
132
128
  <button @click=${this.save.bind(this)} ?disabled=${!this.modified} done>
133
129
  <md-icon>save</md-icon>${i18next.t('button.save')}
134
130
  </button>
131
+ <!--
132
+ 글자 없이 아이콘만 둔다. 판이 300px 인데 글자를 붙인 버튼 넷은 안 들어가서 글자가 두
133
+ 줄로 접혔다. 그리고 지우는 일은 눈에 덜 권하는 편이 낫다. 뜻은 툴팁이 말한다.
134
+ -->
135
+ <button
136
+ @click=${this.delete.bind(this)}
137
+ ?disabled=${!this.selected}
138
+ title=${i18next.t('button.delete')}
139
+ danger
140
+ >
141
+ <md-icon>delete</md-icon>
142
+ </button>
135
143
  </div>
136
144
  </div>
137
145
  </content>
@@ -308,7 +316,18 @@ __decorate([
308
316
  ], DepartmentTreePage.prototype, "appendable", void 0);
309
317
  __decorate([
310
318
  query('department-view'),
311
- __metadata("design:type", DepartmentView)
319
+ __metadata("design:type", DepartmentView
320
+ /*
321
+ * 「삭제」는 여기 없다 — 편집 판의 아래 줄에 있다.
322
+ *
323
+ * 이 화면의 삭제는 **선택한 부서 하나**를 지운다. 「저장」·「추가」와 대상이 같다. 전역 버튼 줄에
324
+ * 두면 그 판의 아래 줄 바로 밑에 또 한 줄이 서서, 같은 대상을 다루는 버튼 셋이 두 줄로 갈린다.
325
+ *
326
+ * 대상에서 떨어져 있었다는 표시가 코드에 남아 있었다 — 아무것도 안 고른 채로 누를 수 있어서
327
+ * 「부서를 먼저 선택하세요」 경고창을 띄웠다. 대상 옆에 두고 선택이 없으면 못 누르게 하면 그
328
+ * 경고가 필요 없다.
329
+ */
330
+ )
312
331
  ], DepartmentTreePage.prototype, "departmentView", void 0);
313
332
  DepartmentTreePage = __decorate([
314
333
  customElement('department-tree-page')
@@ -1 +1 @@
1
- {"version":3,"file":"department-tree-page.js","sourceRoot":"","sources":["../../../client/pages/department/department-tree-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-tree'\nimport '@operato/context/ox-context-page-toolbar.js'\n\nimport { css, html, PropertyValues } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'\nimport { CustomAlert, PageView } from '@operato/shell'\n\nimport gql from 'graphql-tag'\n\nimport { DepartmentImporter } from './department-importer'\nimport { Department } from '../../types/department'\n\nimport { DepartmentView } from '../../component/department-view'\n\nconst SubDepartmentFragment = gql`\n fragment SubDepartmentFragment on Department { id\n controlNo\n name\n description\n\n manager { id\n name\n controlNo\n photo\n email\n }\n active\n picture\n\n updater { id\n name\n }\n updatedAt\n }\n`\n\n@customElement('department-tree-page')\nexport class DepartmentTreePage extends localize(i18next)(ScopedElementsMixin(PageView)) { static styles = [\n CommonHeaderStyles,\n ScrollbarStyles,\n css`\n :host { display: flex;\n flex-direction: column;\n\n width: 100%;\n overflow: auto;\n }\n\n content { flex: 1;\n display: flex;\n flex-direction: row;\n }\n\n div[editor] { width: 300px;\n display: flex;\n flex-direction: column;\n }\n\n ox-tree-vertical { flex: 1;\n overflow: auto;\n }\n\n department-view { flex: 1;\n padding: var(--spacing-medium);\n background-color: var(--md-sys-color-surface-variant);\n overflow: auto;\n }\n\n .footer button[disabled] { color: var(--md-sys-color-surface-dim);\n background-color: transparent;\n }\n `\n ]\n\n static get scopedElements() { return { 'department-importer': DepartmentImporter\n }\n }\n\n @state() root?: Department\n @state() selected?: Department\n @state() department?: Department\n @state() modified: boolean = false\n @state() appendable: boolean = false\n\n @query('department-view') departmentView!: DepartmentView\n\n get context() { return { title: i18next.t('title.department list'),\n help: 'organization/department',\n actions: [\n { icon: 'delete',\n title: i18next.t('button.delete'),\n action: this.delete.bind(this),\n emphasis: { danger: true\n }\n }\n ].filter(Boolean),\n exportable: { name: i18next.t('title.department list'),\n data: this.exportHandler.bind(this)\n },\n importable: { handler: this.importHandler.bind(this)\n },\n toolbar: false\n }\n }\n\n render() { return html`\n <div class=\"header\">\n <ox-context-page-toolbar class=\"actions\" .context=${this.context}></ox-context-page-toolbar>\n </div>\n\n <content>\n <ox-tree-vertical\n .data=${this.root}\n .selected=${this.selected}\n @select=${this.onSelect.bind(this)}\n id-property=\"controlNo\"\n label-property=\"name\"\n description-property=\"description\"\n ></ox-tree-vertical>\n\n <div editor>\n <department-view\n .department=${this.department}\n @property-change=${(e: CustomEvent) => { const { controlNo, name } = e.detail || {}\n\n this.modified = true\n this.appendable = controlNo && controlNo !== this.selected?.controlNo && name !== this.selected?.name\n }}\n ></department-view>\n <div class=\"footer\">\n <button @click=${this.reset.bind(this)}><md-icon>restart_alt</md-icon>${i18next.t('button.reset')}</button>\n <div filler></div>\n <button @click=${this.create.bind(this)} ?disabled=${!this.appendable}>\n <md-icon>add</md-icon>${i18next.t('button.add')}\n </button>\n <button @click=${this.save.bind(this)} ?disabled=${!this.modified} done>\n <md-icon>save</md-icon>${i18next.t('button.save')}\n </button>\n </div>\n </div>\n </content>\n `\n }\n\n updated(changes: PropertyValues<this>) { if (changes.has('selected')) { this.modified = false\n this.department = { ...this.selected }\n }\n }\n\n onSelect(e: CustomEvent) { this.selected = e.detail as Department\n this.updateContext()\n }\n\n reset() { this.departmentView.department = {}\n }\n\n async create() { const { id: parentId } = this.department || {}\n const { controlNo, name, description, picture, active, manager } = this.department || {}\n\n var department = { controlNo,\n name,\n description,\n manager,\n active\n } as any\n\n if ((picture as any) instanceof File) { department.picture = picture\n }\n\n if (parentId) { department.parent = { id: parentId }\n }\n\n const response = await client.mutate({ mutation: gql`\n mutation ($department: NewDepartment!) { createDepartment(department: $department) { ...SubDepartmentFragment\n }\n }\n\n ${SubDepartmentFragment}\n `,\n variables: { department\n },\n context: { hasUpload: true\n }\n })\n\n this.selected = response.data.createDepartment\n this.updateContext()\n\n await this.fetch()\n }\n\n async save() { const { id, controlNo, name, description, picture, active, manager } = this.department || {}\n\n if (!id) { await CustomAlert({ type: 'warning',\n title: 'department not selected',\n text: 'Please select department first.',\n confirmButton: { text: i18next.t('button.confirm') }\n })\n\n return\n }\n\n var patch = { controlNo,\n name,\n description,\n active,\n manager\n } as any\n\n if ((picture as any) instanceof File) { patch.picture = picture\n }\n\n const response = await client.mutate({ mutation: gql`\n mutation ($id: String!, $patch: DepartmentPatch!) { updateDepartment(id: $id, patch: $patch) { ...SubDepartmentFragment\n }\n }\n\n ${SubDepartmentFragment}\n `,\n variables: { id,\n patch\n },\n context: { hasUpload: true\n }\n })\n\n this.selected = response.data.updateDepartment\n\n this.fetch()\n }\n\n async delete() { if (!this.selected) { await CustomAlert({ type: 'warning',\n title: 'department not selected',\n text: 'Please select department first.',\n confirmButton: { text: i18next.t('button.confirm') }\n })\n\n return\n }\n\n const children = this.selected?.children\n if (children && children.length > 0) { await CustomAlert({ type: 'warning',\n title: 'Departments with subordinates cannot be deleted.',\n text: 'Department having children cannot be deleted.',\n confirmButton: { text: i18next.t('button.confirm') }\n })\n\n return\n }\n\n if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) { const { id } = this.selected || {}\n\n const response = await client.mutate({ mutation: gql`\n mutation ($id: String!) { deleteDepartment(id: $id)\n }\n `,\n variables: { id\n }\n })\n\n this.selected = {}\n this.updateContext()\n\n await this.fetch()\n }\n }\n\n async pageInitialized(lifecycle: any) { this.fetch()\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 fetch() { const response = await client.query({ query: gql`\n query { responses: departmentRoots { total\n items { ...SubDepartmentFragment\n children { ...SubDepartmentFragment\n children { ...SubDepartmentFragment\n children { ...SubDepartmentFragment\n children { ...SubDepartmentFragment\n children { ...SubDepartmentFragment\n children { ...SubDepartmentFragment\n children { ...SubDepartmentFragment\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n ${SubDepartmentFragment}\n `\n })\n const { items: records, total } = response.data.responses\n\n this.root = records[0]\n }\n\n async exportHandler() {}\n\n async importHandler(records) {}\n}\n"]}
1
+ {"version":3,"file":"department-tree-page.js","sourceRoot":"","sources":["../../../client/pages/department/department-tree-page.ts"],"names":[],"mappings":";AAAA,OAAO,oBAAoB,CAAA;AAE3B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAkB,MAAM,KAAK,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAY,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEtD,OAAO,GAAG,MAAM,aAAa,CAAA;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAEhE,MAAM,qBAAqB,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;CAoBhC,CAAA;AAGM,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAAjF;;QA4CI,aAAQ,GAAY,KAAK,CAAA;QACzB,eAAU,GAAY,KAAK,CAAA;IAyOtC,CAAC;aAtRmG,WAAM,GAAG;QACzG,kBAAkB;QAClB,eAAe;QACf,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA+BF;KACF,AAnCuG,CAmCvG;IAED,MAAM,KAAK,cAAc;QAAS,OAAO,EAAQ,qBAAqB,EAAE,kBAAkB;SAC1F,CAAA;IACD,CAAC;IAUA;;;;;;;;;OASG;IACH,IAAI,OAAO;QAAS,OAAO,EAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;YACxE,IAAI,EAAE,yBAAyB;YAC/B,UAAU,EAAE,EAAU,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;gBAC5D,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;aACzC;YACI,UAAU,EAAE,EAAU,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;aAChE;SACA,CAAA;IACD,CAAC;IAEA,MAAM;QAAS,OAAO,IAAI,CAAA;;;kBAGV,IAAI,CAAC,IAAI;sBACL,IAAI,CAAC,QAAQ;oBACf,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;0BAQlB,IAAI,CAAC,UAAU;+BACV,CAAC,CAAc,EAAE,EAAE;YAAiB,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,CAAA;YAE/F,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;YACpB,IAAI,CAAC,UAAU,GAAG,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC,QAAQ,EAAE,SAAS,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAA;QAClH,CAAC;;;6BAG2B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kCAAkC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;;6BAEhF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU;sCAC3C,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;;6BAEhC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ;uCACtC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;;;;;;;uBAOxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;0BACnB,CAAC,IAAI,CAAC,QAAQ;sBAClB,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;;;;;;;;KAQ3C,CAAA;IACJ,CAAC;IAEA,OAAO,CAAC,OAA6B;QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAAO,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAA;YACnG,IAAI,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAC3C,CAAC;IACD,CAAC;IAEA,QAAQ,CAAC,CAAc;QAAQ,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,MAAoB,CAAA;QACnE,IAAI,CAAC,aAAa,EAAE,CAAA;IACvB,CAAC;IAEA,KAAK;QAAS,IAAI,CAAC,cAAc,CAAC,UAAU,GAAG,EAAE,CAAA;IAClD,CAAC;IAEA,KAAK,CAAC,MAAM;QAAS,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAA;QACjE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAA;QAExF,IAAI,UAAU,GAAG,EAAQ,SAAS;YAChC,IAAI;YACJ,WAAW;YACX,OAAO;YACP,MAAM;SACH,CAAA;QAEL,IAAK,OAAe,YAAY,IAAI,EAAE,CAAC;YAAO,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;QAC7E,CAAC;QAEE,IAAI,QAAQ,EAAE,CAAC;YAAO,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAA;QAC7D,CAAC;QAEE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAQ,QAAQ,EAAE,GAAG,CAAA;;;;;UAKpD,qBAAqB;OACxB;YACD,SAAS,EAAE,EAAU,UAAU;aACnC;YACI,OAAO,EAAE,EAAU,SAAS,EAAE,IAAI;aACtC;SACA,CAAC,CAAA;QAEC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAA;QAC9C,IAAI,CAAC,aAAa,EAAE,CAAA;QAEpB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;IACrB,CAAC;IAEA,KAAK,CAAC,IAAI;QAAS,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAA;QAE7G,IAAI,CAAC,EAAE,EAAE,CAAC;YAAO,MAAM,WAAW,CAAC,EAAU,IAAI,EAAE,SAAS;gBACxD,KAAK,EAAE,yBAAyB;gBAChC,IAAI,EAAE,iCAAiC;gBACvC,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE;aAC1D,CAAC,CAAA;YAEG,OAAM;QACX,CAAC;QAEE,IAAI,KAAK,GAAG,EAAQ,SAAS;YAC3B,IAAI;YACJ,WAAW;YACX,MAAM;YACN,OAAO;SACJ,CAAA;QAEL,IAAK,OAAe,YAAY,IAAI,EAAE,CAAC;YAAO,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;QACxE,CAAC;QAEE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAQ,QAAQ,EAAE,GAAG,CAAA;;;;;UAKpD,qBAAqB;OACxB;YACD,SAAS,EAAE,EAAU,EAAE;gBACrB,KAAK;aACX;YACI,OAAO,EAAE,EAAU,SAAS,EAAE,IAAI;aACtC;SACA,CAAC,CAAA;QAEC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAA;QAE9C,IAAI,CAAC,KAAK,EAAE,CAAA;IACf,CAAC;IAEA,KAAK,CAAC,MAAM;QAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAAO,MAAM,WAAW,CAAC,EAAU,IAAI,EAAE,SAAS;gBACtF,KAAK,EAAE,yBAAyB;gBAChC,IAAI,EAAE,iCAAiC;gBACvC,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE;aAC1D,CAAC,CAAA;YAEG,OAAM;QACX,CAAC;QAEE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAA;QACxC,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAAO,MAAM,WAAW,CAAC,EAAU,IAAI,EAAE,SAAS;gBACpF,KAAK,EAAE,kDAAkD;gBACzD,IAAI,EAAE,+CAA+C;gBACrD,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE;aAC1D,CAAC,CAAA;YAEG,OAAM;QACX,CAAC;QAEE,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAAO,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAA;YAEnH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAU,QAAQ,EAAE,GAAG,CAAA;;;SAGzD;gBACD,SAAS,EAAE,EAAY,EAAE;iBAC/B;aACA,CAAC,CAAA;YAEG,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;YAClB,IAAI,CAAC,aAAa,EAAE,CAAA;YAEpB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;QACvB,CAAC;IACD,CAAC;IAEA,KAAK,CAAC,eAAe,CAAC,SAAc;QAAQ,IAAI,CAAC,KAAK,EAAE,CAAA;IACzD,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,KAAK;QAAS,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAQ,KAAK,EAAE,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;UAqBlE,qBAAqB;OACxB;SACL,CAAC,CAAA;QACC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAA;QAEzD,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IACzB,CAAC;IAEA,KAAK,CAAC,aAAa,KAAI,CAAC;IAExB,KAAK,CAAC,aAAa,CAAC,OAAO,IAAG,CAAC;;AA5OtB;IAAR,KAAK,EAAE;8BAAQ,UAAU;gDAAA;AACjB;IAAR,KAAK,EAAE;8BAAY,UAAU;oDAAA;AACrB;IAAR,KAAK,EAAE;8BAAc,UAAU;sDAAA;AACvB;IAAR,KAAK,EAAE;;oDAA0B;AACzB;IAAR,KAAK,EAAE;;sDAA4B;AAEV;IAAzB,KAAK,CAAC,iBAAiB,CAAC;8BAAkB,cAAc;IAEzD;;;;;;;;;OASG;;0DAXsD;AA/C9C,kBAAkB;IAD9B,aAAa,CAAC,sBAAsB,CAAC;GACzB,kBAAkB,CAsR9B","sourcesContent":["import '@operato/data-tree'\n\nimport { css, html, PropertyValues } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'\nimport { CustomAlert, PageView } from '@operato/shell'\n\nimport gql from 'graphql-tag'\n\nimport { DepartmentImporter } from './department-importer'\nimport { Department } from '../../types/department'\n\nimport { DepartmentView } from '../../component/department-view'\n\nconst SubDepartmentFragment = gql`\n fragment SubDepartmentFragment on Department { id\n controlNo\n name\n description\n\n manager { id\n name\n controlNo\n photo\n email\n }\n active\n picture\n\n updater { id\n name\n }\n updatedAt\n }\n`\n\n@customElement('department-tree-page')\nexport class DepartmentTreePage extends localize(i18next)(ScopedElementsMixin(PageView)) { static styles = [\n CommonHeaderStyles,\n ScrollbarStyles,\n css`\n :host { display: flex;\n flex-direction: column;\n\n width: 100%;\n overflow: auto;\n }\n\n content { flex: 1;\n display: flex;\n flex-direction: row;\n }\n\n div[editor] { width: 300px;\n display: flex;\n flex-direction: column;\n }\n\n ox-tree-vertical { flex: 1;\n overflow: auto;\n }\n\n department-view { flex: 1;\n padding: var(--spacing-medium);\n background-color: var(--md-sys-color-surface-variant);\n overflow: auto;\n }\n\n .footer button[disabled] { color: var(--md-sys-color-surface-dim);\n background-color: transparent;\n }\n `\n ]\n\n static get scopedElements() { return { 'department-importer': DepartmentImporter\n }\n }\n\n @state() root?: Department\n @state() selected?: Department\n @state() department?: Department\n @state() modified: boolean = false\n @state() appendable: boolean = false\n\n @query('department-view') departmentView!: DepartmentView\n\n /*\n * 「삭제」는 여기 없다 — 편집 판의 아래 줄에 있다.\n *\n * 이 화면의 삭제는 **선택한 부서 하나**를 지운다. 「저장」·「추가」와 대상이 같다. 전역 버튼 줄에\n * 두면 그 판의 아래 줄 바로 밑에 또 한 줄이 서서, 같은 대상을 다루는 버튼 셋이 두 줄로 갈린다.\n *\n * 대상에서 떨어져 있었다는 표시가 코드에 남아 있었다 — 아무것도 안 고른 채로 누를 수 있어서\n * 「부서를 먼저 선택하세요」 경고창을 띄웠다. 대상 옆에 두고 선택이 없으면 못 누르게 하면 그\n * 경고가 필요 없다.\n */\n get context() { return { title: i18next.t('title.department list'),\n help: 'organization/department',\n exportable: { name: i18next.t('title.department list'),\n data: this.exportHandler.bind(this)\n },\n importable: { handler: this.importHandler.bind(this)\n }\n }\n }\n\n render() { return html`\n <content>\n <ox-tree-vertical\n .data=${this.root}\n .selected=${this.selected}\n @select=${this.onSelect.bind(this)}\n id-property=\"controlNo\"\n label-property=\"name\"\n description-property=\"description\"\n ></ox-tree-vertical>\n\n <div editor>\n <department-view\n .department=${this.department}\n @property-change=${(e: CustomEvent) => { const { controlNo, name } = e.detail || {}\n\n this.modified = true\n this.appendable = controlNo && controlNo !== this.selected?.controlNo && name !== this.selected?.name\n }}\n ></department-view>\n <div class=\"footer\">\n <button @click=${this.reset.bind(this)}><md-icon>restart_alt</md-icon>${i18next.t('button.reset')}</button>\n <div filler></div>\n <button @click=${this.create.bind(this)} ?disabled=${!this.appendable}>\n <md-icon>add</md-icon>${i18next.t('button.add')}\n </button>\n <button @click=${this.save.bind(this)} ?disabled=${!this.modified} done>\n <md-icon>save</md-icon>${i18next.t('button.save')}\n </button>\n <!--\n 글자 없이 아이콘만 둔다. 판이 300px 인데 글자를 붙인 버튼 넷은 안 들어가서 글자가 두\n 줄로 접혔다. 그리고 지우는 일은 눈에 덜 권하는 편이 낫다. 뜻은 툴팁이 말한다.\n -->\n <button\n @click=${this.delete.bind(this)}\n ?disabled=${!this.selected}\n title=${i18next.t('button.delete')}\n danger\n >\n <md-icon>delete</md-icon>\n </button>\n </div>\n </div>\n </content>\n `\n }\n\n updated(changes: PropertyValues<this>) { if (changes.has('selected')) { this.modified = false\n this.department = { ...this.selected }\n }\n }\n\n onSelect(e: CustomEvent) { this.selected = e.detail as Department\n this.updateContext()\n }\n\n reset() { this.departmentView.department = {}\n }\n\n async create() { const { id: parentId } = this.department || {}\n const { controlNo, name, description, picture, active, manager } = this.department || {}\n\n var department = { controlNo,\n name,\n description,\n manager,\n active\n } as any\n\n if ((picture as any) instanceof File) { department.picture = picture\n }\n\n if (parentId) { department.parent = { id: parentId }\n }\n\n const response = await client.mutate({ mutation: gql`\n mutation ($department: NewDepartment!) { createDepartment(department: $department) { ...SubDepartmentFragment\n }\n }\n\n ${SubDepartmentFragment}\n `,\n variables: { department\n },\n context: { hasUpload: true\n }\n })\n\n this.selected = response.data.createDepartment\n this.updateContext()\n\n await this.fetch()\n }\n\n async save() { const { id, controlNo, name, description, picture, active, manager } = this.department || {}\n\n if (!id) { await CustomAlert({ type: 'warning',\n title: 'department not selected',\n text: 'Please select department first.',\n confirmButton: { text: i18next.t('button.confirm') }\n })\n\n return\n }\n\n var patch = { controlNo,\n name,\n description,\n active,\n manager\n } as any\n\n if ((picture as any) instanceof File) { patch.picture = picture\n }\n\n const response = await client.mutate({ mutation: gql`\n mutation ($id: String!, $patch: DepartmentPatch!) { updateDepartment(id: $id, patch: $patch) { ...SubDepartmentFragment\n }\n }\n\n ${SubDepartmentFragment}\n `,\n variables: { id,\n patch\n },\n context: { hasUpload: true\n }\n })\n\n this.selected = response.data.updateDepartment\n\n this.fetch()\n }\n\n async delete() { if (!this.selected) { await CustomAlert({ type: 'warning',\n title: 'department not selected',\n text: 'Please select department first.',\n confirmButton: { text: i18next.t('button.confirm') }\n })\n\n return\n }\n\n const children = this.selected?.children\n if (children && children.length > 0) { await CustomAlert({ type: 'warning',\n title: 'Departments with subordinates cannot be deleted.',\n text: 'Department having children cannot be deleted.',\n confirmButton: { text: i18next.t('button.confirm') }\n })\n\n return\n }\n\n if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) { const { id } = this.selected || {}\n\n const response = await client.mutate({ mutation: gql`\n mutation ($id: String!) { deleteDepartment(id: $id)\n }\n `,\n variables: { id\n }\n })\n\n this.selected = {}\n this.updateContext()\n\n await this.fetch()\n }\n }\n\n async pageInitialized(lifecycle: any) { this.fetch()\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 fetch() { const response = await client.query({ query: gql`\n query { responses: departmentRoots { total\n items { ...SubDepartmentFragment\n children { ...SubDepartmentFragment\n children { ...SubDepartmentFragment\n children { ...SubDepartmentFragment\n children { ...SubDepartmentFragment\n children { ...SubDepartmentFragment\n children { ...SubDepartmentFragment\n children { ...SubDepartmentFragment\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n ${SubDepartmentFragment}\n `\n })\n const { items: records, total } = response.data.responses\n\n this.root = records[0]\n }\n\n async exportHandler() {}\n\n async importHandler(records) {}\n}\n"]}
@@ -1,5 +1,4 @@
1
1
  import '@operato/data-grist';
2
- import '@operato/context/ox-context-page-toolbar.js';
3
2
  import '@things-factory/contact/dist-client';
4
3
  import { Contact } from '@operato/contact/ox-contact.js';
5
4
  import { FetchOption, GristRecord } from '@operato/data-grist';
@@ -49,7 +48,6 @@ export declare class EmployeeListPage extends EmployeeListPage_base {
49
48
  importable: {
50
49
  handler: (records: any) => Promise<void>;
51
50
  };
52
- toolbar: boolean;
53
51
  };
54
52
  render(): import("lit-html").TemplateResult<1>;
55
53
  pageInitialized(lifecycle: any): Promise<void>;
@@ -1,6 +1,5 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
2
  import '@operato/data-grist';
3
- import '@operato/context/ox-context-page-toolbar.js';
4
3
  import '@things-factory/contact/dist-client';
5
4
  import gql from 'graphql-tag';
6
5
  import { css, html } from 'lit';
@@ -39,7 +38,7 @@ let EmployeeListPage = class EmployeeListPage extends p13n(localize(i18next)(Sco
39
38
  flex: 1;
40
39
  }
41
40
 
42
- .header { grid-template-areas: 'filters actions';
41
+ .header { grid-template-areas: 'filters';
43
42
  }
44
43
  `
45
44
  ]; }
@@ -74,8 +73,7 @@ let EmployeeListPage = class EmployeeListPage extends p13n(localize(i18next)(Sco
74
73
  data: this.exportHandler.bind(this)
75
74
  },
76
75
  importable: { handler: this.importHandler.bind(this)
77
- },
78
- toolbar: false };
76
+ } };
79
77
  }
80
78
  render() {
81
79
  const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID');
@@ -90,8 +88,6 @@ let EmployeeListPage = class EmployeeListPage extends p13n(localize(i18next)(Sco
90
88
  <div class="filters">
91
89
  <ox-filters-form class="filter" autofocus without-search></ox-filters-form>
92
90
  </div>
93
-
94
- <ox-context-page-toolbar class="actions" .context=${this.context}></ox-context-page-toolbar>
95
91
  </div>
96
92
 
97
93
  <ox-grist-personalizer slot="setting"></ox-grist-personalizer>
@@ -1 +1 @@
1
- {"version":3,"file":"employee-list-page.js","sourceRoot":"","sources":["../../../client/pages/employee/employee-list-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist'\nimport '@operato/context/ox-context-page-toolbar.js'\nimport '@things-factory/contact/dist-client'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { Contact } from '@operato/contact/ox-contact.js'\nimport { DataGrist, FetchOption, GristRecord } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { PageView } from '@operato/shell'\nimport { CommonHeaderStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\nimport { p13n } from '@operato/p13n'\n\nimport { EmployeeImporter } from './employee-importer'\n\n@customElement('employee-list-page')\nexport class EmployeeListPage extends p13n(localize(i18next)(ScopedElementsMixin(PageView))) { static styles = [\n ScrollbarStyles,\n CommonGristStyles,\n CommonHeaderStyles,\n css`\n :host { display: flex;\n\n width: 100%;\n\n --ox-pfp-size: 40px;\n\n --grid-record-emphasized-background-color: #8b0000;\n --grid-record-emphasized-color: #ff6b6b;\n }\n\n ox-grist { overflow-y: auto;\n flex: 1;\n }\n\n .header { grid-template-areas: 'filters actions';\n }\n `\n ]\n\n static get scopedElements() { return { 'employee-importer': EmployeeImporter\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.employee 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/employee',\n actions: [\n { icon: 'save',\n title: i18next.t('button.save'),\n action: this.onUpdateEmployee.bind(this)\n },\n { icon: 'delete',\n title: i18next.t('button.delete'),\n action: this.onDeleteEmployee.bind(this),\n emphasis: { danger: true\n }\n }\n ],\n exportable: { name: i18next.t('title.employee list'),\n data: this.exportHandler.bind(this)\n },\n importable: { handler: this.importHandler.bind(this)\n },\n toolbar: false\n }\n }\n\n render() { const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')\n\n return html`\n <ox-grist\n .mode=${mode}\n .config=${this.gristConfig}\n .fetchHandler=${this.fetchHandler.bind(this)}\n .personalConfigProvider=${this.getPagePreferenceProvider('ox-grist')!}\n >\n <div slot=\"headroom\" class=\"header\">\n <div class=\"filters\">\n <ox-filters-form class=\"filter\" autofocus without-search></ox-filters-form>\n </div>\n\n <ox-context-page-toolbar class=\"actions\" .context=${this.context}></ox-context-page-toolbar>\n </div>\n\n <ox-grist-personalizer slot=\"setting\"></ox-grist-personalizer>\n </ox-grist>\n `\n }\n\n async pageInitialized(lifecycle: any) { this.gristConfig = { pagination: { pages: [50, 100, 200] },\n list: { thumbnail: 'profile',\n fields: ['controlNo', 'name'],\n details: ['email', 'department', 'hiredOn', 'updatedAt']\n },\n columns: [\n { type: 'gutter', gutterName: 'sequence', fixed: true },\n { type: 'gutter', gutterName: 'row-selector', multiple: true, fixed: true },\n { type: 'gutter',\n gutterName: 'button',\n header: i18next.t('field.register-account'),\n icon: record => (record.id && !record.user ? 'badge' : ''),\n iconOnly: false,\n title: record => (record.id && !record.user ? i18next.t('button.register-account') : ''),\n width: 80,\n handlers: { click: (columns, data, column, record, rowIndex) => { if (!record || !record.id || record.user) { return\n }\n\n this.attachSystemUser(record)\n }\n }\n },\n { type: 'image',\n name: 'profile',\n header: i18next.t('button.edit-contact'),\n width: 80,\n record: { align: 'center',\n renderer: function (value, column, record, rowIndex, field) { return html`<ox-pfp-view .profile=${record.profile} .name=${record.name || '+'}></ox-pfp-view>`\n }\n },\n handlers: { click: async (columns, data, column, record, rowIndex) => { if (record && record.contact) { this.openContactPopup(record)\n } else { this.openContactSelector(record)\n }\n }\n }\n },\n { type: 'string',\n name: 'controlNo',\n fixed: true,\n header: i18next.t('field.control-no'),\n record: { editable: true,\n mandatory: true\n },\n filter: 'search',\n sortable: true,\n width: 105\n },\n { type: 'string',\n name: 'name',\n fixed: true,\n header: i18next.t('field.name'),\n record: { editable: true,\n mandatory: true\n },\n filter: 'search',\n sortable: true,\n width: 100\n },\n { type: 'string',\n name: 'alias',\n header: i18next.t('label.alias'),\n record: { editable: true\n },\n filter: 'search',\n sortable: false,\n width: 110\n },\n { type: 'resource-object',\n name: 'user',\n header: i18next.t('field.system-user'),\n record: { editable: true,\n options: { title: i18next.t('title.lookup system-user'),\n queryName: 'users',\n basicArgs: { filters: [{ name: 'userType', operator: 'eq', value: 'user' }] },\n descriptionField: 'email',\n columns: [\n { name: 'id', hidden: true },\n { name: 'name', header: i18next.t('field.name'), filter: 'search' },\n { name: 'email', header: i18next.t('field.email'), filter: 'search' }\n ],\n list: { fields: ['name', 'email'] }\n }\n },\n sortable: false,\n filter: 'search',\n width: 100\n },\n { type: 'code',\n name: 'type',\n header: i18next.t('field.type'),\n width: 115,\n sortable: true,\n filter: true,\n record: { editable: true,\n codeName: 'EMPLOYEE_TYPE',\n selectDispOpt: 'name'\n }\n },\n { type: 'department-object',\n name: 'department',\n header: i18next.t('field.department'),\n record: { editable: true\n },\n sortable: false,\n filter: true,\n width: 130\n },\n { type: 'resource-object',\n name: 'supervisor',\n header: i18next.t('field.supervisor'),\n record: { editable: true,\n options: { title: i18next.t('title.employee list'),\n queryName: 'employees',\n pagination: { pages: [50, 100, 200] },\n basicArgs: { filters: [\n { name: 'active',\n operator: 'eq',\n value: true\n }\n ]\n },\n list: { fields: ['controlNo', 'name', 'alias', 'hiredOn'] },\n columns: [\n { name: 'id', hidden: true },\n { name: 'controlNo',\n width: 120,\n header: { renderer: () => i18next.t('field.control-no') },\n filter: 'search',\n sortable: true\n },\n { name: 'name',\n width: 120,\n header: { renderer: () => i18next.t('field.name') },\n filter: 'search',\n sortable: true\n },\n { name: 'alias',\n width: 150,\n header: { renderer: () => i18next.t('label.alias') },\n filter: 'search',\n sortable: true\n },\n { type: 'code',\n name: 'type',\n width: 110,\n header: { renderer: () => i18next.t('label.type') },\n record: { editable: false,\n codeName: 'EMPLOYEE_TYPE',\n selectDispOpt: 'name'\n }\n },\n { type: 'code',\n name: 'jobPosition',\n width: 110,\n header: { renderer: () => i18next.t('label.job-position') },\n record: { editable: false,\n codeName: 'JOB_POSITION',\n selectDispOpt: 'name'\n }\n },\n { type: 'code',\n name: 'jobResponsibility',\n width: 200,\n header: { renderer: () => i18next.t('label.job-responsibility') },\n record: { editable: false,\n codeName: 'JOB_RESPONSIBILITY',\n selectDispOpt: 'name'\n }\n },\n { type: 'date',\n name: 'hiredOn',\n header: { renderer: () => i18next.t('field.hired-on') },\n width: 120\n }\n ],\n valueField: 'id',\n nameField: 'name',\n descriptionField: 'controlNo'\n }\n },\n sortable: false,\n width: 120\n },\n { type: 'string',\n name: 'email',\n header: i18next.t('field.email'),\n width: 200,\n record: { editable: false,\n renderer: function (value, column, record, rowIndex, field) { return record.contact ? record.contact.email : ''\n }\n },\n sortable: false\n },\n { type: 'string',\n name: 'phone',\n header: i18next.t('field.phone'),\n width: 130,\n record: { editable: false,\n renderer: function (value, column, record, rowIndex, field) { return record.contact ? record.contact.phone : ''\n }\n },\n sortable: false\n },\n { type: 'code',\n name: 'jobResponsibility',\n header: i18next.t('label.job-responsibility'),\n width: 175,\n record: { editable: true,\n codeName: 'JOB_RESPONSIBILITY',\n selectDispOpt: 'name'\n },\n filter: true\n },\n { type: 'code',\n name: 'jobPosition',\n header: i18next.t('label.job-position'),\n width: 100,\n record: { editable: true,\n codeName: 'JOB_POSITION',\n selectDispOpt: 'name'\n },\n filter: true\n },\n { type: 'date',\n name: 'hiredOn',\n header: i18next.t('field.hired-on'),\n width: 120,\n record: { editable: true\n },\n sortable: true\n },\n { type: 'date',\n name: 'retiredOn',\n header: i18next.t('label.retired-at'),\n width: 120,\n record: { editable: true\n }\n },\n { type: 'checkbox',\n name: 'active',\n label: true,\n header: i18next.t('field.active'),\n width: 70,\n record: { align: 'center',\n editable: true\n },\n filter: true,\n sortable: false\n },\n { type: 'string',\n name: 'note',\n header: i18next.t('field.note'),\n width: 200,\n record: { editable: true\n },\n filter: 'search'\n },\n { type: 'resource-object',\n name: 'updater',\n header: i18next.t('field.updater'),\n width: 90,\n sortable: false\n },\n { type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n width: 180,\n sortable: true\n },\n { type: 'resource-object',\n name: 'contact',\n hidden: true\n }\n ],\n rows: { selectable: { multiple: true\n }\n },\n sorters: [\n { name: 'controlNo'\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: employees(filters: $filters, pagination: $pagination, sortings: $sortings) { items { id\n controlNo\n name\n alias\n type\n jobResponsibility\n jobPosition\n active\n email\n phone\n user { id\n name\n }\n department { id\n controlNo\n name\n description\n }\n supervisor { id\n name\n controlNo\n }\n note\n hiredOn\n retiredOn\n contact { id\n email\n phone\n address\n }\n profile { left\n top\n zoom\n picture\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 const records = response.data.responses.items\n\n return { total: response.data.responses.total || 0,\n records\n }\n }\n\n async onDeleteEmployee() { 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!]!) { deleteEmployees(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 }\n }\n }\n }\n\n async onUpdateEmployee() { 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: [EmployeePatch!]!) { updateMultipleEmployee(patches: $patches) { name\n }\n }\n `,\n variables: { patches\n }\n })\n\n if (!response.errors) { this.grist.fetch()\n }\n }\n }\n\n async exportHandler() { const exportTargets = this.grist.selected.length ? this.grist.selected : this.grist.dirtyData.records\n const targetFieldSet = new Set([\n 'id',\n 'controlNo',\n 'name',\n 'alias',\n 'type',\n 'hiredOn',\n 'retiredOn',\n 'active',\n 'note'\n ])\n\n return exportTargets.map(employee => { let tempObj = {}\n for (const field of targetFieldSet) { tempObj[field] = employee[field]\n }\n\n return tempObj\n })\n }\n\n async importHandler(records) { const popup = openPopup(\n html`\n <employee-importer\n .employees=${records}\n @imported=${() => { history.back()\n this.grist.fetch()\n }}\n ></employee-importer>\n `,\n { backdrop: true,\n size: 'large',\n title: i18next.t('title.import employee')\n }\n )\n\n popup.onclosed = () => { this.grist.fetch()\n }\n }\n\n async openContactPopup(record: GristRecord) { if (!record.contact?.id) { return\n }\n\n const popup = openPopup(\n html`\n <contact-popup\n .contactId=${record.contact.id}\n @change=${() => { this.grist.fetch()\n }}\n @detach=${() => { this.detachContact(record)\n }}\n detachable\n ></contact-popup>\n `,\n { backdrop: true,\n size: 'large',\n title: i18next.t('title.contact')\n }\n )\n }\n\n async openContactSelector(record: GristRecord) { const popup = openPopup(\n html`\n <contact-selector .confirmCallback=${selected => this.attachContact(record, selected)}></contact-selector>\n `,\n { backdrop: true,\n size: 'large',\n title: i18next.t('title.contact')\n }\n )\n }\n\n async attachContact(record: GristRecord, contact: Contact) { if (record.id) { const response = await client.mutate({ mutation: gql`\n mutation ($id: String!, $contactId: String!) { attachContact(id: $id, contactId: $contactId) { id\n }\n }\n `,\n variables: { id: record.id,\n contactId: contact.id\n }\n })\n\n this.grist.fetch()\n } else if (contact?.id) { this.grist.addRecord({ name: contact.name,\n contact: { id: contact.id,\n name: contact.name,\n email: (contact as any).email,\n phone: (contact as any).phone,\n address: (contact as any).address\n }\n })\n this.grist.refresh()\n await this.grist.requestUpdate()\n\n this.grist.checkDirties()\n }\n }\n\n async detachContact(record) { if (record.id) { const response = await client.mutate({ mutation: gql`\n mutation ($id: String!) { detachContact(id: $id) { id\n }\n }\n `,\n variables: { id: record.id\n }\n })\n\n this.grist.fetch()\n } else { record.contact = null\n this.grist.refresh()\n }\n }\n\n async attachSystemUser(record) { if (!record.user) { await client.mutate({ mutation: gql`\n mutation ($employeeId: String!) { registerEmployeeAsSystemUser(employeeId: $employeeId)\n }\n `,\n variables: { employeeId: record.id\n }\n })\n }\n\n this.grist.fetch()\n }\n}\n"]}
1
+ {"version":3,"file":"employee-list-page.js","sourceRoot":"","sources":["../../../client/pages/employee/employee-list-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist'\nimport '@things-factory/contact/dist-client'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { Contact } from '@operato/contact/ox-contact.js'\nimport { DataGrist, FetchOption, GristRecord } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { PageView } from '@operato/shell'\nimport { CommonHeaderStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\nimport { p13n } from '@operato/p13n'\n\nimport { EmployeeImporter } from './employee-importer'\n\n@customElement('employee-list-page')\nexport class EmployeeListPage extends p13n(localize(i18next)(ScopedElementsMixin(PageView))) { static styles = [\n ScrollbarStyles,\n CommonGristStyles,\n CommonHeaderStyles,\n css`\n :host { display: flex;\n\n width: 100%;\n\n --ox-pfp-size: 40px;\n\n --grid-record-emphasized-background-color: #8b0000;\n --grid-record-emphasized-color: #ff6b6b;\n }\n\n ox-grist { overflow-y: auto;\n flex: 1;\n }\n\n .header { grid-template-areas: 'filters';\n }\n `\n ]\n\n static get scopedElements() { return { 'employee-importer': EmployeeImporter\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.employee 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/employee',\n actions: [\n { icon: 'save',\n title: i18next.t('button.save'),\n action: this.onUpdateEmployee.bind(this)\n },\n { icon: 'delete',\n title: i18next.t('button.delete'),\n action: this.onDeleteEmployee.bind(this),\n emphasis: { danger: true\n }\n }\n ],\n exportable: { name: i18next.t('title.employee list'),\n data: this.exportHandler.bind(this)\n },\n importable: { handler: this.importHandler.bind(this)\n }\n }\n }\n\n render() { const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')\n\n return html`\n <ox-grist\n .mode=${mode}\n .config=${this.gristConfig}\n .fetchHandler=${this.fetchHandler.bind(this)}\n .personalConfigProvider=${this.getPagePreferenceProvider('ox-grist')!}\n >\n <div slot=\"headroom\" class=\"header\">\n <div class=\"filters\">\n <ox-filters-form class=\"filter\" autofocus without-search></ox-filters-form>\n </div>\n </div>\n\n <ox-grist-personalizer slot=\"setting\"></ox-grist-personalizer>\n </ox-grist>\n `\n }\n\n async pageInitialized(lifecycle: any) { this.gristConfig = { pagination: { pages: [50, 100, 200] },\n list: { thumbnail: 'profile',\n fields: ['controlNo', 'name'],\n details: ['email', 'department', 'hiredOn', 'updatedAt']\n },\n columns: [\n { type: 'gutter', gutterName: 'sequence', fixed: true },\n { type: 'gutter', gutterName: 'row-selector', multiple: true, fixed: true },\n { type: 'gutter',\n gutterName: 'button',\n header: i18next.t('field.register-account'),\n icon: record => (record.id && !record.user ? 'badge' : ''),\n iconOnly: false,\n title: record => (record.id && !record.user ? i18next.t('button.register-account') : ''),\n width: 80,\n handlers: { click: (columns, data, column, record, rowIndex) => { if (!record || !record.id || record.user) { return\n }\n\n this.attachSystemUser(record)\n }\n }\n },\n { type: 'image',\n name: 'profile',\n header: i18next.t('button.edit-contact'),\n width: 80,\n record: { align: 'center',\n renderer: function (value, column, record, rowIndex, field) { return html`<ox-pfp-view .profile=${record.profile} .name=${record.name || '+'}></ox-pfp-view>`\n }\n },\n handlers: { click: async (columns, data, column, record, rowIndex) => { if (record && record.contact) { this.openContactPopup(record)\n } else { this.openContactSelector(record)\n }\n }\n }\n },\n { type: 'string',\n name: 'controlNo',\n fixed: true,\n header: i18next.t('field.control-no'),\n record: { editable: true,\n mandatory: true\n },\n filter: 'search',\n sortable: true,\n width: 105\n },\n { type: 'string',\n name: 'name',\n fixed: true,\n header: i18next.t('field.name'),\n record: { editable: true,\n mandatory: true\n },\n filter: 'search',\n sortable: true,\n width: 100\n },\n { type: 'string',\n name: 'alias',\n header: i18next.t('label.alias'),\n record: { editable: true\n },\n filter: 'search',\n sortable: false,\n width: 110\n },\n { type: 'resource-object',\n name: 'user',\n header: i18next.t('field.system-user'),\n record: { editable: true,\n options: { title: i18next.t('title.lookup system-user'),\n queryName: 'users',\n basicArgs: { filters: [{ name: 'userType', operator: 'eq', value: 'user' }] },\n descriptionField: 'email',\n columns: [\n { name: 'id', hidden: true },\n { name: 'name', header: i18next.t('field.name'), filter: 'search' },\n { name: 'email', header: i18next.t('field.email'), filter: 'search' }\n ],\n list: { fields: ['name', 'email'] }\n }\n },\n sortable: false,\n filter: 'search',\n width: 100\n },\n { type: 'code',\n name: 'type',\n header: i18next.t('field.type'),\n width: 115,\n sortable: true,\n filter: true,\n record: { editable: true,\n codeName: 'EMPLOYEE_TYPE',\n selectDispOpt: 'name'\n }\n },\n { type: 'department-object',\n name: 'department',\n header: i18next.t('field.department'),\n record: { editable: true\n },\n sortable: false,\n filter: true,\n width: 130\n },\n { type: 'resource-object',\n name: 'supervisor',\n header: i18next.t('field.supervisor'),\n record: { editable: true,\n options: { title: i18next.t('title.employee list'),\n queryName: 'employees',\n pagination: { pages: [50, 100, 200] },\n basicArgs: { filters: [\n { name: 'active',\n operator: 'eq',\n value: true\n }\n ]\n },\n list: { fields: ['controlNo', 'name', 'alias', 'hiredOn'] },\n columns: [\n { name: 'id', hidden: true },\n { name: 'controlNo',\n width: 120,\n header: { renderer: () => i18next.t('field.control-no') },\n filter: 'search',\n sortable: true\n },\n { name: 'name',\n width: 120,\n header: { renderer: () => i18next.t('field.name') },\n filter: 'search',\n sortable: true\n },\n { name: 'alias',\n width: 150,\n header: { renderer: () => i18next.t('label.alias') },\n filter: 'search',\n sortable: true\n },\n { type: 'code',\n name: 'type',\n width: 110,\n header: { renderer: () => i18next.t('label.type') },\n record: { editable: false,\n codeName: 'EMPLOYEE_TYPE',\n selectDispOpt: 'name'\n }\n },\n { type: 'code',\n name: 'jobPosition',\n width: 110,\n header: { renderer: () => i18next.t('label.job-position') },\n record: { editable: false,\n codeName: 'JOB_POSITION',\n selectDispOpt: 'name'\n }\n },\n { type: 'code',\n name: 'jobResponsibility',\n width: 200,\n header: { renderer: () => i18next.t('label.job-responsibility') },\n record: { editable: false,\n codeName: 'JOB_RESPONSIBILITY',\n selectDispOpt: 'name'\n }\n },\n { type: 'date',\n name: 'hiredOn',\n header: { renderer: () => i18next.t('field.hired-on') },\n width: 120\n }\n ],\n valueField: 'id',\n nameField: 'name',\n descriptionField: 'controlNo'\n }\n },\n sortable: false,\n width: 120\n },\n { type: 'string',\n name: 'email',\n header: i18next.t('field.email'),\n width: 200,\n record: { editable: false,\n renderer: function (value, column, record, rowIndex, field) { return record.contact ? record.contact.email : ''\n }\n },\n sortable: false\n },\n { type: 'string',\n name: 'phone',\n header: i18next.t('field.phone'),\n width: 130,\n record: { editable: false,\n renderer: function (value, column, record, rowIndex, field) { return record.contact ? record.contact.phone : ''\n }\n },\n sortable: false\n },\n { type: 'code',\n name: 'jobResponsibility',\n header: i18next.t('label.job-responsibility'),\n width: 175,\n record: { editable: true,\n codeName: 'JOB_RESPONSIBILITY',\n selectDispOpt: 'name'\n },\n filter: true\n },\n { type: 'code',\n name: 'jobPosition',\n header: i18next.t('label.job-position'),\n width: 100,\n record: { editable: true,\n codeName: 'JOB_POSITION',\n selectDispOpt: 'name'\n },\n filter: true\n },\n { type: 'date',\n name: 'hiredOn',\n header: i18next.t('field.hired-on'),\n width: 120,\n record: { editable: true\n },\n sortable: true\n },\n { type: 'date',\n name: 'retiredOn',\n header: i18next.t('label.retired-at'),\n width: 120,\n record: { editable: true\n }\n },\n { type: 'checkbox',\n name: 'active',\n label: true,\n header: i18next.t('field.active'),\n width: 70,\n record: { align: 'center',\n editable: true\n },\n filter: true,\n sortable: false\n },\n { type: 'string',\n name: 'note',\n header: i18next.t('field.note'),\n width: 200,\n record: { editable: true\n },\n filter: 'search'\n },\n { type: 'resource-object',\n name: 'updater',\n header: i18next.t('field.updater'),\n width: 90,\n sortable: false\n },\n { type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n width: 180,\n sortable: true\n },\n { type: 'resource-object',\n name: 'contact',\n hidden: true\n }\n ],\n rows: { selectable: { multiple: true\n }\n },\n sorters: [\n { name: 'controlNo'\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: employees(filters: $filters, pagination: $pagination, sortings: $sortings) { items { id\n controlNo\n name\n alias\n type\n jobResponsibility\n jobPosition\n active\n email\n phone\n user { id\n name\n }\n department { id\n controlNo\n name\n description\n }\n supervisor { id\n name\n controlNo\n }\n note\n hiredOn\n retiredOn\n contact { id\n email\n phone\n address\n }\n profile { left\n top\n zoom\n picture\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 const records = response.data.responses.items\n\n return { total: response.data.responses.total || 0,\n records\n }\n }\n\n async onDeleteEmployee() { 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!]!) { deleteEmployees(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 }\n }\n }\n }\n\n async onUpdateEmployee() { 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: [EmployeePatch!]!) { updateMultipleEmployee(patches: $patches) { name\n }\n }\n `,\n variables: { patches\n }\n })\n\n if (!response.errors) { this.grist.fetch()\n }\n }\n }\n\n async exportHandler() { const exportTargets = this.grist.selected.length ? this.grist.selected : this.grist.dirtyData.records\n const targetFieldSet = new Set([\n 'id',\n 'controlNo',\n 'name',\n 'alias',\n 'type',\n 'hiredOn',\n 'retiredOn',\n 'active',\n 'note'\n ])\n\n return exportTargets.map(employee => { let tempObj = {}\n for (const field of targetFieldSet) { tempObj[field] = employee[field]\n }\n\n return tempObj\n })\n }\n\n async importHandler(records) { const popup = openPopup(\n html`\n <employee-importer\n .employees=${records}\n @imported=${() => { history.back()\n this.grist.fetch()\n }}\n ></employee-importer>\n `,\n { backdrop: true,\n size: 'large',\n title: i18next.t('title.import employee')\n }\n )\n\n popup.onclosed = () => { this.grist.fetch()\n }\n }\n\n async openContactPopup(record: GristRecord) { if (!record.contact?.id) { return\n }\n\n const popup = openPopup(\n html`\n <contact-popup\n .contactId=${record.contact.id}\n @change=${() => { this.grist.fetch()\n }}\n @detach=${() => { this.detachContact(record)\n }}\n detachable\n ></contact-popup>\n `,\n { backdrop: true,\n size: 'large',\n title: i18next.t('title.contact')\n }\n )\n }\n\n async openContactSelector(record: GristRecord) { const popup = openPopup(\n html`\n <contact-selector .confirmCallback=${selected => this.attachContact(record, selected)}></contact-selector>\n `,\n { backdrop: true,\n size: 'large',\n title: i18next.t('title.contact')\n }\n )\n }\n\n async attachContact(record: GristRecord, contact: Contact) { if (record.id) { const response = await client.mutate({ mutation: gql`\n mutation ($id: String!, $contactId: String!) { attachContact(id: $id, contactId: $contactId) { id\n }\n }\n `,\n variables: { id: record.id,\n contactId: contact.id\n }\n })\n\n this.grist.fetch()\n } else if (contact?.id) { this.grist.addRecord({ name: contact.name,\n contact: { id: contact.id,\n name: contact.name,\n email: (contact as any).email,\n phone: (contact as any).phone,\n address: (contact as any).address\n }\n })\n this.grist.refresh()\n await this.grist.requestUpdate()\n\n this.grist.checkDirties()\n }\n }\n\n async detachContact(record) { if (record.id) { const response = await client.mutate({ mutation: gql`\n mutation ($id: String!) { detachContact(id: $id) { id\n }\n }\n `,\n variables: { id: record.id\n }\n })\n\n this.grist.fetch()\n } else { record.contact = null\n this.grist.refresh()\n }\n }\n\n async attachSystemUser(record) { if (!record.user) { await client.mutate({ mutation: gql`\n mutation ($employeeId: String!) { registerEmployeeAsSystemUser(employeeId: $employeeId)\n }\n `,\n variables: { employeeId: record.id\n }\n })\n }\n\n this.grist.fetch()\n }\n}\n"]}
@@ -1 +1 @@
1
- export default function route(page: string): "employees-by-department" | "common-approval-line-templates-page" | "my-approval-line-templates-page" | "employee-list" | "department-tree" | "department-list" | undefined;
1
+ export default function route(page: string): "employees-by-department" | "approval-line-list" | "common-approval-line-templates-page" | "my-approval-line-templates-page" | "employee-list" | "department-tree" | "department-list" | undefined;
@@ -12,6 +12,15 @@ export default function route(page) {
12
12
  case 'employees-by-department':
13
13
  import('./pages/employee/employees-by-department');
14
14
  return page;
15
+ /* 공용과 내 것을 한 목록에 — 아래 둘을 대신한다. */
16
+ case 'approval-line-list':
17
+ import('./pages/approval-line/approval-line-list-page');
18
+ return page;
19
+ /*
20
+ * 아래 두 화면은 아직 살아 있다. operato-dataset · operato-gangsters · operato-twin 의 메뉴가 이 두
21
+ * 주소를 가리킨다. 지금 지우면 그 세 앱의 메뉴가 아무 데도 안 닿는다. operato-plant 만 새 화면으로
22
+ * 돌렸고, 나머지가 옮겨 온 뒤에 지운다.
23
+ */
15
24
  case 'common-approval-line-templates-page':
16
25
  import('./pages/approval-line/common-approval-line-templates-page');
17
26
  return page;
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../client/route.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,IAAY;IACxC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,eAAe;YAClB,MAAM,CAAC,qCAAqC,CAAC,CAAA;YAC7C,OAAO,IAAI,CAAA;QAEb,KAAK,iBAAiB;YACpB,MAAM,CAAC,yCAAyC,CAAC,CAAA;YACjD,OAAO,IAAI,CAAA;QAEb,KAAK,iBAAiB;YACpB,MAAM,CAAC,yCAAyC,CAAC,CAAA;YACjD,OAAO,IAAI,CAAA;QAEb,KAAK,yBAAyB;YAC5B,MAAM,CAAC,0CAA0C,CAAC,CAAA;YAClD,OAAO,IAAI,CAAA;QAEb,KAAK,qCAAqC;YACxC,MAAM,CAAC,2DAA2D,CAAC,CAAA;YACnE,OAAO,IAAI,CAAA;QAEb,KAAK,iCAAiC;YACpC,MAAM,CAAC,uDAAuD,CAAC,CAAA;YAC/D,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC","sourcesContent":["export default function route(page: string) {\n switch (page) {\n case 'employee-list':\n import('./pages/employee/employee-list-page')\n return page\n\n case 'department-tree':\n import('./pages/department/department-tree-page')\n return page\n\n case 'department-list':\n import('./pages/department/department-list-page')\n return page\n\n case 'employees-by-department':\n import('./pages/employee/employees-by-department')\n return page\n\n case 'common-approval-line-templates-page':\n import('./pages/approval-line/common-approval-line-templates-page')\n return page\n\n case 'my-approval-line-templates-page':\n import('./pages/approval-line/my-approval-line-templates-page')\n return page\n }\n}\n"]}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../client/route.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,IAAY;IACxC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,eAAe;YAClB,MAAM,CAAC,qCAAqC,CAAC,CAAA;YAC7C,OAAO,IAAI,CAAA;QAEb,KAAK,iBAAiB;YACpB,MAAM,CAAC,yCAAyC,CAAC,CAAA;YACjD,OAAO,IAAI,CAAA;QAEb,KAAK,iBAAiB;YACpB,MAAM,CAAC,yCAAyC,CAAC,CAAA;YACjD,OAAO,IAAI,CAAA;QAEb,KAAK,yBAAyB;YAC5B,MAAM,CAAC,0CAA0C,CAAC,CAAA;YAClD,OAAO,IAAI,CAAA;QAEb,kCAAkC;QAClC,KAAK,oBAAoB;YACvB,MAAM,CAAC,+CAA+C,CAAC,CAAA;YACvD,OAAO,IAAI,CAAA;QAEb;;;;WAIG;QACH,KAAK,qCAAqC;YACxC,MAAM,CAAC,2DAA2D,CAAC,CAAA;YACnE,OAAO,IAAI,CAAA;QAEb,KAAK,iCAAiC;YACpC,MAAM,CAAC,uDAAuD,CAAC,CAAA;YAC/D,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC","sourcesContent":["export default function route(page: string) {\n switch (page) {\n case 'employee-list':\n import('./pages/employee/employee-list-page')\n return page\n\n case 'department-tree':\n import('./pages/department/department-tree-page')\n return page\n\n case 'department-list':\n import('./pages/department/department-list-page')\n return page\n\n case 'employees-by-department':\n import('./pages/employee/employees-by-department')\n return page\n\n /* 공용과 내 것을 한 목록에 — 아래 둘을 대신한다. */\n case 'approval-line-list':\n import('./pages/approval-line/approval-line-list-page')\n return page\n\n /*\n * 아래 두 화면은 아직 살아 있다. operato-dataset · operato-gangsters · operato-twin 의 메뉴가 이 두\n * 주소를 가리킨다. 지금 지우면 그 세 앱의 메뉴가 아무 데도 안 닿는다. operato-plant 만 새 화면으로\n * 돌렸고, 나머지가 옮겨 온 뒤에 지운다.\n */\n case 'common-approval-line-templates-page':\n import('./pages/approval-line/common-approval-line-templates-page')\n return page\n\n case 'my-approval-line-templates-page':\n import('./pages/approval-line/my-approval-line-templates-page')\n return page\n }\n}\n"]}