@@ -25,6 +25,7 @@ import DeleteModal from './delete-modal/DeleteModal';
2525import ReleaseNoteForm from './update-form/ReleaseNoteForm' ;
2626import ReleaseNotesSidebar from './sidebar/ReleaseNotesSidebar' ;
2727import { REQUEST_TYPES } from '../course-updates/constants' ;
28+ import { groupNotesByDate } from './utils/groupNotes' ;
2829
2930const ReleaseNotes = ( ) => {
3031 const intl = useIntl ( ) ;
@@ -77,24 +78,7 @@ const ReleaseNotes = () => {
7778 } ;
7879 } , [ isFormOpen ] ) ;
7980
80- const groups = useMemo ( ( ) => {
81- const map = new Map ( ) ;
82- ( notes || [ ] ) . forEach ( ( n ) => {
83- const key = n . published_at ? moment ( n . published_at ) . format ( 'YYYY-MM-DD' ) : 'unscheduled' ;
84- if ( ! map . has ( key ) ) { map . set ( key , [ ] ) ; }
85- map . get ( key ) . push ( n ) ;
86- } ) ;
87- const keys = Array . from ( map . keys ( ) ) . sort ( ( a , b ) => {
88- if ( a === 'unscheduled' ) { return 1 ; }
89- if ( b === 'unscheduled' ) { return - 1 ; }
90- return moment ( b ) . valueOf ( ) - moment ( a ) . valueOf ( ) ;
91- } ) ;
92- return keys . map ( ( k ) => ( {
93- key : k ,
94- label : k === 'unscheduled' ? intl . formatMessage ( { id : 'release-notes.unscheduled.label' , defaultMessage : 'Unscheduled' } ) : moment ( k ) . format ( 'MMMM D, YYYY' ) ,
95- items : map . get ( k ) ,
96- } ) ) ;
97- } , [ notes , intl ] ) ;
81+ const groups = useMemo ( ( ) => groupNotesByDate ( notes , intl ) , [ notes , intl ] ) ;
9882
9983 return (
10084 < >
@@ -111,7 +95,7 @@ const ReleaseNotes = () => {
11195 title = { intl . formatMessage ( messages . headingTitle ) }
11296 subtitle = ""
11397 instruction = ""
114- headerActions = { administrator ? (
98+ headerActions = { administrator && ! errors . loadingNotes ? (
11599 < Button
116100 variant = "primary"
117101 iconBefore = { AddIcon }
@@ -140,7 +124,11 @@ const ReleaseNotes = () => {
140124 < div id = { `note-${ post . id } ` } key = { post . id } className = "release-note-item mb-4 pb-4" >
141125 < div className = "d-flex justify-content-between align-items-start" >
142126 < div >
143- < h2 className = "mb-4 pb-4" > { moment ( post . published_at ) . format ( 'MMMM D, YYYY' ) } </ h2 >
127+ < h2 className = "mb-4 pb-4" >
128+ { post . published_at
129+ ? moment ( post . published_at ) . format ( 'MMMM D, YYYY' )
130+ : intl . formatMessage ( { id : 'release-notes.unscheduled.label' , defaultMessage : 'Unscheduled' } ) }
131+ </ h2 >
144132 { post . published_at && moment ( post . published_at ) . isAfter ( moment ( ) ) && (
145133 < OverlayTrigger
146134 placement = "right"
@@ -152,7 +140,13 @@ const ReleaseNotes = () => {
152140 </ Tooltip >
153141 ) }
154142 >
155- < div className = "d-inline-flex align-items-center text-muted small mr-2" role = "button" tabIndex = { 0 } >
143+ < button
144+ type = "button"
145+ className = "btn-link d-inline-flex align-items-center text-muted small mr-2 p-0 border-0 text-decoration-none"
146+ aria-label = { intl . formatMessage ( messages . scheduledTooltip , {
147+ date : `${ moment ( post . published_at ) . format ( 'MMMM D, YYYY h:mm A' ) } ${ getTzName ( new Date ( post . published_at ) ) } ` ,
148+ } ) }
149+ >
156150 < Icon
157151 className = "mr-1 p-0 justify-content-start scheduled-icon"
158152 src = { ClockIcon }
@@ -161,7 +155,7 @@ const ReleaseNotes = () => {
161155 } ) }
162156 />
163157 < span className = "post-scheduled" > { intl . formatMessage ( messages . scheduledLabel ) } </ span >
164- </ div >
158+ </ button >
165159 </ OverlayTrigger >
166160 ) }
167161 < div className = "d-flex align-items-center mb-1 justify-content-between" >
@@ -194,7 +188,7 @@ const ReleaseNotes = () => {
194188 { post . created_by && (
195189 < div className = "mt-3" >
196190 < small >
197- { intl . formatMessage ( { id : 'release-notes.questions.contact' , defaultMessage : 'Questions? Contact {email}' } , {
191+ { intl . formatMessage ( messages . questionsContact , {
198192 email : post . created_by ,
199193 } ) }
200194 </ small >
@@ -236,7 +230,7 @@ const ReleaseNotes = () => {
236230 </ ModalDialog . Title >
237231 </ ModalDialog . Header >
238232 < ModalDialog . Body >
239- { ( errors . savingNotes || errors . creatingNote ) && (
233+ { ( errors . savingNote || errors . creatingNote ) && (
240234 < Alert variant = "danger" icon = { Info } className = "mb-3" >
241235 { intl . formatMessage ( messages . errorSavingPost ) }
242236 </ Alert >
@@ -253,7 +247,7 @@ const ReleaseNotes = () => {
253247 isOpen = { isDeleteModalOpen }
254248 close = { closeDeleteModal }
255249 onDeleteSubmit = { handleDeleteUpdateSubmit }
256- errorDeleting = { errors . deletingNotes }
250+ errorDeleting = { errors . deletingNote }
257251 />
258252 < StudioFooterSlot />
259253 </ >
0 commit comments