diff --git a/backend/src/routes/dashboardPreferencesRoutes.js b/backend/src/routes/dashboardPreferencesRoutes.js index 2fe04b4..172c8df 100644 --- a/backend/src/routes/dashboardPreferencesRoutes.js +++ b/backend/src/routes/dashboardPreferencesRoutes.js @@ -57,30 +57,33 @@ async function createDefaultDashboardPreferences(userId, userRole = 'user') { const permissions = await getUserPermissions(userRole); // Define all possible dashboard cards with their required permissions + // Order aligned with preferred layout const allCards = [ // Host-related cards { cardId: 'totalHosts', requiredPermission: 'can_view_hosts', order: 0 }, { cardId: 'hostsNeedingUpdates', requiredPermission: 'can_view_hosts', order: 1 }, - { cardId: 'upToDateHosts', requiredPermission: 'can_view_hosts', order: 2 }, - { cardId: 'totalHostGroups', requiredPermission: 'can_view_hosts', order: 3 }, - + // Package-related cards - { cardId: 'totalOutdatedPackages', requiredPermission: 'can_view_packages', order: 4 }, - { cardId: 'securityUpdates', requiredPermission: 'can_view_packages', order: 5 }, - { cardId: 'packagePriority', requiredPermission: 'can_view_packages', order: 6 }, - + { cardId: 'totalOutdatedPackages', requiredPermission: 'can_view_packages', order: 2 }, + { cardId: 'securityUpdates', requiredPermission: 'can_view_packages', order: 3 }, + + // Host-related cards (continued) + { cardId: 'totalHostGroups', requiredPermission: 'can_view_hosts', order: 4 }, + { cardId: 'upToDateHosts', requiredPermission: 'can_view_hosts', order: 5 }, + // Repository-related cards - { cardId: 'totalRepos', requiredPermission: 'can_view_hosts', order: 7 }, // Repos are host-related - + { cardId: 'totalRepos', requiredPermission: 'can_view_hosts', order: 6 }, + // User management cards (admin only) - { cardId: 'totalUsers', requiredPermission: 'can_view_users', order: 8 }, - { cardId: 'recentUsers', requiredPermission: 'can_view_users', order: 9 }, - + { cardId: 'totalUsers', requiredPermission: 'can_view_users', order: 7 }, + // System/Report cards - { cardId: 'osDistribution', requiredPermission: 'can_view_reports', order: 10 }, - { cardId: 'osDistributionBar', requiredPermission: 'can_view_reports', order: 11 }, - { cardId: 'updateStatus', requiredPermission: 'can_view_reports', order: 12 }, - { cardId: 'recentCollection', requiredPermission: 'can_view_hosts', order: 13 }, // Collection is host-related + { cardId: 'osDistribution', requiredPermission: 'can_view_reports', order: 8 }, + { cardId: 'osDistributionBar', requiredPermission: 'can_view_reports', order: 9 }, + { cardId: 'recentCollection', requiredPermission: 'can_view_hosts', order: 10 }, + { cardId: 'updateStatus', requiredPermission: 'can_view_reports', order: 11 }, + { cardId: 'packagePriority', requiredPermission: 'can_view_packages', order: 12 }, + { cardId: 'recentUsers', requiredPermission: 'can_view_users', order: 13 }, { cardId: 'quickStats', requiredPermission: 'can_view_dashboard', order: 14 } ]; @@ -174,7 +177,6 @@ router.put('/', authenticateToken, [ // Get default dashboard card configuration router.get('/defaults', authenticateToken, async (req, res) => { try { - // Default configuration based on iby's (Muhammad Ibrahim) preferred layout // This provides a comprehensive dashboard view for all new users const defaultCards = [ { cardId: 'totalHosts', title: 'Total Hosts', icon: 'Server', enabled: true, order: 0 }, @@ -182,7 +184,7 @@ router.get('/defaults', authenticateToken, async (req, res) => { { cardId: 'totalOutdatedPackages', title: 'Outdated Packages', icon: 'Package', enabled: true, order: 2 }, { cardId: 'securityUpdates', title: 'Security Updates', icon: 'Shield', enabled: true, order: 3 }, { cardId: 'totalHostGroups', title: 'Host Groups', icon: 'Folder', enabled: true, order: 4 }, - { cardId: 'upToDateHosts', title: 'Up to date', icon: 'CheckCircle', enabled: true, order: 5 }, + { cardId: 'hostsNeedingUpdates', title: 'Up to date', icon: 'CheckCircle', enabled: true, order: 5 }, { cardId: 'totalRepos', title: 'Repositories', icon: 'GitBranch', enabled: true, order: 6 }, { cardId: 'totalUsers', title: 'Users', icon: 'Users', enabled: true, order: 7 }, { cardId: 'osDistribution', title: 'OS Distribution', icon: 'BarChart3', enabled: true, order: 8 }, diff --git a/backend/src/server.js b/backend/src/server.js index 93a4111..5cb13ac 100644 --- a/backend/src/server.js +++ b/backend/src/server.js @@ -666,7 +666,6 @@ async function getPermissionBasedPreferences(userRole) { const permissions = await getUserPermissions(userRole); // Define all possible dashboard cards with their required permissions - // Order matches iby's (Muhammad Ibrahim) preferred layout const allCards = [ // Host-related cards { cardId: 'totalHosts', requiredPermission: 'can_view_hosts', order: 0 }, diff --git a/frontend/src/contexts/AuthContext.jsx b/frontend/src/contexts/AuthContext.jsx index e0f3a3a..19c7b60 100644 --- a/frontend/src/contexts/AuthContext.jsx +++ b/frontend/src/contexts/AuthContext.jsx @@ -255,6 +255,13 @@ export const AuthProvider = ({ children }) => { } }, [token, user, checkAdminUsersExist]) + const setAuthState = (authToken, authUser) => { + setToken(authToken) + setUser(authUser) + localStorage.setItem('token', authToken) + localStorage.setItem('user', JSON.stringify(authUser)) + } + const value = { user, token, @@ -267,6 +274,7 @@ export const AuthProvider = ({ children }) => { updateProfile, changePassword, refreshPermissions, + setAuthState, isAuthenticated, isAdmin, hasPermission, diff --git a/frontend/src/pages/Login.jsx b/frontend/src/pages/Login.jsx index f358d28..fd557db 100644 --- a/frontend/src/pages/Login.jsx +++ b/frontend/src/pages/Login.jsx @@ -24,7 +24,7 @@ const Login = () => { const [signupEnabled, setSignupEnabled] = useState(false) const navigate = useNavigate() - const { login } = useAuth() + const { login, setAuthState } = useAuth() // Check if signup is enabled useEffect(() => { @@ -80,9 +80,8 @@ const Login = () => { try { const response = await authAPI.signup(formData.username, formData.email, formData.password, formData.firstName, formData.lastName) if (response.data && response.data.token) { - // Store token and user data - localStorage.setItem('token', response.data.token) - localStorage.setItem('user', JSON.stringify(response.data.user)) + // Update AuthContext state and localStorage + setAuthState(response.data.token, response.data.user) // Redirect to dashboard navigate('/')