diff --git a/HOUSEHOLD_MANAGEMENT_IMPLEMENTATION.md b/HOUSEHOLD_MANAGEMENT_IMPLEMENTATION.md new file mode 100644 index 0000000..09c5d90 --- /dev/null +++ b/HOUSEHOLD_MANAGEMENT_IMPLEMENTATION.md @@ -0,0 +1,241 @@ +# Household & Store Management - Implementation Summary + +## Overview +Built comprehensive household and store management UI for the multi-household grocery list application. Users can now fully manage their households, members, and stores through a polished interface. + +## Features Implemented + +### 1. Manage Page (`/manage`) +**Location**: [frontend/src/pages/Manage.jsx](frontend/src/pages/Manage.jsx) + +- Tab-based interface for Household and Store management +- Context-aware - always operates on the active household +- Accessible via "Manage" link in the navbar + +### 2. Household Management +**Component**: [frontend/src/components/manage/ManageHousehold.jsx](frontend/src/components/manage/ManageHousehold.jsx) + +**Features**: +- **Edit Household Name**: Admin-only, inline editing +- **Invite Code Management**: + - Show/hide invite code with copy-to-clipboard + - Generate new invite code (invalidates old one) + - Admin-only access +- **Member Management**: + - View all household members with roles + - Promote/demote members between admin and member roles + - Remove members from household + - Cannot remove yourself + - Admin-only actions +- **Delete Household**: + - Admin-only + - Double confirmation required + - Permanently deletes all data + +**Permissions**: +- Viewers: Can only see household name and members +- Members: Same as viewers +- Admins: Full access to all features + +### 3. Store Management +**Component**: [frontend/src/components/manage/ManageStores.jsx](frontend/src/components/manage/ManageStores.jsx) + +**Features**: +- **View Household Stores**: + - Grid layout showing all stores + - Shows store name, location, and default status +- **Add Stores**: + - Select from system-wide store catalog + - Admin-only + - Cannot add already-linked stores +- **Remove Stores**: + - Admin-only + - Cannot remove last store (validation) +- **Set Default Store**: + - Admin-only + - Default store loads automatically + +**Permissions**: +- Viewers & Members: Read-only view of stores +- Admins: Full CRUD operations + +### 4. Create/Join Household Modal +**Component**: [frontend/src/components/manage/CreateJoinHousehold.jsx](frontend/src/components/manage/CreateJoinHousehold.jsx) + +**Features**: +- Tabbed interface: "Create New" or "Join Existing" +- **Create Mode**: + - Enter household name + - Auto-generates invite code + - Creates household with user as admin +- **Join Mode**: + - Enter invite code + - Validates code and adds user as member + - Error handling for invalid codes + +**Access**: +- Available from household switcher dropdown +- "+ Create or Join Household" button at bottom +- All authenticated users can access + +### 5. Updated Household Switcher +**Component**: [frontend/src/components/household/HouseholdSwitcher.jsx](frontend/src/components/household/HouseholdSwitcher.jsx) + +**Enhancements**: +- Added divider between household list and actions +- "+ Create or Join Household" button +- Opens CreateJoinHousehold modal + +## Styling + +### CSS Files Created +1. **[frontend/src/styles/pages/Manage.css](frontend/src/styles/pages/Manage.css)** + - Page layout and tab navigation + - Responsive design + +2. **[frontend/src/styles/components/manage/ManageHousehold.css](frontend/src/styles/components/manage/ManageHousehold.css)** + - Section cards with proper spacing + - Member cards with role badges + - Invite code display + - Danger zone styling + - Button styles (primary, secondary, danger) + +3. **[frontend/src/styles/components/manage/ManageStores.css](frontend/src/styles/components/manage/ManageStores.css)** + - Grid layout for store cards + - Default badge styling + - Add store panel + - Available stores grid + +4. **[frontend/src/styles/components/manage/CreateJoinHousehold.css](frontend/src/styles/components/manage/CreateJoinHousehold.css)** + - Modal overlay and container + - Mode tabs styling + - Form inputs and buttons + - Error message styling + +### Theme Updates +**[frontend/src/styles/theme.css](frontend/src/styles/theme.css)** + +Added simplified CSS variable aliases: +```css +--primary: var(--color-primary); +--primary-dark: var(--color-primary-dark); +--primary-light: var(--color-primary-light); +--danger: var(--color-danger); +--danger-dark: var(--color-danger-hover); +--text-primary: var(--color-text-primary); +--text-secondary: var(--color-text-secondary); +--background: var(--color-bg-body); +--border: var(--color-border-light); +--card-hover: var(--color-bg-hover); +``` + +## Backend Endpoints Used + +All endpoints already existed - no backend changes required! + +### Household Endpoints +- `GET /households` - Get user's households +- `POST /households` - Create household +- `PATCH /households/:id` - Update household name +- `DELETE /households/:id` - Delete household +- `POST /households/:id/invite/refresh` - Refresh invite code +- `POST /households/join/:inviteCode` - Join via invite code +- `GET /households/:id/members` - Get members +- `PATCH /households/:id/members/:userId/role` - Update member role +- `DELETE /households/:id/members/:userId` - Remove member + +### Store Endpoints +- `GET /stores` - Get all stores +- `GET /stores/household/:householdId` - Get household stores +- `POST /stores/household/:householdId` - Add store to household +- `DELETE /stores/household/:householdId/:storeId` - Remove store +- `PATCH /stores/household/:householdId/:storeId/default` - Set default + +## User Flow + +### Managing Household +1. Click "Manage" in navbar +2. View household overview (name, members, invite code) +3. As admin: + - Edit household name + - Generate new invite codes + - Promote/demote members + - Remove members + - Delete household (danger zone) + +### Managing Stores +1. Click "Manage" in navbar +2. Click "Stores" tab +3. View all linked stores with default badge +4. As admin: + - Click "+ Add Store" to see available stores + - Click "Add" on any unlinked store + - Click "Set as Default" on non-default stores + - Click "Remove" to unlink store (except last one) + +### Creating/Joining Household +1. Click household name in navbar +2. Click "+ Create or Join Household" at bottom of dropdown +3. Select "Create New" or "Join Existing" tab +4. Fill form and submit +5. New household appears in list and becomes active + +## Responsive Design + +All components are fully responsive: +- **Desktop**: Grid layouts, side-by-side buttons +- **Tablet**: Adjusted spacing, smaller grids +- **Mobile**: + - Single column layouts + - Full-width buttons + - Stacked form elements + - Optimized spacing + +## Permissions Summary + +| Feature | Viewer | Member | Admin | +|---------|--------|--------|-------| +| View household info | ✅ | ✅ | ✅ | +| Edit household name | ❌ | ❌ | ✅ | +| View invite code | ❌ | ❌ | ✅ | +| Refresh invite code | ❌ | ❌ | ✅ | +| View members | ✅ | ✅ | ✅ | +| Change member roles | ❌ | ❌ | ✅ | +| Remove members | ❌ | ❌ | ✅ | +| Delete household | ❌ | ❌ | ✅ | +| View stores | ✅ | ✅ | ✅ | +| Add stores | ❌ | ❌ | ✅ | +| Remove stores | ❌ | ❌ | ✅ | +| Set default store | ❌ | ❌ | ✅ | +| Create household | ✅ | ✅ | ✅ | +| Join household | ✅ | ✅ | ✅ | + +## Next Steps + +Consider adding: +1. **Household Settings**: Description, profile image, preferences +2. **Member Invitations**: Direct user search instead of just invite codes +3. **Store Details**: View item counts, last activity per store +4. **Audit Log**: Track household/store changes +5. **Notifications**: Member added/removed, role changes +6. **Bulk Operations**: Remove multiple members at once +7. **Store Categories**: Group stores by region/type +8. **Export Data**: Download household grocery history + +## Testing Checklist + +- [ ] Create new household and verify admin role +- [ ] Generate and copy invite code +- [ ] Join household using invite code +- [ ] Edit household name as admin +- [ ] Promote member to admin +- [ ] Demote admin to member +- [ ] Remove member from household +- [ ] Add store to household +- [ ] Set default store +- [ ] Remove store (verify last store protection) +- [ ] Try admin actions as non-admin (should be hidden/disabled) +- [ ] Delete household and verify redirect +- [ ] Test responsive layouts on mobile/tablet/desktop +- [ ] Verify all error messages display properly +- [ ] Test with multiple households diff --git a/backend/controllers/auth.controller.js b/backend/controllers/auth.controller.js index 40ba145..c1866c6 100644 --- a/backend/controllers/auth.controller.js +++ b/backend/controllers/auth.controller.js @@ -40,5 +40,5 @@ exports.login = async (req, res) => { { expiresIn: "1 year" } ); - res.json({ token, username, role: user.role }); + res.json({ token, userId: user.id, username, role: user.role }); }; diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 81a1dd3..fd75138 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -9,6 +9,7 @@ import { StoreProvider } from "./context/StoreContext.jsx"; import AdminPanel from "./pages/AdminPanel.jsx"; import GroceryList from "./pages/GroceryList.jsx"; import Login from "./pages/Login.jsx"; +import Manage from "./pages/Manage.jsx"; import Register from "./pages/Register.jsx"; import Settings from "./pages/Settings.jsx"; @@ -41,6 +42,7 @@ function App() { } > } /> + } /> } /> ))} +
+ )} + + {showCreateJoin && ( + setShowCreateJoin(false)} /> + )} ); } diff --git a/frontend/src/components/layout/Navbar.jsx b/frontend/src/components/layout/Navbar.jsx index 1148c16..253e925 100644 --- a/frontend/src/components/layout/Navbar.jsx +++ b/frontend/src/components/layout/Navbar.jsx @@ -12,6 +12,7 @@ export default function Navbar() {