canvas-lms/ui/api.d.ts

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

649 lines
14 KiB
TypeScript
Raw Normal View History

/*
* Copyright (C) 2022 - present Instructure, Inc.
*
* This file is part of Canvas.
*
* Canvas 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, version 3 of the License.
*
* Canvas 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 <http://www.gnu.org/licenses/>.
*/
export type Enrollment = Readonly<{
associated_user_id: null | string
course_id: string
course_integration_id: null | string
course_section_id: string
created_at: string
end_at: null | string
fix inactive/concluded students in section filter fix issue where if a student has a dual enrollment and one enrollment is completed and the other is active, when switching to the section with the completed enrollment, the student will still show in the gradebook even with the show concluded students filter turned off. fixes EVAL-3901 flag=none Test Plan: - have a couple of students - one student with dual enrollment where one enrollment is active and the other is concluded - have one student fully concluded - have one student fully inactive - have a few other students that are active - go to the gradebook with both the inactive and concluded filters turned off - confirm that the fully inactive and concluded students are not show in the gradebook - filter by the section where the dual enrollment student is concluded - confirm that they do not appear in the gradebook when filter is applied - filter by the section where the dual enrollment student is active - confirm that they appear in the gradebook when filter is applied - remove filters and go to the triple dot next to Student Name column - turn on inactive enrollments and confirm that the fully inactive student appears - turn on concluded enrollment and confirm that the fully concluded student appears - filter by their respective sections and see that these students appear - confirm that the concluded dual enrollment student shows up when filtering by the section that their concluded enrollment resides - toggle off the concluded and inactive filters and confirm that the students are removed from the gradebook Change-Id: I85bc21f133a9ec1184dbed8f12bc3b5d29e7fe86 Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/338011 Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com> Reviewed-by: Christopher Soto <christopher.soto@instructure.com> Reviewed-by: Kai Bjorkman <kbjorkman@instructure.com> QA-Review: Christopher Soto <christopher.soto@instructure.com> Product-Review: Ravi Koll <ravi.koll@instructure.com>
2024-01-18 13:29:22 +08:00
enrollment_state: 'active' | 'inactive' | 'completed' | 'invited'
html_url: string
id: string
last_activity_at: null | string
last_attended_at: null | string
limit_privileges_to_course_section: boolean
role_id: string
root_account_id: string
section_integration_id: null | string
sis_account_id: null | string
sis_course_id: null | string
sis_import_id: null | string
sis_section_id: null | string
sis_user_id: null | string
start_at: null | string
total_activity_time: number
type: 'StudentEnrollment' | 'StudentViewEnrollment'
updated_at: string
user_id: string
grades: {
html_url: string
current_grade: null | number
current_score: null | number
final_grade: null | number
final_score: null | number
unposted_current_score: null | number
unposted_current_grade: null | number
unposted_final_score: null | number
unposted_final_grade: null | number
}
workflow_state: WorkflowState
}>
export type Student = Readonly<{
avatar_url?: string
created_at: string
email: null | string
group_ids: string[]
id: string
integration_id: null | string
login_id: string
short_name: string
sis_import_id: null | string
sis_user_id: null | string
}> & {
enrollments: Enrollment[]
first_name: string
last_name: string
name: string
index: number
section_ids: string[]
} & Partial<{
anonymous_name: string
computed_current_score: number
computed_final_score: number
cssClass: string
displayName: string
initialized: boolean
isConcluded: boolean
isInactive: boolean
loaded: boolean
sections: string[]
sortable_name: string
total_grade: number
}>
export type StudentMap = {
[studentId: string]: Student
}
export type StudentGroup = Partial<
{
avatar_url: null | string
concluded: boolean
context_type: string
course_id: string
created_at: string
description: null | string
group_category_id: string
has_submission: boolean
id: string
is_public: boolean
join_level: string
leader: null | string
max_membership: null | string
members_count: string
name: string
role: null | string
sis_group_id: null | string
sis_import_id: null | string
storage_quota_mb: string
},
'id' | 'name'
>
export type StudentGroupCategory = Readonly<{
allows_multiple_memberships: boolean
auto_leader: null | string
context_type: string
course_id: string
created_at: string
group_limit: null
groups: StudentGroup[]
id: string
is_member: boolean
name: string
protected: boolean
role: null | string
self_signup: null | string
sis_group_category_id: null | string
sis_import_id: null | string
}>
export type StudentGroupMap = {
[id: string]: StudentGroup
}
export type StudentGroupCategoryMap = {
[id: string]: StudentGroupCategory
}
export type DueDate = Readonly<{
due_at: string | null
grading_period_id: string | null
in_closed_grading_period: boolean
}>
export type UserDueDateMap = {
[user_id: string]: DueDate
}
export type AssignmentUserDueDateMap = {
[assignment_id: string]: UserDueDateMap
}
export type Override = Readonly<{
title: string
id: string
due_at: string | null
course_section_id: string | null
}>
export type Assignment = Readonly<{
allowed_attempts: number
created_at: string
id: string
html_url: string
allowed_extensions: string[]
annotatable_attachment_id: null | string
anonymous_grading: boolean
anonymous_instructor_annotations: boolean
anonymous_peer_reviews: boolean
assessment_requests?: AssessmentRequest[]
assignment_group_id: string
automatic_peer_reviews: boolean
can_duplicate: boolean
course_id: string
due_date_required: boolean
final_grader_id: null | string
grade_group_students_individually: boolean
graded_submissions_exist: boolean
grader_comments_visible_to_graders: boolean
grader_count: number
grader_names_visible_to_final_grader: boolean
graders_anonymous_to_graders: boolean
grades_published: boolean
grading_standard_id: string | null
grading_type: GradingType
group_category_id: string | null
has_overrides: boolean
has_sub_assignments: boolean
has_submitted_submissions: boolean
hide_in_gradebook: boolean
important_dates: boolean
integration_data: any
integration_id: null | string
intra_group_peer_reviews: boolean
is_quiz_assignment: boolean
lock_at: null | string
locked_for_user: boolean
lti_context_id: string
max_name_length: number
moderated_grading: boolean
module_ids?: string[]
module_positions: number[]
muted: boolean
name: string
omit_from_final_grade: boolean
only_visible_to_overrides: boolean
original_assignment_id: null | string
original_assignment_name: null | string
original_course_id: null | string
original_lti_resource_link_id: null | string
original_quiz_id: null | string
peer_reviews: boolean
points_possible: number
position: number
post_to_sis: boolean
published: boolean
require_lockdown_browser: boolean
secure_params: string
sis_assignment_id: null | string
submission_types: string[]
submissions_download_url: string
unlock_at: null | string
unpublishable: boolean
updated_at: string
workflow_state: WorkflowState
}> & {
anonymize_students: boolean
assignment_visibility: string[]
post_manually: boolean
} & Partial<{
assignment_group: AssignmentGroup
due_at: string | null
effectiveDueDates: UserDueDateMap
inClosedGradingPeriod: boolean
overrides: Override[]
}>
export type AssignmentMap = {
[assignmentId: string]: Assignment
}
export type AssignmentGroup = Readonly<{
assignments: Assignment[]
group_weight: number
id: string
integration_data: unknown
name: string
position: number
rules: {
drop_lowest?: number
drop_highest?: number
never_drop?: string[]
}
sis_source_id: null | string
}>
export type AssignmentGroupMap = {
[id: string]: AssignmentGroup
}
export type AssessmentRequest = Readonly<{
anonymous_id?: string
user_id?: string
user_name?: string
available: boolean
workflow_state?: string
}>
add modals when completing peer reviews add modals when completing a peer review if the student still has other peer reviews to complete or they have completed all peer reviews fixes EVAL-2824 fixes EVAL-2825 flag=visibility_feedback_student_grades_page flag=assignments_2_student test plan: - as teacher create a peer review assignment with 3 students in class - have one student (A) peer review the others (B,C) - submit for the students B,C - submit for the student A - a modal should popup directing you to complete peer reviews. it should also inform you that you have 2 peer reviews remaining - clicking on the button should navigate you to a peer review for one of the other students - as student A, add a comment so that peer review is done - you should see a modal pop up letting you know that you have one peer review remaining. - Click on button to go to next peer review - as student A, add comment on 2nd peer review - you should see another modal pop up letting you know that you have completed all peer reviews - refresh page, you should see that you have already completed this peer review for this student - add another comment to the peer review, you SHOULD NOT see any more modals popup because the student has already completed all reviews Change-Id: Ibece2f3ec2d4fb2350b4900d7a1e08fb31e72531 Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/309912 Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com> Reviewed-by: Kai Bjorkman <kbjorkman@instructure.com> Reviewed-by: Spencer Olson <solson@instructure.com> QA-Review: Kai Bjorkman <kbjorkman@instructure.com> Product-Review: Sam Garza <sam.garza@instructure.com>
2023-01-28 05:17:10 +08:00
export type AssignedAssessments = {
assetId: string
workflowState: string
add required peer review link to assignment header add a link to the assignment header that allows the user to navigate between assigned peer reviews closes EVAL-3182 flag=peer_reviews_for_a2 test plan: - Have a course with at three students - Create an assignment with anonymous peer review disabled - Assign the same student the other two peer reviews - As the primary student with the two peer reviews, do not submit the assignment. - Go to the non-anonymous peer review assignment page and see that there is a link called Required Peer Reviews on the header - Confirm that all two students are under the Not Yet Submitted category when the link is clicked on and the popover is displayed - Click on one of the students in the popover and see that it will navigate to the student's peer review page - Confirm that the student whose peer review page is being viewed is the same student on the popover that has a grey box - Confirm that there is a required peer review link on the page and the page says that you need to first submit before you can peer review - As the primary student, submit the assignment and click on another student in the required peer review link - Confirm that the page says the no submissions are available to review yet and the peer review link is shown on the page - Go to one of the peer reviewee's account and submit the assignment - Go back to the primary student's account and go to that assignments page. - Confirm that the peer reviewee who just submitted is now in the Ready to Review section of the popover - Click on the peer reviewee in the popover and submit a peer review - Open the peer review popover again and confirm that the peer reviewee is now in the Completed Peer Reviews Section - Perform the same steps with an anonymous assignment and confirm that the names on the popover says Anonymous with a number. - Perform the same steps with a non-anonymous assignment with a rubric - Create an assignment with peer reviews enabled but no peer reviews assigned - Confirm that there is no required peer review link for the assignment Change-Id: I314cb0842620cf5cf7129ec0bbe17064eb8f4dbe Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/323717 Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com> Reviewed-by: Spencer Olson <solson@instructure.com> Reviewed-by: Derek Williams <derek.williams@instructure.com> QA-Review: Derek Williams <derek.williams@instructure.com> Product-Review: Ravi Koll <ravi.koll@instructure.com>
2023-07-27 23:06:30 +08:00
assetSubmissionType: string | null
add modals when completing peer reviews add modals when completing a peer review if the student still has other peer reviews to complete or they have completed all peer reviews fixes EVAL-2824 fixes EVAL-2825 flag=visibility_feedback_student_grades_page flag=assignments_2_student test plan: - as teacher create a peer review assignment with 3 students in class - have one student (A) peer review the others (B,C) - submit for the students B,C - submit for the student A - a modal should popup directing you to complete peer reviews. it should also inform you that you have 2 peer reviews remaining - clicking on the button should navigate you to a peer review for one of the other students - as student A, add a comment so that peer review is done - you should see a modal pop up letting you know that you have one peer review remaining. - Click on button to go to next peer review - as student A, add comment on 2nd peer review - you should see another modal pop up letting you know that you have completed all peer reviews - refresh page, you should see that you have already completed this peer review for this student - add another comment to the peer review, you SHOULD NOT see any more modals popup because the student has already completed all reviews Change-Id: Ibece2f3ec2d4fb2350b4900d7a1e08fb31e72531 Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/309912 Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com> Reviewed-by: Kai Bjorkman <kbjorkman@instructure.com> Reviewed-by: Spencer Olson <solson@instructure.com> QA-Review: Kai Bjorkman <kbjorkman@instructure.com> Product-Review: Sam Garza <sam.garza@instructure.com>
2023-01-28 05:17:10 +08:00
anonymizedUser?: {
displayName: string
_id: string
add required peer review link to assignment header add a link to the assignment header that allows the user to navigate between assigned peer reviews closes EVAL-3182 flag=peer_reviews_for_a2 test plan: - Have a course with at three students - Create an assignment with anonymous peer review disabled - Assign the same student the other two peer reviews - As the primary student with the two peer reviews, do not submit the assignment. - Go to the non-anonymous peer review assignment page and see that there is a link called Required Peer Reviews on the header - Confirm that all two students are under the Not Yet Submitted category when the link is clicked on and the popover is displayed - Click on one of the students in the popover and see that it will navigate to the student's peer review page - Confirm that the student whose peer review page is being viewed is the same student on the popover that has a grey box - Confirm that there is a required peer review link on the page and the page says that you need to first submit before you can peer review - As the primary student, submit the assignment and click on another student in the required peer review link - Confirm that the page says the no submissions are available to review yet and the peer review link is shown on the page - Go to one of the peer reviewee's account and submit the assignment - Go back to the primary student's account and go to that assignments page. - Confirm that the peer reviewee who just submitted is now in the Ready to Review section of the popover - Click on the peer reviewee in the popover and submit a peer review - Open the peer review popover again and confirm that the peer reviewee is now in the Completed Peer Reviews Section - Perform the same steps with an anonymous assignment and confirm that the names on the popover says Anonymous with a number. - Perform the same steps with a non-anonymous assignment with a rubric - Create an assignment with peer reviews enabled but no peer reviews assigned - Confirm that there is no required peer review link for the assignment Change-Id: I314cb0842620cf5cf7129ec0bbe17064eb8f4dbe Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/323717 Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com> Reviewed-by: Spencer Olson <solson@instructure.com> Reviewed-by: Derek Williams <derek.williams@instructure.com> QA-Review: Derek Williams <derek.williams@instructure.com> Product-Review: Ravi Koll <ravi.koll@instructure.com>
2023-07-27 23:06:30 +08:00
} | null
anonymousId?: string | null
add modals when completing peer reviews add modals when completing a peer review if the student still has other peer reviews to complete or they have completed all peer reviews fixes EVAL-2824 fixes EVAL-2825 flag=visibility_feedback_student_grades_page flag=assignments_2_student test plan: - as teacher create a peer review assignment with 3 students in class - have one student (A) peer review the others (B,C) - submit for the students B,C - submit for the student A - a modal should popup directing you to complete peer reviews. it should also inform you that you have 2 peer reviews remaining - clicking on the button should navigate you to a peer review for one of the other students - as student A, add a comment so that peer review is done - you should see a modal pop up letting you know that you have one peer review remaining. - Click on button to go to next peer review - as student A, add comment on 2nd peer review - you should see another modal pop up letting you know that you have completed all peer reviews - refresh page, you should see that you have already completed this peer review for this student - add another comment to the peer review, you SHOULD NOT see any more modals popup because the student has already completed all reviews Change-Id: Ibece2f3ec2d4fb2350b4900d7a1e08fb31e72531 Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/309912 Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com> Reviewed-by: Kai Bjorkman <kbjorkman@instructure.com> Reviewed-by: Spencer Olson <solson@instructure.com> QA-Review: Kai Bjorkman <kbjorkman@instructure.com> Product-Review: Sam Garza <sam.garza@instructure.com>
2023-01-28 05:17:10 +08:00
}
export type AttachmentData = Readonly<{
attachment: Attachment
}>
export type Attachment = {
canvadoc_url?: string
comment_id?: string
content_type: string
created_at: string
crocodoc_url?: string
display_name: string
filename: string
hijack_crocodoc_session?: boolean
id: string
mime_class: string
provisional_canvadoc_url?: null | string
provisional_crocodoc_url?: null | string
submitted_to_crocodoc?: boolean
submitter_id: string
updated_at: string
upload_status: 'pending' | 'failed' | 'success'
url?: string
view_inline_ping_url?: string
viewed_at: string
word_count: number
workflow_state: 'pending_upload' | 'processing'
}
export type Module = Readonly<{
id: string
name: string
position: number
}>
export type ModuleMap = {
[id: string]: Module
}
export type Section = Readonly<{
course_id: string
created_at: string
end_at: null | string
id: string
integration_id: null | string
name: string
nonxlist_course_id: null | string
restrict_enrollments_to_section_dates: null | boolean
sis_course_id: null | string
sis_import_id: null | string
sis_section_id: null | string
start_at: null | string
}>
export type SectionMap = {
[id: string]: Section
}
export type GradingType =
| 'points'
| 'percent'
| 'letter_grade'
| 'gpa_scale'
| 'pass_fail'
| 'not_graded'
export type SubmissionType =
| null
| 'basic_lti_launch'
| 'discussion_topic'
| 'external_tool'
| 'media_recording'
| 'on_paper'
| 'online_quiz'
| 'online_text_entry'
| 'online_upload'
| 'online_url'
| 'wiki_page'
export type WorkflowState =
| 'assigned'
| 'completed'
| 'deleted'
| 'graded'
| 'not_graded'
| 'pending_review'
| 'published'
| 'settings_only'
| 'submitted'
| 'unpublished'
| 'unsubmitted'
| 'untaken'
export type SimilarityScore = {
similarityScore: number
status: 'error' | 'pending' | 'scored'
}
export type TurnitinAsset = {
status: string
provider: string
similarity_score?: number
state?: string
public_error_message?: string
}
export type Submission = Readonly<{
anonymous_id?: string
assignment_id: string
assignment_visible?: boolean
attempt: number | null
cached_due_date: null | string
add custom status colors to gradebook grid adds functionality for custom grade statuses to traditional gradebook grid, now showing the custom colors as the background colors for cells with that custom status closes EVAL-3243 flag=grading_scheme_updates flag=custom_gradebook_statuses test plan: - create a custom grade status - find a submission and set the submission's custom grade status to the created status above in the Rails console using this: sub = Submission.find(<id>) - do the above for a submission that has no status, one that has the 'dropped' status, and one that is ungraded and has another status like 'missing', and also ensure that one of these submissions is an even cell in the grid and one is an odd cell in the grid (easiest way is to just choose 2 submissions that are vertically adjacent, like 2 student's submissions for the same assignment) sub.update!(custom_grade_status_id: <custom_status_id>) - go to the gradebook grid and find the submission - the submission's cell should have the custom status's color as the background color - the custom status color should override any previous status color like 'dropped' or 'missing' - the even cell should be the normal color, and the 'odd' cell should be a darker version (the very first row of submissions is even) - when clicking the cell to edit the score, the background color should change back to white Change-Id: I58f5e803fd4c864630e9cefe615ee65ee44d3db8 Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/324011 Reviewed-by: Spencer Olson <solson@instructure.com> Reviewed-by: Christopher Soto <christopher.soto@instructure.com> Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com> QA-Review: Spencer Olson <solson@instructure.com> Product-Review: Sam Garza <sam.garza@instructure.com>
2023-08-01 07:22:36 +08:00
custom_grade_status_id: null | string
drop?: boolean
entered_grade: null | string
entered_score: null | number
grade_matches_current_submission: boolean
gradeLocked: boolean
grading_period_id: string
grading_type: GradingType
has_originality_report: boolean
has_postable_comments: boolean
id: string
late_policy_status: null | LatePolicyStatus
late: boolean
missing: boolean
points_deducted: null | string | number
provisional_grade_id: string
redo_request: boolean
score: null | number
seconds_late: number
similarityInfo: null | SimilarityScore
submission_type: SubmissionType
url?: null | string
user_id: string
versioned_attachments?: any
word_count: null | number
workflow_state: WorkflowState
}> & {
assignedAssessments?: AssignedAssessments[]
attempt?: number
excused: boolean
external_tool_url?: string
grade: string | null
graded_at: string | null
gradingType: GradingType
has_originality_score?: any
hidden: boolean
posted_at: null | Date
proxy_submitter?: string
rawGrade: string | null
submission_comments: SubmissionComment[]
submitted_at: null | Date
turnitin_data?: TurnitinAsset & {
// TODO: refactor to separate out the dynamic object
[key: string]: any
}
updated_at: string
final_provisional_grade?: string
}
export type MissingSubmission = {
assignment_id: string
user_id: string
excused: boolean
late: boolean
missing: boolean
seconds_late: number
} & Partial<Submission>
export type AssignmentUserSubmissionMap = {
[assignmentId: string]: {
[userId: string]: Submission
}
}
export type UserSubmissionGroup = {
user_id: string
section_id: string
submissions: Submission[]
}
export type MediaTrack = {
id: string
locale: string
content: string
kind: string
src?: string
label?: string
language?: string
type?: string
}
export type MediaSource = {
height: string
url: string
content_type: string
width: string
label?: string
src?: string
}
export type MediaObject = {
id: string
media_type?: string
title?: string
media_sources: MediaSource[]
media_tracks: MediaTrack[]
}
export type SubmissionComment = Readonly<{
anonymous_id: string
attachments: Attachment[]
attempt?: number
author_id: string
avatar_path: string
cached_attachments: Attachment[]
comment: string
created_at: string
display_updated_at?: string
draft: boolean
edited_at: null | string
group_comment_id: string
id: string
is_read?: boolean
media_comment_id: string
media_comment_type: string
media_object?: MediaObject
publishable: boolean
submission_comment: SubmissionComment
updated_at: string
author?: {
id: string
display_name: string
avatar_image_url: string
html_url: string
}
}> & {
author_name: string
posted_at: string
}
export type SubmissionCommentData = {
group_comment: 1 | 0
text_comment: string
attempt?: number
}
export type GradingPeriod = Readonly<{
close_date: string
end_date: string
id: string
is_closed: boolean
is_last: boolean
permissions: {
read: boolean
update: boolean
create: boolean
delete: boolean
}
start_date: string
title: string
weight: number | null
}>
export type SubmissionAttemptsComments = {
attempts: {
[key: string]: SubmissionComment[]
}
}
export type GradingPeriodSet = Readonly<{
account_id: string
course_id: string | null
created_at: string
display_totals_for_all_grading_periods: boolean
enrollment_term_ids: string[]
grading_periods: GradingPeriod[]
id: string
permissions: unknown
root_account_id: string
title: string
updated_at: string
weighted: boolean
workflow_state: WorkflowState
}>
export type GradingPeriodSetGroup = {
grading_period_sets: GradingPeriodSet[]
}
export type LatePolicyStatus = 'missing' | 'late' | 'extended'
// /api/v1/users/self/history
export type HistoryEntry = Readonly<{
asset_code: string
asset_name: string
asset_icon: string
asset_readable_category: string
visited_url: string
visited_at: string
context_name: string
}>
// '/api/v1/accounts'
export type Account = Readonly<{
id: string
name: string
}>
// '/api/v1/users/self/favorites/courses?include[]=term&exclude[]=enrollments&sort=nickname',
export type Course = Readonly<{
id: string
name: string
workflow_state: string
enrollment_term_id: number
term: {
name: string
}
homeroom_course: boolean
sis_course_id: string | null
}>
// '/api/v1/users/self/tabs',
type TabCountsObj = Readonly<{
[key: string]: number | undefined
}>
export type ProfileTab = Readonly<{
id: string
label: string
html_url: string
counts: TabCountsObj
}>
// '/api/v1/users/self/groups?include[]=can_access',
export type AccessibleGroup = Readonly<{
id: string
name: string
can_access?: boolean
concluded: boolean
}>
// '/help_links',
export type HelpLink = Readonly<{
id: string
url: string
text: string
subtext?: string
feature_headline?: string
is_featured?: boolean
is_new?: boolean
no_new_window?: boolean
}>
// '/api/v1/release_notes/latest'
export type ReleaseNote = {
id: string
title: string
description: string
url: string
date: string
new: boolean
}