Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BC-8168 - Implementing video conferences in FE and remaining issues #3480

Merged
merged 57 commits into from
Jan 17, 2025
Merged
Show file tree
Hide file tree
Changes from 53 commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
f69f252
rewrite videoconference store as composable for parallel conferences
MartinSchuhmacher Dec 18, 2024
827effd
rewrite VC element to fit new composable usage
MartinSchuhmacher Dec 18, 2024
964d9c5
rewrite unit tests to summarize setups
MartinSchuhmacher Dec 18, 2024
a10cd70
separating ConfigurationDialog into separate component
MartinSchuhmacher Dec 18, 2024
96f3ca4
approaching unit tests for VideoConferenceConfigurationDialog
MartinSchuhmacher Dec 18, 2024
55eabdb
Merge branch 'main' into BC-8168-bbb-finalize
MartinSchuhmacher Dec 18, 2024
cdec9b7
pushing current test WIP for configuration dialog component
MartinSchuhmacher Dec 18, 2024
1d5e6d3
use outlined video icon
odalys-dataport Dec 18, 2024
4fca722
Merge branch 'BC-8168-bbb-finalize' of https://github.com/hpi-schul-c…
odalys-dataport Dec 18, 2024
e4064d8
adjust pulse animation & pulsate 5 times
odalys-dataport Dec 18, 2024
ac2a7f7
fixing and adding tests for VideoConferenceConfigurationDialog
MartinSchuhmacher Dec 19, 2024
7d33c53
Merge branch 'main' into BC-8168-bbb-finalize
MartinSchuhmacher Dec 19, 2024
d6b50b9
adding note for deep watcher in configuration dialog
MartinSchuhmacher Dec 19, 2024
859ffe3
adding type safety for boardapi composable
MartinSchuhmacher Dec 19, 2024
80bf049
Merge branch 'main' into BC-8168-bbb-finalize
MartinSchuhmacher Dec 19, 2024
0b3625f
Fix wording in dialog and show status right aligned
Dec 20, 2024
c910de4
remove comment
f-g-s Dec 20, 2024
ba56f0b
moving VC configuration dialog to ui folder
MartinSchuhmacher Dec 20, 2024
1b8a563
adjusting Room VC section to script setup and use configuration dialo…
MartinSchuhmacher Dec 20, 2024
506345d
Merge branch 'main' of https://github.com/hpi-schul-cloud/nuxt-client…
odalys-dataport Jan 6, 2025
ae12605
fix pulsating dot always being there
odalys-dataport Jan 6, 2025
297d1b6
setting link prop on bbb card should fix hover discrepancy
odalys-dataport Jan 6, 2025
c3c7d6a
use contentelementbar in bbb-element-create
odalys-dataport Jan 6, 2025
e5f879d
add missing imports
odalys-dataport Jan 6, 2025
0d49bcd
remove ContentElementBar again from bbb-create
odalys-dataport Jan 6, 2025
b456d41
add responsive layout to videoconf create
f-g-s Jan 7, 2025
12bf75d
refactoring configuration dialog
MartinSchuhmacher Jan 8, 2025
c4a5b08
adjust base values to BE defaults
MartinSchuhmacher Jan 8, 2025
2766bf9
refactor variable naming for list layout
MartinSchuhmacher Jan 8, 2025
3cd6646
fixing css class name
MartinSchuhmacher Jan 8, 2025
891e63b
Add Tab and Enter for VK-Element
f-g-s Jan 9, 2025
aeca414
adding fetch content when VC was ended in another tab
MartinSchuhmacher Jan 10, 2025
fcb5ce4
changing link property
MartinSchuhmacher Jan 10, 2025
2bf769e
fix RoomVidConfSection tests
odalys-dataport Jan 10, 2025
2d10399
add test for statusInfo slot
odalys-dataport Jan 10, 2025
12be729
provide BOARD_IS_LIST_LAYOUT in bbb create component test
odalys-dataport Jan 10, 2025
6cb77a0
BC-8168 - add tests for VideoConference composable
virgilchiriac Jan 10, 2025
54f4328
add the correct test file
virgilchiriac Jan 10, 2025
f8ab217
fix tests
virgilchiriac Jan 13, 2025
3558953
remove comment
MartinSchuhmacher Jan 13, 2025
3412cb9
move wrapper initialization into it blocks
odalys-dataport Jan 13, 2025
c75161f
Merge branch 'BC-8168-bbb-finalize' of https://github.com/hpi-schul-c…
odalys-dataport Jan 13, 2025
edbf506
re-generate api
uidp Jan 13, 2025
9b62f72
fix refresh test
odalys-dataport Jan 15, 2025
3aa10aa
fix joinVideoConference test
odalys-dataport Jan 15, 2025
1990def
implementing feature composable for board features
MartinSchuhmacher Jan 15, 2025
c1f0400
adding feature composable for add element dialog on board
MartinSchuhmacher Jan 15, 2025
907bb6e
implementing board feature composable for VC enablement
MartinSchuhmacher Jan 15, 2025
b5e26ce
Merge branch 'main' into BC-8168-bbb-finalize
MartinSchuhmacher Jan 15, 2025
943af5f
fixing error when VC feature is deactivated
MartinSchuhmacher Jan 16, 2025
2535089
remove unnecessary mocks
odalys-dataport Jan 16, 2025
175ca5a
comment out tests
odalys-dataport Jan 16, 2025
d4d6f49
Merge branch 'BC-8168-bbb-finalize' of https://github.com/hpi-schul-c…
odalys-dataport Jan 16, 2025
44ad3cd
Merge branch 'main' of https://github.com/hpi-schul-cloud/nuxt-client…
odalys-dataport Jan 16, 2025
a14bc87
add onContentEnter back
odalys-dataport Jan 16, 2025
8a3bd42
change back role and tabindex
MartinSchuhmacher Jan 16, 2025
3a7ea78
comment out tests for merge
MartinSchuhmacher Jan 16, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions config/webpack/webpack.common.js
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,9 @@ module.exports = {
"@ui-skip-link": getDir("src/modules/ui/skip-link"),
"@ui-speed-dial-menu": getDir("src/modules/ui/speed-dial-menu"),
"@ui-qr-code": getDir("src/modules/ui/qr-code"),
"@ui-video-conference-configuration-dialog": getDir(
"src/modules/ui/video-conference-configuration-dialog"
),
"@util-board": getDir("src/modules/util/board"),
"@util-validators": getDir("src/modules/util/validators"),
"@util-vue": getDir("src/modules/util/vue"),
Expand Down
4 changes: 2 additions & 2 deletions src/components/icons/material/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ import {
mdiTune,
mdiUndo,
mdiUndoVariant,
mdiVideo,
mdiVideoOutline,
mdiViewAgendaOutline,
mdiViewDashboard,
mdiViewDashboardOutline,
Expand Down Expand Up @@ -283,7 +283,7 @@ export {
mdiTune,
mdiUndo,
mdiUndoVariant,
mdiVideo,
mdiVideoOutline,
mdiViewAgendaOutline,
mdiViewDashboard,
mdiViewDashboardOutline,
Expand Down
6 changes: 3 additions & 3 deletions src/locales/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1566,11 +1566,11 @@ export default {
"pages.common.tools.configureVideoconferenceDialog.title":
"Videokonferenz erstellen",
"pages.common.tools.configureVideoconferenceDialog.text.allModeratorPermission":
"Alle Nutzer:innen nehmen als Moderator:in teil",
"Moderationsrechte für alle Teilnehmenden",
"pages.common.tools.configureVideoconferenceDialog.text.mute":
"Teilnehmer:innen beim Betreten stummschalten",
"Teilnehmende beim Betreten stummschalten",
"pages.common.tools.configureVideoconferenceDialog.text.waitingRoom":
"Freigabe durch Moderator:in, bevor der Raum betreten werden kann",
"Warteraum für Teilnehmende aktivieren",
"pages.content._id.addToTopic": "Hinzufügen zu",
"pages.content._id.collection.selectElements":
"Wählen Sie die Elemente, die Sie zum Thema hinzufügen möchten",
Expand Down
6 changes: 3 additions & 3 deletions src/locales/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1544,11 +1544,11 @@ export default {
"pages.common.tools.configureVideoconferenceDialog.title":
"Create video conference",
"pages.common.tools.configureVideoconferenceDialog.text.allModeratorPermission":
"All users participate as moderators",
"Moderation rights for all participants",
"pages.common.tools.configureVideoconferenceDialog.text.mute":
"Mute participants when entering",
"Mute participants on entering",
"pages.common.tools.configureVideoconferenceDialog.text.waitingRoom":
"Approval by the moderator before the room can be entered",
"Activate waiting room for participants",
"pages.content._id.addToTopic": "To be added to",
"pages.content._id.collection.selectElements":
"Select the items you want to add to the topic",
Expand Down
6 changes: 3 additions & 3 deletions src/locales/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1590,11 +1590,11 @@ export default {
"pages.common.tools.configureVideoconferenceDialog.title":
"Crear videoconferencia",
"pages.common.tools.configureVideoconferenceDialog.text.allModeratorPermission":
"Todas las usuarias participan como moderadoras",
"Derechos de moderación para todos los participantes",
"pages.common.tools.configureVideoconferenceDialog.text.mute":
"Silenciar a las participantes al entrar",
"Silenciar a los participantes al entrar",
"pages.common.tools.configureVideoconferenceDialog.text.waitingRoom":
"Aprobación del moderador antes de poder ingresar a la sala",
"Activar la sala de espera para los participantes",
"pages.content._id.addToTopic": "Para ser añadido a",
"pages.content._id.collection.selectElements":
"Selecciona los elementos que deses añadir al tema",
Expand Down
6 changes: 3 additions & 3 deletions src/locales/uk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1573,11 +1573,11 @@ export default {
"pages.common.tools.configureVideoconferenceDialog.title":
"Створити відеоконференцію",
"pages.common.tools.configureVideoconferenceDialog.text.allModeratorPermission":
"Усі користувачі беруть участь як модератори",
"Права модерації для всіх учасників",
"pages.common.tools.configureVideoconferenceDialog.text.mute":
"Вимкнення звуку учасників при вході",
"Вимкнути звук учасникам при вході",
"pages.common.tools.configureVideoconferenceDialog.text.waitingRoom":
"Схвалення модератором перед входом до кімнати",
"Активуйте кімнату очікування для учасників",
"pages.content._id.addToTopic": "Для додавання в",
"pages.content._id.collection.selectElements":
"Виберіть елементи, які треба додати до теми",
Expand Down
11 changes: 9 additions & 2 deletions src/modules/data/board/Board.store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { applicationErrorModule, envConfigModule } from "@/store";
import { Board } from "@/types/board/Board";
import { useSharedEditMode } from "@util-board";
import { defineStore } from "pinia";
import { nextTick, ref } from "vue";
import { computed, nextTick, ref } from "vue";
import {
CreateCardRequestPayload,
CreateCardSuccessPayload,
Expand All @@ -12,7 +12,6 @@ import {
DeleteBoardSuccessPayload,
DeleteColumnRequestPayload,
DeleteColumnSuccessPayload,
DisconnectSocketRequestPayload,
FetchBoardRequestPayload,
FetchBoardSuccessPayload,
MoveCardRequestPayload,
Expand All @@ -35,6 +34,7 @@ import { createApplicationError } from "@/utils/create-application-error.factory
import { HttpStatusCode } from "@/store/types/http-status-code.enum";
import { useRouter } from "vue-router";
import { useI18n } from "vue-i18n";
import { BoardFeature } from "@/serverApi/v3";

export const useBoardStore = defineStore("boardStore", () => {
const cardStore = useCardStore();
Expand Down Expand Up @@ -364,12 +364,19 @@ export const useBoardStore = defineStore("boardStore", () => {
: board.value.columns[columnIndex - 1].id;
};

const getFeatures = computed((): BoardFeature[] | [] => {
uidp marked this conversation as resolved.
Show resolved Hide resolved
if (!board.value) return [];

return board.value.features;
});

return {
board,
isLoading,
getCardLocation,
getColumnIndex,
getColumnId,
getFeatures,
getLastColumnIndex,
setBoard,
setLoading,
Expand Down
111 changes: 86 additions & 25 deletions src/modules/data/board/BoardApi.composable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,23 @@ import {
CourseRoomsApiFactory,
CreateCardBodyParamsRequiredEmptyElementsEnum,
CreateContentElementBodyParams,
DrawingElementContent,
DrawingElementContentBody,
DrawingElementResponse,
ExternalToolContentBody,
ExternalToolElementContentBody,
ExternalToolElementResponse,
FileElementContentBody,
FileElementResponse,
LinkContentBody,
LinkElementContentBody,
LinkElementResponse,
RichTextElementContentBody,
RichTextElementResponse,
RoomApiFactory,
SubmissionContainerElementContentBody,
SubmissionContainerElementResponse,
VideoConferenceElementContentBody,
VideoConferenceElementResponse,
} from "@/serverApi/v3";
import { BoardContextType } from "@/types/board/BoardContext";
import { AnyContentElement } from "@/types/board/ContentElement";
Expand Down Expand Up @@ -84,54 +93,106 @@ export const useBoardApi = () => {
};

const generateDataProp = (element: AnyContentElement) => {
if (element.type === ContentElementType.RichText) {
return {
const isRichTextElement = (
element: AnyContentElement
): element is RichTextElementResponse => {
return element.type === ContentElementType.RichText;
};
uidp marked this conversation as resolved.
Show resolved Hide resolved

if (isRichTextElement(element)) {
const body: RichTextElementContentBody = {
content: element.content,
type: element.type,
} as RichTextElementContentBody;
type: ContentElementType.RichText,
};
return body;
}

if (element.type === ContentElementType.File) {
return {
const isFileElement = (
element: AnyContentElement
): element is FileElementResponse => {
return element.type === ContentElementType.File;
};

if (isFileElement(element)) {
const body: FileElementContentBody = {
content: element.content,
type: ContentElementType.File,
} as FileElementContentBody;
};
return body;
}

if (element.type === ContentElementType.SubmissionContainer) {
return {
const isSubmissionContainerElement = (
element: AnyContentElement
): element is SubmissionContainerElementResponse => {
return element.type === ContentElementType.SubmissionContainer;
};

if (isSubmissionContainerElement(element)) {
const body: SubmissionContainerElementContentBody = {
content: element.content,
type: ContentElementType.SubmissionContainer,
} as SubmissionContainerElementContentBody;
};
return body;
}

if (element.type === ContentElementType.Link) {
return {
content: element.content,
const isLinkElement = (
element: AnyContentElement
): element is LinkElementResponse => {
return element.type === ContentElementType.Link;
};

if (isLinkElement(element)) {
const body: LinkElementContentBody = {
// LinkElementContent is not type equal with LinkContentBody
content: element.content as LinkContentBody,
type: ContentElementType.Link,
} as LinkElementContentBody;
};
return body;
}

if (element.type === ContentElementType.ExternalTool) {
return {
content: element.content,
const isExternalToolElement = (
element: AnyContentElement
): element is ExternalToolElementResponse => {
return element.type === ContentElementType.ExternalTool;
};

if (isExternalToolElement(element)) {
const body: ExternalToolElementContentBody = {
// ExternalToolElementContent is not type equal with ExternalToolContentBody
content: element.content as ExternalToolContentBody,
type: ContentElementType.ExternalTool,
} as ExternalToolElementContentBody;
};
return body;
}

if (element.type === ContentElementType.Drawing) {
return {
content: element.content as DrawingElementContent,
const isDrawingElement = (
element: AnyContentElement
): element is DrawingElementResponse => {
return element.type === ContentElementType.Drawing;
};

if (isDrawingElement(element)) {
const body: DrawingElementContentBody = {
content: element.content,
type: ContentElementType.Drawing,
};
return body;
}

if (element.type === ContentElementType.VideoConference) {
return {
const isVideoConferenceElement = (
element: AnyContentElement
): element is VideoConferenceElementResponse => {
return element.type === ContentElementType.VideoConference;
};

if (isVideoConferenceElement(element)) {
const body: VideoConferenceElementContentBody = {
content: element.content,
type: ContentElementType.VideoConference,
} as VideoConferenceElementContentBody;
};
return body;
}

throw new Error("element.type mapping is undefined for updateElementCall");
};

Expand Down
16 changes: 16 additions & 0 deletions src/modules/data/board/BoardFeatures.composable.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { BoardFeature } from "@/serverApi/v3";
import { useBoardStore } from "@data-board";

export const useBoardFeatures = () => {
const { getFeatures } = useBoardStore();

const features: BoardFeature[] = getFeatures;

const isFeatureEnabled = (feature: BoardFeature) => {
return features.includes(feature);
};

return {
isFeatureEnabled,
};
};
2 changes: 2 additions & 0 deletions src/modules/data/board/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { useBoardStore } from "./Board.store";
import * as boardActions from "./boardActions/boardActions";
import { useBoardFeatures } from "./BoardFeatures.composable";
import { useBoardFocusHandler } from "./BoardFocusHandler.composable";
import { useBoardInactivity } from "./boardInactivity.composable";
import { useSharedBoardPageInformation } from "./BoardPageInformation.composable";
Expand All @@ -14,6 +15,7 @@ export {
boardActions,
cardActions,
useBoardStore,
useBoardFeatures,
useBoardFocusHandler,
useBoardInactivity,
useBoardPermissions,
Expand Down
Loading
Loading