@things-factory/organization 10.1.27 → 10.1.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist-client/component/approval-line-items-editor-popup.js +3 -3
  2. package/dist-client/component/approval-line-items-editor-popup.js.map +1 -1
  3. package/dist-client/component/approval-line-items-editor.js +3 -3
  4. package/dist-client/component/approval-line-items-editor.js.map +1 -1
  5. package/dist-client/component/approval-line-selector.js +2 -2
  6. package/dist-client/component/approval-line-selector.js.map +1 -1
  7. package/dist-client/component/approval-line-templates-manager.js +3 -5
  8. package/dist-client/component/approval-line-templates-manager.js.map +1 -1
  9. package/dist-client/component/assignees-editor-popup.js +2 -2
  10. package/dist-client/component/assignees-editor-popup.js.map +1 -1
  11. package/dist-client/component/assignees-editor.js +3 -3
  12. package/dist-client/component/assignees-editor.js.map +1 -1
  13. package/dist-client/component/department-selector.js +2 -2
  14. package/dist-client/component/department-selector.js.map +1 -1
  15. package/dist-client/component/recipients-editor-popup.js +2 -2
  16. package/dist-client/component/recipients-editor-popup.js.map +1 -1
  17. package/dist-client/component/recipients-editor.js +3 -3
  18. package/dist-client/component/recipients-editor.js.map +1 -1
  19. package/dist-client/filters-form/ox-filter-department-object.js +1 -1
  20. package/dist-client/filters-form/ox-filter-department-object.js.map +1 -1
  21. package/dist-client/grist-editor/grist-editor-department-object.js +1 -1
  22. package/dist-client/grist-editor/grist-editor-department-object.js.map +1 -1
  23. package/dist-client/pages/approval-line/approval-line-list-page.js +4 -12
  24. package/dist-client/pages/approval-line/approval-line-list-page.js.map +1 -1
  25. package/dist-client/pages/approval-line/common-approval-line-templates-page.js +8 -13
  26. package/dist-client/pages/approval-line/common-approval-line-templates-page.js.map +1 -1
  27. package/dist-client/pages/approval-line/my-approval-line-templates-page.js +8 -13
  28. package/dist-client/pages/approval-line/my-approval-line-templates-page.js.map +1 -1
  29. package/dist-client/pages/department/department-list-page.d.ts +5 -1
  30. package/dist-client/pages/department/department-list-page.js +41 -29
  31. package/dist-client/pages/department/department-list-page.js.map +1 -1
  32. package/dist-client/pages/employee/employee-list-page.d.ts +18 -0
  33. package/dist-client/pages/employee/employee-list-page.js +435 -228
  34. package/dist-client/pages/employee/employee-list-page.js.map +1 -1
  35. package/dist-client/route.d.ts +1 -1
  36. package/dist-client/route.js +0 -6
  37. package/dist-client/route.js.map +1 -1
  38. package/dist-client/tsconfig.tsbuildinfo +1 -1
  39. package/dist-server/tsconfig.tsbuildinfo +1 -1
  40. package/package.json +6 -6
  41. package/tests/department-query-shape.test.ts +130 -0
  42. package/things-factory.config.js +0 -2
  43. package/translations/en.json +10 -5
  44. package/translations/ja.json +10 -5
  45. package/translations/ko.json +10 -5
  46. package/translations/ms.json +11 -5
  47. package/translations/zh.json +10 -5
  48. package/dist-client/pages/department/department-tree-page.d.ts +0 -39
  49. package/dist-client/pages/department/department-tree-page.js +0 -350
  50. package/dist-client/pages/department/department-tree-page.js.map +0 -1
  51. package/dist-client/pages/employee/employees-by-department.d.ts +0 -32
  52. package/dist-client/pages/employee/employees-by-department.js +0 -435
  53. package/dist-client/pages/employee/employees-by-department.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/organization",
3
- "version": "10.1.27",
3
+ "version": "10.1.29",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "dist-client/index.js",
6
6
  "things-factory": true,
@@ -36,10 +36,10 @@
36
36
  "@operato/p13n": "^10.0.0",
37
37
  "@operato/popup": "^10.15.0",
38
38
  "@operato/shell": "^10.0.0",
39
- "@things-factory/auth-base": "^10.1.27",
40
- "@things-factory/code-ui": "^10.1.27",
41
- "@things-factory/contact": "^10.1.27",
42
- "@things-factory/shell": "^10.1.27"
39
+ "@things-factory/auth-base": "^10.1.29",
40
+ "@things-factory/code-ui": "^10.1.29",
41
+ "@things-factory/contact": "^10.1.29",
42
+ "@things-factory/shell": "^10.1.29"
43
43
  },
44
- "gitHead": "d04dc762cacf2aac8ba0b0f5d768eca365fc09da"
44
+ "gitHead": "e6bf9dec003fe5e794746aaeb5852b3b50478232"
45
45
  }
@@ -0,0 +1,130 @@
1
+ import { existsSync, readFileSync } from 'fs'
2
+ import path from 'path'
3
+
4
+ /**
5
+ * A screen's query has to match the schema it is sent to.
6
+ *
7
+ * The employee list reads the departments its rail draws. The screen this was folded in from asked
8
+ * `departmentRoots { ...DepartmentFragment children { … } }` and the fragment asked for a field
9
+ * named `state`. departmentRoots answers with a DepartmentList, and Department has no `state`, so
10
+ * the server refused the whole document with 400 and the rail stayed empty - for as long as nobody
11
+ * opened the console. Type checking cannot see this: a gql`` document is a template literal.
12
+ *
13
+ * These read the server's own Department for the field list, so the check follows the type rather
14
+ * than a copy of it.
15
+ */
16
+
17
+ const here = (file: string) => readFileSync(path.resolve(__dirname, '..', file), 'utf-8')
18
+
19
+ /** Field names the Department object type actually declares. */
20
+ function departmentFields(): string[] {
21
+ const source = here('server/service/department/department.ts')
22
+ const names: string[] = []
23
+
24
+ for (const match of source.matchAll(/@Field\([^)]*\)[^\n]*\n\s*(?:readonly\s+)?([A-Za-z_]\w*)\??[?!]?\s*[:?]/g)) {
25
+ names.push(match[1])
26
+ }
27
+
28
+ return names
29
+ }
30
+
31
+ /** The field names a fragment body asks for, ignoring nested selections. */
32
+ function fragmentFields(source: string, fragmentName: string): string[] {
33
+ const start = source.indexOf(`fragment ${fragmentName} on `)
34
+ const body = source.slice(start, source.indexOf('`', start))
35
+ const names: string[] = []
36
+ let depth = 0
37
+
38
+ for (const line of body.split('\n').slice(1)) {
39
+ const text = line.trim()
40
+ if (!text) continue
41
+ if (text.includes('}')) depth -= (text.match(/}/g) || []).length
42
+ if (depth === 0) {
43
+ const name = text.match(/^([a-zA-Z_]\w*)/)
44
+ if (name) names.push(name[1])
45
+ }
46
+ if (text.includes('{')) depth += (text.match(/{/g) || []).length
47
+ }
48
+
49
+ return names
50
+ }
51
+
52
+ describe('the department query matches the schema', () => {
53
+ const screen = here('client/pages/employee/employee-list-page.ts')
54
+
55
+ it('★ every field the fragment asks for exists on Department', () => {
56
+ const declared = departmentFields()
57
+ expect(declared).toContain('controlNo')
58
+ expect(declared).not.toContain('state')
59
+
60
+ const asked = fragmentFields(screen, 'EmployeeDepartmentFragment')
61
+ expect(asked.length).toBeGreaterThan(3)
62
+ expect(asked.filter(name => !declared.includes(name))).toEqual([])
63
+ })
64
+
65
+ it('★ the roots come out of the list the query returns', () => {
66
+ /* departmentRoots returns DepartmentList; a fragment spread straight onto it is refused. */
67
+ expect(screen).toMatch(/departmentRoots \{\s*items \{/)
68
+ /*
69
+ * Every root, not the first. An organization can have more than one top level department and
70
+ * the tree draws an array; taking [0] hid the second one with nothing said.
71
+ */
72
+ expect(screen).toMatch(/this\.departments = response\.data\.responses\?\.items\b/)
73
+ expect(screen).not.toMatch(/this\.departments = response\.data\.responses\?\.items\?\.\[0\]/)
74
+ })
75
+ })
76
+
77
+ describe('the employee list is the one screen for people', () => {
78
+ /*
79
+ * Two screens drew the same fifteen columns of a person; one of them just had a department tree
80
+ * beside it. Folding them together (architect ruling, 2026-09-18) leaves one screen where the
81
+ * rail narrows the list, and one place for anything that has to be said about a person's row.
82
+ */
83
+ const screen = here('client/pages/employee/employee-list-page.ts')
84
+
85
+ it('★ the rail narrows the list, and it is the only place a department is chosen', () => {
86
+ expect(screen).toMatch(/<ox-tree/)
87
+ expect(screen).toMatch(/name: 'departmentId', operator: 'eq', value: this\.selectedDepartment\.id/)
88
+ /* A second department field in the filter row would be the same condition twice. */
89
+ expect(screen).toMatch(/name: 'department',[\s\S]{0,400}?filter: false/)
90
+ })
91
+
92
+ it('★ the folded screens are gone, routes and registrations with them', () => {
93
+ /*
94
+ * Two screens were folded into one each: the by-department employee screen into the employee
95
+ * list, and the department tree with its side editor into the department table, which draws the
96
+ * hierarchy in a tree column and shows what each department is (architect ruling 2026-09-18,
97
+ * user 2026-09-18).
98
+ */
99
+ for (const gone of [
100
+ 'client/pages/employee/employees-by-department.ts',
101
+ 'client/pages/department/department-tree-page.ts'
102
+ ]) {
103
+ expect([gone, existsSync(path.resolve(__dirname, '..', gone))]).toEqual([gone, false])
104
+ }
105
+
106
+ for (const page of ['employees-by-department', 'department-tree']) {
107
+ expect([page, here('client/route.ts').includes(page)]).toEqual([page, false])
108
+ expect([page, here('things-factory.config.js').includes(page)]).toEqual([page, false])
109
+ }
110
+ })
111
+ })
112
+
113
+ describe('the department table is the department screen', () => {
114
+ const screen = here('client/pages/department/department-list-page.ts')
115
+
116
+ it('★ the hierarchy is a column, so the table can hold what each department is', () => {
117
+ expect(screen).toMatch(/type: 'tree',\s*\n\s*name: 'name'/)
118
+ expect(screen).toMatch(/childrenProperty: 'children'/)
119
+ /* the columns beside the hierarchy - what the folded screen could only show one at a time */
120
+ for (const column of ['controlNo', 'description', 'manager', 'active']) {
121
+ expect([column, screen.includes(`name: '${column}'`)]).toEqual([column, true])
122
+ }
123
+ })
124
+
125
+ it('★ the count is the rows it draws, not the roots it fetched', () => {
126
+ /* departmentRoots counts top level departments; this screen draws each one with its subtree. */
127
+ expect(screen).toMatch(/const countTree = \(list: any\[\]\): number =>/)
128
+ expect(screen).toMatch(/total: countTree\(records\)/)
129
+ })
130
+ })
@@ -6,8 +6,6 @@ export default {
6
6
  routes: [
7
7
  { tagname: 'employee-list-page', page: 'employee-list' },
8
8
  { tagname: 'department-list-page', page: 'department-list' },
9
- { tagname: 'department-tree-page', page: 'department-tree' },
10
- { tagname: 'employees-by-department', page: 'employees-by-department' },
11
9
  { tagname: 'approval-line-list-page', page: 'approval-line-list' },
12
10
  { tagname: 'common-approval-line-templates-page', page: 'common-approval-line-templates-page' },
13
11
  { tagname: 'my-approval-line-templates-page', page: 'my-approval-line-templates-page' }
@@ -9,9 +9,9 @@
9
9
  "button.register-account": "register",
10
10
  "button.view": "view",
11
11
  "error.contact-information-required": "Contact information is required for this employee.",
12
+ "error.employee-already-registered": "This employee is already registered as a system user.",
12
13
  "error.multiple-employees-for-user": "this account is linked to more than one employee record, so it is unclear which one is acting — a domain administrator must leave one",
13
14
  "error.no-employee-for-user": "this account is not linked to an employee record — a domain administrator can link it in the employee list",
14
- "error.employee-already-registered": "This employee is already registered as a system user.",
15
15
  "field.approval-line": "approval line",
16
16
  "field.approver": "approver",
17
17
  "field.control-no": "control No.",
@@ -36,6 +36,7 @@
36
36
  "label.control-no": "control No.",
37
37
  "label.department": "department",
38
38
  "label.employee": "employee",
39
+ "label.fold": "fold",
39
40
  "label.hired-on": "hired on",
40
41
  "label.job-position": "job position",
41
42
  "label.job-responsibility": "job responsibility",
@@ -47,10 +48,16 @@
47
48
  "label.picture": "picture",
48
49
  "label.retired-at": "retired at",
49
50
  "prompt.sure to empty approval line ?": "sure to empty approval line ?",
51
+ "text.add the first department": "fill in a control number and a name, then add",
52
+ "text.all departments": "everyone",
50
53
  "text.approval-line-empty": "no approver — a submission completes at once",
51
54
  "text.approver-unknown": "(no name)",
52
55
  "text.deleted": "deleted",
56
+ "text.department-not-selected": "no department is selected",
57
+ "text.department-with-children-cannot-be-deleted": "a department with sub-departments cannot be deleted",
58
+ "text.departments are made on the department screen": "departments are made on the department screen",
53
59
  "text.info_x_successfully": "{x} done",
60
+ "text.no departments yet": "no departments yet",
54
61
  "text.no-common-approval-line-description": "a shared approval line is a route the organization sets. everyone can pick it.",
55
62
  "text.no-common-approval-line-title": "no shared approval lines",
56
63
  "text.no-my-approval-line-description": "save a route you use often and you will not have to pick it again each time.",
@@ -70,12 +77,10 @@
70
77
  "title.common-approval-line template list": "shared approval lines",
71
78
  "title.contact list": "contact list",
72
79
  "title.department list": "departments",
73
- "title.department tree": "department hierarchy",
74
80
  "title.employee list": "employees",
75
- "title.employees-by-department": "Employees By Department",
81
+ "title.import employee": "import employees",
76
82
  "title.lookup system-user": "lookup system user",
77
83
  "title.my-approval-line template list": "my approval lines",
78
84
  "title.organization": "organization",
79
- "text.department-not-selected": "no department is selected",
80
- "text.department-with-children-cannot-be-deleted": "a department with sub-departments cannot be deleted"
85
+ "title.recipients editor": "recipients editor"
81
86
  }
@@ -9,9 +9,9 @@
9
9
  "button.register-account": "アカウント登録",
10
10
  "button.view": "表示",
11
11
  "error.contact-information-required": "この従業員には連絡先情報が必要です。",
12
+ "error.employee-already-registered": "この従業員はすでにシステムユーザーとして登録されています。",
12
13
  "error.multiple-employees-for-user": "このアカウントに紐づく社員情報が複数あり、どの社員として処理するか判断できません。ドメイン管理者が一つだけ残す必要があります。",
13
14
  "error.no-employee-for-user": "このアカウントに紐づく社員情報がありません。ドメイン管理者が社員一覧で紐づけできます。",
14
- "error.employee-already-registered": "この従業員はすでにシステムユーザーとして登録されています。",
15
15
  "field.approval-line": "決裁ライン",
16
16
  "field.approver": "決裁者",
17
17
  "field.control-no": "管理番号",
@@ -36,6 +36,7 @@
36
36
  "label.control-no": "管理番号",
37
37
  "label.department": "部署",
38
38
  "label.employee": "職員",
39
+ "label.fold": "折りたたむ",
39
40
  "label.hired-on": "入社日",
40
41
  "label.job-position": "役職",
41
42
  "label.job-responsibility": "職務責任",
@@ -47,10 +48,16 @@
47
48
  "label.picture": "写真",
48
49
  "label.retired-at": "退職日時",
49
50
  "prompt.sure to empty approval line ?": "承認ラインを空にしますか?",
51
+ "text.add the first department": "管理番号と名前を入力して追加してください",
52
+ "text.all departments": "全体",
50
53
  "text.approval-line-empty": "決裁者がいません — 提出すると即完了します",
51
54
  "text.approver-unknown": "(名前なし)",
52
55
  "text.deleted": "削除しました",
56
+ "text.department-not-selected": "部署が選択されていません",
57
+ "text.department-with-children-cannot-be-deleted": "下位部署がある部署は削除できません",
58
+ "text.departments are made on the department screen": "部署は部署画面で作成します",
53
59
  "text.info_x_successfully": "{x}しました",
60
+ "text.no departments yet": "部署がまだありません",
54
61
  "text.no-common-approval-line-description": "共用の決裁ラインは組織が定める決裁経路です。全員が選んで使えます。",
55
62
  "text.no-common-approval-line-title": "共用の決裁ラインがありません",
56
63
  "text.no-my-approval-line-description": "よく使う経路を保存しておけば、提出するたびに選び直さなくて済みます。",
@@ -70,12 +77,10 @@
70
77
  "title.common-approval-line template list": "共用の決裁ライン",
71
78
  "title.contact list": "連絡先リスト",
72
79
  "title.department list": "部署",
73
- "title.department tree": "部署階層図",
74
80
  "title.employee list": "従業員",
75
- "title.employees-by-department": "部署別の従業員",
81
+ "title.import employee": "社員の取り込み",
76
82
  "title.lookup system-user": "システムユーザーを検索",
77
83
  "title.my-approval-line template list": "自分の決裁ライン",
78
84
  "title.organization": "組織",
79
- "text.department-not-selected": "部署が選択されていません",
80
- "text.department-with-children-cannot-be-deleted": "下位部署がある部署は削除できません"
85
+ "title.recipients editor": "受信者リストの編集"
81
86
  }
@@ -9,9 +9,9 @@
9
9
  "button.register-account": "계정 등록",
10
10
  "button.view": "보기",
11
11
  "error.contact-information-required": "해당 직원의 연락처 정보가 필요합니다.",
12
+ "error.employee-already-registered": "해당 직원은 이미 시스템 사용자로 등록되어 있습니다.",
12
13
  "error.multiple-employees-for-user": "이 계정에 연결된 직원 정보가 둘 이상이어서 어느 직원으로 처리할지 알 수 없습니다. 도메인 관리자가 하나만 남겨야 합니다.",
13
14
  "error.no-employee-for-user": "이 계정에 연결된 직원 정보가 없습니다. 도메인 관리자가 직원 목록에서 연결해 줄 수 있습니다.",
14
- "error.employee-already-registered": "해당 직원은 이미 시스템 사용자로 등록되어 있습니다.",
15
15
  "field.approval-line": "결재선",
16
16
  "field.approver": "결재자",
17
17
  "field.control-no": "관리 번호",
@@ -36,6 +36,7 @@
36
36
  "label.control-no": "관리번호",
37
37
  "label.department": "부서",
38
38
  "label.employee": "직원",
39
+ "label.fold": "접기",
39
40
  "label.hired-on": "입사일",
40
41
  "label.job-position": "직급",
41
42
  "label.job-responsibility": "직책",
@@ -47,10 +48,16 @@
47
48
  "label.picture": "사진",
48
49
  "label.retired-at": "퇴사일",
49
50
  "prompt.sure to empty approval line ?": "결재라인을 비우시겠습니까 ?",
51
+ "text.add the first department": "관리번호와 이름을 적고 추가하십시오",
52
+ "text.all departments": "전체",
50
53
  "text.approval-line-empty": "결재자가 없습니다 — 올리면 곧 완료됩니다",
51
54
  "text.approver-unknown": "(이름 없음)",
52
55
  "text.deleted": "삭제했습니다",
56
+ "text.department-not-selected": "선택한 부서가 없습니다",
57
+ "text.department-with-children-cannot-be-deleted": "하위 부서가 있는 부서는 삭제할 수 없습니다",
58
+ "text.departments are made on the department screen": "부서는 부서 화면에서 만듭니다",
53
59
  "text.info_x_successfully": "{x}했습니다",
60
+ "text.no departments yet": "아직 부서가 없습니다",
54
61
  "text.no-common-approval-line-description": "공용 결재선은 조직이 정해 두는 결재 경로입니다. 모두가 골라 쓸 수 있습니다.",
55
62
  "text.no-common-approval-line-title": "공용 결재선이 없습니다",
56
63
  "text.no-my-approval-line-description": "자주 쓰는 결재 경로를 만들어 두면 올릴 때마다 다시 고르지 않아도 됩니다.",
@@ -70,12 +77,10 @@
70
77
  "title.common-approval-line template list": "공용 결재선",
71
78
  "title.contact list": "연락처 관리",
72
79
  "title.department list": "부서",
73
- "title.department tree": "부서 조직도",
74
80
  "title.employee list": "직원",
75
- "title.employees-by-department": "부서별 직원",
81
+ "title.import employee": "직원 가져오기",
76
82
  "title.lookup system-user": "시스템 사용자 검색",
77
83
  "title.my-approval-line template list": "내 결재선",
78
84
  "title.organization": "조직",
79
- "text.department-not-selected": "선택한 부서가 없습니다",
80
- "text.department-with-children-cannot-be-deleted": "하위 부서가 있는 부서는 삭제할 수 없습니다"
85
+ "title.recipients editor": "수신자 목록 편집"
81
86
  }
@@ -6,11 +6,12 @@
6
6
  "button.detach": "lepaskan",
7
7
  "button.edit-contact": "edit kenalan",
8
8
  "button.edit-detail": "edit butiran",
9
+ "button.register-account": "daftar akaun",
9
10
  "button.view": "lihat",
10
11
  "error.contact-information-required": "Maklumat hubungan diperlukan untuk pekerja ini.",
12
+ "error.employee-already-registered": "Pekerja ini sudah didaftarkan sebagai pengguna sistem.",
11
13
  "error.multiple-employees-for-user": "akaun ini dipautkan kepada lebih daripada satu rekod pekerja, jadi tidak jelas yang mana bertindak — pentadbir domain perlu meninggalkan satu",
12
14
  "error.no-employee-for-user": "akaun ini tidak dipautkan kepada rekod pekerja — pentadbir domain boleh memautkannya dalam senarai pekerja",
13
- "error.employee-already-registered": "Pekerja ini sudah didaftarkan sebagai pengguna sistem.",
14
15
  "field.approval-line": "talian kelulusan",
15
16
  "field.approver": "penyetuju",
16
17
  "field.control-no": "nombor kawalan",
@@ -35,6 +36,7 @@
35
36
  "label.control-no": "nombor kawalan",
36
37
  "label.department": "jabatan",
37
38
  "label.employee": "pekerja",
39
+ "label.fold": "lipat",
38
40
  "label.hired-on": "diberhentikan pada",
39
41
  "label.job-position": "jawatan kerja",
40
42
  "label.job-responsibility": "tanggungjawab kerja",
@@ -46,10 +48,16 @@
46
48
  "label.picture": "gambar",
47
49
  "label.retired-at": "bersara pada",
48
50
  "prompt.sure to empty approval line ?": "pasti mahu kosongkan garis kelulusan?",
51
+ "text.add the first department": "isi nombor kawalan dan nama, kemudian tambah",
52
+ "text.all departments": "semua",
49
53
  "text.approval-line-empty": "tiada pelulus — penghantaran selesai serta-merta",
50
54
  "text.approver-unknown": "(tiada nama)",
51
55
  "text.deleted": "dipadam",
56
+ "text.department-not-selected": "tiada jabatan dipilih",
57
+ "text.department-with-children-cannot-be-deleted": "jabatan yang mempunyai sub-jabatan tidak boleh dipadam",
58
+ "text.departments are made on the department screen": "jabatan dibuat pada skrin jabatan",
52
59
  "text.info_x_successfully": "{x} selesai",
60
+ "text.no departments yet": "belum ada jabatan",
53
61
  "text.no-common-approval-line-description": "talian kelulusan kongsi ialah laluan yang ditetapkan organisasi. semua orang boleh memilihnya.",
54
62
  "text.no-common-approval-line-title": "tiada talian kelulusan kongsi",
55
63
  "text.no-my-approval-line-description": "simpan laluan yang sering anda guna supaya anda tidak perlu memilihnya semula setiap kali.",
@@ -69,12 +77,10 @@
69
77
  "title.common-approval-line template list": "talian kelulusan kongsi",
70
78
  "title.contact list": "senarai kenalan",
71
79
  "title.department list": "jabatan",
72
- "title.department tree": "hierarki jabatan",
73
80
  "title.employee list": "pekerja",
74
- "title.employees-by-department": "pekerja mengikut jabatan",
81
+ "title.import employee": "import pekerja",
75
82
  "title.lookup system-user": "cari pengguna sistem",
76
83
  "title.my-approval-line template list": "talian kelulusan saya",
77
84
  "title.organization": "organisasi",
78
- "text.department-not-selected": "tiada jabatan dipilih",
79
- "text.department-with-children-cannot-be-deleted": "jabatan yang mempunyai sub-jabatan tidak boleh dipadam"
85
+ "title.recipients editor": "penyunting penerima"
80
86
  }
@@ -9,9 +9,9 @@
9
9
  "button.register-account": "注册账户",
10
10
  "button.view": "查看",
11
11
  "error.contact-information-required": "该员工需要联系信息。",
12
+ "error.employee-already-registered": "该员工已注册为系统用户。",
12
13
  "error.multiple-employees-for-user": "此账号关联了多条员工信息,无法判断以哪一位员工身份处理。域管理员需只保留一条。",
13
14
  "error.no-employee-for-user": "此账号未关联员工信息。域管理员可在员工列表中进行关联。",
14
- "error.employee-already-registered": "该员工已注册为系统用户。",
15
15
  "field.approval-line": "审批线",
16
16
  "field.approver": "审批人",
17
17
  "field.control-no": "控制编号",
@@ -36,6 +36,7 @@
36
36
  "label.control-no": "控制编号",
37
37
  "label.department": "部门",
38
38
  "label.employee": "员工",
39
+ "label.fold": "折叠",
39
40
  "label.hired-on": "入职日期",
40
41
  "label.job-position": "职位",
41
42
  "label.job-responsibility": "工作职责",
@@ -47,10 +48,16 @@
47
48
  "label.picture": "照片",
48
49
  "label.retired-at": "退休时间",
49
50
  "prompt.sure to empty approval line ?": "确定要清空审批行吗?",
51
+ "text.add the first department": "填写管理编号和名称后添加",
52
+ "text.all departments": "全部",
50
53
  "text.approval-line-empty": "没有审批人 — 提交后立即完成",
51
54
  "text.approver-unknown": "(无名称)",
52
55
  "text.deleted": "已删除",
56
+ "text.department-not-selected": "未选择部门",
57
+ "text.department-with-children-cannot-be-deleted": "有下级部门的部门不能删除",
58
+ "text.departments are made on the department screen": "部门在部门页面创建",
53
59
  "text.info_x_successfully": "已{x}",
60
+ "text.no departments yet": "尚无部门",
54
61
  "text.no-common-approval-line-description": "共用审批线是组织设定的审批路径,所有人都可以选用。",
55
62
  "text.no-common-approval-line-title": "没有共用审批线",
56
63
  "text.no-my-approval-line-description": "把常用的审批路径保存下来,以后提交时就不用每次重新选择。",
@@ -70,12 +77,10 @@
70
77
  "title.common-approval-line template list": "共用审批线",
71
78
  "title.contact list": "联系人列表",
72
79
  "title.department list": "部门",
73
- "title.department tree": "部门层级图",
74
80
  "title.employee list": "员工",
75
- "title.employees-by-department": "按部门分类的员工",
81
+ "title.import employee": "导入员工",
76
82
  "title.lookup system-user": "查找系统用户",
77
83
  "title.my-approval-line template list": "我的审批线",
78
84
  "title.organization": "组织",
79
- "text.department-not-selected": "未选择部门",
80
- "text.department-with-children-cannot-be-deleted": "有下级部门的部门不能删除"
85
+ "title.recipients editor": "收件人列表编辑"
81
86
  }
@@ -1,39 +0,0 @@
1
- import '@operato/data-tree';
2
- import '@operato/list-state/ox-page-state.js';
3
- import { PropertyValues } from 'lit';
4
- import { PageView } from '@operato/shell';
5
- import { DepartmentImporter } from './department-importer';
6
- import { Department } from '../../types/department';
7
- import { DepartmentView } from '../../component/department-view';
8
- declare const DepartmentTreePage_base: (new (...args: any[]) => import("lit").LitElement) & typeof PageView & import("@open-wc/dedupe-mixin").Constructor<import("@open-wc/scoped-elements/types/src/types").ScopedElementsHost>;
9
- export declare class DepartmentTreePage extends DepartmentTreePage_base {
10
- static styles: import("lit").CSSResult[];
11
- static get scopedElements(): {
12
- 'department-importer': typeof DepartmentImporter;
13
- };
14
- root?: Department;
15
- selected?: Department;
16
- department?: Department;
17
- modified: boolean;
18
- appendable: boolean;
19
- /** The first read of the tree; a refresh keeps the tree it has on screen. */
20
- loading: boolean;
21
- /** Why the tree could not be read - shown instead of an empty tree (ADR-0060 decision 8). */
22
- loadError: unknown;
23
- departmentView: DepartmentView;
24
- get context(): {
25
- title: string;
26
- help: string;
27
- };
28
- render(): import("lit-html").TemplateResult<1>;
29
- updated(changes: PropertyValues<this>): void;
30
- onSelect(e: CustomEvent): void;
31
- reset(): void;
32
- create(): Promise<void>;
33
- save(): Promise<void>;
34
- delete(): Promise<void>;
35
- pageInitialized(lifecycle: any): Promise<void>;
36
- pageUpdated(changes: any, lifecycle: any): Promise<void>;
37
- fetch(): Promise<void>;
38
- }
39
- export {};