diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationModel.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationModel.scala index e1c3d6837d..3741755aab 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationModel.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationModel.scala @@ -18,7 +18,7 @@ class PresentationModel { presentations.values.toVector } - def getCurrentPresentation(): Option[Presentation] = { // todo remove + def getCurrentPresentation(): Option[Presentation] = { presentations.values find (p => p.current) } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/db/PostgresProfile.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/db/PostgresProfile.scala index 8aa84994c0..59ce5b459f 100644 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/db/PostgresProfile.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/db/PostgresProfile.scala @@ -68,4 +68,4 @@ object JsonUtils { } } -} \ No newline at end of file +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Polls.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Polls.scala index 993d179db5..0c59f3be59 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Polls.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/Polls.scala @@ -8,6 +8,7 @@ import org.bigbluebutton.core.domain.MeetingState2x import scala.collection.mutable.ArrayBuffer import scala.collection.mutable.HashMap import org.bigbluebutton.core.running.LiveMeeting +import org.bigbluebutton.core.models.PresentationPage object Polls { @@ -111,7 +112,10 @@ object Polls { for { result <- getSimplePollResult(pollId, lm.polls) - shape = pollResultToWhiteboardShape(result) + pod <- state.presentationPodManager.getDefaultPod() + pres <- pod.getCurrentPresentation() + page <- PresentationInPod.getCurrentPage(pres) + shape = pollResultToWhiteboardShape(result, page) annot <- send(result, shape) } yield { lm.wbModel.addAnnotations(annot.wbId, lm.props.meetingProp.intId, requesterId, Array[AnnotationVO](annot), isPresenter = false, isModerator = false) @@ -251,15 +255,48 @@ object Polls { } } - private def pollResultToWhiteboardShape(result: SimplePollResultOutVO): scala.collection.immutable.Map[String, Object] = { + private def pollResultToWhiteboardShape(result: SimplePollResultOutVO, page: PresentationPage): scala.collection.immutable.Map[String, Object] = { + val maxImageWidth = 1440 + val maxImageHeight = 1080 + val poll_width = 300 + val poll_height = 200 + + val whiteboardRatio = Math.min(maxImageWidth / page.width, maxImageHeight / page.height); + val scaledWidth = page.width * whiteboardRatio + val scaledHeight = page.height * whiteboardRatio + + val x: Double = scaledWidth - poll_width + val y: Double = scaledHeight - poll_height + val shape = new scala.collection.mutable.HashMap[String, Object]() - shape += "numRespondents" -> Integer.valueOf(result.numRespondents) - shape += "numResponders" -> Integer.valueOf(result.numResponders) - shape += "questionType" -> result.questionType - shape += "questionText" -> result.questionText.getOrElse("") + val props = new scala.collection.mutable.HashMap[String, Object]() + val meta = new scala.collection.mutable.HashMap[String, Object]() + + props += "answers" -> result.answers + props += "numRespondents" -> Integer.valueOf(result.numRespondents) + props += "numResponders" -> Integer.valueOf(result.numResponders) + props += "questionText" -> result.questionText.getOrElse("") + props += "questionType" -> result.questionType + props += "w" -> Integer.valueOf(poll_width) + props += "h" -> Integer.valueOf(poll_height) + props += "fill" -> "black" + props += "color" -> "black" + props += "question" -> result.questionText.getOrElse("") + + shape += "x" -> java.lang.Double.valueOf(x) + shape += "y" -> java.lang.Double.valueOf(y) + shape += "isLocked" -> java.lang.Boolean.valueOf(false) + shape += "index" -> "a1" + shape += "rotation" -> Integer.valueOf(0) + shape += "parentId" -> "page:1" + shape += "typeName" -> "shape" + shape += "opacity" -> Integer.valueOf(1) shape += "id" -> s"shape:poll-result-${result.id}" - shape += "answers" -> result.answers - shape += "type" -> "geo" + shape += "meta" -> meta.toMap + shape += "type" -> "poll" + + shape += "props" -> props.toMap + shape.toMap } @@ -275,22 +312,6 @@ object Polls { } yield poll.toPollVO() } - // - // def numPolls(polls: Polls): Int = { - // polls.size - // } - // - // def addPoll(poll: Poll, model: PollModel) { - // model.polls += poll.id -> poll - // } - // - // def hasCurrentPoll(model: PollModel): Boolean = { - // model.currentPoll != None - // } - // - // def getCurrentPoll(model: PollModel): Option[PollVO] = { - // model.currentPoll - // } def getPolls(polls: Polls): Array[PollVO] = { val poll = new ArrayBuffer[PollVO] @@ -301,19 +322,6 @@ object Polls { poll.toArray } - // def clearPoll(pollID: String, model: PollModel): Boolean = { - // var success = false - // model.polls.get(pollID) match { - // case Some(p) => { - // p.clear - // success = true - // } - // case None => success = false - // } - // - // success - // } - // def startPoll(pollId: String, polls: Polls) { polls.get(pollId) foreach { p => @@ -321,29 +329,12 @@ object Polls { polls.currentPoll = Some(p) } } - // - // def removePoll(pollID: String, model: PollModel): Boolean = { - // var success = false - // model.polls.get(pollID) match { - // case Some(p) => { - // model.polls -= p.id - // success = true - // } - // case None => success = false - // } - // - // success - // } - // + def stopPoll(pollId: String, polls: Polls) { polls.get(pollId) foreach (p => p.stop()) PollDAO.updateEnded(pollId) } - // def hasPoll(pollId: String, model: PollModel): Boolean = { - // model.polls.get(pollId) != None - // } - // def getSimplePoll(pollId: String, polls: Polls): Option[SimplePollOutVO] = { var pvo: Option[SimplePollOutVO] = None polls.get(pollId) foreach (p => pvo = Some(p.toSimplePollOutVO())) @@ -762,14 +753,6 @@ class Polls { poll } - /* - private def remove(id: String): Option[Poll] = { - val poll = polls.get(id) - poll foreach (p => polls -= id) - poll - } - */ - private def get(id: String): Option[Poll] = { polls.get(id) } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/record/events/AddShapeWhiteboardRecordEvent.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/record/events/AddShapeWhiteboardRecordEvent.scala index de00268e45..f0e0a1e52f 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/record/events/AddShapeWhiteboardRecordEvent.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/record/events/AddShapeWhiteboardRecordEvent.scala @@ -103,4 +103,4 @@ object AddShapeWhiteboardRecordEvent { protected final val NUM_RESPONDERS = "num_responders" protected final val NUM_RESPONDENTS = "num_respondents" protected final val RESULT = "result" -} \ No newline at end of file +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/record/events/AddTldrawShapeWhiteboardRecordEvent.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/record/events/AddTldrawShapeWhiteboardRecordEvent.scala index cdba60459d..37cfd88815 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/record/events/AddTldrawShapeWhiteboardRecordEvent.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/record/events/AddTldrawShapeWhiteboardRecordEvent.scala @@ -31,13 +31,17 @@ class AddTldrawShapeWhiteboardRecordEvent extends AbstractWhiteboardRecordEvent implicit object AnyJsonFormat extends JsonFormat[Any] { def write(x: Any) = x match { - case n: Int => JsNumber(n) - case s: String => JsString(s) - case d: Double => JsNumber(d) + case n: Int => JsNumber(n) + case s: String => JsString(s) + case d: Double => JsNumber(d) case m: scala.collection.immutable.Map[String, _] => mapFormat[String, Any].write(m) - case l: List[_] => listFormat[Any].write(l) - case b: Boolean if b == true => JsTrue - case b: Boolean if b == false => JsFalse + case l: List[_] => listFormat[Any].write(l) + case b: Boolean if b == true => JsTrue + case b: Boolean if b == false => JsFalse + case v: SimpleVoteOutVO => JsObject("id" -> JsNumber(v.id), "key" -> JsString(v.key), "numVotes" -> JsNumber(v.numVotes)) + case arr: Array[_] => JsArray(arr.map(write).toVector) + case null => JsNull + case _ => throw new IllegalArgumentException(s"Unsupported type: ${x.getClass.getName}") } def read(value: JsValue) = {} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/endpoint/redis/RedisRecorderActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/endpoint/redis/RedisRecorderActor.scala index 10d8807c53..e47a7b6e64 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/endpoint/redis/RedisRecorderActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/endpoint/redis/RedisRecorderActor.scala @@ -291,8 +291,7 @@ class RedisRecorderActor( } private def handleSendWhiteboardAnnotationsEvtMsg(msg: SendWhiteboardAnnotationsEvtMsg) { - // filter poll annotations that are still not tldraw ready - msg.body.annotations.filter(!_.annotationInfo.contains("answers")).foreach(annotation => { + msg.body.annotations.foreach(annotation => { val ev = new AddTldrawShapeWhiteboardRecordEvent() ev.setMeetingId(msg.header.meetingId) ev.setPresentation(getPresentationId(annotation.wbId)) diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/component.jsx b/bigbluebutton-html5/imports/ui/components/whiteboard/component.jsx index c5eac32cc4..18ffa2355e 100644 --- a/bigbluebutton-html5/imports/ui/components/whiteboard/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/whiteboard/component.jsx @@ -32,8 +32,6 @@ import { notifyShapeNumberExceeded, getCustomEditorAssetUrls, getCustomAssetUrls import NoopTool from './custom-tools/noop-tool/component'; -import { PollShapeUtil } from './custom-shapes/poll/component'; - const CAMERA_TYPE = 'camera'; // Helper functions @@ -161,8 +159,6 @@ const Whiteboard = React.memo((props) => { // eslint-disable-next-line no-unused-vars const [shapesVersion, setShapesVersion] = React.useState(0); - - const customShapeUtils = [PollShapeUtil]; const customTools = [NoopTool]; const presenterChanged = usePrevious(isPresenter) !== isPresenter; @@ -1546,7 +1542,6 @@ const Whiteboard = React.memo((props) => { forceMobile hideUi={!(hasWBAccessRef.current || isPresenter)} onMount={handleTldrawMount} - shapeUtils={customShapeUtils} tools={customTools} /> { - static override type = 'poll' as const; - - static override props = pollShapeProps; - - static override migrations = pollShapeMigrations; - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - override isAspectRatioLocked = (_shape: IPollShape) => false; - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - override canResize = (_shape: IPollShape) => true; - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - override canBind = (_shape: IPollShape) => true; - - getDefaultProps(): IPollShape['props'] { - return { - w: 300, - h: 300, - color: 'black', - fill: 'white', - question: '', - numRespondents: 0, - numResponders: 0, - questionText: '', - questionType: '', - answers: [], - }; - } - - // eslint-disable-next-line class-methods-use-this - getGeometry(shape: IPollShape) { - return new Rectangle2d({ - width: shape.props.w, - height: shape.props.h, - isFilled: true, - }); - } - - component(shape: IPollShape) { - const { bounds } = this.editor.getShapeGeometry(shape); - const theme = getDefaultColorTheme({ - isDarkMode: this.editor.user.getIsDarkMode(), - }); - - const contentRef = React.useRef(null); - const pollMetadata = JSON.stringify({ - id: shape.id, - question: shape.props.question, - numRespondents: shape.props.numRespondents, - numResponders: shape.props.numResponders, - questionText: shape.props.questionText, - questionType: shape.props.questionType, - answers: shape.props.answers, - }); - - const adjustedHeight = shape.props.questionText.length > 0 ? bounds.height - 75 : bounds.height; - - return ( - -
- -
-
- ); - } - - // eslint-disable-next-line class-methods-use-this - indicator(shape: IPollShape) { - return ; - } - - override onResize: TLOnResizeHandler = (shape, info) => { - return resizeBox(shape, info); - } -} - -export default PollShapeUtil; diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/custom-shapes/poll/poll-shape-migrations.ts b/bigbluebutton-html5/imports/ui/components/whiteboard/custom-shapes/poll/poll-shape-migrations.ts deleted file mode 100644 index ecc7260377..0000000000 --- a/bigbluebutton-html5/imports/ui/components/whiteboard/custom-shapes/poll/poll-shape-migrations.ts +++ /dev/null @@ -1,25 +0,0 @@ -// @ts-nocheck - -import { defineMigrations } from '@bigbluebutton/tldraw'; - -// Migrations for the custom poll shape (optional but very helpful) -export const pollShapeMigrations = defineMigrations({ - currentVersion: 1, - migrators: { - 1: { - // example, removing a property from the shape - up(shape) { - const migratedUpShape = { ...shape }; - delete migratedUpShape.somePropertyToRemove; - return migratedUpShape; - }, - down(shape) { - const migratedDownShape = { ...shape }; - migratedDownShape.somePropertyToRemove = 'some value'; - return migratedDownShape; - }, - }, - }, -}); - -export default pollShapeMigrations; diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/custom-shapes/poll/poll-shape-props.ts b/bigbluebutton-html5/imports/ui/components/whiteboard/custom-shapes/poll/poll-shape-props.ts deleted file mode 100644 index 91c1e36f46..0000000000 --- a/bigbluebutton-html5/imports/ui/components/whiteboard/custom-shapes/poll/poll-shape-props.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { DefaultColorStyle, ShapeProps, T } from '@bigbluebutton/tldraw'; -import { IPollShape } from './poll-shape-types'; - -export const pollShapeProps: ShapeProps = { - w: T.number, - h: T.number, - color: DefaultColorStyle, - fill: T.string, - question: T.string, - numRespondents: T.number, - numResponders: T.number, - questionText: T.string, - questionType: T.string, - answers: T.any, -}; - -export default pollShapeProps; diff --git a/bigbluebutton-html5/imports/ui/components/whiteboard/custom-shapes/poll/poll-shape-types.ts b/bigbluebutton-html5/imports/ui/components/whiteboard/custom-shapes/poll/poll-shape-types.ts deleted file mode 100644 index a5af2387ad..0000000000 --- a/bigbluebutton-html5/imports/ui/components/whiteboard/custom-shapes/poll/poll-shape-types.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { TLBaseShape, TLDefaultColorStyle } from '@bigbluebutton/tldraw'; - -export type IPollShape = TLBaseShape< - 'poll', - { - w: number, - h: number, - color: TLDefaultColorStyle, - fill: string, - question: string, - numRespondents: number, - numResponders: number, - questionText: string, - questionType: string, - answers: Array<{ - id: number, - key: string, - numVotes: number, - }>, - } -> diff --git a/bigbluebutton-html5/package-lock.json b/bigbluebutton-html5/package-lock.json index 20b32a775f..e5cd6214f7 100644 --- a/bigbluebutton-html5/package-lock.json +++ b/bigbluebutton-html5/package-lock.json @@ -9,7 +9,7 @@ "dependencies": { "@apollo/client": "^3.10.4", "@babel/runtime": "^7.17.9", - "@bigbluebutton/tldraw": "^2.0.0-alpha.24", + "@bigbluebutton/tldraw": "^2.0.0-alpha.25", "@browser-bunyan/console-formatted-stream": "^1.8.0", "@browser-bunyan/console-raw-stream": "^1.8.0", "@browser-bunyan/server-stream": "^1.8.0", @@ -1978,15 +1978,16 @@ } }, "node_modules/@bigbluebutton/editor": { - "version": "2.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@bigbluebutton/editor/-/editor-2.0.0-alpha.23.tgz", - "integrity": "sha512-PZMYJ+dzBJv/XIVDxhVf/J0z6yAxadCTp26U9TA/2ptR04Y249xN7bOUb+KIuGSbjKrr6QxVLXJdN8RrMo35Fg==", + "version": "2.0.0-alpha.24", + "resolved": "https://registry.npmjs.org/@bigbluebutton/editor/-/editor-2.0.0-alpha.24.tgz", + "integrity": "sha512-bLhnBpuVo3YqtWktPY8I1nZ4A/eZ7WZP9hDfE+BmSc2ZGwAl0TIzzcUQKBoWAkA0I85ir7/Xim3fAZZm2lbK7Q==", + "license": "Apache-2.0", "dependencies": { - "@bigbluebutton/state": "2.0.0-alpha.20", - "@bigbluebutton/store": "2.0.0-alpha.20", - "@bigbluebutton/tlschema": "2.0.0-alpha.20", - "@bigbluebutton/utils": "2.0.0-alpha.20", - "@bigbluebutton/validate": "2.0.0-alpha.20", + "@bigbluebutton/state": "2.0.0-alpha.21", + "@bigbluebutton/store": "2.0.0-alpha.21", + "@bigbluebutton/tlschema": "2.0.0-alpha.21", + "@bigbluebutton/utils": "2.0.0-alpha.21", + "@bigbluebutton/validate": "2.0.0-alpha.21", "@types/core-js": "^2.5.5", "@use-gesture/react": "^10.2.27", "classnames": "^2.3.2", @@ -2004,40 +2005,47 @@ } }, "node_modules/@bigbluebutton/editor/node_modules/core-js": { - "version": "3.38.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.0.tgz", - "integrity": "sha512-XPpwqEodRljce9KswjZShh95qJ1URisBeKCjUdq27YdenkslVe7OO0ZJhlYXAChW7OhXaRLl8AAba7IBfoIHug==", + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", + "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==", "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/@bigbluebutton/state": { - "version": "2.0.0-alpha.20", - "resolved": "https://registry.npmjs.org/@bigbluebutton/state/-/state-2.0.0-alpha.20.tgz", - "integrity": "sha512-NWLlKFPZrznrascQMMALe6wXrlONfb4LBPY/VsDESkVxhDfC1IafbtZ45bI70UjuO7KpM6IqzhSNttZXLdI3og==", + "version": "2.0.0-alpha.21", + "resolved": "https://registry.npmjs.org/@bigbluebutton/state/-/state-2.0.0-alpha.21.tgz", + "integrity": "sha512-yioRXoBWzPtLZdzO0rCxaymfBewDmZ3098F6drncFz++InACBzmaqhZXXkAZFxLtsTwQQi4wL8vw9uYgcES8vA==", + "license": "Apache-2.0", + "dependencies": { + "@testing-library/react": "^16.0.0" + }, "peerDependencies": { "react": "^18" } }, "node_modules/@bigbluebutton/store": { - "version": "2.0.0-alpha.20", - "resolved": "https://registry.npmjs.org/@bigbluebutton/store/-/store-2.0.0-alpha.20.tgz", - "integrity": "sha512-JlUjff+pclpo2SH/4WE8cM7ONPYsCH3YaQcYFHm6AeepnD3SK7eXn8xUBREI56kmeENNsOK2AnYz1smZEb0zpg==", + "version": "2.0.0-alpha.21", + "resolved": "https://registry.npmjs.org/@bigbluebutton/store/-/store-2.0.0-alpha.21.tgz", + "integrity": "sha512-cgBcekfkW0AZMCVCNpopfuGEmlEziqQI1bnUdbOZAA8aWCTG5/WuqM9anknZKccg+Dvfr2d/g2FcCSMKDlUH4w==", + "license": "Apache-2.0", "dependencies": { - "@bigbluebutton/state": "2.0.0-alpha.20", - "@bigbluebutton/utils": "2.0.0-alpha.20", + "@bigbluebutton/state": "2.0.0-alpha.21", + "@bigbluebutton/utils": "2.0.0-alpha.21", "lodash.isequal": "^4.5.0", "nanoid": "4.0.2" } }, "node_modules/@bigbluebutton/tldraw": { - "version": "2.0.0-alpha.24", - "resolved": "https://registry.npmjs.org/@bigbluebutton/tldraw/-/tldraw-2.0.0-alpha.24.tgz", - "integrity": "sha512-MCNkpvkd4nqHXA4pfeQwA286CUZkIeQ+CFSAlkT48MBmZsa6de+mg9kKHmeOU0BnK4F/W2BOBHfDYDKrR6T6hw==", + "version": "2.0.0-alpha.25", + "resolved": "https://registry.npmjs.org/@bigbluebutton/tldraw/-/tldraw-2.0.0-alpha.25.tgz", + "integrity": "sha512-0DlcHUOryCxhNmZhvXXJNaOi1N99F00OPJj6HHnTXlf/qAIRFBWJn6o1w288ORRULL6gE9WVG2K7+xuN17zaew==", + "license": "Apache-2.0", "dependencies": { - "@bigbluebutton/editor": "2.0.0-alpha.23", + "@bigbluebutton/editor": "2.0.0-alpha.24", "@radix-ui/react-alert-dialog": "^1.0.0", "@radix-ui/react-context-menu": "^2.1.5", "@radix-ui/react-dialog": "^1.0.5", @@ -2058,28 +2066,31 @@ } }, "node_modules/@bigbluebutton/tlschema": { - "version": "2.0.0-alpha.20", - "resolved": "https://registry.npmjs.org/@bigbluebutton/tlschema/-/tlschema-2.0.0-alpha.20.tgz", - "integrity": "sha512-Pl7mhU19zNtUBEE/QkTU1W18Uci+qH8MvYd+p2AlbGRk63uDqULQDWCoQuBSYWvDmmgrlvgOpvB+x3YeFuMnuw==", + "version": "2.0.0-alpha.21", + "resolved": "https://registry.npmjs.org/@bigbluebutton/tlschema/-/tlschema-2.0.0-alpha.21.tgz", + "integrity": "sha512-redk2SmrU8hG0Rwl4cYn8mkp4iqT0Bk3A3pmlqMuI+c0O1r6Ko41C0gviKqfHRlnNqObq5JcYFirxc/UO+L75g==", + "license": "Apache-2.0", "dependencies": { - "@bigbluebutton/state": "2.0.0-alpha.20", - "@bigbluebutton/store": "2.0.0-alpha.20", - "@bigbluebutton/utils": "2.0.0-alpha.20", - "@bigbluebutton/validate": "2.0.0-alpha.20", + "@bigbluebutton/state": "2.0.0-alpha.21", + "@bigbluebutton/store": "2.0.0-alpha.21", + "@bigbluebutton/utils": "2.0.0-alpha.21", + "@bigbluebutton/validate": "2.0.0-alpha.21", "nanoid": "4.0.2" } }, "node_modules/@bigbluebutton/utils": { - "version": "2.0.0-alpha.20", - "resolved": "https://registry.npmjs.org/@bigbluebutton/utils/-/utils-2.0.0-alpha.20.tgz", - "integrity": "sha512-ikED5jKof9fDYsx7d75r/b6l6U/qlVTD0tnX/eB7khvZEyrdsmPpxeZeRx3B6nz5XogndupozoWqJCQAlP7nqA==" + "version": "2.0.0-alpha.21", + "resolved": "https://registry.npmjs.org/@bigbluebutton/utils/-/utils-2.0.0-alpha.21.tgz", + "integrity": "sha512-4Cc90N6HJMTdCtk8lm9mTEI6oBF3Sg3b1rWLeSNWCIfCed/lrfilTw80PrskGzznwkWkGbtmFCE9vQmpB6Ppbg==", + "license": "Apache-2.0" }, "node_modules/@bigbluebutton/validate": { - "version": "2.0.0-alpha.20", - "resolved": "https://registry.npmjs.org/@bigbluebutton/validate/-/validate-2.0.0-alpha.20.tgz", - "integrity": "sha512-RK3VF1WrLRmOMejcNSTKW0eHs2h3Rxci+LU8AA6373ICSGuviT5HCxGkT9caixMX4+A20wd969nPaCurqoxFDQ==", + "version": "2.0.0-alpha.21", + "resolved": "https://registry.npmjs.org/@bigbluebutton/validate/-/validate-2.0.0-alpha.21.tgz", + "integrity": "sha512-fQ7DBLPVCos1HMCC8KA52Lhm4uRAdg3PCsUuAU+fgHF2sMzuCIinjKX86U1f2MPSZKpbEWeKOIhojQnWErC5tw==", + "license": "Apache-2.0", "dependencies": { - "@bigbluebutton/utils": "2.0.0-alpha.20" + "@bigbluebutton/utils": "2.0.0-alpha.21" } }, "node_modules/@browser-bunyan/console-formatted-stream": { @@ -4338,6 +4349,146 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/dom/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT", + "peer": true + }, + "node_modules/@testing-library/dom/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/dom/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.1.tgz", + "integrity": "sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "license": "MIT", + "peer": true + }, "node_modules/@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", @@ -4379,7 +4530,8 @@ "node_modules/@types/core-js": { "version": "2.5.8", "resolved": "https://registry.npmjs.org/@types/core-js/-/core-js-2.5.8.tgz", - "integrity": "sha512-VgnAj6tIAhJhZdJ8/IpxdatM8G4OD3VWGlp6xIxUGENZlpbob9Ty4VVdC1FIEp0aK6DBscDDjyzy5FB60TuNqg==" + "integrity": "sha512-VgnAj6tIAhJhZdJ8/IpxdatM8G4OD3VWGlp6xIxUGENZlpbob9Ty4VVdC1FIEp0aK6DBscDDjyzy5FB60TuNqg==", + "license": "MIT" }, "node_modules/@types/d3-array": { "version": "3.2.1", @@ -4935,12 +5087,14 @@ "node_modules/@use-gesture/core": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", - "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==" + "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==", + "license": "MIT" }, "node_modules/@use-gesture/react": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", + "license": "MIT", "dependencies": { "@use-gesture/core": "10.3.1" }, @@ -5345,7 +5499,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -7261,6 +7414,13 @@ "node": ">=6.0.0" } }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "license": "MIT", + "peer": true + }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -9746,7 +9906,8 @@ "node_modules/idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "license": "ISC" }, "node_modules/ignore": { "version": "5.3.1", @@ -10952,7 +11113,8 @@ "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -10962,7 +11124,8 @@ "node_modules/lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "license": "MIT" }, "node_modules/lodash.truncate": { "version": "4.4.2", @@ -10973,7 +11136,8 @@ "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" }, "node_modules/log-update": { "version": "4.0.0", @@ -11813,6 +11977,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.js" }, @@ -12925,6 +13090,41 @@ "renderkid": "^3.0.0" } }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT", + "peer": true + }, "node_modules/probe-image-size": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", diff --git a/bigbluebutton-html5/package.json b/bigbluebutton-html5/package.json index 8825f0d816..6c529b4819 100644 --- a/bigbluebutton-html5/package.json +++ b/bigbluebutton-html5/package.json @@ -38,7 +38,7 @@ "dependencies": { "@apollo/client": "^3.10.4", "@babel/runtime": "^7.17.9", - "@bigbluebutton/tldraw": "^2.0.0-alpha.24", + "@bigbluebutton/tldraw": "^2.0.0-alpha.25", "@browser-bunyan/console-formatted-stream": "^1.8.0", "@browser-bunyan/console-raw-stream": "^1.8.0", "@browser-bunyan/server-stream": "^1.8.0",