diff --git a/backend/prisma/migrations/20251122065455_add_files_column/migration.sql b/backend/prisma/migrations/20251122065455_add_files_column/migration.sql new file mode 100644 index 0000000..b4c095d --- /dev/null +++ b/backend/prisma/migrations/20251122065455_add_files_column/migration.sql @@ -0,0 +1,21 @@ +-- RedefineTables +PRAGMA defer_foreign_keys=ON; +PRAGMA foreign_keys=OFF; +CREATE TABLE "new_Drawing" ( + "id" TEXT NOT NULL PRIMARY KEY, + "name" TEXT NOT NULL, + "elements" TEXT NOT NULL, + "appState" TEXT NOT NULL, + "files" TEXT NOT NULL DEFAULT '{}', + "preview" TEXT, + "version" INTEGER NOT NULL DEFAULT 1, + "collectionId" TEXT, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL, + CONSTRAINT "Drawing_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "Collection" ("id") ON DELETE SET NULL ON UPDATE CASCADE +); +INSERT INTO "new_Drawing" ("appState", "collectionId", "createdAt", "elements", "id", "name", "preview", "updatedAt", "version") SELECT "appState", "collectionId", "createdAt", "elements", "id", "name", "preview", "updatedAt", "version" FROM "Drawing"; +DROP TABLE "Drawing"; +ALTER TABLE "new_Drawing" RENAME TO "Drawing"; +PRAGMA foreign_keys=ON; +PRAGMA defer_foreign_keys=OFF; diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index 59bccb0..1a6ccfc 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -24,6 +24,7 @@ model Drawing { name String elements String // Stored as JSON string appState String // Stored as JSON string + files String @default("{}") // Stored as JSON string preview String? // SVG string for thumbnail version Int @default(1) collectionId String? diff --git a/backend/src/generated/client/edge.js b/backend/src/generated/client/edge.js index 71a296e..8d67c5b 100644 --- a/backend/src/generated/client/edge.js +++ b/backend/src/generated/client/edge.js @@ -99,6 +99,7 @@ exports.Prisma.DrawingScalarFieldEnum = { name: 'name', elements: 'elements', appState: 'appState', + files: 'files', preview: 'preview', version: 'version', collectionId: 'collectionId', @@ -168,13 +169,13 @@ const config = { } } }, - "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client-js\"\n output = \"../src/generated/client\"\n}\n\ndatasource db {\n provider = \"sqlite\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel Collection {\n id String @id @default(uuid())\n name String\n drawings Drawing[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Drawing {\n id String @id @default(uuid())\n name String\n elements String // Stored as JSON string\n appState String // Stored as JSON string\n preview String? // SVG string for thumbnail\n version Int @default(1)\n collectionId String?\n collection Collection? @relation(fields: [collectionId], references: [id])\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n", - "inlineSchemaHash": "67e1a3789d22e31866fa8b498914744bb15a8743c766f6c9cb36263d6b7740a9", + "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client-js\"\n output = \"../src/generated/client\"\n}\n\ndatasource db {\n provider = \"sqlite\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel Collection {\n id String @id @default(uuid())\n name String\n drawings Drawing[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Drawing {\n id String @id @default(uuid())\n name String\n elements String // Stored as JSON string\n appState String // Stored as JSON string\n files String @default(\"{}\") // Stored as JSON string\n preview String? // SVG string for thumbnail\n version Int @default(1)\n collectionId String?\n collection Collection? @relation(fields: [collectionId], references: [id])\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n", + "inlineSchemaHash": "e43b17bb99e7f864b5a0f2c54951015f0a3d998329d0577afda58e7c0dee4919", "copyEngine": true } config.dirname = '/' -config.runtimeDataModel = JSON.parse("{\"models\":{\"Collection\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"drawings\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Drawing\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Drawing\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"elements\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"appState\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"preview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"version\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":1,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collectionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collection\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Collection\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[\"collectionId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"Collection\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"drawings\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Drawing\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Drawing\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"elements\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"appState\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"files\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"{}\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"preview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"version\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":1,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collectionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collection\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Collection\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[\"collectionId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.engineWasm = undefined diff --git a/backend/src/generated/client/index-browser.js b/backend/src/generated/client/index-browser.js index 83e61fc..6d1f1d8 100644 --- a/backend/src/generated/client/index-browser.js +++ b/backend/src/generated/client/index-browser.js @@ -131,6 +131,7 @@ exports.Prisma.DrawingScalarFieldEnum = { name: 'name', elements: 'elements', appState: 'appState', + files: 'files', preview: 'preview', version: 'version', collectionId: 'collectionId', diff --git a/backend/src/generated/client/index.d.ts b/backend/src/generated/client/index.d.ts index b446dc8..eec957f 100644 --- a/backend/src/generated/client/index.d.ts +++ b/backend/src/generated/client/index.d.ts @@ -1918,6 +1918,7 @@ export namespace Prisma { name: string | null elements: string | null appState: string | null + files: string | null preview: string | null version: number | null collectionId: string | null @@ -1930,6 +1931,7 @@ export namespace Prisma { name: string | null elements: string | null appState: string | null + files: string | null preview: string | null version: number | null collectionId: string | null @@ -1942,6 +1944,7 @@ export namespace Prisma { name: number elements: number appState: number + files: number preview: number version: number collectionId: number @@ -1964,6 +1967,7 @@ export namespace Prisma { name?: true elements?: true appState?: true + files?: true preview?: true version?: true collectionId?: true @@ -1976,6 +1980,7 @@ export namespace Prisma { name?: true elements?: true appState?: true + files?: true preview?: true version?: true collectionId?: true @@ -1988,6 +1993,7 @@ export namespace Prisma { name?: true elements?: true appState?: true + files?: true preview?: true version?: true collectionId?: true @@ -2087,6 +2093,7 @@ export namespace Prisma { name: string elements: string appState: string + files: string preview: string | null version: number collectionId: string | null @@ -2118,6 +2125,7 @@ export namespace Prisma { name?: boolean elements?: boolean appState?: boolean + files?: boolean preview?: boolean version?: boolean collectionId?: boolean @@ -2131,6 +2139,7 @@ export namespace Prisma { name?: boolean elements?: boolean appState?: boolean + files?: boolean preview?: boolean version?: boolean collectionId?: boolean @@ -2144,6 +2153,7 @@ export namespace Prisma { name?: boolean elements?: boolean appState?: boolean + files?: boolean preview?: boolean version?: boolean collectionId?: boolean @@ -2168,6 +2178,7 @@ export namespace Prisma { name: string elements: string appState: string + files: string preview: string | null version: number collectionId: string | null @@ -2571,6 +2582,7 @@ export namespace Prisma { readonly name: FieldRef<"Drawing", 'String'> readonly elements: FieldRef<"Drawing", 'String'> readonly appState: FieldRef<"Drawing", 'String'> + readonly files: FieldRef<"Drawing", 'String'> readonly preview: FieldRef<"Drawing", 'String'> readonly version: FieldRef<"Drawing", 'Int'> readonly collectionId: FieldRef<"Drawing", 'String'> @@ -2947,6 +2959,7 @@ export namespace Prisma { name: 'name', elements: 'elements', appState: 'appState', + files: 'files', preview: 'preview', version: 'version', collectionId: 'collectionId', @@ -3067,6 +3080,7 @@ export namespace Prisma { name?: StringFilter<"Drawing"> | string elements?: StringFilter<"Drawing"> | string appState?: StringFilter<"Drawing"> | string + files?: StringFilter<"Drawing"> | string preview?: StringNullableFilter<"Drawing"> | string | null version?: IntFilter<"Drawing"> | number collectionId?: StringNullableFilter<"Drawing"> | string | null @@ -3080,6 +3094,7 @@ export namespace Prisma { name?: SortOrder elements?: SortOrder appState?: SortOrder + files?: SortOrder preview?: SortOrderInput | SortOrder version?: SortOrder collectionId?: SortOrderInput | SortOrder @@ -3096,6 +3111,7 @@ export namespace Prisma { name?: StringFilter<"Drawing"> | string elements?: StringFilter<"Drawing"> | string appState?: StringFilter<"Drawing"> | string + files?: StringFilter<"Drawing"> | string preview?: StringNullableFilter<"Drawing"> | string | null version?: IntFilter<"Drawing"> | number collectionId?: StringNullableFilter<"Drawing"> | string | null @@ -3109,6 +3125,7 @@ export namespace Prisma { name?: SortOrder elements?: SortOrder appState?: SortOrder + files?: SortOrder preview?: SortOrderInput | SortOrder version?: SortOrder collectionId?: SortOrderInput | SortOrder @@ -3129,6 +3146,7 @@ export namespace Prisma { name?: StringWithAggregatesFilter<"Drawing"> | string elements?: StringWithAggregatesFilter<"Drawing"> | string appState?: StringWithAggregatesFilter<"Drawing"> | string + files?: StringWithAggregatesFilter<"Drawing"> | string preview?: StringNullableWithAggregatesFilter<"Drawing"> | string | null version?: IntWithAggregatesFilter<"Drawing"> | number collectionId?: StringNullableWithAggregatesFilter<"Drawing"> | string | null @@ -3194,6 +3212,7 @@ export namespace Prisma { name: string elements: string appState: string + files?: string preview?: string | null version?: number createdAt?: Date | string @@ -3206,6 +3225,7 @@ export namespace Prisma { name: string elements: string appState: string + files?: string preview?: string | null version?: number collectionId?: string | null @@ -3218,6 +3238,7 @@ export namespace Prisma { name?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string + files?: StringFieldUpdateOperationsInput | string preview?: NullableStringFieldUpdateOperationsInput | string | null version?: IntFieldUpdateOperationsInput | number createdAt?: DateTimeFieldUpdateOperationsInput | Date | string @@ -3230,6 +3251,7 @@ export namespace Prisma { name?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string + files?: StringFieldUpdateOperationsInput | string preview?: NullableStringFieldUpdateOperationsInput | string | null version?: IntFieldUpdateOperationsInput | number collectionId?: NullableStringFieldUpdateOperationsInput | string | null @@ -3242,6 +3264,7 @@ export namespace Prisma { name: string elements: string appState: string + files?: string preview?: string | null version?: number collectionId?: string | null @@ -3254,6 +3277,7 @@ export namespace Prisma { name?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string + files?: StringFieldUpdateOperationsInput | string preview?: NullableStringFieldUpdateOperationsInput | string | null version?: IntFieldUpdateOperationsInput | number createdAt?: DateTimeFieldUpdateOperationsInput | Date | string @@ -3265,6 +3289,7 @@ export namespace Prisma { name?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string + files?: StringFieldUpdateOperationsInput | string preview?: NullableStringFieldUpdateOperationsInput | string | null version?: IntFieldUpdateOperationsInput | number collectionId?: NullableStringFieldUpdateOperationsInput | string | null @@ -3399,6 +3424,7 @@ export namespace Prisma { name?: SortOrder elements?: SortOrder appState?: SortOrder + files?: SortOrder preview?: SortOrder version?: SortOrder collectionId?: SortOrder @@ -3415,6 +3441,7 @@ export namespace Prisma { name?: SortOrder elements?: SortOrder appState?: SortOrder + files?: SortOrder preview?: SortOrder version?: SortOrder collectionId?: SortOrder @@ -3427,6 +3454,7 @@ export namespace Prisma { name?: SortOrder elements?: SortOrder appState?: SortOrder + files?: SortOrder preview?: SortOrder version?: SortOrder collectionId?: SortOrder @@ -3690,6 +3718,7 @@ export namespace Prisma { name: string elements: string appState: string + files?: string preview?: string | null version?: number createdAt?: Date | string @@ -3701,6 +3730,7 @@ export namespace Prisma { name: string elements: string appState: string + files?: string preview?: string | null version?: number createdAt?: Date | string @@ -3740,6 +3770,7 @@ export namespace Prisma { name?: StringFilter<"Drawing"> | string elements?: StringFilter<"Drawing"> | string appState?: StringFilter<"Drawing"> | string + files?: StringFilter<"Drawing"> | string preview?: StringNullableFilter<"Drawing"> | string | null version?: IntFilter<"Drawing"> | number collectionId?: StringNullableFilter<"Drawing"> | string | null @@ -3796,6 +3827,7 @@ export namespace Prisma { name: string elements: string appState: string + files?: string preview?: string | null version?: number createdAt?: Date | string @@ -3807,6 +3839,7 @@ export namespace Prisma { name?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string + files?: StringFieldUpdateOperationsInput | string preview?: NullableStringFieldUpdateOperationsInput | string | null version?: IntFieldUpdateOperationsInput | number createdAt?: DateTimeFieldUpdateOperationsInput | Date | string @@ -3818,6 +3851,7 @@ export namespace Prisma { name?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string + files?: StringFieldUpdateOperationsInput | string preview?: NullableStringFieldUpdateOperationsInput | string | null version?: IntFieldUpdateOperationsInput | number createdAt?: DateTimeFieldUpdateOperationsInput | Date | string @@ -3829,6 +3863,7 @@ export namespace Prisma { name?: StringFieldUpdateOperationsInput | string elements?: StringFieldUpdateOperationsInput | string appState?: StringFieldUpdateOperationsInput | string + files?: StringFieldUpdateOperationsInput | string preview?: NullableStringFieldUpdateOperationsInput | string | null version?: IntFieldUpdateOperationsInput | number createdAt?: DateTimeFieldUpdateOperationsInput | Date | string diff --git a/backend/src/generated/client/index.js b/backend/src/generated/client/index.js index b9fb90f..90a7b40 100644 --- a/backend/src/generated/client/index.js +++ b/backend/src/generated/client/index.js @@ -100,6 +100,7 @@ exports.Prisma.DrawingScalarFieldEnum = { name: 'name', elements: 'elements', appState: 'appState', + files: 'files', preview: 'preview', version: 'version', collectionId: 'collectionId', @@ -169,8 +170,8 @@ const config = { } } }, - "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client-js\"\n output = \"../src/generated/client\"\n}\n\ndatasource db {\n provider = \"sqlite\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel Collection {\n id String @id @default(uuid())\n name String\n drawings Drawing[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Drawing {\n id String @id @default(uuid())\n name String\n elements String // Stored as JSON string\n appState String // Stored as JSON string\n preview String? // SVG string for thumbnail\n version Int @default(1)\n collectionId String?\n collection Collection? @relation(fields: [collectionId], references: [id])\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n", - "inlineSchemaHash": "67e1a3789d22e31866fa8b498914744bb15a8743c766f6c9cb36263d6b7740a9", + "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client-js\"\n output = \"../src/generated/client\"\n}\n\ndatasource db {\n provider = \"sqlite\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel Collection {\n id String @id @default(uuid())\n name String\n drawings Drawing[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Drawing {\n id String @id @default(uuid())\n name String\n elements String // Stored as JSON string\n appState String // Stored as JSON string\n files String @default(\"{}\") // Stored as JSON string\n preview String? // SVG string for thumbnail\n version Int @default(1)\n collectionId String?\n collection Collection? @relation(fields: [collectionId], references: [id])\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n", + "inlineSchemaHash": "e43b17bb99e7f864b5a0f2c54951015f0a3d998329d0577afda58e7c0dee4919", "copyEngine": true } @@ -191,7 +192,7 @@ if (!fs.existsSync(path.join(__dirname, 'schema.prisma'))) { config.isBundled = true } -config.runtimeDataModel = JSON.parse("{\"models\":{\"Collection\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"drawings\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Drawing\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Drawing\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"elements\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"appState\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"preview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"version\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":1,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collectionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collection\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Collection\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[\"collectionId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"Collection\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"drawings\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Drawing\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Drawing\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"elements\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"appState\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"files\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"{}\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"preview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"version\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":1,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collectionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collection\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Collection\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[\"collectionId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.engineWasm = undefined diff --git a/backend/src/generated/client/package.json b/backend/src/generated/client/package.json index 8252243..737cd96 100644 --- a/backend/src/generated/client/package.json +++ b/backend/src/generated/client/package.json @@ -1,5 +1,5 @@ { - "name": "prisma-client-3ebeea41bd8603a2c294a840f7d22c864ae7fc82298676ca177ef806525c6187", + "name": "prisma-client-0eff54f2002515791cbb1f1a5b1632637c7e46544d107e5ff89b7092d9540808", "main": "index.js", "types": "index.d.ts", "browser": "index-browser.js", diff --git a/backend/src/generated/client/schema.prisma b/backend/src/generated/client/schema.prisma index 59bccb0..1a6ccfc 100644 --- a/backend/src/generated/client/schema.prisma +++ b/backend/src/generated/client/schema.prisma @@ -24,6 +24,7 @@ model Drawing { name String elements String // Stored as JSON string appState String // Stored as JSON string + files String @default("{}") // Stored as JSON string preview String? // SVG string for thumbnail version Int @default(1) collectionId String? diff --git a/backend/src/generated/client/wasm.js b/backend/src/generated/client/wasm.js index 83e61fc..6d1f1d8 100644 --- a/backend/src/generated/client/wasm.js +++ b/backend/src/generated/client/wasm.js @@ -131,6 +131,7 @@ exports.Prisma.DrawingScalarFieldEnum = { name: 'name', elements: 'elements', appState: 'appState', + files: 'files', preview: 'preview', version: 'version', collectionId: 'collectionId', diff --git a/backend/src/index.ts b/backend/src/index.ts index 6751d0a..40e0945 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -135,6 +135,7 @@ app.get("/drawings", async (req, res) => { ...d, elements: JSON.parse(d.elements), appState: JSON.parse(d.appState), + files: JSON.parse(d.files || "{}"), })); res.json(parsedDrawings); @@ -172,6 +173,7 @@ app.get("/drawings/:id", async (req, res) => { ...drawing, elements: JSON.parse(drawing.elements), appState: JSON.parse(drawing.appState), + files: JSON.parse(drawing.files || "{}"), }); } catch (error) { res.status(500).json({ error: "Failed to fetch drawing" }); @@ -181,7 +183,7 @@ app.get("/drawings/:id", async (req, res) => { // POST /drawings app.post("/drawings", async (req, res) => { try { - const { name, elements, appState, collectionId, preview } = req.body; + const { name, elements, appState, collectionId, preview, files } = req.body; const newDrawing = await prisma.drawing.create({ data: { @@ -190,6 +192,7 @@ app.post("/drawings", async (req, res) => { appState: JSON.stringify(appState || {}), collectionId: collectionId || null, preview: preview || null, + files: JSON.stringify(files || {}), }, }); @@ -197,6 +200,7 @@ app.post("/drawings", async (req, res) => { ...newDrawing, elements: JSON.parse(newDrawing.elements), appState: JSON.parse(newDrawing.appState), + files: JSON.parse(newDrawing.files || "{}"), }); } catch (error) { res.status(500).json({ error: "Failed to create drawing" }); @@ -207,7 +211,7 @@ app.post("/drawings", async (req, res) => { app.put("/drawings/:id", async (req, res) => { try { const { id } = req.params; - const { name, elements, appState, collectionId, preview } = req.body; + const { name, elements, appState, collectionId, preview, files } = req.body; console.log("[API] Updating drawing", { id, @@ -215,6 +219,7 @@ app.put("/drawings/:id", async (req, res) => { elementCount: elements && Array.isArray(elements) ? elements.length : undefined, hasAppState: appState !== undefined, + hasFiles: files !== undefined, hasPreview: preview !== undefined, }); @@ -225,6 +230,7 @@ app.put("/drawings/:id", async (req, res) => { if (name !== undefined) data.name = name; if (elements !== undefined) data.elements = JSON.stringify(elements); if (appState !== undefined) data.appState = JSON.stringify(appState); + if (files !== undefined) data.files = JSON.stringify(files); if (collectionId !== undefined) data.collectionId = collectionId; if (preview !== undefined) data.preview = preview; @@ -249,6 +255,7 @@ app.put("/drawings/:id", async (req, res) => { ...updatedDrawing, elements: JSON.parse(updatedDrawing.elements), appState: JSON.parse(updatedDrawing.appState), + files: JSON.parse(updatedDrawing.files || "{}"), }); } catch (error) { res.status(500).json({ error: "Failed to update drawing" }); @@ -281,6 +288,7 @@ app.post("/drawings/:id/duplicate", async (req, res) => { name: `${original.name} (Copy)`, elements: original.elements, appState: original.appState, + files: original.files, collectionId: original.collectionId, version: 1, }, @@ -290,6 +298,7 @@ app.post("/drawings/:id/duplicate", async (req, res) => { ...newDrawing, elements: JSON.parse(newDrawing.elements), appState: JSON.parse(newDrawing.appState), + files: JSON.parse(newDrawing.files || "{}"), }); } catch (error) { res.status(500).json({ error: "Failed to duplicate drawing" }); diff --git a/frontend/src/pages/Editor.tsx b/frontend/src/pages/Editor.tsx index b563034..69ebc51 100644 --- a/frontend/src/pages/Editor.tsx +++ b/frontend/src/pages/Editor.tsx @@ -1,7 +1,7 @@ import React, { useCallback, useEffect, useState, useRef } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { ArrowLeft } from 'lucide-react'; -import { Excalidraw, convertToExcalidrawElements, exportToSvg } from '@excalidraw/excalidraw'; +import { Excalidraw, exportToSvg } from '@excalidraw/excalidraw'; import '@excalidraw/excalidraw/index.css'; import debounce from 'lodash/debounce'; import throttle from 'lodash/throttle'; @@ -235,6 +235,7 @@ export const Editor: React.FC = () => { gridSize: null, collaborators: new Map(), }, + files: {}, scrollToContent: true, }), []); @@ -269,6 +270,7 @@ export const Editor: React.FC = () => { await api.updateDrawing(id, { elements: persistableElements, appState: persistableAppState, + files: latestFilesRef.current || {}, }); console.log("[Editor] Save complete", { drawingId: id }); @@ -362,7 +364,7 @@ export const Editor: React.FC = () => { hasHydratedInitialScene.current = false; elementVersionMap.current.clear(); latestElementsRef.current = []; - latestFilesRef.current = null; + latestFilesRef.current = {}; excalidrawAPI.current = null; setIsReady(false); setIsSceneLoading(true); @@ -378,9 +380,11 @@ export const Editor: React.FC = () => { const data = await api.getDrawing(id); setDrawingName(data.name); - const elements = convertToExcalidrawElements(data.elements || []); + // Use elements directly without converting - they're already normalized during import + const elements = data.elements || []; + const files = data.files || {}; latestElementsRef.current = elements; - latestFilesRef.current = null; + latestFilesRef.current = files; elements.forEach((el: any) => { recordElementVersion(el); @@ -397,11 +401,14 @@ export const Editor: React.FC = () => { setInitialData({ elements, appState: hydratedAppState, + files, scrollToContent: true, }); } catch (err) { console.error('Failed to load drawing', err); toast.error("Failed to load drawing"); + latestElementsRef.current = []; + latestFilesRef.current = {}; setInitialData(buildEmptyScene()); } finally { setIsSceneLoading(false); @@ -422,7 +429,7 @@ export const Editor: React.FC = () => { if (excalidrawAPI.current && saveDataRef.current && savePreviewRef.current) { const elements = excalidrawAPI.current.getSceneElementsIncludingDeleted(); const appState = excalidrawAPI.current.getAppState(); - const files = excalidrawAPI.current.getFiles() || null; + const files = excalidrawAPI.current.getFiles() || {}; latestElementsRef.current = elements; latestFilesRef.current = files; // Call save immediately, bypassing debounce @@ -494,11 +501,11 @@ export const Editor: React.FC = () => { debouncedSave(allElements, appState); // Trigger Slow Preview Gen - const files = excalidrawAPI.current?.getFiles() || null; + const files = excalidrawAPI.current?.getFiles() || {}; latestFilesRef.current = files; console.log("[Editor] Queueing preview save", { drawingId: id, - fileCount: files ? Object.keys(files).length : 0, + fileCount: Object.keys(files).length, }); debouncedSavePreview(allElements, appState, files); }, [debouncedSave, debouncedSavePreview, broadcastChanges]); diff --git a/frontend/src/types/index.ts b/frontend/src/types/index.ts index 44f7e26..278404e 100644 --- a/frontend/src/types/index.ts +++ b/frontend/src/types/index.ts @@ -3,6 +3,7 @@ export interface Drawing { name: string; elements: any[]; appState: any; + files: Record | null; collectionId: string | null; updatedAt: number; createdAt: number; diff --git a/frontend/src/utils/importUtils.ts b/frontend/src/utils/importUtils.ts index e00f729..8091041 100644 --- a/frontend/src/utils/importUtils.ts +++ b/frontend/src/utils/importUtils.ts @@ -29,7 +29,8 @@ export const importDrawings = async ( throw new Error(`Invalid file structure: ${file.name}`); } - // Generate Preview + // Use raw elements directly from the file - no normalization needed + // Generate Preview with raw elements const svg = await exportToSvg({ elements: data.elements, appState: { @@ -37,11 +38,11 @@ export const importDrawings = async ( exportBackground: true, viewBackgroundColor: data.appState.viewBackgroundColor || "#ffffff", }, - files: data.files || null, + files: data.files || {}, exportPadding: 10, }); - // Prepare payload + // Prepare payload with raw elements const payload = { name: file.name.replace(/\.(json|excalidraw)$/, ""), elements: data.elements,