bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/presentation/service.js

212 lines
5.4 KiB
JavaScript
Executable File

import Presentations from '/imports/api/presentations';
import { Slides, SlidePositions } from '/imports/api/slides';
import PollService from '/imports/ui/components/poll/service';
import { safeMatch } from '/imports/utils/string-utils';
const POLL_SETTINGS = Meteor.settings.public.poll;
const MAX_CUSTOM_FIELDS = POLL_SETTINGS.maxCustom;
const getCurrentPresentation = (podId) => Presentations.findOne({
podId,
current: true,
});
const downloadPresentationUri = (podId) => {
const currentPresentation = getCurrentPresentation(podId);
if (!currentPresentation) {
return null;
}
const presentationFileName = `${currentPresentation.id}.${currentPresentation.name.split('.').pop()}`;
const APP = Meteor.settings.public.app;
const uri = `${APP.bbbWebBase}/presentation/download/`
+ `${currentPresentation.meetingId}/${currentPresentation.id}`
+ `?presFilename=${encodeURIComponent(presentationFileName)}`;
return uri;
};
const isPresentationDownloadable = (podId) => {
const currentPresentation = getCurrentPresentation(podId);
if (!currentPresentation) {
return null;
}
return currentPresentation.downloadable;
};
const getCurrentSlide = (podId) => {
const currentPresentation = getCurrentPresentation(podId);
if (!currentPresentation) {
return null;
}
return Slides.findOne({
podId,
presentationId: currentPresentation.id,
current: true,
}, {
fields: {
meetingId: 0,
thumbUri: 0,
txtUri: 0,
},
});
};
const getSlidePosition = (podId, presentationId, slideId) => SlidePositions.findOne({
podId,
presentationId,
id: slideId,
});
const currentSlidHasContent = () => {
const currentSlide = getCurrentSlide('DEFAULT_PRESENTATION_POD');
if (!currentSlide) return false;
const {
content,
} = currentSlide;
return !!content.length;
};
const parseCurrentSlideContent = (yesValue, noValue, abstentionValue, trueValue, falseValue) => {
const { pollTypes } = PollService;
const currentSlide = getCurrentSlide('DEFAULT_PRESENTATION_POD');
const quickPollOptions = [];
if (!currentSlide) return quickPollOptions;
let {
content,
} = currentSlide;
const questionRegex = /.*?\?$/gm;
const question = safeMatch(questionRegex, content, '');
const doubleQuestionRegex = /\?{2}/gm;
const doubleQuestion = safeMatch(doubleQuestionRegex, content, false);
const yesNoPatt = /.*(yes\/no|no\/yes).*/gm;
const hasYN = safeMatch(yesNoPatt, content, false);
const pollRegex = /[1-9A-Ia-i][.)].*/g;
let optionsPoll = safeMatch(pollRegex, content, []);
const optionsWithLabels = [];
if (optionsPoll) {
optionsPoll = optionsPoll.map((opt) => {
const MAX_CHAR_LIMIT = 30;
const formattedOpt = opt.substring(0, MAX_CHAR_LIMIT);
optionsWithLabels.push(formattedOpt);
return `\r${opt[0]}.`;
});
}
optionsPoll.reduce((acc, currentValue) => {
const lastElement = acc[acc.length - 1];
if (!lastElement) {
acc.push({
options: [currentValue],
});
return acc;
}
const {
options,
} = lastElement;
const lastOption = options[options.length - 1];
const isLastOptionInteger = !!parseInt(lastOption.charAt(1), 10);
const isCurrentValueInteger = !!parseInt(currentValue.charAt(1), 10);
if (isLastOptionInteger === isCurrentValueInteger) {
if (currentValue.toLowerCase().charCodeAt(1) > lastOption.toLowerCase().charCodeAt(1)) {
options.push(currentValue);
} else {
acc.push({
options: [currentValue],
});
}
} else {
acc.push({
options: [currentValue],
});
}
return acc;
}, []).filter(({
options,
}) => options.length > 1 && options.length < 10).forEach((p) => {
const poll = p;
if (doubleQuestion) poll.multiResp = true;
if (poll.options.length <= 5 || MAX_CUSTOM_FIELDS <= 5) {
const maxAnswer = poll.options.length > MAX_CUSTOM_FIELDS
? MAX_CUSTOM_FIELDS
: poll.options.length;
quickPollOptions.push({
type: `${pollTypes.Letter}${maxAnswer}`,
poll,
});
} else {
quickPollOptions.push({
type: pollTypes.Custom,
poll,
});
}
});
if (question.length > 0 && optionsPoll.length === 0 && !doubleQuestion && !hasYN) {
quickPollOptions.push({
type: 'R-',
poll: {
question: question[0],
},
});
}
if (quickPollOptions.length > 0) {
content = content.replace(new RegExp(pollRegex), '');
}
const ynPoll = PollService.matchYesNoPoll(yesValue, noValue, content);
const ynaPoll = PollService.matchYesNoAbstentionPoll(yesValue, noValue, abstentionValue, content);
const tfPoll = PollService.matchTrueFalsePoll(trueValue, falseValue, content);
ynPoll.forEach((poll) => quickPollOptions.push({
type: pollTypes.YesNo,
poll,
}));
ynaPoll.forEach((poll) => quickPollOptions.push({
type: pollTypes.YesNoAbstention,
poll,
}));
tfPoll.forEach((poll) => quickPollOptions.push({
type: pollTypes.TrueFalse,
poll,
}));
const pollQuestion = (question?.length > 0 && question[0]?.replace(/ *\([^)]*\) */g, '')) || '';
return {
slideId: currentSlide.id,
quickPollOptions,
optionsWithLabels,
pollQuestion,
};
};
export default {
getCurrentSlide,
getSlidePosition,
isPresentationDownloadable,
downloadPresentationUri,
currentSlidHasContent,
parseCurrentSlideContent,
getCurrentPresentation,
};