@udhuong/admin-core 0.1.7 → 0.1.8
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/client/pages/PermissionsPage.d.ts.map +1 -1
- package/dist/client/pages/PermissionsPage.js +59 -25
- package/dist/client/pages/PermissionsPage.js.map +1 -1
- package/dist/client/pages/RolesPage.d.ts.map +1 -1
- package/dist/client/pages/RolesPage.js +128 -35
- package/dist/client/pages/RolesPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionsPage.d.ts","sourceRoot":"","sources":["../../../src/client/pages/PermissionsPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PermissionsPage.d.ts","sourceRoot":"","sources":["../../../src/client/pages/PermissionsPage.tsx"],"names":[],"mappings":"AA2BA,MAAM,CAAC,OAAO,UAAU,eAAe,4CAgOtC"}
|
|
@@ -1,17 +1,24 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useMemo, useState } from 'react';
|
|
3
4
|
import { useQuery } from '@tanstack/react-query';
|
|
4
|
-
import {
|
|
5
|
-
import { useState } from 'react';
|
|
5
|
+
import { Layers, Search, Shield } from 'lucide-react';
|
|
6
6
|
import { getApiClient } from '../auth/api-client';
|
|
7
7
|
import { CORE_ADMIN_API_ROUTES } from '../constants/api-routes';
|
|
8
|
-
import PageHeader from '../components/PageHeader';
|
|
9
8
|
import ProtectedPage from '../auth/ProtectedPage';
|
|
10
9
|
import { PERMISSIONS } from '../constants/permissions';
|
|
10
|
+
import Badge from '../ui/Badge';
|
|
11
|
+
import Input from '../ui/Input';
|
|
12
|
+
import DataTable from '../ui/DataTable';
|
|
13
|
+
// Khóa đại diện cho lựa chọn "Tất cả resource"
|
|
14
|
+
const ALL_RESOURCES = '__all__';
|
|
11
15
|
export default function PermissionsPage() {
|
|
12
16
|
const apiClient = getApiClient();
|
|
13
|
-
|
|
14
|
-
|
|
17
|
+
// Resource đang được chọn ở cột trái (mặc định xem tất cả)
|
|
18
|
+
const [selectedResource, setSelectedResource] = useState(ALL_RESOURCES);
|
|
19
|
+
// Từ khóa tìm kiếm danh sách quyền ở cột phải
|
|
20
|
+
const [searchTerm, setSearchTerm] = useState('');
|
|
21
|
+
// Lấy toàn bộ quyền (đã nhóm theo resource phía server)
|
|
15
22
|
const { data, isLoading } = useQuery({
|
|
16
23
|
queryKey: ['permissions'],
|
|
17
24
|
queryFn: async () => {
|
|
@@ -19,24 +26,51 @@ export default function PermissionsPage() {
|
|
|
19
26
|
return response.data;
|
|
20
27
|
},
|
|
21
28
|
});
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
29
|
+
const grouped = data?.grouped || {};
|
|
30
|
+
const resources = Object.keys(grouped);
|
|
31
|
+
// Danh sách quyền hiển thị ở cột phải theo resource đang chọn + lọc tìm kiếm
|
|
32
|
+
const visiblePermissions = useMemo(() => {
|
|
33
|
+
const base = selectedResource === ALL_RESOURCES
|
|
34
|
+
? Object.values(grouped).flat()
|
|
35
|
+
: grouped[selectedResource] || [];
|
|
36
|
+
if (!searchTerm.trim())
|
|
37
|
+
return base;
|
|
38
|
+
const keyword = searchTerm.toLowerCase();
|
|
39
|
+
return base.filter((p) => p.name.toLowerCase().includes(keyword) ||
|
|
40
|
+
p.action?.toLowerCase().includes(keyword) ||
|
|
41
|
+
p.description?.toLowerCase().includes(keyword) ||
|
|
42
|
+
p.resource?.toLowerCase().includes(keyword));
|
|
43
|
+
}, [grouped, selectedResource, searchTerm]);
|
|
44
|
+
// Cấu hình cột bảng quyền
|
|
45
|
+
const columns = [
|
|
46
|
+
{
|
|
47
|
+
key: 'name',
|
|
48
|
+
label: 'Tên quyền',
|
|
49
|
+
render: (value) => (_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 bg-primary/10 rounded-lg shrink-0", children: _jsx(Shield, { className: "w-4 h-4 text-primary" }) }), _jsx("span", { className: "font-mono text-sm font-medium text-primary", children: value })] })),
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
key: 'resource',
|
|
53
|
+
label: 'Resource',
|
|
54
|
+
width: '160px',
|
|
55
|
+
render: (value) => (_jsx(Badge, { variant: "neutral", style: "soft", children: value || '-' })),
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
key: 'action',
|
|
59
|
+
label: 'Hành động',
|
|
60
|
+
width: '140px',
|
|
61
|
+
render: (value) => (_jsx(Badge, { variant: "neutral", style: "ghost", children: value || '-' })),
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
key: 'description',
|
|
65
|
+
label: 'Mô tả',
|
|
66
|
+
render: (value) => (_jsx("p", { className: "text-base-content/80 line-clamp-2 max-w-md", children: value || '-' })),
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
return (_jsx(ProtectedPage, { permission: PERMISSIONS.ROLE_READ, children: _jsx("div", { className: "container mx-auto bg-base-200 min-h-screen p-6", children: _jsxs("div", { className: "space-y-6", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-semibold text-base-content", children: "Danh s\u00E1ch quy\u1EC1n h\u1EA1n" }), _jsx("p", { className: "text-sm text-base-content/60 mt-1", children: "T\u1EA5t c\u1EA3 c\u00E1c quy\u1EC1n trong h\u1EC7 th\u1ED1ng \u0111\u01B0\u1EE3c nh\u00F3m theo resource" })] }), _jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: [_jsxs("div", { className: "bg-base-100 rounded-lg p-5 flex items-center gap-4 border border-base-200", children: [_jsx("div", { className: "p-3 bg-primary/10 rounded-lg", children: _jsx(Shield, { className: "w-6 h-6 text-primary" }) }), _jsxs("div", { children: [_jsx("p", { className: "text-sm text-base-content/60", children: "T\u1ED5ng s\u1ED1 quy\u1EC1n" }), _jsx("p", { className: "text-2xl font-semibold text-base-content", children: data?.total ?? 0 })] })] }), _jsxs("div", { className: "bg-base-100 rounded-lg p-5 flex items-center gap-4 border border-base-200", children: [_jsx("div", { className: "p-3 bg-secondary/10 rounded-lg", children: _jsx(Layers, { className: "w-6 h-6 text-secondary" }) }), _jsxs("div", { children: [_jsx("p", { className: "text-sm text-base-content/60", children: "S\u1ED1 nh\u00F3m resource" }), _jsx("p", { className: "text-2xl font-semibold text-base-content", children: resources.length })] })] })] }), _jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-[280px_1fr] gap-6", children: [_jsxs("aside", { className: "bg-base-100 rounded-lg p-4 h-fit border border-base-200 lg:sticky lg:top-6", children: [_jsx("h2", { className: "text-sm font-semibold text-base-content/70 uppercase px-2 mb-3", children: "Resource" }), isLoading ? (_jsx("div", { className: "flex justify-center py-8", children: _jsx("span", { className: "loading loading-spinner loading-md" }) })) : (_jsxs("ul", { className: "space-y-1", children: [_jsx("li", { children: _jsxs("button", { onClick: () => setSelectedResource(ALL_RESOURCES), className: `w-full flex items-center justify-between gap-2 px-3 py-2.5 rounded-lg text-left transition-colors ${selectedResource === ALL_RESOURCES
|
|
70
|
+
? 'bg-primary text-primary-content'
|
|
71
|
+
: 'hover:bg-base-200 text-base-content'}`, children: [_jsx("span", { className: "font-medium text-sm", children: "T\u1EA5t c\u1EA3" }), _jsx("span", { className: `badge badge-sm ${selectedResource === ALL_RESOURCES ? 'badge-ghost' : 'badge-primary badge-soft'}`, children: data?.total ?? 0 })] }) }), resources.map((resource) => {
|
|
72
|
+
const isActive = selectedResource === resource;
|
|
73
|
+
return (_jsx("li", { children: _jsxs("button", { onClick: () => setSelectedResource(resource), className: `w-full flex items-center justify-between gap-2 px-3 py-2.5 rounded-lg text-left transition-colors ${isActive ? 'bg-primary text-primary-content' : 'hover:bg-base-200 text-base-content'}`, children: [_jsx("span", { className: "font-medium text-sm uppercase truncate", children: resource }), _jsx("span", { className: `badge badge-sm shrink-0 ${isActive ? 'badge-ghost' : 'badge-primary badge-soft'}`, children: grouped[resource].length })] }) }, resource));
|
|
74
|
+
}), resources.length === 0 && (_jsx("li", { className: "text-center text-base-content/60 text-sm py-6", children: "Ch\u01B0a c\u00F3 resource n\u00E0o" }))] }))] }), _jsxs("section", { className: "space-y-4", children: [_jsxs("div", { className: "bg-base-100 rounded-lg p-4 flex flex-col sm:flex-row sm:items-center justify-between gap-4 border border-base-200", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("h2", { className: "text-lg font-semibold text-base-content uppercase", children: selectedResource === ALL_RESOURCES ? 'Tất cả quyền' : selectedResource }), _jsxs(Badge, { variant: "primary", style: "soft", children: [visiblePermissions.length, " quy\u1EC1n"] })] }), _jsx("div", { className: "w-full sm:w-auto sm:min-w-[260px]", children: _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "absolute left-3 top-1/2 transform -translate-y-1/2 h-5 w-5 text-base-content/50" }), _jsx(Input, { type: "text", placeholder: "T\u00ECm ki\u1EBFm quy\u1EC1n...", value: searchTerm, onChange: (e) => setSearchTerm(e.target.value), className: "pl-10 w-full" })] }) })] }), _jsx("div", { className: "bg-base-100 rounded-lg overflow-hidden border border-base-200", children: _jsx(DataTable, { data: visiblePermissions, columns: columns, loading: isLoading, emptyMessage: "Kh\u00F4ng t\u00ECm th\u1EA5y quy\u1EC1n n\u00E0o" }) })] })] })] }) }) }));
|
|
41
75
|
}
|
|
42
76
|
//# sourceMappingURL=PermissionsPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionsPage.js","sourceRoot":"","sources":["../../../src/client/pages/PermissionsPage.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"PermissionsPage.js","sourceRoot":"","sources":["../../../src/client/pages/PermissionsPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RolesPage.d.ts","sourceRoot":"","sources":["../../../src/client/pages/RolesPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RolesPage.d.ts","sourceRoot":"","sources":["../../../src/client/pages/RolesPage.tsx"],"names":[],"mappings":"AAoBA,MAAM,CAAC,OAAO,UAAU,SAAS,4CA6RhC"}
|
|
@@ -1,82 +1,175 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useState } from 'react';
|
|
4
4
|
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
5
|
-
import {
|
|
5
|
+
import { Edit, Plus, Search, Shield, Trash2, X } from 'lucide-react';
|
|
6
6
|
import { getApiClient } from '../auth/api-client';
|
|
7
7
|
import { CORE_ADMIN_API_ROUTES } from '../constants/api-routes';
|
|
8
|
-
import PageHeader from '../components/PageHeader';
|
|
9
|
-
import { ConfirmModal } from '../ui/ConfirmModal';
|
|
10
8
|
import { useToast } from '../hooks/useToast';
|
|
11
9
|
import RoleModal from './roles/RoleModal';
|
|
12
10
|
import ProtectedPage from '../auth/ProtectedPage';
|
|
13
11
|
import { PERMISSIONS } from '../constants/permissions';
|
|
12
|
+
import Badge from '../ui/Badge';
|
|
13
|
+
import Button from '../ui/Button';
|
|
14
|
+
import Input from '../ui/Input';
|
|
15
|
+
import DataTable, { TableRenderers } from '../ui/DataTable';
|
|
16
|
+
import { ConfirmModal } from '../ui/ConfirmModal';
|
|
17
|
+
const ITEMS_PER_PAGE = 10;
|
|
14
18
|
export default function RolesPage() {
|
|
15
19
|
const apiClient = getApiClient();
|
|
20
|
+
// Trạng thái lọc và phân trang
|
|
16
21
|
const [searchTerm, setSearchTerm] = useState('');
|
|
17
22
|
const [currentPage, setCurrentPage] = useState(1);
|
|
23
|
+
// Trạng thái modal tạo/sửa vai trò
|
|
18
24
|
const [isRoleModalOpen, setIsRoleModalOpen] = useState(false);
|
|
19
25
|
const [selectedRole, setSelectedRole] = useState(null);
|
|
20
|
-
|
|
21
|
-
const [
|
|
26
|
+
// Danh sách vai trò đang chờ xác nhận xóa (1 hoặc nhiều)
|
|
27
|
+
const [pendingDelete, setPendingDelete] = useState(null);
|
|
22
28
|
const queryClient = useQueryClient();
|
|
23
29
|
const { showToast } = useToast();
|
|
24
|
-
//
|
|
30
|
+
// Lấy danh sách vai trò (phân trang + tìm kiếm phía server)
|
|
25
31
|
const { data, isLoading } = useQuery({
|
|
26
32
|
queryKey: ['roles', currentPage, searchTerm],
|
|
27
33
|
queryFn: async () => {
|
|
28
34
|
const params = new URLSearchParams({
|
|
29
35
|
page: currentPage.toString(),
|
|
30
|
-
limit:
|
|
36
|
+
limit: ITEMS_PER_PAGE.toString(),
|
|
31
37
|
...(searchTerm && { search: searchTerm }),
|
|
32
38
|
});
|
|
33
39
|
const response = await apiClient.get(`${CORE_ADMIN_API_ROUTES.ROLES.BASE}?${params}`);
|
|
34
40
|
return response.data;
|
|
35
41
|
},
|
|
36
42
|
});
|
|
37
|
-
//
|
|
43
|
+
// Xóa một hoặc nhiều vai trò
|
|
38
44
|
const deleteMutation = useMutation({
|
|
39
|
-
mutationFn: async (id) =>
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
onSuccess: () => {
|
|
43
|
-
showToast('Xóa vai trò thành công', 'success');
|
|
45
|
+
mutationFn: async (ids) => Promise.all(ids.map((id) => apiClient.delete(CORE_ADMIN_API_ROUTES.ROLES.BY_ID(id)))),
|
|
46
|
+
onSuccess: (_, ids) => {
|
|
47
|
+
showToast(ids.length > 1 ? `Đã xóa ${ids.length} vai trò` : 'Xóa vai trò thành công', 'success');
|
|
44
48
|
queryClient.invalidateQueries({ queryKey: ['roles'] });
|
|
45
|
-
|
|
46
|
-
setRoleToDelete(null);
|
|
49
|
+
setPendingDelete(null);
|
|
47
50
|
},
|
|
48
51
|
onError: (error) => {
|
|
49
52
|
showToast(error.response?.data?.message || 'Xóa vai trò thất bại', 'error');
|
|
50
53
|
},
|
|
51
54
|
});
|
|
52
|
-
const
|
|
55
|
+
const openCreateModal = () => {
|
|
56
|
+
setSelectedRole(null);
|
|
57
|
+
setIsRoleModalOpen(true);
|
|
58
|
+
};
|
|
59
|
+
const openEditModal = (role) => {
|
|
53
60
|
setSelectedRole(role);
|
|
54
61
|
setIsRoleModalOpen(true);
|
|
55
62
|
};
|
|
56
|
-
const
|
|
63
|
+
const closeModal = () => {
|
|
64
|
+
setIsRoleModalOpen(false);
|
|
57
65
|
setSelectedRole(null);
|
|
58
|
-
setIsRoleModalOpen(true);
|
|
59
66
|
};
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
67
|
+
const handleModalSuccess = () => {
|
|
68
|
+
queryClient.invalidateQueries({ queryKey: ['roles'] });
|
|
69
|
+
closeModal();
|
|
63
70
|
};
|
|
64
|
-
const
|
|
65
|
-
if (
|
|
66
|
-
|
|
71
|
+
const requestDelete = (role) => {
|
|
72
|
+
if (role.isSystem) {
|
|
73
|
+
showToast('Không thể xóa vai trò hệ thống', 'warning');
|
|
74
|
+
return;
|
|
67
75
|
}
|
|
76
|
+
setPendingDelete([role]);
|
|
68
77
|
};
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
78
|
+
const requestBulkDelete = (items) => {
|
|
79
|
+
// Lọc bỏ vai trò hệ thống vì không được phép xóa
|
|
80
|
+
const deletable = items.filter((item) => !item.isSystem);
|
|
81
|
+
if (deletable.length === 0) {
|
|
82
|
+
showToast('Các vai trò đã chọn đều là vai trò hệ thống, không thể xóa', 'warning');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
setPendingDelete(deletable);
|
|
72
86
|
};
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
87
|
+
const confirmDelete = () => {
|
|
88
|
+
if (pendingDelete && pendingDelete.length > 0) {
|
|
89
|
+
deleteMutation.mutate(pendingDelete.map((role) => role.id));
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
const handleClearFilters = () => {
|
|
93
|
+
setSearchTerm('');
|
|
94
|
+
setCurrentPage(1);
|
|
76
95
|
};
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
96
|
+
// Cấu hình các cột của bảng
|
|
97
|
+
const columns = [
|
|
98
|
+
{
|
|
99
|
+
key: 'id',
|
|
100
|
+
label: 'ID',
|
|
101
|
+
width: '70px',
|
|
102
|
+
render: (value) => TableRenderers.id(value),
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
key: 'name',
|
|
106
|
+
label: 'Vai trò',
|
|
107
|
+
render: (value, item) => (_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 bg-primary/10 rounded-lg shrink-0", children: _jsx(Shield, { className: "w-4 h-4 text-primary" }) }), _jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "font-medium text-base-content truncate", children: value }), _jsx("p", { className: "text-sm text-base-content/60 line-clamp-1 max-w-xs", children: item.description || 'Không có mô tả' })] })] })),
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
key: 'permissionsCount',
|
|
111
|
+
label: 'Số quyền',
|
|
112
|
+
width: '120px',
|
|
113
|
+
align: 'center',
|
|
114
|
+
render: (value) => (_jsxs(Badge, { variant: "primary", style: "soft", children: [value ?? 0, " quy\u1EC1n"] })),
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
key: 'isSystem',
|
|
118
|
+
label: 'Loại',
|
|
119
|
+
width: '130px',
|
|
120
|
+
align: 'center',
|
|
121
|
+
render: (value) => value ? (_jsx(Badge, { variant: "warning", style: "soft", children: "H\u1EC7 th\u1ED1ng" })) : (_jsx(Badge, { variant: "neutral", style: "soft", children: "T\u00F9y ch\u1EC9nh" })),
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
key: 'createdAt',
|
|
125
|
+
label: 'Ngày tạo',
|
|
126
|
+
width: '150px',
|
|
127
|
+
render: (value) => value ? TableRenderers.datetime(value) : _jsx("span", { className: "text-base-content/40", children: "-" }),
|
|
128
|
+
},
|
|
129
|
+
];
|
|
130
|
+
// Hành động trên từng dòng
|
|
131
|
+
const actions = [
|
|
132
|
+
{
|
|
133
|
+
key: 'edit',
|
|
134
|
+
label: 'Chỉnh sửa / Xem',
|
|
135
|
+
icon: _jsx(Edit, { className: "h-4 w-4" }),
|
|
136
|
+
onClick: (item) => openEditModal(item),
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
key: 'delete',
|
|
140
|
+
label: 'Xóa',
|
|
141
|
+
icon: _jsx(Trash2, { className: "h-4 w-4" }),
|
|
142
|
+
variant: 'error',
|
|
143
|
+
onClick: (item) => requestDelete(item),
|
|
144
|
+
show: (item) => !item.isSystem,
|
|
145
|
+
},
|
|
146
|
+
];
|
|
147
|
+
const bulkActions = [
|
|
148
|
+
{
|
|
149
|
+
key: 'delete',
|
|
150
|
+
label: 'Xóa đã chọn',
|
|
151
|
+
icon: _jsx(Trash2, { className: "h-4 w-4" }),
|
|
152
|
+
variant: 'error',
|
|
153
|
+
onClick: requestBulkDelete,
|
|
154
|
+
},
|
|
155
|
+
];
|
|
156
|
+
// Thông tin phân trang cho DataTable
|
|
157
|
+
const pagination = data
|
|
158
|
+
? {
|
|
159
|
+
currentPage,
|
|
160
|
+
totalPages: data.totalPages || 1,
|
|
161
|
+
totalItems: data.total || 0,
|
|
162
|
+
itemsPerPage: ITEMS_PER_PAGE,
|
|
163
|
+
startItem: (currentPage - 1) * ITEMS_PER_PAGE + 1,
|
|
164
|
+
endItem: Math.min(currentPage * ITEMS_PER_PAGE, data.total || 0),
|
|
165
|
+
}
|
|
166
|
+
: undefined;
|
|
167
|
+
const deleteCount = pendingDelete?.length ?? 0;
|
|
168
|
+
return (_jsx(ProtectedPage, { permission: PERMISSIONS.ROLE_READ, children: _jsxs("div", { className: "container mx-auto bg-base-200 min-h-screen p-6", children: [_jsxs("div", { className: "space-y-6", children: [_jsxs("div", { className: "flex gap-2 justify-between items-center", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-semibold text-base-content", children: "Qu\u1EA3n l\u00FD vai tr\u00F2" }), _jsx("p", { className: "text-sm text-base-content/60 mt-1", children: "Qu\u1EA3n l\u00FD vai tr\u00F2 v\u00E0 ph\u00E2n quy\u1EC1n trong h\u1EC7 th\u1ED1ng" })] }), _jsxs(Button, { variant: "primary", onClick: openCreateModal, children: [_jsx(Plus, { className: "w-5 h-5 mr-2" }), "Th\u00EAm vai tr\u00F2"] })] }), _jsx("div", { className: "bg-base-100 rounded-lg p-6 border border-base-200", children: _jsxs("div", { className: "flex flex-col sm:flex-row items-start sm:items-center gap-4 flex-1", children: [_jsx("div", { className: "w-full sm:w-auto sm:min-w-[300px]", children: _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "absolute left-3 top-1/2 transform -translate-y-1/2 h-5 w-5 text-base-content/50" }), _jsx(Input, { type: "text", placeholder: "T\u00ECm ki\u1EBFm vai tr\u00F2...", value: searchTerm, onChange: (e) => {
|
|
169
|
+
setSearchTerm(e.target.value);
|
|
170
|
+
setCurrentPage(1);
|
|
171
|
+
}, className: "pl-10 w-full" })] }) }), searchTerm && (_jsxs(Button, { variant: "secondary", onClick: handleClearFilters, children: [_jsx(X, { className: "h-4 w-4 mr-1" }), "X\u00F3a l\u1ECDc"] }))] }) }), _jsx("div", { className: "bg-base-100 rounded-lg overflow-hidden border border-base-200", children: _jsx(DataTable, { data: data?.items || [], columns: columns, actions: actions, bulkActions: bulkActions, loading: isLoading, selectable: true, pagination: pagination, onPageChange: setCurrentPage, emptyMessage: "Kh\u00F4ng t\u00ECm th\u1EA5y vai tr\u00F2 n\u00E0o" }) })] }), _jsx(RoleModal, { isOpen: isRoleModalOpen, onClose: closeModal, onSuccess: handleModalSuccess, role: selectedRole }), _jsx(ConfirmModal, { isOpen: !!pendingDelete, onClose: () => setPendingDelete(null), onConfirm: confirmDelete, title: "X\u00E1c nh\u1EADn x\u00F3a vai tr\u00F2", message: deleteCount > 1
|
|
172
|
+
? `Bạn có chắc chắn muốn xóa ${deleteCount} vai trò đã chọn? Hành động này không thể hoàn tác.`
|
|
173
|
+
: `Bạn có chắc chắn muốn xóa vai trò "${pendingDelete?.[0]?.name}"? Hành động này không thể hoàn tác.`, confirmText: "X\u00F3a", cancelText: "H\u1EE7y", type: "danger" })] }) }));
|
|
81
174
|
}
|
|
82
175
|
//# sourceMappingURL=RolesPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RolesPage.js","sourceRoot":"","sources":["../../../src/client/pages/RolesPage.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC7E,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"RolesPage.js","sourceRoot":"","sources":["../../../src/client/pages/RolesPage.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@udhuong/admin-core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"description": "Reusable admin core (client + server) — auth, RBAC, OAuth, user management. Built với NestJS + Next.js, ship trong 1 package với subpath exports.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "udhuong <l19htm4n@gmail.com>",
|