@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.
@@ -1 +1 @@
1
- {"version":3,"file":"PermissionsPage.d.ts","sourceRoot":"","sources":["../../../src/client/pages/PermissionsPage.tsx"],"names":[],"mappings":"AA6BA,MAAM,CAAC,OAAO,UAAU,eAAe,4CA6JtC"}
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, Fragment as _Fragment } from "react/jsx-runtime";
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 { Shield, ChevronDown, ChevronUp } from 'lucide-react';
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
- const [expandedGroups, setExpandedGroups] = useState([]);
14
- // Fetch permissions
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 toggleGroup = (resource) => {
23
- setExpandedGroups((prev) => prev.includes(resource) ? prev.filter((r) => r !== resource) : [...prev, resource]);
24
- };
25
- const toggleAll = () => {
26
- if (data?.grouped) {
27
- if (expandedGroups.length === Object.keys(data.grouped).length) {
28
- setExpandedGroups([]);
29
- }
30
- else {
31
- setExpandedGroups(Object.keys(data.grouped));
32
- }
33
- }
34
- };
35
- return (_jsx(ProtectedPage, { permission: PERMISSIONS.ROLE_READ, children: _jsxs("div", { className: "space-y-6 p-6 bg-base-200 min-h-screen", children: [_jsx(PageHeader, { title: "Danh s\u00E1ch quy\u1EC1n h\u1EA1n", description: "T\u1EA5t c\u1EA3 c\u00E1c quy\u1EC1n trong h\u1EC7 th\u1ED1ng \u0111\u01B0\u1EE3c nh\u00F3m theo resource" }), isLoading ? (_jsx("div", { className: "text-center py-12", children: _jsx("div", { className: "loading loading-spinner loading-lg" }) })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "stats shadow bg-base-100 w-full", children: [_jsxs("div", { className: "stat", children: [_jsx("div", { className: "stat-figure text-primary", children: _jsx(Shield, { className: "w-8 h-8" }) }), _jsx("div", { className: "stat-title", children: "T\u1ED5ng s\u1ED1 quy\u1EC1n" }), _jsx("div", { className: "stat-value text-primary", children: data?.total }), _jsxs("div", { className: "stat-desc", children: ["Nh\u00F3m theo ", Object.keys(data?.grouped || {}).length, " resource"] })] }), _jsx("div", { className: "stat", children: _jsx("div", { className: "stat-actions", children: _jsx("button", { onClick: toggleAll, className: "btn btn-sm btn-outline", children: expandedGroups.length === Object.keys(data?.grouped || {}).length
36
- ? 'Thu gọn tất cả'
37
- : 'Mở rộng tất cả' }) }) })] }), _jsxs("div", { className: "space-y-4", children: [Object.entries(data?.grouped || {}).map(([resource, permissions]) => {
38
- const isExpanded = expandedGroups.includes(resource);
39
- return (_jsxs("div", { className: "card bg-base-100 shadow-sm overflow-hidden", children: [_jsxs("button", { onClick: () => toggleGroup(resource), className: "w-full px-6 py-4 flex items-center justify-between hover:bg-base-200 transition-colors", children: [_jsxs("div", { className: "flex items-center gap-3", children: [isExpanded ? (_jsx(ChevronUp, { className: "w-5 h-5 text-base-content/60" })) : (_jsx(ChevronDown, { className: "w-5 h-5 text-base-content/60" })), _jsx(Shield, { className: "w-5 h-5 text-primary" }), _jsxs("div", { className: "text-left", children: [_jsx("h3", { className: "font-semibold text-lg uppercase", children: resource }), _jsxs("p", { className: "text-sm text-base-content/60", children: [permissions.length, " quy\u1EC1n"] })] })] }), _jsx("div", { className: "flex items-center gap-2", children: _jsx("span", { className: "badge badge-primary", children: permissions.length }) })] }), isExpanded && (_jsx("div", { className: "border-t border-base-300", children: _jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 p-6", children: permissions.map((permission) => (_jsxs("div", { className: "card border border-base-300 bg-base-100 p-4 hover:shadow-md transition-shadow", children: [_jsxs("div", { className: "flex items-start justify-between mb-2", children: [_jsx("div", { className: "font-mono text-sm font-medium text-primary", children: permission.name }), _jsx("span", { className: "badge badge-ghost text-xs", children: permission.action })] }), permission.description && (_jsx("p", { className: "text-sm text-base-content/60 mt-2", children: permission.description })), _jsx("div", { className: "mt-3 pt-3 border-t border-base-300", children: _jsxs("span", { className: "text-xs text-base-content/50", children: ["ID: ", permission.id] }) })] }, permission.id))) }) }))] }, resource));
40
- }), Object.keys(data?.grouped || {}).length === 0 && (_jsxs("div", { className: "text-center py-12", children: [_jsx(Shield, { className: "w-12 h-12 text-base-content/40 mx-auto mb-4" }), _jsx("p", { className: "text-base-content/60", children: "Kh\u00F4ng c\u00F3 quy\u1EC1n n\u00E0o trong h\u1EC7 th\u1ED1ng" })] }))] })] }))] }) }));
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":"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"}
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":"AAeA,MAAM,CAAC,OAAO,UAAU,SAAS,4CAuOhC"}
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, Fragment as _Fragment } from "react/jsx-runtime";
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 { Plus, Edit, Trash2, Shield, Search } from 'lucide-react';
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
- const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(false);
21
- const [roleToDelete, setRoleToDelete] = useState(null);
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
- // Fetch roles
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: '10',
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
- // Delete mutation
43
+ // Xóa một hoặc nhiều vai trò
38
44
  const deleteMutation = useMutation({
39
- mutationFn: async (id) => {
40
- return apiClient.delete(CORE_ADMIN_API_ROUTES.ROLES.BY_ID(id));
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
- setDeleteConfirmOpen(false);
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 handleEdit = (role) => {
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 handleCreate = () => {
63
+ const closeModal = () => {
64
+ setIsRoleModalOpen(false);
57
65
  setSelectedRole(null);
58
- setIsRoleModalOpen(true);
59
66
  };
60
- const handleDelete = (role) => {
61
- setRoleToDelete(role);
62
- setDeleteConfirmOpen(true);
67
+ const handleModalSuccess = () => {
68
+ queryClient.invalidateQueries({ queryKey: ['roles'] });
69
+ closeModal();
63
70
  };
64
- const confirmDelete = () => {
65
- if (roleToDelete) {
66
- deleteMutation.mutate(roleToDelete.id);
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 handleRoleModalClose = () => {
70
- setIsRoleModalOpen(false);
71
- setSelectedRole(null);
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 handleRoleSuccess = () => {
74
- queryClient.invalidateQueries({ queryKey: ['roles'] });
75
- handleRoleModalClose();
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
- return (_jsx(ProtectedPage, { permission: PERMISSIONS.ROLE_READ, children: _jsxs("div", { className: "space-y-6 p-6 bg-base-200 min-h-screen", children: [_jsx(PageHeader, { title: "Qu\u1EA3n l\u00FD vai tr\u00F2", description: "Qu\u1EA3n l\u00FD vai tr\u00F2 v\u00E0 ph\u00E2n quy\u1EC1n trong h\u1EC7 th\u1ED1ng" }), _jsxs("div", { className: "flex justify-between items-center mb-6", children: [_jsxs("div", { className: "relative flex-1 max-w-md", children: [_jsx(Search, { className: "absolute left-3 top-1/2 transform -translate-y-1/2 text-base-content/60 w-4 h-4" }), _jsx("input", { type: "text", placeholder: "T\u00ECm ki\u1EBFm vai tr\u00F2...", value: searchTerm, onChange: (e) => {
78
- setSearchTerm(e.target.value);
79
- setCurrentPage(1);
80
- }, className: "input input-bordered w-full pl-10" })] }), _jsxs("button", { onClick: handleCreate, className: "btn btn-primary ml-4", children: [_jsx(Plus, { className: "w-4 h-4" }), "Th\u00EAm vai tr\u00F2"] })] }), isLoading ? (_jsx("div", { className: "text-center py-12", children: _jsx("div", { className: "loading loading-spinner loading-lg" }) })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4", children: data?.items.map((role) => (_jsx("div", { className: "card bg-base-100 shadow-sm hover:shadow-lg transition-shadow", children: _jsxs("div", { className: "card-body p-6", children: [_jsxs("div", { className: "flex items-start justify-between mb-4", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 bg-primary/10 rounded-lg", children: _jsx(Shield, { className: "w-5 h-5 text-primary" }) }), _jsxs("div", { children: [_jsx("h3", { className: "font-semibold text-lg", children: role.name }), role.isSystem && (_jsx("span", { className: "text-xs text-base-content/60", children: "H\u1EC7 th\u1ED1ng" }))] })] }), !role.isSystem && (_jsxs("div", { className: "flex gap-2", children: [_jsx("button", { onClick: () => handleEdit(role), className: "btn btn-ghost btn-sm btn-square", title: "Ch\u1EC9nh s\u1EEDa", children: _jsx(Edit, { className: "w-4 h-4" }) }), _jsx("button", { onClick: () => handleDelete(role), className: "btn btn-ghost btn-sm btn-square text-error", title: "X\u00F3a", children: _jsx(Trash2, { className: "w-4 h-4" }) })] }))] }), _jsx("p", { className: "text-sm text-base-content/60 mb-4", children: role.description || 'Không có mô tả' }), _jsxs("div", { className: "flex items-center justify-between pt-4 border-t border-base-300", children: [_jsxs("span", { className: "text-sm text-base-content/60", children: [role.permissionsCount, " quy\u1EC1n"] }), role.isSystem && (_jsx("button", { onClick: () => handleEdit(role), className: "link link-primary text-sm", children: "Xem chi ti\u1EBFt" }))] })] }) }, role.id))) }), data && data.totalPages > 1 && (_jsxs("div", { className: "flex justify-center gap-2 mt-6", children: [_jsx("button", { onClick: () => setCurrentPage((p) => Math.max(1, p - 1)), disabled: currentPage === 1, className: "btn btn-outline", children: "Tr\u01B0\u1EDBc" }), _jsxs("span", { className: "flex items-center px-4", children: ["Trang ", currentPage, " / ", data.totalPages] }), _jsx("button", { onClick: () => setCurrentPage((p) => Math.min(data.totalPages, p + 1)), disabled: currentPage === data.totalPages, className: "btn btn-outline", children: "Sau" })] })), data?.items.length === 0 && (_jsxs("div", { className: "text-center py-12", children: [_jsx(Shield, { className: "w-12 h-12 text-base-content/40 mx-auto mb-4" }), _jsx("p", { className: "text-base-content/60", children: "Kh\u00F4ng t\u00ECm th\u1EA5y vai tr\u00F2 n\u00E0o" })] }))] })), _jsx(RoleModal, { isOpen: isRoleModalOpen, onClose: handleRoleModalClose, onSuccess: handleRoleSuccess, role: selectedRole }), _jsx(ConfirmModal, { isOpen: deleteConfirmOpen, onClose: () => setDeleteConfirmOpen(false), onConfirm: confirmDelete, title: "X\u00E1c nh\u1EADn x\u00F3a vai tr\u00F2", message: `Bạn có chắc chắn muốn xóa vai trò "${roleToDelete?.name}"? Hành động này không thể hoàn tác.`, confirmText: "X\u00F3a", cancelText: "H\u1EE7y", type: "danger" })] }) }));
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":"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"}
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.7",
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>",