diff --git a/src/locales/de.ts b/src/locales/de.ts index 4ecbe3e063..40f5bb4625 100644 --- a/src/locales/de.ts +++ b/src/locales/de.ts @@ -543,8 +543,6 @@ export default { "components.cardElement.fileElement.emptyAlt": "Hier ist ein Bild mit folgendem Namen", "components.cardElement.fileElement.pdfAlt": "Vorschaubild für ", "components.cardElement.fileElement.collaboraFile": "Dokument", - "components.cardElement.fileElement.collaboraFile.types": "Dokumententyp", - "components.cardElement.fileElement.collaboraFile.untitled": "Unbenanntes Dokument", "components.cardElement.fileElement.previewError": "Laden der Vorschau fehlgeschlagen.", "components.cardElement.fileElement.reloadStatus": "Status aktualisieren", "components.cardElement.fileElement.videoFormatError": @@ -596,9 +594,6 @@ export default { "components.elementTypeSelection.elements.videoConferenceElement.subtitle": "Videokonferenz", "components.elementTypeSelection.elements.h5pElement.subtitle": "Interaktives Lernelement", "components.elementTypeSelection.elements.collabora.subtitle": "Dokument erstellen", - "components.elementTypeSelection.elements.collabora.option.text": ".docx (Text)", - "components.elementTypeSelection.elements.collabora.option.spreadsheet": ".xlsx (Tabelle)", - "components.elementTypeSelection.elements.collabora.option.presentation": ".pptx (Präsentation)", "components.externalTools.status.deactivated": "Deaktiviert", "components.externalTools.status.incomplete": "Unvollständig", "components.externalTools.status.latest": "Aktuell", @@ -2034,6 +2029,12 @@ export default { "feature.media-shelf.layout.list": "Zeilen", "feature.media-shelf.layout.grid": "Raster", "feature.collabora.iframeTitle": "Office-Dokument Editor", + "feature.collabora.add-collabora-file-dialog.title": "Dokument erstellen", + "feature.collabora.add-collabora-file-dialog.doc-types": "Dokumententyp", + "feature.collabora.add-collabora-file-dialog.untitled-file": "Unbenanntes Dokument", + "feature.collabora.add-collabora-file-dialog.option.text": ".docx (Text)", + "feature.collabora.add-collabora-file-dialog.option.spreadsheet": ".xlsx (Tabelle)", + "feature.collabora.add-collabora-file-dialog.option.presentation": ".pptx (Präsentation)", "pages.folder.emptyState": "Aktuell gibt es hier noch keine Dateien", "pages.folder.fab.title": "Datei hinzufügen", "pages.folder.untitled": "Unbenannter Ordner", @@ -2054,10 +2055,4 @@ export default { "pages.folder.rename-file-dialog.validation.invalid-characters": "Der Dateiname enthält ungültige Zeichen.", "pages.folder.fab.upload-file": "Datei hochladen", "pages.folder.fab.create-document": "Dokument erstellen", - "pages.folder.add-collabora-file-dialog.title": "Dokument erstellen", - "pages.folder.add-collabora-file-dialog.doc-types": "Dokumententyp", - "pages.folder.add-collabora-file-dialog.untitled-file": "Unbenanntes Dokument", - "pages.folder.add-collabora-file-dialog.option.text": ".docx (Text)", - "pages.folder.add-collabora-file-dialog.option.spreadsheet": ".xlsx (Tabelle)", - "pages.folder.add-collabora-file-dialog.option.presentation": ".pptx (Präsentation)", }; diff --git a/src/locales/en.ts b/src/locales/en.ts index 426c79a442..f15250eb5f 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -528,8 +528,6 @@ export default { "components.cardElement.fileElement.emptyAlt": "Here is an image with the following name", "components.cardElement.fileElement.pdfAlt": "Preview image for ", "components.cardElement.fileElement.collaboraFile": "Document", - "components.cardElement.fileElement.collaboraFile.types": "Document type", - "components.cardElement.fileElement.collaboraFile.untitled": "Untitled document", "components.cardElement.fileElement.previewError": "Failed to load the preview.", "components.cardElement.fileElement.reloadStatus": "Update status", "components.cardElement.fileElement.videoFormatError": @@ -582,9 +580,6 @@ export default { "components.elementTypeSelection.elements.videoConferenceElement.subtitle": "Video conference", "components.elementTypeSelection.elements.h5pElement.subtitle": "Interactive learning element", "components.elementTypeSelection.elements.collabora.subtitle": "Create document", - "components.elementTypeSelection.elements.collabora.option.text": ".docx (text)", - "components.elementTypeSelection.elements.collabora.option.spreadsheet": ".xlsx (spreadsheet)", - "components.elementTypeSelection.elements.collabora.option.presentation": ".pptx (presentation)", "components.externalTools.status.deactivated": "Deactivated", "components.externalTools.status.incomplete": "Configuration incomplete", "components.externalTools.status.latest": "Latest", @@ -1998,6 +1993,12 @@ export default { "feature.media-shelf.layout.list": "Lines", "feature.media-shelf.layout.grid": "Grid", "feature.collabora.iframeTitle": "Office document editor", + "feature.collabora.add-collabora-file-dialog.title": "Create document", + "feature.collabora.add-collabora-file-dialog.doc-types": "Document type", + "feature.collabora.add-collabora-file-dialog.untitled-file": "Untitled document", + "feature.collabora.add-collabora-file-dialog.option.text": ".docx (Text)", + "feature.collabora.add-collabora-file-dialog.option.spreadsheet": ".xlsx (Spreadsheet)", + "feature.collabora.add-collabora-file-dialog.option.presentation": ".pptx (Presentation)", "pages.folder.emptyState": "There are currently no files here", "pages.folder.fab.title": "Add file", "pages.folder.untitled": "Untitled folder", @@ -2018,10 +2019,4 @@ export default { "pages.folder.rename-file-dialog.validation.invalid-characters": "The file name contains invalid characters.", "pages.folder.fab.upload-file": "Upload file", "pages.folder.fab.create-document": "Create document", - "pages.folder.add-collabora-file-dialog.title": "Create document", - "pages.folder.add-collabora-file-dialog.doc-types": "Document type", - "pages.folder.add-collabora-file-dialog.untitled-file": "Untitled document", - "pages.folder.add-collabora-file-dialog.option.text": ".docx (Text)", - "pages.folder.add-collabora-file-dialog.option.spreadsheet": ".xlsx (Spreadsheet)", - "pages.folder.add-collabora-file-dialog.option.presentation": ".pptx (Presentation)", }; diff --git a/src/locales/es.ts b/src/locales/es.ts index a1487a47e4..5f8c28de9a 100644 --- a/src/locales/es.ts +++ b/src/locales/es.ts @@ -538,8 +538,6 @@ export default { "components.cardElement.fileElement.emptyAlt": "Aquí tenéis una imagen con el siguiente nombre", "components.cardElement.fileElement.pdfAlt": "Imagen de vista previa para ", "components.cardElement.fileElement.collaboraFile": "Archivo", - "components.cardElement.fileElement.collaboraFile.types": "Tipo de documento", - "components.cardElement.fileElement.collaboraFile.untitled": "Documento sin título", "components.cardElement.fileElement.previewError": "No se ha podido cargar la vista previa.", "components.cardElement.fileElement.reloadStatus": "Estado de actualización", "components.cardElement.fileElement.videoFormatError": @@ -592,9 +590,6 @@ export default { "components.elementTypeSelection.elements.videoConferenceElement.subtitle": "Videoconferencia", "components.elementTypeSelection.elements.h5pElement.subtitle": "Elemento de aprendizaje interactivo", "components.elementTypeSelection.elements.collabora.subtitle": "Crear documento", - "components.elementTypeSelection.elements.collabora.option.text": ".docx (Texto)", - "components.elementTypeSelection.elements.collabora.option.spreadsheet": ".xlsx (Hoja de cálculo)", - "components.elementTypeSelection.elements.collabora.option.presentation": ".pptx (Presentación)", "components.externalTools.status.deactivated": "Desactivado", "components.externalTools.status.incomplete": "Configuración incompleta", "components.externalTools.status.latest": "Actual", @@ -2049,6 +2044,12 @@ export default { "feature.media-shelf.layout.list": "Líneas", "feature.media-shelf.layout.grid": "Red", "feature.collabora.iframeTitle": "Editor de documentos de Office", + "feature.collabora.add-collabora-file-dialog.title": "Crear documento", + "feature.collabora.add-collabora-file-dialog.doc-types": "Tipo de documento", + "feature.collabora.add-collabora-file-dialog.untitled-file": "Documento sin título", + "feature.collabora.add-collabora-file-dialog.option.text": ".docx (Texto)", + "feature.collabora.add-collabora-file-dialog.option.spreadsheet": ".xlsx (Hoja de cálculo)", + "feature.collabora.add-collabora-file-dialog.option.presentation": ".pptx (Presentación)", "pages.folder.emptyState": "Actualmente no hay archivos aquí", "pages.folder.fab.title": "Añadir archivo", "pages.folder.untitled": "Carpeta sin título", @@ -2070,10 +2071,4 @@ export default { "El nombre del archivo contiene caracteres no válidos.", "pages.folder.fab.upload-file": "Subir archivo", "pages.folder.fab.create-document": "Crear documento", - "pages.folder.add-collabora-file-dialog.title": "Crear documento", - "pages.folder.add-collabora-file-dialog.doc-types": "Tipo de documento", - "pages.folder.add-collabora-file-dialog.untitled-file": "Documento sin título", - "pages.folder.add-collabora-file-dialog.option.text": ".docx (Texto)", - "pages.folder.add-collabora-file-dialog.option.spreadsheet": ".xlsx (Hoja de cálculo)", - "pages.folder.add-collabora-file-dialog.option.presentation": ".pptx (Presentación)", }; diff --git a/src/locales/uk.ts b/src/locales/uk.ts index e4fe05ee55..340fb6ad54 100644 --- a/src/locales/uk.ts +++ b/src/locales/uk.ts @@ -537,8 +537,6 @@ export default { "components.cardElement.fileElement.emptyAlt": "Ось зображення з такою назвою", "components.cardElement.fileElement.pdfAlt": "попередній перегляд зображення для ", "components.cardElement.fileElement.collaboraFile": "Документ", - "components.cardElement.fileElement.collaboraFile.types": "Тип документа", - "components.cardElement.fileElement.collaboraFile.untitled": "Без назви документ", "components.cardElement.fileElement.previewError": "Не вдалося завантажити попередній перегляд.", "components.cardElement.fileElement.reloadStatus": "Статус оновлення", "components.cardElement.fileElement.videoFormatError": @@ -591,9 +589,6 @@ export default { "components.elementTypeSelection.elements.videoConferenceElement.subtitle": "Відеоконференція", "components.elementTypeSelection.elements.h5pElement.subtitle": "Інтерактивний елемент навчання", "components.elementTypeSelection.elements.collabora.subtitle": "Створити документ", - "components.elementTypeSelection.elements.collabora.option.text": ".docx (Документ)", - "components.elementTypeSelection.elements.collabora.option.spreadsheet": ".xlsx (Таблиця)", - "components.elementTypeSelection.elements.collabora.option.presentation": ".pptx (Презентація)", "components.externalTools.status.deactivated": "Деактивовано", "components.externalTools.status.incomplete": "Конфігурація не завершена", "components.externalTools.status.latest": "Останній", @@ -2018,6 +2013,12 @@ export default { "feature.media-shelf.layout.list": "лінії", "feature.media-shelf.layout.grid": "сітка", "feature.collabora.iframeTitle": "Редактор документів Office", + "feature.collabora.add-collabora-file-dialog.title": "Створити документ", + "feature.collabora.add-collabora-file-dialog.doc-types": "Тип документа", + "feature.collabora.add-collabora-file-dialog.untitled-file": "Без назви документ", + "feature.collabora.add-collabora-file-dialog.option.text": ".docx (Документ)", + "feature.collabora.add-collabora-file-dialog.option.spreadsheet": ".xlsx (Таблиця)", + "feature.collabora.add-collabora-file-dialog.option.presentation": ".pptx (Презентація)", "pages.folder.emptyState": "Наразі тут немає файлів", "pages.folder.fab.title": "Додати файл", "pages.folder.untitled": "Папка без назви", @@ -2038,10 +2039,4 @@ export default { "pages.folder.rename-file-dialog.validation.invalid-characters": "Ім'я файлу містить недопустимі символи.", "pages.folder.fab.upload-file": "Завантажити файл", "pages.folder.fab.create-document": "Створити документ", - "pages.folder.add-collabora-file-dialog.title": "Створити документ", - "pages.folder.add-collabora-file-dialog.doc-types": "Тип документа", - "pages.folder.add-collabora-file-dialog.untitled-file": "Без назви документ", - "pages.folder.add-collabora-file-dialog.option.text": ".docx (Документ)", - "pages.folder.add-collabora-file-dialog.option.spreadsheet": ".xlsx (Таблиця)", - "pages.folder.add-collabora-file-dialog.option.presentation": ".pptx (Презентація)", }; diff --git a/src/modules/data/board/Card.store.ts b/src/modules/data/board/Card.store.ts index a0cb9bbdbb..adaaa51545 100644 --- a/src/modules/data/board/Card.store.ts +++ b/src/modules/data/board/Card.store.ts @@ -15,8 +15,10 @@ import { import { useCardRestApi } from "./cardActions/cardRestApi.composable"; import { useCardSocketApi } from "./cardActions/cardSocketApi.composable"; import { CardResponse, ContentElementType, PreferredToolResponse, ToolContextType } from "@/serverApi/v3"; +import { FileRecordParent } from "@/types/file/File"; import { notifyInfo } from "@data-app"; import { useEnvConfig } from "@data-env"; +import { CollaboraFileType, useFileStorageApi } from "@data-file"; import { useSharedEditMode, useSharedLastCreatedElement } from "@util-board"; import { defineStore } from "pinia"; import { nextTick, Ref, ref } from "vue"; @@ -35,6 +37,7 @@ export const useCardStore = defineStore("cardStore", () => { const { setFocus, forceFocus } = useBoardFocusHandler(); const { setEditModeId, editModeId } = useSharedEditMode(); + const { uploadCollaboraFile } = useFileStorageApi(); const fetchCardRequest = socketOrRest.fetchCardRequest; @@ -109,6 +112,25 @@ export const useCardStore = defineStore("cardStore", () => { const createElementRequest = socketOrRest.createElementRequest; + const createFileElementWithCollabora = async (type: CollaboraFileType, fileName: string) => { + if (!editModeId.value) { + return; + } + + const element = await createElementRequest({ + type: ContentElementType.File, + cardId: editModeId.value, + }); + if (!element) { + return; + } + + const uploadedCollaboraFile = await uploadCollaboraFile(type, element.id, FileRecordParent.BOARDNODES, fileName); + if (!uploadedCollaboraFile) { + await deleteElementRequest({ elementId: element.id, cardId: editModeId.value }); + } + }; + const createPreferredElement = (payload: CreateElementRequestPayload, tool: PreferredToolResponse) => { restApi.createPreferredElement(payload, tool); }; @@ -265,5 +287,6 @@ export const useCardStore = defineStore("cardStore", () => { preferredTools, isPreferredToolsLoading, disconnectSocketRequest, + createFileElementWithCollabora, }; }); diff --git a/src/modules/data/board/Card.store.unit.ts b/src/modules/data/board/Card.store.unit.ts index 731902fb9e..b086a2f277 100644 --- a/src/modules/data/board/Card.store.unit.ts +++ b/src/modules/data/board/Card.store.unit.ts @@ -19,6 +19,7 @@ import { cardResponseFactory } from "@@/tests/test-utils/factory/cardResponseFac import { drawingElementResponseFactory } from "@@/tests/test-utils/factory/drawingElementResponseFactory"; import { useNotificationStore } from "@data-app"; import { CreateElementRequestPayload, useCardStore, useSocketConnection } from "@data-board"; +import { CollaboraFileType, useFileStorageApi } from "@data-file"; import { createMock, DeepMocked } from "@golevelup/ts-vitest"; import { createTestingPinia } from "@pinia/testing"; import { useSharedEditMode, useSharedLastCreatedElement } from "@util-board"; @@ -49,6 +50,9 @@ const mockedUseSocketConnection = vi.mocked(useSocketConnection); vi.mock("./BoardFocusHandler.composable"); const mockedBoardFocusHandler = vi.mocked(useBoardFocusHandler); +vi.mock("@data-file"); +const mockedFileStorageApi = vi.mocked(useFileStorageApi); + describe("CardStore", () => { let mockedBoardApiCalls: DeepMocked>; let mockedErrorHandlerCalls: DeepMocked>; @@ -59,6 +63,7 @@ describe("CardStore", () => { let setEditModeId: Mock; let editModeId: Ref; let mockedBoardFocusCalls: DeepMocked>; + let mockedFileStorageActions: DeepMocked>; beforeEach(() => { setActivePinia(createPinia()); @@ -110,6 +115,11 @@ describe("CardStore", () => { mockedBoardFocusCalls = createMock>(); mockedBoardFocusHandler.mockReturnValue(mockedBoardFocusCalls); + mockedFileStorageActions = createMock>({ + uploadCollaboraFile: vi.fn(), + }); + mockedFileStorageApi.mockReturnValue(mockedFileStorageActions); + setEditModeId = vi.fn(); editModeId = ref(undefined); mockedSharedEditMode.mockReturnValue({ @@ -970,4 +980,86 @@ describe("CardStore", () => { }); }); }); + + describe("createFileElementWithCollabora", () => { + const setupCreateFileElementWithCollabora = (editMode = false, createElementFails = false, uploadFails = false) => { + const { cardStore } = setup(false); + + editModeId.value = editMode ? "cardId" : undefined; + + const createElementRequestReturnValue = createElementFails + ? Promise.resolve(undefined) + : Promise.resolve({ + id: "elementId", + type: ContentElementType.File, + content: {}, + }); + mockedCardRestApiActions.createElementRequest.mockReturnValue(createElementRequestReturnValue); + + const uploadCollaboraFileReturnValue = uploadFails + ? Promise.resolve(undefined) + : Promise.resolve({ id: "fileId" }); + mockedFileStorageActions.uploadCollaboraFile.mockReturnValue(uploadCollaboraFileReturnValue); + + return { + cardStore, + }; + }; + + describe("when a card is in edit mode", () => { + it("should call createElementRequest", () => { + const { cardStore } = setupCreateFileElementWithCollabora(true, false, false); + + cardStore.createFileElementWithCollabora(CollaboraFileType.Text, "fileName.docx"); + + expect(mockedCardRestApiActions.createElementRequest).toHaveBeenCalled(); + }); + + it("should call uploadCollaboraFile", async () => { + const { cardStore } = setupCreateFileElementWithCollabora(true, false, false); + + await cardStore.createFileElementWithCollabora(CollaboraFileType.Text, "fileName.docx"); + + expect(mockedFileStorageActions.uploadCollaboraFile).toHaveBeenCalled(); + }); + + describe("when element creation fails", () => { + it("should not call uploadCollaboraFile", async () => { + const { cardStore } = setupCreateFileElementWithCollabora(true, true, false); + + await cardStore.createFileElementWithCollabora(CollaboraFileType.Text, "fileName.docx"); + + expect(mockedFileStorageActions.uploadCollaboraFile).not.toHaveBeenCalled(); + }); + }); + + describe("when uploading collabora file fails", () => { + it("should delete created element", async () => { + const { cardStore } = setupCreateFileElementWithCollabora(true, false, true); + + await cardStore.createFileElementWithCollabora(CollaboraFileType.Text, "fileName.docx"); + + expect(mockedCardRestApiActions.deleteElementRequest).toHaveBeenCalled(); + }); + }); + }); + + describe("when no card is in edit mode", () => { + it("should not call createElementRequest", () => { + const { cardStore } = setupCreateFileElementWithCollabora(false, false, false); + + cardStore.createFileElementWithCollabora(CollaboraFileType.Text, "fileName.docx"); + + expect(mockedCardRestApiActions.createElementRequest).not.toHaveBeenCalled(); + }); + + it("should not call uploadCollaboraFile", async () => { + const { cardStore } = setupCreateFileElementWithCollabora(false, false, false); + + await cardStore.createFileElementWithCollabora(CollaboraFileType.Text, "fileName.docx"); + + expect(mockedFileStorageActions.uploadCollaboraFile).not.toHaveBeenCalled(); + }); + }); + }); }); diff --git a/src/modules/data/file/FileStorageApi.composable.ts b/src/modules/data/file/FileStorageApi.composable.ts index cc6315a81f..cb3031d1a4 100644 --- a/src/modules/data/file/FileStorageApi.composable.ts +++ b/src/modules/data/file/FileStorageApi.composable.ts @@ -27,9 +27,9 @@ export enum ErrorType { } export enum CollaboraFileType { - Text, - Spreadsheet, - Presentation, + Text = "TEXT", + Spreadsheet = "SPREADSHEET", + Presentation = "PRESENTATION", } export const useFileStorageApi = () => { diff --git a/src/modules/feature/board/board/Board.unit.ts b/src/modules/feature/board/board/Board.unit.ts index 186426247c..92a565c294 100644 --- a/src/modules/feature/board/board/Board.unit.ts +++ b/src/modules/feature/board/board/Board.unit.ts @@ -38,6 +38,8 @@ import { useCardStore, useSharedBoardPageInformation, } from "@data-board"; +import { CollaboraFileType } from "@data-file"; +import { AddCollaboraFileDialog } from "@feature-collabora"; import { createMock, DeepMocked } from "@golevelup/ts-vitest"; import { createTestingPinia } from "@pinia/testing"; import { SelectBoardLayoutDialog } from "@ui-room-details"; @@ -1067,6 +1069,20 @@ describe("Board", () => { ); }); }); + + describe("@onCreateCollaboraFile", () => { + it("should call createFileElementWithCollabora method", async () => { + const { wrapper, cardStore } = setup(); + + const collaboraFileDialog = wrapper.findComponent(AddCollaboraFileDialog); + await collaboraFileDialog.vm.$emit("create-collabora-file", { + type: CollaboraFileType.Text, + fileName: "myDoc", + }); + + expect(cardStore.createFileElementWithCollabora).toHaveBeenCalled(); + }); + }); }); describe("Change board layout", () => { diff --git a/src/modules/feature/board/board/Board.vue b/src/modules/feature/board/board/Board.vue index b3c36e5359..834d965665 100644 --- a/src/modules/feature/board/board/Board.vue +++ b/src/modules/feature/board/board/Board.vue @@ -88,7 +88,7 @@ - +