add changes
This commit is contained in:
@@ -499,21 +499,21 @@
|
||||
**Purpose:** Update user profile
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Add `UserService.updateProfile(userId, data)` method
|
||||
- [ ] Update `authState` signal with new user data
|
||||
- [ ] Validate form data (email, username)
|
||||
- [ ] Handle 409 Conflict for duplicate email/username
|
||||
- [ ] Handle password change separately (if supported)
|
||||
- [x] Add `UserService.updateProfile(userId, data)` method
|
||||
- [x] Update `authState` signal with new user data
|
||||
- [x] Validate form data (email, username)
|
||||
- [x] Handle 409 Conflict for duplicate email/username
|
||||
- [x] Handle password change separately (if supported)
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Build `ProfileSettingsComponent` for editing profile
|
||||
- [ ] Create form with username, email fields
|
||||
- [ ] Add password change section (current, new, confirm)
|
||||
- [ ] Show validation errors inline
|
||||
- [ ] Add "Save Changes" and "Cancel" buttons
|
||||
- [ ] Display success toast after update
|
||||
- [ ] Show loading spinner on submit
|
||||
- [ ] Pre-fill form with current user data
|
||||
- [x] Build `ProfileSettingsComponent` for editing profile
|
||||
- [x] Create form with username, email fields
|
||||
- [x] Add password change section (current, new, confirm)
|
||||
- [x] Show validation errors inline
|
||||
- [x] Add "Save Changes" and "Cancel" buttons
|
||||
- [x] Display success toast after update
|
||||
- [x] Show loading spinner on submit
|
||||
- [x] Pre-fill form with current user data
|
||||
|
||||
---
|
||||
|
||||
@@ -523,19 +523,19 @@
|
||||
**Purpose:** Get user's bookmarked questions
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Create `BookmarkService` with `getBookmarks(userId)` method
|
||||
- [ ] Store bookmarks in `bookmarksState` signal
|
||||
- [ ] Implement caching (5 min TTL)
|
||||
- [ ] Handle 401 if not authenticated
|
||||
- [x] Create `BookmarkService` with `getBookmarks(userId)` method
|
||||
- [x] Store bookmarks in `bookmarksState` signal
|
||||
- [x] Implement caching (5 min TTL)
|
||||
- [x] Handle 401 if not authenticated
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Build `BookmarksComponent` displaying all bookmarked questions
|
||||
- [ ] Show question cards with text, category, difficulty
|
||||
- [ ] Add "Remove Bookmark" button for each question
|
||||
- [ ] Add "Practice Bookmarked Questions" button to start quiz
|
||||
- [ ] Show empty state if no bookmarks
|
||||
- [ ] Implement grid layout (responsive)
|
||||
- [ ] Add search/filter for bookmarks
|
||||
- [x] Build `BookmarksComponent` displaying all bookmarked questions
|
||||
- [x] Show question cards with text, category, difficulty
|
||||
- [x] Add "Remove Bookmark" button for each question
|
||||
- [x] Add "Practice Bookmarked Questions" button to start quiz
|
||||
- [x] Show empty state if no bookmarks
|
||||
- [x] Implement grid layout (responsive)
|
||||
- [x] Add search/filter for bookmarks
|
||||
|
||||
---
|
||||
|
||||
@@ -543,17 +543,17 @@
|
||||
**Purpose:** Add question to bookmarks
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Add `BookmarkService.addBookmark(userId, questionId)` method
|
||||
- [ ] Update `bookmarksState` signal optimistically
|
||||
- [ ] Handle 409 if already bookmarked
|
||||
- [ ] Show success/error toast
|
||||
- [x] Add `BookmarkService.addBookmark(userId, questionId)` method
|
||||
- [x] Update `bookmarksState` signal optimistically
|
||||
- [x] Handle 409 if already bookmarked
|
||||
- [x] Show success/error toast
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Add bookmark icon button on question cards
|
||||
- [ ] Show filled/unfilled icon based on bookmark status
|
||||
- [ ] Animate icon on toggle
|
||||
- [ ] Display success toast "Question bookmarked"
|
||||
- [ ] Ensure button is accessible with ARIA label
|
||||
- [x] Add bookmark icon button on question cards
|
||||
- [x] Show filled/unfilled icon based on bookmark status
|
||||
- [x] Animate icon on toggle
|
||||
- [x] Display success toast "Question bookmarked"
|
||||
- [x] Ensure button is accessible with ARIA label
|
||||
|
||||
---
|
||||
|
||||
@@ -561,14 +561,14 @@
|
||||
**Purpose:** Remove bookmark
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Add `BookmarkService.removeBookmark(userId, questionId)` method
|
||||
- [ ] Update `bookmarksState` signal optimistically
|
||||
- [ ] Handle 404 if bookmark not found
|
||||
- [x] Add `BookmarkService.removeBookmark(userId, questionId)` method
|
||||
- [x] Update `bookmarksState` signal optimistically
|
||||
- [x] Handle 404 if bookmark not found
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Toggle bookmark icon to unfilled state
|
||||
- [ ] Remove question from bookmarks list
|
||||
- [ ] Display success toast "Bookmark removed"
|
||||
- [x] Toggle bookmark icon to unfilled state
|
||||
- [x] Remove question from bookmarks list
|
||||
- [x] Display success toast "Bookmark removed"
|
||||
- [ ] Add undo option in toast (optional)
|
||||
|
||||
---
|
||||
@@ -579,25 +579,25 @@
|
||||
**Purpose:** Get system-wide statistics
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Create `AdminService` with `getStatistics()` method
|
||||
- [ ] Store stats in `adminStatsState` signal
|
||||
- [ ] Implement caching (5 min TTL)
|
||||
- [ ] Handle 401/403 authorization errors
|
||||
- [ ] Create admin auth guard for routes
|
||||
- [x] Create `AdminService` with `getStatistics()` method
|
||||
- [x] Store stats in `adminStatsState` signal
|
||||
- [x] Implement caching (5 min TTL)
|
||||
- [x] Handle 401/403 authorization errors
|
||||
- [x] Create admin auth guard for routes
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Build `AdminDashboardComponent` as admin landing page
|
||||
- [ ] Display statistics cards:
|
||||
- [x] Build `AdminDashboardComponent` as admin landing page
|
||||
- [x] Display statistics cards:
|
||||
- Total users
|
||||
- Active users (last 7 days)
|
||||
- Total quiz sessions
|
||||
- Total questions
|
||||
- [ ] Show user growth chart (line chart)
|
||||
- [ ] Display most popular categories (bar chart)
|
||||
- [ ] Show average quiz scores
|
||||
- [ ] Add date range picker for filtering stats
|
||||
- [ ] Implement responsive layout
|
||||
- [ ] Show loading skeletons for charts
|
||||
- [x] Show user growth chart (line chart)
|
||||
- [x] Display most popular categories (bar chart)
|
||||
- [x] Show average quiz scores
|
||||
- [x] Add date range picker for filtering stats
|
||||
- [x] Implement responsive layout
|
||||
- [x] Show loading skeletons for charts
|
||||
|
||||
---
|
||||
|
||||
@@ -605,20 +605,20 @@
|
||||
**Purpose:** Get guest user analytics
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Add `AdminService.getGuestAnalytics()` method
|
||||
- [ ] Store analytics in `guestAnalyticsState` signal
|
||||
- [ ] Implement caching (10 min TTL)
|
||||
- [x] Add `AdminService.getGuestAnalytics()` method
|
||||
- [x] Store analytics in `guestAnalyticsState` signal
|
||||
- [x] Implement caching (10 min TTL)
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Build `GuestAnalyticsComponent` (admin)
|
||||
- [ ] Display guest statistics:
|
||||
- [x] Build `GuestAnalyticsComponent` (admin)
|
||||
- [x] Display guest statistics:
|
||||
- Total guest sessions
|
||||
- Active guest sessions
|
||||
- Guest-to-user conversion rate
|
||||
- Average quizzes per guest
|
||||
- [ ] Show conversion funnel chart
|
||||
- [ ] Display guest session timeline chart
|
||||
- [ ] Add export functionality
|
||||
- [x] Show conversion funnel chart
|
||||
- [x] Display guest session timeline chart
|
||||
- [x] Add export functionality
|
||||
|
||||
---
|
||||
|
||||
@@ -626,13 +626,13 @@
|
||||
**Purpose:** Get guest access settings
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Add `AdminService.getGuestSettings()` method
|
||||
- [ ] Store settings in `guestSettingsState` signal
|
||||
- [x] Add `AdminService.getGuestSettings()` method
|
||||
- [x] Store settings in `guestSettingsState` signal
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Build `GuestSettingsComponent` (admin) for viewing settings
|
||||
- [ ] Display current settings in read-only cards
|
||||
- [ ] Add "Edit Settings" button
|
||||
- [x] Build `GuestSettingsComponent` (admin) for viewing settings
|
||||
- [x] Display current settings in read-only cards
|
||||
- [x] Add "Edit Settings" button
|
||||
|
||||
---
|
||||
|
||||
@@ -640,22 +640,22 @@
|
||||
**Purpose:** Update guest access settings
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Add `AdminService.updateGuestSettings(data)` method
|
||||
- [ ] Update `guestSettingsState` signal
|
||||
- [ ] Validate form data
|
||||
- [ ] Handle success/error responses
|
||||
- [x] Add `AdminService.updateGuestSettings(data)` method
|
||||
- [x] Update `guestSettingsState` signal
|
||||
- [x] Validate form data
|
||||
- [x] Handle success/error responses
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Build settings form with fields:
|
||||
- [x] Build settings form with fields:
|
||||
- Guest access enabled toggle
|
||||
- Max quizzes per day (number input)
|
||||
- Max questions per quiz (number input)
|
||||
- Session expiry hours (number input)
|
||||
- Upgrade prompt message (textarea)
|
||||
- [ ] Add "Save Changes" and "Cancel" buttons
|
||||
- [ ] Show validation errors inline
|
||||
- [ ] Display success toast after update
|
||||
- [ ] Show preview of settings changes
|
||||
- [x] Add "Save Changes" and "Cancel" buttons
|
||||
- [x] Show validation errors inline
|
||||
- [x] Display success toast after update
|
||||
- [x] Show preview of settings changes
|
||||
|
||||
---
|
||||
|
||||
@@ -663,21 +663,21 @@
|
||||
**Purpose:** Get all users with pagination
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Add `AdminService.getUsers(page, limit, role?, isActive?, sortBy?)` method
|
||||
- [ ] Store users in `adminUsersState` signal
|
||||
- [ ] Implement pagination, filtering, and sorting
|
||||
- [ ] Handle query parameters in URL
|
||||
- [x] Add `AdminService.getUsers(page, limit, role?, isActive?, sortBy?)` method
|
||||
- [x] Store users in `adminUsersState` signal
|
||||
- [x] Implement pagination, filtering, and sorting
|
||||
- [x] Handle query parameters in URL
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Build `AdminUsersComponent` displaying user list
|
||||
- [ ] Create user table with columns: Username, Email, Role, Status, Joined Date, Actions
|
||||
- [ ] Add filter dropdowns (Role: All/User/Admin, Status: All/Active/Inactive)
|
||||
- [ ] Add sort dropdown (Username, Email, Date)
|
||||
- [ ] Add search input for username/email
|
||||
- [ ] Implement pagination controls
|
||||
- [ ] Add action buttons (Edit Role, View Details, Deactivate/Activate)
|
||||
- [ ] Show loading spinner during fetch
|
||||
- [ ] Make table responsive (stack on mobile)
|
||||
- [x] Build `AdminUsersComponent` displaying user list
|
||||
- [x] Create user table with columns: Username, Email, Role, Status, Joined Date, Actions
|
||||
- [x] Add filter dropdowns (Role: All/User/Admin, Status: All/Active/Inactive)
|
||||
- [x] Add sort dropdown (Username, Email, Date)
|
||||
- [x] Add search input for username/email
|
||||
- [x] Implement pagination controls
|
||||
- [x] Add action buttons (Edit Role, View Details, Deactivate/Activate)
|
||||
- [x] Show loading spinner during fetch
|
||||
- [x] Make table responsive (stack on mobile)
|
||||
|
||||
---
|
||||
|
||||
@@ -685,16 +685,16 @@
|
||||
**Purpose:** Get user details
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Add `AdminService.getUserDetails(userId)` method
|
||||
- [ ] Store user details in signal
|
||||
- [ ] Handle 404 if user not found
|
||||
- [x] Add `AdminService.getUserDetails(userId)` method
|
||||
- [x] Store user details in signal
|
||||
- [x] Handle 404 if user not found
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Build `AdminUserDetailComponent` showing full user profile
|
||||
- [ ] Display user info, statistics, quiz history
|
||||
- [ ] Add "Edit Role" and "Deactivate" buttons
|
||||
- [ ] Show user activity timeline
|
||||
- [ ] Add breadcrumb navigation
|
||||
- [x] Build `AdminUserDetailComponent` showing full user profile
|
||||
- [x] Display user info, statistics, quiz history
|
||||
- [x] Add "Edit Role" and "Deactivate" buttons
|
||||
- [x] Show user activity timeline
|
||||
- [x] Add breadcrumb navigation
|
||||
|
||||
---
|
||||
|
||||
@@ -702,16 +702,16 @@
|
||||
**Purpose:** Update user role
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Add `AdminService.updateUserRole(userId, role)` method
|
||||
- [ ] Update user in `adminUsersState` signal
|
||||
- [ ] Handle validation errors
|
||||
- [x] Add `AdminService.updateUserRole(userId, role)` method
|
||||
- [x] Update user in `adminUsersState` signal
|
||||
- [x] Handle validation errors
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Build role update modal/dialog
|
||||
- [ ] Add role selector (User, Admin)
|
||||
- [ ] Show confirmation dialog
|
||||
- [ ] Display success toast after update
|
||||
- [ ] Show warning if demoting admin
|
||||
- [x] Build role update modal/dialog
|
||||
- [x] Add role selector (User, Admin)
|
||||
- [x] Show confirmation dialog
|
||||
- [x] Display success toast after update
|
||||
- [x] Show warning if demoting admin
|
||||
|
||||
---
|
||||
|
||||
@@ -719,13 +719,13 @@
|
||||
**Purpose:** Reactivate user
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Add `AdminService.activateUser(userId)` method
|
||||
- [ ] Update user status in signal
|
||||
- [x] Add `AdminService.activateUser(userId)` method
|
||||
- [x] Update user status in signal
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Add "Activate" button for inactive users
|
||||
- [ ] Show confirmation dialog
|
||||
- [ ] Display success toast after activation
|
||||
- [x] Add "Activate" button for inactive users
|
||||
- [x] Show confirmation dialog
|
||||
- [x] Display success toast after activation
|
||||
|
||||
---
|
||||
|
||||
@@ -733,15 +733,15 @@
|
||||
**Purpose:** Deactivate user
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Add `AdminService.deactivateUser(userId)` method
|
||||
- [ ] Update user status in signal
|
||||
- [ ] Handle soft delete
|
||||
- [x] Add `AdminService.deactivateUser(userId)` method
|
||||
- [x] Update user status in signal
|
||||
- [x] Handle soft delete
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Add "Deactivate" button for active users
|
||||
- [ ] Show confirmation dialog with warning message
|
||||
- [ ] Display success toast after deactivation
|
||||
- [ ] Show "Reactivate" button for deactivated users
|
||||
- [x] Add "Deactivate" button for active users
|
||||
- [x] Show confirmation dialog with warning message
|
||||
- [x] Display success toast after deactivation
|
||||
- [x] Show "Reactivate" button for deactivated users
|
||||
|
||||
---
|
||||
|
||||
@@ -749,13 +749,13 @@
|
||||
**Purpose:** Create new question
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Add `AdminService.createQuestion(data)` method
|
||||
- [ ] Validate question data (type, options, correct answer)
|
||||
- [ ] Handle 401/403 authorization errors
|
||||
- [x] Add `AdminService.createQuestion(data)` method
|
||||
- [x] Validate question data (type, options, correct answer)
|
||||
- [x] Handle 401/403 authorization errors
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Build `AdminQuestionFormComponent` for creating questions
|
||||
- [ ] Create form with fields:
|
||||
- [x] Build `AdminQuestionFormComponent` for creating questions
|
||||
- [x] Create form with fields:
|
||||
- Question text (textarea)
|
||||
- Question type selector (Multiple Choice, True/False, Written)
|
||||
- Category selector
|
||||
@@ -766,13 +766,13 @@
|
||||
- Points (number)
|
||||
- Tags (chip input)
|
||||
- Guest accessible checkbox
|
||||
- [ ] Show/hide options based on question type
|
||||
- [ ] Add dynamic option inputs for MCQ (Add/Remove buttons)
|
||||
- [ ] Validate correct answer matches options
|
||||
- [ ] Show question preview panel
|
||||
- [ ] Display validation errors inline
|
||||
- [ ] Add "Save Question" and "Cancel" buttons
|
||||
- [ ] Show success toast after creation
|
||||
- [x] Show/hide options based on question type
|
||||
- [x] Add dynamic option inputs for MCQ (Add/Remove buttons)
|
||||
- [x] Validate correct answer matches options
|
||||
- [x] Show question preview panel
|
||||
- [x] Display validation errors inline
|
||||
- [x] Add "Save Question" and "Cancel" buttons
|
||||
- [x] Show success toast after creation
|
||||
|
||||
---
|
||||
|
||||
@@ -780,16 +780,16 @@
|
||||
**Purpose:** Update question
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Add `AdminService.updateQuestion(id, data)` method
|
||||
- [ ] Pre-fill form with existing question data
|
||||
- [ ] Handle 404 if question not found
|
||||
- [x] Add `AdminService.updateQuestion(id, data)` method
|
||||
- [x] Pre-fill form with existing question data
|
||||
- [x] Handle 404 if question not found
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Reuse `AdminQuestionFormComponent` in edit mode
|
||||
- [ ] Pre-populate all form fields
|
||||
- [ ] Show "Editing: Question ID" header
|
||||
- [x] Reuse `AdminQuestionFormComponent` in edit mode
|
||||
- [x] Pre-populate all form fields
|
||||
- [x] Show "Editing: Question ID" header
|
||||
- [ ] Add version history section (optional)
|
||||
- [ ] Display success toast after update
|
||||
- [x] Display success toast after update
|
||||
|
||||
---
|
||||
|
||||
@@ -797,14 +797,14 @@
|
||||
**Purpose:** Delete question
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Add `AdminService.deleteQuestion(id)` method
|
||||
- [ ] Handle soft delete
|
||||
- [ ] Update question list after deletion
|
||||
- [x] Add `AdminService.deleteQuestion(id)` method
|
||||
- [x] Handle soft delete
|
||||
- [x] Update question list after deletion
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Add delete button in admin question list
|
||||
- [ ] Show confirmation dialog with warning
|
||||
- [ ] Display success toast after deletion
|
||||
- [x] Add delete button in admin question list
|
||||
- [x] Show confirmation dialog with warning
|
||||
- [x] Display success toast after deletion
|
||||
- [ ] Add "Restore" option for soft-deleted questions
|
||||
|
||||
---
|
||||
@@ -814,21 +814,21 @@
|
||||
### Search Functionality
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Create `SearchService` for global search
|
||||
- [ ] Implement debounced search input
|
||||
- [ ] Search across questions, categories, quizzes
|
||||
- [ ] Store search results in signal
|
||||
- [ ] Handle empty search results
|
||||
- [x] Create `SearchService` for global search
|
||||
- [x] Implement debounced search input
|
||||
- [x] Search across questions, categories, quizzes
|
||||
- [x] Store search results in signal
|
||||
- [x] Handle empty search results
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Build `SearchComponent` in header/navbar
|
||||
- [ ] Create search input with icon
|
||||
- [ ] Display search results dropdown
|
||||
- [ ] Highlight matching text in results
|
||||
- [ ] Add "See All Results" link
|
||||
- [ ] Implement keyboard navigation (arrow keys, enter)
|
||||
- [ ] Show loading indicator during search
|
||||
- [ ] Display empty state for no results
|
||||
- [x] Build `SearchComponent` in header/navbar
|
||||
- [x] Create search input with icon
|
||||
- [x] Display search results dropdown
|
||||
- [x] Highlight matching text in results
|
||||
- [x] Add "See All Results" link
|
||||
- [x] Implement keyboard navigation (arrow keys, enter)
|
||||
- [x] Show loading indicator during search
|
||||
- [x] Display empty state for no results
|
||||
|
||||
---
|
||||
|
||||
@@ -850,7 +850,7 @@
|
||||
|
||||
---
|
||||
|
||||
### Social Share
|
||||
<!-- ### Social Share
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Create `ShareService` for social sharing
|
||||
@@ -866,62 +866,79 @@
|
||||
- [ ] Create shareable result card template
|
||||
- [ ] Add privacy toggle (public/private share)
|
||||
|
||||
---
|
||||
--- -->
|
||||
|
||||
### Pagination Component
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Create reusable `PaginationService`
|
||||
- [ ] Calculate page numbers and ranges
|
||||
- [ ] Handle page change events
|
||||
- [ ] Update URL query parameters
|
||||
- [x] Create reusable `PaginationService`
|
||||
- [x] Calculate page numbers and ranges
|
||||
- [x] Handle page change events
|
||||
- [x] Update URL query parameters
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Build reusable `PaginationComponent`
|
||||
- [ ] Show Previous, Next, and page numbers
|
||||
- [ ] Highlight current page
|
||||
- [ ] Disable Previous on first page, Next on last page
|
||||
- [ ] Display "Showing X-Y of Z results"
|
||||
- [ ] Implement responsive design (fewer page numbers on mobile)
|
||||
- [x] Build reusable `PaginationComponent`
|
||||
- [x] Show Previous, Next, and page numbers
|
||||
- [x] Highlight current page
|
||||
- [x] Disable Previous on first page, Next on last page
|
||||
- [x] Display "Showing X-Y of Z results"
|
||||
- [x] Implement responsive design (fewer page numbers on mobile)
|
||||
|
||||
---
|
||||
|
||||
### Error Handling
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Create global error handler service
|
||||
- [ ] Log errors to console and external service (optional)
|
||||
- [ ] Display user-friendly error messages
|
||||
- [ ] Handle network errors gracefully
|
||||
- [ ] Implement retry logic for failed requests
|
||||
- [x] Create global error handler service
|
||||
- [x] Log errors to console and external service (optional)
|
||||
- [x] Display user-friendly error messages
|
||||
- [x] Handle network errors gracefully
|
||||
- [x] Implement retry logic for failed requests
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Build `ErrorComponent` for displaying errors
|
||||
- [ ] Create error toast component
|
||||
- [ ] Show "Something went wrong" page for critical errors
|
||||
- [ ] Add "Retry" button for recoverable errors
|
||||
- [ ] Display specific error messages (401, 403, 404, 500)
|
||||
- [x] Build `ErrorComponent` for displaying errors
|
||||
- [x] Create error toast component
|
||||
- [x] Show "Something went wrong" page for critical errors
|
||||
- [x] Add "Retry" button for recoverable errors
|
||||
- [x] Display specific error messages (401, 403, 404, 500)
|
||||
|
||||
---
|
||||
|
||||
### Loading States
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Create `LoadingService` for global loading state
|
||||
- [ ] Use signals for loading indicators
|
||||
- [ ] Show loading during HTTP requests
|
||||
- [ ] Handle concurrent loading states
|
||||
- [x] Create `LoadingService` for global loading state
|
||||
- [x] Use signals for loading indicators
|
||||
- [x] Show loading during HTTP requests
|
||||
- [x] Handle concurrent loading states
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Build reusable `LoadingSpinnerComponent`
|
||||
- [ ] Create skeleton loaders for lists and cards
|
||||
- [ ] Show inline loading spinners on buttons
|
||||
- [ ] Add progress bar at top of page for navigation
|
||||
- [ ] Ensure loading states are accessible (ARIA live regions)
|
||||
- [x] Build reusable `LoadingSpinnerComponent`
|
||||
- [x] Create skeleton loaders for lists and cards
|
||||
- [x] Show inline loading spinners on buttons
|
||||
- [x] Add progress bar at top of page for navigation
|
||||
- [x] Ensure loading states are accessible (ARIA live regions)
|
||||
|
||||
**Completed Implementation:**
|
||||
- ✅ **LoadingService integrated with HTTP interceptors**
|
||||
- Created `loading.interceptor.ts` that automatically shows/hides loading during HTTP requests
|
||||
- Registered in app.config.ts as first interceptor in the chain
|
||||
- Supports `X-Skip-Loading` header to skip loading for specific requests (e.g., polling)
|
||||
- Uses LoadingService counter to handle concurrent requests properly
|
||||
- ✅ **Navigation progress bar added**
|
||||
- Mat-progress-bar displayed at top of page during route transitions
|
||||
- Listens to Router events (NavigationStart/End/Cancel/Error)
|
||||
- Fixed position with high z-index above all content
|
||||
- Custom styling with primary color theme
|
||||
- ✅ **Accessibility features implemented**
|
||||
- LoadingSpinnerComponent has `role="status"` and `aria-live="polite"`
|
||||
- Dynamic `aria-label` with loading message
|
||||
- Navigation progress bar has `role="progressbar"` and `aria-label="Page loading"`
|
||||
- Visual loading message marked with `aria-hidden="true"` to avoid duplication
|
||||
|
||||
---
|
||||
|
||||
### Offline Support
|
||||
<!-- ### Offline Support
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Implement service worker for PWA
|
||||
@@ -956,42 +973,42 @@
|
||||
- [ ] Design install button/banner
|
||||
- [ ] Test PWA on mobile devices (iOS, Android)
|
||||
|
||||
---
|
||||
--- -->
|
||||
|
||||
## Routing & Navigation
|
||||
|
||||
**Frontend Tasks:**
|
||||
- [ ] Configure app routes with lazy loading:
|
||||
- `/` - Landing page (guest welcome or dashboard)
|
||||
- `/login` - Login page
|
||||
- `/register` - Register page
|
||||
- `/dashboard` - User dashboard (auth guard)
|
||||
- `/categories` - Category list
|
||||
- `/categories/:id` - Category detail
|
||||
- `/quiz/setup` - Quiz setup
|
||||
- `/quiz/:sessionId` - Active quiz
|
||||
- `/quiz/:sessionId/results` - Quiz results
|
||||
- `/quiz/:sessionId/review` - Quiz review
|
||||
- `/bookmarks` - Bookmarked questions (auth guard)
|
||||
- `/history` - Quiz history (auth guard)
|
||||
- `/profile` - User profile (auth guard)
|
||||
- `/admin` - Admin dashboard (admin guard)
|
||||
- `/admin/users` - User management (admin guard)
|
||||
- `/admin/questions` - Question management (admin guard)
|
||||
- `/admin/categories` - Category management (admin guard)
|
||||
- `/admin/settings` - Guest settings (admin guard)
|
||||
- `/admin/analytics` - Analytics (admin guard)
|
||||
- [ ] Create auth guard for protected routes
|
||||
- [ ] Create admin guard for admin-only routes
|
||||
- [ ] Create guest guard to prevent access to auth-only content
|
||||
- [ ] Implement route preloading strategy
|
||||
- [ ] Handle 404 redirect
|
||||
- [x] Configure app routes with lazy loading:
|
||||
- [x] `/` - Landing page (guest welcome or dashboard)
|
||||
- [x] `/login` - Login page
|
||||
- [x] `/register` - Register page
|
||||
- [x] `/dashboard` - User dashboard (auth guard)
|
||||
- [x] `/categories` - Category list
|
||||
- [x] `/categories/:id` - Category detail
|
||||
- [x] `/quiz/setup` - Quiz setup
|
||||
- [x] `/quiz/:sessionId` - Active quiz
|
||||
- [x] `/quiz/:sessionId/results` - Quiz results
|
||||
- [x] `/quiz/:sessionId/review` - Quiz review
|
||||
- [x] `/bookmarks` - Bookmarked questions (auth guard)
|
||||
- [x] `/history` - Quiz history (auth guard)
|
||||
- [x] `/profile` - User profile (auth guard)
|
||||
- [x] `/admin` - Admin dashboard (admin guard)
|
||||
- [x] `/admin/users` - User management (admin guard)
|
||||
- [x] `/admin/questions` - Question management (admin guard)
|
||||
- [x] `/admin/categories` - Category management (admin guard)
|
||||
- [x] `/admin/settings` - Guest settings (admin guard) - **Exists as /admin/guest-settings**
|
||||
- [x] `/admin/analytics` - Analytics (admin guard)
|
||||
- [x] Create auth guard for protected routes
|
||||
- [x] Create admin guard for admin-only routes
|
||||
- [x] Create guest guard to prevent access to auth-only content
|
||||
- [x] Implement route preloading strategy
|
||||
- [x] Handle 404 redirect
|
||||
|
||||
**UI Tasks:**
|
||||
- [ ] Create navigation menu with links
|
||||
- [ ] Highlight active route in navigation
|
||||
- [ ] Implement breadcrumb component
|
||||
- [ ] Add back button where appropriate
|
||||
- [x] Create navigation menu with links
|
||||
- [x] Highlight active route in navigation
|
||||
- [x] Implement breadcrumb component
|
||||
- [x] Add back button where appropriate
|
||||
- [ ] Ensure smooth transitions between routes
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user