Adapt FolderData interface to simplified model

This commit is contained in:
omaroughriss 2025-10-23 16:33:40 +02:00
parent 48d3dbe21b
commit a03cf5c8ed

View File

@ -47,8 +47,7 @@ import {
Archive,
FileCheck,
} from "lucide-react"
import ProcessesViewer from "@/components/4nk/ProcessesViewer"
import { FolderData as SDKFolderData, FolderCreated, FolderPrivateFields, setDefaultFolderRoles } from "@/lib/4nk/models/FolderData"
import { FolderData, FolderCreated, FolderPrivateFields, setDefaultFolderRoles } from "@/lib/4nk/models/FolderData"
import MessageBus from "@/lib/4nk/MessageBus"
import { iframeUrl } from "@/app/page"
import UserStore from "@/lib/4nk/UserStore"
@ -206,195 +205,9 @@ export default function FoldersPage() {
const [folders, setFolders] = useState<FolderData[]>([])
const [stats, setStats] = useState({
total: 0,
shared: 0,
private: 0,
thisWeek: 0,
permanent: 0,
temporary: 0,
total: 0
})
const [users] = useState<UserWithRoles[]>([
{
id: "1",
name: "Marie Dubois",
email: "marie.dubois@company.com",
avatar: "MD",
folderRoles: {
"1": { role: "owner", assignedDate: new Date("2024-01-01") },
"4": { role: "editor", assignedDate: new Date("2024-01-05") },
},
spaceRole: "manager",
spaceRoles: {
main: { role: "manager", spaceName: "Espace Principal" },
legal: { role: "admin", spaceName: "Espace Juridique" },
},
},
{
id: "2",
name: "Sophie Laurent",
email: "sophie.laurent@company.com",
avatar: "SL",
folderRoles: {
"2": { role: "owner", assignedDate: new Date("2024-01-02") },
"3": { role: "contributor", assignedDate: new Date("2024-01-10") },
},
spaceRole: "user",
spaceRoles: {
main: { role: "user", spaceName: "Espace Principal" },
analytics: { role: "manager", spaceName: "Espace Analytics" },
},
},
{
id: "3",
name: "Jean Martin",
email: "jean.martin@company.com",
avatar: "JM",
folderRoles: {
"3": { role: "owner", assignedDate: new Date("2024-01-03") },
"2": { role: "viewer", assignedDate: new Date("2024-01-15") },
},
spaceRole: "user",
spaceRoles: {
main: { role: "user", spaceName: "Espace Principal" },
projects: { role: "admin", spaceName: "Espace Projets" },
},
},
{
id: "4",
name: "Pierre Durand",
email: "pierre.durand@company.com",
avatar: "PD",
folderRoles: {
"6": { role: "owner", assignedDate: new Date("2024-01-04") },
"5": { role: "validator", assignedDate: new Date("2024-01-08") },
},
spaceRole: "user",
spaceRoles: {
main: { role: "user", spaceName: "Espace Principal" },
training: { role: "admin", spaceName: "Espace Formation" },
},
},
{
id: "5",
name: "Admin Système",
email: "admin@company.com",
avatar: "AD",
folderRoles: {
"5": { role: "owner", assignedDate: new Date("2024-01-01") },
"1": { role: "validator", assignedDate: new Date("2024-01-01") },
"4": { role: "validator", assignedDate: new Date("2024-01-01") },
},
spaceRole: "admin",
spaceRoles: {
main: { role: "admin", spaceName: "Espace Principal" },
legal: { role: "admin", spaceName: "Espace Juridique" },
analytics: { role: "admin", spaceName: "Espace Analytics" },
projects: { role: "admin", spaceName: "Espace Projets" },
training: { role: "admin", spaceName: "Espace Formation" },
},
},
])
const [roles] = useState<Role[]>([
{
id: "folder-owner",
name: "Propriétaire du dossier",
description: "Contrôle total sur le dossier",
level: "folder",
},
{ id: "folder-editor", name: "Éditeur du dossier", description: "Peut modifier les documents", level: "folder" },
{
id: "folder-validator",
name: "Validateur du dossier",
description: "Peut valider les documents",
level: "folder",
},
{
id: "folder-contributor",
name: "Contributeur du dossier",
description: "Peut ajouter des documents",
level: "folder",
},
{ id: "folder-viewer", name: "Lecteur du dossier", description: "Lecture seule", level: "folder" },
{ id: "space-admin", name: "Administrateur d'espace", description: "Contrôle total sur l'espace", level: "space" },
{
id: "space-manager",
name: "Gestionnaire d'espace",
description: "Gestion des utilisateurs et dossiers",
level: "space",
},
{ id: "space-user", name: "Utilisateur d'espace", description: "Accès standard à l'espace", level: "space" },
{ id: "space-guest", name: "Invité d'espace", description: "Accès limité à l'espace", level: "space" },
{ id: "global-admin", name: "Administrateur global", description: "Accès à tous les espaces", level: "global" },
{ id: "global-manager", name: "Gestionnaire global", description: "Gestion multi-espaces", level: "global" },
])
const colors = [
{ id: "blue", name: "Bleu", class: "text-blue-600 bg-blue-100" },
{ id: "green", name: "Vert", class: "text-green-600 bg-green-100" },
{ id: "purple", name: "Violet", class: "text-purple-600 bg-purple-100" },
{ id: "orange", name: "Orange", class: "text-orange-600 bg-orange-100" },
{ id: "red", name: "Rouge", class: "text-red-600 bg-red-100" },
{ id: "pink", name: "Rose", class: "text-pink-600 bg-pink-100" },
{ id: "yellow", name: "Jaune", class: "text-yellow-600 bg-yellow-100" },
{ id: "gray", name: "Gris", class: "text-gray-600 bg-gray-100" },
]
// 4NK Integration useEffects
useEffect(() => {
const userStore = UserStore.getInstance();
const connected = userStore.isConnected();
const pairingId = userStore.getUserPairingId();
console.log('Initialisation 4NK:', { connected, pairingId });
setIsConnected(connected);
setUserPairingId(pairingId);
}, []);
useEffect(() => {
const handleConnectionFlow = async () => {
if (!isConnected) return;
const userStore = UserStore.getInstance();
const messageBus = MessageBus.getInstance(iframeUrl);
try {
await messageBus.isReady();
let pairingId = userStore.getUserPairingId();
// 1⃣ Créer le pairing si non existant
if (!pairingId) {
console.log("🚀 No pairing found — creating new pairing...");
pairingId = await messageBus.createUserPairing();
console.log("✅ Pairing created:", pairingId);
userStore.pair(pairingId);
setUserPairingId(pairingId);
} else {
console.log("🔗 Already paired with ID:", pairingId);
}
// 2⃣ Charger les processes
const processes = await messageBus.getProcesses();
setProcesses(processes);
setFolderProcesses(processes); // Use same processes for folders
// 3⃣ Charger les myProcesses
const myProcesses = await messageBus.getMyProcesses();
setMyProcesses(myProcesses);
setMyFolderProcesses(myProcesses); // Use same myProcesses for folders
} catch (err) {
console.error("❌ Error during pairing or process loading:", err);
}
};
handleConnectionFlow();
}, [isConnected, iframeUrl]);
// Notification system
const showNotification = (type: "success" | "error" | "info", message: string) => {
setNotification({ type, message })
@ -414,7 +227,7 @@ export default function FoldersPage() {
}
};
// Function to load folders from 4NK processes
// Function to load folders from 4NK processes (adapted to new FolderData model)
const loadFoldersFrom4NK = useCallback(() => {
if (!folderProcesses) return;
@ -427,7 +240,7 @@ export default function FoldersPage() {
if (!myFolderProcesses.includes(processId)) return;
// Check if this process has a folderNumber in pcd_commitment
const latestState = process.states[0]; // -2 because last state is empty
const latestState = process.states[0];
if (!latestState) return;
const folderNumber = latestState.pcd_commitment?.folderNumber;
@ -445,37 +258,14 @@ export default function FoldersPage() {
return; // Skip creating folder until we have private data
}
// Only create folder when we have private data
// Create folder with new simplified model
const folder: FolderData = {
id: parseInt(folderNumber) || Math.floor(Math.random() * 10000),
folderNumber: folderNumber,
name: privateData.name || `Dossier ${folderNumber}`,
description: privateData.description || '',
documentsCount: privateData.documentsCount || 0,
subfoldersCount: privateData.subfoldersCount || 0,
size: privateData.size || '0 MB',
created: new Date(privateData.created || Date.now()),
modified: new Date(privateData.modified || Date.now()),
owner: privateData.owner || 'Propriétaire 4NK',
access: (privateData.access || 'private') as 'shared' | 'private',
members: privateData.members || [],
tags: privateData.tags || [],
color: privateData.color || 'blue',
favorite: privateData.favorite || false,
storageType: (privateData.storageType || 'temporary') as 'temporary' | 'permanent',
status: (privateData.status || 'active') as 'active' | 'archived' | 'pending' | 'completed' | 'validated',
type: privateData.type || 'general',
expectedDocuments: privateData.expectedDocuments || [],
activity: privateData.activity || [],
permissions: privateData.permissions || {
canView: true,
canEdit: true, // User owns this process
canDelete: true, // User owns this process
canInvite: true, // User owns this process
canArchive: true, // User owns this process
canAnalyze: true,
},
temporaryStorageConfig: privateData.temporaryStorageConfig,
documents: privateData.documents || [],
created_at: privateData.created_at || new Date().toISOString(),
updated_at: privateData.updated_at || new Date().toISOString(),
notes: privateData.notes || []
};
folderData.push(folder);
@ -490,31 +280,12 @@ export default function FoldersPage() {
// Update stats
setStats({
total: folderData.length,
shared: folderData.filter((folder) => folder.access === "shared").length,
private: folderData.filter((folder) => folder.access === "private").length,
thisWeek: folderData.filter((folder) => {
const weekAgo = new Date()
weekAgo.setDate(weekAgo.getDate() - 7)
return folder.modified > weekAgo
}).length,
permanent: folderData.filter((folder) => folder.storageType === "permanent").length,
temporary: folderData.filter((folder) => folder.storageType === "temporary").length,
});
} else if (!hasFoldersToLoad) {
setLoadingFolders(false);
setFolders([]);
setStats({
total: 0,
shared: 0,
private: 0,
thisWeek: 0,
permanent: 0,
temporary: 0,
total: folderData.length
});
}
}, [folderProcesses, myFolderProcesses, folderPrivateData, iframeUrl]);
}, [folderProcesses, myFolderProcesses, folderPrivateData, fetchFolderPrivateData]);
// 4NK Integration useEffects
useEffect(() => {
// Load folders from 4NK when folder processes are available
if (folderProcesses && myFolderProcesses.length >= 0) {