Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 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
1d74b6c
[CORE-7935] clickable only when form is valid
trtshen Jun 26, 2025
b6d8113
[CORE-7944] fixed illogical disabled
trtshen Jul 1, 2025
351a2c3
[CORE-7944] required only at edit
trtshen Jul 1, 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
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
1ddf936
[CORE-7940] pulsecheck race-condition
trtshen Sep 10, 2025
915e72c
Merge branch 'golive/2.4.y' into 2.4.y/CORE-7496/assessment-pagination
trtshen Sep 10, 2025
72f0da5
Merge pull request #2538 from intersective/2.4.y/CORE-7940/double-pul…
shawnm0705 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
0ae03e7
[CORE-8011] naming changes
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
11072c7
[CORE-8029] don't flick
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
0cf2985
[CORE-8032] missing activity object in mobile mode
trtshen Oct 9, 2025
53ebd72
[CORE-8032] refactor activityId retrieval
trtshen Oct 9, 2025
7d5a322
Merge pull request #2561 from intersective/2.4.7/CORE-8032/mobile-vie…
trtshen Oct 15, 2025
11f89f7
Merge pull request #2548 from intersective/2.4.y/CORE-8011/flexible-r…
trtshen Oct 15, 2025
d8bff26
Merge pull request #2556 from intersective/2.4.y/CORE-8029/theme-colo…
trtshen Oct 15, 2025
c1f2c3f
Merge remote-tracking branch 'origin/prerelease' into golive/2.4.y
trtshen Nov 20, 2025
ee71703
Merge remote-tracking branch 'origin/golive/2.4.7' into 2.4.y.z/missi…
trtshen Mar 3, 2026
35dc8ea
Merge pull request #2629 from intersective/2.4.y.z/missing-merges
trtshen Mar 6, 2026
a71605c
Merge remote-tracking branch 'origin/release/live' into golive/2.4.y
trtshen Mar 9, 2026
0f0dbf1
Merge remote-tracking branch 'origin/prerelease' into golive/2.4.y
trtshen Mar 9, 2026
15c1324
Merge remote-tracking branch 'origin/golive/2.4.y' into 2.4.y/CORE-74…
trtshen Mar 9, 2026
a13dc6b
[CORE-7976] env-based amst pagination toggle
trtshen Jul 31, 2025
3047973
Merge pull request #2474 from intersective/2.4.y/CORE-7496/assessment…
shawnm0705 Mar 9, 2026
e5f9131
Merge remote-tracking branch 'origin/prerelease' into 2.4.y/CORE-7935…
trtshen Mar 11, 2026
3f7c63e
[CORE-7944] missing changes from trunk
trtshen Mar 11, 2026
8d01b0a
Merge pull request #2631 from intersective/2.4.y/CORE-7935/clickable-…
trtshen Mar 11, 2026
7f87e37
[CORE-7935] missing object handling
trtshen Mar 11, 2026
4a3cd00
Merge pull request #2632 from intersective/2.4.y/CORE-7935/clickable-…
trtshen Mar 12, 2026
1f3af85
[CORE-8165] enabel pagination and navigation fix
trtshen Mar 13, 2026
dd989e6
Merge pull request #2633 from intersective/2.4.y/CORE-8165/topic
trtshen Mar 13, 2026
466eac4
[CORE-8167] added standalone pagination for completed reviews
trtshen Mar 17, 2026
998823a
Merge pull request #2635 from intersective/2.4.8/CORE-8167/standalone…
trtshen Mar 17, 2026
59b5b85
[CORE-8166] local and remote answer display for review
trtshen Mar 17, 2026
8a3b7fe
Merge pull request #2637 from intersective/2.4.8/CORE-8166/review-mis…
trtshen Mar 18, 2026
303ce04
[CORE-8166] fix: mark control as dirty and restore uploaded file data
trtshen Mar 18, 2026
2b35d4b
Merge pull request #2639 from intersective/2.4.8/CORE-8166/filetype-q…
trtshen Mar 18, 2026
f265556
[CORE-8166] file format checking in both review + assesment mode
trtshen Mar 18, 2026
26a914b
Merge remote-tracking branch 'origin/prerelease' into 2.4.8/CORE-8166…
trtshen Mar 18, 2026
67de209
Merge pull request #2641 from intersective/2.4.8/CORE-8166/filetype-q…
trtshen Mar 19, 2026
8726e06
[CORE-8182] reviewer pagination indicator inaccurate
trtshen Mar 19, 2026
a661374
Merge pull request #2643 from intersective/2.4.y.z/CORE-8182/indicato…
trtshen Mar 19, 2026
0c742e5
docs: lambda
rodentskie Mar 20, 2026
6b32276
[CORE-8183] label update
trtshen Mar 20, 2026
945ce53
Merge pull request #2644 from intersective/2.4.y/CORE-8183/answer-label
trtshen Mar 20, 2026
ae646c0
[CORE-8011] update labels for consistency in answers
trtshen Mar 20, 2026
7d72b54
Merge pull request #2646 from intersective/2.4.y.z/CORE-8011/label-up…
trtshen Mar 20, 2026
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
3 changes: 2 additions & 1 deletion .github/workflows/p2-aus-appv3.yml
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,8 @@ jobs:
export CUSTOM_BADGE_PROJECT_URL=https://badge.aus.practera.com
export CUSTOM_UPLOAD_TUS_ENDPOINT=https://tusd.practera.com/uploads/
export CUSTOM_UPLOAD_MAX_FILE_SIZE=2147483648
export CUSTOM_HELPLINE=programs@practera.com
export CUSTOM_HELPLINE=help@practera.com
export CUSTOM_ENABLE_ASSESSMENT_PAGINATION=false
export CUSTOM_STACK_NAME=${{ env.STACK_NAME }}

printf "Angular environment variable creation complete\n\n"
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/p2-euk-appv3.yml
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,8 @@ jobs:
export CUSTOM_BADGE_PROJECT_URL=https://badge.euk.practera.com
export CUSTOM_UPLOAD_TUS_ENDPOINT=https://tusd.practera.com/uploads/
export CUSTOM_UPLOAD_MAX_FILE_SIZE=2147483648
export CUSTOM_HELPLINE=programs@practera.com
export CUSTOM_HELPLINE=help@practera.com
export CUSTOM_ENABLE_ASSESSMENT_PAGINATION=false
export CUSTOM_STACK_NAME=${{ env.STACK_NAME }}

printf "Angular environment variable creation complete\n\n"
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/p2-prerelease-appv3.yml
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,8 @@ jobs:
export CUSTOM_BADGE_PROJECT_URL=https://badge.p2-prerelease.practera.com
export CUSTOM_UPLOAD_TUS_ENDPOINT=https://tusd.practera.com/uploads/
export CUSTOM_UPLOAD_MAX_FILE_SIZE=2147483648
export CUSTOM_HELPLINE=programs@practera.com
export CUSTOM_HELPLINE=help@practera.com
export CUSTOM_ENABLE_ASSESSMENT_PAGINATION=true
export CUSTOM_STACK_NAME=${{ env.STACK_NAME }}

printf "Angular environment variable creation complete\n\n"
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/p2-stage-appv3.yml
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,8 @@ jobs:
export CUSTOM_INTERCOM=$(aws secretsmanager get-secret-value --secret-id $STACK_NAME-IntercomSecret-$ENV| jq --raw-output '.SecretString' | jq -r .app_id)
export CUSTOM_BADGE_PROJECT_URL=https://badge.p2-stage.practera.com
export CUSTOM_UPLOAD_TUS_ENDPOINT=https://tusd.practera.com/uploads/
export CUSTOM_HELPLINE=programs@practera.com
export CUSTOM_HELPLINE=help@practera.com
export CUSTOM_ENABLE_ASSESSMENT_PAGINATION=true
export CUSTOM_STACK_NAME=${{ env.STACK_NAME }}

printf "Angular environment variable creation complete\n\n"
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/p2-usa-appv3.yml
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,8 @@ jobs:
export CUSTOM_BADGE_PROJECT_URL=https://badge.usa.practera.com
export CUSTOM_UPLOAD_TUS_ENDPOINT=https://tusd.practera.com/uploads/
export CUSTOM_UPLOAD_MAX_FILE_SIZE=2147483648
export CUSTOM_HELPLINE=programs@practera.com
export CUSTOM_HELPLINE=help@practera.com
export CUSTOM_ENABLE_ASSESSMENT_PAGINATION=false
export CUSTOM_STACK_NAME=${{ env.STACK_NAME }}

printf "Angular environment variable creation complete\n\n"
Expand Down
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
Loading