Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
8ec0359
Add uploadFromUrl functionality for new Collabora document creation i…
bischofmax Aug 20, 2025
f666dfd
Add response to createElementRequest
bischofmax Aug 21, 2025
9a292b4
Refactor content element schemas and move to separate file
bischofmax Aug 21, 2025
655f2b3
Merge branch 'main' into BC-9862
bischofmax Aug 21, 2025
07c6fef
Merge branch 'main' into BC-9862
cdarsow Oct 13, 2025
f2b1dc3
Merge branch 'main' into BC-9862
cdarsow Oct 13, 2025
f359e58
Add initial composable
cdarsow Oct 14, 2025
a45bcb8
Try empty word doc
cdarsow Oct 14, 2025
4de722d
Add office files without any personal details
cdarsow Oct 14, 2025
a31187c
change test file
cdarsow Oct 14, 2025
0fda327
Merge branch 'main' into BC-9862
cdarsow Oct 14, 2025
aa7d2cc
Fix test
cdarsow Oct 14, 2025
0d73147
Add try catch for zod parsing
cdarsow Oct 14, 2025
fc57059
Add spreadsheet and presentation
cdarsow Oct 15, 2025
8ed7fc5
Add collabora dialog
cdarsow Oct 15, 2025
16d1f6e
Add filename param
cdarsow Oct 15, 2025
c200a8c
add open dialog method
cdarsow Oct 15, 2025
12b815a
Add form and validation
cdarsow Oct 15, 2025
00f3461
Attach select to allow focus trapping
cdarsow Oct 15, 2025
ea18e7d
Improve typing, refactor
cdarsow Oct 16, 2025
5cabece
Merge branch 'main' into BC-9862
cdarsow Oct 16, 2025
fce2f08
Add open tag validation
cdarsow Oct 16, 2025
624afa3
Add form reset
cdarsow Oct 16, 2025
519bb91
Fix test
cdarsow Oct 16, 2025
6eaa749
Add i18n labels
cdarsow Oct 17, 2025
27f334b
Refactor actions
cdarsow Oct 17, 2025
ed33d78
Add tests
cdarsow Oct 17, 2025
b802dd7
Add test
cdarsow Oct 17, 2025
5b6d8d9
Add tests
cdarsow Oct 17, 2025
728dd95
Merge branch 'main' into BC-9862
cdarsow Oct 17, 2025
3030794
reduce duplicated lines
cdarsow Oct 17, 2025
b940414
Add collabora template files
cdarsow Oct 20, 2025
9429640
Move to public folder
cdarsow Oct 20, 2025
fd2ceae
Combine imports
cdarsow Oct 20, 2025
a284100
Get assets from public
cdarsow Oct 20, 2025
e9cb483
Remove default file name
cdarsow Oct 20, 2025
9e702af
Refactor structure
cdarsow Oct 20, 2025
006ade7
cleanup
cdarsow Oct 20, 2025
b1c3446
Rename var
cdarsow Oct 20, 2025
7fcc635
use updated state
cdarsow Oct 20, 2025
950b263
adjust namings
cdarsow Oct 20, 2025
8c7b19a
add missing import
cdarsow Oct 20, 2025
2902d21
Merge branch 'main' into BC-9862
cdarsow Oct 20, 2025
c62d3b7
Adjust import
cdarsow Oct 20, 2025
29c038f
Solit factory
cdarsow Oct 21, 2025
88337bd
Add initial composable tests
cdarsow Oct 21, 2025
1765119
Add message for element parsing
cdarsow Oct 21, 2025
25accb8
Add error handling
cdarsow Oct 21, 2025
78e2515
Improve error handling
cdarsow Oct 21, 2025
baf00e0
Cleanup imports
cdarsow Oct 21, 2025
5f0626a
Add tests
cdarsow Oct 21, 2025
7905acb
Merge branch 'main' into BC-9862
cdarsow Oct 21, 2025
c2e27de
Add test
cdarsow Oct 21, 2025
c04f25e
Merge branch 'main' into BC-9862
cdarsow Oct 21, 2025
4efac2f
rename and refactor
cdarsow Oct 22, 2025
54f943c
add test
cdarsow Oct 22, 2025
4c73097
Use file helper
cdarsow Oct 22, 2025
7612d47
fix name
cdarsow Oct 22, 2025
d0b701d
fix typo
cdarsow Oct 22, 2025
3ed53fd
remove comments
cdarsow Oct 22, 2025
a41699e
Improve test coverage
cdarsow Oct 22, 2025
2b404ce
close file dialog early
cdarsow Oct 22, 2025
23dccf1
Merge branch 'main' into BC-9862
cdarsow Oct 22, 2025
5628140
Improve code readability
cdarsow Oct 22, 2025
5b3a8a1
try out restructure
cdarsow Oct 23, 2025
15e59c3
refactor
cdarsow Oct 23, 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
Binary file added public/collabora/doc.docx
Binary file not shown.
Binary file added public/collabora/presentation.pptx
Binary file not shown.
Binary file added public/collabora/spreadsheet.xlsx
Binary file not shown.
7 changes: 7 additions & 0 deletions src/locales/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -508,6 +508,8 @@ 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":
Expand Down Expand Up @@ -547,6 +549,7 @@ export default {
"components.editor.fonts.colors.indigo": "Indigo",
"components.editor.fonts.colors.darkPurple": "Dunkelviolett",
"components.editor.fonts.colors.pink": "Rosa",
"components.elementTypeSelection.messageError": "Element Nachricht ist nicht valide.",
"components.elementTypeSelection.dialog.title": "Element hinzufügen",
"components.elementTypeSelection.elements.externalToolElement.subtitle": "Externe Tools",
"components.elementTypeSelection.elements.fileElement.subtitle": "Datei",
Expand All @@ -557,6 +560,10 @@ export default {
"components.elementTypeSelection.elements.textElement.subtitle": "Text",
"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",
Expand Down
7 changes: 7 additions & 0 deletions src/locales/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -500,6 +500,8 @@ 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":
Expand Down Expand Up @@ -539,6 +541,7 @@ export default {
"components.editor.fonts.colors.indigo": "Indigo",
"components.editor.fonts.colors.darkPurple": "Dark Purple",
"components.editor.fonts.colors.pink": "Pink",
"components.elementTypeSelection.messageError": "Element message is not valid.",
"components.elementTypeSelection.dialog.title": "Add element",
"components.elementTypeSelection.elements.externalToolElement.subtitle": "External tools",
"components.elementTypeSelection.elements.fileElement.subtitle": "File",
Expand All @@ -550,6 +553,10 @@ export default {
"components.elementTypeSelection.elements.textElement.subtitle": "Text",
"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",
Expand Down
7 changes: 7 additions & 0 deletions src/locales/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -509,6 +509,8 @@ 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":
Expand Down Expand Up @@ -548,6 +550,7 @@ export default {
"components.editor.fonts.colors.indigo": "Índigo",
"components.editor.fonts.colors.darkPurple": "Púrpura Oscuro",
"components.editor.fonts.colors.pink": "Rosa",
"components.elementTypeSelection.messageError": "El mensaje del elemento no es válido.",
"components.elementTypeSelection.dialog.title": "Añadir elemento",
"components.elementTypeSelection.elements.externalToolElement.subtitle": "Herramientas externas",
"components.elementTypeSelection.elements.fileElement.subtitle": "Archivo",
Expand All @@ -559,6 +562,10 @@ export default {
"components.elementTypeSelection.elements.textElement.subtitle": "Texto",
"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",
Expand Down
7 changes: 7 additions & 0 deletions src/locales/uk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -503,6 +503,8 @@ 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":
Expand Down Expand Up @@ -542,6 +544,7 @@ export default {
"components.editor.fonts.colors.indigo": "Індиго",
"components.editor.fonts.colors.darkPurple": "Темно-фіолетовий",
"components.editor.fonts.colors.pink": "Рожевий",
"components.elementTypeSelection.messageError": "Повідомлення елемента недійсне.",
"components.elementTypeSelection.dialog.title": "Додати елемент",
"components.elementTypeSelection.elements.externalToolElement.subtitle": "Зовнішні інструменти",
"components.elementTypeSelection.elements.fileElement.subtitle": "Файл",
Expand All @@ -553,6 +556,10 @@ export default {
"components.elementTypeSelection.elements.textElement.subtitle": "Текст",
"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": "Останній",
Expand Down
18 changes: 15 additions & 3 deletions src/modules/data/board/cardActions/cardSocketApi.composable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,17 @@ import {
} from "./cardActionPayload.types";
import * as CardActions from "./cardActions";
import { handle, on, PermittedStoreActions } from "@/types/board/ActionFactory";
import { AnyContentElement } from "@/types/board/ContentElement";
import { AnyContentElementSchema } from "@/types/board/ContentElement.schema";
import { notifyError } from "@data-app";
import { useDebounceFn } from "@vueuse/core";
import { chunk } from "lodash-es";
import { storeToRefs } from "pinia";
import { useI18n } from "vue-i18n";

export const useCardSocketApi = () => {
const cardStore = useCardStore();
const { t } = useI18n();

const WAIT_AFTER_LAST_CALL_IN_MS = 30;
const MAX_WAIT_BEFORE_FIRST_CALL_IN_MS = 200;
Expand Down Expand Up @@ -72,7 +77,7 @@ export const useCardSocketApi = () => {
);
};

const { emitOnSocket, disconnectSocket } = useSocketConnection(dispatch);
const { emitOnSocket, disconnectSocket, emitWithAck } = useSocketConnection(dispatch);

const disconnectSocketRequest = () => {
disconnectSocket();
Expand All @@ -93,8 +98,15 @@ export const useCardSocketApi = () => {
{ maxWait: MAX_WAIT_BEFORE_FIRST_CALL_IN_MS }
);

const createElementRequest = async (payload: CreateElementRequestPayload) => {
emitOnSocket("create-element-request", payload);
const createElementRequest = async (payload: CreateElementRequestPayload): Promise<AnyContentElement | undefined> => {
const response = (await emitWithAck("create-element-request", payload)) as unknown;

try {
const anyContentElement = AnyContentElementSchema.parse(response);
return anyContentElement;
} catch {
notifyError(t("components.elementTypeSelection.messageError"));
}
};

const deleteElementRequest = async (payload: DeleteElementRequestPayload) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,7 @@ describe("useCardSocketApi", () => {

createElementRequest(payload);

expect(socketMock.emitOnSocket).toHaveBeenCalledWith("create-element-request", payload);
expect(socketMock.emitWithAck).toHaveBeenCalledWith("create-element-request", payload);
});
});

Expand Down
11 changes: 8 additions & 3 deletions src/modules/data/file/FileStorageApi.composable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,19 @@ export const useFileStorageApi = () => {
}
};

const uploadFromUrl = async (imageUrl: string, parentId: string, parentType: FileRecordParent): Promise<void> => {
const uploadFromUrl = async (
imageUrl: string,
parentId: string,
parentType: FileRecordParent,
fileName?: string
): Promise<void> => {
try {
const { pathname } = new URL(imageUrl);
const fileName = pathname.substring(pathname.lastIndexOf("/") + 1);
fileName = fileName ?? pathname.substring(pathname.lastIndexOf("/") + 1);
const schoolId = useAppStore().school?.id as string;
const fileUrlParams: FileUrlParams = {
url: imageUrl,
fileName,
fileName: fileName === "" ? "file" : fileName,
headers: { "User-Agent": "Embed Request User Agent" },
};
const response = await fileApi.uploadFromUrl(
Expand Down
10 changes: 6 additions & 4 deletions src/modules/feature/board-file-element/upload/FileUpload.vue
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<script lang="ts">
import FilePicker from "./file-picker/FilePicker.vue";
import { ContentElementBar } from "@ui-board";
import { useSharedLastCreatedElement } from "@util-board";
import { useSharedFileSelect, useSharedLastCreatedElement } from "@util-board";
import { defineComponent, onBeforeUnmount, onMounted, ref } from "vue";

export default defineComponent({
Expand All @@ -34,6 +34,7 @@ export default defineComponent({
const fileWasPicked = ref(false);

const { lastCreatedElementId, resetLastCreatedElementId } = useSharedLastCreatedElement();
const { isFileSelectOnMountEnabled } = useSharedFileSelect();

const handleBeforeUnload = (event: BeforeUnloadEvent) => {
if (fileWasPicked.value || props.isUploading) {
Expand All @@ -46,10 +47,11 @@ export default defineComponent({

onMounted(() => {
window.addEventListener("beforeunload", handleBeforeUnload);
if (lastCreatedElementId.value === props.elementId) {
isFilePickerOpen.value = true;
resetLastCreatedElementId();
if (lastCreatedElementId.value !== props.elementId) {
return;
}
isFilePickerOpen.value = isFileSelectOnMountEnabled.value;
resetLastCreatedElementId();
});

onBeforeUnmount(() => {
Expand Down
2 changes: 2 additions & 0 deletions src/modules/feature/board/board/Board.vue
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@
</div>
<ConfirmationDialog />
<AddElementDialog />
<AddCollaboraFileDialog />
<LightBox />
<CopyResultModal
:is-open="isCopyModalOpen"
Expand All @@ -112,6 +113,7 @@
</template>

<script setup lang="ts">
import AddCollaboraFileDialog from "../shared/AddCollaboraFileDialog.vue";
import AddElementDialog from "../shared/AddElementDialog.vue";
import { useBodyScrolling } from "../shared/BodyScrolling.composable";
import EditSettingsDialog from "../shared/EditSettingsDialog.vue";
Expand Down
Loading
Loading