@udhuong/admin-core 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/dist/client/auth/AuthContext.d.ts +19 -0
  2. package/dist/client/auth/AuthContext.d.ts.map +1 -0
  3. package/dist/client/auth/AuthContext.js +115 -0
  4. package/dist/client/auth/AuthContext.js.map +1 -0
  5. package/dist/client/auth/PermissionGuard.d.ts +12 -0
  6. package/dist/client/auth/PermissionGuard.d.ts.map +1 -0
  7. package/dist/client/auth/PermissionGuard.js +23 -0
  8. package/dist/client/auth/PermissionGuard.js.map +1 -0
  9. package/dist/client/auth/ProtectedPage.d.ts +9 -0
  10. package/dist/client/auth/ProtectedPage.d.ts.map +1 -0
  11. package/dist/client/auth/ProtectedPage.js +57 -0
  12. package/dist/client/auth/ProtectedPage.js.map +1 -0
  13. package/dist/client/auth/ProtectedRoute.d.ts +4 -0
  14. package/dist/client/auth/ProtectedRoute.d.ts.map +1 -0
  15. package/dist/client/auth/ProtectedRoute.js +25 -0
  16. package/dist/client/auth/ProtectedRoute.js.map +1 -0
  17. package/dist/client/auth/api-client.d.ts +4 -0
  18. package/dist/client/auth/api-client.d.ts.map +1 -0
  19. package/dist/client/auth/api-client.js +83 -0
  20. package/dist/client/auth/api-client.js.map +1 -0
  21. package/dist/client/auth/auth.service.d.ts +7 -0
  22. package/dist/client/auth/auth.service.d.ts.map +1 -0
  23. package/dist/client/auth/auth.service.js +19 -0
  24. package/dist/client/auth/auth.service.js.map +1 -0
  25. package/dist/client/auth/index.d.ts +7 -0
  26. package/dist/client/auth/index.d.ts.map +1 -0
  27. package/dist/client/auth/index.js +7 -0
  28. package/dist/client/auth/index.js.map +1 -0
  29. package/dist/client/components/PageHeader.d.ts +19 -0
  30. package/dist/client/components/PageHeader.d.ts.map +1 -0
  31. package/dist/client/components/PageHeader.js +7 -0
  32. package/dist/client/components/PageHeader.js.map +1 -0
  33. package/dist/client/components/Providers.d.ts +9 -0
  34. package/dist/client/components/Providers.d.ts.map +1 -0
  35. package/dist/client/components/Providers.js +52 -0
  36. package/dist/client/components/Providers.js.map +1 -0
  37. package/dist/client/components/ThemeToggle.d.ts +6 -0
  38. package/dist/client/components/ThemeToggle.d.ts.map +1 -0
  39. package/dist/client/components/ThemeToggle.js +22 -0
  40. package/dist/client/components/ThemeToggle.js.map +1 -0
  41. package/dist/client/components/index.d.ts +4 -0
  42. package/dist/client/components/index.d.ts.map +1 -0
  43. package/dist/client/components/index.js +4 -0
  44. package/dist/client/components/index.js.map +1 -0
  45. package/dist/client/config/AdminConfigContext.d.ts +12 -0
  46. package/dist/client/config/AdminConfigContext.d.ts.map +1 -0
  47. package/dist/client/config/AdminConfigContext.js +29 -0
  48. package/dist/client/config/AdminConfigContext.js.map +1 -0
  49. package/dist/client/config/defaults.d.ts +4 -0
  50. package/dist/client/config/defaults.d.ts.map +1 -0
  51. package/dist/client/config/defaults.js +86 -0
  52. package/dist/client/config/defaults.js.map +1 -0
  53. package/dist/client/config/types.d.ts +61 -0
  54. package/dist/client/config/types.d.ts.map +1 -0
  55. package/dist/client/config/types.js +2 -0
  56. package/dist/client/config/types.js.map +1 -0
  57. package/dist/client/constants/api-routes.d.ts +104 -0
  58. package/dist/client/constants/api-routes.d.ts.map +1 -0
  59. package/dist/client/constants/api-routes.js +91 -0
  60. package/dist/client/constants/api-routes.js.map +1 -0
  61. package/dist/client/constants/permissions.d.ts +38 -0
  62. package/dist/client/constants/permissions.d.ts.map +1 -0
  63. package/dist/client/constants/permissions.js +37 -0
  64. package/dist/client/constants/permissions.js.map +1 -0
  65. package/dist/client/contexts/ThemeContext.d.ts +3 -0
  66. package/dist/client/contexts/ThemeContext.d.ts.map +1 -0
  67. package/dist/client/contexts/ThemeContext.js +8 -0
  68. package/dist/client/contexts/ThemeContext.js.map +1 -0
  69. package/dist/client/hooks/useToast.d.ts +14 -0
  70. package/dist/client/hooks/useToast.d.ts.map +1 -0
  71. package/dist/client/hooks/useToast.js +90 -0
  72. package/dist/client/hooks/useToast.js.map +1 -0
  73. package/dist/client/index.d.ts +25 -0
  74. package/dist/client/index.d.ts.map +1 -0
  75. package/dist/client/index.js +33 -0
  76. package/dist/client/index.js.map +1 -0
  77. package/dist/client/layouts/AdminLayout.d.ts +4 -0
  78. package/dist/client/layouts/AdminLayout.d.ts.map +1 -0
  79. package/dist/client/layouts/AdminLayout.js +72 -0
  80. package/dist/client/layouts/AdminLayout.js.map +1 -0
  81. package/dist/client/layouts/Sidebar.d.ts +6 -0
  82. package/dist/client/layouts/Sidebar.d.ts.map +1 -0
  83. package/dist/client/layouts/Sidebar.js +86 -0
  84. package/dist/client/layouts/Sidebar.js.map +1 -0
  85. package/dist/client/layouts/index.d.ts +3 -0
  86. package/dist/client/layouts/index.d.ts.map +1 -0
  87. package/dist/client/layouts/index.js +3 -0
  88. package/dist/client/layouts/index.js.map +1 -0
  89. package/dist/client/lib/utils.d.ts +5 -0
  90. package/dist/client/lib/utils.d.ts.map +1 -0
  91. package/dist/client/lib/utils.js +22 -0
  92. package/dist/client/lib/utils.js.map +1 -0
  93. package/dist/client/pages/ChangePasswordPage.d.ts +2 -0
  94. package/dist/client/pages/ChangePasswordPage.d.ts.map +1 -0
  95. package/dist/client/pages/ChangePasswordPage.js +58 -0
  96. package/dist/client/pages/ChangePasswordPage.js.map +1 -0
  97. package/dist/client/pages/ForgotPasswordPage.d.ts +2 -0
  98. package/dist/client/pages/ForgotPasswordPage.d.ts.map +1 -0
  99. package/dist/client/pages/ForgotPasswordPage.js +30 -0
  100. package/dist/client/pages/ForgotPasswordPage.js.map +1 -0
  101. package/dist/client/pages/LoginPage.d.ts +2 -0
  102. package/dist/client/pages/LoginPage.d.ts.map +1 -0
  103. package/dist/client/pages/LoginPage.js +52 -0
  104. package/dist/client/pages/LoginPage.js.map +1 -0
  105. package/dist/client/pages/PermissionsPage.d.ts +2 -0
  106. package/dist/client/pages/PermissionsPage.d.ts.map +1 -0
  107. package/dist/client/pages/PermissionsPage.js +42 -0
  108. package/dist/client/pages/PermissionsPage.js.map +1 -0
  109. package/dist/client/pages/ProfilePage.d.ts +2 -0
  110. package/dist/client/pages/ProfilePage.d.ts.map +1 -0
  111. package/dist/client/pages/ProfilePage.js +107 -0
  112. package/dist/client/pages/ProfilePage.js.map +1 -0
  113. package/dist/client/pages/ResetPasswordPage.d.ts +2 -0
  114. package/dist/client/pages/ResetPasswordPage.d.ts.map +1 -0
  115. package/dist/client/pages/ResetPasswordPage.js +68 -0
  116. package/dist/client/pages/ResetPasswordPage.js.map +1 -0
  117. package/dist/client/pages/RolesPage.d.ts +2 -0
  118. package/dist/client/pages/RolesPage.d.ts.map +1 -0
  119. package/dist/client/pages/RolesPage.js +82 -0
  120. package/dist/client/pages/RolesPage.js.map +1 -0
  121. package/dist/client/pages/UnauthorizedPage.d.ts +2 -0
  122. package/dist/client/pages/UnauthorizedPage.d.ts.map +1 -0
  123. package/dist/client/pages/UnauthorizedPage.js +9 -0
  124. package/dist/client/pages/UnauthorizedPage.js.map +1 -0
  125. package/dist/client/pages/UserDetailPage.d.ts +6 -0
  126. package/dist/client/pages/UserDetailPage.d.ts.map +1 -0
  127. package/dist/client/pages/UserDetailPage.js +220 -0
  128. package/dist/client/pages/UserDetailPage.js.map +1 -0
  129. package/dist/client/pages/UserPreferencesPage.d.ts +2 -0
  130. package/dist/client/pages/UserPreferencesPage.d.ts.map +1 -0
  131. package/dist/client/pages/UserPreferencesPage.js +152 -0
  132. package/dist/client/pages/UserPreferencesPage.js.map +1 -0
  133. package/dist/client/pages/UsersPage.d.ts +2 -0
  134. package/dist/client/pages/UsersPage.d.ts.map +1 -0
  135. package/dist/client/pages/UsersPage.js +228 -0
  136. package/dist/client/pages/UsersPage.js.map +1 -0
  137. package/dist/client/pages/VerifyEmailPage.d.ts +2 -0
  138. package/dist/client/pages/VerifyEmailPage.d.ts.map +1 -0
  139. package/dist/client/pages/VerifyEmailPage.js +43 -0
  140. package/dist/client/pages/VerifyEmailPage.js.map +1 -0
  141. package/dist/client/pages/index.d.ts +13 -0
  142. package/dist/client/pages/index.d.ts.map +1 -0
  143. package/dist/client/pages/index.js +13 -0
  144. package/dist/client/pages/index.js.map +1 -0
  145. package/dist/client/pages/roles/RoleModal.d.ts +10 -0
  146. package/dist/client/pages/roles/RoleModal.d.ts.map +1 -0
  147. package/dist/client/pages/roles/RoleModal.js +123 -0
  148. package/dist/client/pages/roles/RoleModal.js.map +1 -0
  149. package/dist/client/pages/users/DangerZone.d.ts +10 -0
  150. package/dist/client/pages/users/DangerZone.d.ts.map +1 -0
  151. package/dist/client/pages/users/DangerZone.js +8 -0
  152. package/dist/client/pages/users/DangerZone.js.map +1 -0
  153. package/dist/client/pages/users/ProfileCard.d.ts +14 -0
  154. package/dist/client/pages/users/ProfileCard.d.ts.map +1 -0
  155. package/dist/client/pages/users/ProfileCard.js +8 -0
  156. package/dist/client/pages/users/ProfileCard.js.map +1 -0
  157. package/dist/client/pages/users/SecuritySection.d.ts +14 -0
  158. package/dist/client/pages/users/SecuritySection.d.ts.map +1 -0
  159. package/dist/client/pages/users/SecuritySection.js +16 -0
  160. package/dist/client/pages/users/SecuritySection.js.map +1 -0
  161. package/dist/client/pages/users/SessionsSection.d.ts +25 -0
  162. package/dist/client/pages/users/SessionsSection.d.ts.map +1 -0
  163. package/dist/client/pages/users/SessionsSection.js +93 -0
  164. package/dist/client/pages/users/SessionsSection.js.map +1 -0
  165. package/dist/client/pages/users/SocialAccountsSection.d.ts +29 -0
  166. package/dist/client/pages/users/SocialAccountsSection.d.ts.map +1 -0
  167. package/dist/client/pages/users/SocialAccountsSection.js +72 -0
  168. package/dist/client/pages/users/SocialAccountsSection.js.map +1 -0
  169. package/dist/client/pages/users/UserDetailModal.d.ts +24 -0
  170. package/dist/client/pages/users/UserDetailModal.d.ts.map +1 -0
  171. package/dist/client/pages/users/UserDetailModal.js +42 -0
  172. package/dist/client/pages/users/UserDetailModal.js.map +1 -0
  173. package/dist/client/pages/users/UserFilters.d.ts +14 -0
  174. package/dist/client/pages/users/UserFilters.d.ts.map +1 -0
  175. package/dist/client/pages/users/UserFilters.js +22 -0
  176. package/dist/client/pages/users/UserFilters.js.map +1 -0
  177. package/dist/client/pages/users/UserStats.d.ts +9 -0
  178. package/dist/client/pages/users/UserStats.d.ts.map +1 -0
  179. package/dist/client/pages/users/UserStats.js +37 -0
  180. package/dist/client/pages/users/UserStats.js.map +1 -0
  181. package/dist/client/pages/users/UserTable.d.ts +24 -0
  182. package/dist/client/pages/users/UserTable.d.ts.map +1 -0
  183. package/dist/client/pages/users/UserTable.js +39 -0
  184. package/dist/client/pages/users/UserTable.js.map +1 -0
  185. package/dist/client/pages/users/VerificationSection.d.ts +9 -0
  186. package/dist/client/pages/users/VerificationSection.d.ts.map +1 -0
  187. package/dist/client/pages/users/VerificationSection.js +8 -0
  188. package/dist/client/pages/users/VerificationSection.js.map +1 -0
  189. package/dist/client/types/auth.d.ts +29 -0
  190. package/dist/client/types/auth.d.ts.map +1 -0
  191. package/dist/client/types/auth.js +2 -0
  192. package/dist/client/types/auth.js.map +1 -0
  193. package/dist/client/types/rbac.d.ts +39 -0
  194. package/dist/client/types/rbac.d.ts.map +1 -0
  195. package/dist/client/types/rbac.js +5 -0
  196. package/dist/client/types/rbac.js.map +1 -0
  197. package/dist/client/types/status.d.ts +12 -0
  198. package/dist/client/types/status.d.ts.map +1 -0
  199. package/dist/client/types/status.js +14 -0
  200. package/dist/client/types/status.js.map +1 -0
  201. package/dist/client/ui/Badge.d.ts +14 -0
  202. package/dist/client/ui/Badge.d.ts.map +1 -0
  203. package/dist/client/ui/Badge.js +32 -0
  204. package/dist/client/ui/Badge.js.map +1 -0
  205. package/dist/client/ui/Button.d.ts +18 -0
  206. package/dist/client/ui/Button.d.ts.map +1 -0
  207. package/dist/client/ui/Button.js +33 -0
  208. package/dist/client/ui/Button.js.map +1 -0
  209. package/dist/client/ui/Checkbox.d.ts +14 -0
  210. package/dist/client/ui/Checkbox.d.ts.map +1 -0
  211. package/dist/client/ui/Checkbox.js +35 -0
  212. package/dist/client/ui/Checkbox.js.map +1 -0
  213. package/dist/client/ui/ConfirmModal.d.ts +14 -0
  214. package/dist/client/ui/ConfirmModal.d.ts.map +1 -0
  215. package/dist/client/ui/ConfirmModal.js +43 -0
  216. package/dist/client/ui/ConfirmModal.js.map +1 -0
  217. package/dist/client/ui/DataTable.d.ts +69 -0
  218. package/dist/client/ui/DataTable.d.ts.map +1 -0
  219. package/dist/client/ui/DataTable.js +133 -0
  220. package/dist/client/ui/DataTable.js.map +1 -0
  221. package/dist/client/ui/Dropdown.d.ts +11 -0
  222. package/dist/client/ui/Dropdown.d.ts.map +1 -0
  223. package/dist/client/ui/Dropdown.js +65 -0
  224. package/dist/client/ui/Dropdown.js.map +1 -0
  225. package/dist/client/ui/FileInput.d.ts +16 -0
  226. package/dist/client/ui/FileInput.d.ts.map +1 -0
  227. package/dist/client/ui/FileInput.js +45 -0
  228. package/dist/client/ui/FileInput.js.map +1 -0
  229. package/dist/client/ui/Input.d.ts +16 -0
  230. package/dist/client/ui/Input.d.ts.map +1 -0
  231. package/dist/client/ui/Input.js +33 -0
  232. package/dist/client/ui/Input.js.map +1 -0
  233. package/dist/client/ui/LoadingSpinner.d.ts +7 -0
  234. package/dist/client/ui/LoadingSpinner.d.ts.map +1 -0
  235. package/dist/client/ui/LoadingSpinner.js +12 -0
  236. package/dist/client/ui/LoadingSpinner.js.map +1 -0
  237. package/dist/client/ui/Modal.d.ts +14 -0
  238. package/dist/client/ui/Modal.d.ts.map +1 -0
  239. package/dist/client/ui/Modal.js +46 -0
  240. package/dist/client/ui/Modal.js.map +1 -0
  241. package/dist/client/ui/Pagination.d.ts +14 -0
  242. package/dist/client/ui/Pagination.d.ts.map +1 -0
  243. package/dist/client/ui/Pagination.js +50 -0
  244. package/dist/client/ui/Pagination.js.map +1 -0
  245. package/dist/client/ui/Radio.d.ts +34 -0
  246. package/dist/client/ui/Radio.d.ts.map +1 -0
  247. package/dist/client/ui/Radio.js +44 -0
  248. package/dist/client/ui/Radio.js.map +1 -0
  249. package/dist/client/ui/Range.d.ts +17 -0
  250. package/dist/client/ui/Range.d.ts.map +1 -0
  251. package/dist/client/ui/Range.js +28 -0
  252. package/dist/client/ui/Range.js.map +1 -0
  253. package/dist/client/ui/Rating.d.ts +18 -0
  254. package/dist/client/ui/Rating.d.ts.map +1 -0
  255. package/dist/client/ui/Rating.js +64 -0
  256. package/dist/client/ui/Rating.js.map +1 -0
  257. package/dist/client/ui/Select.d.ts +20 -0
  258. package/dist/client/ui/Select.d.ts.map +1 -0
  259. package/dist/client/ui/Select.js +30 -0
  260. package/dist/client/ui/Select.js.map +1 -0
  261. package/dist/client/ui/Textarea.d.ts +14 -0
  262. package/dist/client/ui/Textarea.d.ts.map +1 -0
  263. package/dist/client/ui/Textarea.js +20 -0
  264. package/dist/client/ui/Textarea.js.map +1 -0
  265. package/dist/client/ui/Toggle.d.ts +13 -0
  266. package/dist/client/ui/Toggle.d.ts.map +1 -0
  267. package/dist/client/ui/Toggle.js +29 -0
  268. package/dist/client/ui/Toggle.js.map +1 -0
  269. package/dist/client/ui/index.d.ts +31 -0
  270. package/dist/client/ui/index.d.ts.map +1 -0
  271. package/dist/client/ui/index.js +35 -0
  272. package/dist/client/ui/index.js.map +1 -0
  273. package/dist/tailwind.preset.d.ts +10 -0
  274. package/dist/tailwind.preset.js +12 -0
  275. package/package.json +46 -17
@@ -0,0 +1,39 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useRouter } from 'next/navigation';
4
+ import { MoreVertical, Edit, Trash2, CheckCircle, Lock, Shield, Clock, Unlock, RotateCcw } from 'lucide-react';
5
+ import { useAdminConfig } from '../../config/AdminConfigContext';
6
+ import { useState } from 'react';
7
+ export const UserTable = ({ users, onDelete, onRestore, onUpdateStatus, onVerifyEmail, onUserClick }) => {
8
+ const router = useRouter();
9
+ const [openDropdown, setOpenDropdown] = useState(null);
10
+ const { resolvedRoutes } = useAdminConfig();
11
+ const getRoleBadge = (role) => {
12
+ const styles = {
13
+ viewer: 'bg-gray-100 text-gray-600',
14
+ editor: 'bg-blue-50 text-blue-700',
15
+ admin: 'bg-purple-50 text-purple-700',
16
+ super_admin: 'bg-orange-50 text-orange-700',
17
+ };
18
+ return styles[role] || styles.viewer;
19
+ };
20
+ return (_jsxs("div", { className: "bg-white rounded-xl border border-gray-200 overflow-hidden", children: [_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full", children: [_jsx("thead", { className: "bg-gray-50/50 border-b border-gray-200", children: _jsxs("tr", { children: [_jsx("th", { className: "px-6 py-4 text-left text-xs font-semibold text-gray-500 uppercase tracking-wider", children: "Ng\u01B0\u1EDDi d\u00F9ng" }), _jsx("th", { className: "px-6 py-4 text-left text-xs font-semibold text-gray-500 uppercase tracking-wider", children: "Vai tr\u00F2" }), _jsx("th", { className: "px-6 py-4 text-left text-xs font-semibold text-gray-500 uppercase tracking-wider", children: "Tr\u1EA1ng th\u00E1i & B\u1EA3o m\u1EADt" }), _jsx("th", { className: "px-6 py-4 text-left text-xs font-semibold text-gray-500 uppercase tracking-wider", children: "Ng\u00E0y tham gia" }), _jsx("th", { className: "px-6 py-4 text-right text-xs font-semibold text-gray-500 uppercase tracking-wider" })] }) }), _jsx("tbody", { className: "divide-y divide-gray-50", children: users.map((user) => (_jsxs("tr", { onClick: () => onUserClick(user), className: "group hover:bg-gray-50/80 transition-colors cursor-pointer", children: [_jsx("td", { className: "px-6 py-4 whitespace-nowrap", children: _jsxs("div", { className: "flex items-center gap-4", children: [_jsx("div", { className: "w-10 h-10 rounded-full bg-gray-100 flex items-center justify-center overflow-hidden border border-gray-200", children: user.avatar ? (_jsx("img", { src: user.avatar, alt: user.name, className: "w-full h-full object-cover" })) : (_jsx("span", { className: "text-lg font-semibold text-gray-500", children: user.name.charAt(0).toUpperCase() })) }), _jsxs("div", { children: [_jsx("div", { className: "font-semibold text-gray-900", children: user.name }), _jsx("div", { className: "text-sm text-gray-500", children: user.email })] })] }) }), _jsx("td", { className: "px-6 py-4 whitespace-nowrap", children: _jsx("span", { className: `inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium capitalize ${getRoleBadge(user.role)}`, children: user.role.replace('_', ' ') }) }), _jsx("td", { className: "px-6 py-4 whitespace-nowrap", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("div", { className: `flex items-center gap-1.5 px-2 py-1 rounded-md text-xs font-medium border ${user.deletedAt ? 'bg-gray-50 text-gray-500 border-gray-200' :
21
+ user.isActive ? 'bg-green-50 text-green-700 border-green-100' :
22
+ 'bg-red-50 text-red-700 border-red-100'}`, children: [_jsx("div", { className: `w-1.5 h-1.5 rounded-full ${user.deletedAt ? 'bg-gray-400' : user.isActive ? 'bg-green-500' : 'bg-red-500'}` }), user.deletedAt ? 'Deleted' : user.isActive ? 'Active' : 'Locked'] }), _jsx("div", { className: `p-1 rounded ${user.emailVerified ? 'text-green-600 bg-green-50' : 'text-gray-300 bg-gray-50'}`, title: user.emailVerified ? "Email Verified" : "Email Unverified", children: _jsx(CheckCircle, { className: "w-3.5 h-3.5" }) }), user.twoFactorEnabled && (_jsx("div", { className: "p-1 rounded text-purple-600 bg-purple-50", title: "2FA Enabled", children: _jsx(Shield, { className: "w-3.5 h-3.5" }) }))] }) }), _jsx("td", { className: "px-6 py-4 whitespace-nowrap", children: _jsxs("div", { className: "flex items-center gap-2 text-sm text-gray-500", children: [_jsx(Clock, { className: "w-3.5 h-3.5" }), new Date(user.createdAt).toLocaleDateString('vi-VN')] }) }), _jsx("td", { className: "px-6 py-4 whitespace-nowrap text-right", children: _jsxs("div", { className: "relative", children: [_jsx("button", { onClick: (e) => {
23
+ e.stopPropagation();
24
+ setOpenDropdown(openDropdown === user.id ? null : user.id);
25
+ }, className: "p-2 text-gray-400 hover:text-gray-600 hover:bg-gray-100 rounded-lg transition-all opacity-0 group-hover:opacity-100 focus:opacity-100", children: _jsx(MoreVertical, { className: "w-4 h-4" }) }), openDropdown === user.id && (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-10", onClick: (e) => { e.stopPropagation(); setOpenDropdown(null); } }), _jsxs("div", { onClick: (e) => e.stopPropagation(), className: "absolute right-0 mt-2 w-48 bg-white rounded-xl border border-gray-200 py-1 z-20 shadow-lg animate-in fade-in zoom-in-95 duration-200", children: [_jsxs("button", { onClick: () => router.push(resolvedRoutes.USERS_VIEW(user.id)), className: "w-full px-4 py-2.5 text-left text-sm text-gray-700 hover:bg-gray-50 flex items-center gap-2", children: [_jsx(Edit, { className: "w-4 h-4 text-gray-400" }), "Ch\u1EC9nh s\u1EEDa"] }), !user.emailVerified && !user.deletedAt && (_jsxs("button", { onClick: () => {
26
+ onVerifyEmail(user.id);
27
+ setOpenDropdown(null);
28
+ }, className: "w-full px-4 py-2.5 text-left text-sm text-gray-700 hover:bg-gray-50 flex items-center gap-2", children: [_jsx(CheckCircle, { className: "w-4 h-4 text-green-500" }), "X\u00E1c th\u1EF1c Email"] })), _jsx("div", { className: "h-px bg-gray-100 my-1" }), !user.deletedAt ? (_jsxs(_Fragment, { children: [_jsxs("button", { onClick: () => {
29
+ onUpdateStatus(user.id, user.isActive ? 'LOCKED' : 'ACTIVE');
30
+ setOpenDropdown(null);
31
+ }, className: `w-full px-4 py-2.5 text-left text-sm hover:bg-gray-50 flex items-center gap-2 ${user.isActive ? 'text-amber-600' : 'text-green-600'}`, children: [user.isActive ? _jsx(Lock, { className: "w-4 h-4" }) : _jsx(Unlock, { className: "w-4 h-4" }), user.isActive ? 'Khóa tài khoản' : 'Kích hoạt'] }), _jsxs("button", { onClick: () => {
32
+ onDelete(user.id);
33
+ setOpenDropdown(null);
34
+ }, className: "w-full px-4 py-2.5 text-left text-sm text-red-600 hover:bg-red-50 flex items-center gap-2", children: [_jsx(Trash2, { className: "w-4 h-4" }), "X\u00F3a ng\u01B0\u1EDDi d\u00F9ng"] })] })) : (_jsxs("button", { onClick: () => {
35
+ onRestore(user.id);
36
+ setOpenDropdown(null);
37
+ }, className: "w-full px-4 py-2.5 text-left text-sm text-green-600 hover:bg-green-50 flex items-center gap-2", children: [_jsx(RotateCcw, { className: "w-4 h-4" }), "Kh\u00F4i ph\u1EE5c l\u1EA1i"] }))] })] }))] }) })] }, user.id))) })] }) }), users.length === 0 && (_jsxs("div", { className: "p-12 text-center", children: [_jsx("div", { className: "w-16 h-16 bg-gray-50 rounded-full flex items-center justify-center mx-auto mb-4", children: _jsx(Shield, { className: "w-8 h-8 text-gray-300" }) }), _jsx("h3", { className: "text-lg font-medium text-gray-900 mb-1", children: "Kh\u00F4ng t\u00ECm th\u1EA5y ng\u01B0\u1EDDi d\u00F9ng" }), _jsx("p", { className: "text-gray-500 text-sm", children: "Th\u1EED thay \u0111\u1ED5i b\u1ED9 l\u1ECDc ho\u1EB7c t\u00ECm ki\u1EBFm t\u1EEB kh\u00F3a kh\u00E1c" })] }))] }));
38
+ };
39
+ //# sourceMappingURL=UserTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserTable.js","sourceRoot":"","sources":["../../../../src/client/pages/users/UserTable.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ interface VerificationSectionProps {
2
+ emailVerified: boolean;
3
+ emailVerifiedAt?: string;
4
+ onVerify: () => void;
5
+ onResend: () => void;
6
+ }
7
+ export declare const VerificationSection: ({ emailVerified, emailVerifiedAt, onVerify, onResend, }: VerificationSectionProps) => import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=VerificationSection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VerificationSection.d.ts","sourceRoot":"","sources":["../../../../src/client/pages/users/VerificationSection.tsx"],"names":[],"mappings":"AAGA,UAAU,wBAAwB;IAChC,aAAa,EAAE,OAAO,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,QAAQ,EAAE,MAAM,IAAI,CAAA;CACrB;AAED,eAAO,MAAM,mBAAmB,GAAI,yDAKjC,wBAAwB,4CAuD1B,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Mail, CheckCircle, XCircle, Send } from 'lucide-react';
3
+ export const VerificationSection = ({ emailVerified, emailVerifiedAt, onVerify, onResend, }) => {
4
+ return (_jsxs("div", { className: "bg-white rounded-2xl border border-gray-200 overflow-hidden", children: [_jsx("div", { className: "p-6 border-b border-gray-100 bg-gray-50/50", children: _jsxs("h3", { className: "font-semibold text-gray-900 flex items-center gap-2", children: [_jsx(Mail, { className: "w-5 h-5 text-gray-500" }), "X\u00E1c th\u1EF1c Email"] }) }), _jsx("div", { className: "p-6", children: _jsx("div", { className: `p-5 rounded-xl border ${emailVerified ? 'bg-green-50/50 border-green-100' : 'bg-amber-50/50 border-amber-100'}`, children: _jsxs("div", { className: "flex flex-col sm:flex-row gap-4 items-start sm:items-center justify-between", children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: `mt-0.5 p-1.5 rounded-full ${emailVerified ? 'bg-green-100 text-green-600' : 'bg-amber-100 text-amber-600'}`, children: emailVerified ? _jsx(CheckCircle, { className: "w-5 h-5" }) : _jsx(XCircle, { className: "w-5 h-5" }) }), _jsxs("div", { children: [_jsx("h4", { className: `font-semibold ${emailVerified ? 'text-green-900' : 'text-amber-900'}`, children: emailVerified ? 'Email đã xác thực' : 'Email chưa xác thực' }), _jsx("p", { className: `text-sm mt-0.5 ${emailVerified ? 'text-green-700' : 'text-amber-700'}`, children: emailVerified
5
+ ? `Đã xác thực vào ${new Date(emailVerifiedAt).toLocaleString('vi-VN')}`
6
+ : 'Người dùng chưa xác nhận quyền sở hữu email này.' })] })] }), _jsx("div", { className: "flex gap-2 w-full sm:w-auto", children: !emailVerified && (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: onVerify, className: "flex-1 sm:flex-none px-4 py-2 bg-green-600 text-white rounded-lg hover:bg-green-700 text-sm font-medium transition-colors", children: "X\u00E1c th\u1EF1c ngay" }), _jsxs("button", { type: "button", onClick: onResend, className: "flex-1 sm:flex-none px-4 py-2 bg-white border border-gray-200 text-gray-700 rounded-lg hover:bg-gray-50 text-sm font-medium flex items-center justify-center gap-2", children: [_jsx(Send, { className: "w-3.5 h-3.5" }), "G\u1EEDi l\u1EA1i mail"] })] })) })] }) }) })] }));
7
+ };
8
+ //# sourceMappingURL=VerificationSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VerificationSection.js","sourceRoot":"","sources":["../../../../src/client/pages/users/VerificationSection.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAS/D,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAClC,aAAa,EACb,eAAe,EACf,QAAQ,EACR,QAAQ,GACiB,EAAE,EAAE;IAC7B,OAAO,CACL,eAAK,SAAS,EAAC,6DAA6D,aAC1E,cAAK,SAAS,EAAC,4CAA4C,YACzD,cAAI,SAAS,EAAC,qDAAqD,aACjE,KAAC,IAAI,IAAC,SAAS,EAAC,uBAAuB,GAAG,gCAEvC,GACD,EAEN,cAAK,SAAS,EAAC,KAAK,YAClB,cAAK,SAAS,EAAE,yBAAyB,aAAa,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,iCAAiC,EAAE,YAC9H,eAAK,SAAS,EAAC,6EAA6E,aAC1F,eAAK,SAAS,EAAC,wBAAwB,aACrC,cAAK,SAAS,EAAE,6BAA6B,aAAa,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,6BAA6B,EAAE,YACzH,aAAa,CAAC,CAAC,CAAC,KAAC,WAAW,IAAC,SAAS,EAAC,SAAS,GAAG,CAAC,CAAC,CAAC,KAAC,OAAO,IAAC,SAAS,EAAC,SAAS,GAAG,GAClF,EACN,0BACE,aAAI,SAAS,EAAE,iBAAiB,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,EAAE,YAClF,aAAa,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,qBAAqB,GACzD,EACL,YAAG,SAAS,EAAE,kBAAkB,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,EAAE,YAClF,aAAa;oDACZ,CAAC,CAAC,mBAAmB,IAAI,IAAI,CAAC,eAAgB,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE;oDACzE,CAAC,CAAC,kDAAkD,GACpD,IACA,IACF,EAEN,cAAK,SAAS,EAAC,6BAA6B,YACxC,CAAC,aAAa,IAAI,CACjB,8BACE,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAC,2HAA2H,wCAG9H,EACT,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAC,oKAAoK,aAE9K,KAAC,IAAI,IAAC,SAAS,EAAC,aAAa,GAAG,8BAEzB,IACR,CACJ,GACE,IACF,GACF,GACF,IACF,CACP,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,29 @@
1
+ export interface User {
2
+ id: number;
3
+ email: string;
4
+ username: string | null;
5
+ displayName: string | null;
6
+ avatar: string | null;
7
+ emailVerifiedAt: string | null;
8
+ emailVerified: boolean;
9
+ status: number;
10
+ lastLoginAt: string | null;
11
+ twoFactorEnabled: boolean;
12
+ isFirstLogin?: boolean;
13
+ createdAt: string;
14
+ updatedAt: string;
15
+ roles: string[];
16
+ permissions: string[];
17
+ }
18
+ export interface AuthResponse {
19
+ accessToken: string;
20
+ refreshToken: string;
21
+ expiresIn: number;
22
+ tokenType: string;
23
+ user: User;
24
+ }
25
+ export interface LoginCredentials {
26
+ email: string;
27
+ password: string;
28
+ }
29
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/client/types/auth.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,aAAa,EAAE,OAAO,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,gBAAgB,EAAE,OAAO,CAAA;IACzB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,IAAI,CAAA;CACX;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/client/types/auth.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * API response DTOs cho RBAC. Phải khớp với backend admin-core response shape.
3
+ */
4
+ export interface Permission {
5
+ id: number;
6
+ name: string;
7
+ resource: string;
8
+ action: string;
9
+ description: string;
10
+ }
11
+ export interface Role {
12
+ id: number;
13
+ name: string;
14
+ description: string;
15
+ isSystem: boolean;
16
+ permissions: Permission[];
17
+ permissionIds: number[];
18
+ permissionsCount?: number;
19
+ createdAt?: string;
20
+ updatedAt?: string;
21
+ }
22
+ export interface RoleListResponse {
23
+ items: Role[];
24
+ total: number;
25
+ page: number;
26
+ limit: number;
27
+ totalPages: number;
28
+ }
29
+ export interface CreateRoleDto {
30
+ name: string;
31
+ description: string;
32
+ permissionIds: number[];
33
+ }
34
+ export interface UpdateRoleDto {
35
+ name?: string;
36
+ description?: string;
37
+ permissionIds?: number[];
38
+ }
39
+ //# sourceMappingURL=rbac.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac.d.ts","sourceRoot":"","sources":["../../../src/client/types/rbac.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,OAAO,CAAA;IACjB,WAAW,EAAE,UAAU,EAAE,CAAA;IACzB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,EAAE,CAAA;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CACzB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * API response DTOs cho RBAC. Phải khớp với backend admin-core response shape.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=rbac.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac.js","sourceRoot":"","sources":["../../../src/client/types/rbac.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,12 @@
1
+ export declare enum VerificationStatus {
2
+ VERIFYING = "verifying",
3
+ SUCCESS = "success",
4
+ ERROR = "error"
5
+ }
6
+ export declare enum RequestStatus {
7
+ IDLE = "idle",
8
+ LOADING = "loading",
9
+ SUCCESS = "success",
10
+ ERROR = "error"
11
+ }
12
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/client/types/status.ts"],"names":[],"mappings":"AAAA,oBAAY,kBAAkB;IAC5B,SAAS,cAAc;IACvB,OAAO,YAAY;IACnB,KAAK,UAAU;CAChB;AAED,oBAAY,aAAa;IACvB,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,KAAK,UAAU;CAChB"}
@@ -0,0 +1,14 @@
1
+ export var VerificationStatus;
2
+ (function (VerificationStatus) {
3
+ VerificationStatus["VERIFYING"] = "verifying";
4
+ VerificationStatus["SUCCESS"] = "success";
5
+ VerificationStatus["ERROR"] = "error";
6
+ })(VerificationStatus || (VerificationStatus = {}));
7
+ export var RequestStatus;
8
+ (function (RequestStatus) {
9
+ RequestStatus["IDLE"] = "idle";
10
+ RequestStatus["LOADING"] = "loading";
11
+ RequestStatus["SUCCESS"] = "success";
12
+ RequestStatus["ERROR"] = "error";
13
+ })(RequestStatus || (RequestStatus = {}));
14
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/client/types/status.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,kBAIX;AAJD,WAAY,kBAAkB;IAC5B,6CAAuB,CAAA;IACvB,yCAAmB,CAAA;IACnB,qCAAe,CAAA;AACjB,CAAC,EAJW,kBAAkB,KAAlB,kBAAkB,QAI7B;AAED,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,8BAAa,CAAA;IACb,oCAAmB,CAAA;IACnB,oCAAmB,CAAA;IACnB,gCAAe,CAAA;AACjB,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB"}
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ export type BadgeVariant = 'default' | 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info' | 'neutral';
3
+ export type BadgeSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
4
+ export type BadgeStyle = 'solid' | 'outline' | 'dash' | 'soft' | 'ghost';
5
+ interface BadgeProps {
6
+ children: React.ReactNode;
7
+ variant?: BadgeVariant;
8
+ size?: BadgeSize;
9
+ style?: BadgeStyle;
10
+ className?: string;
11
+ }
12
+ declare const Badge: React.FC<BadgeProps>;
13
+ export default Badge;
14
+ //# sourceMappingURL=Badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.d.ts","sourceRoot":"","sources":["../../../src/client/ui/Badge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,SAAS,GACT,WAAW,GACX,QAAQ,GACR,SAAS,GACT,SAAS,GACT,OAAO,GACP,MAAM,GACN,SAAS,CAAA;AAEb,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAExD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAExE,UAAU,UAAU;IAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,QAAA,MAAM,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CAgD/B,CAAA;AAED,eAAe,KAAK,CAAA"}
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '../lib/utils';
3
+ const Badge = ({ children, variant = 'default', size = 'sm', style = 'solid', className }) => {
4
+ const variantClasses = {
5
+ default: '',
6
+ primary: 'badge-primary',
7
+ secondary: 'badge-secondary',
8
+ accent: 'badge-accent',
9
+ success: 'badge-success',
10
+ warning: 'badge-warning',
11
+ error: 'badge-error',
12
+ info: 'badge-info',
13
+ neutral: 'badge-neutral'
14
+ };
15
+ const sizeClasses = {
16
+ xs: 'badge-xs',
17
+ sm: 'badge-sm',
18
+ md: 'badge-md',
19
+ lg: 'badge-lg',
20
+ xl: 'badge-xl'
21
+ };
22
+ const styleClasses = {
23
+ solid: '',
24
+ outline: 'badge-outline',
25
+ dash: 'badge-dash',
26
+ soft: 'badge-soft',
27
+ ghost: 'badge-ghost'
28
+ };
29
+ return (_jsx("span", { className: cn('badge', variantClasses[variant], sizeClasses[size], styleClasses[style], className), children: children }));
30
+ };
31
+ export default Badge;
32
+ //# sourceMappingURL=Badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.js","sourceRoot":"","sources":["../../../src/client/ui/Badge.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAyBjC,MAAM,KAAK,GAAyB,CAAC,EACnC,QAAQ,EACR,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,IAAI,EACX,KAAK,GAAG,OAAO,EACf,SAAS,EACV,EAAE,EAAE;IACH,MAAM,cAAc,GAAiC;QACnD,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,eAAe;QACxB,SAAS,EAAE,iBAAiB;QAC5B,MAAM,EAAE,cAAc;QACtB,OAAO,EAAE,eAAe;QACxB,OAAO,EAAE,eAAe;QACxB,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,eAAe;KACzB,CAAA;IAED,MAAM,WAAW,GAA8B;QAC7C,EAAE,EAAE,UAAU;QACd,EAAE,EAAE,UAAU;QACd,EAAE,EAAE,UAAU;QACd,EAAE,EAAE,UAAU;QACd,EAAE,EAAE,UAAU;KACf,CAAA;IAED,MAAM,YAAY,GAA+B;QAC/C,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,eAAe;QACxB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,aAAa;KACrB,CAAA;IAED,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,OAAO,EACP,cAAc,CAAC,OAAO,CAAC,EACvB,WAAW,CAAC,IAAI,CAAC,EACjB,YAAY,CAAC,KAAK,CAAC,EACnB,SAAS,CACV,YAEA,QAAQ,GACJ,CACR,CAAA;AACH,CAAC,CAAA;AAED,eAAe,KAAK,CAAA"}
@@ -0,0 +1,18 @@
1
+ import { ButtonHTMLAttributes } from 'react';
2
+ export type ButtonVariant = 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error';
3
+ export type ButtonStyle = 'solid' | 'outline' | 'dash' | 'soft' | 'ghost' | 'link';
4
+ export type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
5
+ export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
6
+ variant?: ButtonVariant;
7
+ btnStyle?: ButtonStyle;
8
+ size?: ButtonSize;
9
+ isLoading?: boolean;
10
+ active?: boolean;
11
+ wide?: boolean;
12
+ block?: boolean;
13
+ square?: boolean;
14
+ circle?: boolean;
15
+ }
16
+ declare const Button: import("react").ForwardRefExoticComponent<ButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
17
+ export default Button;
18
+ //# sourceMappingURL=Button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../src/client/ui/Button.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAc,MAAM,OAAO,CAAA;AAExD,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,SAAS,GACT,WAAW,GACX,QAAQ,GACR,MAAM,GACN,SAAS,GACT,SAAS,GACT,OAAO,CAAA;AAEX,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAA;AAElF,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAEzD,MAAM,WAAW,WAAY,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC;IAC1E,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,QAAQ,CAAC,EAAE,WAAW,CAAA;IACtB,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,QAAA,MAAM,MAAM,2GAoEX,CAAA;AAED,eAAe,MAAM,CAAA"}
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from '../lib/utils';
3
+ import { forwardRef } from 'react';
4
+ const Button = forwardRef(({ className, variant = 'neutral', btnStyle = 'solid', size = 'md', isLoading, disabled, active, wide, block, square, circle, children, ...props }, ref) => {
5
+ const variantClasses = {
6
+ neutral: 'btn-neutral',
7
+ primary: 'btn-primary',
8
+ secondary: 'btn-secondary',
9
+ accent: 'btn-accent',
10
+ info: 'btn-info',
11
+ success: 'btn-success',
12
+ warning: 'btn-warning',
13
+ error: 'btn-error'
14
+ };
15
+ const styleClasses = {
16
+ solid: '',
17
+ outline: 'btn-outline',
18
+ dash: 'btn-dash',
19
+ soft: 'btn-soft',
20
+ ghost: 'btn-ghost',
21
+ link: 'btn-link'
22
+ };
23
+ const sizeClasses = {
24
+ xs: 'btn-xs',
25
+ sm: 'btn-sm',
26
+ md: 'btn-md',
27
+ lg: 'btn-lg',
28
+ xl: 'btn-xl'
29
+ };
30
+ return (_jsxs("button", { ref: ref, className: cn('btn', variantClasses[variant], styleClasses[btnStyle], sizeClasses[size], active && 'btn-active', disabled && 'btn-disabled', wide && 'btn-wide', block && 'btn-block', square && 'btn-square', circle && 'btn-circle', className), disabled: disabled || isLoading, ...props, children: [isLoading && _jsx("span", { className: "loading loading-spinner loading-sm" }), children] }));
31
+ });
32
+ export default Button;
33
+ //# sourceMappingURL=Button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.js","sourceRoot":"","sources":["../../../src/client/ui/Button.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AACjC,OAAO,EAAwB,UAAU,EAAE,MAAM,OAAO,CAAA;AA4BxD,MAAM,MAAM,GAAG,UAAU,CACvB,CAAC,EACC,SAAS,EACT,OAAO,GAAG,SAAS,EACnB,QAAQ,GAAG,OAAO,EAClB,IAAI,GAAG,IAAI,EACX,SAAS,EACT,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,KAAK,EACL,MAAM,EACN,MAAM,EACN,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,GAAG,EAAE,EAAE;IACR,MAAM,cAAc,GAAkC;QACpD,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE,aAAa;QACtB,SAAS,EAAE,eAAe;QAC1B,MAAM,EAAE,YAAY;QACpB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE,aAAa;QACtB,KAAK,EAAE,WAAW;KACnB,CAAA;IAED,MAAM,YAAY,GAAgC;QAChD,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,aAAa;QACtB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,UAAU;KACjB,CAAA;IAED,MAAM,WAAW,GAA+B;QAC9C,EAAE,EAAE,QAAQ;QACZ,EAAE,EAAE,QAAQ;QACZ,EAAE,EAAE,QAAQ;QACZ,EAAE,EAAE,QAAQ;QACZ,EAAE,EAAE,QAAQ;KACb,CAAA;IAED,OAAO,CACL,kBACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,KAAK,EACL,cAAc,CAAC,OAAO,CAAC,EACvB,YAAY,CAAC,QAAQ,CAAC,EACtB,WAAW,CAAC,IAAI,CAAC,EACjB,MAAM,IAAI,YAAY,EACtB,QAAQ,IAAI,cAAc,EAC1B,IAAI,IAAI,UAAU,EAClB,KAAK,IAAI,WAAW,EACpB,MAAM,IAAI,YAAY,EACtB,MAAM,IAAI,YAAY,EACtB,SAAS,CACV,EACD,QAAQ,EAAE,QAAQ,IAAI,SAAS,KAC3B,KAAK,aAER,SAAS,IAAI,eAAM,SAAS,EAAC,oCAAoC,GAAQ,EACzE,QAAQ,IACF,CACV,CAAA;AACH,CAAC,CACF,CAAA;AAED,eAAe,MAAM,CAAA"}
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ export interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {
3
+ label?: string;
4
+ labelPosition?: 'left' | 'right';
5
+ helperText?: string;
6
+ error?: boolean;
7
+ errorMessage?: string;
8
+ variant?: 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'info' | 'error';
9
+ size?: 'xs' | 'sm' | 'md' | 'lg';
10
+ indeterminate?: boolean;
11
+ }
12
+ declare const Checkbox: React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLInputElement>>;
13
+ export default Checkbox;
14
+ //# sourceMappingURL=Checkbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Checkbox.d.ts","sourceRoot":"","sources":["../../../src/client/ui/Checkbox.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAI1C,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC9F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;IACxF,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,QAAA,MAAM,QAAQ,wFAoFb,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import React, { forwardRef } from 'react';
4
+ import { cn } from '../lib/utils';
5
+ const Checkbox = forwardRef(({ className, label, labelPosition = 'right', helperText, error, errorMessage, variant, size = 'md', disabled, indeterminate, ...props }, ref) => {
6
+ const checkboxClassName = cn('checkbox', {
7
+ 'checkbox-primary': variant === 'primary',
8
+ 'checkbox-secondary': variant === 'secondary',
9
+ 'checkbox-accent': variant === 'accent',
10
+ 'checkbox-success': variant === 'success',
11
+ 'checkbox-warning': variant === 'warning',
12
+ 'checkbox-info': variant === 'info',
13
+ 'checkbox-error': variant === 'error' || error,
14
+ 'checkbox-xs': size === 'xs',
15
+ 'checkbox-sm': size === 'sm',
16
+ 'checkbox-md': size === 'md',
17
+ 'checkbox-lg': size === 'lg',
18
+ }, className);
19
+ const wrapperClassName = cn('form-control', {
20
+ 'opacity-50 cursor-not-allowed': disabled,
21
+ });
22
+ React.useEffect(() => {
23
+ if (ref && typeof ref !== 'function' && ref.current) {
24
+ ref.current.indeterminate = indeterminate || false;
25
+ }
26
+ }, [indeterminate, ref]);
27
+ const checkboxElement = (_jsx("input", { ref: ref, type: "checkbox", className: checkboxClassName, disabled: disabled, ...props }));
28
+ const labelElement = label && (_jsx("span", { className: "label-text cursor-pointer", children: label }));
29
+ return (_jsxs("div", { className: wrapperClassName, children: [_jsxs("label", { className: "label cursor-pointer justify-start gap-3", children: [labelPosition === 'left' && labelElement, checkboxElement, labelPosition === 'right' && labelElement] }), (helperText || errorMessage) && (_jsx("div", { className: "label", children: _jsx("span", { className: cn('label-text-alt', {
30
+ 'text-error': error || errorMessage,
31
+ 'text-base-content/70': !error && !errorMessage,
32
+ }), children: errorMessage || helperText }) }))] }));
33
+ });
34
+ export default Checkbox;
35
+ //# sourceMappingURL=Checkbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Checkbox.js","sourceRoot":"","sources":["../../../src/client/ui/Checkbox.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAalC,MAAM,QAAQ,GAAG,UAAU,CACzB,CAAC,EACC,SAAS,EACT,KAAK,EACL,aAAa,GAAG,OAAO,EACvB,UAAU,EACV,KAAK,EACL,YAAY,EACZ,OAAO,EACP,IAAI,GAAG,IAAI,EACX,QAAQ,EACR,aAAa,EACb,GAAG,KAAK,EACT,EAAE,GAAG,EAAE,EAAE;IACR,MAAM,iBAAiB,GAAG,EAAE,CAC1B,UAAU,EACV;QACE,kBAAkB,EAAE,OAAO,KAAK,SAAS;QACzC,oBAAoB,EAAE,OAAO,KAAK,WAAW;QAC7C,iBAAiB,EAAE,OAAO,KAAK,QAAQ;QACvC,kBAAkB,EAAE,OAAO,KAAK,SAAS;QACzC,kBAAkB,EAAE,OAAO,KAAK,SAAS;QACzC,eAAe,EAAE,OAAO,KAAK,MAAM;QACnC,gBAAgB,EAAE,OAAO,KAAK,OAAO,IAAI,KAAK;QAC9C,aAAa,EAAE,IAAI,KAAK,IAAI;QAC5B,aAAa,EAAE,IAAI,KAAK,IAAI;QAC5B,aAAa,EAAE,IAAI,KAAK,IAAI;QAC5B,aAAa,EAAE,IAAI,KAAK,IAAI;KAC7B,EACD,SAAS,CACV,CAAC;IAEF,MAAM,gBAAgB,GAAG,EAAE,CACzB,cAAc,EACd;QACE,+BAA+B,EAAE,QAAQ;KAC1C,CACF,CAAC;IAEF,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,UAAU,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YACpD,GAAG,CAAC,OAAO,CAAC,aAAa,GAAG,aAAa,IAAI,KAAK,CAAC;QACrD,CAAC;IACH,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC;IAEzB,MAAM,eAAe,GAAG,CACtB,gBACE,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,UAAU,EACf,SAAS,EAAE,iBAAiB,EAC5B,QAAQ,EAAE,QAAQ,KACd,KAAK,GACT,CACH,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,IAAI,CAC5B,eAAM,SAAS,EAAC,2BAA2B,YAAE,KAAK,GAAQ,CAC3D,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAE,gBAAgB,aAC9B,iBAAO,SAAS,EAAC,0CAA0C,aACxD,aAAa,KAAK,MAAM,IAAI,YAAY,EACxC,eAAe,EACf,aAAa,KAAK,OAAO,IAAI,YAAY,IACpC,EAGP,CAAC,UAAU,IAAI,YAAY,CAAC,IAAI,CAC/B,cAAK,SAAS,EAAC,OAAO,YACpB,eAAM,SAAS,EAAE,EAAE,CACjB,gBAAgB,EAChB;wBACE,YAAY,EAAE,KAAK,IAAI,YAAY;wBACnC,sBAAsB,EAAE,CAAC,KAAK,IAAI,CAAC,YAAY;qBAChD,CACF,YACE,YAAY,IAAI,UAAU,GACtB,GACH,CACP,IACG,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,14 @@
1
+ interface ConfirmModalProps {
2
+ isOpen: boolean;
3
+ onClose: () => void;
4
+ onConfirm: () => void;
5
+ title?: string;
6
+ message: string;
7
+ confirmText?: string;
8
+ cancelText?: string;
9
+ type?: 'danger' | 'warning' | 'info';
10
+ icon?: React.ReactNode;
11
+ }
12
+ export declare function ConfirmModal({ isOpen, onClose, onConfirm, title, message, confirmText, cancelText, type, icon, }: ConfirmModalProps): import("react/jsx-runtime").JSX.Element;
13
+ export default ConfirmModal;
14
+ //# sourceMappingURL=ConfirmModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmModal.d.ts","sourceRoot":"","sources":["../../../src/client/ui/ConfirmModal.tsx"],"names":[],"mappings":"AAKA,UAAU,iBAAiB;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IACrC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB;AAED,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,OAAO,EACP,SAAS,EACT,KAAwB,EACxB,OAAO,EACP,WAAuB,EACvB,UAAqB,EACrB,IAAgB,EAChB,IAAI,GACL,EAAE,iBAAiB,2CAiFnB;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,43 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { AlertTriangle, Trash2 } from 'lucide-react';
4
+ import Modal from './Modal';
5
+ export function ConfirmModal({ isOpen, onClose, onConfirm, title = 'Confirm Action', message, confirmText = 'Confirm', cancelText = 'Cancel', type = 'warning', icon, }) {
6
+ const getTypeClasses = () => {
7
+ switch (type) {
8
+ case 'danger':
9
+ return {
10
+ iconColor: 'text-error',
11
+ confirmBtn: 'btn-error',
12
+ bgColor: 'bg-error/10',
13
+ };
14
+ case 'warning':
15
+ return {
16
+ iconColor: 'text-warning',
17
+ confirmBtn: 'btn-warning',
18
+ bgColor: 'bg-warning/10',
19
+ };
20
+ case 'info':
21
+ return {
22
+ iconColor: 'text-info',
23
+ confirmBtn: 'btn-primary',
24
+ bgColor: 'bg-info/10',
25
+ };
26
+ default:
27
+ return {
28
+ iconColor: 'text-warning',
29
+ confirmBtn: 'btn-warning',
30
+ bgColor: 'bg-warning/10',
31
+ };
32
+ }
33
+ };
34
+ const typeClasses = getTypeClasses();
35
+ const defaultIcon = type === 'danger' ? _jsx(Trash2, { className: "w-6 h-6" }) : _jsx(AlertTriangle, { className: "w-6 h-6" });
36
+ const handleConfirm = () => {
37
+ onConfirm();
38
+ onClose();
39
+ };
40
+ return (_jsx(Modal, { isOpen: isOpen, onClose: onClose, size: "sm", showCloseButton: false, children: _jsxs("div", { className: "p-6", children: [_jsx("div", { className: `w-12 h-12 rounded-full ${typeClasses.bgColor} flex items-center justify-center mx-auto mb-4`, children: _jsx("div", { className: typeClasses.iconColor, children: icon || defaultIcon }) }), _jsxs("div", { className: "text-center mb-6", children: [_jsx("h3", { className: "text-lg font-semibold text-base-content mb-2", children: title }), _jsx("p", { className: "text-base-content/70", children: message })] }), _jsxs("div", { className: "flex gap-3 justify-center", children: [_jsx("button", { onClick: onClose, className: "btn btn-outline flex-1", children: cancelText }), _jsx("button", { onClick: handleConfirm, className: `btn ${typeClasses.confirmBtn} flex-1`, children: confirmText })] })] }) }));
41
+ }
42
+ export default ConfirmModal;
43
+ //# sourceMappingURL=ConfirmModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmModal.js","sourceRoot":"","sources":["../../../src/client/ui/ConfirmModal.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,MAAM,SAAS,CAAC;AAc5B,MAAM,UAAU,YAAY,CAAC,EAC3B,MAAM,EACN,OAAO,EACP,SAAS,EACT,KAAK,GAAG,gBAAgB,EACxB,OAAO,EACP,WAAW,GAAG,SAAS,EACvB,UAAU,GAAG,QAAQ,EACrB,IAAI,GAAG,SAAS,EAChB,IAAI,GACc;IAClB,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ;gBACX,OAAO;oBACL,SAAS,EAAE,YAAY;oBACvB,UAAU,EAAE,WAAW;oBACvB,OAAO,EAAE,aAAa;iBACvB,CAAC;YACJ,KAAK,SAAS;gBACZ,OAAO;oBACL,SAAS,EAAE,cAAc;oBACzB,UAAU,EAAE,aAAa;oBACzB,OAAO,EAAE,eAAe;iBACzB,CAAC;YACJ,KAAK,MAAM;gBACT,OAAO;oBACL,SAAS,EAAE,WAAW;oBACtB,UAAU,EAAE,aAAa;oBACzB,OAAO,EAAE,YAAY;iBACtB,CAAC;YACJ;gBACE,OAAO;oBACL,SAAS,EAAE,cAAc;oBACzB,UAAU,EAAE,aAAa;oBACzB,OAAO,EAAE,eAAe;iBACzB,CAAC;QACN,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAC,MAAM,IAAC,SAAS,EAAC,SAAS,GAAG,CAAC,CAAC,CAAC,KAAC,aAAa,IAAC,SAAS,EAAC,SAAS,GAAG,CAAC;IAE/G,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,OAAO,CACL,KAAC,KAAK,IACJ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,IAAI,EAAC,IAAI,EACT,eAAe,EAAE,KAAK,YAEtB,eAAK,SAAS,EAAC,KAAK,aAElB,cAAK,SAAS,EAAE,0BAA0B,WAAW,CAAC,OAAO,gDAAgD,YAC3G,cAAK,SAAS,EAAE,WAAW,CAAC,SAAS,YAClC,IAAI,IAAI,WAAW,GAChB,GACF,EAGN,eAAK,SAAS,EAAC,kBAAkB,aAC/B,aAAI,SAAS,EAAC,8CAA8C,YACzD,KAAK,GACH,EACL,YAAG,SAAS,EAAC,sBAAsB,YAChC,OAAO,GACN,IACA,EAGN,eAAK,SAAS,EAAC,2BAA2B,aACxC,iBACE,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,wBAAwB,YAEjC,UAAU,GACJ,EACT,iBACE,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,OAAO,WAAW,CAAC,UAAU,SAAS,YAEhD,WAAW,GACL,IACL,IACF,GACA,CACT,CAAC;AACJ,CAAC;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { ReactNode } from 'react';
2
+ export interface TableColumn<T = any> {
3
+ key: string;
4
+ label: string;
5
+ width?: string;
6
+ align?: 'left' | 'center' | 'right';
7
+ render?: (value: any, item: T, index: number) => ReactNode;
8
+ sortable?: boolean;
9
+ }
10
+ export interface TableAction<T = any> {
11
+ key: string;
12
+ label: string;
13
+ icon?: ReactNode;
14
+ variant?: 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info' | 'ghost';
15
+ className?: string;
16
+ onClick?: (item: T) => void;
17
+ href?: (item: T) => string;
18
+ show?: (item: T) => boolean;
19
+ }
20
+ export interface BulkAction<T = any> {
21
+ key: string;
22
+ label: string;
23
+ icon?: ReactNode;
24
+ variant?: 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info' | 'ghost';
25
+ onClick: (selectedItems: T[]) => void;
26
+ }
27
+ interface PaginationInfo {
28
+ currentPage: number;
29
+ totalPages: number;
30
+ totalItems: number;
31
+ itemsPerPage: number;
32
+ startItem: number;
33
+ endItem: number;
34
+ }
35
+ interface TableProps<T = any> {
36
+ data: T[];
37
+ columns: TableColumn<T>[];
38
+ actions?: TableAction<T>[];
39
+ bulkActions?: BulkAction<T>[];
40
+ loading?: boolean;
41
+ emptyMessage?: string;
42
+ className?: string;
43
+ selectable?: boolean;
44
+ pagination?: PaginationInfo;
45
+ onPageChange?: (page: number) => void;
46
+ onItemsPerPageChange?: (itemsPerPage: number) => void;
47
+ onRowClick?: (item: T) => void;
48
+ }
49
+ export default function DataTable<T extends {
50
+ id: string | number;
51
+ }>({ data, columns, actions, bulkActions, loading, emptyMessage, className, selectable, pagination, onPageChange, onItemsPerPageChange, onRowClick, }: TableProps<T>): import("react/jsx-runtime").JSX.Element;
52
+ export declare const TableRenderers: {
53
+ id: (value: string | number) => import("react/jsx-runtime").JSX.Element;
54
+ image: (src: string, alt?: string, size?: "sm" | "md" | "lg") => import("react/jsx-runtime").JSX.Element;
55
+ badge: (value: string, variant?: "success" | "warning" | "error" | "info" | "neutral") => import("react/jsx-runtime").JSX.Element;
56
+ datetime: (value: string) => import("react/jsx-runtime").JSX.Element;
57
+ textWithDescription: (title: string, description?: string) => import("react/jsx-runtime").JSX.Element;
58
+ category: (value: string, color?: string) => import("react/jsx-runtime").JSX.Element;
59
+ price: (value: number) => import("react/jsx-runtime").JSX.Element;
60
+ rating: (rating: number, count?: number) => import("react/jsx-runtime").JSX.Element;
61
+ stock: (stock: number, status?: string) => import("react/jsx-runtime").JSX.Element;
62
+ };
63
+ export declare const TableActions: {
64
+ edit: (getHref: (item: any) => string) => TableAction;
65
+ delete: (onClick: (item: any) => void) => TableAction;
66
+ view: (onClick: (item: any) => void) => TableAction;
67
+ };
68
+ export {};
69
+ //# sourceMappingURL=DataTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/client/ui/DataTable.tsx"],"names":[],"mappings":"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"}