@things-factory/organization 10.1.24 → 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
@@ -1,12 +1,15 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
2
  import '@operato/data-tree';
3
+ import '@operato/list-state/ox-page-state.js';
3
4
  import { css, html } from 'lit';
4
5
  import { customElement, query, state } from 'lit/decorators.js';
5
6
  import { ScopedElementsMixin } from '@open-wc/scoped-elements';
7
+ import { OxPrompt } from '@operato/popup';
6
8
  import { client } from '@operato/graphql';
7
9
  import { i18next, localize } from '@operato/i18n';
8
10
  import { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles';
9
- import { CustomAlert, PageView } from '@operato/shell';
11
+ import { PageView } from '@operato/shell';
12
+ import { notify } from '@operato/layout';
10
13
  import gql from 'graphql-tag';
11
14
  import { DepartmentImporter } from './department-importer';
12
15
  import { Department } from '../../types/department';
@@ -37,6 +40,10 @@ let DepartmentTreePage = class DepartmentTreePage extends localize(i18next)(Scop
37
40
  super(...arguments);
38
41
  this.modified = false;
39
42
  this.appendable = false;
43
+ /** The first read of the tree; a refresh keeps the tree it has on screen. */
44
+ this.loading = false;
45
+ /** Why the tree could not be read - shown instead of an empty tree (ADR-0060 decision 8). */
46
+ this.loadError = null;
40
47
  }
41
48
  static { this.styles = [
42
49
  CommonHeaderStyles,
@@ -90,16 +97,12 @@ let DepartmentTreePage = class DepartmentTreePage extends localize(i18next)(Scop
90
97
  */
91
98
  get context() {
92
99
  return { title: i18next.t('title.department list'),
93
- help: 'organization/department',
94
- exportable: { name: i18next.t('title.department list'),
95
- data: this.exportHandler.bind(this)
96
- },
97
- importable: { handler: this.importHandler.bind(this)
98
- }
100
+ help: 'organization/department'
99
101
  };
100
102
  }
101
103
  render() {
102
104
  return html `
105
+ <ox-page-state .loading=${this.loading} .error=${this.loadError} @retry=${() => this.fetch()}>
103
106
  <content>
104
107
  <ox-tree-vertical
105
108
  .data=${this.root}
@@ -143,6 +146,7 @@ let DepartmentTreePage = class DepartmentTreePage extends localize(i18next)(Scop
143
146
  </div>
144
147
  </div>
145
148
  </content>
149
+ </ox-page-state>
146
150
  `;
147
151
  }
148
152
  updated(changes) {
@@ -192,11 +196,7 @@ let DepartmentTreePage = class DepartmentTreePage extends localize(i18next)(Scop
192
196
  async save() {
193
197
  const { id, controlNo, name, description, picture, active, manager } = this.department || {};
194
198
  if (!id) {
195
- await CustomAlert({ type: 'warning',
196
- title: 'department not selected',
197
- text: 'Please select department first.',
198
- confirmButton: { text: i18next.t('button.confirm') }
199
- });
199
+ notify({ level: 'warn', message: i18next.t('text.department-not-selected') });
200
200
  return;
201
201
  }
202
202
  var patch = { controlNo,
@@ -226,23 +226,15 @@ let DepartmentTreePage = class DepartmentTreePage extends localize(i18next)(Scop
226
226
  }
227
227
  async delete() {
228
228
  if (!this.selected) {
229
- await CustomAlert({ type: 'warning',
230
- title: 'department not selected',
231
- text: 'Please select department first.',
232
- confirmButton: { text: i18next.t('button.confirm') }
233
- });
229
+ notify({ level: 'warn', message: i18next.t('text.department-not-selected') });
234
230
  return;
235
231
  }
236
232
  const children = this.selected?.children;
237
233
  if (children && children.length > 0) {
238
- await CustomAlert({ type: 'warning',
239
- title: 'Departments with subordinates cannot be deleted.',
240
- text: 'Department having children cannot be deleted.',
241
- confirmButton: { text: i18next.t('button.confirm') }
242
- });
234
+ notify({ level: 'warn', message: i18next.t('text.department-with-children-cannot-be-deleted') });
243
235
  return;
244
236
  }
245
- if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {
237
+ if (await OxPrompt.confirmDelete()) {
246
238
  const { id } = this.selected || {};
247
239
  const response = await client.mutate({ mutation: gql `
248
240
  mutation ($id: String!) { deleteDepartment(id: $id)
@@ -264,7 +256,10 @@ let DepartmentTreePage = class DepartmentTreePage extends localize(i18next)(Scop
264
256
  }
265
257
  }
266
258
  async fetch() {
267
- const response = await client.query({ query: gql `
259
+ this.loading = !this.root;
260
+ let response;
261
+ try {
262
+ response = await client.query({ query: gql `
268
263
  query { responses: departmentRoots { total
269
264
  items { ...SubDepartmentFragment
270
265
  children { ...SubDepartmentFragment
@@ -287,12 +282,23 @@ let DepartmentTreePage = class DepartmentTreePage extends localize(i18next)(Scop
287
282
 
288
283
  ${SubDepartmentFragment}
289
284
  `
290
- });
291
- const { items: records, total } = response.data.responses;
285
+ });
286
+ }
287
+ catch (error) {
288
+ this.loadError = error;
289
+ return;
290
+ }
291
+ finally {
292
+ this.loading = false;
293
+ }
294
+ if (response.errors?.length || !response.data?.responses) {
295
+ this.loadError = response.errors?.length ? response.errors : new Error('no data');
296
+ return;
297
+ }
298
+ this.loadError = null;
299
+ const { items: records } = response.data.responses;
292
300
  this.root = records[0];
293
301
  }
294
- async exportHandler() { }
295
- async importHandler(records) { }
296
302
  };
297
303
  __decorate([
298
304
  state(),
@@ -314,6 +320,14 @@ __decorate([
314
320
  state(),
315
321
  __metadata("design:type", Boolean)
316
322
  ], DepartmentTreePage.prototype, "appendable", void 0);
323
+ __decorate([
324
+ state(),
325
+ __metadata("design:type", Boolean)
326
+ ], DepartmentTreePage.prototype, "loading", void 0);
327
+ __decorate([
328
+ state(),
329
+ __metadata("design:type", Object)
330
+ ], DepartmentTreePage.prototype, "loadError", void 0);
317
331
  __decorate([
318
332
  query('department-view'),
319
333
  __metadata("design:type", DepartmentView
@@ -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'\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
+ {"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/list-state/ox-page-state.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 { OxPrompt } from '@operato/popup'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'\nimport { PageView } from '@operato/shell'\nimport { notify } from '@operato/layout'\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 /** The first read of the tree; a refresh keeps the tree it has on screen. */\n @state() loading: boolean = false\n /** Why the tree could not be read - shown instead of an empty tree (ADR-0060 decision 8). */\n @state() loadError: unknown = null\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 }\n }\n\n render() { return html`\n <ox-page-state .loading=${this.loading} .error=${this.loadError} @retry=${() => this.fetch()}>\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 </ox-page-state>\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) { notify({ level: 'warn', message: i18next.t('text.department-not-selected') })\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) { notify({ level: 'warn', message: i18next.t('text.department-not-selected') })\n\n return\n }\n\n const children = this.selected?.children\n if (children && children.length > 0) { notify({ level: 'warn', message: i18next.t('text.department-with-children-cannot-be-deleted') })\n\n return\n }\n\n if (await OxPrompt.confirmDelete()) { 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() {\n this.loading = !this.root\n let response: any\n try {\n 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 } catch (error) {\n this.loadError = error\n return\n } finally {\n this.loading = false\n }\n\n if (response.errors?.length || !response.data?.responses) {\n this.loadError = response.errors?.length ? response.errors : new Error('no data')\n return\n }\n\n this.loadError = null\n const { items: records } = response.data.responses\n\n this.root = records[0]\n }\n}\n"]}
@@ -5,6 +5,7 @@ import gql from 'graphql-tag';
5
5
  import { css, html } from 'lit';
6
6
  import { customElement, property, query } from 'lit/decorators.js';
7
7
  import { ScopedElementsMixin } from '@open-wc/scoped-elements';
8
+ import { OxPrompt } from '@operato/popup';
8
9
  import { DataGrist } from '@operato/data-grist';
9
10
  import { client } from '@operato/graphql';
10
11
  import { i18next, localize } from '@operato/i18n';
@@ -447,7 +448,7 @@ let EmployeeListPage = class EmployeeListPage extends p13n(localize(i18next)(Sco
447
448
  };
448
449
  }
449
450
  async onDeleteEmployee() {
450
- if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {
451
+ if (await OxPrompt.confirmDelete({ count: this.grist?.selected?.length })) {
451
452
  const ids = this.grist.selected.map(record => record.id);
452
453
  if (ids && ids.length > 0) {
453
454
  const response = await client.mutate({ mutation: gql `
@@ -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 '@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
+ {"version":3,"file":"employee-list-page.js","sourceRoot":"","sources":["../../../client/pages/employee/employee-list-page.ts"],"names":[],"mappings":";AAAA,OAAO,qBAAqB,CAAA;AAC5B,OAAO,qCAAqC,CAAA;AAE5C,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAE,SAAS,EAA4B,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,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAEpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAG/C,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAArF;;QA6BuB,SAAI,GAA6B,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;IAojBjG,CAAC;aAjlBuG,WAAM,GAAG;QAC7G,eAAe;QACf,iBAAiB;QACjB,kBAAkB;QAClB,GAAG,CAAA;;;;;;;;;;;;;;;;;KAiBF;KACF,AAtB2G,CAsB3G;IAED,MAAM,KAAK,cAAc;QAAS,OAAO,EAAQ,mBAAmB,EAAE,gBAAgB;SACtF,CAAA;IACD,CAAC;IAOA,IAAI,OAAO;QAAS,OAAO,EAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;YACtE,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,MAAM,EAAE,EAAU,OAAO,EAAE,GAAG,EAAE;oBAAa,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAA;gBAC7E,CAAC;aACA;YACI,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE;gBACP,EAAY,IAAI,EAAE,MAAM;oBACtB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;oBAC/B,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;iBAChD;gBACM,EAAY,IAAI,EAAE,QAAQ;oBACxB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;oBACjC,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;oBACxC,QAAQ,EAAE,EAAc,MAAM,EAAE,IAAI;qBAC5C;iBACA;aACK;YACD,UAAU,EAAE,EAAU,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;gBAC1D,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,EACA,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;;gBAEC,IAAI;kBACF,IAAI,CAAC,WAAW;wBACV,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;kCAClB,IAAI,CAAC,yBAAyB,CAAC,UAAU,CAAE;;;;;;;;;;KAUxE,CAAA;IACJ,CAAC;IAEA,KAAK,CAAC,eAAe,CAAC,SAAc;QAAQ,IAAI,CAAC,WAAW,GAAG,EAAQ,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;YACxG,IAAI,EAAE,EAAU,SAAS,EAAE,SAAS;gBAClC,MAAM,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC;gBAC7B,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,CAAC;aAC9D;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,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;gBAC3E,EAAY,IAAI,EAAE,QAAQ;oBACxB,UAAU,EAAE,QAAQ;oBACpB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;oBAC3C,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1D,QAAQ,EAAE,KAAK;oBACf,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxF,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,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gCAAiB,OAAM;4BACvK,CAAC;4BAEY,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAA;wBAC1C,CAAC;qBACA;iBACA;gBACM,EAAY,IAAI,EAAE,OAAO;oBACvB,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;oBACxC,KAAK,EAAE,EAAE;oBACT,MAAM,EAAE,EAAc,KAAK,EAAE,QAAQ;wBACnC,QAAQ,EAAE,UAAU,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK;4BAAkB,OAAO,IAAI,CAAA,yBAAyB,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,IAAI,IAAI,GAAG,iBAAiB,CAAA;wBACtL,CAAC;qBACA;oBACQ,QAAQ,EAAE,EAAc,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;4BAAiB,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gCAAiB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAA;4BACxL,CAAC;iCAAM,CAAC;gCAAiB,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;4BACzD,CAAC;wBACD,CAAC;qBACA;iBACA;gBACM,EAAY,IAAI,EAAE,QAAQ;oBACxB,IAAI,EAAE,WAAW;oBACjB,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;oBACrC,MAAM,EAAE,EAAc,QAAQ,EAAE,IAAI;wBAClC,SAAS,EAAE,IAAI;qBACzB;oBACQ,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,GAAG;iBAClB;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;wBAClC,SAAS,EAAE,IAAI;qBACzB;oBACQ,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,GAAG;iBAClB;gBACM,EAAY,IAAI,EAAE,QAAQ;oBACxB,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;oBAChC,MAAM,EAAE,EAAc,QAAQ,EAAE,IAAI;qBAC5C;oBACQ,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,KAAK;oBACf,KAAK,EAAE,GAAG;iBAClB;gBACM,EAAY,IAAI,EAAE,iBAAiB;oBACjC,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;oBACtC,MAAM,EAAE,EAAc,QAAQ,EAAE,IAAI;wBAClC,OAAO,EAAE,EAAgB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;4BACnE,SAAS,EAAE,OAAO;4BAClB,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE;4BAC7E,gBAAgB,EAAE,OAAO;4BACzB,OAAO,EAAE;gCACP,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;gCAC5B,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE;gCACnE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE;6BACtE;4BACD,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;yBAC/C;qBACA;oBACQ,QAAQ,EAAE,KAAK;oBACf,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,GAAG;iBAClB;gBACM,EAAY,IAAI,EAAE,MAAM;oBACtB,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;oBAC/B,KAAK,EAAE,GAAG;oBACV,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,IAAI;oBACZ,MAAM,EAAE,EAAc,QAAQ,EAAE,IAAI;wBAClC,QAAQ,EAAE,eAAe;wBACzB,aAAa,EAAE,MAAM;qBAC/B;iBACA;gBACM,EAAY,IAAI,EAAE,mBAAmB;oBACnC,IAAI,EAAE,YAAY;oBAClB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;oBACrC,MAAM,EAAE,EAAc,QAAQ,EAAE,IAAI;qBAC5C;oBACQ,QAAQ,EAAE,KAAK;oBACf,MAAM,EAAE,IAAI;oBACZ,KAAK,EAAE,GAAG;iBAClB;gBACM,EAAY,IAAI,EAAE,iBAAiB;oBACjC,IAAI,EAAE,YAAY;oBAClB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;oBACrC,MAAM,EAAE,EAAc,QAAQ,EAAE,IAAI;wBAClC,OAAO,EAAE,EAAgB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;4BAC9D,SAAS,EAAE,WAAW;4BACtB,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;4BACrC,SAAS,EAAE,EAAkB,OAAO,EAAE;oCAClC,EAAsB,IAAI,EAAE,QAAQ;wCAClC,QAAQ,EAAE,IAAI;wCACd,KAAK,EAAE,IAAI;qCAC7B;iCACe;6BACf;4BACY,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE;4BAC3D,OAAO,EAAE;gCACP,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;gCAC5B,EAAoB,IAAI,EAAE,WAAW;oCACnC,KAAK,EAAE,GAAG;oCACV,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,EAAE;oCACzD,MAAM,EAAE,QAAQ;oCAChB,QAAQ,EAAE,IAAI;iCAC9B;gCACc,EAAoB,IAAI,EAAE,MAAM;oCAC9B,KAAK,EAAE,GAAG;oCACV,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE;oCACnD,MAAM,EAAE,QAAQ;oCAChB,QAAQ,EAAE,IAAI;iCAC9B;gCACc,EAAoB,IAAI,EAAE,OAAO;oCAC/B,KAAK,EAAE,GAAG;oCACV,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE;oCACpD,MAAM,EAAE,QAAQ;oCAChB,QAAQ,EAAE,IAAI;iCAC9B;gCACc,EAAoB,IAAI,EAAE,MAAM;oCAC9B,IAAI,EAAE,MAAM;oCACZ,KAAK,EAAE,GAAG;oCACV,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE;oCACnD,MAAM,EAAE,EAAsB,QAAQ,EAAE,KAAK;wCAC3C,QAAQ,EAAE,eAAe;wCACzB,aAAa,EAAE,MAAM;qCACvC;iCACA;gCACc,EAAoB,IAAI,EAAE,MAAM;oCAC9B,IAAI,EAAE,aAAa;oCACnB,KAAK,EAAE,GAAG;oCACV,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,EAAE;oCAC3D,MAAM,EAAE,EAAsB,QAAQ,EAAE,KAAK;wCAC3C,QAAQ,EAAE,cAAc;wCACxB,aAAa,EAAE,MAAM;qCACvC;iCACA;gCACc,EAAoB,IAAI,EAAE,MAAM;oCAC9B,IAAI,EAAE,mBAAmB;oCACzB,KAAK,EAAE,GAAG;oCACV,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,EAAE;oCACjE,MAAM,EAAE,EAAsB,QAAQ,EAAE,KAAK;wCAC3C,QAAQ,EAAE,oBAAoB;wCAC9B,aAAa,EAAE,MAAM;qCACvC;iCACA;gCACc,EAAoB,IAAI,EAAE,MAAM;oCAC9B,IAAI,EAAE,SAAS;oCACf,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE;oCACvD,KAAK,EAAE,GAAG;iCAC1B;6BACa;4BACD,UAAU,EAAE,IAAI;4BAChB,SAAS,EAAE,MAAM;4BACjB,gBAAgB,EAAE,WAAW;yBACzC;qBACA;oBACQ,QAAQ,EAAE,KAAK;oBACf,KAAK,EAAE,GAAG;iBAClB;gBACM,EAAY,IAAI,EAAE,QAAQ;oBACxB,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;oBAChC,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,EAAc,QAAQ,EAAE,KAAK;wBACnC,QAAQ,EAAE,UAAU,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK;4BAAkB,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;wBACxI,CAAC;qBACA;oBACQ,QAAQ,EAAE,KAAK;iBACvB;gBACM,EAAY,IAAI,EAAE,QAAQ;oBACxB,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;oBAChC,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,EAAc,QAAQ,EAAE,KAAK;wBACnC,QAAQ,EAAE,UAAU,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK;4BAAkB,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;wBACxI,CAAC;qBACA;oBACQ,QAAQ,EAAE,KAAK;iBACvB;gBACM,EAAY,IAAI,EAAE,MAAM;oBACtB,IAAI,EAAE,mBAAmB;oBACzB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;oBAC7C,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,EAAc,QAAQ,EAAE,IAAI;wBAClC,QAAQ,EAAE,oBAAoB;wBAC9B,aAAa,EAAE,MAAM;qBAC/B;oBACQ,MAAM,EAAE,IAAI;iBACpB;gBACM,EAAY,IAAI,EAAE,MAAM;oBACtB,IAAI,EAAE,aAAa;oBACnB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC;oBACvC,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,EAAc,QAAQ,EAAE,IAAI;wBAClC,QAAQ,EAAE,cAAc;wBACxB,aAAa,EAAE,MAAM;qBAC/B;oBACQ,MAAM,EAAE,IAAI;iBACpB;gBACM,EAAY,IAAI,EAAE,MAAM;oBACtB,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;oBACnC,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,EAAc,QAAQ,EAAE,IAAI;qBAC5C;oBACQ,QAAQ,EAAE,IAAI;iBACtB;gBACM,EAAY,IAAI,EAAE,MAAM;oBACtB,IAAI,EAAE,WAAW;oBACjB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;oBACrC,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,EAAc,QAAQ,EAAE,IAAI;qBAC5C;iBACA;gBACM,EAAY,IAAI,EAAE,UAAU;oBAC1B,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;oBACjC,KAAK,EAAE,EAAE;oBACT,MAAM,EAAE,EAAc,KAAK,EAAE,QAAQ;wBACnC,QAAQ,EAAE,IAAI;qBACxB;oBACQ,MAAM,EAAE,IAAI;oBACZ,QAAQ,EAAE,KAAK;iBACvB;gBACM,EAAY,IAAI,EAAE,QAAQ;oBACxB,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;oBAC/B,KAAK,EAAE,GAAG;oBACV,MAAM,EAAE,EAAc,QAAQ,EAAE,IAAI;qBAC5C;oBACQ,MAAM,EAAE,QAAQ;iBACxB;gBACM,EAAY,IAAI,EAAE,iBAAiB;oBACjC,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;oBAClC,KAAK,EAAE,EAAE;oBACT,QAAQ,EAAE,KAAK;iBACvB;gBACM,EAAY,IAAI,EAAE,UAAU;oBAC1B,IAAI,EAAE,WAAW;oBACjB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;oBACrC,KAAK,EAAE,GAAG;oBACV,QAAQ,EAAE,IAAI;iBACtB;gBACM,EAAY,IAAI,EAAE,iBAAiB;oBACjC,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,IAAI;iBACpB;aACK;YACD,IAAI,EAAE,EAAU,UAAU,EAAE,EAAY,QAAQ,EAAE,IAAI;iBAC1D;aACA;YACI,OAAO,EAAE;gBACP,EAAY,IAAI,EAAE,WAAW;iBACnC;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4C/I;YACD,SAAS,EAAE,EAAU,OAAO;gBAC1B,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;gBAC3B,QAAQ;aACd;SACA,CAAC,CAAA;QAEC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAA;QAE7C,OAAO,EAAQ,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;YACtD,OAAO;SACX,CAAA;IACD,CAAC;IAEA,KAAK,CAAC,gBAAgB;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;YACtK,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;YACD,CAAC;QACD,CAAC;IACD,CAAC;IAEA,KAAK,CAAC,gBAAgB;QAAS,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAA;QAClE,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;QACD,CAAC;IACD,CAAC;IAEA,KAAK,CAAC,aAAa;QAAS,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAA;QAC/H,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;YAC7B,IAAI;YACJ,WAAW;YACX,MAAM;YACN,OAAO;YACP,MAAM;YACN,SAAS;YACT,WAAW;YACX,QAAQ;YACR,MAAM;SACP,CAAC,CAAA;QAEF,OAAO,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YAAS,IAAI,OAAO,GAAG,EAAE,CAAA;YAC3D,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;gBAAS,OAAO,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;YACnF,CAAC;YAEI,OAAO,OAAO,CAAA;QACnB,CAAC,CAAC,CAAA;IACF,CAAC;IAEA,KAAK,CAAC,aAAa,CAAC,OAAO;QAAQ,MAAM,KAAK,GAAG,SAAS,CACtD,IAAI,CAAA;;uBAEa,OAAO;sBACR,GAAG,EAAE;YAAe,OAAO,CAAC,IAAI,EAAE,CAAA;YAC5C,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QAC7B,CAAC;;OAEK,EACD,EAAU,QAAQ,EAAE,IAAI;YACtB,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;SAC/C,CACG,CAAA;QAED,KAAK,CAAC,QAAQ,GAAG,GAAG,EAAE;YAAS,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QACpD,CAAC,CAAA;IACD,CAAC;IAEA,KAAK,CAAC,gBAAgB,CAAC,MAAmB;QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC;YAAO,OAAM;QAC1F,CAAC;QAEE,MAAM,KAAK,GAAG,SAAS,CACrB,IAAI,CAAA;;uBAEa,MAAM,CAAC,OAAO,CAAC,EAAE;oBACpB,GAAG,EAAE;YAAe,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QACzD,CAAC;oBACkB,GAAG,EAAE;YAAe,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QACjE,CAAC;;;OAGK,EACD,EAAU,QAAQ,EAAE,IAAI;YACtB,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;SACvC,CACG,CAAA;IACJ,CAAC;IAEA,KAAK,CAAC,mBAAmB,CAAC,MAAmB;QAAQ,MAAM,KAAK,GAAG,SAAS,CACxE,IAAI,CAAA;6CACmC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC;OACtF,EACD,EAAU,QAAQ,EAAE,IAAI;YACtB,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;SACvC,CACG,CAAA;IACJ,CAAC;IAEA,KAAK,CAAC,aAAa,CAAC,MAAmB,EAAE,OAAgB;QAAQ,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YAAO,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAU,QAAQ,EAAE,GAAG,CAAA;;;;SAI7I;gBACD,SAAS,EAAE,EAAY,EAAE,EAAE,MAAM,CAAC,EAAE;oBAClC,SAAS,EAAE,OAAO,CAAC,EAAE;iBAC7B;aACA,CAAC,CAAA;YAEG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QACvB,CAAC;aAAM,IAAI,OAAO,EAAE,EAAE,EAAE,CAAC;YAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAU,IAAI,EAAE,OAAO,CAAC,IAAI;gBAC1E,OAAO,EAAE,EAAY,EAAE,EAAE,OAAO,CAAC,EAAE;oBACjC,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,KAAK,EAAG,OAAe,CAAC,KAAK;oBAC7B,KAAK,EAAG,OAAe,CAAC,KAAK;oBAC7B,OAAO,EAAG,OAAe,CAAC,OAAO;iBACzC;aACA,CAAC,CAAA;YACG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAA;YACpB,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAA;YAEhC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAA;QAC9B,CAAC;IACD,CAAC;IAEA,KAAK,CAAC,aAAa,CAAC,MAAM;QAAQ,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YAAO,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAU,QAAQ,EAAE,GAAG,CAAA;;;;SAI9G;gBACD,SAAS,EAAE,EAAY,EAAE,EAAE,MAAM,CAAC,EAAE;iBAC1C;aACA,CAAC,CAAA;YAEG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QACvB,CAAC;aAAM,CAAC;YAAO,MAAM,CAAC,OAAO,GAAG,IAAI,CAAA;YAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAA;QACzB,CAAC;IACD,CAAC;IAEA,KAAK,CAAC,gBAAgB,CAAC,MAAM;QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAAO,MAAM,MAAM,CAAC,MAAM,CAAC,EAAU,QAAQ,EAAE,GAAG,CAAA;;;SAGnG;gBACD,SAAS,EAAE,EAAY,UAAU,EAAE,MAAM,CAAC,EAAE;iBAClD;aACA,CAAC,CAAA;QACF,CAAC;QAEE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACrB,CAAC;;AApjB4B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;qDAAiB;AAChB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;8CAAoE;AAEpE;IAA1B,KAAK,CAAC,UAAU,CAAC;8BAAiB,SAAS;+CAAA;AA/BjC,gBAAgB;IAD5B,aAAa,CAAC,oBAAoB,CAAC;GACvB,gBAAgB,CAilB5B","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 { OxPrompt } from '@operato/popup'\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 (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!]!) { 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"]}