diff --git a/packages/db/src/core/types/db.ts b/packages/db/src/core/types/db.ts index 2c00d55f7..80ddbea97 100644 --- a/packages/db/src/core/types/db.ts +++ b/packages/db/src/core/types/db.ts @@ -3,4 +3,5 @@ import { Status } from '@vue-skuilder/common'; export interface DataLayerResult { status: Status; message: string; + id?: string; } diff --git a/packages/db/src/impl/pouch/courseAPI.ts b/packages/db/src/impl/pouch/courseAPI.ts index ae42c8ac9..354c722d7 100644 --- a/packages/db/src/impl/pouch/courseAPI.ts +++ b/packages/db/src/impl/pouch/courseAPI.ts @@ -40,16 +40,27 @@ export async function addNote55( }); if (result.ok) { - // create cards - await createCards(courseID, dataShapeId, result.id, tags, elo); + try { + // create cards + await createCards(courseID, dataShapeId, result.id, tags, elo); + } catch (error) { + console.error( + `[addNote55] Failed to create cards for note ${result.id}: ${ + error instanceof Error ? error.message : String(error) + }` + ); + // Add info to result to indicate card creation failed + (result as any).cardCreationFailed = true; + (result as any).cardCreationError = error instanceof Error ? error.message : String(error); + } } else { - console.log(`Error adding note: ${result}`); + console.error(`[addNote55] Error adding note. Result: ${JSON.stringify(result)}`); } return result; } -export async function createCards( +async function createCards( courseID: string, datashapeID: PouchDB.Core.DocumentId, noteID: PouchDB.Core.DocumentId, @@ -66,8 +77,16 @@ export async function createCards( } } + if (questionViewTypes.length === 0) { + const errorMsg = `No questionViewTypes found for datashapeID: ${datashapeID} in course config. Cards cannot be created.`; + console.error(errorMsg); + throw new Error(errorMsg); + } + + let createdCards = 0; for (const questionView of questionViewTypes) { - createCard(questionView, courseID, dsDescriptor, noteID, tags, elo); + await createCard(questionView, courseID, dsDescriptor, noteID, tags, elo); + createdCards++; } } @@ -86,7 +105,7 @@ async function createCard( for (const rQ of cfg.questionTypes) { if (rQ.name === questionViewName) { for (const view of rQ.viewList) { - addCard( + await addCard( courseID, dsDescriptor.course, [noteID], diff --git a/packages/db/src/impl/pouch/courseDB.ts b/packages/db/src/impl/pouch/courseDB.ts index 4cdda3b45..a97ffc370 100644 --- a/packages/db/src/impl/pouch/courseDB.ts +++ b/packages/db/src/impl/pouch/courseDB.ts @@ -367,14 +367,28 @@ above:\n${above.rows.map((r) => `\t${r.id}-${r.key}\n`)}`; try { const resp = await addNote55(this.id, codeCourse, shape, data, author, tags, uploads, elo); if (resp.ok) { + // Check if card creation failed (property added by addNote55) + if ((resp as any).cardCreationFailed) { + console.warn( + `[courseDB.addNote] Note added but card creation failed: ${ + (resp as any).cardCreationError + }` + ); + return { + status: Status.error, + message: `Note was added but no cards were created: ${(resp as any).cardCreationError}`, + id: resp.id, + }; + } return { status: Status.ok, message: '', + id: resp.id, }; } else { return { status: Status.error, - message: 'Unexpected ', + message: 'Unexpected error adding note', }; } } catch (e) { @@ -384,7 +398,7 @@ above:\n${above.rows.map((r) => `\t${r.id}-${r.key}\n`)}`; ); return { status: Status.error, - message: `Error adding note to course. ${(e as PouchError).reason}`, + message: `Error adding note to course. ${(e as PouchError).reason || err.message}`, }; } } diff --git a/packages/platform-ui/src/components/Edit/BulkImportView.vue b/packages/platform-ui/src/components/Edit/BulkImportView.vue new file mode 100644 index 000000000..9f8df9a23 --- /dev/null +++ b/packages/platform-ui/src/components/Edit/BulkImportView.vue @@ -0,0 +1,310 @@ + + + + + diff --git a/packages/platform-ui/src/components/Edit/CourseEditor.vue b/packages/platform-ui/src/components/Edit/CourseEditor.vue index c892cfbc1..779a39bc8 100644 --- a/packages/platform-ui/src/components/Edit/CourseEditor.vue +++ b/packages/platform-ui/src/components/Edit/CourseEditor.vue @@ -8,21 +8,42 @@ Quilts / {{ courseConfig?.name }} - Content Editing / Component Registration -
- - - -
- + + + Single Card Input + Bulk Import + Component Registration + + + + + + + + + + + + + + + + + + + + + + @@ -34,6 +55,7 @@ import { allCourses } from '@vue-skuilder/courses'; import { BlanksCard, BlanksCardDataShapes } from '@vue-skuilder/courses'; import { CourseConfig, NameSpacer, DataShape } from '@vue-skuilder/common'; import DataInputForm from './ViewableDataInputForm/DataInputForm.vue'; +import BulkImportView from './BulkImportView.vue'; // Added import import { getDataLayer } from '@vue-skuilder/db'; import { useDataInputFormStore } from '@/stores/useDataInputFormStore'; @@ -43,6 +65,7 @@ export default defineComponent({ components: { DataInputForm, ComponentRegistration, + BulkImportView, }, props: { @@ -60,7 +83,7 @@ export default defineComponent({ courseConfig: null as CourseConfig | null, dataShape: BlanksCardDataShapes[0] as DataShape, loading: true, - editingMode: true, + currentTab: 'single', dataInputFormStore: useDataInputFormStore(), }; }, @@ -118,10 +141,6 @@ export default defineComponent({ return shape.name === shapeName; })!; }, - - toggleComponent() { - this.editingMode = !this.editingMode; - }, }, });