Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
ca4244f
Revert "Revert "[CORE-7496] 2.4.y/assessment pagination trunk""
trtshen May 26, 2025
32127c8
Merge branch 'golive/2.4.y' into revert-CORE-7496-trunk
trtshen Jun 19, 2025
a9d0b94
Merge remote-tracking branch 'origin/prerelease' into revert-CORE-749…
trtshen Jun 19, 2025
5617ab8
[CORE-7496] when page is 1
trtshen May 23, 2025
be35115
[CORE-7496] improved validation by onChange
trtshen May 26, 2025
7aa1c8e
[CORE-7496] hide as disabled to spare btn space
trtshen Jun 5, 2025
bec3eef
[CORE-7496] question logic fixes
trtshen Jun 19, 2025
a296eeb
[CORE-7496] missing text updates
trtshen Jun 19, 2025
d90079c
[CORE-7496] review has both answer & comment
trtshen Jun 19, 2025
94a3dcb
[CORE-7496] review has both answer & comment
trtshen Jun 19, 2025
85eccc0
Merge remote-tracking branch 'origin/golive/2.4.y' into 2.4.y/CORE-74…
trtshen Jul 10, 2025
54e4532
Merge remote-tracking branch 'origin/golive/2.4.y' into 2.4.y/CORE-74…
trtshen Jul 22, 2025
824db6f
prevent potential multiple click triggers on API
trtshen Jul 22, 2025
a7495b5
Merge pull request #2505 from intersective/2.4.y.z/multiple-mark-as-c…
trtshen Jul 24, 2025
82ed512
Merge remote-tracking branch 'origin/golive/2.4.y' into 2.4.y/CORE-74…
trtshen Jul 24, 2025
3d8af2b
Merge remote-tracking branch 'origin/golive/2.4.y.z' into 2.4.y/CORE-…
trtshen Jul 24, 2025
0db4852
[CORE-7496] feature toggle for asmt pagination
trtshen Jul 25, 2025
915e72c
Merge branch 'golive/2.4.y' into 2.4.y/CORE-7496/assessment-pagination
trtshen Sep 10, 2025
3a204fd
[CORE-7944] disabled status of submit button for both learner & reviewer
trtshen Jul 2, 2025
533c2fd
[CORE-7935] reviewer's file value
trtshen Sep 11, 2025
7f1c105
[CORE-7935] rearrange to retrieve the isPendingReview first
trtshen Sep 11, 2025
0a4904d
[CORE-7935] additional file type question validator
trtshen Sep 11, 2025
767be99
Merge branch 'golive/2.4.y' into 2.4.y/CORE-7496/assessment-pagination
trtshen Sep 11, 2025
b783f72
[CORE-7944] broken multi member selctor fixed
trtshen Sep 17, 2025
db22405
[CORE-7944] broken logic for multi answer retrieval + submission
trtshen Sep 17, 2025
29f0d64
[CORE-8012] toggle with text innerHTML
trtshen Sep 18, 2025
5be60c0
[CORE-8012] support empty submission for slider now
trtshen Sep 18, 2025
2da24bd
[CORE-8012] lint fixes
trtshen Sep 18, 2025
e9b960e
[CORE-8012] fixed multi member selection type missing answer
trtshen Sep 22, 2025
03b7b1b
[CORE-8012] corrected question type name
trtshen Sep 22, 2025
2223cdb
Merge pull request #2544 from intersective/2.4.y/CORE-8012/slider-bro…
trtshen Sep 23, 2025
9f91f27
[CORE-8026] add setTimer to delay validation check before form is pop…
trtshen Sep 26, 2025
1685b3d
[CORE-7944] added exception for mobile review
trtshen Sep 25, 2025
d5c7057
[CORE-8027] reduce prev & next gap
trtshen Sep 29, 2025
3284f10
[CORE-8028] increased pagination indicator size
trtshen Sep 30, 2025
61440dc
[CORE-8028] removed question quanitiy indicator
trtshen Oct 1, 2025
4d4313c
[CORE-8031] readonly avoid required indicator
trtshen Oct 3, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
163 changes: 163 additions & 0 deletions docs/assessment-btndisabled-flow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
═══════════════════════════════════════════════════════════════════════════════════════
btnDisabled$ BehaviorSubject Flow Diagram
═══════════════════════════════════════════════════════════════════════════════════════

┌─────────────────────────────────────┐
│ activity-desktop.page.ts │
│ (Parent Component) │
└─────────────────────────────────────┘
│ Creates & Passes btnDisabled$
│ as @Input to assessment.component
┌─────────────────────────────────────┐
│ assessment.component.ts │
│ (Child Component) │
│ │
│ @Input() btnDisabled$: │
│ BehaviorSubject<boolean> │
└─────────────────────────────────────┘

═══════════════════════════════════════════════════════════════════════════════════════
TRIGGER POINTS IN assessment.component.ts
═══════════════════════════════════════════════════════════════════════════════════════

1. ngOnChanges() - Component Lifecycle
└── btnDisabled$.next(false) ──────────► RESET on assessment change

2. _populateQuestionsForm() - Form Setup
├── If no questions exist:
│ └── btnDisabled$.next(true) ───────► DISABLE (empty form)
└── questionsForm.valueChanges.subscribe()
└── setSubmissionDisabled() ───────► CHECK & UPDATE based on validation

3. _handleSubmissionData() - Submission State Handler
└── If submission.isLocked:
└── btnDisabled$.next(true) ───────► DISABLE (locked by another user)

4. _handleReviewData() - Review State Handler
└── If isPendingReview && review.status === 'in progress':
└── btnDisabled$.next(false) ──────► ENABLE for review

5. continueToNextTask() - Submit Action
└── If _btnAction === 'submit':
└── btnDisabled$.next(true) ───────► DISABLE during submission

6. _submitAnswer() - Answer Submission
└── If required questions missing:
└── btnDisabled$.next(false) ──────► RE-ENABLE after validation fail

7. resubmit() - Resubmission Flow
├── Start: btnDisabled$.next(true) ────► DISABLE during resubmit
└── End: btnDisabled$.next(false) ─────► RE-ENABLE after completion

8. setSubmissionDisabled() - Main Validation Logic
├── Only runs if (doAssessment || isPendingReview)
├── If form invalid & not disabled:
│ └── btnDisabled$.next(true) ───────► DISABLE
└── If form valid & disabled:
└── btnDisabled$.next(false) ──────► ENABLE

9. _prefillForm() - Form Population
├── After populating form with answers
├── questionsForm.updateValueAndValidity()
└── If edit mode (doAssessment || isPendingReview):
└── setSubmissionDisabled() ───────► CHECK & UPDATE validation
└── If read-only mode:
└── btnDisabled$.next(false) ──────► ENSURE enabled

10. Page Navigation Methods
├── goToPage()
├── nextPage()
└── prevPage()
└── setSubmissionDisabled() ──────► CHECK & UPDATE for new page

═══════════════════════════════════════════════════════════════════════════════════════
TRIGGER CONDITIONS SUMMARY
═══════════════════════════════════════════════════════════════════════════════════════

DISABLE CONDITIONS (btnDisabled$.next(true)):
├── No questions in assessment
├── Assessment is locked by another user
├── Form is invalid (required fields empty)
├── During submission process
└── During resubmit process

ENABLE CONDITIONS (btnDisabled$.next(false)):
├── Assessment changes (reset)
├── Form becomes valid
├── Review in progress
├── After failed validation alert
├── After resubmit completion
└── Read-only mode (not doAssessment && not isPendingReview)

═══════════════════════════════════════════════════════════════════════════════════════
PROBLEM SCENARIO
═══════════════════════════════════════════════════════════════════════════════════════

User Flow - Original Issue (RESOLVED):
1. User visits Assessment A (has required fields)
└── Form invalid → btnDisabled$.next(true) ✓

2. User navigates to Assessment B via activity-desktop
└── ngOnChanges() → btnDisabled$.next(false) ✓
└── _populateQuestionsForm() → questionsForm created
└── _populateFormWithAnswers() → form populated
└── setSubmissionDisabled() → checks validation
└── BUT: Timing issue - form may not be fully populated
└── Result: btnDisabled$ may remain false even if invalid

3. RESOLVED: State synchronization fixed
└── _prefillForm() now properly checks validation after form population

═══════════════════════════════════════════════════════════════════════════════════════
SOLUTION IMPLEMENTATION (COMPLETED)
═══════════════════════════════════════════════════════════════════════════════════════

IMPLEMENTED FIXES:
1. ✅ Reset state in ngOnChanges when assessment changes
└── btnDisabled$.next(false) in ngOnChanges()

2. ✅ Proper validation after form population in _prefillForm()
├── questionsForm.updateValueAndValidity()
├── Edit mode: setSubmissionDisabled() checks validation
└── Read-only mode: btnDisabled$.next(false) ensures enabled

3. ✅ Check validation when changing pages
├── prevPage() → setSubmissionDisabled()
├── nextPage() → setSubmissionDisabled()
└── goToPage() → setSubmissionDisabled()

4. ✅ Apply validation rules only when in edit mode
└── setSubmissionDisabled() has guard: (!doAssessment && !isPendingReview)

5. ✅ Replaced _populateFormWithAnswers() with _prefillForm()
└── Better state management and validation synchronization

RESULT: btnDisabled$ now accurately reflects form state at all times
═══════════════════════════════════════════════════════════════════════════════════════

═══════════════════════════════════════════════════════════════════════════════════════
KEY LEARNINGS
═══════════════════════════════════════════════════════════════════════════════════════

1. BEHAVIORSUBJECT STATE PERSISTENCE
└── BehaviorSubject remembers last value across component input changes
└── Must explicitly reset when navigating between assessments

2. FORM VALIDATION TIMING
└── Validation must happen AFTER form population is complete
└── updateValueAndValidity() is crucial for proper validation state

3. SEPARATION OF CONCERNS
└── setSubmissionDisabled() handles validation-based enabling/disabling
└── _prefillForm() handles initial state setup after population
└── Each method has clear responsibility boundaries

4. EDIT VS READ-ONLY MODES
└── Only apply validation rules when user can edit
└── Read-only mode should always have enabled button for navigation
└── Guard clauses prevent unnecessary state changes

═══════════════════════════════════════════════════════════════════════════════════════
Loading