diff --git a/bigbluebutton-html5/imports/api/presentations/server/modifiers/addPresentation.js b/bigbluebutton-html5/imports/api/presentations/server/modifiers/addPresentation.js index 4086b4376503b4fa1093221d813f40d35d920082..d7c81657e0f96cc429f74fc5fe2726e37ca7cc9d 100644 --- a/bigbluebutton-html5/imports/api/presentations/server/modifiers/addPresentation.js +++ b/bigbluebutton-html5/imports/api/presentations/server/modifiers/addPresentation.js @@ -1,3 +1,4 @@ +import { HTTP } from 'meteor/http'; import { check } from 'meteor/check'; import Presentations from '/imports/api/presentations'; import Logger from '/imports/startup/server/logger'; @@ -6,10 +7,20 @@ import flat from 'flat'; import addSlide from '/imports/api/slides/server/modifiers/addSlide'; import setCurrentPresentation from './setCurrentPresentation'; +const getSlideText = async (url) => { + const file = await HTTP.get(url); + + return file; +}; + const addSlides = (meetingId, podId, presentationId, slides) => { const slidesAdded = []; - slides.forEach((slide) => { + slides.forEach(async (slide) => { + const { content } = await getSlideText(slide.txtUri); + + Object.assign(slide, { content }); + slidesAdded.push(addSlide(meetingId, podId, presentationId, slide)); }); diff --git a/bigbluebutton-html5/imports/api/slides/server/modifiers/addSlide.js b/bigbluebutton-html5/imports/api/slides/server/modifiers/addSlide.js index cc661a338635b378e3c96f679100ff65cd0efced..7d7d56be26d948e741948b69168a2ffc12cfed73 100644 --- a/bigbluebutton-html5/imports/api/slides/server/modifiers/addSlide.js +++ b/bigbluebutton-html5/imports/api/slides/server/modifiers/addSlide.js @@ -56,6 +56,7 @@ export default function addSlide(meetingId, podId, presentationId, slide) { yOffset: Number, widthRatio: Number, heightRatio: Number, + content: String, }); const selector = { diff --git a/bigbluebutton-html5/imports/ui/components/presentation/component.jsx b/bigbluebutton-html5/imports/ui/components/presentation/component.jsx index a8e8262755373a30adb96afc095ebb81360c78c2..096ee2baf30f31a4ef65fb5fb2786af749cd3979 100644 --- a/bigbluebutton-html5/imports/ui/components/presentation/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/presentation/component.jsx @@ -20,6 +20,14 @@ const intlMessages = defineMessages({ id: 'app.presentationUploder.title', description: 'presentation area element label', }, + slideContentStart: { + id: 'app.presentation.startSlideContent', + description: 'Indicate the slide content start', + }, + slideContentEnd: { + id: 'app.presentation.endSlideContent', + description: 'Indicate the slide content end', + }, }); const isFullscreen = () => document.fullscreenElement !== null; @@ -198,7 +206,7 @@ class PresentationArea extends Component { // renders the whole presentation area renderPresentationArea() { const { fitToWidth } = this.state; - const { podId, currentSlide } = this.props; + const { podId, currentSlide, intl } = this.props; if (!this.isPresentationAccessible()) return null; // to control the size of the svg wrapper manually @@ -210,6 +218,10 @@ class PresentationArea extends Component { const presentationCloseButton = renderPresentationClose(); const presentationFullscreenButton = this.renderPresentationFullscreen(); + const slideContent = `${intl.formatMessage(intlMessages.slideContentStart)} + ${currentSlide.content} + ${intl.formatMessage(intlMessages.slideContentEnd)}`; + // retrieving the pre-calculated data from the slide object const { x, @@ -231,7 +243,10 @@ class PresentationArea extends Component { return ( <div style={svgDimensions} + aria-label="Slide Content" + aria-describedby="currentSlideText" > + <p id="currentSlideText" hidden>{slideContent}</p> {presentationCloseButton} {presentationFullscreenButton} <TransitionGroup> @@ -423,8 +438,8 @@ class PresentationArea extends Component { ref={(ref) => { this.refWhiteboardArea = ref; }} className={styles.whiteboardSizeAvailable} /> - {showSlide ? this.renderPresentationArea() : null } - {userIsPresenter || multiUser ? this.renderWhiteboardToolbar() : null } + {showSlide ? this.renderPresentationArea() : null} + {userIsPresenter || multiUser ? this.renderWhiteboardToolbar() : null} </div> {this.renderPresentationToolbar()} </div> diff --git a/bigbluebutton-html5/imports/ui/components/presentation/service.js b/bigbluebutton-html5/imports/ui/components/presentation/service.js index cec3e0b5c6bf07f107db98a9d86763cae2bad997..b990efe7c143a5e2bc4bc05e1c81ff168800a1b5 100644 --- a/bigbluebutton-html5/imports/ui/components/presentation/service.js +++ b/bigbluebutton-html5/imports/ui/components/presentation/service.js @@ -23,15 +23,6 @@ const getCurrentSlide = (podId) => { presentationId: currentPresentation.id, current: true, }, - { - fields: { - meetingId: 0, - thumbUri: 0, - swfUri: 0, - txtUri: 0, - svgUri: 0, - }, - }, ); }; diff --git a/bigbluebutton-html5/private/locales/en.json b/bigbluebutton-html5/private/locales/en.json index 76fadde7ec1d92a0fcdaf09647ab918f59684c0f..104fa4eb447531cb2ea5f670d7d9a9b130a93dc5 100755 --- a/bigbluebutton-html5/private/locales/en.json +++ b/bigbluebutton-html5/private/locales/en.json @@ -67,6 +67,8 @@ "app.meeting.alertMeetingEndsUnderOneMinute": "Meeting is closing in a minute.", "app.meeting.alertBreakoutEndsUnderOneMinute": "Breakout is closing in a minute.", "app.presentation.close": "Close presentation", + "app.presentation.startSlideContent": "Slide content start", + "app.presentation.endSlideContent": "Slide content end", "app.presentation.presentationToolbar.prevSlideLabel": "Previous slide", "app.presentation.presentationToolbar.prevSlideDesc": "Change the presentation to the previous slide", "app.presentation.presentationToolbar.nextSlideLabel": "Next slide",