@things-factory/organization 10.1.26 → 10.1.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist-client/component/approval-line-items-editor-popup.js +3 -3
  2. package/dist-client/component/approval-line-items-editor-popup.js.map +1 -1
  3. package/dist-client/component/approval-line-items-editor.js +3 -3
  4. package/dist-client/component/approval-line-items-editor.js.map +1 -1
  5. package/dist-client/component/approval-line-selector.js +2 -2
  6. package/dist-client/component/approval-line-selector.js.map +1 -1
  7. package/dist-client/component/approval-line-templates-manager.js +5 -6
  8. package/dist-client/component/approval-line-templates-manager.js.map +1 -1
  9. package/dist-client/component/assignees-editor-popup.js +2 -2
  10. package/dist-client/component/assignees-editor-popup.js.map +1 -1
  11. package/dist-client/component/assignees-editor.js +3 -3
  12. package/dist-client/component/assignees-editor.js.map +1 -1
  13. package/dist-client/component/department-selector.js +2 -2
  14. package/dist-client/component/department-selector.js.map +1 -1
  15. package/dist-client/component/recipients-editor-popup.js +2 -2
  16. package/dist-client/component/recipients-editor-popup.js.map +1 -1
  17. package/dist-client/component/recipients-editor.js +3 -3
  18. package/dist-client/component/recipients-editor.js.map +1 -1
  19. package/dist-client/filters-form/ox-filter-department-object.js +1 -1
  20. package/dist-client/filters-form/ox-filter-department-object.js.map +1 -1
  21. package/dist-client/grist-editor/grist-editor-department-object.js +1 -1
  22. package/dist-client/grist-editor/grist-editor-department-object.js.map +1 -1
  23. package/dist-client/pages/approval-line/approval-line-list-page.d.ts +0 -3
  24. package/dist-client/pages/approval-line/approval-line-list-page.js +6 -18
  25. package/dist-client/pages/approval-line/approval-line-list-page.js.map +1 -1
  26. package/dist-client/pages/approval-line/common-approval-line-templates-page.d.ts +0 -3
  27. package/dist-client/pages/approval-line/common-approval-line-templates-page.js +10 -18
  28. package/dist-client/pages/approval-line/common-approval-line-templates-page.js.map +1 -1
  29. package/dist-client/pages/approval-line/my-approval-line-templates-page.d.ts +0 -3
  30. package/dist-client/pages/approval-line/my-approval-line-templates-page.js +10 -18
  31. package/dist-client/pages/approval-line/my-approval-line-templates-page.js.map +1 -1
  32. package/dist-client/pages/department/department-list-page.d.ts +5 -1
  33. package/dist-client/pages/department/department-list-page.js +41 -29
  34. package/dist-client/pages/department/department-list-page.js.map +1 -1
  35. package/dist-client/pages/employee/employee-list-page.d.ts +18 -0
  36. package/dist-client/pages/employee/employee-list-page.js +437 -229
  37. package/dist-client/pages/employee/employee-list-page.js.map +1 -1
  38. package/dist-client/route.d.ts +1 -1
  39. package/dist-client/route.js +0 -6
  40. package/dist-client/route.js.map +1 -1
  41. package/dist-client/tsconfig.tsbuildinfo +1 -1
  42. package/dist-server/tsconfig.tsbuildinfo +1 -1
  43. package/package.json +9 -6
  44. package/tests/department-query-shape.test.ts +130 -0
  45. package/tests/screen-words.test.ts +110 -0
  46. package/things-factory.config.js +0 -2
  47. package/translations/en.json +11 -4
  48. package/translations/ja.json +11 -4
  49. package/translations/ko.json +11 -4
  50. package/translations/ms.json +12 -4
  51. package/translations/zh.json +11 -4
  52. package/dist-client/pages/department/department-tree-page.d.ts +0 -43
  53. package/dist-client/pages/department/department-tree-page.js +0 -336
  54. package/dist-client/pages/department/department-tree-page.js.map +0 -1
  55. package/dist-client/pages/employee/employees-by-department.d.ts +0 -32
  56. package/dist-client/pages/employee/employees-by-department.js +0 -435
  57. package/dist-client/pages/employee/employees-by-department.js.map +0 -1
@@ -1,336 +0,0 @@
1
- import { __decorate, __metadata } from "tslib";
2
- import '@operato/data-tree';
3
- import { css, html } from 'lit';
4
- import { customElement, query, state } from 'lit/decorators.js';
5
- import { ScopedElementsMixin } from '@open-wc/scoped-elements';
6
- import { client } from '@operato/graphql';
7
- import { i18next, localize } from '@operato/i18n';
8
- import { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles';
9
- import { CustomAlert, PageView } from '@operato/shell';
10
- import gql from 'graphql-tag';
11
- import { DepartmentImporter } from './department-importer';
12
- import { Department } from '../../types/department';
13
- import { DepartmentView } from '../../component/department-view';
14
- const SubDepartmentFragment = gql `
15
- fragment SubDepartmentFragment on Department { id
16
- controlNo
17
- name
18
- description
19
-
20
- manager { id
21
- name
22
- controlNo
23
- photo
24
- email
25
- }
26
- active
27
- picture
28
-
29
- updater { id
30
- name
31
- }
32
- updatedAt
33
- }
34
- `;
35
- let DepartmentTreePage = class DepartmentTreePage extends localize(i18next)(ScopedElementsMixin(PageView)) {
36
- constructor() {
37
- super(...arguments);
38
- this.modified = false;
39
- this.appendable = false;
40
- }
41
- static { this.styles = [
42
- CommonHeaderStyles,
43
- ScrollbarStyles,
44
- css `
45
- :host { display: flex;
46
- flex-direction: column;
47
-
48
- width: 100%;
49
- overflow: auto;
50
- }
51
-
52
- content { flex: 1;
53
- display: flex;
54
- flex-direction: row;
55
- }
56
-
57
- div[editor] { width: 300px;
58
- display: flex;
59
- flex-direction: column;
60
- }
61
-
62
- ox-tree-vertical { flex: 1;
63
- overflow: auto;
64
- }
65
-
66
- department-view { flex: 1;
67
- padding: var(--spacing-medium);
68
- background-color: var(--md-sys-color-surface-variant);
69
- overflow: auto;
70
- }
71
-
72
- .footer button[disabled] { color: var(--md-sys-color-surface-dim);
73
- background-color: transparent;
74
- }
75
- `
76
- ]; }
77
- static get scopedElements() {
78
- return { 'department-importer': DepartmentImporter
79
- };
80
- }
81
- /*
82
- * 「삭제」는 여기 없다 — 편집 판의 아래 줄에 있다.
83
- *
84
- * 이 화면의 삭제는 **선택한 부서 하나**를 지운다. 「저장」·「추가」와 대상이 같다. 전역 버튼 줄에
85
- * 두면 그 판의 아래 줄 바로 밑에 또 한 줄이 서서, 같은 대상을 다루는 버튼 셋이 두 줄로 갈린다.
86
- *
87
- * 대상에서 떨어져 있었다는 표시가 코드에 남아 있었다 — 아무것도 안 고른 채로 누를 수 있어서
88
- * 「부서를 먼저 선택하세요」 경고창을 띄웠다. 대상 옆에 두고 선택이 없으면 못 누르게 하면 그
89
- * 경고가 필요 없다.
90
- */
91
- get context() {
92
- 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
- }
99
- };
100
- }
101
- render() {
102
- return html `
103
- <content>
104
- <ox-tree-vertical
105
- .data=${this.root}
106
- .selected=${this.selected}
107
- @select=${this.onSelect.bind(this)}
108
- id-property="controlNo"
109
- label-property="name"
110
- description-property="description"
111
- ></ox-tree-vertical>
112
-
113
- <div editor>
114
- <department-view
115
- .department=${this.department}
116
- @property-change=${(e) => {
117
- const { controlNo, name } = e.detail || {};
118
- this.modified = true;
119
- this.appendable = controlNo && controlNo !== this.selected?.controlNo && name !== this.selected?.name;
120
- }}
121
- ></department-view>
122
- <div class="footer">
123
- <button @click=${this.reset.bind(this)}><md-icon>restart_alt</md-icon>${i18next.t('button.reset')}</button>
124
- <div filler></div>
125
- <button @click=${this.create.bind(this)} ?disabled=${!this.appendable}>
126
- <md-icon>add</md-icon>${i18next.t('button.add')}
127
- </button>
128
- <button @click=${this.save.bind(this)} ?disabled=${!this.modified} done>
129
- <md-icon>save</md-icon>${i18next.t('button.save')}
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>
143
- </div>
144
- </div>
145
- </content>
146
- `;
147
- }
148
- updated(changes) {
149
- if (changes.has('selected')) {
150
- this.modified = false;
151
- this.department = { ...this.selected };
152
- }
153
- }
154
- onSelect(e) {
155
- this.selected = e.detail;
156
- this.updateContext();
157
- }
158
- reset() {
159
- this.departmentView.department = {};
160
- }
161
- async create() {
162
- const { id: parentId } = this.department || {};
163
- const { controlNo, name, description, picture, active, manager } = this.department || {};
164
- var department = { controlNo,
165
- name,
166
- description,
167
- manager,
168
- active
169
- };
170
- if (picture instanceof File) {
171
- department.picture = picture;
172
- }
173
- if (parentId) {
174
- department.parent = { id: parentId };
175
- }
176
- const response = await client.mutate({ mutation: gql `
177
- mutation ($department: NewDepartment!) { createDepartment(department: $department) { ...SubDepartmentFragment
178
- }
179
- }
180
-
181
- ${SubDepartmentFragment}
182
- `,
183
- variables: { department
184
- },
185
- context: { hasUpload: true
186
- }
187
- });
188
- this.selected = response.data.createDepartment;
189
- this.updateContext();
190
- await this.fetch();
191
- }
192
- async save() {
193
- const { id, controlNo, name, description, picture, active, manager } = this.department || {};
194
- 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
- });
200
- return;
201
- }
202
- var patch = { controlNo,
203
- name,
204
- description,
205
- active,
206
- manager
207
- };
208
- if (picture instanceof File) {
209
- patch.picture = picture;
210
- }
211
- const response = await client.mutate({ mutation: gql `
212
- mutation ($id: String!, $patch: DepartmentPatch!) { updateDepartment(id: $id, patch: $patch) { ...SubDepartmentFragment
213
- }
214
- }
215
-
216
- ${SubDepartmentFragment}
217
- `,
218
- variables: { id,
219
- patch
220
- },
221
- context: { hasUpload: true
222
- }
223
- });
224
- this.selected = response.data.updateDepartment;
225
- this.fetch();
226
- }
227
- async delete() {
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
- });
234
- return;
235
- }
236
- const children = this.selected?.children;
237
- 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
- });
243
- return;
244
- }
245
- if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {
246
- const { id } = this.selected || {};
247
- const response = await client.mutate({ mutation: gql `
248
- mutation ($id: String!) { deleteDepartment(id: $id)
249
- }
250
- `,
251
- variables: { id
252
- }
253
- });
254
- this.selected = {};
255
- this.updateContext();
256
- await this.fetch();
257
- }
258
- }
259
- async pageInitialized(lifecycle) {
260
- this.fetch();
261
- }
262
- async pageUpdated(changes, lifecycle) {
263
- if (this.active) { // do something here when this page just became as active
264
- }
265
- }
266
- async fetch() {
267
- const response = await client.query({ query: gql `
268
- query { responses: departmentRoots { total
269
- items { ...SubDepartmentFragment
270
- children { ...SubDepartmentFragment
271
- children { ...SubDepartmentFragment
272
- children { ...SubDepartmentFragment
273
- children { ...SubDepartmentFragment
274
- children { ...SubDepartmentFragment
275
- children { ...SubDepartmentFragment
276
- children { ...SubDepartmentFragment
277
- }
278
- }
279
- }
280
- }
281
- }
282
- }
283
- }
284
- }
285
- }
286
- }
287
-
288
- ${SubDepartmentFragment}
289
- `
290
- });
291
- const { items: records, total } = response.data.responses;
292
- this.root = records[0];
293
- }
294
- async exportHandler() { }
295
- async importHandler(records) { }
296
- };
297
- __decorate([
298
- state(),
299
- __metadata("design:type", Department)
300
- ], DepartmentTreePage.prototype, "root", void 0);
301
- __decorate([
302
- state(),
303
- __metadata("design:type", Department)
304
- ], DepartmentTreePage.prototype, "selected", void 0);
305
- __decorate([
306
- state(),
307
- __metadata("design:type", Department)
308
- ], DepartmentTreePage.prototype, "department", void 0);
309
- __decorate([
310
- state(),
311
- __metadata("design:type", Boolean)
312
- ], DepartmentTreePage.prototype, "modified", void 0);
313
- __decorate([
314
- state(),
315
- __metadata("design:type", Boolean)
316
- ], DepartmentTreePage.prototype, "appendable", void 0);
317
- __decorate([
318
- query('department-view'),
319
- __metadata("design:type", DepartmentView
320
- /*
321
- * 「삭제」는 여기 없다 — 편집 판의 아래 줄에 있다.
322
- *
323
- * 이 화면의 삭제는 **선택한 부서 하나**를 지운다. 「저장」·「추가」와 대상이 같다. 전역 버튼 줄에
324
- * 두면 그 판의 아래 줄 바로 밑에 또 한 줄이 서서, 같은 대상을 다루는 버튼 셋이 두 줄로 갈린다.
325
- *
326
- * 대상에서 떨어져 있었다는 표시가 코드에 남아 있었다 — 아무것도 안 고른 채로 누를 수 있어서
327
- * 「부서를 먼저 선택하세요」 경고창을 띄웠다. 대상 옆에 두고 선택이 없으면 못 누르게 하면 그
328
- * 경고가 필요 없다.
329
- */
330
- )
331
- ], DepartmentTreePage.prototype, "departmentView", void 0);
332
- DepartmentTreePage = __decorate([
333
- customElement('department-tree-page')
334
- ], DepartmentTreePage);
335
- export { DepartmentTreePage };
336
- //# sourceMappingURL=department-tree-page.js.map
@@ -1 +0,0 @@
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,32 +0,0 @@
1
- import '@operato/data-tree';
2
- import { PageView } from '@operato/shell';
3
- import { FetchOption } from '@operato/data-grist';
4
- import { DepartmentImporter } from '../department/department-importer';
5
- import { Department } from '../../types/department';
6
- import { EmployeeListPage } from './employee-list-page';
7
- declare const EmployeesByDepartment_base: (new (...args: any[]) => import("lit").LitElement) & typeof PageView & import("@open-wc/dedupe-mixin").Constructor<import("@open-wc/scoped-elements/types/src/types").ScopedElementsHost>;
8
- export declare class EmployeesByDepartment extends EmployeesByDepartment_base {
9
- static styles: import("lit").CSSResult[];
10
- static get scopedElements(): {
11
- 'department-importer': typeof DepartmentImporter;
12
- };
13
- private grist;
14
- gristConfig: any;
15
- root?: Department;
16
- selected?: Department;
17
- employeeListPage: EmployeeListPage;
18
- get context(): {
19
- title: string;
20
- actions: never[];
21
- };
22
- render(): import("lit-html").TemplateResult<1>;
23
- pageInitialized(lifecycle: any): Promise<void>;
24
- pageUpdated(changes: any, lifecycle: any): Promise<void>;
25
- onSelect(e: CustomEvent): Promise<void>;
26
- fetchEmployees({ page, limit, sortings, filters }: FetchOption): Promise<{
27
- total: any;
28
- records: any;
29
- }>;
30
- fetchDepartments(): Promise<void>;
31
- }
32
- export {};