Added type in CreateFolder function

This commit is contained in:
Sadrinho27 2025-10-02 23:25:14 +02:00
parent 741ad90b00
commit d88697f282

View File

@ -56,6 +56,8 @@ import Iframe from "@/components/4nk/Iframe"
import MessageBus from "@/lib/4nk/MessageBus" import MessageBus from "@/lib/4nk/MessageBus"
import EventBus from "@/lib/4nk/EventBus" import EventBus from "@/lib/4nk/EventBus"
import UserStore from "@/lib/4nk/UserStore" import UserStore from "@/lib/4nk/UserStore"
import ProcessesViewer from "@/components/ProcessesViewer"
import { iframeUrl } from "@/app/page"
interface FolderData { interface FolderData {
id: number id: number
@ -110,16 +112,16 @@ interface FolderData {
interface ActionModal { interface ActionModal {
type: type:
| "invite" | "invite"
| "delete" | "delete"
| "create" | "create"
| "edit" | "edit"
| "archive" | "archive"
| "request_document" | "request_document"
| "storage_config" | "storage_config"
| "certificate" | "certificate"
| "documents_certificates" | "documents_certificates"
| null | null
folder: FolderData | null folder: FolderData | null
folders: FolderData[] folders: FolderData[]
} }
@ -151,6 +153,8 @@ interface Role {
level: "folder" | "space" | "global" level: "folder" | "space" | "global"
} }
type FolderType = "contrat" | "projet" | "rapport" | "finance" | "rh" | "marketing";
export default function FoldersPage() { export default function FoldersPage() {
const router = useRouter() const router = useRouter()
const [viewMode, setViewMode] = useState<'list'>('list') const [viewMode, setViewMode] = useState<'list'>('list')
@ -165,6 +169,9 @@ export default function FoldersPage() {
const [currentPath, setCurrentPath] = useState<string[]>(["Racine"]) const [currentPath, setCurrentPath] = useState<string[]>(["Racine"])
const [actionModal, setActionModal] = useState<ActionModal>({ type: null, folder: null, folders: [] }) const [actionModal, setActionModal] = useState<ActionModal>({ type: null, folder: null, folders: [] })
const [showCreateFolderModal, setShowCreateFolderModal] = useState(false) const [showCreateFolderModal, setShowCreateFolderModal] = useState(false)
const [folderType, setFolderType] = useState<FolderType | null>(null);
const [isModalOpen, setIsModalOpen] = useState(false);
const [menuOpen, setMenuOpen] = useState(false);
// 4NK Integration states // 4NK Integration states
const [isConnected, setIsConnected] = useState(false) const [isConnected, setIsConnected] = useState(false)
@ -173,7 +180,6 @@ export default function FoldersPage() {
const [myProcesses, setMyProcesses] = useState<string[]>([]) const [myProcesses, setMyProcesses] = useState<string[]>([])
const [userPairingId, setUserPairingId] = useState<string | null>(null) const [userPairingId, setUserPairingId] = useState<string | null>(null)
const [pairingIdInitialized, setPairingIdInitialized] = useState(false) const [pairingIdInitialized, setPairingIdInitialized] = useState(false)
const iframeUrl = 'https://dev3.4nkweb.com'
// Modal states // Modal states
const [inviteMessage, setInviteMessage] = useState("") const [inviteMessage, setInviteMessage] = useState("")
@ -338,9 +344,9 @@ export default function FoldersPage() {
const userStore = UserStore.getInstance(); const userStore = UserStore.getInstance();
const connected = userStore.isConnected(); const connected = userStore.isConnected();
const pairingId = userStore.getUserPairingId(); const pairingId = userStore.getUserPairingId();
console.log('Initialisation 4NK:', { connected, pairingId }); console.log('Initialisation 4NK:', { connected, pairingId });
setIsConnected(connected); setIsConnected(connected);
setUserPairingId(pairingId); setUserPairingId(pairingId);
setPairingIdInitialized(true); setPairingIdInitialized(true);
@ -355,7 +361,7 @@ export default function FoldersPage() {
}); });
}); });
} }
}, [isConnected]); }, [isConnected, iframeUrl]);
useEffect(() => { useEffect(() => {
if (isConnected && processes !== null) { if (isConnected && processes !== null) {
@ -372,11 +378,11 @@ export default function FoldersPage() {
useEffect(() => { useEffect(() => {
const handleStorageChange = (e: StorageEvent) => { const handleStorageChange = (e: StorageEvent) => {
console.log('Storage change détecté:', e.key, e.newValue ? 'ajouté' : 'supprimé'); console.log('Storage change détecté:', e.key, e.newValue ? 'ajouté' : 'supprimé');
// Si un token d'accès vient d'être ajouté // Si un token d'accès vient d'être ajouté
if (e.key === 'accessToken' && e.newValue) { if (e.key === 'accessToken' && e.newValue) {
console.log('Token d\'accès détecté, récupération du userPairingId...'); console.log('Token d\'accès détecté, récupération du userPairingId...');
// Attendre un peu que les deux tokens soient bien en place // Attendre un peu que les deux tokens soient bien en place
setTimeout(() => { setTimeout(() => {
const userStore = UserStore.getInstance(); const userStore = UserStore.getInstance();
@ -401,7 +407,7 @@ export default function FoldersPage() {
// Écouter les changements de sessionStorage // Écouter les changements de sessionStorage
window.addEventListener('storage', handleStorageChange); window.addEventListener('storage', handleStorageChange);
// Vérification initiale au chargement // Vérification initiale au chargement
const userStore = UserStore.getInstance(); const userStore = UserStore.getInstance();
if (userStore.isConnected()) { if (userStore.isConnected()) {
@ -708,7 +714,7 @@ export default function FoldersPage() {
} }
loadFolders() loadFolders()
}, []) }, []);
// Notification system // Notification system
const showNotification = (type: "success" | "error" | "info", message: string) => { const showNotification = (type: "success" | "error" | "info", message: string) => {
@ -727,14 +733,15 @@ export default function FoldersPage() {
setProcesses(null); setProcesses(null);
setMyProcesses([]); setMyProcesses([]);
setUserPairingId(null); setUserPairingId(null);
// Émettre un événement pour vider les messages locaux // Émettre un événement pour vider les messages locaux
EventBus.getInstance().emit('CLEAR_CONSOLE'); EventBus.getInstance().emit('CLEAR_CONSOLE');
showNotification("info", "Déconnexion réussie"); showNotification("info", "Déconnexion réussie");
}, []); }, []);
const handleAuthConnect = useCallback(() => { const handleAuthConnect = useCallback(() => {
setIsConnected(true);
setShowAuthModal(false); setShowAuthModal(false);
console.log('Auth Connect - Connexion établie, le useEffect se chargera de récupérer le userPairingId'); console.log('Auth Connect - Connexion établie, le useEffect se chargera de récupérer le userPairingId');
showNotification("success", "Connexion 4NK réussie"); showNotification("success", "Connexion 4NK réussie");
@ -752,7 +759,7 @@ export default function FoldersPage() {
userStoreConnected: UserStore.getInstance().isConnected(), userStoreConnected: UserStore.getInstance().isConnected(),
userStorePairingId: UserStore.getInstance().getUserPairingId() userStorePairingId: UserStore.getInstance().getUserPairingId()
}); });
// D'abord essayer de synchroniser depuis UserStore // D'abord essayer de synchroniser depuis UserStore
const userStorePairingId = UserStore.getInstance().getUserPairingId(); const userStorePairingId = UserStore.getInstance().getUserPairingId();
if (userStorePairingId) { if (userStorePairingId) {
@ -761,7 +768,7 @@ export default function FoldersPage() {
showNotification("success", `UserPairingId synchronisé: ${userStorePairingId.substring(0, 8)}...`); showNotification("success", `UserPairingId synchronisé: ${userStorePairingId.substring(0, 8)}...`);
return; return;
} }
// Sinon récupérer depuis MessageBus // Sinon récupérer depuis MessageBus
if (isConnected) { if (isConnected) {
const messageBus = MessageBus.getInstance(iframeUrl); const messageBus = MessageBus.getInstance(iframeUrl);
@ -867,42 +874,42 @@ export default function FoldersPage() {
() => { () => {
const analysisResults = [ const analysisResults = [
`📊 **Analyse du dossier "${folder.name}"**\n\n` + `📊 **Analyse du dossier "${folder.name}"**\n\n` +
`**Contenu :** ${folder.documentsCount} documents analysés (${folder.size})\n` + `**Contenu :** ${folder.documentsCount} documents analysés (${folder.size})\n` +
`**Thématiques principales :** ${folder.tags.join(", ")}\n` + `**Thématiques principales :** ${folder.tags.join(", ")}\n` +
`**Niveau d'activité :** ${folder.activity.length > 2 ? "Élevé" : "Modéré"} (dernière modification ${formatDate(folder.modified)})\n\n` + `**Niveau d'activité :** ${folder.activity.length > 2 ? "Élevé" : "Modéré"} (dernière modification ${formatDate(folder.modified)})\n\n` +
`**Recommandations :**\n` + `**Recommandations :**\n` +
`${folder.storageType === "temporary" ? "Considérer l'archivage vers le stockage permanent" : "Dossier déjà archivé de manière optimale"}\n` + `${folder.storageType === "temporary" ? "Considérer l'archivage vers le stockage permanent" : "Dossier déjà archivé de manière optimale"}\n` +
`${folder.access === "private" ? "Évaluer les possibilités de partage avec l'équipe" : "Partage actuel avec " + folder.members.length + " membre(s)"}\n` + `${folder.access === "private" ? "Évaluer les possibilités de partage avec l'équipe" : "Partage actuel avec " + folder.members.length + " membre(s)"}\n` +
`• Dernière activité significative détectée il y a ${Math.floor(Math.random() * 7) + 1} jour(s)\n\n` + `• Dernière activité significative détectée il y a ${Math.floor(Math.random() * 7) + 1} jour(s)\n\n` +
`**Score de pertinence :** ${Math.floor(Math.random() * 30) + 70}/100`, `**Score de pertinence :** ${Math.floor(Math.random() * 30) + 70}/100`,
`🔍 **Analyse approfondie du dossier "${folder.name}"**\n\n` + `🔍 **Analyse approfondie du dossier "${folder.name}"**\n\n` +
`**Structure documentaire :**\n` + `**Structure documentaire :**\n` +
`${Math.floor(folder.documentsCount * 0.4)} documents principaux\n` + `${Math.floor(folder.documentsCount * 0.4)} documents principaux\n` +
`${Math.floor(folder.documentsCount * 0.3)} documents de support\n` + `${Math.floor(folder.documentsCount * 0.3)} documents de support\n` +
`${Math.floor(folder.documentsCount * 0.3)} documents annexes\n\n` + `${Math.floor(folder.documentsCount * 0.3)} documents annexes\n\n` +
`**Analyse temporelle :**\n` + `**Analyse temporelle :**\n` +
`• Création : ${folder.created.toLocaleDateString("fr-FR")}\n` + `• Création : ${folder.created.toLocaleDateString("fr-FR")}\n` +
`• Pic d'activité détecté en ${new Date().toLocaleDateString("fr-FR", { month: "long", year: "numeric" })}\n` + `• Pic d'activité détecté en ${new Date().toLocaleDateString("fr-FR", { month: "long", year: "numeric" })}\n` +
`• Tendance : ${Math.random() > 0.5 ? "Croissante" : "Stable"}\n\n` + `• Tendance : ${Math.random() > 0.5 ? "Croissante" : "Stable"}\n\n` +
`**Recommandations stratégiques :**\n` + `**Recommandations stratégiques :**\n` +
`${folder.documentsCount > 50 ? "Envisager une réorganisation en sous-dossiers" : "Structure actuelle optimale"}\n` + `${folder.documentsCount > 50 ? "Envisager une réorganisation en sous-dossiers" : "Structure actuelle optimale"}\n` +
`${folder.members.length < 3 ? "Potentiel de collaboration à explorer" : "Équipe collaborative active"}\n` + `${folder.members.length < 3 ? "Potentiel de collaboration à explorer" : "Équipe collaborative active"}\n` +
`• Prochaine révision recommandée : ${new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toLocaleDateString("fr-FR")}`, `• Prochaine révision recommandée : ${new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toLocaleDateString("fr-FR")}`,
`🎯 **Insights IA pour "${folder.name}"**\n\n` + `🎯 **Insights IA pour "${folder.name}"**\n\n` +
`**Analyse sémantique :**\n` + `**Analyse sémantique :**\n` +
`• Cohérence thématique : ${Math.floor(Math.random() * 20) + 80}%\n` + `• Cohérence thématique : ${Math.floor(Math.random() * 20) + 80}%\n` +
`• Mots-clés dominants : ${folder.tags.slice(0, 3).join(", ")}\n` + `• Mots-clés dominants : ${folder.tags.slice(0, 3).join(", ")}\n` +
`• Complexité moyenne : ${["Faible", "Modérée", "Élevée"][Math.floor(Math.random() * 3)]}\n\n` + `• Complexité moyenne : ${["Faible", "Modérée", "Élevée"][Math.floor(Math.random() * 3)]}\n\n` +
`**Patterns détectés :**\n` + `**Patterns détectés :**\n` +
`${Math.random() > 0.5 ? "Cycle de révision régulier identifié" : "Activité sporadique détectée"}\n` + `${Math.random() > 0.5 ? "Cycle de révision régulier identifié" : "Activité sporadique détectée"}\n` +
`${Math.random() > 0.5 ? "Collaboration inter-équipes active" : "Usage principalement individuel"}\n` + `${Math.random() > 0.5 ? "Collaboration inter-équipes active" : "Usage principalement individuel"}\n` +
`${folder.storageType === "permanent" ? "Archivage conforme aux bonnes pratiques" : "Optimisation de stockage possible"}\n\n` + `${folder.storageType === "permanent" ? "Archivage conforme aux bonnes pratiques" : "Optimisation de stockage possible"}\n\n` +
`**Actions suggérées :**\n` + `**Actions suggérées :**\n` +
`${Math.random() > 0.5 ? "Créer un template basé sur ce dossier" : "Standardiser la nomenclature"}\n` + `${Math.random() > 0.5 ? "Créer un template basé sur ce dossier" : "Standardiser la nomenclature"}\n` +
`${Math.random() > 0.5 ? "Planifier une session de nettoyage" : "Maintenir la structure actuelle"}\n` + `${Math.random() > 0.5 ? "Planifier une session de nettoyage" : "Maintenir la structure actuelle"}\n` +
`• Prochaine analyse automatique : ${new Date(Date.now() + 90 * 24 * 60 * 60 * 1000).toLocaleDateString("fr-FR")}`, `• Prochaine analyse automatique : ${new Date(Date.now() + 90 * 24 * 60 * 60 * 1000).toLocaleDateString("fr-FR")}`,
] ]
const randomAnalysis = analysisResults[Math.floor(Math.random() * analysisResults.length)] const randomAnalysis = analysisResults[Math.floor(Math.random() * analysisResults.length)]
@ -960,52 +967,65 @@ export default function FoldersPage() {
setActionModal({ type: "delete", folder, folders: [] }) setActionModal({ type: "delete", folder, folders: [] })
} }
const handleCreateFolder = () => { const handleOpenModal = (type: FolderType) => {
setShowCreateFolderModal(true) setFolderType(type);
} setIsModalOpen(true);
setMenuOpen(false);
};
const handleSaveNewFolder = useCallback((folderData: SDKFolderData) => { const handleCloseModal = () => {
console.log('Debug - handleSaveNewFolder:', { setIsModalOpen(false);
isConnected, setFolderType(null);
userPairingId, };
userPairingIdType: typeof userPairingId,
userStoreConnected: UserStore.getInstance().isConnected(), const handleSaveNewFolder = useCallback(
userStorePairingId: UserStore.getInstance().getUserPairingId() (folderData: SDKFolderData) => {
}); if (!isConnected || !userPairingId) {
console.error('Conditions non remplies:', { isConnected, userPairingId });
showNotification(
"error",
`Vous devez être connecté à 4NK pour créer un dossier (Connected: ${isConnected}, PairingId: ${userPairingId ? 'OK' : 'NULL'})`
);
return;
}
// Ajout du type dans les données du dossier
const folderToCreate = {
...folderData,
type: folderType
};
if (userPairingId !== null && isConnected) {
const roles = setDefaultFolderRoles(userPairingId, [], []); const roles = setDefaultFolderRoles(userPairingId, [], []);
const folderPrivateFields = FolderPrivateFields; const folderPrivateFields = FolderPrivateFields;
MessageBus.getInstance(iframeUrl).createFolder(folderData, folderPrivateFields, roles).then((_folderCreated: FolderCreated) => { MessageBus.getInstance(iframeUrl)
MessageBus.getInstance(iframeUrl).notifyProcessUpdate(_folderCreated.processId, _folderCreated.process.states[0].state_id).then(() => { .createFolder(folderToCreate, folderPrivateFields, roles)
MessageBus.getInstance(iframeUrl).validateState(_folderCreated.processId, _folderCreated.process.states[0].state_id).then((_updatedProcess: any) => { .then((_folderCreated: FolderCreated) => {
MessageBus.getInstance(iframeUrl).getProcesses().then((processes: any) => { const firstStateId = _folderCreated.process.states[0].state_id;
setProcesses(processes); MessageBus.getInstance(iframeUrl)
}); .notifyProcessUpdate(_folderCreated.processId, firstStateId)
}); .then(() =>
MessageBus.getInstance(iframeUrl)
.validateState(_folderCreated.processId, firstStateId)
.then(() =>
MessageBus.getInstance(iframeUrl)
.getProcesses()
.then(async (processes: any) => {
setProcesses(processes)
})
)
);
setShowCreateFolderModal(false);
showNotification("success", `Dossier "${folderData.name}" créé avec succès sur 4NK`);
}) })
}).catch((error) => { .catch((error) => {
console.error('Erreur lors de la création du dossier 4NK:', error); console.error('Erreur lors de la création du dossier 4NK:', error);
showNotification("error", "Erreur lors de la création du dossier"); showNotification("error", "Erreur lors de la création du dossier");
}); });
},
setShowCreateFolderModal(false); [userPairingId, isConnected, iframeUrl, folderType]
showNotification("success", `Dossier "${folderData.name}" créé avec succès sur 4NK`); );
} else {
console.error('Conditions non remplies:', {
userPairingIdCheck: userPairingId !== null,
isConnectedCheck: isConnected,
actualUserPairingId: userPairingId,
actualIsConnected: isConnected
});
showNotification("error", `Vous devez être connecté à 4NK pour créer un dossier (Connected: ${isConnected}, PairingId: ${userPairingId ? 'OK' : 'NULL'})`);
}
}, [userPairingId, isConnected, iframeUrl]);
const handleCancelCreateFolder = () => {
setShowCreateFolderModal(false)
}
const handleToggleFavorite = (folderId: number) => { const handleToggleFavorite = (folderId: number) => {
const folder = folders.find((f) => f.id === folderId) const folder = folders.find((f) => f.id === folderId)
@ -1233,10 +1253,10 @@ export default function FoldersPage() {
prev.map((f) => prev.map((f) =>
folderIds.includes(f.id) folderIds.includes(f.id)
? { ? {
...f, ...f,
storageType: "permanent" as const, storageType: "permanent" as const,
modified: new Date(), modified: new Date(),
} }
: f, : f,
), ),
) )
@ -1451,13 +1471,12 @@ export default function FoldersPage() {
{/* Notification */} {/* Notification */}
{notification && ( {notification && (
<div <div
className={`fixed top-4 right-4 z-50 p-4 rounded-lg shadow-lg flex items-center space-x-2 ${ className={`fixed top-4 right-4 z-50 p-4 rounded-lg shadow-lg flex items-center space-x-2 ${notification.type === "success"
notification.type === "success" ? "bg-green-100 text-green-800 border border-green-200"
? "bg-green-100 text-green-800 border border-green-200" : notification.type === "error"
: notification.type === "error" ? "bg-red-100 text-red-800 border border-red-200"
? "bg-red-100 text-red-800 border border-red-200" : "bg-blue-100 text-blue-800 border border-blue-200"
: "bg-blue-100 text-blue-800 border border-blue-200" }`}
}`}
> >
{notification.type === "success" && <CheckCircle className="h-5 w-5" />} {notification.type === "success" && <CheckCircle className="h-5 w-5" />}
{notification.type === "error" && <XCircle className="h-5 w-5" />} {notification.type === "error" && <XCircle className="h-5 w-5" />}
@ -1474,7 +1493,7 @@ export default function FoldersPage() {
<div> <div>
<div className="flex items-center gap-3"> <div className="flex items-center gap-3">
<h1 className="text-2xl font-bold text-gray-900">Dossiers</h1> <h1 className="text-2xl font-bold text-gray-900">Dossiers</h1>
<Badge <Badge
variant={isConnected ? "default" : "secondary"} variant={isConnected ? "default" : "secondary"}
className={isConnected ? "bg-green-100 text-green-800" : "bg-gray-100 text-gray-600"} className={isConnected ? "bg-green-100 text-green-800" : "bg-gray-100 text-gray-600"}
> >
@ -1495,23 +1514,45 @@ export default function FoldersPage() {
<Upload className="h-4 w-4 mr-2" /> <Upload className="h-4 w-4 mr-2" />
Importer Importer
</Button> </Button>
{isConnected ? ( {isConnected ? (
<> <div className="flex gap-2">
<Button size="sm" onClick={handleCreateFolder}> {/* Nouveau dossier avec menu */}
<FolderPlus className="h-4 w-4 mr-2" /> <div className="relative">
Nouveau dossier <Button size="sm" onClick={() => setMenuOpen(!menuOpen)}>
</Button> <FolderPlus className="h-4 w-4 mr-2" />
Nouveau dossier
</Button>
{menuOpen && (
<div className="absolute mt-1 right-0 w-48 bg-white border border-gray-200 rounded shadow-lg z-50">
{['contrat', 'projet', 'rapport', 'finance', 'rh', 'marketing'].map((type) => (
<button
key={type}
className="w-full text-left px-4 py-2 text-gray-700 hover:bg-gray-100"
onClick={() => handleOpenModal(type as FolderType)}
>
{type.charAt(0).toUpperCase() + type.slice(1)}
</button>
))}
</div>
)}
</div>
{/* Déconnexion */}
<Button variant="outline" size="sm" onClick={handleLogout}> <Button variant="outline" size="sm" onClick={handleLogout}>
<X className="h-4 w-4 mr-2" /> <X className="h-4 w-4 mr-2" />
Déconnexion 4NK Déconnexion 4NK
</Button> </Button>
{/* Debug PairingId */}
{!userPairingId && ( {!userPairingId && (
<Button variant="outline" size="sm" onClick={handleForceGetPairingId}> <Button variant="outline" size="sm" onClick={handleForceGetPairingId}>
<Brain className="h-4 w-4 mr-2" /> <Brain className="h-4 w-4 mr-2" />
Debug PairingId Debug PairingId
</Button> </Button>
)} )}
</> </div>
) : ( ) : (
<Button variant="outline" size="sm" onClick={handleLogin}> <Button variant="outline" size="sm" onClick={handleLogin}>
<Shield className="h-4 w-4 mr-2" /> <Shield className="h-4 w-4 mr-2" />
@ -1581,7 +1622,6 @@ export default function FoldersPage() {
{sortOrder === "asc" ? <SortAsc className="h-4 w-4" /> : <SortDesc className="h-4 w-4" />} {sortOrder === "asc" ? <SortAsc className="h-4 w-4" /> : <SortDesc className="h-4 w-4" />}
</Button> </Button>
</div> </div>
{/* Vue grille supprimée: forcer la vue liste uniquement */} {/* Vue grille supprimée: forcer la vue liste uniquement */}
</div> </div>
</div> </div>
@ -1771,7 +1811,7 @@ export default function FoldersPage() {
)} )}
{/* Folders List/Grid */} {/* Folders List/Grid */}
<Card> {/* <Card>
<CardContent className="p-0"> <CardContent className="p-0">
{viewMode === "list" ? ( {viewMode === "list" ? (
<div className="overflow-x-auto"> <div className="overflow-x-auto">
@ -1847,9 +1887,8 @@ export default function FoldersPage() {
{filteredFolders.map((folder) => ( {filteredFolders.map((folder) => (
<div <div
key={folder.id} key={folder.id}
className={`relative group border rounded-lg p-6 hover:shadow-md transition-shadow cursor-pointer ${ className={`relative group border rounded-lg p-6 hover:shadow-md transition-shadow cursor-pointer ${selectedFolders.includes(folder.id) ? "bg-blue-50 border-blue-200" : "bg-white"
selectedFolders.includes(folder.id) ? "bg-blue-50 border-blue-200" : "bg-white" }`}
}`}
onClick={() => handleOpenFolder(folder)} onClick={() => handleOpenFolder(folder)}
> >
<div className="absolute top-4 left-4" onClick={(e) => e.stopPropagation()}> <div className="absolute top-4 left-4" onClick={(e) => e.stopPropagation()}>
@ -1948,7 +1987,7 @@ export default function FoldersPage() {
</div> </div>
</div> </div>
{/* Recent Activity */} Recent Activity
<div className="mt-4 pt-4 border-t"> <div className="mt-4 pt-4 border-t">
<h4 className="text-xs font-medium text-gray-700 mb-2">Activité récente</h4> <h4 className="text-xs font-medium text-gray-700 mb-2">Activité récente</h4>
<div className="space-y-1"> <div className="space-y-1">
@ -1976,13 +2015,25 @@ export default function FoldersPage() {
? "Essayez de modifier vos critères de recherche" ? "Essayez de modifier vos critères de recherche"
: "Commencez par créer votre premier dossier"} : "Commencez par créer votre premier dossier"}
</p> </p>
<Button onClick={handleCreateFolder}>
<FolderPlus className="h-4 w-4 mr-2" />
Nouveau dossier
</Button>
</div> </div>
)} )}
</CardContent> </CardContent>
</Card> */}
{/* ProcessesViewer Card */}
<Card className="mt-6">
<CardContent className="p-4">
<h3 className="text-lg font-semibold text-gray-900 mb-4">Processus Blockchain</h3>
{/* Intégration du ProcessesViewer */}
<div className="w-full h-[500px]">
<ProcessesViewer
processes={processes}
myProcesses={myProcesses}
onProcessesUpdate={setProcesses}
/>
</div>
</CardContent>
</Card> </Card>
{/* Modals */} {/* Modals */}
@ -2548,13 +2599,16 @@ export default function FoldersPage() {
</div> </div>
)} )}
{/* Folder Creation Modal */} {/* Modal */}
<FolderModal {folderType && (
isOpen={showCreateFolderModal} <FolderModal
onClose={handleCancelCreateFolder} isOpen={isModalOpen}
onSave={handleSaveNewFolder} onClose={handleCloseModal}
onCancel={handleCancelCreateFolder} onSave={handleSaveNewFolder}
/> onCancel={handleCloseModal}
folderType={folderType}
/>
)}
{/* 4NK Authentication Modal */} {/* 4NK Authentication Modal */}
<AuthModal <AuthModal