Skip to content

Commit

Permalink
BC-7020- Hint "Editable for all users" (#3220)
Browse files Browse the repository at this point in the history
  • Loading branch information
KalliSfak authored and bergatco committed May 6, 2024
1 parent dda73b8 commit 437c1bb
Show file tree
Hide file tree
Showing 8 changed files with 173 additions and 106 deletions.
149 changes: 45 additions & 104 deletions src/assets/img/collaborativeEditor.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions src/locales/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,8 @@ export default {
"components.cardElement.dragElement": "verschieben",
"components.cardElement.drawingElement": "Whiteboard",
"components.cardElement.collaborativeTextEditorElement": "Texteditor",
"components.cardElement.collaborativeTextEditorElement.alert.info.visible":
"Der Texteditor ist für alle Kursteilnehmenden sichtbar und bearbeitbar.",
"components.cardElement.fileElement.altDescription":
"Eine kurze Beschreibung hilft Personen, die das Bild nicht sehen können.",
"components.cardElement.fileElement.alternativeText": "Alternativtext",
Expand Down
2 changes: 2 additions & 0 deletions src/locales/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,8 @@ export default {
"components.cardElement.dragElement": "Move element",
"components.cardElement.drawingElement": "Whiteboard",
"components.cardElement.collaborativeTextEditorElement": "Texteditor",
"components.cardElement.collaborativeTextEditorElement.alert.info.visible":
"This collaborative text editor is visible and editable for all course participants.",
"components.cardElement.fileElement.altDescription":
"A short description helps people who cannot see the picture.",
"components.cardElement.fileElement.alternativeText": "Alternative Text",
Expand Down
2 changes: 2 additions & 0 deletions src/locales/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,8 @@ export default {
"components.cardElement.dragElement": "Mover elemento",
"components.cardElement.drawingElement": "Pizarra",
"components.cardElement.collaborativeTextEditorElement": "Texteditor",
"components.cardElement.collaborativeTextEditorElement.alert.info.visible":
"Esta editor de texto es visible y editable para todos los participantes en el curso.",
"components.cardElement.fileElement.altDescription":
"Una breve descripción ayuda a las personas que no pueden ver la imagen.",
"components.cardElement.fileElement.alternativeText": "Texto alternativo",
Expand Down
2 changes: 2 additions & 0 deletions src/locales/uk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,8 @@ export default {
"components.cardElement.dragElement": "Перемістити елемент",
"components.cardElement.drawingElement": "Дошка",
"components.cardElement.collaborativeTextEditorElement": "Texteditor",
"components.cardElement.collaborativeTextEditorElement.alert.info.visible":
"Цей текстовий редактор є видимою і доступною для редагування для всіх учасників курсу.",
"components.cardElement.fileElement.altDescription":
"Короткий опис допомагає людям, які не бачать зображення.",
"components.cardElement.fileElement.alternativeText": "альтернативний текст",
Expand Down
17 changes: 16 additions & 1 deletion src/modules/feature/board/shared/AddElementDialog.composable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import {
mdiTextBoxEditOutline,
mdiTrayArrowUp,
} from "@mdi/js";
import { useSharedLastCreatedElement } from "@util-board";
import { useBoardNotifier, useSharedLastCreatedElement } from "@util-board";
import { useI18n } from "vue-i18n";
import { useSharedElementTypeSelection } from "./SharedElementTypeSelection.composable";

type AddCardElement = (
Expand All @@ -20,6 +21,8 @@ type AddCardElement = (
export const useAddElementDialog = (addElementFunction: AddCardElement) => {
const envConfigModule = injectStrict(ENV_CONFIG_MODULE_KEY);
const { lastCreatedElementId } = useSharedLastCreatedElement();
const { showCustomNotifier } = useBoardNotifier();
const { t } = useI18n();

const { isDialogOpen, closeDialog, elementTypeOptions } =
useSharedElementTypeSelection();
Expand All @@ -29,6 +32,18 @@ export const useAddElementDialog = (addElementFunction: AddCardElement) => {

const elementData = await addElementFunction(elementType);
lastCreatedElementId.value = elementData?.id;
showNotificationByElementType(elementType);
};

const showNotificationByElementType = (elementType: ContentElementType) => {
if (elementType === ContentElementType.CollaborativeTextEditor) {
showCustomNotifier(
t(
"components.cardElement.collaborativeTextEditorElement.alert.info.visible"
),
"info"
);
}
};

const options = [
Expand Down
103 changes: 103 additions & 0 deletions src/modules/feature/board/shared/AddElementDialog.composable.unit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ import { ConfigResponse } from "@/serverApi/v3/api";
import NotifierModule from "@/store/notifier";
import { injectStrict } from "@/utils/inject";
import setupStores from "@@/tests/test-utils/setupStores";
import { createMock } from "@golevelup/ts-jest";
import { useBoardNotifier, useSharedLastCreatedElement } from "@util-board";
import { ref } from "vue";
import { setupSharedElementTypeSelectionMock } from "../test-utils/sharedElementTypeSelectionMock";
import { useAddElementDialog } from "./AddElementDialog.composable";

Expand All @@ -13,6 +16,31 @@ jest.mock("./SharedElementTypeSelection.composable");
jest.mock("@/utils/inject");
const mockedInjectStrict = jest.mocked(injectStrict);

const i18nKey =
"components.cardElement.collaborativeTextEditorElement.alert.info.visible";

const translationMap: Record<string, string> = {};

jest.mock("vue-i18n", () => {
return {
...jest.requireActual("vue-i18n"),
useI18n: jest.fn().mockReturnValue({
t: (key: string) => key,
tc: (key: string) => key,
te: (key: string) => translationMap[key] !== undefined,
}),
};
});

jest.mock("@util-board");
const mockedUseBoardNotifier = jest.mocked(useBoardNotifier);
jest.mocked(useSharedLastCreatedElement).mockImplementation(() => {
return {
lastCreatedElementId: ref(undefined),
resetLastCreatedElementId: jest.fn(),
};
});

// simple mock, as we only need to provide the env-config-module (the concrete value is even irrelevant for the currently implemented tests)
mockedInjectStrict.mockImplementation(() => {
return {
Expand All @@ -34,9 +62,18 @@ describe("ElementTypeSelection Composable", () => {
const addElementMock = jest.fn();
const elementType = ContentElementType.RichText;

const showCustomNotifierMock = jest.fn();
const mockedBoardNotifierCalls = createMock<
ReturnType<typeof useBoardNotifier>
>({
showCustomNotifier: showCustomNotifierMock,
});
mockedUseBoardNotifier.mockReturnValue(mockedBoardNotifierCalls);

return {
addElementMock,
elementType,
showCustomNotifierMock,
};
};

Expand All @@ -63,6 +100,72 @@ describe("ElementTypeSelection Composable", () => {

expect(isDialogOpen.value).toBe(false);
});

describe("when element type is CollaborativeTextEditor", () => {
const setup = () => {
setupSharedElementTypeSelectionMock();

const addElementMock = jest.fn();
const elementType = ContentElementType.CollaborativeTextEditor;

const showCustomNotifierMock = jest.fn();
const mockedBoardNotifierCalls = createMock<
ReturnType<typeof useBoardNotifier>
>({
showCustomNotifier: showCustomNotifierMock,
});
mockedUseBoardNotifier.mockReturnValue(mockedBoardNotifierCalls);

return {
addElementMock,
elementType,
showCustomNotifierMock,
};
};
it("should show Notification", async () => {
const { addElementMock, elementType, showCustomNotifierMock } =
setup();

const { onElementClick } = useAddElementDialog(addElementMock);

await onElementClick(elementType);

expect(showCustomNotifierMock).toHaveBeenCalledWith(i18nKey, "info");
});
});

describe("when element type is NOT CollaborativeTextEditor", () => {
const setup = () => {
setupSharedElementTypeSelectionMock();

const addElementMock = jest.fn();
const elementType = ContentElementType.RichText;

const showCustomNotifierMock = jest.fn();
const mockedBoardNotifierCalls = createMock<
ReturnType<typeof useBoardNotifier>
>({
showCustomNotifier: showCustomNotifierMock,
});
mockedUseBoardNotifier.mockReturnValue(mockedBoardNotifierCalls);

return {
addElementMock,
elementType,
showCustomNotifierMock,
};
};
it("should NOT show Notification", async () => {
const { addElementMock, elementType, showCustomNotifierMock } =
setup();

const { onElementClick } = useAddElementDialog(addElementMock);

await onElementClick(elementType);

expect(showCustomNotifierMock).toBeCalledTimes(0);
});
});
});
describe("when addElement returns error", () => {
const setup = () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useAddElementDialog } from "../shared/AddElementDialog.composable";
import { jest } from "@jest/globals";
import { Ref, ref } from "vue";
import { useAddElementDialog } from "../shared/AddElementDialog.composable";

interface Props {
askTypeMock?: jest.Mock;
Expand Down

0 comments on commit 437c1bb

Please sign in to comment.