correction de l'update du

workflow
This commit is contained in:
2026-02-26 22:39:23 +01:00
parent 56b5615abf
commit 4e1637a792
370 changed files with 19223 additions and 900 deletions

View File

@@ -0,0 +1,7 @@
module.exports = [
"[project]/Documents/00 - projet/plumeia/.next-internal/server/app/api/projects/[id]/workflow/route/actions.js [app-rsc] (server actions loader, ecmascript)", ((__turbopack_context__, module, exports) => {
}),
];
//# sourceMappingURL=13a27__next-internal_server_app_api_projects_%5Bid%5D_workflow_route_actions_04e92945.js.map

View File

@@ -0,0 +1,6 @@
{
"version": 3,
"sources": [],
"sections": [
{"offset": {"line": 3, "column": 0}, "map": {"version":3,"sources":[],"names":[],"mappings":""}}]
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,10 @@
module.exports = [
"[project]/Documents/00 - projet/plumeia/src/lib/prisma.ts [app-route] (ecmascript, async loader)", ((__turbopack_context__) => {
__turbopack_context__.v((parentImport) => {
return Promise.resolve().then(() => {
return parentImport("[project]/Documents/00 - projet/plumeia/src/lib/prisma.ts [app-route] (ecmascript)");
});
});
}),
];

View File

@@ -0,0 +1,5 @@
{
"version": 3,
"sources": [],
"sections": []
}

View File

@@ -0,0 +1,268 @@
module.exports = [
"[externals]/next/dist/compiled/next-server/app-route-turbo.runtime.dev.js [external] (next/dist/compiled/next-server/app-route-turbo.runtime.dev.js, cjs)", ((__turbopack_context__, module, exports) => {
const mod = __turbopack_context__.x("next/dist/compiled/next-server/app-route-turbo.runtime.dev.js", () => require("next/dist/compiled/next-server/app-route-turbo.runtime.dev.js"));
module.exports = mod;
}),
"[externals]/next/dist/compiled/@opentelemetry/api [external] (next/dist/compiled/@opentelemetry/api, cjs)", ((__turbopack_context__, module, exports) => {
const mod = __turbopack_context__.x("next/dist/compiled/@opentelemetry/api", () => require("next/dist/compiled/@opentelemetry/api"));
module.exports = mod;
}),
"[externals]/next/dist/compiled/next-server/app-page-turbo.runtime.dev.js [external] (next/dist/compiled/next-server/app-page-turbo.runtime.dev.js, cjs)", ((__turbopack_context__, module, exports) => {
const mod = __turbopack_context__.x("next/dist/compiled/next-server/app-page-turbo.runtime.dev.js", () => require("next/dist/compiled/next-server/app-page-turbo.runtime.dev.js"));
module.exports = mod;
}),
"[externals]/next/dist/server/app-render/work-unit-async-storage.external.js [external] (next/dist/server/app-render/work-unit-async-storage.external.js, cjs)", ((__turbopack_context__, module, exports) => {
const mod = __turbopack_context__.x("next/dist/server/app-render/work-unit-async-storage.external.js", () => require("next/dist/server/app-render/work-unit-async-storage.external.js"));
module.exports = mod;
}),
"[externals]/next/dist/server/app-render/work-async-storage.external.js [external] (next/dist/server/app-render/work-async-storage.external.js, cjs)", ((__turbopack_context__, module, exports) => {
const mod = __turbopack_context__.x("next/dist/server/app-render/work-async-storage.external.js", () => require("next/dist/server/app-render/work-async-storage.external.js"));
module.exports = mod;
}),
"[externals]/next/dist/shared/lib/no-fallback-error.external.js [external] (next/dist/shared/lib/no-fallback-error.external.js, cjs)", ((__turbopack_context__, module, exports) => {
const mod = __turbopack_context__.x("next/dist/shared/lib/no-fallback-error.external.js", () => require("next/dist/shared/lib/no-fallback-error.external.js"));
module.exports = mod;
}),
"[externals]/next/dist/server/app-render/after-task-async-storage.external.js [external] (next/dist/server/app-render/after-task-async-storage.external.js, cjs)", ((__turbopack_context__, module, exports) => {
const mod = __turbopack_context__.x("next/dist/server/app-render/after-task-async-storage.external.js", () => require("next/dist/server/app-render/after-task-async-storage.external.js"));
module.exports = mod;
}),
"[externals]/crypto [external] (crypto, cjs)", ((__turbopack_context__, module, exports) => {
const mod = __turbopack_context__.x("crypto", () => require("crypto"));
module.exports = mod;
}),
"[externals]/next/dist/server/app-render/action-async-storage.external.js [external] (next/dist/server/app-render/action-async-storage.external.js, cjs)", ((__turbopack_context__, module, exports) => {
const mod = __turbopack_context__.x("next/dist/server/app-render/action-async-storage.external.js", () => require("next/dist/server/app-render/action-async-storage.external.js"));
module.exports = mod;
}),
"[project]/Documents/00 - projet/plumeia/src/lib/auth.ts [app-route] (ecmascript)", ((__turbopack_context__) => {
"use strict";
__turbopack_context__.s([
"auth",
()=>auth,
"handlers",
()=>handlers,
"signIn",
()=>signIn,
"signOut",
()=>signOut
]);
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2d$auth$2f$index$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__$3c$locals$3e$__ = __turbopack_context__.i("[project]/Documents/00 - projet/plumeia/node_modules/next-auth/index.js [app-route] (ecmascript) <locals>");
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2d$auth$2f$providers$2f$credentials$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__$3c$locals$3e$__ = __turbopack_context__.i("[project]/Documents/00 - projet/plumeia/node_modules/next-auth/providers/credentials.js [app-route] (ecmascript) <locals>");
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$auth$2f$core$2f$providers$2f$credentials$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/00 - projet/plumeia/node_modules/@auth/core/providers/credentials.js [app-route] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$bcryptjs$2f$index$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/00 - projet/plumeia/node_modules/bcryptjs/index.js [app-route] (ecmascript)");
;
;
;
const { handlers, signIn, signOut, auth } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2d$auth$2f$index$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__$3c$locals$3e$__["default"])({
providers: [
(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$auth$2f$core$2f$providers$2f$credentials$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"])({
name: 'credentials',
credentials: {
email: {
label: 'Email',
type: 'email'
},
password: {
label: 'Password',
type: 'password'
}
},
async authorize (credentials) {
if (!credentials?.email || !credentials?.password) return null;
// Lazy import to avoid PrismaClient initialization during build
const { default: getDB } = await __turbopack_context__.A("[project]/Documents/00 - projet/plumeia/src/lib/prisma.ts [app-route] (ecmascript, async loader)");
const prisma = getDB();
const user = await prisma.user.findUnique({
where: {
email: credentials.email
}
});
if (!user) return null;
const isValid = await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$bcryptjs$2f$index$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].compare(credentials.password, user.hashedPassword);
if (!isValid) return null;
return {
id: user.id,
email: user.email,
name: user.name
};
}
})
],
session: {
strategy: 'jwt'
},
callbacks: {
async jwt ({ token, user }) {
if (user) {
token.id = user.id;
}
return token;
},
async session ({ session, token }) {
if (session.user && token.id) {
session.user.id = token.id;
}
return session;
}
},
pages: {
signIn: '/'
}
});
}),
"[project]/Documents/00 - projet/plumeia/src/lib/prisma.ts [app-route] (ecmascript)", ((__turbopack_context__) => {
"use strict";
return __turbopack_context__.a(async (__turbopack_handle_async_dependencies__, __turbopack_async_result__) => { try {
__turbopack_context__.s([
"default",
()=>__TURBOPACK__default__export__,
"getDB",
()=>getDB
]);
var __TURBOPACK__imported__module__$5b$externals$5d2f40$prisma$2f$client__$5b$external$5d$__$2840$prisma$2f$client$2c$__cjs$2c$__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$prisma$2f$client$29$__ = __turbopack_context__.i("[externals]/@prisma/client [external] (@prisma/client, cjs, [project]/Documents/00 - projet/plumeia/node_modules/@prisma/client)");
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$prisma$2f$adapter$2d$pg$2f$dist$2f$index$2e$mjs__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/00 - projet/plumeia/node_modules/@prisma/adapter-pg/dist/index.mjs [app-route] (ecmascript)");
var __TURBOPACK__imported__module__$5b$externals$5d2f$pg__$5b$external$5d$__$28$pg$2c$__esm_import$2c$__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$pg$29$__ = __turbopack_context__.i("[externals]/pg [external] (pg, esm_import, [project]/Documents/00 - projet/plumeia/node_modules/pg)");
var __turbopack_async_dependencies__ = __turbopack_handle_async_dependencies__([
__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$prisma$2f$adapter$2d$pg$2f$dist$2f$index$2e$mjs__$5b$app$2d$route$5d$__$28$ecmascript$29$__,
__TURBOPACK__imported__module__$5b$externals$5d2f$pg__$5b$external$5d$__$28$pg$2c$__esm_import$2c$__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$pg$29$__
]);
[__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$prisma$2f$adapter$2d$pg$2f$dist$2f$index$2e$mjs__$5b$app$2d$route$5d$__$28$ecmascript$29$__, __TURBOPACK__imported__module__$5b$externals$5d2f$pg__$5b$external$5d$__$28$pg$2c$__esm_import$2c$__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$pg$29$__] = __turbopack_async_dependencies__.then ? (await __turbopack_async_dependencies__)() : __turbopack_async_dependencies__;
;
;
;
const globalForPrisma = globalThis;
function getDB() {
if (!globalForPrisma.prisma) {
const connectionString = process.env.DATABASE_URL;
const pool = new __TURBOPACK__imported__module__$5b$externals$5d2f$pg__$5b$external$5d$__$28$pg$2c$__esm_import$2c$__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$pg$29$__["Pool"]({
connectionString
});
const adapter = new __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$prisma$2f$adapter$2d$pg$2f$dist$2f$index$2e$mjs__$5b$app$2d$route$5d$__$28$ecmascript$29$__["PrismaPg"](pool);
globalForPrisma.prisma = new __TURBOPACK__imported__module__$5b$externals$5d2f40$prisma$2f$client__$5b$external$5d$__$2840$prisma$2f$client$2c$__cjs$2c$__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$prisma$2f$client$29$__["PrismaClient"]({
adapter
});
}
return globalForPrisma.prisma;
}
const __TURBOPACK__default__export__ = getDB;
__turbopack_async_result__();
} catch(e) { __turbopack_async_result__(e); } }, false);}),
"[project]/Documents/00 - projet/plumeia/src/app/api/projects/[id]/workflow/route.ts [app-route] (ecmascript)", ((__turbopack_context__) => {
"use strict";
return __turbopack_context__.a(async (__turbopack_handle_async_dependencies__, __turbopack_async_result__) => { try {
__turbopack_context__.s([
"PUT",
()=>PUT,
"dynamic",
()=>dynamic
]);
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/00 - projet/plumeia/node_modules/next/server.js [app-route] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$auth$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/00 - projet/plumeia/src/lib/auth.ts [app-route] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/00 - projet/plumeia/src/lib/prisma.ts [app-route] (ecmascript)");
var __turbopack_async_dependencies__ = __turbopack_handle_async_dependencies__([
__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__
]);
[__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__] = __turbopack_async_dependencies__.then ? (await __turbopack_async_dependencies__)() : __turbopack_async_dependencies__;
const dynamic = 'force-dynamic';
;
;
;
async function PUT(request, { params }) {
const session = await (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$auth$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["auth"])();
if (!session?.user?.id) {
return __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json({
error: 'Non autorisé'
}, {
status: 401
});
}
const { id } = await params;
const prisma = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"])();
// Verify ownership
const project = await prisma.project.findFirst({
where: {
id,
userId: session.user.id
}
});
if (!project) {
return __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json({
error: 'Projet non trouvé'
}, {
status: 404
});
}
const { nodes, connections } = await request.json();
// Replace all nodes and connections in a transaction
await prisma.$transaction(async (tx)=>{
// Delete existing
await tx.plotConnection.deleteMany({
where: {
projectId: id
}
});
await tx.plotNode.deleteMany({
where: {
projectId: id
}
});
// Create new nodes
if (nodes && nodes.length > 0) {
await tx.plotNode.createMany({
data: nodes.map((n)=>({
id: n.id,
projectId: id,
x: n.x,
y: n.y,
title: n.title || '',
description: n.description || '',
color: n.color || '#ffffff',
type: n.type || 'story'
}))
});
}
// Create new connections
if (connections && connections.length > 0) {
await tx.plotConnection.createMany({
data: connections.map((c)=>({
id: c.id,
projectId: id,
source: c.source,
target: c.target
}))
});
}
});
return __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json({
success: true
});
}
__turbopack_async_result__();
} catch(e) { __turbopack_async_result__(e); } }, false);}),
];
//# sourceMappingURL=%5Broot-of-the-server%5D__3e7d68f1._.js.map

View File

@@ -0,0 +1,8 @@
{
"version": 3,
"sources": [],
"sections": [
{"offset": {"line": 58, "column": 0}, "map": {"version":3,"sources":["file:///C:/Users/streaper2/Documents/00%20-%20projet/plumeia/src/lib/auth.ts"],"sourcesContent":["import NextAuth from 'next-auth';\r\nimport Credentials from 'next-auth/providers/credentials';\r\nimport bcrypt from 'bcryptjs';\r\n\r\nexport const { handlers, signIn, signOut, auth } = NextAuth({\r\n providers: [\r\n Credentials({\r\n name: 'credentials',\r\n credentials: {\r\n email: { label: 'Email', type: 'email' },\r\n password: { label: 'Password', type: 'password' },\r\n },\r\n async authorize(credentials) {\r\n if (!credentials?.email || !credentials?.password) return null;\r\n\r\n // Lazy import to avoid PrismaClient initialization during build\r\n const { default: getDB } = await import('./prisma');\r\n const prisma = getDB();\r\n\r\n const user = await prisma.user.findUnique({\r\n where: { email: credentials.email as string },\r\n });\r\n\r\n if (!user) return null;\r\n\r\n const isValid = await bcrypt.compare(\r\n credentials.password as string,\r\n user.hashedPassword\r\n );\r\n\r\n if (!isValid) return null;\r\n\r\n return {\r\n id: user.id,\r\n email: user.email,\r\n name: user.name,\r\n };\r\n },\r\n }),\r\n ],\r\n session: {\r\n strategy: 'jwt',\r\n },\r\n callbacks: {\r\n async jwt({ token, user }) {\r\n if (user) {\r\n token.id = user.id;\r\n }\r\n return token;\r\n },\r\n async session({ session, token }) {\r\n if (session.user && token.id) {\r\n session.user.id = token.id as string;\r\n }\r\n return session;\r\n },\r\n },\r\n pages: {\r\n signIn: '/',\r\n },\r\n});\r\n"],"names":[],"mappings":";;;;;;;;;;AAAA;AACA;AAAA;AACA;;;;AAEO,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAA,8MAAQ,EAAC;IACxD,WAAW;QACP,IAAA,mNAAW,EAAC;YACR,MAAM;YACN,aAAa;gBACT,OAAO;oBAAE,OAAO;oBAAS,MAAM;gBAAQ;gBACvC,UAAU;oBAAE,OAAO;oBAAY,MAAM;gBAAW;YACpD;YACA,MAAM,WAAU,WAAW;gBACvB,IAAI,CAAC,aAAa,SAAS,CAAC,aAAa,UAAU,OAAO;gBAE1D,gEAAgE;gBAChE,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG;gBAC3B,MAAM,SAAS;gBAEf,MAAM,OAAO,MAAM,OAAO,IAAI,CAAC,UAAU,CAAC;oBACtC,OAAO;wBAAE,OAAO,YAAY,KAAK;oBAAW;gBAChD;gBAEA,IAAI,CAAC,MAAM,OAAO;gBAElB,MAAM,UAAU,MAAM,0LAAM,CAAC,OAAO,CAChC,YAAY,QAAQ,EACpB,KAAK,cAAc;gBAGvB,IAAI,CAAC,SAAS,OAAO;gBAErB,OAAO;oBACH,IAAI,KAAK,EAAE;oBACX,OAAO,KAAK,KAAK;oBACjB,MAAM,KAAK,IAAI;gBACnB;YACJ;QACJ;KACH;IACD,SAAS;QACL,UAAU;IACd;IACA,WAAW;QACP,MAAM,KAAI,EAAE,KAAK,EAAE,IAAI,EAAE;YACrB,IAAI,MAAM;gBACN,MAAM,EAAE,GAAG,KAAK,EAAE;YACtB;YACA,OAAO;QACX;QACA,MAAM,SAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;YAC5B,IAAI,QAAQ,IAAI,IAAI,MAAM,EAAE,EAAE;gBAC1B,QAAQ,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE;YAC9B;YACA,OAAO;QACX;IACJ;IACA,OAAO;QACH,QAAQ;IACZ;AACJ"}},
{"offset": {"line": 137, "column": 0}, "map": {"version":3,"sources":["file:///C:/Users/streaper2/Documents/00%20-%20projet/plumeia/src/lib/prisma.ts"],"sourcesContent":["import { PrismaClient } from '@prisma/client';\r\nimport { PrismaPg } from '@prisma/adapter-pg';\r\nimport { Pool } from 'pg';\r\n\r\nconst globalForPrisma = globalThis as unknown as {\r\n prisma: PrismaClient | undefined;\r\n};\r\n\r\n/**\r\n * Returns a singleton PrismaClient instance using the Prisma v7 adapter pattern.\r\n * Uses @prisma/adapter-pg with a pg Pool for direct PostgreSQL connections.\r\n */\r\nexport function getDB(): PrismaClient {\r\n if (!globalForPrisma.prisma) {\r\n const connectionString = process.env.DATABASE_URL;\r\n const pool = new Pool({ connectionString });\r\n const adapter = new PrismaPg(pool);\r\n\r\n globalForPrisma.prisma = new PrismaClient({ adapter });\r\n }\r\n return globalForPrisma.prisma;\r\n}\r\n\r\nexport default getDB;\r\n"],"names":[],"mappings":";;;;;;AAAA;AACA;AACA;;;;;;;;;AAEA,MAAM,kBAAkB;AAQjB,SAAS;IACZ,IAAI,CAAC,gBAAgB,MAAM,EAAE;QACzB,MAAM,mBAAmB,QAAQ,GAAG,CAAC,YAAY;QACjD,MAAM,OAAO,IAAI,iMAAI,CAAC;YAAE;QAAiB;QACzC,MAAM,UAAU,IAAI,qNAAQ,CAAC;QAE7B,gBAAgB,MAAM,GAAG,IAAI,kPAAY,CAAC;YAAE;QAAQ;IACxD;IACA,OAAO,gBAAgB,MAAM;AACjC;uCAEe"}},
{"offset": {"line": 176, "column": 0}, "map": {"version":3,"sources":["file:///C:/Users/streaper2/Documents/00%20-%20projet/plumeia/src/app/api/projects/%5Bid%5D/workflow/route.ts"],"sourcesContent":["export const dynamic = 'force-dynamic';\r\n\r\nimport { NextRequest, NextResponse } from 'next/server';\r\nimport { auth } from '@/lib/auth';\r\nimport getDB from '@/lib/prisma';\r\n\r\n// PUT /api/projects/[id]/workflow — Sync workflow (nodes + connections)\r\nexport async function PUT(\r\n request: NextRequest,\r\n { params }: { params: Promise<{ id: string }> }\r\n) {\r\n const session = await auth();\r\n if (!session?.user?.id) {\r\n return NextResponse.json({ error: 'Non autorisé' }, { status: 401 });\r\n }\r\n\r\n const { id } = await params;\r\n const prisma = getDB();\r\n\r\n // Verify ownership\r\n const project = await prisma.project.findFirst({\r\n where: { id, userId: session.user.id },\r\n });\r\n if (!project) {\r\n return NextResponse.json({ error: 'Projet non trouvé' }, { status: 404 });\r\n }\r\n\r\n const { nodes, connections } = await request.json();\r\n\r\n // Replace all nodes and connections in a transaction\r\n await prisma.$transaction(async (tx) => {\r\n // Delete existing\r\n await tx.plotConnection.deleteMany({ where: { projectId: id } });\r\n await tx.plotNode.deleteMany({ where: { projectId: id } });\r\n\r\n // Create new nodes\r\n if (nodes && nodes.length > 0) {\r\n await tx.plotNode.createMany({\r\n data: nodes.map((n: any) => ({\r\n id: n.id,\r\n projectId: id,\r\n x: n.x,\r\n y: n.y,\r\n title: n.title || '',\r\n description: n.description || '',\r\n color: n.color || '#ffffff',\r\n type: n.type || 'story',\r\n })),\r\n });\r\n }\r\n\r\n // Create new connections\r\n if (connections && connections.length > 0) {\r\n await tx.plotConnection.createMany({\r\n data: connections.map((c: any) => ({\r\n id: c.id,\r\n projectId: id,\r\n source: c.source,\r\n target: c.target,\r\n })),\r\n });\r\n }\r\n });\r\n\r\n return NextResponse.json({ success: true });\r\n}\r\n"],"names":[],"mappings":";;;;;;AAEA;AACA;AACA;;;;;AAJO,MAAM,UAAU;;;;AAOhB,eAAe,IAClB,OAAoB,EACpB,EAAE,MAAM,EAAuC;IAE/C,MAAM,UAAU,MAAM,IAAA,wKAAI;IAC1B,IAAI,CAAC,SAAS,MAAM,IAAI;QACpB,OAAO,4LAAY,CAAC,IAAI,CAAC;YAAE,OAAO;QAAe,GAAG;YAAE,QAAQ;QAAI;IACtE;IAEA,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM;IACrB,MAAM,SAAS,IAAA,6KAAK;IAEpB,mBAAmB;IACnB,MAAM,UAAU,MAAM,OAAO,OAAO,CAAC,SAAS,CAAC;QAC3C,OAAO;YAAE;YAAI,QAAQ,QAAQ,IAAI,CAAC,EAAE;QAAC;IACzC;IACA,IAAI,CAAC,SAAS;QACV,OAAO,4LAAY,CAAC,IAAI,CAAC;YAAE,OAAO;QAAoB,GAAG;YAAE,QAAQ;QAAI;IAC3E;IAEA,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,QAAQ,IAAI;IAEjD,qDAAqD;IACrD,MAAM,OAAO,YAAY,CAAC,OAAO;QAC7B,kBAAkB;QAClB,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC;YAAE,OAAO;gBAAE,WAAW;YAAG;QAAE;QAC9D,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO;gBAAE,WAAW;YAAG;QAAE;QAExD,mBAAmB;QACnB,IAAI,SAAS,MAAM,MAAM,GAAG,GAAG;YAC3B,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC;gBACzB,MAAM,MAAM,GAAG,CAAC,CAAC,IAAW,CAAC;wBACzB,IAAI,EAAE,EAAE;wBACR,WAAW;wBACX,GAAG,EAAE,CAAC;wBACN,GAAG,EAAE,CAAC;wBACN,OAAO,EAAE,KAAK,IAAI;wBAClB,aAAa,EAAE,WAAW,IAAI;wBAC9B,OAAO,EAAE,KAAK,IAAI;wBAClB,MAAM,EAAE,IAAI,IAAI;oBACpB,CAAC;YACL;QACJ;QAEA,yBAAyB;QACzB,IAAI,eAAe,YAAY,MAAM,GAAG,GAAG;YACvC,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC;gBAC/B,MAAM,YAAY,GAAG,CAAC,CAAC,IAAW,CAAC;wBAC/B,IAAI,EAAE,EAAE;wBACR,WAAW;wBACX,QAAQ,EAAE,MAAM;wBAChB,QAAQ,EAAE,MAAM;oBACpB,CAAC;YACL;QACJ;IACJ;IAEA,OAAO,4LAAY,CAAC,IAAI,CAAC;QAAE,SAAS;IAAK;AAC7C"}}]
}

View File

@@ -79,7 +79,7 @@ const renderTextWithLinks = (text, entities, onNavigate)=>{
children: parts
}, void 0, false);
};
const StoryNode = /*#__PURE__*/ __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"].memo(({ node, isSelected, isEditing, activeColorPickerId, entities, savedColors, onMouseDown, onMouseUp, onStartConnection, onUpdate, onSetEditing, onToggleColorPicker, onSaveColor, onNavigateToEntity, onInputFocus, onInputCheckAutocomplete, onKeyDownInInput })=>{
const StoryNode = /*#__PURE__*/ __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"].memo(({ node, isSelected, isEditing, isDragging, activeColorPickerId, entities, savedColors, onMouseDown, onMouseUp, onStartConnection, onUpdate, onSetEditing, onToggleColorPicker, onSaveColor, onNavigateToEntity, onInputFocus, onInputCheckAutocomplete, onKeyDownInInput })=>{
const [showTypePicker, setShowTypePicker] = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(false);
const richDescription = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useMemo"])(()=>{
return renderTextWithLinks(node.description, entities, onNavigateToEntity);
@@ -89,7 +89,8 @@ const StoryNode = /*#__PURE__*/ __TURBOPACK__imported__module__$5b$project$5d2f$
onNavigateToEntity
]);
return /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: `absolute flex flex-col rounded-xl shadow-sm border transition-all z-10 group
className: `absolute flex flex-col rounded-xl shadow-sm border z-10 group
${isDragging ? '' : 'transition-all'}
${isSelected ? 'ring-2 ring-indigo-500 shadow-lg scale-[1.01]' : 'border-slate-200 hover:shadow-md'}
`,
style: {
@@ -101,13 +102,14 @@ const StoryNode = /*#__PURE__*/ __TURBOPACK__imported__module__$5b$project$5d2f$
},
onMouseDown: (e)=>onMouseDown(e, node.id),
onMouseUp: (e)=>onMouseUp(e, node.id),
onDoubleClick: (e)=>e.stopPropagation(),
onMouseLeave: ()=>setShowTypePicker(false),
children: [
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "h-1.5 rounded-t-xl bg-black/5 w-full cursor-grab active:cursor-grabbing"
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 117,
lineNumber: 120,
columnNumber: 13
}, ("TURBOPACK compile-time value", void 0)),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
@@ -126,7 +128,7 @@ const StoryNode = /*#__PURE__*/ __TURBOPACK__imported__module__$5b$project$5d2f$
autoFocus: true
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 122,
lineNumber: 125,
columnNumber: 25
}, ("TURBOPACK compile-time value", void 0)) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "font-bold text-slate-800 cursor-text truncate mr-6 text-sm",
@@ -134,7 +136,7 @@ const StoryNode = /*#__PURE__*/ __TURBOPACK__imported__module__$5b$project$5d2f$
children: node.title
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 130,
lineNumber: 133,
columnNumber: 25
}, ("TURBOPACK compile-time value", void 0)),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("button", {
@@ -147,12 +149,12 @@ const StoryNode = /*#__PURE__*/ __TURBOPACK__imported__module__$5b$project$5d2f$
size: 14
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 142,
lineNumber: 145,
columnNumber: 25
}, ("TURBOPACK compile-time value", void 0))
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 138,
lineNumber: 141,
columnNumber: 21
}, ("TURBOPACK compile-time value", void 0)),
activeColorPickerId === node.id && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
@@ -171,12 +173,12 @@ const StoryNode = /*#__PURE__*/ __TURBOPACK__imported__module__$5b$project$5d2f$
}
}, color, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 149,
lineNumber: 152,
columnNumber: 37
}, ("TURBOPACK compile-time value", void 0)))
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 147,
lineNumber: 150,
columnNumber: 29
}, ("TURBOPACK compile-time value", void 0)),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
@@ -193,12 +195,12 @@ const StoryNode = /*#__PURE__*/ __TURBOPACK__imported__module__$5b$project$5d2f$
})
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 159,
lineNumber: 162,
columnNumber: 37
}, ("TURBOPACK compile-time value", void 0))
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 158,
lineNumber: 161,
columnNumber: 33
}, ("TURBOPACK compile-time value", void 0)),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("button", {
@@ -207,25 +209,25 @@ const StoryNode = /*#__PURE__*/ __TURBOPACK__imported__module__$5b$project$5d2f$
children: "+ SAUVER"
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 166,
lineNumber: 169,
columnNumber: 33
}, ("TURBOPACK compile-time value", void 0))
]
}, void 0, true, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 157,
lineNumber: 160,
columnNumber: 29
}, ("TURBOPACK compile-time value", void 0))
]
}, void 0, true, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 146,
lineNumber: 149,
columnNumber: 25
}, ("TURBOPACK compile-time value", void 0))
]
}, void 0, true, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 120,
lineNumber: 123,
columnNumber: 17
}, ("TURBOPACK compile-time value", void 0)),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
@@ -240,7 +242,7 @@ const StoryNode = /*#__PURE__*/ __TURBOPACK__imported__module__$5b$project$5d2f$
onBlur: ()=>onSetEditing(null)
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 179,
lineNumber: 182,
columnNumber: 25
}, ("TURBOPACK compile-time value", void 0)) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: `w-full h-full text-xs text-slate-600 leading-relaxed p-1 cursor-text whitespace-pre-wrap ${node.type === 'dialogue' ? 'font-mono bg-indigo-50/30 rounded pl-2 border-l-2 border-indigo-200' : ''}`,
@@ -248,12 +250,12 @@ const StoryNode = /*#__PURE__*/ __TURBOPACK__imported__module__$5b$project$5d2f$
children: richDescription
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 189,
lineNumber: 192,
columnNumber: 25
}, ("TURBOPACK compile-time value", void 0))
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 177,
lineNumber: 180,
columnNumber: 17
}, ("TURBOPACK compile-time value", void 0)),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
@@ -278,12 +280,12 @@ const StoryNode = /*#__PURE__*/ __TURBOPACK__imported__module__$5b$project$5d2f$
className: "text-slate-500"
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 206,
lineNumber: 209,
columnNumber: 33
}, ("TURBOPACK compile-time value", void 0))
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 201,
lineNumber: 204,
columnNumber: 29
}, ("TURBOPACK compile-time value", void 0)),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("button", {
@@ -301,12 +303,12 @@ const StoryNode = /*#__PURE__*/ __TURBOPACK__imported__module__$5b$project$5d2f$
className: "text-amber-500"
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 213,
lineNumber: 216,
columnNumber: 33
}, ("TURBOPACK compile-time value", void 0))
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 208,
lineNumber: 211,
columnNumber: 29
}, ("TURBOPACK compile-time value", void 0)),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("button", {
@@ -324,18 +326,18 @@ const StoryNode = /*#__PURE__*/ __TURBOPACK__imported__module__$5b$project$5d2f$
className: "text-blue-500"
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 220,
lineNumber: 223,
columnNumber: 33
}, ("TURBOPACK compile-time value", void 0))
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 215,
lineNumber: 218,
columnNumber: 29
}, ("TURBOPACK compile-time value", void 0))
]
}, void 0, true, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 200,
lineNumber: 203,
columnNumber: 25
}, ("TURBOPACK compile-time value", void 0)),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("button", {
@@ -350,7 +352,7 @@ const StoryNode = /*#__PURE__*/ __TURBOPACK__imported__module__$5b$project$5d2f$
className: "text-slate-500"
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 229,
lineNumber: 232,
columnNumber: 51
}, ("TURBOPACK compile-time value", void 0)),
node.type === 'action' && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$zap$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__Zap$3e$__["Zap"], {
@@ -358,7 +360,7 @@ const StoryNode = /*#__PURE__*/ __TURBOPACK__imported__module__$5b$project$5d2f$
className: "text-amber-500"
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 230,
lineNumber: 233,
columnNumber: 52
}, ("TURBOPACK compile-time value", void 0)),
node.type === 'dialogue' && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$message$2d$circle$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__$3c$export__default__as__MessageCircle$3e$__["MessageCircle"], {
@@ -366,25 +368,25 @@ const StoryNode = /*#__PURE__*/ __TURBOPACK__imported__module__$5b$project$5d2f$
className: "text-blue-500"
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 231,
lineNumber: 234,
columnNumber: 54
}, ("TURBOPACK compile-time value", void 0))
]
}, void 0, true, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 225,
lineNumber: 228,
columnNumber: 21
}, ("TURBOPACK compile-time value", void 0))
]
}, void 0, true, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 198,
lineNumber: 201,
columnNumber: 17
}, ("TURBOPACK compile-time value", void 0))
]
}, void 0, true, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 119,
lineNumber: 122,
columnNumber: 13
}, ("TURBOPACK compile-time value", void 0)),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("button", {
@@ -394,22 +396,22 @@ const StoryNode = /*#__PURE__*/ __TURBOPACK__imported__module__$5b$project$5d2f$
size: 12
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 240,
lineNumber: 243,
columnNumber: 17
}, ("TURBOPACK compile-time value", void 0))
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 236,
lineNumber: 239,
columnNumber: 13
}, ("TURBOPACK compile-time value", void 0))
]
}, void 0, true, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 102,
lineNumber: 103,
columnNumber: 9
}, ("TURBOPACK compile-time value", void 0));
}, (prev, next)=>{
return prev.node === next.node && prev.isSelected === next.isSelected && prev.isEditing === next.isEditing && prev.activeColorPickerId === next.activeColorPickerId && prev.entities === next.entities;
return prev.node === next.node && prev.isSelected === next.isSelected && prev.isEditing === next.isEditing && prev.isDragging === next.isDragging && prev.activeColorPickerId === next.activeColorPickerId && prev.entities === next.entities;
});
const StoryWorkflow = ({ data, onUpdate, entities, onNavigateToEntity })=>{
const containerRef = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useRef"])(null);
@@ -659,12 +661,15 @@ const StoryWorkflow = ({ data, onUpdate, entities, onNavigateToEntity })=>{
containerRef.current.scrollTop = scrollStart.y - dy;
return;
}
const scrollLeft = containerRef.current?.scrollLeft || 0;
const scrollTop = containerRef.current?.scrollTop || 0;
setMousePos({
x: clientX - rect.left + scrollLeft,
y: clientY - rect.top + scrollTop
});
// Only update mousePos when connecting (drawing a line), not during node drag
if (connectingNodeId) {
const scrollLeft = containerRef.current?.scrollLeft || 0;
const scrollTop = containerRef.current?.scrollTop || 0;
setMousePos({
x: clientX - rect.left + scrollLeft,
y: clientY - rect.top + scrollTop
});
}
if (isDragging) {
if (rafRef.current) return;
rafRef.current = requestAnimationFrame(()=>{
@@ -683,7 +688,7 @@ const StoryWorkflow = ({ data, onUpdate, entities, onNavigateToEntity })=>{
});
}
};
const handleMouseUp = ()=>{
const handleMouseUp = (e)=>{
if (rafRef.current) {
cancelAnimationFrame(rafRef.current);
rafRef.current = null;
@@ -692,6 +697,33 @@ const StoryWorkflow = ({ data, onUpdate, entities, onNavigateToEntity })=>{
...data,
nodes: internalNodesRef.current
});
// Hit-test: if connecting, check if mouse is over any node
if (connectingNodeId && containerRef.current) {
const rect = containerRef.current.getBoundingClientRect();
const scrollLeft = containerRef.current.scrollLeft;
const scrollTop = containerRef.current.scrollTop;
const mx = e.clientX - rect.left + scrollLeft;
const my = e.clientY - rect.top + scrollTop;
const targetNode = internalNodesRef.current.find((n)=>n.id !== connectingNodeId && mx >= n.x && mx <= n.x + CARD_WIDTH && my >= n.y && my <= n.y + CARD_HEIGHT);
if (targetNode) {
const exists = data.connections.some((c)=>c.source === connectingNodeId && c.target === targetNode.id);
if (!exists) {
const newConn = {
id: `conn-${Date.now()}`,
source: connectingNodeId,
target: targetNode.id
};
onUpdate({
...data,
nodes: internalNodesRef.current,
connections: [
...data.connections,
newConn
]
});
}
}
}
setIsDragging(false);
setIsPanning(false);
setConnectingNodeId(null);
@@ -796,36 +828,36 @@ const StoryWorkflow = ({ data, onUpdate, entities, onNavigateToEntity })=>{
size: 14
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 575,
columnNumber: 17
lineNumber: 616,
columnNumber: 25
}, ("TURBOPACK compile-time value", void 0)),
" AJOUTER NŒUD"
]
}, void 0, true, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 574,
columnNumber: 13
lineNumber: 615,
columnNumber: 21
}, ("TURBOPACK compile-time value", void 0)),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "w-px h-6 bg-slate-100 mx-2"
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 577,
columnNumber: 13
lineNumber: 618,
columnNumber: 21
}, ("TURBOPACK compile-time value", void 0)),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "text-[10px] uppercase font-bold text-slate-400 tracking-wider",
children: selectedNodeIds.size > 0 ? `${selectedNodeIds.size} SÉLECTIONNÉ(S)` : 'Double-cliquez sur le canvas pour créer'
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 578,
columnNumber: 13
lineNumber: 619,
columnNumber: 21
}, ("TURBOPACK compile-time value", void 0))
]
}, void 0, true, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 573,
columnNumber: 9
lineNumber: 614,
columnNumber: 17
}, ("TURBOPACK compile-time value", void 0)),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "flex items-center gap-2",
@@ -838,24 +870,24 @@ const StoryWorkflow = ({ data, onUpdate, entities, onNavigateToEntity })=>{
size: 16
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 584,
columnNumber: 17
lineNumber: 625,
columnNumber: 25
}, ("TURBOPACK compile-time value", void 0))
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 583,
columnNumber: 13
lineNumber: 624,
columnNumber: 21
}, ("TURBOPACK compile-time value", void 0))
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 582,
columnNumber: 9
lineNumber: 623,
columnNumber: 17
}, ("TURBOPACK compile-time value", void 0))
]
}, void 0, true, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 572,
columnNumber: 7
lineNumber: 613,
columnNumber: 13
}, ("TURBOPACK compile-time value", void 0)),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
ref: containerRef,
@@ -890,8 +922,8 @@ const StoryWorkflow = ({ data, onUpdate, entities, onNavigateToEntity })=>{
markerEnd: "url(#arrowhead)"
}, conn.id, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 611,
columnNumber: 21
lineNumber: 652,
columnNumber: 29
}, ("TURBOPACK compile-time value", void 0));
}),
connectingNodeId && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("line", {
@@ -905,8 +937,8 @@ const StoryWorkflow = ({ data, onUpdate, entities, onNavigateToEntity })=>{
markerEnd: "url(#arrowhead-blue)"
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 615,
columnNumber: 17
lineNumber: 656,
columnNumber: 25
}, ("TURBOPACK compile-time value", void 0)),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("defs", {
children: [
@@ -922,13 +954,13 @@ const StoryWorkflow = ({ data, onUpdate, entities, onNavigateToEntity })=>{
fill: "#cbd5e1"
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 624,
columnNumber: 21
lineNumber: 665,
columnNumber: 29
}, ("TURBOPACK compile-time value", void 0))
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 623,
columnNumber: 17
lineNumber: 664,
columnNumber: 25
}, ("TURBOPACK compile-time value", void 0)),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("marker", {
id: "arrowhead-blue",
@@ -942,30 +974,31 @@ const StoryWorkflow = ({ data, onUpdate, entities, onNavigateToEntity })=>{
fill: "#6366f1"
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 627,
columnNumber: 21
lineNumber: 668,
columnNumber: 29
}, ("TURBOPACK compile-time value", void 0))
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 626,
columnNumber: 17
lineNumber: 667,
columnNumber: 25
}, ("TURBOPACK compile-time value", void 0))
]
}, void 0, true, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 622,
columnNumber: 13
lineNumber: 663,
columnNumber: 21
}, ("TURBOPACK compile-time value", void 0))
]
}, void 0, true, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 601,
columnNumber: 9
lineNumber: 642,
columnNumber: 17
}, ("TURBOPACK compile-time value", void 0)),
internalNodes.map((node)=>/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])(StoryNode, {
node: node,
isSelected: selectedNodeIds.has(node.id),
isEditing: editingNodeId === node.id,
isDragging: isDragging,
activeColorPickerId: activeColorPickerId,
entities: entities,
savedColors: savedColors,
@@ -982,14 +1015,14 @@ const StoryWorkflow = ({ data, onUpdate, entities, onNavigateToEntity })=>{
onKeyDownInInput: handleKeyDownInInput
}, node.id, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 633,
columnNumber: 13
lineNumber: 674,
columnNumber: 21
}, ("TURBOPACK compile-time value", void 0)))
]
}, void 0, true, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 589,
columnNumber: 7
lineNumber: 630,
columnNumber: 13
}, ("TURBOPACK compile-time value", void 0)),
activeSuggestion && /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "fixed z-50 bg-white rounded-xl shadow-2xl border border-indigo-100 w-64 max-h-48 overflow-y-auto",
@@ -1007,8 +1040,8 @@ const StoryWorkflow = ({ data, onUpdate, entities, onNavigateToEntity })=>{
]
}, void 0, true, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 658,
columnNumber: 15
lineNumber: 700,
columnNumber: 21
}, ("TURBOPACK compile-time value", void 0)),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "divide-y divide-slate-50",
@@ -1018,32 +1051,32 @@ const StoryWorkflow = ({ data, onUpdate, entities, onNavigateToEntity })=>{
children: ent.name
}, ent.id, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 664,
columnNumber: 27
lineNumber: 706,
columnNumber: 33
}, ("TURBOPACK compile-time value", void 0))) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2d$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "p-4 text-xs text-slate-400 italic text-center",
children: "Aucun résultat"
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 673,
columnNumber: 23
lineNumber: 715,
columnNumber: 29
}, ("TURBOPACK compile-time value", void 0))
}, void 0, false, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 661,
columnNumber: 15
lineNumber: 703,
columnNumber: 21
}, ("TURBOPACK compile-time value", void 0))
]
}, void 0, true, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 657,
columnNumber: 11
lineNumber: 699,
columnNumber: 17
}, ("TURBOPACK compile-time value", void 0))
]
}, void 0, true, {
fileName: "[project]/Documents/00 - projet/plumeia/src/components/StoryWorkflow.tsx",
lineNumber: 571,
columnNumber: 5
lineNumber: 612,
columnNumber: 9
}, ("TURBOPACK compile-time value", void 0));
};
const __TURBOPACK__default__export__ = StoryWorkflow;

File diff suppressed because one or more lines are too long

View File

@@ -303,12 +303,22 @@ const useProjects = (user)=>{
...data
} : p));
try {
// Persist project fields
const payload = {};
if (data.title !== undefined) payload.title = data.title;
if (data.author !== undefined) payload.author = data.author;
if (data.settings !== undefined) payload.settings = data.settings;
if (data.styleGuide !== undefined) payload.styleGuide = data.styleGuide;
await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$api$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"].projects.update(id, payload);
if (Object.keys(payload).length > 0) {
await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$api$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"].projects.update(id, payload);
}
// Persist workflow (nodes + connections) separately
if (data.workflow) {
await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$api$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"].projects.syncWorkflow(id, {
nodes: data.workflow.nodes || [],
connections: data.workflow.connections || []
});
}
} catch (err) {
console.error("Failed to update project", err);
}

File diff suppressed because one or more lines are too long

View File

@@ -334,12 +334,22 @@ const useProjects = (user)=>{
...data
} : p));
try {
// Persist project fields
const payload = {};
if (data.title !== undefined) payload.title = data.title;
if (data.author !== undefined) payload.author = data.author;
if (data.settings !== undefined) payload.settings = data.settings;
if (data.styleGuide !== undefined) payload.styleGuide = data.styleGuide;
await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$api$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"].projects.update(id, payload);
if (Object.keys(payload).length > 0) {
await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$api$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"].projects.update(id, payload);
}
// Persist workflow (nodes + connections) separately
if (data.workflow) {
await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$api$2e$ts__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["default"].projects.syncWorkflow(id, {
nodes: data.workflow.nodes || [],
connections: data.workflow.connections || []
});
}
} catch (err) {
console.error("Failed to update project", err);
}

File diff suppressed because one or more lines are too long

View File

@@ -76,6 +76,12 @@ const api = {
return api.request(`/projects/${id}`, {
method: 'DELETE'
});
},
async syncWorkflow (id, data) {
return api.request(`/projects/${id}/workflow`, {
method: 'PUT',
body: JSON.stringify(data)
});
}
},
// --- CHAPTERS ---

File diff suppressed because one or more lines are too long