Adapt FolderData interface to simplified model
This commit is contained in:
parent
48d3dbe21b
commit
a03cf5c8ed
@ -47,8 +47,7 @@ import {
|
|||||||
Archive,
|
Archive,
|
||||||
FileCheck,
|
FileCheck,
|
||||||
} from "lucide-react"
|
} from "lucide-react"
|
||||||
import ProcessesViewer from "@/components/4nk/ProcessesViewer"
|
import { FolderData, FolderCreated, FolderPrivateFields, setDefaultFolderRoles } from "@/lib/4nk/models/FolderData"
|
||||||
import { FolderData as SDKFolderData, FolderCreated, FolderPrivateFields, setDefaultFolderRoles } from "@/lib/4nk/models/FolderData"
|
|
||||||
import MessageBus from "@/lib/4nk/MessageBus"
|
import MessageBus from "@/lib/4nk/MessageBus"
|
||||||
import { iframeUrl } from "@/app/page"
|
import { iframeUrl } from "@/app/page"
|
||||||
import UserStore from "@/lib/4nk/UserStore"
|
import UserStore from "@/lib/4nk/UserStore"
|
||||||
@ -206,195 +205,9 @@ export default function FoldersPage() {
|
|||||||
|
|
||||||
const [folders, setFolders] = useState<FolderData[]>([])
|
const [folders, setFolders] = useState<FolderData[]>([])
|
||||||
const [stats, setStats] = useState({
|
const [stats, setStats] = useState({
|
||||||
total: 0,
|
total: 0
|
||||||
shared: 0,
|
|
||||||
private: 0,
|
|
||||||
thisWeek: 0,
|
|
||||||
permanent: 0,
|
|
||||||
temporary: 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
|
// Notification system
|
||||||
const showNotification = (type: "success" | "error" | "info", message: string) => {
|
const showNotification = (type: "success" | "error" | "info", message: string) => {
|
||||||
setNotification({ type, message })
|
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(() => {
|
const loadFoldersFrom4NK = useCallback(() => {
|
||||||
if (!folderProcesses) return;
|
if (!folderProcesses) return;
|
||||||
|
|
||||||
@ -427,7 +240,7 @@ export default function FoldersPage() {
|
|||||||
if (!myFolderProcesses.includes(processId)) return;
|
if (!myFolderProcesses.includes(processId)) return;
|
||||||
|
|
||||||
// Check if this process has a folderNumber in pcd_commitment
|
// 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;
|
if (!latestState) return;
|
||||||
|
|
||||||
const folderNumber = latestState.pcd_commitment?.folderNumber;
|
const folderNumber = latestState.pcd_commitment?.folderNumber;
|
||||||
@ -445,37 +258,14 @@ export default function FoldersPage() {
|
|||||||
return; // Skip creating folder until we have private data
|
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 = {
|
const folder: FolderData = {
|
||||||
id: parseInt(folderNumber) || Math.floor(Math.random() * 10000),
|
folderNumber: folderNumber,
|
||||||
name: privateData.name || `Dossier ${folderNumber}`,
|
name: privateData.name || `Dossier ${folderNumber}`,
|
||||||
description: privateData.description || '',
|
description: privateData.description || '',
|
||||||
documentsCount: privateData.documentsCount || 0,
|
created_at: privateData.created_at || new Date().toISOString(),
|
||||||
subfoldersCount: privateData.subfoldersCount || 0,
|
updated_at: privateData.updated_at || new Date().toISOString(),
|
||||||
size: privateData.size || '0 MB',
|
notes: privateData.notes || []
|
||||||
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 || [],
|
|
||||||
};
|
};
|
||||||
|
|
||||||
folderData.push(folder);
|
folderData.push(folder);
|
||||||
@ -490,31 +280,12 @@ export default function FoldersPage() {
|
|||||||
|
|
||||||
// Update stats
|
// Update stats
|
||||||
setStats({
|
setStats({
|
||||||
total: folderData.length,
|
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,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, [folderProcesses, myFolderProcesses, folderPrivateData, iframeUrl]);
|
}, [folderProcesses, myFolderProcesses, folderPrivateData, fetchFolderPrivateData]);
|
||||||
|
|
||||||
|
// 4NK Integration useEffects
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// Load folders from 4NK when folder processes are available
|
// Load folders from 4NK when folder processes are available
|
||||||
if (folderProcesses && myFolderProcesses.length >= 0) {
|
if (folderProcesses && myFolderProcesses.length >= 0) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user