feat(web): add workspace management UI (M2 #12)

- Create workspace listing page at /settings/workspaces
  - List all user workspaces with role badges
  - Create new workspace functionality
  - Display member count per workspace

- Create workspace detail page at /settings/workspaces/[id]
  - Workspace settings (name, ID, created date)
  - Member management with role editing
  - Invite member functionality
  - Delete workspace (owner only)

- Add workspace components:
  - WorkspaceCard: Display workspace info with role badge
  - WorkspaceSettings: Edit workspace settings and delete
  - MemberList: Display and manage workspace members
  - InviteMember: Send invitations with role selection

- Add WorkspaceMemberWithUser type to shared package
- Follow existing app patterns for styling and structure
- Use mock data (ready for API integration)
This commit is contained in:
Jason Woltje
2026-01-29 16:59:26 -06:00
parent 287a0e2556
commit 5291fece26
43 changed files with 4152 additions and 99 deletions

View File

@@ -0,0 +1,55 @@
import {
Controller,
Get,
Put,
Body,
UseGuards,
Request,
UnauthorizedException,
} from "@nestjs/common";
import { PreferencesService } from "./preferences.service";
import { UpdatePreferencesDto } from "./dto";
import { AuthGuard } from "../auth/guards/auth.guard";
/**
* Controller for user preferences endpoints
* All endpoints require authentication
*/
@Controller("users/me/preferences")
@UseGuards(AuthGuard)
export class PreferencesController {
constructor(private readonly preferencesService: PreferencesService) {}
/**
* GET /api/users/me/preferences
* Get current user's preferences
*/
@Get()
async getPreferences(@Request() req: any) {
const userId = req.user?.id;
if (!userId) {
throw new UnauthorizedException("Authentication required");
}
return this.preferencesService.getPreferences(userId);
}
/**
* PUT /api/users/me/preferences
* Update current user's preferences
*/
@Put()
async updatePreferences(
@Body() updatePreferencesDto: UpdatePreferencesDto,
@Request() req: any
) {
const userId = req.user?.id;
if (!userId) {
throw new UnauthorizedException("Authentication required");
}
return this.preferencesService.updatePreferences(userId, updatePreferencesDto);
}
}