Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
348 commits
Select commit Hold shift + click to select a range
866eefa
Fix issue Consortia root account unable to see Front Page content whe…
suhaibabsi-inst Feb 3, 2025
0d88e83
Fix html content loading (#3103)
vargaat Feb 3, 2025
efbfbee
Accessibility - Calendar - Add accessibilityValue to "Show a month at…
ndrsszsz Feb 3, 2025
72164fb
Parent - TeacherChat - EditRecipients - set accessibilityTraits of Re…
ndrsszsz Feb 4, 2025
27f97ae
Use web based new discussion page (#3099)
vargaat Feb 4, 2025
3cda980
Fixes issue where Files are not showing for user of Consortia root ac…
suhaibabsi-inst Feb 4, 2025
2b899d7
Parent - Grade List - Section header button trait (#3115)
ndrsszsz Feb 7, 2025
a1a78a9
Parent - Manage Students - Student name as header (#3114)
ndrsszsz Feb 7, 2025
0d937f8
Fix student e2e tests (#3112)
vargaat Feb 10, 2025
a319ba5
Improve test coverage (#3119)
vargaat Feb 10, 2025
6a4c818
Parent - TeacherChat - Compose screen - add accessibilityHint to inpu…
ndrsszsz Feb 10, 2025
eeb73d7
Update translations (#3122)
inst-danger Feb 11, 2025
2e86802
Parent - Chat - EditComposeRecipients - title label as header (#3124)
ndrsszsz Feb 11, 2025
c90d50e
Fix Consortia root account issue where Studio Embedded Videos not sho…
suhaibabsi-inst Feb 11, 2025
c65c656
File share submission fails after user change (#3117)
rh12 Feb 11, 2025
16d867e
Accessibility - Parent - Dashboard - Dropdown button accessibility (#…
ndrsszsz Feb 11, 2025
34d698d
Accessibility - Student - AssignmentDetails - Attempts date button tr…
ndrsszsz Feb 11, 2025
7a9e15a
Fix flaky unit tests. (#3126)
vargaat Feb 11, 2025
d9a1a41
Accessibility - Teacher - Submission - Grades - Add header trait to "…
ndrsszsz Feb 11, 2025
b2d58fb
Improve Assignments screen a11y (#3132)
rh12 Feb 11, 2025
9f35cc8
Fix teacher e2e tests (#3121)
vargaat Feb 11, 2025
8e84b72
Accessibility - Parent - Course List - Button trait for cells (#3134)
ndrsszsz Feb 12, 2025
c2a66b8
Accessibility - Student - GradeList - Section header to contain list …
ndrsszsz Feb 13, 2025
937c557
Add title to media attachment type picker. (#3142)
vargaat Feb 13, 2025
4590871
Accessibility - Teacher - Submissions List - Add explicit traits (#3140)
vargaat Feb 13, 2025
6e77646
Accessibility - Student/Teacher - ProfileMenu Settings headers and li…
rh12 Feb 14, 2025
3b26656
Accessibility - All Apps - Menu Button - Add closed state (#3139)
vargaat Feb 14, 2025
5c30247
Accessibility - Parent - Course Details - Remove heading trait from c…
vargaat Feb 14, 2025
b231849
Accessibility - Teacher - Add send action announcements to SpeedGrade…
vargaat Feb 14, 2025
06e2a55
Accessibility - Teacher/Student - Add discussion save announcement (#…
vargaat Feb 14, 2025
40802c2
Accessibility - Student - Announce recipient removal (#3154)
vargaat Feb 14, 2025
f086ae0
Increase all test expectation timeouts. (#3136)
vargaat Feb 14, 2025
a5f2cba
Open native speedgrader from web discussion (#3131)
vargaat Feb 14, 2025
fbd5245
Accessibility - Calendar - Focus on Events List when Day button activ…
suhaibabsi-inst Feb 17, 2025
6cbfcc5
Accessibility - Student/Teacher - Calendar - Event Added Announcement…
suhaibabsi-inst Feb 17, 2025
051ae61
Accessibility - Student - Submissions - Announce successful comment s…
vargaat Feb 17, 2025
848c794
Accessibility - Student /Teacher - Typeahead Suggestions for Message …
suhaibabsi-inst Feb 17, 2025
cc24038
Accessibility - Add number of items to a11y label in AssignmentList s…
rh12 Feb 17, 2025
91e409d
Accessibility - Improve a11y of Speedgrader Grades-Comments-Files tab…
rh12 Feb 17, 2025
df42551
Accessibility - Student - Lists Count Announcement For Offline Conten…
suhaibabsi-inst Feb 17, 2025
1ccddbb
Accessibility - Student/Parent - Add grade list filter change announc…
vargaat Feb 18, 2025
eaa18ab
Add expanded state value to student switcher button. (#3141)
vargaat Feb 18, 2025
4dcdf4d
Accessibility - Student - Focus voiceover on sync progress card (#3153)
vargaat Feb 18, 2025
93b2773
Fixes Accessibility Focus Order of Recipients Field of Parent's Compo…
suhaibabsi-inst Feb 18, 2025
ff1903d
Accessibility - Student - SubmissionDetails - Set VoiceOver focus on …
ndrsszsz Feb 18, 2025
5181f50
Accessibility - Inbox Recipients list count (#3169)
rh12 Feb 18, 2025
c6498e6
Fix the issue of detail view of SplitViewController when switching ou…
suhaibabsi-inst Feb 19, 2025
f4dfd98
Fix long press on rubric (#3138)
vargaat Feb 19, 2025
26e1ca0
Unify Navigation bar titles (#3129)
rh12 Feb 19, 2025
546cb7f
Move Focus to Student Avatar on Switching to Tab (#3172)
suhaibabsi-inst Feb 19, 2025
d6ac30a
Accessibility - Parent - Move focus to percent label when Grades tab …
suhaibabsi-inst Feb 20, 2025
1c19beb
Accessibility - Chat/Inbox - Add title to attachment picker (#3155)
ndrsszsz Feb 20, 2025
054a9ff
Always enable Grades and Discussions tab links (#3173)
rh12 Feb 21, 2025
578d42d
Add grouping labels to inbox compose screen course selector (#3170)
petkybenedek Feb 21, 2025
12406c9
Accessibility - Fix Student Annotation status message a11y traits (#3…
rh12 Feb 24, 2025
43355bf
Accessibility - Student/Teacher - To Do Added Announcement (#3165)
suhaibabsi-inst Feb 24, 2025
e0ad244
Update GraphQL Queries with Pagination (#3064)
suhaibabsi-inst Feb 24, 2025
285c817
Update translations (#3184)
inst-danger Feb 24, 2025
02fbab8
Accessibility - Teacher - Calendar - Today button should have the dat…
ndrsszsz Feb 24, 2025
2adf65c
Enable parent landscape mode (#3176)
vargaat Feb 25, 2025
92de4c5
Rename institution announcements to global announcements (#3187)
balintbartok Feb 27, 2025
7684d72
Accessibility - Calendar - Day button to have weekday in label (#3185)
ndrsszsz Feb 27, 2025
adc16c0
Accessibility - DatePickerCell (#3191)
rh12 Feb 28, 2025
3834075
Fix Navigation Bar issues (#3194)
rh12 Feb 28, 2025
8b1dd82
Update translations (#3199)
inst-danger Mar 3, 2025
b6fc909
Fix Dashboard crashes on iOS 17 (#3198)
rh12 Mar 3, 2025
6a9a39c
Parent Inbox implementation (#3174)
domonkosadam Mar 3, 2025
4fbd63b
Improve grade screen performance (#3195)
vargaat Mar 3, 2025
42d5097
Dark app icons (#3192)
petkybenedek Mar 3, 2025
f83d320
Improve release notes generation (#3200)
rh12 Mar 3, 2025
a54255d
New new dark colors (#3190)
ndrsszsz Mar 3, 2025
640b4a4
Accessible toggles (#3188)
vargaat Mar 3, 2025
2442f0b
Fix issue where Studio videos not playing properly on offline mode (#…
suhaibabsi-inst Mar 3, 2025
76cb0a7
Fix adding Fix versions (#3202)
rh12 Mar 4, 2025
d579998
New App Store icons (#3208)
petkybenedek Mar 5, 2025
33a8e79
Update translations (#3223)
inst-danger Mar 10, 2025
f1ff154
Accessibility - Student/Teacher - Refocus VoiceOver to DatePicker aft…
suhaibabsi-inst Mar 10, 2025
92ec78c
Ignore non tested entities (#3201)
vargaat Mar 10, 2025
34e9a6d
Update flaky tests. (#3219)
vargaat Mar 10, 2025
29632af
Fix AnnouncementDetails showing DiscussionDetails by default on iPad …
ndrsszsz Mar 10, 2025
432c89f
Fix edit button disappearing on syllabus (#3212)
balintbartok Mar 10, 2025
b904f0d
Unify SwiftUI disclosure indicators. (#3220)
vargaat Mar 10, 2025
8787be2
Accessibility - Add focus activation after tab is activated in SpeedG…
vargaat Mar 10, 2025
b9e9a79
Fix the issue of Assignments on Root account not showing when opened …
suhaibabsi-inst Mar 11, 2025
540106c
Fix SwiftLint (#3210)
petkybenedek Mar 11, 2025
c2c942c
Accessibility - Add support for webviews to change their font size ba…
vargaat Mar 11, 2025
57191da
Update UIKit based disclosure indicators (#3227)
vargaat Mar 11, 2025
13f9adb
Remove ObjC bridging headers from Core and TestsFoundations projects …
vargaat Mar 11, 2025
15d1571
Accessibility - Student - Submission Attempt Picker (#3228)
rh12 Mar 12, 2025
debd241
Accessibility - Parent - ManageStudents - textDark for placeholder co…
ndrsszsz Mar 13, 2025
619212a
Accessibility - Fix Submission Details Selected Tab Color For Better …
suhaibabsi-inst Mar 13, 2025
3a8dbf5
Fix issue of Root Account unable to access Child PDFs for annotation …
suhaibabsi-inst Mar 13, 2025
27054aa
Fix issue of a Masquerading user unable to pick files for assignment …
suhaibabsi-inst Mar 13, 2025
ab11439
Accessibility - Search text field background color (#3233)
ndrsszsz Mar 14, 2025
8593849
Accessibility - Student - Announce Assignment Submission Status (#3175)
suhaibabsi-inst Mar 17, 2025
43e209a
Accessibility - Teacher - ComposeMessageView - Placeholder text of "A…
ndrsszsz Mar 17, 2025
adc04e2
Update translations (#3244)
inst-danger Mar 17, 2025
6706614
Update E2E tests (#3229)
vargaat Mar 17, 2025
5ec8174
Fix missing imports (#3246)
vargaat Mar 17, 2025
2500543
Fix Calendar Event start & end time calculation (#3253)
rh12 Mar 19, 2025
004bd3f
Accessibility - Submission comments (#3249)
rh12 Mar 19, 2025
4be2c25
Fix flaky test (#3255)
vargaat Mar 20, 2025
48b6de8
Increase minimum iOS version to 17 (#3206)
ndrsszsz Mar 20, 2025
8141e96
Inbox message can display on incorrect day on Notifications page when…
petkybenedek Mar 24, 2025
8c6ea53
Update translations (#3263)
inst-danger Mar 24, 2025
8762f7f
Parent inbox picker distinct items (#3260)
domonkosadam Mar 24, 2025
b33ba2a
Handle expired tokens (#3254)
vargaat Mar 24, 2025
7f311bc
Update dark modeCSS for discussions (#3257)
vargaat Mar 24, 2025
0d020f2
Add signature setting (#3197)
domonkosadam Mar 24, 2025
9b08489
Fix parent recipient selector having undefined order (#3267)
domonkosadam Mar 24, 2025
304ffeb
LTIViewController - Rearrange views to make Open Button easily reacha…
ndrsszsz Mar 25, 2025
ebb78de
Student - AssignmentList - Use GradeFormatter for displaying grades (…
ndrsszsz Mar 25, 2025
0707802
Add snackbar to parent app. Make snack handling easier in inbox code.…
vargaat Mar 25, 2025
5fd045c
Show Grades' total score in points when points-based grading scheme a…
suhaibabsi-inst Mar 25, 2025
83be335
Fix issue of inaccessible Media Files attachments of Discussions (#3245)
suhaibabsi-inst Mar 25, 2025
91f42ef
Parent settings screen (#3211)
domonkosadam Mar 26, 2025
e17aac4
Pendo Analytics (#3250)
szabinst Mar 26, 2025
b839d45
Move GradingScheme types to separate files (#3270)
suhaibabsi-inst Mar 26, 2025
80b6a8d
Remove GitHub link from Settings (#3272)
rh12 Mar 26, 2025
db9e89c
Fix Pendo setup crash (#3271)
rh12 Mar 27, 2025
fa05c59
Fix Pendo dependency (#3273)
vargaat Mar 27, 2025
1a51227
Student - K5 courses shows hidden tabs (#3274)
ndrsszsz Mar 28, 2025
0380cdb
Make error check more readable (#3275)
vargaat Mar 28, 2025
2962a4e
Lined icon for submitted assignment (#3268)
petkybenedek Mar 28, 2025
5ef35c5
Fix translation export (#3276)
vargaat Mar 28, 2025
9004529
Student - K5 - Add groupLine icon to groups tab item (#3278)
ndrsszsz Mar 28, 2025
f9b723a
Speedgrader files reorganization (#3277)
vargaat Mar 28, 2025
23f53a4
Update import script to use iphone simulator SDK. (#3280)
vargaat Apr 7, 2025
6dcbf24
Update translations (#3279)
inst-danger Apr 7, 2025
1eb0726
Update translations (#3291)
inst-danger Apr 7, 2025
b327871
Add support for ReactiveStore to use custom environment other than sh…
vargaat Apr 9, 2025
7e935d0
Change "string" to "string(localized:)" (#3288)
petkybenedek Apr 9, 2025
e135dcd
E2E Test maintenance (#3298)
rh12 Apr 11, 2025
a658894
Fix grades list showing assignments of all observed users (#3295)
vargaat Apr 11, 2025
f63cd6b
Update translations (#3310)
inst-danger Apr 14, 2025
60cc34a
RCE Dark mode issue (#3312)
rh12 Apr 15, 2025
b0c8048
SG Refactor #1 - Rubrics business logic extraction (#3286)
vargaat Apr 15, 2025
d669e6b
SG Refactor #2 - Speed grader view controller refactor (#3292)
vargaat Apr 17, 2025
61bebb1
Student - NewQuizzes submission detail screen has balloon image messi…
ndrsszsz Apr 17, 2025
31e592e
SG Refactor #3 - Extract submission grader logic to view model (#3311)
vargaat Apr 17, 2025
75a1bfc
Make SubmissionDetails content always focusable (#3317)
rh12 Apr 17, 2025
8147241
Fix letter grade conversion (#3313)
rh12 Apr 17, 2025
3771e0a
Update translations (#3323)
inst-danger Apr 22, 2025
f5fc5a2
Fix ExternalURLViewController is not localized (#3315)
ndrsszsz Apr 22, 2025
9b0f614
Fix the issue where empty view is shown on reload (PTR) an assignment…
suhaibabsi-inst Apr 22, 2025
b91e484
Fix iOS 17 deprecation warnings (#3283)
ndrsszsz Apr 22, 2025
f94ba97
Offline Mode: Fix the issue where Media attached to pages of Child ac…
suhaibabsi-inst Apr 23, 2025
266a030
Grading period filter auto selects the current period instead of relo…
petkybenedek Apr 23, 2025
54037f6
Make Studio sync errors non-localized (#3328)
vargaat Apr 24, 2025
0cbbd08
Update E2E tests (#3331)
vargaat Apr 28, 2025
0421ad3
Fix test not being torn down correctly. (#3335)
vargaat Apr 28, 2025
1d88f60
Update translations (#3334)
inst-danger Apr 28, 2025
ec2c908
Update translations (#3343)
inst-danger May 5, 2025
985183b
Embed SpeedGrader into a nav controller (#3339)
vargaat May 7, 2025
ff446e2
Stop web media playback when switching to a new module item. (#3332)
vargaat May 7, 2025
8d816bb
Use a different API to get LTI tools that doesn't fail for cross shar…
vargaat May 7, 2025
fa61cfe
HorizonUI (#3344)
szabinst May 8, 2025
c404ceb
Update translations (#3360)
inst-danger May 12, 2025
ff5dd76
Fix Links to External Tools Being Inaccessible from Pages Content (#3…
suhaibabsi-inst May 12, 2025
41e46b3
Fixed New Quizzes not opening submitted files in some cases. (#3336)
suhaibabsi-inst May 12, 2025
fcedefc
Fixed issue of WebView not resizing on Dark/Light mode switch (#3356)
suhaibabsi-inst May 12, 2025
fe4c0b7
Update simulator. (#3364)
vargaat May 13, 2025
550f3e6
QR login helper text (#3361)
petkybenedek May 14, 2025
8d42fbe
Fixed issue of Discussions being inaccessible for cross-shared users …
suhaibabsi-inst May 15, 2025
08e00eb
Horizon Core changes (#3355)
szabinst May 15, 2025
5edd784
Grade list bounce bug (#3354)
petkybenedek May 19, 2025
aa4b90f
Update translations (#3374)
inst-danger May 19, 2025
ddbe777
Skip offline tests.
vargaat May 19, 2025
8f2dadd
Updated radio button a11y (#3378)
rh12 May 20, 2025
4f51007
Accessibility - VoiceOver ignore navigation tab logos (#3376)
petkybenedek May 20, 2025
f6abcbb
Fixed issue of disappearing groups on dashboard on first refresh afte…
suhaibabsi-inst May 20, 2025
5b649e8
Common changes extracted from SpeedGrader Comments PR (#3384)
rh12 May 20, 2025
a733b96
Fix swiping to next student changing the current student's attempt (#…
vargaat May 20, 2025
37a20e9
Update SpeedGrader landscape layout (#3362)
vargaat May 20, 2025
76f640e
Accessibility - Date Picker (#3365)
rh12 May 21, 2025
37f318c
Fix inverted video (#3377)
vargaat May 26, 2025
4933f4b
Accessibility - Update sync start announcement (#3385)
vargaat May 26, 2025
a506031
Fix Post Settings screen issues (#3399)
rh12 May 26, 2025
1cb0eaf
SpeedGrader - Update header (#3372)
petkybenedek May 27, 2025
4b6c1bb
Accessibility - Add file upload notification to file submission flow.…
vargaat May 27, 2025
f53cc29
Use grade formatter to display score. (#3401)
vargaat May 27, 2025
dc4894d
SpeedGrader Improvement - Assignment Submissions List Redesign (#3342)
suhaibabsi-inst May 28, 2025
53cc342
Accessibility - Item Picker screens (#3396)
rh12 May 28, 2025
2471e71
Fix merge conflict (#3408)
rh12 May 28, 2025
98c2c9e
Pause media playback when swiping to the next submission (#3393)
vargaat May 28, 2025
be2f7bc
SpeedGrader comments (#3348)
rh12 May 30, 2025
aac6c58
Update translations (#3416)
inst-danger Jun 2, 2025
3839a66
Add paddings to SubmissionViewer (#3409)
petkybenedek Jun 3, 2025
165c8fa
Seed cookie for canvas-user-content domain to allow iframed content t…
vargaat Jun 3, 2025
8032088
Remove conversations from Notifications screen (#3413)
petkybenedek Jun 4, 2025
37b0c2c
SpeedGrader - Attempt and File pickers (#3421)
rh12 Jun 5, 2025
440aa1d
Student - Todo Widget (#3402)
suhaibabsi-inst Jun 5, 2025
8db5c30
SpeedGrader - Update annotation toolbar (#3424)
vargaat Jun 6, 2025
fdca4b5
SpeedGrader improvements (#3428)
vargaat Jun 10, 2025
68d6023
Update translations (#3429)
inst-danger Jun 10, 2025
4a1d665
Replace "display" parameter with "embedded'. (#3431)
vargaat Jun 10, 2025
705b28e
SpeedGrader drawer tab change speedup (#3432)
rh12 Jun 10, 2025
d5cbcae
Update translations (#3443)
inst-danger Jun 16, 2025
7658f64
E2E Test Maintenance (#3437)
ndrsszsz Jun 17, 2025
9c7db30
Fix the issue of cross-shard user unable to view announcements detail…
suhaibabsi-inst Jun 17, 2025
10005b6
Fix teacher project (#3446)
vargaat Jun 19, 2025
41d11eb
Fixed dynamic font size issue with navigation bar subtitled header (#…
suhaibabsi-inst Jun 19, 2025
ffa146d
Fixed issue where submission list doesn't filter out "Not Submitted" …
suhaibabsi-inst Jun 19, 2025
94964c4
Horizon Core Changes #2 (#3417)
szabinst Jun 19, 2025
f8e3fb1
Horizon Core Changes #3 (#3435)
szabinst Jun 20, 2025
12fc1c3
Fix the issue of cross-shared user unable to preview files added to M…
suhaibabsi-inst Jun 23, 2025
05cce49
Fixed issue with submission list where NotSubmitted ones being sorted…
suhaibabsi-inst Jun 23, 2025
84531e9
QR login orientation fix (#3453)
petkybenedek Jun 24, 2025
16bb140
Fixed issue of submission list where Re-submitted attempts of assignm…
suhaibabsi-inst Jun 24, 2025
c18b959
SpeedGrader Update Comment TextField (#3449)
rh12 Jun 27, 2025
00e50b5
Fixed issue where Rubric Option buttons overlapping with the underlay…
suhaibabsi-inst Jun 29, 2025
e2d59cd
Move NSFetchedResultsController setup to the context's thread. (#3461)
vargaat Jun 30, 2025
438aea7
Update translations (#3468)
inst-danger Jun 30, 2025
e445e70
Teacher Submission List not refreshing (#3462)
rh12 Jun 30, 2025
72d4588
Assignment list preferences color correction (#3460)
petkybenedek Jul 1, 2025
2b3f7bd
Update portrait drawer header (#3444)
petkybenedek Jul 1, 2025
fd88fe8
Trap voiceover into webview when a web dialog is displayed (#3464)
vargaat Jul 1, 2025
12ffe0c
Teacher - Excused submission sorted to two sections (#3471)
ndrsszsz Jul 2, 2025
3023f5e
SpeedGrader - Add submission statuses (#3450)
vargaat Jul 3, 2025
c0e6f6a
Assignment List Preferences - Grading Period filter behaviour change …
ndrsszsz Jul 3, 2025
c98ac54
Label for comment field (#3472)
petkybenedek Jul 3, 2025
e0306d4
Student - Single Grade Widget (#3457)
suhaibabsi-inst Jul 3, 2025
5e3eb7e
Use course color to tint SG and annotation toolbar. (#3474)
vargaat Jul 4, 2025
0c8631e
Student - Grade List Widget (#3465)
ndrsszsz Jul 4, 2025
db9f213
Fixed issue of duplicate rows showing for same event on Planner view …
suhaibabsi-inst Jul 4, 2025
e2953cc
Update translations (#3476)
inst-danger Jul 7, 2025
a6356f1
Add extra selectors for discussions. (#3479)
vargaat Jul 8, 2025
82386c1
Status picker improvements (#3478)
vargaat Jul 9, 2025
5320aae
Widget reorder (#3482)
petkybenedek Jul 10, 2025
befb847
Fix grade status not being cleared in SpeedGrader (#3486)
vargaat Jul 10, 2025
c593f5c
SpeedGrader audio video pickers (#3485)
rh12 Jul 10, 2025
715235c
Rename SpeedGrader files and types (#3492)
rh12 Jul 11, 2025
5bfd240
E2E Test Maintenance (#3489)
ndrsszsz Jul 11, 2025
813ae22
Teacher - Teachers of large courses are unable to access all assignme…
ndrsszsz Jul 11, 2025
f93ac5b
Update translations (#3493)
inst-danger Jul 14, 2025
9013bfe
SpeedGrader - Extract Tabs view from Page view (#3495)
rh12 Jul 14, 2025
9c5add8
Student - Announcements Widget refactor (#3491)
ndrsszsz Jul 14, 2025
c95bd10
Horizon Core changes #4 (#3498)
szabinst Jul 16, 2025
4173301
Remove unnecessary Calendar context limit fetches (#3488)
petkybenedek Jul 16, 2025
4dd4abc
Sync students order in SpeedGrader with that shown in Submissions lis…
suhaibabsi-inst Jul 16, 2025
e02cca4
SpeedGrader - Extract grading logic / Add "No Grade" and "Excuse" but…
vargaat Jul 18, 2025
9540c0d
SpeedGrader - Details tab (#3508)
rh12 Jul 21, 2025
4e0955b
SpeedGrader - Add grade summary (#3504)
vargaat Jul 22, 2025
1ade88b
Horizon Core Changes #5 (#3517)
szabinst Jul 24, 2025
dc19c6f
Fixed Consortia Root Teacher user access issue to Assignments & Quizz…
suhaibabsi-inst Jul 24, 2025
4387491
Fixed issue of NotSubmitted filtering on Submissions list (#3525)
suhaibabsi-inst Jul 24, 2025
73c56ff
Merge remote-tracking branch 'origin/master' into feature/horizon-mer…
szabinst Jul 25, 2025
c2a6c35
fix: resolve conflicts
szabinst Jul 25, 2025
1457f80
fix: lint
szabinst Jul 25, 2025
59bf847
fix: conflicted resolve
szabinst Jul 25, 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
6 changes: 3 additions & 3 deletions Canvas.xcworkspace/xcshareddata/swiftpm/Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 6 additions & 2 deletions Core/Core/Common/CommonModels/API/API.swift
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,12 @@ public class API {
callback: ((URL?, URLResponse?, Error?) -> Void)? = nil)
-> APITask? {
var request = URLRequest(url: url)
let token = AppEnvironment.shared.currentSession?.accessToken ?? ""
request.setValue("Bearer \(token)", forHTTPHeaderField: HttpHeader.authorization)

if AppEnvironment.shared.app == .horizon {
let token = AppEnvironment.shared.currentSession?.accessToken ?? ""
request.setValue("Bearer \(token)", forHTTPHeaderField: HttpHeader.authorization)
}

if let method {
request.httpMethod = method.rawValue.uppercased()
}
Expand Down
15 changes: 15 additions & 0 deletions Core/Core/Common/CommonModels/API/ID.swift
Original file line number Diff line number Diff line change
Expand Up @@ -146,4 +146,19 @@ public extension String {
formatter.numberStyle = .decimal
return formatter
}()

/// Get a copy of this ID where `shardID` of the original login session being
/// inserted as prefix to it.
/// For example, ID of **`239`** transformed to **`217540000000000239`**
/// with **`21754`** as being `shardID` extracted from the original access token.
var asRootID: String {
let env = AppEnvironment.shared

guard let shardID = env.currentSession?.accessToken?.shardID
else { return self }

if hasShardID { return self }

return ID.expandTildeID("\(shardID)~\(self)")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ open class AppEnvironment {
self.logger = Logger.shared
}

open var root: AppEnvironment { self }
public var isRoot: Bool { root === self }

/**
- parameters:
- isSilent: If this parameter is true then the method won't trigger a widget refresh
Expand Down Expand Up @@ -141,7 +144,7 @@ open class AppEnvironment {
public static var shared = AppEnvironment()

public func subscribe<U>(_ useCase: U, _ callback: @escaping Store<U>.EventHandler = { }) -> Store<U> where U: UseCase {
return Store(env: self, useCase: useCase, eventHandler: callback)
return Store(env: self, useCase: useCase.modified(for: self), eventHandler: callback)
}

public func subscribe<Model>(scope: Scope, _ callback: @escaping Store<LocalUseCase<Model>>.EventHandler = {}) -> Store<LocalUseCase<Model>> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ public final class AppEnvironmentOverride: AppEnvironment {
API(currentSession, baseURL: baseURL)
}()

public override var root: AppEnvironment { base }

public override var app: AppEnvironment.App? {
get { base.app }
set {}
Expand Down Expand Up @@ -89,7 +91,7 @@ public final class AppEnvironmentOverride: AppEnvironment {
masquerader: cSession.masquerader,
refreshToken: cSession.refreshToken,
userAvatarURL: cSession.userAvatarURL,
userID: cSession.userID,
userID: cSession.userID.localID,
userName: cSession.userName,
userEmail: cSession.userEmail,
clientID: cSession.clientID,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,14 @@ public class GetCustomColors: APIUseCase {

public init() {}

public func makeRequest(
environment: AppEnvironment,
completionHandler: @escaping (APICustomColors?, URLResponse?, Error?) -> Void
) {
// Always call root account API for this request.
environment.root.api.makeRequest(request, callback: completionHandler)
}

public func write(response: APICustomColors?, urlResponse: URLResponse?, to client: NSManagedObjectContext) {
guard let response = response else { return }
ContextColor.save(response, in: client)
Expand Down
2 changes: 0 additions & 2 deletions Core/Core/Common/CommonModels/Router/Router.swift
Original file line number Diff line number Diff line change
Expand Up @@ -224,8 +224,6 @@ open class Router {
guard let window = AppEnvironment.shared.window else { return }
UIView.transition(with: window, duration: 0.5, options: isLoginTransition ? .transitionFlipFromRight : .transitionFlipFromLeft) {
window.rootViewController = viewController
// TODO: root vc analytics
// Analytics.shared.logScreenView(route: "/login", viewController: window.rootViewController)
}
}

Expand Down
5 changes: 3 additions & 2 deletions Core/Core/Common/CommonModels/Store/ReactiveStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public class ReactiveStore<U: UseCase> {
environment: AppEnvironment = .shared
) {
self.offlineModeInteractor = offlineModeInteractor
self.useCase = useCase
self.useCase = useCase.modified(for: environment)
self.context = context
self.environment = environment
}
Expand Down Expand Up @@ -138,7 +138,8 @@ public class ReactiveStore<U: UseCase> {
context: NSManagedObjectContext,
environment: AppEnvironment
) -> AnyPublisher<[T], Error> {
return useCase.hasCacheExpired()
return useCase
.hasCacheExpired(environment: environment)
.setFailureType(to: Error.self)
.flatMap { hasExpired -> AnyPublisher<[T], Error> in
if hasExpired {
Expand Down
31 changes: 31 additions & 0 deletions Core/Core/Common/CommonModels/Store/UseCase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public protocol UseCase {
func reset(context: NSManagedObjectContext)
func write(response: Response?, urlResponse: URLResponse?, to client: NSManagedObjectContext)
func getNext(from response: URLResponse) -> GetNextRequest<Response>?
func modified(for env: AppEnvironment) -> Self
}

public extension UseCase {
Expand All @@ -52,6 +53,16 @@ public extension UseCase {
// no-op
}

func modified(for env: AppEnvironment) -> Self {
self
}
}

// MARK: - The actual UseCase logic

public extension UseCase {

/// Cache expiration check used by the legacy `Store`.
func hasExpired(in client: NSManagedObjectContext) -> Bool {
guard let cacheKey = cacheKey, !ProcessInfo.isUITest else { return true }
var expired = true
Expand All @@ -63,6 +74,7 @@ public extension UseCase {
return expired
}

/// Private helper method, used by both closure based and reactive `fetch()` methods.
func updateTTL(in client: NSManagedObjectContext) {
guard let cacheKey = cacheKey else { return }
let predicate = NSPredicate(format: "%K == %@", #keyPath(TTL.key), cacheKey)
Expand All @@ -71,6 +83,7 @@ public extension UseCase {
cache.lastRefresh = Clock.now
}

/// Closure based `fetch()`, used by the legacy `Store` and directly from other places.
func fetch(environment: AppEnvironment = .shared, force: Bool = false, _ callback: RequestCallback? = nil) {
// Make sure we write to the database that initiated this request
let database = environment.database
Expand Down Expand Up @@ -106,6 +119,7 @@ public extension UseCase {
}
}

/// Cache expiration check used by the `ReactiveStore`.
func hasCacheExpired(environment: AppEnvironment = .shared) -> Future<Bool, Never> {
Future<Bool, Never> { promise in
environment.database.performWriteTask { context in
Expand All @@ -114,6 +128,7 @@ public extension UseCase {
}
}

/// Reactive `fetch()`, used by the `ReactiveStore` and directly from other places.
func fetchWithFuture(environment: AppEnvironment = .shared) -> Future<URLResponse?, Error> {
Future<URLResponse?, Error> { promise in
self.makeRequest(environment: environment) { response, urlResponse, error in
Expand Down Expand Up @@ -145,6 +160,9 @@ public extension UseCase {
}
}

// MARK: - API UseCases

/// A `UseCase` that provides a default `makeRequest()` implementation which uses the provided API `request`.
public protocol APIUseCase: UseCase {
associatedtype Request: APIRequestable
var request: Request { get }
Expand All @@ -162,13 +180,17 @@ public extension APIUseCase where Response == Request.Response {
}
}

/// An `APIUseCase` that deletes all existing CoreData entities matching `scope` before each `write`.
/// This is needed when the new collection should replace the old collection as a whole.
/// Otherwise elements not in the new collection would stay in CoreData, which is usually a bug.
public protocol CollectionUseCase: APIUseCase {}
public extension CollectionUseCase {
func reset(context: NSManagedObjectContext) {
context.delete(context.fetch(scope: scope) as [Model])
}
}

/// An `APIUseCase` that sends `request` and on success it deletes all CoreData entities matching `scope`.
public protocol DeleteUseCase: APIUseCase {}
public extension DeleteUseCase {
func write(response _: Response?, urlResponse _: URLResponse?, to client: NSManagedObjectContext) {
Expand Down Expand Up @@ -200,6 +222,11 @@ public struct GetNextUseCase<U: UseCase>: APIUseCase {
}
}

// MARK: - WriteableModel

/// Defines basic `save()` methods for CoreData entities which doesn't require additional parameters besides their corresponding API model.
/// These allow for default `UseCase.write()` implementations, making the `UseCase` using the entity a bit simpler.
/// The associated type `JSON` is the corresponding API model used to save the entity.
public protocol WriteableModel {
associatedtype JSON

Expand Down Expand Up @@ -235,6 +262,9 @@ public extension UseCase where Model: WriteableModel, Response: Collection, Mode
}
}

// MARK: - Local UseCases

/// Does not send out an API request, only fetches the entities from CoreData.
public class LocalUseCase<T>: UseCase where T: NSManagedObject {
public typealias Model = T
// Response doesn't matter so this is just a Codable stub
Expand All @@ -255,6 +285,7 @@ public class LocalUseCase<T>: UseCase where T: NSManagedObject {
public func write(response _: Int?, urlResponse _: URLResponse?, to _: NSManagedObjectContext) {}
}

/// A `LocalUseCase` that deletes all CoreData entities matching `scope`.
public class DeleteLocalUseCase<T>: UseCase where T: NSManagedObject {
public typealias Model = T
// Response doesn't matter so this is just a Codable stub
Expand Down
3 changes: 1 addition & 2 deletions Core/Core/Common/CommonUI/InstUI/BaseScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,7 @@ public extension InstUI {
.frame(width: geometry.size.width, height: geometry.size.height)
}
}
// TODO: Check if it's needed here
// .background(Color.backgroundLightest)
.background(AppEnvironment.shared.app == .horizon ? Color.clear : Color.backgroundLightest)
.scrollBounceBehavior(config.scrollBounce)
}
}
Expand Down
22 changes: 6 additions & 16 deletions Core/Core/Common/CommonUI/InstUI/Styles/Elevation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,39 +23,29 @@ extension InstUI.Styles {
public enum Elevation {

public enum Shape {
case card
case cardSmall
case cardLarge
case pill

var cornerRadius: CGFloat {
switch self {
case .card: 6
case .cardSmall: 6
case .cardLarge: 24
case .pill: 100
}
}
}

public enum BaseBackground {
case light
case lightest

var elevationBackground: Color {
switch self {
case .light: .backgroundLightest
case .lightest: .backgroundLightestElevated
}
}
}
}
}

extension View {

public func elevation(
_ shape: InstUI.Styles.Elevation.Shape,
aboveBackground baseBackground: InstUI.Styles.Elevation.BaseBackground
background: Color
) -> some View {
self
.background(baseBackground.elevationBackground)
.background(background)
.cornerRadius(shape.cornerRadius)
.shadow(color: .black.opacity(0.08), radius: 2, y: 2)
.shadow(color: .black.opacity(0.16), radius: 2, y: 1)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
//
// This file is part of Canvas.
// Copyright (C) 2025-present Instructure, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//

import SwiftUI

extension InstUI {

public struct SectionDisclosureStyle: DisclosureGroupStyle {

public struct HeaderConfiguration {
let paddingSet: InstUI.Styles.PaddingSet
let accessoryIconSize: CGFloat
let hasDividerBelowHeader: Bool
}

@Environment(\.dynamicTypeSize) private var dynamicTypeSize

private let headerConfig: HeaderConfiguration

public init(headerConfig: HeaderConfiguration) {
self.headerConfig = headerConfig
}

public func makeBody(configuration: Configuration) -> some View {
VStack(alignment: .leading, spacing: 0) {
Button(
action: {
withAnimation(.smooth(duration: 0.3)) {
configuration.isExpanded.toggle()
}
},
label: {
header(configuration: configuration)
.paddingStyle(set: headerConfig.paddingSet)
.contentShape(Rectangle())
.background(.backgroundLightest) // to stop collapsing views above showing through
}
)
.buttonStyle(.plain)

if headerConfig.hasDividerBelowHeader {
InstUI.Divider()
}

if configuration.isExpanded {
configuration.content
.background(.backgroundLightest) // to stop collapsing views above showing through
}
}
}

private func header(configuration: Configuration) -> some View {
HStack(alignment: .center, spacing: 0) {
configuration.label
.frame(maxWidth: .infinity, alignment: .leading)
.accessibilityAddTraits([.isHeader])

Image.chevronDown
.scaledIcon(size: headerConfig.accessoryIconSize)
.foregroundStyle(.textDark)
.rotationEffect(.degrees(configuration.isExpanded ? 180 : 0))
.paddingStyle(.leading, .cellAccessoryPadding)
}
}
}
}
Loading