@samanhappy/mcphub 0.12.16 → 0.12.17

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 (65) hide show
  1. package/dist/config/index.js +9 -9
  2. package/dist/config/index.js.map +1 -1
  3. package/dist/middlewares/userContext.js +17 -2
  4. package/dist/middlewares/userContext.js.map +1 -1
  5. package/dist/services/mcpService.js +7 -2
  6. package/dist/services/mcpService.js.map +1 -1
  7. package/dist/services/vectorSearchService.js +5 -1
  8. package/dist/services/vectorSearchService.js.map +1 -1
  9. package/frontend/dist/assets/ActivityPage-ClgKeihP.js +2 -0
  10. package/frontend/dist/assets/ActivityPage-ClgKeihP.js.map +1 -0
  11. package/frontend/dist/assets/Badge-Ck2fhRdl.js +2 -0
  12. package/frontend/dist/assets/Badge-Ck2fhRdl.js.map +1 -0
  13. package/frontend/dist/assets/ConfirmDialog-uYjffH4V.js +2 -0
  14. package/frontend/dist/assets/ConfirmDialog-uYjffH4V.js.map +1 -0
  15. package/frontend/dist/assets/Dashboard-BIXrLobn.js +2 -0
  16. package/frontend/dist/assets/Dashboard-BIXrLobn.js.map +1 -0
  17. package/frontend/dist/assets/DeleteDialog-BAfrV8EB.js +2 -0
  18. package/frontend/dist/assets/DeleteDialog-BAfrV8EB.js.map +1 -0
  19. package/frontend/dist/assets/GroupsPage-BjrvyHwu.js +33 -0
  20. package/frontend/dist/assets/GroupsPage-BjrvyHwu.js.map +1 -0
  21. package/frontend/dist/assets/LoginPage-BBHt_TfF.js +2 -0
  22. package/frontend/dist/assets/LoginPage-BBHt_TfF.js.map +1 -0
  23. package/frontend/dist/assets/LogsPage-D8Znq5NB.js +2 -0
  24. package/frontend/dist/assets/LogsPage-D8Znq5NB.js.map +1 -0
  25. package/frontend/dist/assets/MarketPage-haRuzjCw.js +3 -0
  26. package/frontend/dist/assets/MarketPage-haRuzjCw.js.map +1 -0
  27. package/frontend/dist/assets/Pagination-y-gVO8ms.js +2 -0
  28. package/frontend/dist/assets/Pagination-y-gVO8ms.js.map +1 -0
  29. package/frontend/dist/assets/PromptsPage-ByHWPyGe.js +2 -0
  30. package/frontend/dist/assets/PromptsPage-ByHWPyGe.js.map +1 -0
  31. package/frontend/dist/assets/ResourcesPage-Bodw5OY9.js +2 -0
  32. package/frontend/dist/assets/ResourcesPage-Bodw5OY9.js.map +1 -0
  33. package/frontend/dist/assets/ServersPage-CtS1I4yS.js +37 -0
  34. package/frontend/dist/assets/ServersPage-CtS1I4yS.js.map +1 -0
  35. package/frontend/dist/assets/SettingsPage-DxVigf7p.js +12 -0
  36. package/frontend/dist/assets/SettingsPage-DxVigf7p.js.map +1 -0
  37. package/frontend/dist/assets/ToggleGroup-HfxdlkGi.js +2 -0
  38. package/frontend/dist/assets/ToggleGroup-HfxdlkGi.js.map +1 -0
  39. package/frontend/dist/assets/UsersPage-Bipw33cS.js +2 -0
  40. package/frontend/dist/assets/UsersPage-Bipw33cS.js.map +1 -0
  41. package/frontend/dist/assets/framework-vendor-_OBebcuv.js +61 -0
  42. package/frontend/dist/assets/framework-vendor-_OBebcuv.js.map +1 -0
  43. package/frontend/dist/assets/i18n-vendor-MQ921plD.js +2 -0
  44. package/frontend/dist/assets/i18n-vendor-MQ921plD.js.map +1 -0
  45. package/frontend/dist/assets/icons-vendor-B67NtVuR.js +172 -0
  46. package/frontend/dist/assets/icons-vendor-B67NtVuR.js.map +1 -0
  47. package/frontend/dist/assets/index-CmnA4an8.js +5 -0
  48. package/frontend/dist/assets/index-CmnA4an8.js.map +1 -0
  49. package/frontend/dist/assets/index-DfFHVARX.css +1 -0
  50. package/frontend/dist/assets/resourceService-BfCTSBsr.js +2 -0
  51. package/frontend/dist/assets/{resourceService-CUz722Nb.js.map → resourceService-BfCTSBsr.js.map} +1 -1
  52. package/frontend/dist/assets/useGroupData-DLhbP6zd.js +2 -0
  53. package/frontend/dist/assets/useGroupData-DLhbP6zd.js.map +1 -0
  54. package/frontend/dist/assets/useServerData-QZqQTYcv.js +2 -0
  55. package/frontend/dist/assets/useServerData-QZqQTYcv.js.map +1 -0
  56. package/frontend/dist/assets/useSettingsData-D3VROqS7.js +2 -0
  57. package/frontend/dist/assets/useSettingsData-D3VROqS7.js.map +1 -0
  58. package/frontend/dist/assets/variableDetection-C3Xi21av.js +16 -0
  59. package/frontend/dist/assets/variableDetection-C3Xi21av.js.map +1 -0
  60. package/frontend/dist/index.html +5 -2
  61. package/package.json +2 -2
  62. package/frontend/dist/assets/index-CVDuCISB.js +0 -323
  63. package/frontend/dist/assets/index-CVDuCISB.js.map +0 -1
  64. package/frontend/dist/assets/index-PEyR1nSL.css +0 -1
  65. package/frontend/dist/assets/resourceService-CUz722Nb.js +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UsersPage-Bipw33cS.js","sources":["../../src/hooks/useUserData.ts","../../src/components/AddUserForm.tsx","../../src/components/EditUserForm.tsx","../../src/pages/UsersPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { User, ApiResponse, UserFormData, UserUpdateData } from '@/types';\nimport { apiDelete, apiGet, apiPost, apiPut } from '../utils/fetchInterceptor';\n\nexport const useUserData = () => {\n const { t } = useTranslation();\n const [users, setUsers] = useState<User[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [refreshKey, setRefreshKey] = useState(0);\n\n const fetchUsers = useCallback(async () => {\n try {\n setLoading(true);\n const data: ApiResponse<User[]> = await apiGet('/users');\n if (!data.success) {\n setError(data.message || t('users.fetchError'));\n return;\n }\n\n if (data && data.success && Array.isArray(data.data)) {\n setUsers(data.data);\n } else {\n console.error('Invalid user data format:', data);\n setUsers([]);\n }\n\n setError(null);\n } catch (err) {\n console.error('Error fetching users:', err);\n setError(err instanceof Error ? err.message : 'Failed to fetch users');\n setUsers([]);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // Trigger a refresh of the users data\n const triggerRefresh = useCallback(() => {\n setRefreshKey((prev) => prev + 1);\n }, []);\n\n // Create a new user\n const createUser = async (userData: UserFormData) => {\n try {\n const result: ApiResponse<User> = await apiPost('/users', userData);\n triggerRefresh();\n return result;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to create user');\n return null;\n }\n };\n\n // Update an existing user\n const updateUser = async (username: string, data: UserUpdateData) => {\n try {\n const result: ApiResponse<User> = await apiPut(`/users/${username}`, data);\n triggerRefresh();\n return result || null;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to update user');\n return null;\n }\n };\n\n // Delete a user\n const deleteUser = async (username: string) => {\n try {\n const result = await apiDelete(`/users/${username}`);\n if (!result?.success) {\n setError(result?.message || t('users.deleteError'));\n return result;\n }\n\n triggerRefresh();\n return result;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to delete user');\n return false;\n }\n };\n\n // Fetch users when the component mounts or refreshKey changes\n useEffect(() => {\n fetchUsers();\n }, [fetchUsers, refreshKey]);\n\n return {\n users,\n loading,\n error,\n setError,\n triggerRefresh,\n createUser,\n updateUser,\n deleteUser,\n };\n};\n","import { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useUserData } from '@/hooks/useUserData';\nimport { UserFormData } from '@/types';\n\ninterface AddUserFormProps {\n onAdd: () => void;\n onCancel: () => void;\n}\n\nconst AddUserForm = ({ onAdd, onCancel }: AddUserFormProps) => {\n const { t } = useTranslation();\n const { createUser } = useUserData();\n const [error, setError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const [formData, setFormData] = useState<UserFormData>({\n username: '',\n password: '',\n isAdmin: false,\n });\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n\n if (!formData.username.trim()) {\n setError(t('users.usernameRequired'));\n return;\n }\n\n if (!formData.password.trim()) {\n setError(t('users.passwordRequired'));\n return;\n }\n\n if (formData.password.length < 6) {\n setError(t('users.passwordTooShort'));\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n const result = await createUser(formData);\n if (result?.success) {\n onAdd();\n } else {\n setError(result?.message || t('users.createError'));\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : t('users.createError'));\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { name, value, type, checked } = e.target;\n setFormData((prev) => ({\n ...prev,\n [name]: type === 'checkbox' ? checked : value,\n }));\n };\n\n return (\n <div className=\"fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-4\">\n <div className=\"bg-white dark:bg-gray-800 p-8 rounded-xl shadow-2xl max-w-md w-full mx-4 border border-gray-100 dark:border-gray-700\">\n <form onSubmit={handleSubmit}>\n <h2 className=\"text-xl font-bold text-gray-900 mb-6\">{t('users.addNew')}</h2>\n\n {error && (\n <div className=\"bg-red-50 border-l-4 border-red-500 text-red-700 p-4 mb-6 rounded-md\">\n <p className=\"text-sm font-medium\">{error}</p>\n </div>\n )}\n\n <div className=\"space-y-5\">\n <div>\n <label htmlFor=\"username\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('users.username')} <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n id=\"username\"\n name=\"username\"\n value={formData.username}\n onChange={handleInputChange}\n placeholder={t('users.usernamePlaceholder')}\n className=\"w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent form-input transition-all duration-200\"\n required\n disabled={isSubmitting}\n />\n </div>\n\n <div>\n <label htmlFor=\"password\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('users.password')} <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"password\"\n id=\"password\"\n name=\"password\"\n value={formData.password}\n onChange={handleInputChange}\n placeholder={t('users.passwordPlaceholder')}\n className=\"w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent form-input transition-all duration-200\"\n required\n disabled={isSubmitting}\n minLength={6}\n />\n </div>\n\n <div className=\"flex items-center pt-2\">\n <input\n type=\"checkbox\"\n id=\"isAdmin\"\n name=\"isAdmin\"\n checked={formData.isAdmin}\n onChange={handleInputChange}\n className=\"h-5 w-5 text-blue-600 focus:ring-blue-500 border-gray-300 rounded transition-colors duration-200\"\n disabled={isSubmitting}\n />\n <label\n htmlFor=\"isAdmin\"\n className=\"ml-3 block text-sm font-medium text-gray-700 cursor-pointer select-none\"\n >\n {t('users.adminRole')}\n </label>\n </div>\n </div>\n\n <div className=\"flex justify-end space-x-3 mt-8\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"px-5 py-2.5 text-gray-700 bg-white dark:bg-gray-800 border border-gray-300 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-all duration-200 font-medium btn-secondary shadow-sm\"\n disabled={isSubmitting}\n >\n {t('common.cancel')}\n </button>\n <button\n type=\"submit\"\n className=\"px-5 py-2.5 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-all duration-200 font-medium btn-primary shadow-md disabled:opacity-70 disabled:cursor-not-allowed flex items-center\"\n disabled={isSubmitting}\n >\n {isSubmitting && (\n <svg\n className=\"animate-spin -ml-1 mr-2 h-4 w-4 text-white\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n ></circle>\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n )}\n {isSubmitting ? t('common.creating') : t('users.create')}\n </button>\n </div>\n </form>\n </div>\n </div>\n );\n};\n\nexport default AddUserForm;\n","import { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useUserData } from '@/hooks/useUserData';\nimport { User, UserUpdateData } from '@/types';\n\ninterface EditUserFormProps {\n user: User;\n onEdit: () => void;\n onCancel: () => void;\n}\n\nconst EditUserForm = ({ user, onEdit, onCancel }: EditUserFormProps) => {\n const { t } = useTranslation();\n const { updateUser } = useUserData();\n const [error, setError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const [formData, setFormData] = useState({\n isAdmin: user.isAdmin,\n newPassword: '',\n confirmPassword: '',\n });\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n\n // Validate passwords match if changing password\n if (formData.newPassword && formData.newPassword !== formData.confirmPassword) {\n setError(t('users.passwordMismatch'));\n return;\n }\n\n if (formData.newPassword && formData.newPassword.length < 6) {\n setError(t('users.passwordTooShort'));\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n const updateData: UserUpdateData = {\n isAdmin: formData.isAdmin,\n };\n\n if (formData.newPassword) {\n updateData.newPassword = formData.newPassword;\n }\n\n const result = await updateUser(user.username, updateData);\n if (result?.success) {\n onEdit();\n } else {\n setError(result?.message || t('users.updateError'));\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : t('users.updateError'));\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { name, value, type, checked } = e.target;\n setFormData((prev) => ({\n ...prev,\n [name]: type === 'checkbox' ? checked : value,\n }));\n };\n\n return (\n <div className=\"fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-4\">\n <div className=\"bg-white dark:bg-gray-800 p-8 rounded-xl shadow-2xl max-w-md w-full mx-4 border border-gray-100 dark:border-gray-700\">\n <form onSubmit={handleSubmit}>\n <h2 className=\"text-xl font-bold text-gray-900 mb-6\">\n {t('users.edit')} - <span className=\"text-blue-600\">{user.username}</span>\n </h2>\n\n {error && (\n <div className=\"bg-red-50 border-l-4 border-red-500 text-red-700 p-4 mb-6 rounded-md\">\n <p className=\"text-sm font-medium\">{error}</p>\n </div>\n )}\n\n <div className=\"space-y-5\">\n <div className=\"flex items-center pt-2\">\n <input\n type=\"checkbox\"\n id=\"isAdmin\"\n name=\"isAdmin\"\n checked={formData.isAdmin}\n onChange={handleInputChange}\n className=\"h-5 w-5 text-blue-600 focus:ring-blue-500 border-gray-300 rounded transition-colors duration-200\"\n disabled={isSubmitting}\n />\n <label\n htmlFor=\"isAdmin\"\n className=\"ml-3 block text-sm font-medium text-gray-700 cursor-pointer select-none\"\n >\n {t('users.adminRole')}\n </label>\n </div>\n\n <div className=\"border-t border-gray-100 dark:border-gray-700 pt-4 mt-2\">\n <p className=\"text-xs text-gray-500 uppercase font-semibold tracking-wider mb-3\">\n {t('users.changePassword')}\n </p>\n\n <div className=\"space-y-4\">\n <div>\n <label\n htmlFor=\"newPassword\"\n className=\"block text-sm font-medium text-gray-700 mb-1\"\n >\n {t('users.newPassword')}\n </label>\n <input\n type=\"password\"\n id=\"newPassword\"\n name=\"newPassword\"\n value={formData.newPassword}\n onChange={handleInputChange}\n placeholder={t('users.newPasswordPlaceholder')}\n className=\"w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent form-input transition-all duration-200\"\n disabled={isSubmitting}\n minLength={6}\n />\n </div>\n\n {formData.newPassword && (\n <div className=\"animate-fadeIn\">\n <label\n htmlFor=\"confirmPassword\"\n className=\"block text-sm font-medium text-gray-700 mb-1\"\n >\n {t('users.confirmPassword')}\n </label>\n <input\n type=\"password\"\n id=\"confirmPassword\"\n name=\"confirmPassword\"\n value={formData.confirmPassword}\n onChange={handleInputChange}\n placeholder={t('users.confirmPasswordPlaceholder')}\n className=\"w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent form-input transition-all duration-200\"\n disabled={isSubmitting}\n minLength={6}\n />\n </div>\n )}\n </div>\n </div>\n </div>\n\n <div className=\"flex justify-end space-x-3 mt-8\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"px-5 py-2.5 text-gray-700 bg-white dark:bg-gray-800 border border-gray-300 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-all duration-200 font-medium btn-secondary shadow-sm\"\n disabled={isSubmitting}\n >\n {t('common.cancel')}\n </button>\n <button\n type=\"submit\"\n className=\"px-5 py-2.5 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-all duration-200 font-medium btn-primary shadow-md disabled:opacity-70 disabled:cursor-not-allowed flex items-center\"\n disabled={isSubmitting}\n >\n {isSubmitting && (\n <svg\n className=\"animate-spin -ml-1 mr-2 h-4 w-4 text-white\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n ></circle>\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n )}\n {isSubmitting ? t('common.updating') : t('users.update')}\n </button>\n </div>\n </form>\n </div>\n </div>\n );\n};\n\nexport default EditUserForm;\n","import React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { User } from '@/types';\nimport { useUserData } from '@/hooks/useUserData';\nimport { useAuth } from '@/contexts/AuthContext';\nimport AddUserForm from '@/components/AddUserForm';\nimport EditUserForm from '@/components/EditUserForm';\nimport { Edit, Trash, User as UserIcon } from 'lucide-react';\nimport DeleteDialog from '@/components/ui/DeleteDialog';\n\nconst UsersPage: React.FC = () => {\n const { t } = useTranslation();\n const { auth } = useAuth();\n const currentUser = auth.user;\n const {\n users,\n loading: usersLoading,\n error: userError,\n setError: setUserError,\n deleteUser,\n triggerRefresh\n } = useUserData();\n\n const [editingUser, setEditingUser] = useState<User | null>(null);\n const [showAddForm, setShowAddForm] = useState(false);\n const [userToDelete, setUserToDelete] = useState<string | null>(null);\n\n // Check if current user is admin\n if (!currentUser?.isAdmin) {\n return (\n <div className=\"bg-white dark:bg-gray-800 shadow rounded-lg p-6 dashboard-card\">\n <p className=\"text-red-600\">{t('users.adminRequired')}</p>\n </div>\n );\n }\n\n const handleEditClick = (user: User) => {\n setEditingUser(user);\n };\n\n const handleEditComplete = () => {\n setEditingUser(null);\n triggerRefresh(); // Refresh the users list after editing\n };\n\n const handleDeleteClick = (username: string) => {\n setUserToDelete(username);\n };\n\n const handleConfirmDelete = async () => {\n if (userToDelete) {\n const result = await deleteUser(userToDelete);\n if (!result?.success) {\n setUserError(result?.message || t('users.deleteError'));\n }\n setUserToDelete(null);\n }\n };\n\n const handleAddUser = () => {\n setShowAddForm(true);\n };\n\n const handleAddComplete = () => {\n setShowAddForm(false);\n triggerRefresh(); // Refresh the users list after adding\n };\n\n return (\n <div className=\"container mx-auto\">\n <div className=\"flex justify-between items-center mb-8\">\n <h1 className=\"text-2xl font-bold text-gray-900\">{t('pages.users.title')}</h1>\n <div className=\"flex space-x-4\">\n <button\n onClick={handleAddUser}\n className=\"px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 flex items-center btn-primary transition-all duration-200 shadow-sm\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4 mr-2\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M10 3a1 1 0 00-1 1v5H4a1 1 0 100 2h5v5a1 1 0 102 0v-5h5a1 1 0 100-2h-5V4a1 1 0 00-1-1z\" clipRule=\"evenodd\" />\n </svg>\n {t('users.add')}\n </button>\n </div>\n </div>\n\n {userError && (\n <div className=\"bg-red-50 border-l-4 border-red-500 text-red-700 p-4 mb-6 error-box rounded-lg shadow-sm\">\n <div className=\"flex justify-between items-center\">\n <p>{userError}</p>\n <button\n onClick={() => setUserError(null)}\n className=\"text-red-500 hover:text-red-700\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M4.293 4.293a1 1 011.414 0L10 8.586l4.293-4.293a1 1 111.414 1.414L11.414 10l4.293 4.293a1 1 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 01-1.414-1.414L8.586 10 4.293 5.707a1 1 010-1.414z\" clipRule=\"evenodd\" />\n </svg>\n </button>\n </div>\n </div>\n )}\n\n {usersLoading ? (\n <div className=\"bg-white dark:bg-gray-800 shadow rounded-lg p-6 loading-container flex justify-center items-center h-64\">\n <div className=\"flex flex-col items-center justify-center\">\n <svg className=\"animate-spin h-10 w-10 text-blue-500 mb-4\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n <p className=\"text-gray-600\">{t('app.loading')}</p>\n </div>\n </div>\n ) : users.length === 0 ? (\n <div className=\"bg-white dark:bg-gray-800 shadow rounded-lg p-6 empty-state dashboard-card\">\n <div className=\"flex flex-col items-center justify-center py-12\">\n <div className=\"p-4 bg-gray-100 dark:bg-gray-800 rounded-full mb-4\">\n <UserIcon className=\"h-8 w-8 text-gray-400\" />\n </div>\n <p className=\"text-gray-600 text-lg font-medium\">{t('users.noUsers')}</p>\n <button\n onClick={handleAddUser}\n className=\"mt-4 text-blue-600 hover:text-blue-800 font-medium\"\n >\n {t('users.addFirst')}\n </button>\n </div>\n </div>\n ) : (\n <div className=\"bg-white dark:bg-gray-800 shadow rounded-lg overflow-hidden table-container dashboard-card\">\n <table className=\"min-w-full divide-y divide-gray-200 dark:divide-gray-700\">\n <thead className=\"bg-gray-50 dark:bg-gray-800\">\n <tr>\n <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">\n {t('users.username')}\n </th>\n <th scope=\"col\" className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">\n {t('users.role')}\n </th>\n <th scope=\"col\" className=\"px-6 py-3 text-right text-xs font-medium text-gray-500 uppercase tracking-wider\">\n {t('users.actions')}\n </th>\n </tr>\n </thead>\n <tbody className=\"bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700\">\n {users.map((user) => {\n const isCurrentUser = currentUser?.username === user.username;\n return (\n <tr key={user.username} className=\"hover:bg-gray-50 dark:bg-gray-800 dark:hover:bg-gray-700 transition-colors duration-150\">\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <div className=\"flex items-center\">\n <div className=\"flex-shrink-0 h-10 w-10\">\n <div className=\"h-10 w-10 rounded-full bg-blue-100 dark:bg-blue-900/40 flex items-center justify-center text-blue-600 dark:text-blue-300 font-bold text-lg\">\n {user.username.charAt(0).toUpperCase()}\n </div>\n </div>\n <div className=\"ml-4\">\n <div className=\"text-sm font-medium text-gray-900 flex items-center\">\n {user.username}\n {isCurrentUser && (\n <span className=\"ml-2 px-2 py-0.5 text-xs bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300 rounded-full border border-blue-200 dark:border-blue-800\">\n {t('users.currentUser')}\n </span>\n )}\n </div>\n </div>\n </div>\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <span className={`px-2 py-1 inline-flex text-xs leading-5 font-semibold rounded-full ${user.isAdmin\n ? 'bg-purple-100 text-purple-800 border border-purple-200 dark:bg-purple-900/40 dark:text-purple-300 dark:border-purple-800'\n : 'bg-gray-100 text-gray-800 border border-gray-200 dark:bg-gray-800 dark:text-gray-300 dark:border-gray-700'\n }`}>\n {user.isAdmin ? t('users.admin') : t('users.user')}\n </span>\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-right text-sm font-medium\">\n <div className=\"flex justify-end space-x-3\">\n <button\n onClick={() => handleEditClick(user)}\n className=\"text-blue-600 dark:text-blue-400 hover:text-blue-900 dark:hover:text-blue-300 p-1 rounded hover:bg-blue-50 dark:hover:bg-blue-900/40 transition-colors\"\n title={t('users.edit')}\n >\n <Edit size={18} />\n </button>\n {!isCurrentUser && (\n <button\n onClick={() => handleDeleteClick(user.username)}\n className=\"text-red-600 dark:text-red-400 hover:text-red-900 dark:hover:text-red-300 p-1 rounded hover:bg-red-50 dark:hover:bg-red-900/40 transition-colors\"\n title={t('users.delete')}\n >\n <Trash size={18} />\n </button>\n )}\n </div>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n\n {showAddForm && (\n <AddUserForm onAdd={handleAddComplete} onCancel={handleAddComplete} />\n )}\n\n {editingUser && (\n <EditUserForm\n user={editingUser}\n onEdit={handleEditComplete}\n onCancel={() => setEditingUser(null)}\n />\n )}\n\n <DeleteDialog\n isOpen={!!userToDelete}\n onClose={() => setUserToDelete(null)}\n onConfirm={handleConfirmDelete}\n serverName={userToDelete || ''}\n isGroup={false}\n isUser={true}\n />\n </div>\n );\n};\n\nexport default UsersPage;\n"],"names":["useUserData","t","useTranslation","users","setUsers","useState","loading","setLoading","error","setError","refreshKey","setRefreshKey","fetchUsers","useCallback","data","apiGet","err","triggerRefresh","prev","createUser","userData","result","apiPost","updateUser","username","apiPut","deleteUser","apiDelete","useEffect","AddUserForm","onAdd","onCancel","isSubmitting","setIsSubmitting","formData","setFormData","handleSubmit","e","handleInputChange","name","value","type","checked","jsx","jsxs","EditUserForm","user","onEdit","updateData","UsersPage","auth","useAuth","currentUser","usersLoading","userError","setUserError","editingUser","setEditingUser","showAddForm","setShowAddForm","userToDelete","setUserToDelete","handleEditClick","handleEditComplete","handleDeleteClick","handleConfirmDelete","handleAddUser","handleAddComplete","UserIcon","isCurrentUser","Edit","Trash","DeleteDialog"],"mappings":"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"}