Merge branch 'master' of https://github.com/bigbluebutton/bigbluebutton into fix-client-loggin

This commit is contained in:
Richard Alam 2016-07-18 20:55:13 +00:00
commit 3f99fe6f19
12 changed files with 120 additions and 16 deletions

View File

@ -94,7 +94,7 @@ class JsonMessageSenderActor(val service: MessageSender)
private def handleCreateBreakoutRoom(msg: CreateBreakoutRoom) {
val payload = new CreateBreakoutRoomRequestPayload(msg.room.breakoutId, msg.room.parentId, msg.room.name,
msg.room.voiceConfId, msg.room.viewerPassword, msg.room.moderatorPassword,
msg.room.durationInMinutes, msg.room.defaultPresentationURL)
msg.room.durationInMinutes, msg.room.defaultPresentationURL, msg.room.record)
val request = new CreateBreakoutRoomRequest(payload)
service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson())
}

View File

@ -33,7 +33,7 @@ case class CreateBreakoutRoom(meetingId: String, recorded: Boolean, room: Breako
case class EndBreakoutRoom(breakoutId: String) extends IOutMessage
case class BreakoutRoomOutPayload(breakoutId: String, name: String, parentId: String,
voiceConfId: String, durationInMinutes: Int, moderatorPassword: String, viewerPassword: String,
defaultPresentationURL: String)
defaultPresentationURL: String, record: Boolean)
case class BreakoutRoomJoinURLOutMessage(meetingId: String, recorded: Boolean, breakoutId: String, userId: String, joinURL: String) extends IOutMessage
case class BreakoutRoomStartedOutMessage(meetingId: String, recorded: Boolean, breakout: BreakoutRoomBody) extends IOutMessage
case class BreakoutRoomBody(name: String, breakoutId: String)

View File

@ -44,7 +44,7 @@ trait BreakoutRoomApp extends SystemConfiguration {
val r = breakoutModel.createBreakoutRoom(breakoutMeetingId, room.name, voiceConfId, room.users, presURL)
val p = new BreakoutRoomOutPayload(r.id, r.name, mProps.meetingID,
r.voiceConfId, msg.durationInMinutes, bbbWebModeratorPassword, bbbWebViewerPassword,
r.defaultPresentationURL)
r.defaultPresentationURL, mProps.recorded)
outGW.send(new CreateBreakoutRoom(mProps.meetingID, mProps.recorded, p))
}
meetingModel.breakoutRoomsdurationInMinutes = msg.durationInMinutes;

View File

@ -9,10 +9,11 @@ public class CreateBreakoutRoomRequestPayload {
public final String moderatorPassword;
public final Integer durationInMinutes; // The duration of the breakout room
public final String defaultPresentationURL;
public final Boolean record;
public CreateBreakoutRoomRequestPayload(String breakoutId, String parentId, String name,
String voiceConfId, String viewerPassword, String moderatorPassword,
Integer duration, String defaultPresentationURL) {
Integer duration, String defaultPresentationURL, Boolean record) {
this.breakoutId = breakoutId;
this.parentId = parentId;
this.name = name;
@ -21,5 +22,6 @@ public class CreateBreakoutRoomRequestPayload {
this.moderatorPassword = moderatorPassword;
this.durationInMinutes = duration;
this.defaultPresentationURL = defaultPresentationURL;
this.record = record;
}
}

View File

@ -24,7 +24,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:mate="http://mate.asfusion.com/"
width="630" height="540"
width="630" height="600"
close="onCloseClicked()"
creationComplete="creationCompleteHandler(event)"
showCloseButton="false">
@ -143,19 +143,20 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
</mx:Canvas>
<mx:HBox id="roomsBox" paddingTop="20" width="100%">
<mx:HBox width="33%" horizontalAlign="left">
<mx:HBox width="50%" height="100%" horizontalAlign="left" verticalAlign="middle">
<mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.breakout.rooms')}" />
<mx:ComboBox id="roomsCombo" width="80%" change="{assignUsers()}" dataProvider="{roomsProvider}"/>
</mx:HBox>
<mx:HBox width="33%" horizontalAlign="center">
<mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.breakout.timeLimit')}" />
<mx:NumericStepper id="durationStepper" value="15" minimum="1" maximum="600"/>
<mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.breakout.minutes')}"/>
</mx:HBox>
<mx:Button paddingLeft="20" width="33%" id="randomAssignBtn"
<mx:Button paddingLeft="20" width="50%" id="randomAssignBtn"
label="{ResourceUtil.getInstance().getString('bbb.users.breakout.randomAssign')}" click="assignUsers()"/>
</mx:HBox>
<mx:HBox width="100%" paddingTop="12">
<mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.breakout.timeLimit')}" />
<mx:NumericStepper id="durationStepper" value="15" minimum="1" maximum="600"/>
<mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.breakout.minutes')}"/>
</mx:HBox>
<mx:Tile id="roomsContainer" styleName="roomsContainer" width="100%" height="100%"/>
<mx:HBox width="100%" horizontalAlign="right" verticalGap="15">

View File

@ -585,7 +585,7 @@
<mx:VBox id="roomsBox" styleName="breakoutRoomsBox"
visible="{breakoutRoomsList.length > 0 &amp;&amp; amIModerator}"
includeInLayout="{breakoutRoomsList.length > 0 &amp;&amp; amIModerator}"
width="100%" height="50%">
width="100%" height="180">
<mx:HBox width="100%">
<mx:Label text="{ResourceUtil.getInstance().getString('bbb.users.breakout.breakoutRooms')}"/>
<mx:Label width="100%" textAlign="right" id="breakoutTimeLabel"/>

View File

@ -1,5 +1,6 @@
import React, { PropTypes } from 'react';
import WhiteboardShapeModel from './shape-factory/component.jsx';
import Cursor from './cursor/component.jsx';
import { createContainer } from 'meteor/react-meteor-data';
import Slide from './slide/component.jsx';
import styles from './styles.scss';
@ -62,6 +63,15 @@ export default class Whiteboard extends React.Component {
/>
)
: null }
<Cursor
viewBoxWidth={viewBoxWidth}
viewBoxHeight={viewBoxHeight}
viewBoxX={x}
viewBoxY={y}
widthRatio={slideObj.width_ratio}
cursorX={this.props.cursor[0].x}
cursorY={this.props.cursor[0].y}
/>
</g>
</svg>
</ReactCSSTransitionGroup>

View File

@ -0,0 +1,81 @@
import React, { Component, PropTypes } from 'react';
import WhiteboardService from '/imports/ui/components/whiteboard/service.js';
const propTypes = {
//Width of the view box
viewBoxWidth: PropTypes.number.isRequired,
//Height of the view box
viewBoxHeight: PropTypes.number.isRequired,
//x Position of the view box
viewBoxX: PropTypes.number.isRequired,
//y Position of the view box
viewBoxY: PropTypes.number.isRequired,
//Slide to view box width ratio
widthRatio: PropTypes.number.isRequired,
//Defines the cursor x position
cursorX: PropTypes.number.isRequired,
//Defines the cursor y position
cursorY: PropTypes.number.isRequired,
/**
* Defines the cursor fill colour
* @defaultValue 'red'
*/
fill: PropTypes.string,
/**
* Defines the cursor radius
* @defaultValue 5
*/
radius: PropTypes.number,
};
const defaultProps = {
fill: 'red',
radius: 5,
};
export default class Cursor extends Component {
constructor(props) {
super(props);
}
render() {
const {
viewBoxWidth,
viewBoxHeight,
viewBoxX,
viewBoxY,
widthRatio,
cursorX,
cursorY,
fill,
radius,
} = this.props;
//Adjust the x,y cursor position according to zoom
let cx = (cursorX * viewBoxWidth) + viewBoxX;
let cy = (cursorY * viewBoxHeight) + viewBoxY;
//Adjust the radius of the cursor according to zoom
let finalRadius = radius * widthRatio / 100;
return (
<circle
cx={cx}
cy={cy}
r={finalRadius}
fill={fill}
/>
);
}
}
Cursor.propTypes = propTypes;
Cursor.defaultProps = defaultProps;

View File

@ -1,10 +1,12 @@
import Presentations from '/imports/api/presentations';
import Shapes from '/imports/api/shapes';
import Slides from '/imports/api/slides';
import Cursor from '/imports/api/cursor';
let getWhiteboardData = () => {
let currentSlide;
let shapes;
let cursor;
let currentPresentation = Presentations.findOne({
'presentation.current': true,
});
@ -20,11 +22,16 @@ let getWhiteboardData = () => {
shapes = Shapes.find({
whiteboardId: currentSlide.slide.id,
}).fetch();
cursor = Cursor.find({
meetingId: currentSlide.meetingId,
}).fetch();
}
return {
currentSlide: currentSlide,
shapes: shapes,
cursor: cursor,
};
};

View File

@ -524,6 +524,7 @@ public class MeetingService implements MessageListener {
params.put("moderatorPW", message.moderatorPassword);
params.put("voiceBridge", message.voiceConfId);
params.put("duration", message.durationInMinutes.toString());
params.put("record", message.record.toString());
Meeting breakout = paramsProcessorUtil.processCreateParams(params);

View File

@ -79,7 +79,8 @@ public class MeetingMessageHandler implements MessageHandler {
msg.payload.viewerPassword,
msg.payload.moderatorPassword,
msg.payload.durationInMinutes,
msg.payload.defaultPresentationURL));
msg.payload.defaultPresentationURL,
msg.payload.record));
}
}

View File

@ -1,6 +1,5 @@
package org.bigbluebutton.api.messaging.messages;
public class CreateBreakoutRoom implements IMessage {
public final String breakoutId;
@ -11,10 +10,11 @@ public class CreateBreakoutRoom implements IMessage {
public final String moderatorPassword;
public final Integer durationInMinutes; // The duration of the breakout room
public final String defaultPresentationURL;
public final Boolean record;
public CreateBreakoutRoom(String breakoutId, String parentId, String name,
String voiceConfId, String viewerPassword, String moderatorPassword,
Integer duration, String defaultPresentationURL) {
Integer duration, String defaultPresentationURL, Boolean record) {
this.breakoutId = breakoutId;
this.parentId = parentId;
this.name = name;
@ -23,5 +23,6 @@ public class CreateBreakoutRoom implements IMessage {
this.moderatorPassword = moderatorPassword;
this.durationInMinutes = duration;
this.defaultPresentationURL = defaultPresentationURL;
this.record = record;
}
}