VPR-63 Emergency Contact Info#139
VPR-63 Emergency Contact Info#139rlorenzo wants to merge 12 commits intoVPR-104-accessibility-audit-basefrom
Conversation
There was a problem hiding this comment.
Pull request overview
Adds the new Students-area “Emergency Contact Info” feature end-to-end (API + EF entities + Vue pages), and refactors shared report/export UI to reduce duplication across multiple Effort reports and Photo Gallery.
Changes:
- Implemented backend emergency contact domain (EF entities, mapping, service layer, API controller) with permission-based access and exports (Excel/PDF/CSV-like via Excel/QuestPDF).
- Added full Vue UI for emergency contacts (overview list, edit form, read-only view, report) with phone validation and completeness indicators.
- Refactored shared UI: introduced
ExportToolbar, standardized report headers viaReportLayout, and extracted shared compact form CSS.
Reviewed changes
Copilot reviewed 58 out of 58 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| web/Classes/SQLContext/SISContext.cs | Adds EF DbSets + mappings for student contact/emergency contact tables. |
| web/Areas/Students/Services/PhoneHelper.cs | Adds server-side phone normalize/format/validate utilities. |
| web/Areas/Students/Services/IEmergencyContactService.cs | Defines emergency contact service contract. |
| web/Areas/Students/Services/EmergencyContactService.cs | Implements core emergency contact logic, completeness, and access toggles. |
| web/Areas/Students/Services/EmergencyContactExportService.cs | Generates Excel/PDF exports for overview and detailed report. |
| web/Areas/Students/Models/UpdateStudentContactRequest.cs | Request DTO for updates. |
| web/Areas/Students/Models/StudentInfoDto.cs | Student info DTO. |
| web/Areas/Students/Models/StudentContactReportDto.cs | Report DTO for exports/report page. |
| web/Areas/Students/Models/StudentContactListItemDto.cs | Overview/list DTO including completeness status. |
| web/Areas/Students/Models/StudentContactDetailDto.cs | Detail DTO for view/edit pages. |
| web/Areas/Students/Models/Entities/StudentEmergencyContact.cs | EF entity for emergency contact row. |
| web/Areas/Students/Models/Entities/StudentContact.cs | EF entity for student contact row + navigation. |
| web/Areas/Students/Models/EmergencyContactMapper.cs | Mapperly-based mapping + phone formatting/normalization wiring. |
| web/Areas/Students/Models/ContactInfoDto.cs | Contact info DTO with email normalization/validation attribute. |
| web/Areas/Students/Models/AppAccessStatusDto.cs | DTOs for app open/closed + individual grants. |
| web/Areas/Students/Controllers/EmergencyContactController.cs | API endpoints for CRUD-ish operations, access toggles, and exports. |
| web/Areas/Students/Constants/EmergencyContactPermissions.cs | Centralizes permission strings/role name. |
| web/Areas/RAPS/Services/RAPSAuditService.cs | Adds injectable IUserHelper constructor overload for auditing. |
| VueApp/src/styles/compact-form.css | New shared compact form styling for Quasar inputs/errors. |
| VueApp/src/styles/base.css | Extends heading styles to include h1 in dialogs/page containers. |
| VueApp/src/Students/router/routes.ts | Adds Students emergency contact routes + routing guards. |
| VueApp/src/Students/router/index.ts | Enforces per-route meta.permissions in global guard. |
| VueApp/src/Students/pages/PhotoGallery.vue | Replaces duplicated export UI with shared ExportToolbar. |
| VueApp/src/Students/EmergencyContact/utils/phone.ts | Client-side phone digit/format/validate helpers. |
| VueApp/src/Students/EmergencyContact/utils/phone-errors-key.ts | Injection key for shared phone error tracking. |
| VueApp/src/Students/EmergencyContact/types/index.ts | TypeScript types for emergency contact feature. |
| VueApp/src/Students/EmergencyContact/services/emergency-contact-service.ts | Frontend API client for emergency contact endpoints + exports. |
| VueApp/src/Students/EmergencyContact/pages/EmergencyContactView.vue | Read-only detail page. |
| VueApp/src/Students/EmergencyContact/pages/EmergencyContactReport.vue | Admin/SIS report table with exports + search. |
| VueApp/src/Students/EmergencyContact/pages/EmergencyContactList.vue | Overview list with completeness indicators + access icons. |
| VueApp/src/Students/EmergencyContact/pages/EmergencyContactForm.vue | Edit form with validation, warnings, and access controls. |
| VueApp/src/Students/EmergencyContact/composables/use-emergency-contact.ts | Composable for state, dirty tracking, validation, save/load. |
| VueApp/src/Students/EmergencyContact/components/PhoneInput.vue | Quasar-integrated phone input with mask + shared error tracking. |
| VueApp/src/Students/EmergencyContact/components/ContactSection.vue | Reusable contact section (name/relationship/phones/email). |
| VueApp/src/Students/EmergencyContact/components/CompletenessIcon.vue | Completeness indicator icon with tooltip/ARIA label. |
| VueApp/src/Students/EmergencyContact/components/AppAccessControls.vue | Admin widget to toggle app open/closed and show grant counts. |
| VueApp/src/Students/EmergencyContact/tests/use-emergency-contact.test.ts | Vitest coverage for completeness utility logic. |
| VueApp/src/Students/EmergencyContact/tests/emergency-contact-service.test.ts | Vitest coverage for frontend API client behavior. |
| VueApp/src/Students/EmergencyContact/tests/contact-section.test.ts | Logic-only tests for contact-section behavior assumptions. |
| VueApp/src/Students/EmergencyContact/tests/completeness-icon.test.ts | Logic-only tests for completeness icon state selection. |
| VueApp/src/Effort/pages/TeachingActivityIndividual.vue | Uses ReportLayout header slot + ExportToolbar. |
| VueApp/src/Effort/pages/TeachingActivityGrouped.vue | Uses ReportLayout header slot + ExportToolbar. |
| VueApp/src/Effort/pages/SchoolSummary.vue | Uses ExportToolbar; adds horizontal overflow for dept section. |
| VueApp/src/Effort/pages/ScheduledCliWeeks.vue | Uses ExportToolbar; refines banner/header layout. |
| VueApp/src/Effort/pages/MultiYearReport.vue | Uses ReportLayout header slot + ExportToolbar. |
| VueApp/src/Effort/pages/MeritSummary.vue | Uses ReportLayout header slot + ExportToolbar. |
| VueApp/src/Effort/pages/MeritDetail.vue | Uses ReportLayout header slot + ExportToolbar. |
| VueApp/src/Effort/pages/MeritAverage.vue | Uses ReportLayout header slot + ExportToolbar. |
| VueApp/src/Effort/pages/EvalSummary.vue | Uses ReportLayout header slot + ExportToolbar. |
| VueApp/src/Effort/pages/EvalDetail.vue | Uses ReportLayout header slot + ExportToolbar. |
| VueApp/src/Effort/pages/DeptSummary.vue | Uses ReportLayout header slot + ExportToolbar. |
| VueApp/src/Effort/pages/ClinicalEffort.vue | Uses ReportLayout header slot + ExportToolbar. |
| VueApp/src/Effort/effort-forms.css | Imports shared compact form CSS; removes duplicated styles. |
| VueApp/src/Effort/components/ReportLayout.vue | Standardizes header wrapper and improves print page-break behavior. |
| VueApp/src/components/ExportToolbar.vue | New shared export/search/route toolbar component. |
| VueApp/src/ClinicalScheduler/pages/ClinicalSchedulerHome.vue | Adjusts heading markup to align with shared heading styles. |
| test/Students/EmergencyContactServiceTests.cs | Adds extensive backend unit tests for service behavior. |
| test/Students/EmergencyContactControllerTests.cs | Adds controller tests for permissions/results/exports. |
VueApp/src/Students/EmergencyContact/pages/EmergencyContactForm.vue
Outdated
Show resolved
Hide resolved
VueApp/src/Students/EmergencyContact/components/ContactSection.vue
Outdated
Show resolved
Hide resolved
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #139 +/- ##
==========================================
+ Coverage 42.66% 43.34% +0.67%
==========================================
Files 802 818 +16
Lines 48448 49644 +1196
Branches 4446 4568 +122
==========================================
+ Hits 20672 21517 +845
- Misses 27285 27606 +321
- Partials 491 521 +30
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. |
Bundle ReportChanges will increase total bundle size by 45.09kB (1.95%) ⬆️. This is within the configured threshold ✅ Detailed changes
Affected Assets, Files, and Routes:view changes for bundle: viper-frontend-esmAssets Changed:
Files in
Files in
Files in
Files in
Files in
Files in
Files in
Files in
Files in
Files in
Files in
Files in
Files in
Files in
Files in
Files in
Files in
Files in
Files in
|
5da45e3 to
31fe2ec
Compare
d61686c to
c34b2f8
Compare
VueApp/src/Students/EmergencyContact/pages/EmergencyContactList.vue
Outdated
Show resolved
Hide resolved
VueApp/src/Students/EmergencyContact/composables/use-emergency-contact.ts
Show resolved
Hide resolved
VueApp/src/Students/EmergencyContact/composables/use-emergency-contact.ts
Show resolved
Hide resolved
9d2398c to
1d136ac
Compare
VueApp/src/Students/EmergencyContact/__tests__/completeness-icon.test.ts
Show resolved
Hide resolved
9dde9d5 to
1672288
Compare
- Full CRUD with list, edit form, read-only view, and report pages - Backend service with EF Core entities, Mapperly DTOs, and Excel/CSV export - Permission-based routing: admins see student list, students redirect to own record - Frontend and backend test coverage for controller, service, composable, and components
…X improvements - Admin badge shows student editing status (open/closed/individually allowed) - Admin can grant/revoke individual edit access from the form page - Save button always enabled; shows info notification when no changes - New overview export (Excel + PDF) with completeness summary - Completeness logic groups phone fields (any phone = complete) - DTOs expanded with missing field details, row keys, and contact info
…aders - Replace duplicated export buttons across 12 Effort reports, Emergency Contact, and Photo Gallery with a shared ExportToolbar component - Move export controls into ReportLayout header slot with report titles for consistent layout across all report pages - ReportLayout header conditionally renders via v-if="$slots.header"
…row deletion - Flip Access between 0/1 instead of deleting/creating role-permission rows, preserving audit trail and avoiding orphaned state - Extract shared compact-form.css from duplicate styles in effort and emergency contact forms - Add phone validation error tracking via provide/inject to block save - Expand test coverage: toggle, CanEdit, GetAccessStatus, exports
…e whitespace, remove dup CSS, add aria-label
- set isValid=true on success path to clear stale error state - update rawDigits so injected phoneErrors Set stays in sync
- PhoneHelper: change \D to [^0-9] so Unicode digits are stripped, matching the frontend's ASCII-only behavior - EmergencyContactList: route non-admin (SIS) users to the read-only view page instead of the edit page they can't access
- PDF: Adobe Red (#b30b00) - Excel: Excel Green (#217346) - Word: MS Word Blue (#2b579a) - Print: UC Davis Primary (var(--q-primary))
43eb031 to
60927b6
Compare
- Replace <q-page padding> with <div class="q-pa-md">. QPage hardcodes role=main, which created a duplicate landmark alongside the layout's own <main id="main-content"> wrapper. - Change the page title from <div class="text-h5"> to <h1>. The page had no level-one heading; the visual typography is preserved via the existing text-h5 class.
Emergency Contact
StudentContact,StudentEmergencyContact), Mapperly DTOs, service layer withIEmergencyContactServiceAccesscolumn (0/1) instead of row deletion, preserving audit trailShared UI Refactors
ExportToolbarcomponent — replaces duplicated export buttons across 12 Effort reports, Emergency Contact, and Photo GalleryReportLayoutheader slotcompact-form.cssfrom duplicate styles in Effort and Emergency Contact formsTest Coverage
EmergencyContactControllerTests,EmergencyContactServiceTestsCompletenessIcon, andContactSectioncomponentsDatabase Change Steps