Skip to content

Commit

Permalink
Merge branch 'main' of github.com:hpi-schul-cloud/nuxt-client into BC…
Browse files Browse the repository at this point in the history
…-7985-sidebar-selection
  • Loading branch information
uidp committed Sep 17, 2024
2 parents 218ed76 + 6e0ed21 commit 713fa65
Show file tree
Hide file tree
Showing 19 changed files with 648 additions and 445 deletions.
7 changes: 3 additions & 4 deletions src/locales/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ export default {
"common.medium.chip.deactivated": "Deaktiviert",
"common.medium.chip.notLicensed": "Nicht freigeschaltet",
"common.medium.chip.incomplete": "Konfiguration unvollständig",
"common.medium.chip.noLongerAvailable": "Nicht mehr verfügbar",
"common.medium.information.admin": "Bitte Einstellungen überprüfen.",
"common.medium.information.student": "Bitte an eine Lehrkraft wenden.",
"common.medium.information.teacher": "Bitte an Schuladministrator:in wenden.",
Expand Down Expand Up @@ -799,8 +800,6 @@ export default {
"Tool auswählen...",
"feature-board-file-element.placeholder.uploadFile": "Datei hochladen",
"feature-course-sync.EndCourseSyncDialog.title": "Synchronisation beenden",
"feature-course-sync.EndCourseSyncDialog.alert":
"Ist die Synchronisation einmal beendet, kann sie nicht wieder gestartet werden. Nutzendendaten können im Nachgang analog zu regulären Kursen manuell bearbeitet und gepflegt werden.",
"feature-course-sync.EndCourseSyncDialog.description":
"Soll die Synchronization der Nutzendengruppe {groupName} im Kurs {courseName} wirklich beendet werden?",
"feature-course-sync.EndCourseSyncDialog.success":
Expand All @@ -816,7 +815,7 @@ export default {
"feature-course-sync.StartExistingCourseSyncDialog.confirmation.warning":
"Eine Synchronisation mit {systemName} überschreibt die Personen des Kurses (Lehrkräfte und Schüler*innen).",
"feature-course-sync.StartExistingCourseSyncDialog.confirmation.text":
"Soll die Synchronisation der Nutzergruppe {groupName} im Kurs {courseName} wirklich gestartet werden?",
"Soll die Synchronisation der Nutzendengruppe {groupName} im Kurs {courseName} wirklich gestartet werden?",
"feature-course-sync.StartExistingCourseSyncDialog.success":
"Nutzendengruppe erfolgreich synchronisiert",
"feature-course-sync.startRoomSyncDialog.title": "Synchronisation starten",
Expand Down Expand Up @@ -1466,7 +1465,7 @@ export default {
"pages.content.index.search.placeholder": "Lern-Store durchsuchen",
"pages.content.init_state.img_alt": "Initial state Image",
"pages.content.init_state.message":
"Hier findest du hochwertige, auf dein Bundesland abgestimmte Inhalte.<br>Unser Team erschließt fortlaufend neue Materialen, um so dein Lernerlebnis weiter zu verbessern.<br><br>Hinweis:<br><br>Die im Lernstore angezeigten Materialien liegen nicht auf unserem Server, sondern werden über Schnittstellen zu anderen Servern verfügbar gemacht (Quellen sind zum Beispiel einzelne Bildungsserver, WirLernenOnline, Mundo u.a.).<br>Aus diesem Grund hat unser Team auch keinen Einfluss auf die dauerhafte Verfügbarkeit einzelner Materialien und auf das vollumfängliche Materialangebot der einzelnen Quellen.<br><br>Im Rahmen der Nutzung in Bildungseinrichtungen ist das Kopieren der Online-Medien auf Speichermedien, auf ein privates Endgerät oder auf Lernplattformen für einen geschlossenen Benutzerkreis ggf. erlaubt, soweit dies für die interne Verteilung und/oder Nutzung erforderlich ist.<br>Nach Beendigung der Arbeiten mit den jeweiligen Online-Medien sind diese von den privaten Endgeräten, Datenträgern und Lernplattformen zu löschen; spätestens beim Verlassen der Bildungseinrichtung.<br>Eine grundsätzliche Veröffentlichung (z.B. im Internet) der Online-Medien oder mit Teilen daraus neu hergestellten neuen und/oder bearbeiteten Werken ist grundsätzlich nicht zulässig, bzw. bedarf der Zustimmung des Rechtegebers.",
"Hier findest du hochwertige, auf dein Bundesland abgestimmte Inhalte.<br>Unser Team erschließt fortlaufend neue Materialien, um so dein Lernerlebnis weiter zu verbessern.<br><br>Hinweis:<br><br>Die im Lernstore angezeigten Materialien liegen nicht auf unserem Server, sondern werden über Schnittstellen zu anderen Servern verfügbar gemacht (Quellen sind zum Beispiel einzelne Bildungsserver, WirLernenOnline, Mundo u.a.).<br>Aus diesem Grund hat unser Team auch keinen Einfluss auf die dauerhafte Verfügbarkeit einzelner Materialien und auf das vollumfängliche Materialangebot der einzelnen Quellen.<br><br>Im Rahmen der Nutzung in Bildungseinrichtungen ist das Kopieren der Online-Medien auf Speichermedien, auf ein privates Endgerät oder auf Lernplattformen für einen geschlossenen Benutzerkreis ggf. erlaubt, soweit dies für die interne Verteilung und/oder Nutzung erforderlich ist.<br>Nach Beendigung der Arbeiten mit den jeweiligen Online-Medien sind diese von den privaten Endgeräten, Datenträgern und Lernplattformen zu löschen; spätestens beim Verlassen der Bildungseinrichtung.<br>Eine grundsätzliche Veröffentlichung (z.B. im Internet) der Online-Medien oder mit Teilen daraus neu hergestellten neuen und/oder bearbeiteten Werken ist grundsätzlich nicht zulässig, bzw. bedarf der Zustimmung des Rechtegebers.",
"pages.content.init_state.title": "Willkommen im Lern-Store!",
"pages.content.label.chooseACourse": "Wähle einen Kurs / Fach",
"pages.content.label.chooseALessonTopic": "Wähle ein Unterrichtsthema",
Expand Down
3 changes: 1 addition & 2 deletions src/locales/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ export default {
"common.medium.chip.deactivated": "Disabled",
"common.medium.chip.notLicensed": "Not activated",
"common.medium.chip.incomplete": "Configuration incomplete",
"common.medium.chip.noLongerAvailable": "No longer available",
"common.medium.information.admin": "Please check settings.",
"common.medium.information.student": "Please contact a teacher.",
"common.medium.information.teacher":
Expand Down Expand Up @@ -793,8 +794,6 @@ export default {
"Select Tool...",
"feature-board-file-element.placeholder.uploadFile": "Upload file",
"feature-course-sync.EndCourseSyncDialog.title": "End synchronization",
"feature-course-sync.EndCourseSyncDialog.alert":
"Once synchronization has ended, it cannot be started again. User data can be edited and maintained manually in the same way as regular courses.",
"feature-course-sync.EndCourseSyncDialog.description":
"Should the synchronization of the user group {groupName} in the course {courseName} really be ended?",
"feature-course-sync.EndCourseSyncDialog.success":
Expand Down
3 changes: 1 addition & 2 deletions src/locales/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ export default {
"common.medium.chip.deactivated": "Desactivado",
"common.medium.chip.notLicensed": "No esta activado",
"common.medium.chip.incomplete": "Configuración incompleta",
"common.medium.chip.noLongerAvailable": "Ya no está disponible",
"common.medium.information.admin": "Por favor verifique la configuración.",
"common.medium.information.student": "Por favor contacte a un maestro.",
"common.medium.information.teacher":
Expand Down Expand Up @@ -815,8 +816,6 @@ export default {
"Herramienta de selección...",
"feature-board-file-element.placeholder.uploadFile": "Cargar archivo",
"feature-course-sync.EndCourseSyncDialog.title": "Finalizar sincronización",
"feature-course-sync.EndCourseSyncDialog.alert":
"Una vez finalizada la sincronización, no se puede volver a iniciar. Los datos del usuario se pueden editar y mantener manualmente de la misma manera que los cursos regulares.",
"feature-course-sync.EndCourseSyncDialog.description":
"¿Debería realmente finalizarse la sincronización del grupo de usuarios {groupName} en el curso {courseName}?",
"feature-course-sync.EndCourseSyncDialog.success":
Expand Down
3 changes: 1 addition & 2 deletions src/locales/uk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ export default {
"common.medium.chip.deactivated": "Вимкнено",
"common.medium.chip.notLicensed": "Не активовано",
"common.medium.chip.incomplete": "Конфігурація не завершена",
"common.medium.chip.noLongerAvailable": "Більше не доступний",
"common.medium.information.admin": "Перевірте налаштування.",
"common.medium.information.student": "Будь ласка, зверніться до вчителя.",
"common.medium.information.teacher":
Expand Down Expand Up @@ -805,8 +806,6 @@ export default {
"Виберіть інструмент...",
"feature-board-file-element.placeholder.uploadFile": "Cargar archivo",
"feature-course-sync.EndCourseSyncDialog.title": "Завершити синхронізацію",
"feature-course-sync.EndCourseSyncDialog.alert":
"Після завершення синхронізації її не можна розпочати знову. Дані користувача можна редагувати та підтримувати вручну так само, як і звичайні курси.",
"feature-course-sync.EndCourseSyncDialog.description":
"Чи дійсно слід завершити синхронізацію групи користувачів {groupName} у курсі {courseName}?",
"feature-course-sync.EndCourseSyncDialog.success":
Expand Down
31 changes: 11 additions & 20 deletions src/modules/feature/board-deleted-element/DeletedElement.unit.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { ContentElementType, DeletedElementResponse } from "@/serverApi/v3";
import { timestampsResponseFactory } from "@@/tests/test-utils";
import { deletedElementResponseFactory } from "@@/tests/test-utils";
import {
createTestingI18n,
createTestingVuetify,
Expand All @@ -15,16 +14,6 @@ import DeletedElementMenu from "./DeletedElementMenu.vue";

jest.mock("@data-board");

const DELETED_ELEMENT: DeletedElementResponse = {
id: "deleted-element-id",
content: {
deletedElementType: ContentElementType.ExternalTool,
title: "Deleted Tool",
},
type: ContentElementType.Deleted,
timestamps: timestampsResponseFactory.build(),
};

describe("DeletedElement", () => {
let useBoardFocusHandlerMock: DeepMocked<
ReturnType<typeof useBoardFocusHandler>
Expand All @@ -50,7 +39,7 @@ describe("DeletedElement", () => {

const getWrapper = (
props: ComponentProps<typeof DeletedElement> = {
element: DELETED_ELEMENT,
element: deletedElementResponseFactory.build(),
isEditMode: false,
}
) => {
Expand All @@ -75,7 +64,7 @@ describe("DeletedElement", () => {
useBoardPermissionsMock.isTeacher = false;

const { wrapper } = getWrapper({
element: DELETED_ELEMENT,
element: deletedElementResponseFactory.build(),
isEditMode: true,
});

Expand All @@ -97,7 +86,7 @@ describe("DeletedElement", () => {
describe("when in edit mode", () => {
const setup = () => {
const { wrapper } = getWrapper({
element: DELETED_ELEMENT,
element: deletedElementResponseFactory.build(),
isEditMode: true,
});

Expand All @@ -118,7 +107,7 @@ describe("DeletedElement", () => {
describe("when not in edit mode", () => {
const setup = () => {
const { wrapper } = getWrapper({
element: DELETED_ELEMENT,
element: deletedElementResponseFactory.build(),
isEditMode: false,
});

Expand All @@ -138,24 +127,26 @@ describe("DeletedElement", () => {

describe("when deleting the element", () => {
const setup = () => {
const deletedElement = deletedElementResponseFactory.build();
const { wrapper } = getWrapper({
element: DELETED_ELEMENT,
element: deletedElement,
isEditMode: true,
});

return {
wrapper,
deletedElement,
};
};

it("should emit an event", async () => {
const { wrapper } = setup();
const { wrapper, deletedElement } = setup();

wrapper.findComponent(DeletedElementMenu).vm.$emit("delete:element");
await nextTick();

expect(wrapper.emitted("delete:element")).toEqual([
[DELETED_ELEMENT.id],
[deletedElement.id],
]);
});
});
Expand All @@ -165,7 +156,7 @@ describe("DeletedElement", () => {
describe("when the deleted element was an external tool element", () => {
const setup = () => {
const { wrapper } = getWrapper({
element: DELETED_ELEMENT,
element: deletedElementResponseFactory.build(),
isEditMode: true,
});

Expand Down
13 changes: 2 additions & 11 deletions src/modules/feature/course-sync/EndCourseSyncDialog.vue
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,11 @@
</h2>
</template>
<template #content>
<WarningAlert
class="mb-4"
data-testid="end-course-sync-dialog-warning-text"
>
{{ $t("feature-course-sync.EndCourseSyncDialog.alert") }}
</WarningAlert>
<p data-testid="end-course-sync-dialog-info-text">
{{
$t("feature-course-sync.EndCourseSyncDialog.description", {
courseName: courseName,
groupName: groupName,
courseName: courseName || "",
groupName: groupName || "",
})
}}
</p>
Expand All @@ -36,7 +30,6 @@
import VCustomDialog from "@/components/organisms/vCustomDialog.vue";
import { injectStrict, NOTIFIER_MODULE_KEY } from "@/utils/inject";
import { useCourseApi } from "@data-room";
import { WarningAlert } from "@ui-alert";
import { useI18n } from "vue-i18n";
const notifierModule = injectStrict(NOTIFIER_MODULE_KEY);
Expand All @@ -50,11 +43,9 @@ const isOpen = defineModel("isOpen", {
const props = defineProps({
courseName: {
type: String,
required: true,
},
groupName: {
type: String,
required: true,
},
courseId: {
type: String,
Expand Down
35 changes: 21 additions & 14 deletions src/modules/feature/media-shelf/MediaBoardElementDisplay.vue
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,23 @@
:ripple="false"
>
<div class="position-relative">
<v-img
v-if="element.thumbnail"
:src="element.thumbnail"
:aspect-ratio="16 / 9"
width="100%"
data-testid="media-element-thumbnail"
/>
<v-img
v-else
:aspect-ratio="16 / 9"
width="100%"
src="@/assets/img/media-board/default_img_media_shelf.png"
data-testid="media-element-default-thumbnail"
/>
<div :class="{ 'opacity-60': isUnavailable }">
<v-img
v-if="element.thumbnail"
:src="element.thumbnail"
:aspect-ratio="16 / 9"
width="100%"
data-testid="media-element-thumbnail"
/>
<v-img
v-else
:aspect-ratio="16 / 9"
width="100%"
src="@/assets/img/media-board/default_img_media_shelf.png"
data-testid="media-element-default-thumbnail"
/>
</div>
<div v-if="$slots.imageOverlay" class="chip-position">
<slot name="imageOverlay" />
</div>
Expand Down Expand Up @@ -70,6 +73,10 @@ defineProps({
element: {
type: Object as PropType<MediaElementDisplay>,
},
isUnavailable: {
type: Boolean,
default: false,
},
});
const card = ref(null);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
import {
createTestingI18n,
createTestingVuetify,
} from "@@/tests/test-utils/setup";
import { deletedElementResponseFactory } from "@@/tests/test-utils";
import { mount } from "@vue/test-utils";
import { BoardMenuActionDelete } from "@ui-board";
import { nextTick } from "vue";
import { ComponentProps } from "vue-component-type-helpers";
import { VBtn } from "vuetify/lib/components/index.mjs";
import MediaBoardExternalToolElementMenu from "./MediaBoardExternalToolElementMenu.vue";
import MediaBoardDeletedElement from "./MediaBoardExternalToolDeletedElement.vue";

describe("MediaBoardDeletedElement", () => {
const getWrapper = (
props: ComponentProps<typeof MediaBoardDeletedElement>,
stubThreeDotMenu = true
) => {
const wrapper = mount(MediaBoardDeletedElement, {
global: {
plugins: [createTestingVuetify(), createTestingI18n()],
},
props,
stubs: {
MediaBoardExternalToolElementMenu: stubThreeDotMenu,
},
});

return {
wrapper,
};
};

describe("three dot menu", () => {
describe("when clicking on the the three dot menu", () => {
const setupOverlayDiv = () => {
const overlayDiv = document.createElement("div");
overlayDiv.className = "v-overlay-container";
document.body.append();
};

const setup = () => {
const deletedElement = deletedElementResponseFactory.build();

const { wrapper } = getWrapper(
{
element: deletedElement,
},
false
);

setupOverlayDiv();

return {
wrapper,
};
};

afterEach(() => {
document.body.innerHTML = "";
});

it("should show the delete action", async () => {
const { wrapper } = setup();

const menuBtn = wrapper
.getComponent(MediaBoardExternalToolElementMenu)
.getComponent(VBtn);
await menuBtn.trigger("click");

const deleteAction = wrapper.findComponent(BoardMenuActionDelete);

expect(deleteAction.exists()).toEqual(true);
});
});

describe("when deleting the element from the menu", () => {
const setup = () => {
const deletedElement = deletedElementResponseFactory.build();

const { wrapper } = getWrapper({
element: deletedElement,
});

return {
wrapper,
deletedElement,
};
};

it("should emit a delete event", async () => {
const { wrapper, deletedElement } = setup();

const menu = wrapper.getComponent(MediaBoardExternalToolElementMenu);
menu.vm.$emit("delete:element");
await nextTick();

expect(wrapper.emitted("delete:element")).toEqual([
[deletedElement.id],
]);
});
});
});
});
Loading

0 comments on commit 713fa65

Please sign in to comment.