Adapt FolderData interface to simplified model
This commit is contained in:
parent
48d3dbe21b
commit
a03cf5c8ed
@ -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) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user