Skip to content

Commit 3c7091c

Browse files
authored
BC-11042 - Refactor collabora file dialog (#3989)
1 parent 7c764cb commit 3c7091c

24 files changed

+404
-976
lines changed

src/locales/de.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -543,8 +543,6 @@ export default {
543543
"components.cardElement.fileElement.emptyAlt": "Hier ist ein Bild mit folgendem Namen",
544544
"components.cardElement.fileElement.pdfAlt": "Vorschaubild für ",
545545
"components.cardElement.fileElement.collaboraFile": "Dokument",
546-
"components.cardElement.fileElement.collaboraFile.types": "Dokumententyp",
547-
"components.cardElement.fileElement.collaboraFile.untitled": "Unbenanntes Dokument",
548546
"components.cardElement.fileElement.previewError": "Laden der Vorschau fehlgeschlagen.",
549547
"components.cardElement.fileElement.reloadStatus": "Status aktualisieren",
550548
"components.cardElement.fileElement.videoFormatError":
@@ -596,9 +594,6 @@ export default {
596594
"components.elementTypeSelection.elements.videoConferenceElement.subtitle": "Videokonferenz",
597595
"components.elementTypeSelection.elements.h5pElement.subtitle": "Interaktives Lernelement",
598596
"components.elementTypeSelection.elements.collabora.subtitle": "Dokument erstellen",
599-
"components.elementTypeSelection.elements.collabora.option.text": ".docx (Text)",
600-
"components.elementTypeSelection.elements.collabora.option.spreadsheet": ".xlsx (Tabelle)",
601-
"components.elementTypeSelection.elements.collabora.option.presentation": ".pptx (Präsentation)",
602597
"components.externalTools.status.deactivated": "Deaktiviert",
603598
"components.externalTools.status.incomplete": "Unvollständig",
604599
"components.externalTools.status.latest": "Aktuell",
@@ -2034,6 +2029,12 @@ export default {
20342029
"feature.media-shelf.layout.list": "Zeilen",
20352030
"feature.media-shelf.layout.grid": "Raster",
20362031
"feature.collabora.iframeTitle": "Office-Dokument Editor",
2032+
"feature.collabora.add-collabora-file-dialog.title": "Dokument erstellen",
2033+
"feature.collabora.add-collabora-file-dialog.doc-types": "Dokumententyp",
2034+
"feature.collabora.add-collabora-file-dialog.untitled-file": "Unbenanntes Dokument",
2035+
"feature.collabora.add-collabora-file-dialog.option.text": ".docx (Text)",
2036+
"feature.collabora.add-collabora-file-dialog.option.spreadsheet": ".xlsx (Tabelle)",
2037+
"feature.collabora.add-collabora-file-dialog.option.presentation": ".pptx (Präsentation)",
20372038
"pages.folder.emptyState": "Aktuell gibt es hier noch keine Dateien",
20382039
"pages.folder.fab.title": "Datei hinzufügen",
20392040
"pages.folder.untitled": "Unbenannter Ordner",
@@ -2054,10 +2055,4 @@ export default {
20542055
"pages.folder.rename-file-dialog.validation.invalid-characters": "Der Dateiname enthält ungültige Zeichen.",
20552056
"pages.folder.fab.upload-file": "Datei hochladen",
20562057
"pages.folder.fab.create-document": "Dokument erstellen",
2057-
"pages.folder.add-collabora-file-dialog.title": "Dokument erstellen",
2058-
"pages.folder.add-collabora-file-dialog.doc-types": "Dokumententyp",
2059-
"pages.folder.add-collabora-file-dialog.untitled-file": "Unbenanntes Dokument",
2060-
"pages.folder.add-collabora-file-dialog.option.text": ".docx (Text)",
2061-
"pages.folder.add-collabora-file-dialog.option.spreadsheet": ".xlsx (Tabelle)",
2062-
"pages.folder.add-collabora-file-dialog.option.presentation": ".pptx (Präsentation)",
20632058
};

src/locales/en.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -528,8 +528,6 @@ export default {
528528
"components.cardElement.fileElement.emptyAlt": "Here is an image with the following name",
529529
"components.cardElement.fileElement.pdfAlt": "Preview image for ",
530530
"components.cardElement.fileElement.collaboraFile": "Document",
531-
"components.cardElement.fileElement.collaboraFile.types": "Document type",
532-
"components.cardElement.fileElement.collaboraFile.untitled": "Untitled document",
533531
"components.cardElement.fileElement.previewError": "Failed to load the preview.",
534532
"components.cardElement.fileElement.reloadStatus": "Update status",
535533
"components.cardElement.fileElement.videoFormatError":
@@ -582,9 +580,6 @@ export default {
582580
"components.elementTypeSelection.elements.videoConferenceElement.subtitle": "Video conference",
583581
"components.elementTypeSelection.elements.h5pElement.subtitle": "Interactive learning element",
584582
"components.elementTypeSelection.elements.collabora.subtitle": "Create document",
585-
"components.elementTypeSelection.elements.collabora.option.text": ".docx (text)",
586-
"components.elementTypeSelection.elements.collabora.option.spreadsheet": ".xlsx (spreadsheet)",
587-
"components.elementTypeSelection.elements.collabora.option.presentation": ".pptx (presentation)",
588583
"components.externalTools.status.deactivated": "Deactivated",
589584
"components.externalTools.status.incomplete": "Configuration incomplete",
590585
"components.externalTools.status.latest": "Latest",
@@ -1998,6 +1993,12 @@ export default {
19981993
"feature.media-shelf.layout.list": "Lines",
19991994
"feature.media-shelf.layout.grid": "Grid",
20001995
"feature.collabora.iframeTitle": "Office document editor",
1996+
"feature.collabora.add-collabora-file-dialog.title": "Create document",
1997+
"feature.collabora.add-collabora-file-dialog.doc-types": "Document type",
1998+
"feature.collabora.add-collabora-file-dialog.untitled-file": "Untitled document",
1999+
"feature.collabora.add-collabora-file-dialog.option.text": ".docx (Text)",
2000+
"feature.collabora.add-collabora-file-dialog.option.spreadsheet": ".xlsx (Spreadsheet)",
2001+
"feature.collabora.add-collabora-file-dialog.option.presentation": ".pptx (Presentation)",
20012002
"pages.folder.emptyState": "There are currently no files here",
20022003
"pages.folder.fab.title": "Add file",
20032004
"pages.folder.untitled": "Untitled folder",
@@ -2018,10 +2019,4 @@ export default {
20182019
"pages.folder.rename-file-dialog.validation.invalid-characters": "The file name contains invalid characters.",
20192020
"pages.folder.fab.upload-file": "Upload file",
20202021
"pages.folder.fab.create-document": "Create document",
2021-
"pages.folder.add-collabora-file-dialog.title": "Create document",
2022-
"pages.folder.add-collabora-file-dialog.doc-types": "Document type",
2023-
"pages.folder.add-collabora-file-dialog.untitled-file": "Untitled document",
2024-
"pages.folder.add-collabora-file-dialog.option.text": ".docx (Text)",
2025-
"pages.folder.add-collabora-file-dialog.option.spreadsheet": ".xlsx (Spreadsheet)",
2026-
"pages.folder.add-collabora-file-dialog.option.presentation": ".pptx (Presentation)",
20272022
};

src/locales/es.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -538,8 +538,6 @@ export default {
538538
"components.cardElement.fileElement.emptyAlt": "Aquí tenéis una imagen con el siguiente nombre",
539539
"components.cardElement.fileElement.pdfAlt": "Imagen de vista previa para ",
540540
"components.cardElement.fileElement.collaboraFile": "Archivo",
541-
"components.cardElement.fileElement.collaboraFile.types": "Tipo de documento",
542-
"components.cardElement.fileElement.collaboraFile.untitled": "Documento sin título",
543541
"components.cardElement.fileElement.previewError": "No se ha podido cargar la vista previa.",
544542
"components.cardElement.fileElement.reloadStatus": "Estado de actualización",
545543
"components.cardElement.fileElement.videoFormatError":
@@ -592,9 +590,6 @@ export default {
592590
"components.elementTypeSelection.elements.videoConferenceElement.subtitle": "Videoconferencia",
593591
"components.elementTypeSelection.elements.h5pElement.subtitle": "Elemento de aprendizaje interactivo",
594592
"components.elementTypeSelection.elements.collabora.subtitle": "Crear documento",
595-
"components.elementTypeSelection.elements.collabora.option.text": ".docx (Texto)",
596-
"components.elementTypeSelection.elements.collabora.option.spreadsheet": ".xlsx (Hoja de cálculo)",
597-
"components.elementTypeSelection.elements.collabora.option.presentation": ".pptx (Presentación)",
598593
"components.externalTools.status.deactivated": "Desactivado",
599594
"components.externalTools.status.incomplete": "Configuración incompleta",
600595
"components.externalTools.status.latest": "Actual",
@@ -2049,6 +2044,12 @@ export default {
20492044
"feature.media-shelf.layout.list": "Líneas",
20502045
"feature.media-shelf.layout.grid": "Red",
20512046
"feature.collabora.iframeTitle": "Editor de documentos de Office",
2047+
"feature.collabora.add-collabora-file-dialog.title": "Crear documento",
2048+
"feature.collabora.add-collabora-file-dialog.doc-types": "Tipo de documento",
2049+
"feature.collabora.add-collabora-file-dialog.untitled-file": "Documento sin título",
2050+
"feature.collabora.add-collabora-file-dialog.option.text": ".docx (Texto)",
2051+
"feature.collabora.add-collabora-file-dialog.option.spreadsheet": ".xlsx (Hoja de cálculo)",
2052+
"feature.collabora.add-collabora-file-dialog.option.presentation": ".pptx (Presentación)",
20522053
"pages.folder.emptyState": "Actualmente no hay archivos aquí",
20532054
"pages.folder.fab.title": "Añadir archivo",
20542055
"pages.folder.untitled": "Carpeta sin título",
@@ -2070,10 +2071,4 @@ export default {
20702071
"El nombre del archivo contiene caracteres no válidos.",
20712072
"pages.folder.fab.upload-file": "Subir archivo",
20722073
"pages.folder.fab.create-document": "Crear documento",
2073-
"pages.folder.add-collabora-file-dialog.title": "Crear documento",
2074-
"pages.folder.add-collabora-file-dialog.doc-types": "Tipo de documento",
2075-
"pages.folder.add-collabora-file-dialog.untitled-file": "Documento sin título",
2076-
"pages.folder.add-collabora-file-dialog.option.text": ".docx (Texto)",
2077-
"pages.folder.add-collabora-file-dialog.option.spreadsheet": ".xlsx (Hoja de cálculo)",
2078-
"pages.folder.add-collabora-file-dialog.option.presentation": ".pptx (Presentación)",
20792074
};

src/locales/uk.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -537,8 +537,6 @@ export default {
537537
"components.cardElement.fileElement.emptyAlt": "Ось зображення з такою назвою",
538538
"components.cardElement.fileElement.pdfAlt": "попередній перегляд зображення для ",
539539
"components.cardElement.fileElement.collaboraFile": "Документ",
540-
"components.cardElement.fileElement.collaboraFile.types": "Тип документа",
541-
"components.cardElement.fileElement.collaboraFile.untitled": "Без назви документ",
542540
"components.cardElement.fileElement.previewError": "Не вдалося завантажити попередній перегляд.",
543541
"components.cardElement.fileElement.reloadStatus": "Статус оновлення",
544542
"components.cardElement.fileElement.videoFormatError":
@@ -591,9 +589,6 @@ export default {
591589
"components.elementTypeSelection.elements.videoConferenceElement.subtitle": "Відеоконференція",
592590
"components.elementTypeSelection.elements.h5pElement.subtitle": "Інтерактивний елемент навчання",
593591
"components.elementTypeSelection.elements.collabora.subtitle": "Створити документ",
594-
"components.elementTypeSelection.elements.collabora.option.text": ".docx (Документ)",
595-
"components.elementTypeSelection.elements.collabora.option.spreadsheet": ".xlsx (Таблиця)",
596-
"components.elementTypeSelection.elements.collabora.option.presentation": ".pptx (Презентація)",
597592
"components.externalTools.status.deactivated": "Деактивовано",
598593
"components.externalTools.status.incomplete": "Конфігурація не завершена",
599594
"components.externalTools.status.latest": "Останній",
@@ -2018,6 +2013,12 @@ export default {
20182013
"feature.media-shelf.layout.list": "лінії",
20192014
"feature.media-shelf.layout.grid": "сітка",
20202015
"feature.collabora.iframeTitle": "Редактор документів Office",
2016+
"feature.collabora.add-collabora-file-dialog.title": "Створити документ",
2017+
"feature.collabora.add-collabora-file-dialog.doc-types": "Тип документа",
2018+
"feature.collabora.add-collabora-file-dialog.untitled-file": "Без назви документ",
2019+
"feature.collabora.add-collabora-file-dialog.option.text": ".docx (Документ)",
2020+
"feature.collabora.add-collabora-file-dialog.option.spreadsheet": ".xlsx (Таблиця)",
2021+
"feature.collabora.add-collabora-file-dialog.option.presentation": ".pptx (Презентація)",
20212022
"pages.folder.emptyState": "Наразі тут немає файлів",
20222023
"pages.folder.fab.title": "Додати файл",
20232024
"pages.folder.untitled": "Папка без назви",
@@ -2038,10 +2039,4 @@ export default {
20382039
"pages.folder.rename-file-dialog.validation.invalid-characters": "Ім'я файлу містить недопустимі символи.",
20392040
"pages.folder.fab.upload-file": "Завантажити файл",
20402041
"pages.folder.fab.create-document": "Створити документ",
2041-
"pages.folder.add-collabora-file-dialog.title": "Створити документ",
2042-
"pages.folder.add-collabora-file-dialog.doc-types": "Тип документа",
2043-
"pages.folder.add-collabora-file-dialog.untitled-file": "Без назви документ",
2044-
"pages.folder.add-collabora-file-dialog.option.text": ".docx (Документ)",
2045-
"pages.folder.add-collabora-file-dialog.option.spreadsheet": ".xlsx (Таблиця)",
2046-
"pages.folder.add-collabora-file-dialog.option.presentation": ".pptx (Презентація)",
20472042
};

src/modules/data/board/Card.store.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ import {
1515
import { useCardRestApi } from "./cardActions/cardRestApi.composable";
1616
import { useCardSocketApi } from "./cardActions/cardSocketApi.composable";
1717
import { CardResponse, ContentElementType, PreferredToolResponse, ToolContextType } from "@/serverApi/v3";
18+
import { FileRecordParent } from "@/types/file/File";
1819
import { notifyInfo } from "@data-app";
1920
import { useEnvConfig } from "@data-env";
21+
import { CollaboraFileType, useFileStorageApi } from "@data-file";
2022
import { useSharedEditMode, useSharedLastCreatedElement } from "@util-board";
2123
import { defineStore } from "pinia";
2224
import { nextTick, Ref, ref } from "vue";
@@ -35,6 +37,7 @@ export const useCardStore = defineStore("cardStore", () => {
3537

3638
const { setFocus, forceFocus } = useBoardFocusHandler();
3739
const { setEditModeId, editModeId } = useSharedEditMode();
40+
const { uploadCollaboraFile } = useFileStorageApi();
3841

3942
const fetchCardRequest = socketOrRest.fetchCardRequest;
4043

@@ -109,6 +112,25 @@ export const useCardStore = defineStore("cardStore", () => {
109112

110113
const createElementRequest = socketOrRest.createElementRequest;
111114

115+
const createFileElementWithCollabora = async (type: CollaboraFileType, fileName: string) => {
116+
if (!editModeId.value) {
117+
return;
118+
}
119+
120+
const element = await createElementRequest({
121+
type: ContentElementType.File,
122+
cardId: editModeId.value,
123+
});
124+
if (!element) {
125+
return;
126+
}
127+
128+
const uploadedCollaboraFile = await uploadCollaboraFile(type, element.id, FileRecordParent.BOARDNODES, fileName);
129+
if (!uploadedCollaboraFile) {
130+
await deleteElementRequest({ elementId: element.id, cardId: editModeId.value });
131+
}
132+
};
133+
112134
const createPreferredElement = (payload: CreateElementRequestPayload, tool: PreferredToolResponse) => {
113135
restApi.createPreferredElement(payload, tool);
114136
};
@@ -265,5 +287,6 @@ export const useCardStore = defineStore("cardStore", () => {
265287
preferredTools,
266288
isPreferredToolsLoading,
267289
disconnectSocketRequest,
290+
createFileElementWithCollabora,
268291
};
269292
});

src/modules/data/board/Card.store.unit.ts

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { cardResponseFactory } from "@@/tests/test-utils/factory/cardResponseFac
1919
import { drawingElementResponseFactory } from "@@/tests/test-utils/factory/drawingElementResponseFactory";
2020
import { useNotificationStore } from "@data-app";
2121
import { CreateElementRequestPayload, useCardStore, useSocketConnection } from "@data-board";
22+
import { CollaboraFileType, useFileStorageApi } from "@data-file";
2223
import { createMock, DeepMocked } from "@golevelup/ts-vitest";
2324
import { createTestingPinia } from "@pinia/testing";
2425
import { useSharedEditMode, useSharedLastCreatedElement } from "@util-board";
@@ -49,6 +50,9 @@ const mockedUseSocketConnection = vi.mocked(useSocketConnection);
4950
vi.mock("./BoardFocusHandler.composable");
5051
const mockedBoardFocusHandler = vi.mocked(useBoardFocusHandler);
5152

53+
vi.mock("@data-file");
54+
const mockedFileStorageApi = vi.mocked(useFileStorageApi);
55+
5256
describe("CardStore", () => {
5357
let mockedBoardApiCalls: DeepMocked<ReturnType<typeof useBoardApi>>;
5458
let mockedErrorHandlerCalls: DeepMocked<ReturnType<typeof useErrorHandler>>;
@@ -59,6 +63,7 @@ describe("CardStore", () => {
5963
let setEditModeId: Mock;
6064
let editModeId: Ref<string | undefined>;
6165
let mockedBoardFocusCalls: DeepMocked<ReturnType<typeof useBoardFocusHandler>>;
66+
let mockedFileStorageActions: DeepMocked<ReturnType<typeof useFileStorageApi>>;
6267

6368
beforeEach(() => {
6469
setActivePinia(createPinia());
@@ -110,6 +115,11 @@ describe("CardStore", () => {
110115
mockedBoardFocusCalls = createMock<ReturnType<typeof useBoardFocusHandler>>();
111116
mockedBoardFocusHandler.mockReturnValue(mockedBoardFocusCalls);
112117

118+
mockedFileStorageActions = createMock<ReturnType<typeof useFileStorageApi>>({
119+
uploadCollaboraFile: vi.fn(),
120+
});
121+
mockedFileStorageApi.mockReturnValue(mockedFileStorageActions);
122+
113123
setEditModeId = vi.fn();
114124
editModeId = ref(undefined);
115125
mockedSharedEditMode.mockReturnValue({
@@ -970,4 +980,86 @@ describe("CardStore", () => {
970980
});
971981
});
972982
});
983+
984+
describe("createFileElementWithCollabora", () => {
985+
const setupCreateFileElementWithCollabora = (editMode = false, createElementFails = false, uploadFails = false) => {
986+
const { cardStore } = setup(false);
987+
988+
editModeId.value = editMode ? "cardId" : undefined;
989+
990+
const createElementRequestReturnValue = createElementFails
991+
? Promise.resolve(undefined)
992+
: Promise.resolve({
993+
id: "elementId",
994+
type: ContentElementType.File,
995+
content: {},
996+
});
997+
mockedCardRestApiActions.createElementRequest.mockReturnValue(createElementRequestReturnValue);
998+
999+
const uploadCollaboraFileReturnValue = uploadFails
1000+
? Promise.resolve(undefined)
1001+
: Promise.resolve({ id: "fileId" });
1002+
mockedFileStorageActions.uploadCollaboraFile.mockReturnValue(uploadCollaboraFileReturnValue);
1003+
1004+
return {
1005+
cardStore,
1006+
};
1007+
};
1008+
1009+
describe("when a card is in edit mode", () => {
1010+
it("should call createElementRequest", () => {
1011+
const { cardStore } = setupCreateFileElementWithCollabora(true, false, false);
1012+
1013+
cardStore.createFileElementWithCollabora(CollaboraFileType.Text, "fileName.docx");
1014+
1015+
expect(mockedCardRestApiActions.createElementRequest).toHaveBeenCalled();
1016+
});
1017+
1018+
it("should call uploadCollaboraFile", async () => {
1019+
const { cardStore } = setupCreateFileElementWithCollabora(true, false, false);
1020+
1021+
await cardStore.createFileElementWithCollabora(CollaboraFileType.Text, "fileName.docx");
1022+
1023+
expect(mockedFileStorageActions.uploadCollaboraFile).toHaveBeenCalled();
1024+
});
1025+
1026+
describe("when element creation fails", () => {
1027+
it("should not call uploadCollaboraFile", async () => {
1028+
const { cardStore } = setupCreateFileElementWithCollabora(true, true, false);
1029+
1030+
await cardStore.createFileElementWithCollabora(CollaboraFileType.Text, "fileName.docx");
1031+
1032+
expect(mockedFileStorageActions.uploadCollaboraFile).not.toHaveBeenCalled();
1033+
});
1034+
});
1035+
1036+
describe("when uploading collabora file fails", () => {
1037+
it("should delete created element", async () => {
1038+
const { cardStore } = setupCreateFileElementWithCollabora(true, false, true);
1039+
1040+
await cardStore.createFileElementWithCollabora(CollaboraFileType.Text, "fileName.docx");
1041+
1042+
expect(mockedCardRestApiActions.deleteElementRequest).toHaveBeenCalled();
1043+
});
1044+
});
1045+
});
1046+
1047+
describe("when no card is in edit mode", () => {
1048+
it("should not call createElementRequest", () => {
1049+
const { cardStore } = setupCreateFileElementWithCollabora(false, false, false);
1050+
1051+
cardStore.createFileElementWithCollabora(CollaboraFileType.Text, "fileName.docx");
1052+
1053+
expect(mockedCardRestApiActions.createElementRequest).not.toHaveBeenCalled();
1054+
});
1055+
1056+
it("should not call uploadCollaboraFile", async () => {
1057+
const { cardStore } = setupCreateFileElementWithCollabora(false, false, false);
1058+
1059+
await cardStore.createFileElementWithCollabora(CollaboraFileType.Text, "fileName.docx");
1060+
1061+
expect(mockedFileStorageActions.uploadCollaboraFile).not.toHaveBeenCalled();
1062+
});
1063+
});
1064+
});
9731065
});

src/modules/data/file/FileStorageApi.composable.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ export enum ErrorType {
2727
}
2828

2929
export enum CollaboraFileType {
30-
Text,
31-
Spreadsheet,
32-
Presentation,
30+
Text = "TEXT",
31+
Spreadsheet = "SPREADSHEET",
32+
Presentation = "PRESENTATION",
3333
}
3434

3535
export const useFileStorageApi = () => {

0 commit comments

Comments
 (0)