@ketvietlab/ketsuite 0.1.5 → 0.1.7

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 (221) hide show
  1. package/dist/cli.js +1 -1
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/modules/backend/design/HANDOFF.md +2 -2
  7. package/dist/modules/backend/design/auth.css +12 -0
  8. package/dist/modules/backend/design/client/table-selection.d.mts +3 -3
  9. package/dist/modules/backend/design/client/table-selection.d.mts.map +1 -1
  10. package/dist/modules/backend/design/client/table-selection.mjs +1 -1
  11. package/dist/modules/backend/design/client/table-selection.mjs.map +4 -4
  12. package/dist/modules/backend/design/design-system.css +1 -1
  13. package/dist/modules/backend/design/forms.css +62 -1
  14. package/dist/modules/backend/design/lists.css +26 -18
  15. package/dist/modules/backend/design/record.css +20 -4
  16. package/dist/modules/backend/design/responsive.css +5 -1
  17. package/dist/modules/backend/design/user-workflow.css +257 -0
  18. package/dist/modules/backend/index.d.ts.map +1 -1
  19. package/dist/modules/backend/index.js +1 -0
  20. package/dist/modules/backend/index.js.map +1 -1
  21. package/dist/modules/backend/messages.d.ts.map +1 -1
  22. package/dist/modules/backend/messages.js +2 -0
  23. package/dist/modules/backend/messages.js.map +1 -1
  24. package/dist/modules/crm/functions.d.ts +5 -0
  25. package/dist/modules/crm/functions.d.ts.map +1 -1
  26. package/dist/modules/crm/functions.js +105 -10
  27. package/dist/modules/crm/functions.js.map +1 -1
  28. package/dist/modules/crm/jobs.d.ts.map +1 -1
  29. package/dist/modules/crm/jobs.js +1 -0
  30. package/dist/modules/crm/jobs.js.map +1 -1
  31. package/dist/modules/crm/operations.d.ts.map +1 -1
  32. package/dist/modules/crm/operations.js +2 -1
  33. package/dist/modules/crm/operations.js.map +1 -1
  34. package/dist/modules/crm_backend/index.d.ts.map +1 -1
  35. package/dist/modules/crm_backend/index.js +5 -2
  36. package/dist/modules/crm_backend/index.js.map +1 -1
  37. package/dist/modules/crm_backend/messages.d.ts +116 -0
  38. package/dist/modules/crm_backend/messages.d.ts.map +1 -1
  39. package/dist/modules/crm_backend/messages.js +122 -6
  40. package/dist/modules/crm_backend/messages.js.map +1 -1
  41. package/dist/modules/crm_backend/routes.d.ts.map +1 -1
  42. package/dist/modules/crm_backend/routes.js +434 -174
  43. package/dist/modules/crm_backend/routes.js.map +1 -1
  44. package/dist/modules/crm_backend/screens/case-create.d.ts +7 -0
  45. package/dist/modules/crm_backend/screens/case-create.d.ts.map +1 -1
  46. package/dist/modules/crm_backend/screens/case-create.js +13 -4
  47. package/dist/modules/crm_backend/screens/case-create.js.map +1 -1
  48. package/dist/modules/crm_backend/screens/case-detail.d.ts +6 -0
  49. package/dist/modules/crm_backend/screens/case-detail.d.ts.map +1 -1
  50. package/dist/modules/crm_backend/screens/case-detail.js +73 -23
  51. package/dist/modules/crm_backend/screens/case-detail.js.map +1 -1
  52. package/dist/modules/crm_backend/screens/configuration.d.ts +21 -3
  53. package/dist/modules/crm_backend/screens/configuration.d.ts.map +1 -1
  54. package/dist/modules/crm_backend/screens/configuration.js +260 -55
  55. package/dist/modules/crm_backend/screens/configuration.js.map +1 -1
  56. package/dist/modules/crm_backend/screens/index.d.ts +3 -3
  57. package/dist/modules/crm_backend/screens/index.d.ts.map +1 -1
  58. package/dist/modules/crm_backend/screens/index.js +2 -2
  59. package/dist/modules/crm_backend/screens/index.js.map +1 -1
  60. package/dist/modules/loyalty/admin-functions.d.ts +2 -0
  61. package/dist/modules/loyalty/admin-functions.d.ts.map +1 -1
  62. package/dist/modules/loyalty/admin-functions.js +96 -20
  63. package/dist/modules/loyalty/admin-functions.js.map +1 -1
  64. package/dist/modules/loyalty/engine.d.ts +4 -1
  65. package/dist/modules/loyalty/engine.d.ts.map +1 -1
  66. package/dist/modules/loyalty/engine.js +125 -18
  67. package/dist/modules/loyalty/engine.js.map +1 -1
  68. package/dist/modules/loyalty/index.d.ts.map +1 -1
  69. package/dist/modules/loyalty/index.js +4 -3
  70. package/dist/modules/loyalty/index.js.map +1 -1
  71. package/dist/modules/loyalty/jobs.d.ts.map +1 -1
  72. package/dist/modules/loyalty/jobs.js +0 -1
  73. package/dist/modules/loyalty/jobs.js.map +1 -1
  74. package/dist/modules/loyalty/membership-functions.d.ts +5 -0
  75. package/dist/modules/loyalty/membership-functions.d.ts.map +1 -1
  76. package/dist/modules/loyalty/membership-functions.js +37 -23
  77. package/dist/modules/loyalty/membership-functions.js.map +1 -1
  78. package/dist/modules/loyalty/messages.d.ts +14 -0
  79. package/dist/modules/loyalty/messages.d.ts.map +1 -1
  80. package/dist/modules/loyalty/messages.js +14 -0
  81. package/dist/modules/loyalty/messages.js.map +1 -1
  82. package/dist/modules/loyalty/models.d.ts.map +1 -1
  83. package/dist/modules/loyalty/models.js +17 -0
  84. package/dist/modules/loyalty/models.js.map +1 -1
  85. package/dist/modules/loyalty/order-functions.d.ts.map +1 -1
  86. package/dist/modules/loyalty/order-functions.js +70 -17
  87. package/dist/modules/loyalty/order-functions.js.map +1 -1
  88. package/dist/modules/loyalty/program-design.d.ts +11 -0
  89. package/dist/modules/loyalty/program-design.d.ts.map +1 -0
  90. package/dist/modules/loyalty/program-design.js +356 -0
  91. package/dist/modules/loyalty/program-design.js.map +1 -0
  92. package/dist/modules/loyalty/stats.d.ts +0 -13
  93. package/dist/modules/loyalty/stats.d.ts.map +1 -1
  94. package/dist/modules/loyalty/stats.js +11 -6
  95. package/dist/modules/loyalty/stats.js.map +1 -1
  96. package/dist/modules/loyalty/stored-value.d.ts.map +1 -1
  97. package/dist/modules/loyalty/stored-value.js +7 -2
  98. package/dist/modules/loyalty/stored-value.js.map +1 -1
  99. package/dist/modules/loyalty/types.d.ts +1 -1
  100. package/dist/modules/loyalty/types.d.ts.map +1 -1
  101. package/dist/modules/loyalty_backend/design-messages.d.ts +221 -0
  102. package/dist/modules/loyalty_backend/design-messages.d.ts.map +1 -0
  103. package/dist/modules/loyalty_backend/design-messages.js +221 -0
  104. package/dist/modules/loyalty_backend/design-messages.js.map +1 -0
  105. package/dist/modules/loyalty_backend/index.js +224 -412
  106. package/dist/modules/loyalty_backend/index.js.map +1 -1
  107. package/dist/modules/loyalty_backend/messages.d.ts +642 -214
  108. package/dist/modules/loyalty_backend/messages.d.ts.map +1 -1
  109. package/dist/modules/loyalty_backend/messages.js +19 -13
  110. package/dist/modules/loyalty_backend/messages.js.map +1 -1
  111. package/dist/modules/loyalty_backend/program-workspace.d.ts +4 -0
  112. package/dist/modules/loyalty_backend/program-workspace.d.ts.map +1 -0
  113. package/dist/modules/loyalty_backend/program-workspace.js +600 -0
  114. package/dist/modules/loyalty_backend/program-workspace.js.map +1 -0
  115. package/dist/modules/loyalty_backend/screens/index.d.ts +12 -36
  116. package/dist/modules/loyalty_backend/screens/index.d.ts.map +1 -1
  117. package/dist/modules/loyalty_backend/screens/index.js +148 -292
  118. package/dist/modules/loyalty_backend/screens/index.js.map +1 -1
  119. package/dist/modules/loyalty_backend/screens/page-frame.d.ts.map +1 -1
  120. package/dist/modules/loyalty_backend/screens/page-frame.js +2 -2
  121. package/dist/modules/loyalty_backend/screens/page-frame.js.map +1 -1
  122. package/dist/modules/loyalty_pos/functions.d.ts.map +1 -1
  123. package/dist/modules/loyalty_pos/functions.js +1 -0
  124. package/dist/modules/loyalty_pos/functions.js.map +1 -1
  125. package/dist/modules/loyalty_pos/index.js +1 -1
  126. package/dist/modules/loyalty_pos/index.js.map +1 -1
  127. package/dist/modules/loyalty_sale/functions.d.ts +1 -0
  128. package/dist/modules/loyalty_sale/functions.d.ts.map +1 -1
  129. package/dist/modules/loyalty_sale/functions.js +1 -0
  130. package/dist/modules/loyalty_sale/functions.js.map +1 -1
  131. package/dist/modules/partner_backend/client/partner.css +3 -1
  132. package/dist/modules/partner_backend/index.d.ts.map +1 -1
  133. package/dist/modules/partner_backend/index.js +4 -0
  134. package/dist/modules/partner_backend/index.js.map +1 -1
  135. package/dist/modules/partner_backend/routes.d.ts.map +1 -1
  136. package/dist/modules/partner_backend/routes.js +6 -1
  137. package/dist/modules/partner_backend/routes.js.map +1 -1
  138. package/dist/modules/partner_backend/screens/form.d.ts +1 -0
  139. package/dist/modules/partner_backend/screens/form.d.ts.map +1 -1
  140. package/dist/modules/partner_backend/screens/form.js +1 -0
  141. package/dist/modules/partner_backend/screens/form.js.map +1 -1
  142. package/dist/modules/user/authorization.d.ts +64 -1
  143. package/dist/modules/user/authorization.d.ts.map +1 -1
  144. package/dist/modules/user/authorization.js +445 -53
  145. package/dist/modules/user/authorization.js.map +1 -1
  146. package/dist/modules/user/functions.d.ts.map +1 -1
  147. package/dist/modules/user/functions.js +45 -23
  148. package/dist/modules/user/functions.js.map +1 -1
  149. package/dist/modules/user/index.d.ts +2 -1
  150. package/dist/modules/user/index.d.ts.map +1 -1
  151. package/dist/modules/user/index.js +1 -1
  152. package/dist/modules/user/index.js.map +1 -1
  153. package/dist/modules/user/models.d.ts.map +1 -1
  154. package/dist/modules/user/models.js +5 -0
  155. package/dist/modules/user/models.js.map +1 -1
  156. package/dist/modules/user/roles.d.ts.map +1 -1
  157. package/dist/modules/user/roles.js +2 -1
  158. package/dist/modules/user/roles.js.map +1 -1
  159. package/dist/modules/user_backend/access-routes.d.ts +31 -0
  160. package/dist/modules/user_backend/access-routes.d.ts.map +1 -0
  161. package/dist/modules/user_backend/access-routes.js +447 -0
  162. package/dist/modules/user_backend/access-routes.js.map +1 -0
  163. package/dist/modules/user_backend/index.d.ts +1 -0
  164. package/dist/modules/user_backend/index.d.ts.map +1 -1
  165. package/dist/modules/user_backend/index.js +1 -0
  166. package/dist/modules/user_backend/index.js.map +1 -1
  167. package/dist/modules/user_backend/routes.d.ts.map +1 -1
  168. package/dist/modules/user_backend/routes.js +10 -2
  169. package/dist/modules/user_backend/routes.js.map +1 -1
  170. package/dist/modules/website/cms.d.ts.map +1 -1
  171. package/dist/modules/website/cms.js +34 -7
  172. package/dist/modules/website/cms.js.map +1 -1
  173. package/dist/modules/website_backend/index.js +144 -0
  174. package/dist/modules/website_backend/index.js.map +1 -1
  175. package/dist/modules/website_backend/screens/index.d.ts +11 -0
  176. package/dist/modules/website_backend/screens/index.d.ts.map +1 -1
  177. package/dist/modules/website_backend/screens/index.js +335 -112
  178. package/dist/modules/website_backend/screens/index.js.map +1 -1
  179. package/dist/modules/website_backend/screens/page-frame.d.ts +2 -1
  180. package/dist/modules/website_backend/screens/page-frame.d.ts.map +1 -1
  181. package/dist/modules/website_backend/screens/page-frame.js +1 -1
  182. package/dist/modules/website_backend/screens/page-frame.js.map +1 -1
  183. package/dist/permission-catalogue.d.ts.map +1 -1
  184. package/dist/permission-catalogue.js +7 -0
  185. package/dist/permission-catalogue.js.map +1 -1
  186. package/dist/scaffold/index.js +1 -1
  187. package/dist/ui/client/table-selection-view.d.ts.map +1 -1
  188. package/dist/ui/client/table-selection-view.js +95 -1
  189. package/dist/ui/client/table-selection-view.js.map +1 -1
  190. package/dist/ui/client/user-workflow.d.ts +2 -0
  191. package/dist/ui/client/user-workflow.d.ts.map +1 -0
  192. package/dist/ui/client/user-workflow.js +141 -0
  193. package/dist/ui/client/user-workflow.js.map +1 -0
  194. package/dist/ui/form-page.d.ts +14 -4
  195. package/dist/ui/form-page.d.ts.map +1 -1
  196. package/dist/ui/form-page.js +11 -3
  197. package/dist/ui/form-page.js.map +1 -1
  198. package/dist/ui/form.d.ts +7 -0
  199. package/dist/ui/form.d.ts.map +1 -1
  200. package/dist/ui/form.js +28 -15
  201. package/dist/ui/form.js.map +1 -1
  202. package/dist/ui/icons.d.ts.map +1 -1
  203. package/dist/ui/icons.js +2 -0
  204. package/dist/ui/icons.js.map +1 -1
  205. package/dist/ui/index.d.ts +5 -1
  206. package/dist/ui/index.d.ts.map +1 -1
  207. package/dist/ui/index.js +4 -1
  208. package/dist/ui/index.js.map +1 -1
  209. package/dist/ui/layout.d.ts.map +1 -1
  210. package/dist/ui/layout.js +14 -4
  211. package/dist/ui/layout.js.map +1 -1
  212. package/dist/ui/nav.d.ts.map +1 -1
  213. package/dist/ui/nav.js +2 -1
  214. package/dist/ui/nav.js.map +1 -1
  215. package/dist/ui/table.js +1 -1
  216. package/dist/ui/table.js.map +1 -1
  217. package/dist/ui/user-workflow.d.ts +72 -0
  218. package/dist/ui/user-workflow.d.ts.map +1 -0
  219. package/dist/ui/user-workflow.js +144 -0
  220. package/dist/ui/user-workflow.js.map +1 -0
  221. package/package.json +8 -4
@@ -0,0 +1,447 @@
1
+ import { jsx as _jsx } from "@ketvietlab/ketjs-view/jsx-runtime";
2
+ import { randomUUID } from 'node:crypto';
3
+ import { text, json } from '@ketvietlab/ketjs';
4
+ import { adminPage, inLocale as localized } from '../backend/screen.js';
5
+ import { readForm, seeOther } from '../backend/forms.js';
6
+ import { AccessContext, AccessScope, dataTable, LinkButton, Notice, RecordPage, Section, stack, Tabs, UserSummary, UserWorkflow, ModalSheet, shell, } from '../../ui/index.js';
7
+ const inLocale = (url, target) => {
8
+ const result = new URL(localized(url, target), 'http://ket.local');
9
+ const back = url.searchParams.get('returnTo');
10
+ if (back && /^\/admin\/users(?:\?|$)/.test(back))
11
+ result.searchParams.set('returnTo', back);
12
+ return result.pathname + result.search;
13
+ };
14
+ const blocked = (req) => {
15
+ const origin = req.headers.origin;
16
+ if (!origin)
17
+ return false;
18
+ try {
19
+ return new URL(String(origin)).host !== req.headers.host;
20
+ }
21
+ catch {
22
+ return true;
23
+ }
24
+ };
25
+ const selection = (v) => Object.keys(v)
26
+ .filter((k) => k.startsWith('role.'))
27
+ .map((k) => k.slice(5));
28
+ const messages = {
29
+ E_ROLE_NOT_ASSIGNABLE: 'Có vai trò không còn khả dụng. Vui lòng chọn lại.',
30
+ E_ROLE_ALREADY_ASSIGNED: 'Vai trò đã được gán tại phạm vi này.',
31
+ E_ROLE_SELECTION_INVALID: 'Chọn một hoặc nhiều vai trò khác nhau.',
32
+ E_ASSIGNMENT_MEMBERSHIP_REQUIRED: 'Chưa có nơi làm việc. Chọn thêm nơi làm việc còn thiếu.',
33
+ E_ASSIGNMENT_SCOPE_INVALID: 'Chọn công ty và chi nhánh phù hợp.',
34
+ E_MEMBERSHIP_FORBIDDEN: 'Bạn không có quyền bổ sung nơi làm việc.',
35
+ E_AUTHORIZATION_REVISION_CONFLICT: 'Quyền vừa thay đổi. Kiểm tra lại nội dung trước khi xác nhận.',
36
+ E_EMAIL_UNAVAILABLE: 'Email đã được sử dụng.',
37
+ email_check_unavailable: 'Chưa kiểm tra được email. Vui lòng thử lại.',
38
+ 'user.error.loginUnique': 'Tên đăng nhập đã được sử dụng.',
39
+ unique: 'Tên đăng nhập đã được sử dụng.',
40
+ };
41
+ export const accessError = (result) => result.errors
42
+ ?.map((e) => messages[e.code] ??
43
+ (e.code === 'user.error.required'
44
+ ? 'Vui lòng điền đầy đủ thông tin và lý do.'
45
+ : 'Không thể lưu thay đổi. Kiểm tra lại thông tin.'))
46
+ .join(' ') ?? 'Không thể lưu thay đổi.';
47
+ export async function accessOptions(ctx, url, req) {
48
+ const [companies, roles] = (await Promise.all([
49
+ ctx.call('company.listCompanies', { includeArchived: false }, url, req),
50
+ ctx.call('user.listRoles', {}, url, req),
51
+ ]));
52
+ const branches = (await Promise.all(companies.map((c) => ctx.call('company.listBranches', { companyId: c.id, includeArchived: false }, url, req)))).flat();
53
+ return {
54
+ translate: ctx.translate(ctx.localeOf(url, req)),
55
+ companies: companies.map((c) => ({ id: String(c.id), name: String(c.name) })),
56
+ branches: branches.map((b) => ({
57
+ id: String(b.id),
58
+ name: String(b.name),
59
+ companyId: String(b.companyId),
60
+ isRoot: b.isRoot === true,
61
+ })),
62
+ roles,
63
+ };
64
+ }
65
+ const roleOptions = (roles) => roles
66
+ .filter((r) => r.mode === 'managed' && !r.healthIssues?.length)
67
+ .map((r) => ({ id: r.id, name: r.name, description: r.description ?? '' }));
68
+ const scopeName = (s, options) => s.scopeKind === 'tenant' || (!s.scopeKind && !s.companyId)
69
+ ? 'Toàn tổ chức'
70
+ : s.scopeKind === 'branch' && !options.branches.find((b) => b.id === s.branchId)?.isRoot
71
+ ? `${options.companies.find((c) => c.id === s.companyId)?.name ?? 'Công ty'} · ${options.branches.find((b) => b.id === s.branchId)?.name ?? 'Chi nhánh'}`
72
+ : (options.companies.find((c) => c.id === s.companyId)?.name ?? 'Công ty');
73
+ const auditScope = (key, options) => {
74
+ const company = options.companies.find((c) => key === `company:${c.id}`);
75
+ if (company)
76
+ return company.name;
77
+ const branch = options.branches.find((b) => key === `branch:${b.companyId}:${b.id}`);
78
+ return branch
79
+ ? `${options.companies.find((c) => c.id === branch.companyId)?.name ?? 'Công ty'} · ${branch.name}`
80
+ : 'Toàn tổ chức';
81
+ };
82
+ const path = (id, suffix = '') => `/admin/users/${encodeURIComponent(id)}${suffix}`;
83
+ const auditName = (event) => ({
84
+ 'authorization.assignment.created': 'Gán vai trò',
85
+ 'authorization.assignment.removed': 'Gỡ vai trò',
86
+ 'authorization.user.created': 'Tạo người dùng',
87
+ })[event] ?? 'Thay đổi quyền';
88
+ export const previewContent = (result, options) => !result.ok ? (_jsx(Notice, { tone: "warning", title: accessError(result), message: "" })) : (stack((result.contexts ?? []).map((c) => (_jsx(Section, { title: scopeName({ scopeKind: c.branchId ? 'branch' : 'company', ...c }, options), body: stack([
89
+ c.sensitiveChange ? (_jsx(Notice, { tone: "warning", title: "C\u00F3 thay \u0111\u1ED5i quy\u1EC1n nh\u1EA1y c\u1EA3m", message: "Ki\u1EC3m tra k\u1EF9 vai tr\u00F2 v\u00E0 ph\u1EA1m vi tr\u01B0\u1EDBc khi x\u00E1c nh\u1EADn." })) : null,
90
+ c.superuser ? (_jsx(Notice, { title: "Quy\u1EC1n \u0111\u1EB7c bi\u1EC7t \u0111ang c\u00F3 hi\u1EC7u l\u1EF1c", message: "Thay \u0111\u1ED5i vai tr\u00F2 ch\u01B0a l\u00E0m thay \u0111\u1ED5i quy\u1EC1n truy c\u1EADp \u0111\u1EB7c bi\u1EC7t." })) : c.bundles?.length ? (dataTable(options.translate, {
91
+ rows: c.bundles,
92
+ id: (b) => b.key,
93
+ columns: [
94
+ {
95
+ key: 'name',
96
+ label: 'Nghiệp vụ',
97
+ cell: (b) => b.labels?.vi ?? b.labels?.en ?? 'Nghiệp vụ',
98
+ },
99
+ {
100
+ key: 'before',
101
+ label: 'Trước',
102
+ cell: (b) => b.before === 0 ? 'Chưa có' : b.before === b.total ? 'Đầy đủ' : 'Có một phần',
103
+ },
104
+ {
105
+ key: 'after',
106
+ label: 'Sau',
107
+ cell: (b) => b.after === 0 ? 'Không còn' : b.after === b.total ? 'Đầy đủ' : 'Có một phần',
108
+ },
109
+ ],
110
+ })) : (_jsx(Notice, { title: "Kh\u00F4ng \u0111\u1ED5i quy\u1EC1n s\u1EED d\u1EE5ng nghi\u1EC7p v\u1EE5", message: "Quy\u1EC1n c\u00F3 th\u1EC3 v\u1EABn \u0111\u01B0\u1EE3c c\u1EA5p qua vai tr\u00F2 kh\u00E1c." })),
111
+ c.retainedBundles?.length ? (_jsx(Notice, { title: "Nghi\u1EC7p v\u1EE5 v\u1EABn \u0111\u01B0\u1EE3c gi\u1EEF", message: c.retainedBundles
112
+ .map((b) => `${b.labels?.vi ?? b.labels?.en ?? 'Nghiệp vụ'}${b.complete ? '' : ' (một phần)'}`)
113
+ .join('; ') })) : null,
114
+ ]) })))));
115
+ export async function renderAccess(ctx, url, req, id, tab = 'overview', modal) {
116
+ const [user, options] = await Promise.all([
117
+ ctx.call('user.getUser', { id }, url, req),
118
+ accessOptions(ctx, url, req),
119
+ ]);
120
+ if (!['GET', 'POST'].includes(req.method ?? 'GET'))
121
+ return text('GET', { status: 405 });
122
+ if (!user)
123
+ return text('Không tìm thấy người dùng', { status: 404 });
124
+ const externalIdentities = tab === 'overview'
125
+ ? await ctx.joint(url, req, 'user_backend:user.external-identities', { userId: id })
126
+ : null;
127
+ const canAssign = user.active && user.accessKind === 'internal' && (await ctx.allows('user.assignRoles', url, req)), canRemove = await ctx.allows('user.unassignScopedRole', url, req);
128
+ const names = new Map(options.roles.map((r) => [r.id, r.name])), companyId = url.searchParams.get('companyId') ?? user.memberships?.[0]?.companyId ?? '', branchId = url.searchParams.get('branchId') ?? '';
129
+ let content;
130
+ if (tab === 'access') {
131
+ const groups = new Map();
132
+ for (const a of user.assignments ?? []) {
133
+ const key = String(a.scopeKey ?? 'tenant');
134
+ groups.set(key, [...(groups.get(key) ?? []), a]);
135
+ }
136
+ content = stack([
137
+ canAssign ? (_jsx(LinkButton, { label: "G\u00E1n vai tr\u00F2", href: inLocale(url, path(id, '/assign')), variant: "primary" })) : null,
138
+ ...[...groups].map(([, rows]) => (_jsx(AccessScope, { title: scopeName(rows[0], options), children: dataTable(options.translate, {
139
+ rows,
140
+ id: (a) => a.id,
141
+ rowHref: (a) => inLocale(url, path(id, `/role/${encodeURIComponent(a.roleId)}`)),
142
+ columns: [
143
+ { key: 'role', label: 'Vai trò', cell: (a) => names.get(a.roleId) ?? 'Vai trò cũ' },
144
+ {
145
+ key: 'remove',
146
+ label: 'Thao tác',
147
+ cell: (a) => canRemove ? (_jsx(LinkButton, { label: "G\u1EE1", href: inLocale(url, path(id, `/remove/${encodeURIComponent(a.id)}`)), variant: "tertiary" })) : (''),
148
+ },
149
+ ],
150
+ }) }))),
151
+ ...(groups.size
152
+ ? []
153
+ : [_jsx(Notice, { title: "Ch\u01B0a g\u00E1n vai tr\u00F2", message: "G\u00E1n c\u00E1c vai tr\u00F2 c\u00F3 s\u1EB5n theo n\u01A1i l\u00E0m vi\u1EC7c." })]),
154
+ ]);
155
+ }
156
+ else if (tab === 'effective') {
157
+ const effective = (await ctx.call('user.effectiveAccess', { userId: id, companyId: companyId || null, branchId: branchId || null }, url, req));
158
+ const roleIds = new Set(effective.functions.flatMap((f) => f.paths.map((p) => p.roleId)));
159
+ const catalogue = (await ctx.call('user.permissionBundleCatalogue', {}, url, req));
160
+ const keys = new Set(effective.functions.map((f) => f.key));
161
+ const effectiveBundles = Object.values(catalogue.bundles).filter((b) => b.functions.some((k) => keys.has(k)));
162
+ content = stack([
163
+ _jsx(AccessContext, { action: inLocale(url, path(id, '/effective')), companyId: companyId, branchId: branchId, companies: options.companies.filter((c) => user.memberships?.some((m) => m.companyId === c.id)), branches: options.branches.filter((b) => user.branchMemberships?.some((m) => m.branchId === b.id)) }),
164
+ effective.superuser ? (_jsx(Notice, { title: "Quy\u1EC1n \u0111\u1EB7c bi\u1EC7t \u0111ang c\u00F3 hi\u1EC7u l\u1EF1c", message: "" })) : effective.issues.some((i) => i.code.startsWith('invalid-')) ? (_jsx(Notice, { title: "Ch\u1ECDn n\u01A1i l\u00E0m vi\u1EC7c h\u1EE3p l\u1EC7", message: "" })) : (dataTable(options.translate, {
165
+ rows: options.roles.filter((r) => roleIds.has(r.id)),
166
+ id: (r) => r.id,
167
+ rowHref: (r) => inLocale(url, path(id, `/role/${encodeURIComponent(r.id)}`)),
168
+ columns: [
169
+ { key: 'name', label: 'Vai trò có hiệu lực', cell: (r) => r.name },
170
+ { key: 'description', label: 'Công việc', cell: (r) => r.description ?? '' },
171
+ ],
172
+ })),
173
+ !effective.superuser && effectiveBundles.length ? (_jsx(Section, { title: "Nghi\u1EC7p v\u1EE5 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng", body: _jsx(UserSummary, { rows: effectiveBundles.map((b) => ({
174
+ label: b.labels?.vi ?? b.labels?.en ?? 'Nghiệp vụ',
175
+ value: b.functions.every((k) => keys.has(k)) ? 'Đầy đủ' : 'Có một phần',
176
+ })) }) })) : null,
177
+ ...effective.issues
178
+ .filter((i) => i.code.startsWith('stale-'))
179
+ .map(() => (_jsx(Notice, { tone: "warning", title: "C\u00F3 vai tr\u00F2 t\u1EA1m th\u1EDDi kh\u00F4ng kh\u1EA3 d\u1EE5ng", message: "Li\u00EAn h\u1EC7 ng\u01B0\u1EDDi ph\u1EE5 tr\u00E1ch h\u1EC7 th\u1ED1ng; c\u00E1c vai tr\u00F2 kh\u00E1c v\u1EABn \u0111\u01B0\u1EE3c \u0111\u00E1nh gi\u00E1 ri\u00EAng." }))),
180
+ ]);
181
+ }
182
+ else if (tab === 'audit') {
183
+ const events = (await ctx.call('user.listAuthorizationAudit', {
184
+ userId: id,
185
+ limit: 101,
186
+ ...(url.searchParams.has('beforeRevision')
187
+ ? {
188
+ beforeRevision: Number(url.searchParams.get('beforeRevision')),
189
+ beforeId: url.searchParams.get('beforeId') ?? undefined,
190
+ }
191
+ : {}),
192
+ }, url, req));
193
+ const actors = (await ctx.call('user.listUsers', { ids: [...new Set(events.map((e) => e.actorKey).filter(Boolean))], includeArchived: true }, url, req));
194
+ content = dataTable(options.translate, {
195
+ rows: events.slice(0, 100),
196
+ id: (e) => e.id,
197
+ rowHref: (e) => inLocale(url, path(id, `/audit/${encodeURIComponent(e.id)}`)),
198
+ columns: [
199
+ { key: 'at', label: 'Thời điểm', cell: (e) => String(e.occurredAt) },
200
+ { key: 'action', label: 'Thao tác', cell: (e) => auditName(e.event) },
201
+ {
202
+ key: 'actor',
203
+ label: 'Người thực hiện',
204
+ cell: (e) => actors.find((a) => a.id === e.actorKey)?.name ?? 'Hệ thống',
205
+ },
206
+ {
207
+ key: 'roles',
208
+ label: 'Vai trò',
209
+ cell: (e) => (e.metadata?.roleIds ?? [e.metadata?.roleId])
210
+ .filter(Boolean)
211
+ .map((r) => names.get(r) ?? 'Vai trò cũ')
212
+ .join(', '),
213
+ },
214
+ { key: 'scope', label: 'Phạm vi', cell: (e) => auditScope(e.scopeKey, options) },
215
+ { key: 'reason', label: 'Lý do', cell: (e) => e.reason ?? '' },
216
+ {
217
+ key: 'result',
218
+ label: 'Kết quả',
219
+ cell: (e) => (e.outcome === 'ok' ? 'Thành công' : 'Bị từ chối'),
220
+ },
221
+ ],
222
+ });
223
+ if (events.length > 100) {
224
+ const last = events[99];
225
+ content = stack([
226
+ content,
227
+ _jsx(LinkButton, { label: "S\u1EF1 ki\u1EC7n c\u0169 h\u01A1n", href: inLocale(url, path(id, `/audit?beforeRevision=${last.authorizationRevision}&beforeId=${encodeURIComponent(last.id)}`)) }),
228
+ ]);
229
+ }
230
+ }
231
+ else
232
+ content = stack([
233
+ _jsx(Section, { title: "Th\u00F4ng tin ng\u01B0\u1EDDi d\u00F9ng", body: _jsx(UserSummary, { rows: [
234
+ { label: 'Email', value: user.email ?? '—' },
235
+ { label: 'Trạng thái', value: user.active ? 'Đang hoạt động' : 'Ngừng hoạt động' },
236
+ { label: 'Vai trò đang giữ', value: String(user.assignments?.length ?? 0) },
237
+ {
238
+ label: 'Công ty',
239
+ value: (user.memberships ?? [])
240
+ .map((m) => options.companies.find((c) => c.id === m.companyId)?.name)
241
+ .filter(Boolean)
242
+ .join(', '),
243
+ },
244
+ ] }) }),
245
+ externalIdentities,
246
+ ]);
247
+ return adminPage(ctx, url, req, {
248
+ title: user.name,
249
+ translate: false,
250
+ active: '/admin/users',
251
+ body: (_, frame) => shell(_, user.name, _jsx(RecordPage, { frame: frame, title: user.name, description: user.login, actions: _jsx(LinkButton, { label: "Quay l\u1EA1i danh s\u00E1ch", href: url.searchParams.get('returnTo')?.match(/^\/admin\/users(?:\?|$)/)
252
+ ? url.searchParams.get('returnTo')
253
+ : localized(url, '/admin/users'), variant: "tertiary" }), body: stack([
254
+ _jsx(Tabs, { label: "H\u1ED3 s\u01A1 ng\u01B0\u1EDDi d\u00F9ng", items: [
255
+ ['overview', 'Tổng quan', ''],
256
+ ['access', 'Quyền truy cập', '/access'],
257
+ ['effective', 'Quyền hiệu lực', '/effective'],
258
+ ['audit', 'Nhật ký', '/audit'],
259
+ ].map(([key, label, suffix]) => ({
260
+ id: key,
261
+ label,
262
+ href: inLocale(url, path(id, suffix)),
263
+ active: key === tab,
264
+ })) }),
265
+ content,
266
+ modal,
267
+ ]) }), { ...frame, chrome: null, topbar: false }),
268
+ });
269
+ }
270
+ async function assignmentRoute(ctx, url, req, id, assignmentId) {
271
+ const removing = !!assignmentId, authority = removing ? 'user.unassignScopedRole' : 'user.assignRoles';
272
+ if (!(await ctx.allows(authority, url, req)))
273
+ return text('Không có quyền thực hiện', { status: 403 });
274
+ if (!['GET', 'POST'].includes(req.method ?? 'GET'))
275
+ return text('GET or POST', { status: 405 });
276
+ if (req.method === 'POST' && blocked(req))
277
+ return text('Forbidden', { status: 403 });
278
+ const [person, options, state] = await Promise.all([
279
+ ctx.call('user.getUser', { id }, url, req),
280
+ accessOptions(ctx, url, req),
281
+ ctx.call('user.authorizationState', {}, url, req),
282
+ ]);
283
+ if (!person)
284
+ return text('Không tìm thấy người dùng', { status: 404 });
285
+ const assignment = (person.assignments ?? []).find((a) => a.id === assignmentId);
286
+ if (removing && !assignment)
287
+ return seeOther(inLocale(url, path(id, '/access')));
288
+ const values = req.method === 'POST'
289
+ ? await readForm(req)
290
+ : {
291
+ idempotencyKey: randomUUID(),
292
+ companyId: url.searchParams.get('companyId') ?? person.memberships?.[0]?.companyId ?? '',
293
+ branchId: url.searchParams.get('branchId') ?? '',
294
+ scopeKind: url.searchParams.get('branchId') ? 'branch' : 'company',
295
+ expectedAuthorizationRevision: String(state.revision),
296
+ };
297
+ const args = {
298
+ userId: id,
299
+ roleIds: selection(values),
300
+ scopeKind: removing ? String(assignment.scopeKind ?? 'tenant') : (values.scopeKind ?? 'company'),
301
+ companyId: removing ? assignment.companyId : values.companyId || null,
302
+ branchId: removing ? assignment.branchId : values.branchId || null,
303
+ addMembership: values.addMembership === 'on',
304
+ };
305
+ const preview = (await ctx.call('user.previewRoleAssignment', { ...args, ...(removing ? { assignmentId } : {}) }, url, req));
306
+ let error = '';
307
+ if (req.method === 'POST' && values.command === 'confirm') {
308
+ if (!values.expectedAuthorizationRevision ||
309
+ !Number.isSafeInteger(Number(values.expectedAuthorizationRevision)))
310
+ error = 'Nội dung đã hết hạn. Kiểm tra lại trước khi xác nhận.';
311
+ else {
312
+ const result = (await ctx.call(authority, removing
313
+ ? {
314
+ assignmentId,
315
+ userId: id,
316
+ roleId: assignment.roleId,
317
+ scopeKey: assignment.scopeKey ?? 'tenant',
318
+ reason: values.reason ?? '',
319
+ expectedAuthorizationRevision: Number(values.expectedAuthorizationRevision),
320
+ idempotencyKey: values.idempotencyKey,
321
+ }
322
+ : {
323
+ ...args,
324
+ reason: values.reason ?? '',
325
+ expectedAuthorizationRevision: Number(values.expectedAuthorizationRevision),
326
+ idempotencyKey: values.idempotencyKey,
327
+ }, url, req));
328
+ if (result.ok)
329
+ return seeOther(inLocale(url, path(id, '/access')));
330
+ error = accessError(result);
331
+ }
332
+ }
333
+ const review = !removing &&
334
+ !!preview.ok &&
335
+ selection(values).length > 0 &&
336
+ ['preview', 'confirm'].includes(values.command);
337
+ if (!removing && req.method === 'POST' && values.command === 'preview' && !preview.ok)
338
+ error = accessError(preview);
339
+ const body = stack([
340
+ removing ? (_jsx(UserSummary, { rows: [
341
+ {
342
+ label: 'Vai trò',
343
+ value: options.roles.find((r) => r.id === assignment.roleId)?.name ?? 'Vai trò cũ',
344
+ },
345
+ { label: 'Phạm vi', value: scopeName(assignment, options) },
346
+ ] })) : null,
347
+ _jsx(UserWorkflow, { action: inLocale(url, url.pathname), cancelHref: inLocale(url, path(id, '/access')), values: values, step: 0, revision: state.revision, companies: options.companies, branches: options.branches, roles: roleOptions(options.roles).map((r) => ({
348
+ ...r,
349
+ assignedScopes: person.assignments
350
+ .filter((a) => a.roleId === r.id)
351
+ .map((a) => String(a.scopeKey ?? 'tenant')),
352
+ assigned: person.assignments.some((a) => a.roleId === r.id &&
353
+ String(a.scopeKey ?? 'tenant') ===
354
+ (values.scopeKind === 'tenant'
355
+ ? 'tenant'
356
+ : values.scopeKind === 'branch'
357
+ ? `branch:${values.companyId}:${values.branchId}`
358
+ : `company:${values.companyId}`)),
359
+ })), emailCheckUrl: "", mode: removing ? 'remove' : 'assign', error: error, review: review, preview: removing || review ? previewContent(preview, options) : undefined }),
360
+ ]);
361
+ return renderAccess(ctx, url, req, id, 'access', _jsx(ModalSheet, { title: removing ? 'Gỡ vai trò' : 'Gán thêm vai trò',
362
+ description: person.name,
363
+ closeHref: inLocale(url, path(id, '/access')),
364
+ closeLabel: 'Đóng',
365
+ presentation: 'dialog',
366
+ size: 'large',
367
+ body }));
368
+ }
369
+ export const accessRoutes = {
370
+ '/admin/users/check-email': (ctx) => async (url, req) => {
371
+ if (req.method !== 'POST')
372
+ return text('POST', { status: 405 });
373
+ if (blocked(req))
374
+ return text('Forbidden', { status: 403 });
375
+ const form = await readForm(req);
376
+ return json(await ctx.call('user.checkUserEmail', { email: form.email ?? '' }, url, req));
377
+ },
378
+ '/admin/users/{id}/access': (ctx) => async (url, req, p) => renderAccess(ctx, url, req, p.id, 'access'),
379
+ '/admin/users/{id}/effective': (ctx) => async (url, req, p) => renderAccess(ctx, url, req, p.id, 'effective'),
380
+ '/admin/users/{id}/audit': (ctx) => async (url, req, p) => renderAccess(ctx, url, req, p.id, 'audit'),
381
+ '/admin/users/{id}/assign': (ctx) => async (url, req, p) => assignmentRoute(ctx, url, req, p.id),
382
+ '/admin/users/{id}/remove/{assignmentId}': (ctx) => async (url, req, p) => assignmentRoute(ctx, url, req, p.id, p.assignmentId),
383
+ '/admin/users/{id}/audit/{eventId}': (ctx) => async (url, req, p) => {
384
+ if (req.method !== 'GET')
385
+ return text('GET', { status: 405 });
386
+ const [events, options] = await Promise.all([
387
+ ctx.call('user.listAuthorizationAudit', { userId: p.id, id: p.eventId }, url, req),
388
+ accessOptions(ctx, url, req),
389
+ ]);
390
+ const event = events[0];
391
+ if (!event)
392
+ return text('Không tìm thấy thay đổi', { status: 404 });
393
+ const actors = (await ctx.call('user.listUsers', { ids: event.actorKey ? [event.actorKey] : [], includeArchived: true }, url, req));
394
+ return renderAccess(ctx, url, req, p.id, 'audit', _jsx(ModalSheet, { title: 'Chi tiết thay đổi quyền',
395
+ closeLabel: 'Đóng',
396
+ closeHref: inLocale(url, path(p.id, '/audit')),
397
+ presentation: 'dialog',
398
+ body: (_jsx(UserSummary, { rows: [
399
+ { label: 'Thời điểm', value: String(event.occurredAt) },
400
+ { label: 'Thao tác', value: auditName(event.event) },
401
+ {
402
+ label: 'Người thực hiện',
403
+ value: actors.find((a) => a.id === event.actorKey)?.name ?? 'Hệ thống',
404
+ },
405
+ {
406
+ label: 'Vai trò',
407
+ value: (event.metadata?.roleIds ?? [event.metadata?.roleId])
408
+ .filter(Boolean)
409
+ .map((id) => options.roles.find((r) => r.id === id)?.name ?? 'Vai trò cũ')
410
+ .join(', '),
411
+ },
412
+ { label: 'Phạm vi', value: auditScope(event.scopeKey, options) },
413
+ { label: 'Lý do', value: event.reason ?? '' },
414
+ { label: 'Kết quả', value: event.outcome === 'ok' ? 'Thành công' : 'Bị từ chối' },
415
+ ] })) }));
416
+ },
417
+ '/admin/users/{id}/role/{roleId}': (ctx) => async (url, req, p) => {
418
+ if (req.method !== 'GET')
419
+ return text('GET', { status: 405 });
420
+ const role = (await ctx.call('user.getRole', { id: p.roleId }, url, req));
421
+ if (!role)
422
+ return text('Không tìm thấy vai trò', { status: 404 });
423
+ const options = await accessOptions(ctx, url, req);
424
+ const catalogue = (await ctx.call('user.permissionBundleCatalogue', {}, url, req));
425
+ const keys = new Set((role.grants ?? []).map((g) => g.fnKey));
426
+ const bundles = Object.values(catalogue.bundles).filter((b) => b.functions.some((k) => keys.has(k)));
427
+ return renderAccess(ctx, url, req, p.id, 'access', _jsx(ModalSheet, { title: role.name,
428
+ description: 'Vai trò do hệ thống định nghĩa',
429
+ closeHref: inLocale(url, path(p.id, '/access')),
430
+ closeLabel: 'Đóng',
431
+ presentation: 'dialog',
432
+ body: (_jsx(UserSummary, { rows: [
433
+ { label: 'Công việc', value: role.description ?? '' },
434
+ ...bundles.map((b) => ({
435
+ label: b.labels.vi ?? b.labels.en,
436
+ value: b.functions.every((k) => keys.has(k)) ? 'Đầy đủ' : 'Có một phần',
437
+ })),
438
+ {
439
+ label: 'Tình trạng',
440
+ value: options.roles.find((r) => r.id === role.id)?.healthIssues?.length
441
+ ? 'Tạm thời không khả dụng'
442
+ : 'Đang có hiệu lực',
443
+ },
444
+ ] })) }));
445
+ },
446
+ };
447
+ //# sourceMappingURL=access-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-routes.js","sourceRoot":"","sources":["../../../../../../../packages/ketsuite/src/modules/user_backend/access-routes.tsx"],"names":[],"mappings":"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"}
@@ -2,4 +2,5 @@ declare const _default: import("@ketvietlab/ketjs").KetModule;
2
2
  export default _default;
3
3
  export { routes } from './routes.ts';
4
4
  export { presetsScreen, profileScreen, roleScreen, rolesScreen, sessionsScreen, userFormScreen, usersScreen, } from './screens/index.ts';
5
+ export { accessError, accessOptions } from './access-routes.tsx';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/ketsuite/src/modules/user_backend/index.ts"],"names":[],"mappings":";;AAqBA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EACL,aAAa,EACb,aAAa,EACb,UAAU,EACV,WAAW,EACX,cAAc,EACd,cAAc,EACd,WAAW,GACZ,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/ketsuite/src/modules/user_backend/index.ts"],"names":[],"mappings":";;AAqBA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EACL,aAAa,EACb,aAAa,EACb,UAAU,EACV,WAAW,EACX,cAAc,EACd,cAAc,EACd,WAAW,GACZ,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA"}
@@ -19,4 +19,5 @@ export default defineModule({
19
19
  });
20
20
  export { routes } from './routes.js';
21
21
  export { presetsScreen, profileScreen, roleScreen, rolesScreen, sessionsScreen, userFormScreen, usersScreen, } from './screens/index.js';
22
+ export { accessError, accessOptions } from './access-routes.js';
22
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/ketsuite/src/modules/user_backend/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,eAAe,YAAY,CAAC;IAC1B,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;IACvC,KAAK,EAAE,0BAA0B;IACjC,OAAO,EAAE,2DAA2D;IACpE,QAAQ,EAAE,UAAU;IACpB,MAAM;IACN,KAAK;IACL,QAAQ;IACR,MAAM,EAAE;QACN,0BAA0B,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;QACvD,6BAA6B,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;KAC3D;CACF,CAAC,CAAA;AAEF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EACL,aAAa,EACb,aAAa,EACb,UAAU,EACV,WAAW,EACX,cAAc,EACd,cAAc,EACd,WAAW,GACZ,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/ketsuite/src/modules/user_backend/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,eAAe,YAAY,CAAC;IAC1B,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;IACvC,KAAK,EAAE,0BAA0B;IACjC,OAAO,EAAE,2DAA2D;IACpE,QAAQ,EAAE,UAAU;IACpB,MAAM;IACN,KAAK;IACL,QAAQ;IACR,MAAM,EAAE;QACN,0BAA0B,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;QACvD,6BAA6B,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;KAC3D;CACF,CAAC,CAAA;AAEF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EACL,aAAa,EACb,aAAa,EACb,UAAU,EACV,WAAW,EACX,cAAc,EACd,cAAc,EACd,WAAW,GACZ,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAqB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../../../../packages/ketsuite/src/modules/user_backend/routes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAS,UAAU,EAAgC,MAAM,mBAAmB,CAAA;AAsRxF,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CA+wB7C,CAAA"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../../../../packages/ketsuite/src/modules/user_backend/routes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAS,UAAU,EAAgC,MAAM,mBAAmB,CAAA;AAwRxF,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAqxB7C,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { accessRoutes, renderAccess } from './access-routes.js';
1
2
  import { randomUUID } from 'node:crypto';
2
3
  import { text } from '@ketvietlab/ketjs';
3
4
  import { readForm, seeOther } from '../backend/forms.js';
@@ -17,6 +18,7 @@ const crossSite = (req) => {
17
18
  };
18
19
  const validCreateId = (value) => typeof value === 'string' &&
19
20
  /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);
21
+ const accountCreationRoute = ['/admin/users/new', 'account'].join('/');
20
22
  const safeUserReturnTo = (url, submitted) => {
21
23
  const fallback = inLocale(url, '/admin/users');
22
24
  if (!submitted?.startsWith('/'))
@@ -166,9 +168,12 @@ const desired = (form, prefix) => Object.keys(form)
166
168
  .map((key) => key.slice(prefix.length + 1));
167
169
  const failure = (ctx, url, req, result) => text(translatedErrors(ctx, url, req, result).join('\n'), { status: 400 });
168
170
  export const routes = {
171
+ ...accessRoutes,
169
172
  '/admin/users': (ctx) => async (url, req) => {
170
173
  if (req.method !== 'GET')
171
174
  return text('GET', { status: 405 });
175
+ if ((await ctx.live(req)).routes['/admin/users/directory'])
176
+ return seeOther(`/admin/users/directory${url.search}`);
172
177
  const _ = ctx.translate(ctx.localeOf(url, req));
173
178
  const includeArchived = url.searchParams.get('archived') === '1';
174
179
  const search = searchOf(url) ?? '';
@@ -213,6 +218,9 @@ export const routes = {
213
218
  });
214
219
  },
215
220
  '/admin/users/new': (ctx) => async (url, req) => {
221
+ // Identity adapters own this optional account-creation extension route.
222
+ if ((await ctx.live(req)).routes[accountCreationRoute])
223
+ return seeOther(inLocale(url, accountCreationRoute));
216
224
  const _ = ctx.translate(ctx.localeOf(url, req));
217
225
  if (req.method !== 'GET' && req.method !== 'POST')
218
226
  return text('GET or POST', { status: 405 });
@@ -262,7 +270,7 @@ export const routes = {
262
270
  },
263
271
  '/admin/users/{id}': (ctx) => async (url, req, params) => {
264
272
  if (req.method === 'GET')
265
- return renderUser(ctx, url, req, params.id);
273
+ return renderAccess(ctx, url, req, params.id);
266
274
  if (req.method !== 'POST')
267
275
  return text('GET or POST', { status: 405 });
268
276
  if (crossSite(req))
@@ -282,7 +290,7 @@ export const routes = {
282
290
  partnerId: form.partnerId || null,
283
291
  accessKind: form.accessKind ?? 'internal',
284
292
  active: form.active === '1',
285
- superuser: form.superuser === '1',
293
+ superuser: before.superuser === true,
286
294
  }, url, req));
287
295
  if (!result.ok)
288
296
  return renderUser(ctx, url, req, params.id, {