@abpjs/identity 0.7.6

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.
package/dist/index.js ADDED
@@ -0,0 +1,1161 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ IDENTITY_POLICIES: () => IDENTITY_POLICIES,
24
+ IDENTITY_ROUTES: () => IDENTITY_ROUTES,
25
+ IDENTITY_ROUTE_PATHS: () => IDENTITY_ROUTE_PATHS,
26
+ IdentityService: () => IdentityService,
27
+ RolesComponent: () => RolesComponent,
28
+ UsersComponent: () => UsersComponent,
29
+ useIdentity: () => useIdentity,
30
+ useRoles: () => useRoles,
31
+ useUsers: () => useUsers
32
+ });
33
+ module.exports = __toCommonJS(index_exports);
34
+
35
+ // src/services/identity.service.ts
36
+ var IdentityService = class {
37
+ constructor(rest) {
38
+ this.rest = rest;
39
+ }
40
+ // ========================
41
+ // Role Operations
42
+ // ========================
43
+ /**
44
+ * Get all roles
45
+ * @returns Promise with paginated role response
46
+ */
47
+ getRoles() {
48
+ return this.rest.request({
49
+ method: "GET",
50
+ url: "/api/identity/roles"
51
+ });
52
+ }
53
+ /**
54
+ * Get a role by ID
55
+ * @param id - The role ID
56
+ * @returns Promise with the role item
57
+ */
58
+ getRoleById(id) {
59
+ return this.rest.request({
60
+ method: "GET",
61
+ url: `/api/identity/roles/${id}`
62
+ });
63
+ }
64
+ /**
65
+ * Delete a role
66
+ * @param id - The role ID to delete
67
+ * @returns Promise with the deleted role
68
+ */
69
+ deleteRole(id) {
70
+ return this.rest.request({
71
+ method: "DELETE",
72
+ url: `/api/identity/roles/${id}`
73
+ });
74
+ }
75
+ /**
76
+ * Create a new role
77
+ * @param body - The role data to create
78
+ * @returns Promise with the created role
79
+ */
80
+ createRole(body) {
81
+ return this.rest.request({
82
+ method: "POST",
83
+ url: "/api/identity/roles",
84
+ body
85
+ });
86
+ }
87
+ /**
88
+ * Update an existing role
89
+ * @param id - The role ID to update
90
+ * @param body - The updated role data
91
+ * @returns Promise with the updated role
92
+ */
93
+ updateRole(id, body) {
94
+ return this.rest.request({
95
+ method: "PUT",
96
+ url: `/api/identity/roles/${id}`,
97
+ body
98
+ });
99
+ }
100
+ // ========================
101
+ // User Operations
102
+ // ========================
103
+ /**
104
+ * Get users with pagination and filtering
105
+ * @param params - Query parameters for pagination and filtering
106
+ * @returns Promise with paginated user response
107
+ */
108
+ getUsers(params = {}) {
109
+ return this.rest.request({
110
+ method: "GET",
111
+ url: "/api/identity/users",
112
+ params
113
+ });
114
+ }
115
+ /**
116
+ * Get a user by ID
117
+ * @param id - The user ID
118
+ * @returns Promise with the user item
119
+ */
120
+ getUserById(id) {
121
+ return this.rest.request({
122
+ method: "GET",
123
+ url: `/api/identity/users/${id}`
124
+ });
125
+ }
126
+ /**
127
+ * Get roles assigned to a user
128
+ * @param id - The user ID
129
+ * @returns Promise with the user's roles
130
+ */
131
+ getUserRoles(id) {
132
+ return this.rest.request({
133
+ method: "GET",
134
+ url: `/api/identity/users/${id}/roles`
135
+ });
136
+ }
137
+ /**
138
+ * Delete a user
139
+ * @param id - The user ID to delete
140
+ * @returns Promise resolving when complete
141
+ */
142
+ deleteUser(id) {
143
+ return this.rest.request({
144
+ method: "DELETE",
145
+ url: `/api/identity/users/${id}`
146
+ });
147
+ }
148
+ /**
149
+ * Create a new user
150
+ * @param body - The user data to create
151
+ * @returns Promise with the created user
152
+ */
153
+ createUser(body) {
154
+ return this.rest.request({
155
+ method: "POST",
156
+ url: "/api/identity/users",
157
+ body
158
+ });
159
+ }
160
+ /**
161
+ * Update an existing user
162
+ * @param id - The user ID to update
163
+ * @param body - The updated user data
164
+ * @returns Promise with the updated user
165
+ */
166
+ updateUser(id, body) {
167
+ return this.rest.request({
168
+ method: "PUT",
169
+ url: `/api/identity/users/${id}`,
170
+ body
171
+ });
172
+ }
173
+ };
174
+
175
+ // src/hooks/useRoles.ts
176
+ var import_react = require("react");
177
+ var import_core = require("@abpjs/core");
178
+ function useRoles() {
179
+ const restService = (0, import_core.useRestService)();
180
+ const service = (0, import_react.useMemo)(() => new IdentityService(restService), [restService]);
181
+ const [roles, setRoles] = (0, import_react.useState)([]);
182
+ const [totalCount, setTotalCount] = (0, import_react.useState)(0);
183
+ const [selectedRole, setSelectedRole] = (0, import_react.useState)(null);
184
+ const [isLoading, setIsLoading] = (0, import_react.useState)(false);
185
+ const [error, setError] = (0, import_react.useState)(null);
186
+ const fetchRoles = (0, import_react.useCallback)(async () => {
187
+ setIsLoading(true);
188
+ setError(null);
189
+ try {
190
+ const response = await service.getRoles();
191
+ setRoles(response.items || []);
192
+ setTotalCount(response.totalCount || 0);
193
+ setIsLoading(false);
194
+ return { success: true };
195
+ } catch (err) {
196
+ const errorMessage = err instanceof Error ? err.message : "Failed to fetch roles";
197
+ setError(errorMessage);
198
+ setIsLoading(false);
199
+ return { success: false, error: errorMessage };
200
+ }
201
+ }, [service]);
202
+ const getRoleById = (0, import_react.useCallback)(
203
+ async (id) => {
204
+ setIsLoading(true);
205
+ setError(null);
206
+ try {
207
+ const role = await service.getRoleById(id);
208
+ setSelectedRole(role);
209
+ setIsLoading(false);
210
+ return { success: true };
211
+ } catch (err) {
212
+ const errorMessage = err instanceof Error ? err.message : "Failed to fetch role";
213
+ setError(errorMessage);
214
+ setIsLoading(false);
215
+ return { success: false, error: errorMessage };
216
+ }
217
+ },
218
+ [service]
219
+ );
220
+ const createRole = (0, import_react.useCallback)(
221
+ async (role) => {
222
+ setIsLoading(true);
223
+ setError(null);
224
+ try {
225
+ await service.createRole(role);
226
+ await fetchRoles();
227
+ return { success: true };
228
+ } catch (err) {
229
+ const errorMessage = err instanceof Error ? err.message : "Failed to create role";
230
+ setError(errorMessage);
231
+ setIsLoading(false);
232
+ return { success: false, error: errorMessage };
233
+ }
234
+ },
235
+ [service, fetchRoles]
236
+ );
237
+ const updateRole = (0, import_react.useCallback)(
238
+ async (id, role) => {
239
+ setIsLoading(true);
240
+ setError(null);
241
+ try {
242
+ await service.updateRole(id, role);
243
+ await fetchRoles();
244
+ return { success: true };
245
+ } catch (err) {
246
+ const errorMessage = err instanceof Error ? err.message : "Failed to update role";
247
+ setError(errorMessage);
248
+ setIsLoading(false);
249
+ return { success: false, error: errorMessage };
250
+ }
251
+ },
252
+ [service, fetchRoles]
253
+ );
254
+ const deleteRole = (0, import_react.useCallback)(
255
+ async (id) => {
256
+ setIsLoading(true);
257
+ setError(null);
258
+ try {
259
+ await service.deleteRole(id);
260
+ await fetchRoles();
261
+ return { success: true };
262
+ } catch (err) {
263
+ const errorMessage = err instanceof Error ? err.message : "Failed to delete role";
264
+ setError(errorMessage);
265
+ setIsLoading(false);
266
+ return { success: false, error: errorMessage };
267
+ }
268
+ },
269
+ [service, fetchRoles]
270
+ );
271
+ const reset = (0, import_react.useCallback)(() => {
272
+ setRoles([]);
273
+ setTotalCount(0);
274
+ setSelectedRole(null);
275
+ setIsLoading(false);
276
+ setError(null);
277
+ }, []);
278
+ return {
279
+ roles,
280
+ totalCount,
281
+ selectedRole,
282
+ isLoading,
283
+ error,
284
+ fetchRoles,
285
+ getRoleById,
286
+ createRole,
287
+ updateRole,
288
+ deleteRole,
289
+ setSelectedRole,
290
+ reset
291
+ };
292
+ }
293
+
294
+ // src/hooks/useUsers.ts
295
+ var import_react2 = require("react");
296
+ var import_core2 = require("@abpjs/core");
297
+ var DEFAULT_PAGE_QUERY = {
298
+ sorting: "userName",
299
+ skipCount: 0,
300
+ maxResultCount: 10
301
+ };
302
+ function useUsers() {
303
+ const restService = (0, import_core2.useRestService)();
304
+ const service = (0, import_react2.useMemo)(() => new IdentityService(restService), [restService]);
305
+ const [users, setUsers] = (0, import_react2.useState)([]);
306
+ const [totalCount, setTotalCount] = (0, import_react2.useState)(0);
307
+ const [selectedUser, setSelectedUser] = (0, import_react2.useState)(null);
308
+ const [selectedUserRoles, setSelectedUserRoles] = (0, import_react2.useState)([]);
309
+ const [isLoading, setIsLoading] = (0, import_react2.useState)(false);
310
+ const [error, setError] = (0, import_react2.useState)(null);
311
+ const [pageQuery, setPageQuery] = (0, import_react2.useState)(DEFAULT_PAGE_QUERY);
312
+ const fetchUsers = (0, import_react2.useCallback)(
313
+ async (params) => {
314
+ setIsLoading(true);
315
+ setError(null);
316
+ const queryParams = params || pageQuery;
317
+ try {
318
+ const response = await service.getUsers(queryParams);
319
+ setUsers(response.items || []);
320
+ setTotalCount(response.totalCount || 0);
321
+ setIsLoading(false);
322
+ return { success: true };
323
+ } catch (err) {
324
+ const errorMessage = err instanceof Error ? err.message : "Failed to fetch users";
325
+ setError(errorMessage);
326
+ setIsLoading(false);
327
+ return { success: false, error: errorMessage };
328
+ }
329
+ },
330
+ [service, pageQuery]
331
+ );
332
+ const getUserById = (0, import_react2.useCallback)(
333
+ async (id) => {
334
+ setIsLoading(true);
335
+ setError(null);
336
+ try {
337
+ const user = await service.getUserById(id);
338
+ setSelectedUser(user);
339
+ setIsLoading(false);
340
+ return { success: true };
341
+ } catch (err) {
342
+ const errorMessage = err instanceof Error ? err.message : "Failed to fetch user";
343
+ setError(errorMessage);
344
+ setIsLoading(false);
345
+ return { success: false, error: errorMessage };
346
+ }
347
+ },
348
+ [service]
349
+ );
350
+ const getUserRoles = (0, import_react2.useCallback)(
351
+ async (id) => {
352
+ setIsLoading(true);
353
+ setError(null);
354
+ try {
355
+ const response = await service.getUserRoles(id);
356
+ setSelectedUserRoles(response.items || []);
357
+ setIsLoading(false);
358
+ return { success: true };
359
+ } catch (err) {
360
+ const errorMessage = err instanceof Error ? err.message : "Failed to fetch user roles";
361
+ setError(errorMessage);
362
+ setIsLoading(false);
363
+ return { success: false, error: errorMessage };
364
+ }
365
+ },
366
+ [service]
367
+ );
368
+ const createUser = (0, import_react2.useCallback)(
369
+ async (user) => {
370
+ setIsLoading(true);
371
+ setError(null);
372
+ try {
373
+ await service.createUser(user);
374
+ await fetchUsers();
375
+ return { success: true };
376
+ } catch (err) {
377
+ const errorMessage = err instanceof Error ? err.message : "Failed to create user";
378
+ setError(errorMessage);
379
+ setIsLoading(false);
380
+ return { success: false, error: errorMessage };
381
+ }
382
+ },
383
+ [service, fetchUsers]
384
+ );
385
+ const updateUser = (0, import_react2.useCallback)(
386
+ async (id, user) => {
387
+ setIsLoading(true);
388
+ setError(null);
389
+ try {
390
+ await service.updateUser(id, user);
391
+ await fetchUsers();
392
+ return { success: true };
393
+ } catch (err) {
394
+ const errorMessage = err instanceof Error ? err.message : "Failed to update user";
395
+ setError(errorMessage);
396
+ setIsLoading(false);
397
+ return { success: false, error: errorMessage };
398
+ }
399
+ },
400
+ [service, fetchUsers]
401
+ );
402
+ const deleteUser = (0, import_react2.useCallback)(
403
+ async (id) => {
404
+ setIsLoading(true);
405
+ setError(null);
406
+ try {
407
+ await service.deleteUser(id);
408
+ await fetchUsers();
409
+ return { success: true };
410
+ } catch (err) {
411
+ const errorMessage = err instanceof Error ? err.message : "Failed to delete user";
412
+ setError(errorMessage);
413
+ setIsLoading(false);
414
+ return { success: false, error: errorMessage };
415
+ }
416
+ },
417
+ [service, fetchUsers]
418
+ );
419
+ const reset = (0, import_react2.useCallback)(() => {
420
+ setUsers([]);
421
+ setTotalCount(0);
422
+ setSelectedUser(null);
423
+ setSelectedUserRoles([]);
424
+ setIsLoading(false);
425
+ setError(null);
426
+ setPageQuery(DEFAULT_PAGE_QUERY);
427
+ }, []);
428
+ return {
429
+ users,
430
+ totalCount,
431
+ selectedUser,
432
+ selectedUserRoles,
433
+ isLoading,
434
+ error,
435
+ pageQuery,
436
+ fetchUsers,
437
+ getUserById,
438
+ getUserRoles,
439
+ createUser,
440
+ updateUser,
441
+ deleteUser,
442
+ setSelectedUser,
443
+ setPageQuery,
444
+ reset
445
+ };
446
+ }
447
+
448
+ // src/hooks/useIdentity.ts
449
+ var import_react3 = require("react");
450
+ function useIdentity() {
451
+ const rolesHook = useRoles();
452
+ const usersHook = useUsers();
453
+ const isLoading = (0, import_react3.useMemo)(
454
+ () => rolesHook.isLoading || usersHook.isLoading,
455
+ [rolesHook.isLoading, usersHook.isLoading]
456
+ );
457
+ const error = (0, import_react3.useMemo)(
458
+ () => rolesHook.error || usersHook.error,
459
+ [rolesHook.error, usersHook.error]
460
+ );
461
+ const resetAll = (0, import_react3.useCallback)(() => {
462
+ rolesHook.reset();
463
+ usersHook.reset();
464
+ }, [rolesHook, usersHook]);
465
+ return {
466
+ roles: rolesHook,
467
+ users: usersHook,
468
+ isLoading,
469
+ error,
470
+ resetAll
471
+ };
472
+ }
473
+
474
+ // src/components/Roles/RolesComponent.tsx
475
+ var import_react4 = require("react");
476
+ var import_core3 = require("@abpjs/core");
477
+ var import_theme_shared = require("@abpjs/theme-shared");
478
+ var import_permission_management = require("@abpjs/permission-management");
479
+ var import_react5 = require("@chakra-ui/react");
480
+ var import_jsx_runtime = require("react/jsx-runtime");
481
+ var DEFAULT_FORM_STATE = {
482
+ name: "",
483
+ isDefault: false,
484
+ isPublic: false
485
+ };
486
+ function RolesComponent({
487
+ onRoleCreated,
488
+ onRoleUpdated,
489
+ onRoleDeleted
490
+ }) {
491
+ const { t } = (0, import_core3.useLocalization)();
492
+ const confirmation = (0, import_theme_shared.useConfirmation)();
493
+ const {
494
+ roles,
495
+ selectedRole,
496
+ isLoading,
497
+ error,
498
+ fetchRoles,
499
+ getRoleById,
500
+ createRole,
501
+ updateRole,
502
+ deleteRole,
503
+ setSelectedRole
504
+ } = useRoles();
505
+ const [isModalOpen, setIsModalOpen] = (0, import_react4.useState)(false);
506
+ const [formState, setFormState] = (0, import_react4.useState)(DEFAULT_FORM_STATE);
507
+ const [isSubmitting, setIsSubmitting] = (0, import_react4.useState)(false);
508
+ const [isPermissionModalOpen, setIsPermissionModalOpen] = (0, import_react4.useState)(false);
509
+ const [permissionProviderKey, setPermissionProviderKey] = (0, import_react4.useState)("");
510
+ const [searchTerm, setSearchTerm] = (0, import_react4.useState)("");
511
+ (0, import_react4.useEffect)(() => {
512
+ fetchRoles();
513
+ }, [fetchRoles]);
514
+ const filteredRoles = roles.filter(
515
+ (role) => !searchTerm || role.name.toLowerCase().includes(searchTerm.toLowerCase())
516
+ );
517
+ const handleAdd = (0, import_react4.useCallback)(() => {
518
+ setSelectedRole(null);
519
+ setFormState(DEFAULT_FORM_STATE);
520
+ setIsModalOpen(true);
521
+ }, [setSelectedRole]);
522
+ const handleEdit = (0, import_react4.useCallback)(
523
+ async (id) => {
524
+ const result = await getRoleById(id);
525
+ if (result.success && selectedRole) {
526
+ setFormState({
527
+ name: selectedRole.name || "",
528
+ isDefault: selectedRole.isDefault || false,
529
+ isPublic: selectedRole.isPublic || false
530
+ });
531
+ setIsModalOpen(true);
532
+ }
533
+ },
534
+ [getRoleById, selectedRole]
535
+ );
536
+ (0, import_react4.useEffect)(() => {
537
+ if (selectedRole) {
538
+ setFormState({
539
+ name: selectedRole.name || "",
540
+ isDefault: selectedRole.isDefault || false,
541
+ isPublic: selectedRole.isPublic || false
542
+ });
543
+ }
544
+ }, [selectedRole]);
545
+ const handleDelete = (0, import_react4.useCallback)(
546
+ async (id, name) => {
547
+ const status = await confirmation.warn(
548
+ t("AbpIdentity::RoleDeletionConfirmationMessage", name),
549
+ t("AbpIdentity::AreYouSure")
550
+ );
551
+ if (status === import_theme_shared.Toaster.Status.confirm) {
552
+ const result = await deleteRole(id);
553
+ if (result.success) {
554
+ onRoleDeleted?.(id);
555
+ }
556
+ }
557
+ },
558
+ [confirmation, t, deleteRole, onRoleDeleted]
559
+ );
560
+ const handleOpenPermissions = (0, import_react4.useCallback)((roleName) => {
561
+ setPermissionProviderKey(roleName);
562
+ setIsPermissionModalOpen(true);
563
+ }, []);
564
+ const handleSubmit = (0, import_react4.useCallback)(async () => {
565
+ if (!formState.name.trim()) return;
566
+ setIsSubmitting(true);
567
+ const roleData = {
568
+ name: formState.name.trim(),
569
+ isDefault: formState.isDefault,
570
+ isPublic: formState.isPublic
571
+ };
572
+ let result;
573
+ if (selectedRole?.id) {
574
+ result = await updateRole(selectedRole.id, roleData);
575
+ if (result.success) {
576
+ onRoleUpdated?.({ ...selectedRole, ...roleData });
577
+ }
578
+ } else {
579
+ result = await createRole(roleData);
580
+ if (result.success) {
581
+ onRoleCreated?.({ ...roleData, id: "", isStatic: false, concurrencyStamp: "" });
582
+ }
583
+ }
584
+ setIsSubmitting(false);
585
+ if (result.success) {
586
+ setIsModalOpen(false);
587
+ setFormState(DEFAULT_FORM_STATE);
588
+ setSelectedRole(null);
589
+ }
590
+ }, [formState, selectedRole, updateRole, createRole, onRoleCreated, onRoleUpdated, setSelectedRole]);
591
+ const handleModalClose = (0, import_react4.useCallback)(() => {
592
+ setIsModalOpen(false);
593
+ setFormState(DEFAULT_FORM_STATE);
594
+ setSelectedRole(null);
595
+ }, [setSelectedRole]);
596
+ const handleInputChange = (0, import_react4.useCallback)(
597
+ (field, value) => {
598
+ setFormState((prev) => ({ ...prev, [field]: value }));
599
+ },
600
+ []
601
+ );
602
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react5.Box, { id: "identity-roles-wrapper", className: "card", p: 4, children: [
603
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react5.Flex, { justify: "space-between", align: "center", mb: 4, children: [
604
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react5.Text, { fontSize: "xl", fontWeight: "bold", children: t("AbpIdentity::Roles") }),
605
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_theme_shared.Button, { colorPalette: "blue", onClick: handleAdd, children: t("AbpIdentity::NewRole") })
606
+ ] }),
607
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react5.Box, { mb: 4, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
608
+ import_react5.Input,
609
+ {
610
+ placeholder: t("AbpIdentity::Search"),
611
+ value: searchTerm,
612
+ onChange: (e) => setSearchTerm(e.target.value),
613
+ maxW: "300px"
614
+ }
615
+ ) }),
616
+ error && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_theme_shared.Alert, { status: "error", mb: 4, children: error }),
617
+ isLoading && roles.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react5.Flex, { justify: "center", py: 8, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react5.Spinner, { size: "lg" }) }),
618
+ roles.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react5.Table.Root, { variant: "outline", children: [
619
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react5.Table.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react5.Table.Row, { children: [
620
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react5.Table.ColumnHeader, { children: t("AbpIdentity::Actions") }),
621
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react5.Table.ColumnHeader, { children: t("AbpIdentity::RoleName") })
622
+ ] }) }),
623
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react5.Table.Body, { children: filteredRoles.map((role) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react5.Table.Row, { children: [
624
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react5.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react5.Menu.Root, { children: [
625
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react5.Menu.Trigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_theme_shared.Button, { size: "sm", colorPalette: "blue", children: t("AbpIdentity::Actions") }) }),
626
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react5.Menu.Positioner, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react5.Menu.Content, { children: [
627
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react5.Menu.Item, { value: "edit", onClick: () => handleEdit(role.id), children: t("AbpIdentity::Edit") }),
628
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react5.Menu.Item, { value: "permissions", onClick: () => handleOpenPermissions(role.name), children: t("AbpIdentity::Permissions") }),
629
+ !role.isStatic && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
630
+ import_react5.Menu.Item,
631
+ {
632
+ value: "delete",
633
+ color: "red.500",
634
+ onClick: () => handleDelete(role.id, role.name),
635
+ children: t("AbpIdentity::Delete")
636
+ }
637
+ )
638
+ ] }) })
639
+ ] }) }),
640
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react5.Table.Cell, { children: role.name })
641
+ ] }, role.id)) })
642
+ ] }),
643
+ !isLoading && roles.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react5.Text, { textAlign: "center", color: "gray.500", py: 8, children: t("AbpIdentity::NoRolesFound") }),
644
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
645
+ import_theme_shared.Modal,
646
+ {
647
+ visible: isModalOpen,
648
+ onVisibleChange: setIsModalOpen,
649
+ header: selectedRole?.id ? t("AbpIdentity::Edit") : t("AbpIdentity::NewRole"),
650
+ footer: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
651
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_theme_shared.Button, { variant: "outline", onClick: handleModalClose, disabled: isSubmitting, children: t("AbpIdentity::Cancel") }),
652
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
653
+ import_theme_shared.Button,
654
+ {
655
+ colorPalette: "blue",
656
+ onClick: handleSubmit,
657
+ loading: isSubmitting,
658
+ disabled: !formState.name.trim(),
659
+ children: t("AbpIdentity::Save")
660
+ }
661
+ )
662
+ ] }),
663
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react5.VStack, { gap: 4, align: "stretch", children: [
664
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_theme_shared.FormField, { label: t("AbpIdentity::RoleName"), required: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
665
+ import_react5.Input,
666
+ {
667
+ value: formState.name,
668
+ onChange: (e) => handleInputChange("name", e.target.value),
669
+ maxLength: 256,
670
+ placeholder: t("AbpIdentity::RoleName")
671
+ }
672
+ ) }),
673
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
674
+ import_theme_shared.Checkbox,
675
+ {
676
+ checked: formState.isDefault,
677
+ onChange: (e) => handleInputChange("isDefault", e.target.checked),
678
+ children: t("AbpIdentity::DisplayName:IsDefault")
679
+ }
680
+ ),
681
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
682
+ import_theme_shared.Checkbox,
683
+ {
684
+ checked: formState.isPublic,
685
+ onChange: (e) => handleInputChange("isPublic", e.target.checked),
686
+ children: t("AbpIdentity::DisplayName:IsPublic")
687
+ }
688
+ )
689
+ ] })
690
+ }
691
+ ),
692
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
693
+ import_permission_management.PermissionManagementModal,
694
+ {
695
+ visible: isPermissionModalOpen,
696
+ onVisibleChange: setIsPermissionModalOpen,
697
+ providerName: "R",
698
+ providerKey: permissionProviderKey
699
+ }
700
+ )
701
+ ] });
702
+ }
703
+
704
+ // src/components/Users/UsersComponent.tsx
705
+ var import_react6 = require("react");
706
+ var import_core4 = require("@abpjs/core");
707
+ var import_theme_shared2 = require("@abpjs/theme-shared");
708
+ var import_permission_management2 = require("@abpjs/permission-management");
709
+ var import_react7 = require("@chakra-ui/react");
710
+ var import_jsx_runtime2 = require("react/jsx-runtime");
711
+ var DEFAULT_FORM_STATE2 = {
712
+ userName: "",
713
+ name: "",
714
+ surname: "",
715
+ email: "",
716
+ phoneNumber: "",
717
+ password: "",
718
+ lockoutEnabled: true,
719
+ twoFactorEnabled: true,
720
+ roleNames: []
721
+ };
722
+ function UsersComponent({
723
+ onUserCreated,
724
+ onUserUpdated,
725
+ onUserDeleted
726
+ }) {
727
+ const { t } = (0, import_core4.useLocalization)();
728
+ const confirmation = (0, import_theme_shared2.useConfirmation)();
729
+ const {
730
+ users,
731
+ totalCount,
732
+ selectedUser,
733
+ selectedUserRoles,
734
+ isLoading,
735
+ error,
736
+ pageQuery,
737
+ fetchUsers,
738
+ getUserById,
739
+ getUserRoles,
740
+ createUser,
741
+ updateUser,
742
+ deleteUser,
743
+ setSelectedUser,
744
+ setPageQuery
745
+ } = useUsers();
746
+ const { roles, fetchRoles } = useRoles();
747
+ const [isModalOpen, setIsModalOpen] = (0, import_react6.useState)(false);
748
+ const [formState, setFormState] = (0, import_react6.useState)(DEFAULT_FORM_STATE2);
749
+ const [isSubmitting, setIsSubmitting] = (0, import_react6.useState)(false);
750
+ const [isPermissionModalOpen, setIsPermissionModalOpen] = (0, import_react6.useState)(false);
751
+ const [permissionProviderKey, setPermissionProviderKey] = (0, import_react6.useState)("");
752
+ const [searchTerm, setSearchTerm] = (0, import_react6.useState)("");
753
+ const [debouncedSearchTerm, setDebouncedSearchTerm] = (0, import_react6.useState)("");
754
+ (0, import_react6.useEffect)(() => {
755
+ fetchRoles();
756
+ fetchUsers();
757
+ }, [fetchRoles, fetchUsers]);
758
+ (0, import_react6.useEffect)(() => {
759
+ const timer = setTimeout(() => {
760
+ setDebouncedSearchTerm(searchTerm);
761
+ }, 300);
762
+ return () => clearTimeout(timer);
763
+ }, [searchTerm]);
764
+ (0, import_react6.useEffect)(() => {
765
+ const newQuery = {
766
+ ...pageQuery,
767
+ filter: debouncedSearchTerm || void 0,
768
+ skipCount: 0
769
+ };
770
+ setPageQuery(newQuery);
771
+ fetchUsers(newQuery);
772
+ }, [debouncedSearchTerm]);
773
+ const selectedRoleNames = (0, import_react6.useMemo)(() => {
774
+ return selectedUserRoles.map((role) => role.name);
775
+ }, [selectedUserRoles]);
776
+ const handleAdd = (0, import_react6.useCallback)(() => {
777
+ setSelectedUser(null);
778
+ setFormState(DEFAULT_FORM_STATE2);
779
+ setIsModalOpen(true);
780
+ }, [setSelectedUser]);
781
+ const handleEdit = (0, import_react6.useCallback)(
782
+ async (id) => {
783
+ await Promise.all([getUserById(id), getUserRoles(id)]);
784
+ setIsModalOpen(true);
785
+ },
786
+ [getUserById, getUserRoles]
787
+ );
788
+ (0, import_react6.useEffect)(() => {
789
+ if (selectedUser) {
790
+ setFormState({
791
+ userName: selectedUser.userName || "",
792
+ name: selectedUser.name || "",
793
+ surname: selectedUser.surname || "",
794
+ email: selectedUser.email || "",
795
+ phoneNumber: selectedUser.phoneNumber || "",
796
+ password: "",
797
+ lockoutEnabled: selectedUser.lockoutEnabled ?? true,
798
+ twoFactorEnabled: selectedUser.twoFactorEnabled ?? true,
799
+ roleNames: selectedRoleNames
800
+ });
801
+ }
802
+ }, [selectedUser, selectedRoleNames]);
803
+ const handleDelete = (0, import_react6.useCallback)(
804
+ async (id, userName) => {
805
+ const status = await confirmation.warn(
806
+ t("AbpIdentity::UserDeletionConfirmationMessage", userName),
807
+ t("AbpIdentity::AreYouSure")
808
+ );
809
+ if (status === import_theme_shared2.Toaster.Status.confirm) {
810
+ const result = await deleteUser(id);
811
+ if (result.success) {
812
+ onUserDeleted?.(id);
813
+ }
814
+ }
815
+ },
816
+ [confirmation, t, deleteUser, onUserDeleted]
817
+ );
818
+ const handleOpenPermissions = (0, import_react6.useCallback)((userId) => {
819
+ setPermissionProviderKey(userId);
820
+ setIsPermissionModalOpen(true);
821
+ }, []);
822
+ const handleSubmit = (0, import_react6.useCallback)(async () => {
823
+ if (!formState.userName.trim() || !formState.email.trim()) return;
824
+ if (!selectedUser?.id && !formState.password) return;
825
+ setIsSubmitting(true);
826
+ const userData = {
827
+ userName: formState.userName.trim(),
828
+ name: formState.name.trim(),
829
+ surname: formState.surname.trim(),
830
+ email: formState.email.trim(),
831
+ phoneNumber: formState.phoneNumber.trim(),
832
+ password: formState.password,
833
+ lockoutEnabled: formState.lockoutEnabled,
834
+ twoFactorEnabled: formState.twoFactorEnabled,
835
+ roleNames: formState.roleNames
836
+ };
837
+ let result;
838
+ if (selectedUser?.id) {
839
+ result = await updateUser(selectedUser.id, userData);
840
+ if (result.success) {
841
+ onUserUpdated?.({
842
+ ...selectedUser,
843
+ ...userData
844
+ });
845
+ }
846
+ } else {
847
+ result = await createUser(userData);
848
+ if (result.success) {
849
+ onUserCreated?.({
850
+ ...userData,
851
+ id: "",
852
+ tenantId: "",
853
+ emailConfirmed: false,
854
+ phoneNumberConfirmed: false,
855
+ isLockedOut: false,
856
+ concurrencyStamp: ""
857
+ });
858
+ }
859
+ }
860
+ setIsSubmitting(false);
861
+ if (result.success) {
862
+ setIsModalOpen(false);
863
+ setFormState(DEFAULT_FORM_STATE2);
864
+ setSelectedUser(null);
865
+ }
866
+ }, [formState, selectedUser, updateUser, createUser, onUserCreated, onUserUpdated, setSelectedUser]);
867
+ const handleModalClose = (0, import_react6.useCallback)(() => {
868
+ setIsModalOpen(false);
869
+ setFormState(DEFAULT_FORM_STATE2);
870
+ setSelectedUser(null);
871
+ }, [setSelectedUser]);
872
+ const handleInputChange = (0, import_react6.useCallback)(
873
+ (field, value) => {
874
+ setFormState((prev) => ({ ...prev, [field]: value }));
875
+ },
876
+ []
877
+ );
878
+ const handleRoleChange = (0, import_react6.useCallback)((roleName, checked) => {
879
+ setFormState((prev) => ({
880
+ ...prev,
881
+ roleNames: checked ? [...prev.roleNames, roleName] : prev.roleNames.filter((name) => name !== roleName)
882
+ }));
883
+ }, []);
884
+ const handlePageChange = (0, import_react6.useCallback)(
885
+ (newSkipCount) => {
886
+ const newQuery = { ...pageQuery, skipCount: newSkipCount };
887
+ setPageQuery(newQuery);
888
+ fetchUsers(newQuery);
889
+ },
890
+ [pageQuery, setPageQuery, fetchUsers]
891
+ );
892
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react7.Box, { id: "identity-users-wrapper", className: "card", p: 4, children: [
893
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react7.Flex, { justify: "space-between", align: "center", mb: 4, children: [
894
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Text, { fontSize: "xl", fontWeight: "bold", children: t("AbpIdentity::Users") }),
895
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.Button, { colorPalette: "blue", onClick: handleAdd, children: t("AbpIdentity::NewUser") })
896
+ ] }),
897
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Box, { mb: 4, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
898
+ import_react7.Input,
899
+ {
900
+ placeholder: t("AbpIdentity::Search"),
901
+ value: searchTerm,
902
+ onChange: (e) => setSearchTerm(e.target.value),
903
+ maxW: "300px"
904
+ }
905
+ ) }),
906
+ error && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.Alert, { status: "error", mb: 4, children: error }),
907
+ isLoading && users.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Flex, { justify: "center", py: 8, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Spinner, { size: "lg" }) }),
908
+ users.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
909
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react7.Table.Root, { variant: "outline", children: [
910
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Table.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react7.Table.Row, { children: [
911
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Table.ColumnHeader, { children: t("AbpIdentity::Actions") }),
912
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Table.ColumnHeader, { children: t("AbpIdentity::UserName") }),
913
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Table.ColumnHeader, { children: t("AbpIdentity::EmailAddress") }),
914
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Table.ColumnHeader, { children: t("AbpIdentity::PhoneNumber") })
915
+ ] }) }),
916
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Table.Body, { children: users.map((user) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react7.Table.Row, { children: [
917
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react7.Menu.Root, { children: [
918
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Menu.Trigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.Button, { size: "sm", colorPalette: "blue", children: t("AbpIdentity::Actions") }) }),
919
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Menu.Positioner, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react7.Menu.Content, { children: [
920
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Menu.Item, { value: "edit", onClick: () => handleEdit(user.id), children: t("AbpIdentity::Edit") }),
921
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Menu.Item, { value: "permissions", onClick: () => handleOpenPermissions(user.id), children: t("AbpIdentity::Permissions") }),
922
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
923
+ import_react7.Menu.Item,
924
+ {
925
+ value: "delete",
926
+ color: "red.500",
927
+ onClick: () => handleDelete(user.id, user.userName),
928
+ children: t("AbpIdentity::Delete")
929
+ }
930
+ )
931
+ ] }) })
932
+ ] }) }),
933
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Table.Cell, { children: user.userName }),
934
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Table.Cell, { children: user.email }),
935
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Table.Cell, { children: user.phoneNumber })
936
+ ] }, user.id)) })
937
+ ] }),
938
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react7.Flex, { justify: "space-between", align: "center", mt: 4, children: [
939
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react7.Text, { color: "gray.600", children: [
940
+ t("AbpIdentity::TotalCount"),
941
+ ": ",
942
+ totalCount
943
+ ] }),
944
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react7.Flex, { gap: 2, children: [
945
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
946
+ import_theme_shared2.Button,
947
+ {
948
+ size: "sm",
949
+ disabled: (pageQuery.skipCount || 0) === 0,
950
+ onClick: () => handlePageChange(
951
+ Math.max(0, (pageQuery.skipCount || 0) - (pageQuery.maxResultCount || 10))
952
+ ),
953
+ children: t("AbpIdentity::Previous")
954
+ }
955
+ ),
956
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
957
+ import_theme_shared2.Button,
958
+ {
959
+ size: "sm",
960
+ disabled: (pageQuery.skipCount || 0) + (pageQuery.maxResultCount || 10) >= totalCount,
961
+ onClick: () => handlePageChange((pageQuery.skipCount || 0) + (pageQuery.maxResultCount || 10)),
962
+ children: t("AbpIdentity::Next")
963
+ }
964
+ )
965
+ ] })
966
+ ] })
967
+ ] }),
968
+ !isLoading && users.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Text, { textAlign: "center", color: "gray.500", py: 8, children: t("AbpIdentity::NoUsersFound") }),
969
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
970
+ import_theme_shared2.Modal,
971
+ {
972
+ visible: isModalOpen,
973
+ onVisibleChange: setIsModalOpen,
974
+ size: "lg",
975
+ header: selectedUser?.id ? t("AbpIdentity::Edit") : t("AbpIdentity::NewUser"),
976
+ footer: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
977
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.Button, { variant: "outline", onClick: handleModalClose, disabled: isSubmitting, children: t("AbpIdentity::Cancel") }),
978
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
979
+ import_theme_shared2.Button,
980
+ {
981
+ colorPalette: "blue",
982
+ onClick: handleSubmit,
983
+ loading: isSubmitting,
984
+ disabled: !formState.userName.trim() || !formState.email.trim() || !selectedUser?.id && !formState.password,
985
+ children: t("AbpIdentity::Save")
986
+ }
987
+ )
988
+ ] }),
989
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react7.Tabs.Root, { defaultValue: "info", children: [
990
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react7.Tabs.List, { children: [
991
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Tabs.Trigger, { value: "info", children: t("AbpIdentity::UserInformations") }),
992
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Tabs.Trigger, { value: "roles", children: t("AbpIdentity::Roles") })
993
+ ] }),
994
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Tabs.Content, { value: "info", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react7.VStack, { gap: 4, align: "stretch", pt: 4, children: [
995
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.FormField, { label: t("AbpIdentity::UserName"), required: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
996
+ import_react7.Input,
997
+ {
998
+ value: formState.userName,
999
+ onChange: (e) => handleInputChange("userName", e.target.value),
1000
+ maxLength: 256
1001
+ }
1002
+ ) }),
1003
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react7.SimpleGrid, { columns: 2, gap: 4, children: [
1004
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.FormField, { label: t("AbpIdentity::Name"), children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1005
+ import_react7.Input,
1006
+ {
1007
+ value: formState.name,
1008
+ onChange: (e) => handleInputChange("name", e.target.value),
1009
+ maxLength: 64
1010
+ }
1011
+ ) }),
1012
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.FormField, { label: t("AbpIdentity::DisplayName:Surname"), children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1013
+ import_react7.Input,
1014
+ {
1015
+ value: formState.surname,
1016
+ onChange: (e) => handleInputChange("surname", e.target.value),
1017
+ maxLength: 64
1018
+ }
1019
+ ) })
1020
+ ] }),
1021
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.FormField, { label: t("AbpIdentity::Password"), required: !selectedUser?.id, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1022
+ import_react7.Input,
1023
+ {
1024
+ type: "password",
1025
+ value: formState.password,
1026
+ onChange: (e) => handleInputChange("password", e.target.value),
1027
+ autoComplete: "new-password",
1028
+ maxLength: 32,
1029
+ placeholder: selectedUser?.id ? t("AbpIdentity::LeaveBlankToKeepCurrent") : ""
1030
+ }
1031
+ ) }),
1032
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.FormField, { label: t("AbpIdentity::EmailAddress"), required: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1033
+ import_react7.Input,
1034
+ {
1035
+ type: "email",
1036
+ value: formState.email,
1037
+ onChange: (e) => handleInputChange("email", e.target.value),
1038
+ maxLength: 256
1039
+ }
1040
+ ) }),
1041
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.FormField, { label: t("AbpIdentity::PhoneNumber"), children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1042
+ import_react7.Input,
1043
+ {
1044
+ value: formState.phoneNumber,
1045
+ onChange: (e) => handleInputChange("phoneNumber", e.target.value),
1046
+ maxLength: 16
1047
+ }
1048
+ ) }),
1049
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1050
+ import_theme_shared2.Checkbox,
1051
+ {
1052
+ checked: formState.lockoutEnabled,
1053
+ onChange: (e) => handleInputChange("lockoutEnabled", e.target.checked),
1054
+ children: t("AbpIdentity::DisplayName:LockoutEnabled")
1055
+ }
1056
+ ),
1057
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1058
+ import_theme_shared2.Checkbox,
1059
+ {
1060
+ checked: formState.twoFactorEnabled,
1061
+ onChange: (e) => handleInputChange("twoFactorEnabled", e.target.checked),
1062
+ children: t("AbpIdentity::DisplayName:TwoFactorEnabled")
1063
+ }
1064
+ )
1065
+ ] }) }),
1066
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Tabs.Content, { value: "roles", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react7.VStack, { gap: 2, align: "stretch", pt: 4, children: [
1067
+ roles.map((role) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1068
+ import_theme_shared2.Checkbox,
1069
+ {
1070
+ checked: formState.roleNames.includes(role.name),
1071
+ onChange: (e) => handleRoleChange(role.name, e.target.checked),
1072
+ children: role.name
1073
+ },
1074
+ role.id
1075
+ )),
1076
+ roles.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react7.Text, { color: "gray.500", children: t("AbpIdentity::NoRolesFound") })
1077
+ ] }) })
1078
+ ] })
1079
+ }
1080
+ ),
1081
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1082
+ import_permission_management2.PermissionManagementModal,
1083
+ {
1084
+ visible: isPermissionModalOpen,
1085
+ onVisibleChange: setIsPermissionModalOpen,
1086
+ providerName: "U",
1087
+ providerKey: permissionProviderKey
1088
+ }
1089
+ )
1090
+ ] });
1091
+ }
1092
+
1093
+ // src/constants/routes.ts
1094
+ var import_core5 = require("@abpjs/core");
1095
+ var IDENTITY_ROUTES = [
1096
+ {
1097
+ name: "AbpUiNavigation::Menu:Administration",
1098
+ path: "",
1099
+ order: 1,
1100
+ wrapper: true
1101
+ },
1102
+ {
1103
+ name: "AbpIdentity::Menu:IdentityManagement",
1104
+ path: "identity",
1105
+ order: 1,
1106
+ parentName: "AbpUiNavigation::Menu:Administration",
1107
+ layout: import_core5.eLayoutType.application,
1108
+ children: [
1109
+ {
1110
+ path: "roles",
1111
+ name: "AbpIdentity::Roles",
1112
+ order: 2,
1113
+ requiredPolicy: "AbpIdentity.Roles"
1114
+ },
1115
+ {
1116
+ path: "users",
1117
+ name: "AbpIdentity::Users",
1118
+ order: 1,
1119
+ requiredPolicy: "AbpIdentity.Users"
1120
+ }
1121
+ ]
1122
+ }
1123
+ ];
1124
+ var IDENTITY_ROUTE_PATHS = {
1125
+ /** Base path for identity module */
1126
+ BASE: "/identity",
1127
+ /** Roles management path */
1128
+ ROLES: "/identity/roles",
1129
+ /** Users management path */
1130
+ USERS: "/identity/users"
1131
+ };
1132
+ var IDENTITY_POLICIES = {
1133
+ /** Policy for roles management */
1134
+ ROLES: "AbpIdentity.Roles",
1135
+ /** Policy for users management */
1136
+ USERS: "AbpIdentity.Users",
1137
+ /** Policy for creating users */
1138
+ USERS_CREATE: "AbpIdentity.Users.Create",
1139
+ /** Policy for updating users */
1140
+ USERS_UPDATE: "AbpIdentity.Users.Update",
1141
+ /** Policy for deleting users */
1142
+ USERS_DELETE: "AbpIdentity.Users.Delete",
1143
+ /** Policy for creating roles */
1144
+ ROLES_CREATE: "AbpIdentity.Roles.Create",
1145
+ /** Policy for updating roles */
1146
+ ROLES_UPDATE: "AbpIdentity.Roles.Update",
1147
+ /** Policy for deleting roles */
1148
+ ROLES_DELETE: "AbpIdentity.Roles.Delete"
1149
+ };
1150
+ // Annotate the CommonJS export names for ESM import in node:
1151
+ 0 && (module.exports = {
1152
+ IDENTITY_POLICIES,
1153
+ IDENTITY_ROUTES,
1154
+ IDENTITY_ROUTE_PATHS,
1155
+ IdentityService,
1156
+ RolesComponent,
1157
+ UsersComponent,
1158
+ useIdentity,
1159
+ useRoles,
1160
+ useUsers
1161
+ });