Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
654 commits
Select commit Hold shift + click to select a range
0cd46f5
Merge branch 'VPR-47-percent-assignment' into Development
rlorenzo Jan 30, 2026
95c66e3
Merge branch 'VPR-47-percent-assignment' into Development
rlorenzo Jan 30, 2026
8e67efa
Merge branch 'VPR-47-percent-assignment' into Development
rlorenzo Jan 30, 2026
ab251da
Merge branch 'VPR-47-percent-assignment' into Development
rlorenzo Jan 30, 2026
7b9d3aa
Merge branch 'VPR-47-percent-assignment' into Development
rlorenzo Jan 31, 2026
be6e7ab
Merge branch 'VPR-47-percent-assignment' into Development
rlorenzo Jan 31, 2026
7d53309
Merge branch 'VPR-47-percent-assignment' into Development
rlorenzo Feb 1, 2026
69d12c1
Merge branch 'VPR-47-percent-assignment' into Development
rlorenzo Feb 1, 2026
76910dc
Merge branch 'VPR-47-percent-assignment' into Development
rlorenzo Feb 1, 2026
b424b61
Merge branch 'VPR-47-percent-assignment' into Development
rlorenzo Feb 1, 2026
008ef0b
Merge branch 'VPR-47-percent-assignment' into Development
rlorenzo Feb 1, 2026
829ac4e
Merge branch 'VPR-49-instructor-edit-effort' into Development
rlorenzo Feb 3, 2026
2740bfb
Merge branch 'dependabot/npm_and_yarn/VueApp/npm_and_yarn-86c0509402'…
rlorenzo Feb 3, 2026
2590703
Merge branch 'dependabot/nuget/web/nuget-febcf3c244' into Development
rlorenzo Feb 3, 2026
2b815aa
feat(effort): VPR-52 - staff dashboard with verification tracking
rlorenzo Feb 3, 2026
2301332
fix(effort): resolve code quality warnings in dashboard code
rlorenzo Feb 3, 2026
94369e9
Merge branch 'VPR-52-effort-staff-dashboard' into Development
rlorenzo Feb 4, 2026
a31e075
feat(effort): enhance staff dashboard with navigation and term views
rlorenzo Feb 4, 2026
cc0343d
Merge branch 'VPR-52-effort-staff-dashboard' into Development
rlorenzo Feb 4, 2026
7ec1667
feat(scripts): add --clear-cache flag to test-dotnet for clearing bui…
rlorenzo Feb 4, 2026
d2a7847
Merge branch 'VPR-52-effort-staff-dashboard' into Development
rlorenzo Feb 4, 2026
645fac9
Merge branch 'VPR-49-instructor-edit-effort' into Development
rlorenzo Feb 4, 2026
3f9c614
Merge branch 'add-roles-mypermissions' into Development
rlorenzo Feb 4, 2026
db3503e
Merge branch 'VPR-49-instructor-edit-effort' into Development
rlorenzo Feb 5, 2026
593732b
Merge branch 'VPR-49-instructor-edit-effort' into Development
rlorenzo Feb 5, 2026
ed8eec0
Merge branch 'VPR-52-effort-staff-dashboard' into Development
rlorenzo Feb 5, 2026
0a521a3
refactor(effort): DRY up MyEffort and InstructorDetail pages
rlorenzo Feb 6, 2026
804789a
Merge branch 'VPR-65-percent-assign-rollover' into Development
rlorenzo Feb 6, 2026
4e6e4ea
Merge branch 'VPR-65-percent-assign-rollover' into Development
rlorenzo Feb 6, 2026
f7d2d2c
Merge branch 'VPR-65-percent-assign-rollover' into Development
rlorenzo Feb 6, 2026
a8a3cf5
feat(effort): add optional notes field to effort records
rlorenzo Feb 6, 2026
9057484
Merge branch 'VPR-67-r-course-notes' into Development
rlorenzo Feb 6, 2026
4e3b890
Merge branch 'VPR-65-percent-assign-rollover' into Development
rlorenzo Feb 6, 2026
a484c30
VPR-67 refactor(effort): make form validation consistent
rlorenzo Feb 10, 2026
1d41d28
Merge branch 'VPR-67-r-course-notes' into Development
rlorenzo Feb 10, 2026
fc72cbd
VPR-67 feat(effort): restrict notes to generic R-Course and fix impor…
rlorenzo Feb 12, 2026
f4782c8
Merge branch 'VPR-67-r-course-notes' into Development
rlorenzo Feb 12, 2026
62b126b
VPR-60 feat(effort): add course-level effort management
rlorenzo Feb 12, 2026
65619eb
Merge branch 'VPR-65-percent-assign-rollover' into Development
rlorenzo Feb 12, 2026
24a303c
Merge branch 'VPR-65-percent-assign-rollover' into Development
rlorenzo Feb 12, 2026
578d9b5
Merge branch 'VPR-65-percent-assign-rollover' into Development
rlorenzo Feb 12, 2026
055ed2a
Merge branch 'VPR-65-percent-assign-rollover' into Development
rlorenzo Feb 12, 2026
17f4846
Merge branch 'VPR-65-percent-assign-rollover' into Development
rlorenzo Feb 12, 2026
f66003d
Merge branch 'VPR-65-percent-assign-rollover' into Development
rlorenzo Feb 12, 2026
850d26c
VPR-60 feat(effort): add instructor evaluation data to course detail
rlorenzo Feb 12, 2026
19d2719
VPR-60 refactor(effort): auto-compute eval stats from rating counts
rlorenzo Feb 13, 2026
08112c2
VPR-60 refactor(effort): conditionally show eval tabs and remove sour…
rlorenzo Feb 13, 2026
49bd7af
VPR-60 fix(effort): validate instructor effort before ad-hoc eval
rlorenzo Feb 13, 2026
6051851
Merge branch 'VPR-60-instructor-eval-data' into Development
rlorenzo Feb 13, 2026
a329ece
VPR-60 fix(effort): deduplicate eval permission fetch and add eval se…
rlorenzo Feb 13, 2026
72c50ae
Merge branch 'VPR-60-instructor-eval-data' into Development
rlorenzo Feb 13, 2026
7f38ab0
VPR-60 fix(effort): filter facilitator evals from status query and in…
rlorenzo Feb 14, 2026
9f66975
Merge branch 'VPR-60-instructor-eval-data' into Development
rlorenzo Feb 14, 2026
51be37f
VPR-60 fix(effort): address code review findings for eval feature
rlorenzo Feb 14, 2026
d524e0b
Merge branch 'VPR-60-instructor-eval-data' into Development
rlorenzo Feb 14, 2026
4cce0a5
VPR-60 feat(effort): validate eval rating counts against backend max
rlorenzo Feb 14, 2026
9181c8a
Merge branch 'VPR-60-instructor-eval-data' into Development
rlorenzo Feb 14, 2026
d1e46c3
VPR-60 fix(effort): add min=0 constraint to eval rating count inputs
rlorenzo Feb 14, 2026
3278fdf
Merge branch 'VPR-60-instructor-eval-data' into Development
rlorenzo Feb 14, 2026
be7fdbe
VPR-60 refactor(effort): rename CourseInstructorOptionsDto to match b…
rlorenzo Feb 14, 2026
b694ecb
Merge branch 'VPR-60-instructor-eval-data' into Development
rlorenzo Feb 14, 2026
e1ce75a
Merge branch 'security-package-updates' into Development
rlorenzo Feb 20, 2026
cfca8ac
Merge branch 'security-package-updates' into Development
rlorenzo Feb 20, 2026
1451885
VPR-60 feat(effort): add course-level effort management
rlorenzo Feb 12, 2026
012a133
VPR-60 feat(effort): add instructor evaluation data to course detail
rlorenzo Feb 12, 2026
97584e7
VPR-60 refactor(effort): auto-compute eval stats from rating counts
rlorenzo Feb 13, 2026
b5bbddc
VPR-60 refactor(effort): conditionally show eval tabs and remove sour…
rlorenzo Feb 13, 2026
989bcad
VPR-60 fix(effort): validate instructor effort before ad-hoc eval
rlorenzo Feb 13, 2026
2337f38
VPR-60 fix(effort): deduplicate eval permission fetch and add eval se…
rlorenzo Feb 13, 2026
5ce6664
VPR-60 fix(effort): filter facilitator evals from status query and in…
rlorenzo Feb 14, 2026
4defb48
VPR-60 fix(effort): address code review findings for eval feature
rlorenzo Feb 14, 2026
99f2fdd
VPR-60 feat(effort): validate eval rating counts against backend max
rlorenzo Feb 14, 2026
947341c
VPR-60 fix(effort): add min=0 constraint to eval rating count inputs
rlorenzo Feb 14, 2026
fcf8e4c
VPR-60 refactor(effort): rename CourseInstructorOptionsDto to match b…
rlorenzo Feb 14, 2026
c3d2827
VPR-48 feat(effort): add teaching activity reports infrastructure
rlorenzo Feb 14, 2026
d750b72
Merge branch 'VPR-60-instructor-eval-data' into Development
rlorenzo Feb 21, 2026
010dd7f
VPR-48 feat(effort): add summary and merit reports
rlorenzo Feb 24, 2026
d421690
Merge branch 'VPR-48-effort-reports' into Development
rlorenzo Feb 24, 2026
dcc5eb0
Merge branch 'VPR-69-email-header' into Development
rlorenzo Feb 24, 2026
426a681
Merge branch 'VPR-69-email-header' into Development
rlorenzo Feb 24, 2026
986a1d5
Merge branch 'VPR-72-codecov' into Development
rlorenzo Feb 25, 2026
e4f891e
VPR-60 fix(effort): skip re-auth on in-app navigation to prevent perm…
rlorenzo Feb 25, 2026
e77afe6
Merge branch 'VPR-60-instructor-eval-data' into Development
rlorenzo Feb 25, 2026
12b88be
Merge branch 'VPR-60-instructor-eval-data' into Development
rlorenzo Feb 26, 2026
79b79d9
Merge branch 'VPR-48-effort-reports' into Development
rlorenzo Feb 27, 2026
417a4b0
Merge branch 'VPR-48-effort-reports' into Development
rlorenzo Feb 27, 2026
2f464c7
Merge branch 'VPR-48-effort-reports' into Development
rlorenzo Feb 27, 2026
70bfb26
Merge branch 'dependabot/npm_and_yarn/npm_and_yarn-c64628b3c1' into D…
rlorenzo Mar 6, 2026
86071f6
Merge branch 'VPR-48-effort-reports' into Development
rlorenzo Mar 7, 2026
36696d5
VPR-48 fix(effort): remove duplicate inline report routes from routes.ts
rlorenzo Mar 7, 2026
f29d5d3
Merge branch 'VPR-48-effort-reports' into Development
rlorenzo Mar 7, 2026
8e58f18
Merge branch 'VPR-48-effort-reports' into Development
rlorenzo Mar 8, 2026
056c167
Merge branch 'VPR-48-effort-reports' into Development
rlorenzo Mar 9, 2026
389930b
Merge branch 'VPR-48-effort-reports' into Development
rlorenzo Mar 9, 2026
9c1e9e6
Merge branch 'VPR-48-effort-reports' into Development
rlorenzo Mar 9, 2026
3648a00
Merge branch 'VPR-48-effort-reports' into Development
rlorenzo Mar 9, 2026
54a2afa
Merge branch 'VPR-73-effort-expected-close' into Development
rlorenzo Mar 11, 2026
a5d265e
Merge branch 'VPR-73-effort-expected-close' into Development
rlorenzo Mar 12, 2026
858ec2c
Merge branch 'patch/dashboard-missing-instructors' into Development
rlorenzo Mar 16, 2026
7ec884b
Merge branch 'upgrade/lts-dotnet10-node24' into Development
rlorenzo Mar 21, 2026
9420468
Merge branch 'upgrade/lts-dotnet10-node24' into Development
rlorenzo Mar 21, 2026
4b54eae
Merge branch 'upgrade/lts-dotnet10-node24' into Development
rlorenzo Mar 21, 2026
80b4acc
Merge branch 'upgrade/lts-dotnet10-node24' into Development
rlorenzo Mar 21, 2026
c235ee7
Merge branch 'upgrade/lts-dotnet10-node24' into Development
rlorenzo Mar 24, 2026
6112044
Merge branch 'upgrade/lts-dotnet10-node24' into Development
rlorenzo Mar 25, 2026
199fa3c
Merge branch 'dependency-cooldown' into Development
rlorenzo Mar 30, 2026
5e710c8
Merge branch 'dependabot-fix' into Development
rlorenzo Mar 31, 2026
db4a052
Merge branch 'VPR-104-accessibility-audit-base' into Development
rlorenzo Apr 1, 2026
dae367c
Merge branch 'VPR-104-accessibility-audit-base' into Development
rlorenzo Apr 1, 2026
f56f15e
Merge branch 'VPR-104-accessibility-audit-base' into Development
rlorenzo Apr 2, 2026
212f526
VPR-104 fix(a11y): RAPS area accessibility improvements (PR 2 of 6)
rlorenzo Apr 1, 2026
483c3b6
VPR-104 fix(a11y): safe strict-equality guards in ApplyTemplate
rlorenzo Apr 1, 2026
3ee47a9
VPR-104 fix(a11y): add aria-label to icon-only buttons in RAPS
rlorenzo Apr 1, 2026
693002b
VPR-104 fix(a11y): fix grammar in RAPS headings
rlorenzo Apr 1, 2026
d7e3d7d
VPR-104 fix(a11y): align RAPS button colors to UC Davis brand palette
rlorenzo Apr 2, 2026
a42f86b
VPR-104 fix(a11y): add dialog close buttons, delete confirmations, an…
rlorenzo Apr 2, 2026
b77ce9f
VPR-63 feat(students): add emergency contact management module
rlorenzo Mar 21, 2026
c7afb8f
VPR-63 feat(students): add admin access controls, exports, and form U…
rlorenzo Mar 31, 2026
af9cb7b
VPR-63 refactor(ui): extract shared ExportToolbar and unify report he…
rlorenzo Mar 31, 2026
1b9fb3e
VPR-63 fix(students): toggle app access via Access column instead of …
rlorenzo Apr 1, 2026
7dda850
VPR-63 fix: address PR review findings — dispose XLWorkbook, fix phon…
rlorenzo Apr 1, 2026
feb806a
VPR-63 fix: remove duplicate scoped .sr-only from ContactSection.vue
rlorenzo Apr 1, 2026
c34b2f8
VPR-63 fix: reset PhoneInput validity on successful validation
rlorenzo Apr 1, 2026
efe0380
VPR-63 refactor: migrate emergency contact banners to StatusBanner co…
rlorenzo Apr 2, 2026
ce48cd5
VPR-63 fix: use ASCII-only digit regex and route SIS users to view page
rlorenzo Apr 2, 2026
596b31a
Merge branch 'VPR-104-accessibility-audit-RAPS' into Development
rlorenzo Apr 2, 2026
9d2398c
VPR-63 fix: add [Required] to nested DTOs in UpdateStudentContactRequest
rlorenzo Apr 2, 2026
734de40
Merge branch 'VPR-63-emergency-contact-info' into Development
rlorenzo Apr 2, 2026
7703476
chore: patch glob, node-forge, serialize-javascript, path-to-regexp v…
rlorenzo Apr 3, 2026
e91303c
Merge branch 'security-package-updates-2026-04-02' into Development
rlorenzo Apr 3, 2026
8931c7e
Merge branch 'security-package-updates-2026-04-02' into Development
rlorenzo Apr 3, 2026
beba52c
Merge branch 'security-package-updates-2026-04-02' into Development
rlorenzo Apr 3, 2026
463e99b
Merge branch 'VPR-104-accessibility-audit-base' into Development
rlorenzo Apr 3, 2026
7a10387
Merge branch 'VPR-104-accessibility-audit-base' into Development
rlorenzo Apr 5, 2026
31f8f10
Merge branch 'VPR-104-accessibility-audit-base' into Development
rlorenzo Apr 6, 2026
939f835
chore(deps): update dev tooling and lint dependencies
rlorenzo Apr 9, 2026
6d49657
Merge branch 'chore/dependabot-updates' into Development
rlorenzo Apr 10, 2026
88340bd
VPR-104 fix(a11y): RAPS area accessibility improvements (PR 2 of 6)
rlorenzo Apr 1, 2026
99e5dca
VPR-104 fix(a11y): safe strict-equality guards in ApplyTemplate
rlorenzo Apr 1, 2026
773e185
VPR-104 fix(a11y): add aria-label to icon-only buttons in RAPS
rlorenzo Apr 1, 2026
59affbb
VPR-104 fix(a11y): fix grammar in RAPS headings
rlorenzo Apr 1, 2026
6fa7b7d
VPR-104 fix(a11y): align RAPS button colors to UC Davis brand palette
rlorenzo Apr 2, 2026
688e93f
VPR-104 fix(a11y): add dialog close buttons, delete confirmations, an…
rlorenzo Apr 2, 2026
a652961
VPR-104 fix(a11y): remove transparent from Delegate badge for contrast
rlorenzo Apr 8, 2026
0b94b1e
VPR-104 fix(a11y): RAPS page titles, column labels, and dialog fixes
rlorenzo Apr 10, 2026
b170f91
Merge branch 'chore/dependabot-updates' into Development
rlorenzo Apr 11, 2026
4d80de5
VPR-104 fix(a11y): RAPS aria labels, target sizing, audit filter chips
rlorenzo Apr 12, 2026
95f538f
VPR-104 fix(a11y): remove double delete confirmation in Role Members
rlorenzo Apr 12, 2026
606f71e
Merge branch 'VPR-104-accessibility-audit-base' into Development
rlorenzo Apr 12, 2026
78ece99
Merge branch 'VPR-104-accessibility-audit-RAPS' into Development
rlorenzo Apr 12, 2026
6678be4
VPR-104 fix(a11y): CTS area accessibility improvements (PR 3 of 6)
rlorenzo Apr 1, 2026
774ae49
fix: address Copilot review feedback on CTS PR
rlorenzo Apr 1, 2026
a05816d
fix: address second round of Copilot review feedback on CTS PR
rlorenzo Apr 1, 2026
feb31f4
VPR-104 fix(a11y): make CTS edit button aria-labels unique per item
rlorenzo Apr 1, 2026
2c540a2
VPR-104 fix(a11y): align CTS button and badge colors to UC Davis bran…
rlorenzo Apr 2, 2026
13d4180
VPR-104 fix(a11y): add dialog close buttons and delete confirmations …
rlorenzo Apr 2, 2026
420ac97
VPR-104 fix(a11y): CTS followup — contrast, banners, broken forms
rlorenzo Apr 7, 2026
ae28f4f
VPR-104 fix(a11y): ManageDomains labels, ManageCompetencies empty state
rlorenzo Apr 8, 2026
d0641c0
VPR-104 fix(a11y): move heading outside q-list to fix aria-required-c…
rlorenzo Apr 8, 2026
f586754
VPR-104 fix(a11y): CTS brand colors, page titles, and UX improvements
rlorenzo Apr 10, 2026
70cb3d9
VPR-104 fix: session timeout, left nav highlighting, and view polish
rlorenzo Apr 12, 2026
3bc3997
Merge branch 'VPR-104-accessibility-audit-RAPS' into Development
rlorenzo Apr 12, 2026
a712ebe
VPR-104 fix(a11y): CTS assessment bubbles, banners, button labels
rlorenzo Apr 12, 2026
846ea51
Merge branch 'VPR-104-accessibility-audit-CTS' into Development
rlorenzo Apr 12, 2026
b4375b6
Merge branch 'VPR-104-accessibility-audit-Effort' into Development
rlorenzo Apr 13, 2026
869affa
Merge branch 'VPR-104-accessibility-audit-Students-Directory' into De…
rlorenzo Apr 13, 2026
5250100
Merge branch 'effort-dup-variable-400' into Development
rlorenzo Apr 16, 2026
4b84299
Merge branch 'VPR-104-accessibility-audit-Students-Directory' into De…
rlorenzo Apr 16, 2026
e24135e
Merge branch 'security-update-vite-8.0.8' into Development
rlorenzo Apr 17, 2026
29ef773
Merge branch 'VPR-104-accessibility-audit-Remaining' into Development
rlorenzo Apr 17, 2026
55c6e1e
Merge branch 'VPR-63-emergency-contact-info' into Development
rlorenzo Apr 18, 2026
9c38f18
Merge branch 'VPR-137-ldap-session-options' into Development
rlorenzo Apr 20, 2026
ab8fd49
Merge branch 'VPR-63-emergency-contact-info' into Development
rlorenzo Apr 20, 2026
32d73d2
Merge branch 'VPR-63-emergency-contact-info' into Development
rlorenzo Apr 21, 2026
b3f3046
Merge branch 'dotnet-10.0.6' into Development
rlorenzo Apr 21, 2026
70f871f
Merge branch 'VPR-137-ldap-session-options' into Development
rlorenzo Apr 21, 2026
07d517f
VPR-142 refactor(cms): consolidate HTML sanitization into shared service
rlorenzo Apr 22, 2026
6315a0c
VPR-142 fix(cms): sanitize without tracking; correct at-rule comment
rlorenzo Apr 22, 2026
e191f21
VPR-142 refactor(cms): sanitize after permission filter
rlorenzo Apr 22, 2026
03f2847
Merge branch 'VPR-142-html-sanitization-consolidation' into Development
rlorenzo Apr 22, 2026
14897b7
Merge branch 'VPR-143-oldURL-fix' into Development
rlorenzo Apr 23, 2026
564094c
Merge branch 'VPR-104-effort-colors' into Development
rlorenzo Apr 25, 2026
e0cfeba
Merge branch 'VPR-104-effort-colors' into Development
rlorenzo Apr 25, 2026
a64cdee
Merge branch 'VPR-104-effort-colors' into Development
rlorenzo Apr 27, 2026
77f2c9f
VPR-141 feat(healthchecks): add /health endpoints and UI dashboard
rlorenzo Apr 27, 2026
c3b7542
Merge branch 'VPR-141-health-check' into Development
rlorenzo Apr 28, 2026
daef548
VPR-104 fix(a11y): redesign MyAssessments and AssessmentBubble
rlorenzo Apr 20, 2026
9c92454
VPR-141 fix(healthchecks): swap dead infra /24 for campus VPN /24
rlorenzo Apr 28, 2026
8bd50c3
Merge branch 'VPR-141-health-check' into Development
rlorenzo Apr 28, 2026
4ab9f46
VPR-141 chore(healthchecks): log IP gate decisions for debugging
rlorenzo Apr 28, 2026
1516cc1
Merge branch 'VPR-141-health-check' into Development
rlorenzo Apr 28, 2026
864b4a4
VPR-141 chore(healthchecks): drop IP gate + inject debug banner
rlorenzo Apr 28, 2026
4c9b521
Merge branch 'VPR-141-health-check' into Development
rlorenzo Apr 28, 2026
462496d
VPR-141 fix(security): trust Cloudflare for X-Forwarded-For
rlorenzo Apr 29, 2026
242d408
VPR-104 feat(cts): add 5 MyAssessments display styles for review
rlorenzo Apr 29, 2026
aa83668
Merge branch 'VPR-104-accessibility-audit-CTS-myassessments' into Dev…
rlorenzo Apr 29, 2026
def468e
Merge branch 'VPR-141-health-check' into Development
rlorenzo Apr 29, 2026
1e4971f
Merge remote-tracking branch 'origin/Development' into Development
rlorenzo Apr 29, 2026
7bf0514
VPR-141 chore(healthchecks): add anonymous /health/whoami debug endpoint
rlorenzo Apr 29, 2026
dafbf0d
VPR-141 fix(security): populate both KnownNetworks lists for CF
rlorenzo Apr 29, 2026
860f8c5
Merge branch 'VPR-141-health-check' into Development
rlorenzo Apr 29, 2026
133bd46
VPR-141 fix(security): override RemoteIp from CF-Connecting-IP
rlorenzo Apr 29, 2026
0fa866c
Merge branch 'VPR-141-health-check' into Development
rlorenzo Apr 29, 2026
3b329ba
VPR-141 fix(security): run CF override outside dev guard
rlorenzo Apr 29, 2026
19c1892
Merge branch 'VPR-141-health-check' into Development
rlorenzo Apr 29, 2026
4699a14
VPR-141 chore(security): emit CF override diagnostics on response
rlorenzo Apr 29, 2026
25795d4
Merge branch 'VPR-141-health-check' into Development
rlorenzo Apr 29, 2026
1058a5c
VPR-141 fix(security): bump ForwardLimit to 2 for CF + F5 chain
rlorenzo Apr 29, 2026
96a4877
Merge branch 'VPR-141-health-check' into Development
rlorenzo Apr 29, 2026
01e5b82
VPR-141 chore(healthchecks): remove /health/whoami debug endpoint
rlorenzo Apr 29, 2026
e2e1665
VPR-141 fix(security): trust Cloudflare for X-Forwarded-For
rlorenzo Apr 30, 2026
c5ff681
Merge branch 'VPR-139-ldap-filter-escaping' into Development
rlorenzo Apr 30, 2026
afbd20a
Merge branch 'VPR-139-ldap-filter-escaping' into Development
rlorenzo May 1, 2026
5243726
Merge branch 'VPR-139-ldap-filter-escaping' into Development
rlorenzo May 1, 2026
1c17416
Merge branch 'VPR-80-updating-minweek-logic' into Development
bsedwards May 1, 2026
23fcaa1
VPR-141 fix(healthchecks): scope allowlist, use localhost for UI poll
rlorenzo May 1, 2026
2aa4432
Merge branch 'VPR-141-health-check' into Development
rlorenzo May 1, 2026
704cf03
Merge branch 'VPR-80-updating-minweek-logic' into Development
bsedwards May 1, 2026
a109c2d
VPR-141 fix(healthchecks): revert UI poll to BaseUrl, restore SVM /24
rlorenzo May 1, 2026
01ed488
Merge branch 'VPR-141-health-check' into Development
rlorenzo May 1, 2026
a83c9f1
VPR-141 fix(healthchecks): bypass IP filter for collector via process…
rlorenzo May 1, 2026
e2e6d15
Merge branch 'VPR-141-health-check' into Development
rlorenzo May 1, 2026
ba670d9
VPR-141 fix(security): trust Cloudflare for X-Forwarded-For
rlorenzo Apr 30, 2026
b8de30c
VPR-141 feat(healthchecks): add /health endpoints and UI dashboard
rlorenzo May 4, 2026
e72d693
Merge branch 'dependabot/npm_and_yarn/VueApp/npm-vueapp-b512b27c30' i…
rlorenzo May 4, 2026
d4a1c17
Merge branch 'VPR-141-health-check' into Development
rlorenzo May 4, 2026
7b881f4
Merge branch 'chore/dotnet-deps-bump' into Development
rlorenzo May 4, 2026
0af9e9c
VPR-141 fix(security): trust Cloudflare for X-Forwarded-For
rlorenzo Apr 30, 2026
f347ad2
Merge branch 'tools/fallow-jscpd' into Development
rlorenzo May 5, 2026
ab04023
VPR-141 feat(healthchecks): add /health endpoints and UI dashboard
rlorenzo May 5, 2026
6f81c7b
Merge branch 'VPR-141-health-check' into Development
rlorenzo May 5, 2026
f632f53
Merge branch 'tools/codeql-roslyn-sonar-resharper' into Development
rlorenzo May 5, 2026
7aacfe6
chore(jobs): remove unused Quartz POC
rlorenzo May 5, 2026
ccb5f00
VPR-141 fix(security): trust Cloudflare for X-Forwarded-For
rlorenzo Apr 30, 2026
7d22f24
VPR-141 feat(healthchecks): add /health endpoints and UI dashboard
rlorenzo May 5, 2026
37a7f95
VPR-141 chore(healthchecks): fix ReSharper findings
rlorenzo May 6, 2026
78af0e7
Merge branch 'VPR-141-health-check' into Development
rlorenzo May 6, 2026
64e16bb
VPR-141 chore(healthchecks): address review feedback
rlorenzo May 6, 2026
7482ca9
Merge branch 'VPR-141-health-check' into Development
rlorenzo May 6, 2026
947d29f
chore(config): restore staff names in InternalAllowlist comments
rlorenzo May 6, 2026
91ff070
VPR-157 feat(a11y): add Word, PDF, and Excel accessibility helpers
rlorenzo May 7, 2026
18c59c5
VPR-157 feat(a11y): tag Photo Gallery and Emergency Contact exports
rlorenzo May 7, 2026
70367b2
VPR-157 feat(a11y): tag Effort report exports for accessibility
rlorenzo May 7, 2026
32570dd
VPR-157 feat(reports): open report PDFs inline + UX polish
rlorenzo May 7, 2026
4369708
Merge branch 'VPR-157-accessible-word-pdf-export' into Development
rlorenzo May 7, 2026
c5f9bf4
VPR-104 fix(a11y): redesign MyAssessments and AssessmentBubble
rlorenzo Apr 20, 2026
43056bc
VPR-104 feat(cts): add 5 MyAssessments display styles for review
rlorenzo Apr 29, 2026
7fddcb5
VPR-104 feat(cts): refine MyAssessments timeline view
rlorenzo May 7, 2026
f4e6377
Merge branch 'VPR-104-accessibility-audit-CTS-myassessments' into Dev…
rlorenzo May 7, 2026
b96e286
VPR-104 fix(cts): show MyAssessments timeline chart above comments on…
rlorenzo May 7, 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
160 changes: 160 additions & 0 deletions VueApp/src/CTS/__tests__/assessment-bubble.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
import { mount } from "@vue/test-utils"
import { Quasar } from "quasar"

import AssessmentBubble from "../components/AssessmentBubble.vue"

/**
* Tests for AssessmentBubble — the rating dot rendered on CTS assessment lists.
*
* Focus areas:
* 1. Privacy: aria-label must surface the descriptive rating label, never the
* numeric value. Students should not hear "Rating 1 of 5" from a screen
* reader when they are low-rated.
* 2. Class mapping: value/maxValue drive the bubbleClass contract consumed
* by cts.css.
* 3. Click contract: clickable variant (id prop set) emits bubble-click with
* the id; non-clickable variant renders as a non-interactive span.
*/

function createWrapper(props: Record<string, unknown>) {
return mount(AssessmentBubble, {
props: props as never,
global: {
plugins: [[Quasar, {}]],
},
})
}

describe(AssessmentBubble, () => {
describe("aria-label privacy", () => {
it("uses levelName on the clickable button and does not expose the numeric value", () => {
const wrapper = createWrapper({
maxValue: 5,
value: 1,
levelName: "Trust with indirect supervision",
id: 42,
})

const label = wrapper.get("button").attributes("aria-label")!
expect(label).toContain("Trust with indirect supervision")
expect(label).not.toMatch(/\b1 of 5\b/i)
expect(label).not.toMatch(/rating\s+\d/i)
})

it("uses levelName on the standalone span and does not expose the numeric value", () => {
const wrapper = createWrapper({
maxValue: 5,
value: 2,
levelName: "Trust with direct supervision",
})

const label = wrapper.get('span[role="img"]').attributes("aria-label")!
expect(label).toBe("Trust with direct supervision")
expect(label).not.toMatch(/\b2 of 5\b/i)
})
Comment on lines +44 to +54
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

No test for the accessibility edge case: span variant with missing/empty levelName.

The existing aria-label privacy suite covers a levelName-present span, but the component's default of levelName: "" produces aria-label="" on role="img" — a real a11y gap that is currently undetected by the suite.

✅ Proposed additional test
+        it("renders aria-hidden when levelName is absent on the standalone span", () => {
+            const wrapper = createWrapper({
+                maxValue: 5,
+                value: 2,
+                // levelName intentionally omitted — defaults to ""
+            })
+
+            const span = wrapper.get('span[role="img"]')
+            // Must not leave role="img" with an empty accessible name
+            expect(span.attributes("aria-label") ?? "").toBe("")
+            // Confirm the fix: element should be decorative when no name is available
+            expect(span.attributes("aria-hidden")).toBe("true")
+        })
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@VueApp/src/CTS/__tests__/assessment-bubble.test.ts` around lines 44 - 54, Add
a new test in assessment-bubble.test.ts that covers the accessibility edge case
where levelName is empty or omitted: use createWrapper with maxValue and value
(e.g., maxValue: 5, value: 2) and set levelName: "" (and optionally another case
with levelName undefined) and assert that the span[role="img"] aria-label is not
an empty string and instead contains the numeric fallback (match /\b2 of 5\b/i);
name the test to describe the edge case (e.g., "falls back to numeric label when
levelName is empty") and mirror the style of the existing tests so it fails if
component produces aria-label="".


it("appends open-details hint on the clickable variant", () => {
const wrapper = createWrapper({
maxValue: 5,
value: 3,
levelName: "Independent remote supervision",
id: 7,
})

expect(wrapper.get("button").attributes("aria-label")).toBe(
"Independent remote supervision, open assessment details",
)
})

it("falls back to a generic hint when levelName is missing on a clickable bubble", () => {
const wrapper = createWrapper({
maxValue: 5,
value: 3,
id: 7,
})

expect(wrapper.get("button").attributes("aria-label")).toBe("Open assessment details")
})
})

describe("bubbleClass contract", () => {
it.each([
[1, "assessmentBubble5_1"],
[2, "assessmentBubble5_2"],
[3, "assessmentBubble5_3"],
[4, "assessmentBubble5_4"],
[5, "assessmentBubble5_5"],
])("maps value=%i to %s", (value, expected) => {
const wrapper = createWrapper({
maxValue: 5,
value,
levelName: "Label",
})

expect(wrapper.get('span[role="img"]').classes()).toContain(expected)
})

it.each([0, 6])("yields no level class for out-of-range value=%i", (value) => {
const wrapper = createWrapper({
maxValue: 5,
value,
levelName: "Label",
})

const classes = wrapper.get('span[role="img"]').classes()
expect(classes.some((c) => c.startsWith("assessmentBubble5_"))).toBeFalsy()
})

it("yields no level class when maxValue is not 5", () => {
const wrapper = createWrapper({
maxValue: 3,
value: 2,
levelName: "Label",
})

const classes = wrapper.get('span[role="img"]').classes()
expect(classes.some((c) => c.startsWith("assessmentBubble5_"))).toBeFalsy()
})
})

describe("click behaviour", () => {
it("renders a button and emits bubble-click with the id when clicked", async () => {
const wrapper = createWrapper({
maxValue: 5,
value: 3,
levelName: "Label",
id: 99,
})

await wrapper.get("button").trigger("click")

expect(wrapper.emitted("bubble-click")).toEqual([[99]])
})

it("renders a non-interactive span and does not emit when id is omitted", () => {
const wrapper = createWrapper({
maxValue: 5,
value: 3,
levelName: "Label",
})

expect(wrapper.find("button").exists()).toBeFalsy()
expect(wrapper.find('span[role="img"]').exists()).toBeTruthy()
expect(wrapper.emitted("bubble-click")).toBeUndefined()
})
})

describe("bubble content", () => {
it("does not render the numeric value inside the bubble", () => {
const wrapper = createWrapper({
maxValue: 5,
value: 4,
levelName: "Label",
id: 1,
})

const bubble = wrapper.get("span.assessmentBubble")
expect(bubble.text()).toBe("")
})
})
})
Loading
Loading