Skip to content

Commit eb3923f

Browse files
feat: some fixes, add import/export
1 parent a0c18da commit eb3923f

17 files changed

Lines changed: 1184 additions & 150 deletions

File tree

angular.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"options": {
1919
"browser": "src/main.ts",
2020
"tsConfig": "tsconfig.app.json",
21+
"allowedCommonJsDependencies": ["jszip"],
2122
"assets": [
2223
{
2324
"glob": "**/*",

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
"@qti-editor/prosemirror-attributes-ui-prosekit": "^0.1.0",
4040
"@qti-editor/qti-item-divider": "^1.1.0",
4141
"daisyui": "^5.1.6",
42+
"jszip": "^3.10.1",
4243
"lit": "^3.3.2",
4344
"prosekit": "^0.20.1",
4445
"rxjs": "~7.8.0",
@@ -49,6 +50,7 @@
4950
"@angular/cli": "^21.2.6",
5051
"@angular/compiler-cli": "^21.2.0",
5152
"@tailwindcss/postcss": "^4.1.18",
53+
"@types/jszip": "^3.4.1",
5254
"jsdom": "^28.0.0",
5355
"postcss": "^8.5.6",
5456
"prettier": "^3.8.1",

pnpm-lock.yaml

Lines changed: 91 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/app/app.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
[fileName]="fileName()"
55
[savedFiles]="savedFiles()"
66
[currentFileId]="currentFileId()"
7-
(fileNameChange)="fileName.set($event)"
7+
(fileNameChange)="onFileNameChange($event)"
88
(newFile)="onNewFile()"
99
(saveFile)="onSaveFile()"
1010
(importXml)="onImportXml()"
1111
(exportXml)="onExportXml()"
12+
(exportPackage)="onExportPackage()"
1213
(loadFile)="onLoadFile($event)"
1314
(deleteFile)="onDeleteFile($event)"
1415
></app-menu-bar>

src/app/app.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,29 @@ export class App {
103103
await this.editorHost.importXml();
104104
this.currentFileId.set(null);
105105
this.fileName.set('imported-qti-item');
106+
this.onSaveFile();
106107
} catch {
107-
this.errorMessage.set('Import failed: please choose a valid QTI XML file.');
108+
this.errorMessage.set('Import failed: please choose a valid QTI XML or ZIP package file.');
108109
}
109110
}
110111

112+
protected async onExportPackage(): Promise<void> {
113+
let blob: Blob;
114+
try {
115+
blob = await this.editorHost.exportPackage();
116+
} catch {
117+
this.errorMessage.set('Export failed: could not generate QTI package.');
118+
return;
119+
}
120+
121+
const url = URL.createObjectURL(blob);
122+
const link = document.createElement('a');
123+
link.href = url;
124+
link.download = `${this.safeFileName()}.zip`;
125+
link.click();
126+
URL.revokeObjectURL(url);
127+
}
128+
111129
protected onLoadFile(fileId: string): void {
112130
const file = this.savedFiles().find((f) => f.id === fileId);
113131
if (!file) return;
@@ -133,6 +151,11 @@ export class App {
133151
}
134152
}
135153

154+
protected onFileNameChange(name: string): void {
155+
this.fileName.set(name);
156+
this.onSaveFile();
157+
}
158+
136159
protected onContentChange(detail: QtiContentChangeEventDetail): void {
137160
this.content.set(detail);
138161
}

0 commit comments

Comments
 (0)