diff --git a/app/dashboard/folders/page.tsx b/app/dashboard/folders/page.tsx index 7b0c975..187fc44 100644 --- a/app/dashboard/folders/page.tsx +++ b/app/dashboard/folders/page.tsx @@ -56,6 +56,8 @@ import Iframe from "@/components/4nk/Iframe" import MessageBus from "@/lib/4nk/MessageBus" import EventBus from "@/lib/4nk/EventBus" import UserStore from "@/lib/4nk/UserStore" +import ProcessesViewer from "@/components/ProcessesViewer" +import { iframeUrl } from "@/app/page" interface FolderData { id: number @@ -110,16 +112,16 @@ interface FolderData { interface ActionModal { type: - | "invite" - | "delete" - | "create" - | "edit" - | "archive" - | "request_document" - | "storage_config" - | "certificate" - | "documents_certificates" - | null + | "invite" + | "delete" + | "create" + | "edit" + | "archive" + | "request_document" + | "storage_config" + | "certificate" + | "documents_certificates" + | null folder: FolderData | null folders: FolderData[] } @@ -151,6 +153,8 @@ interface Role { level: "folder" | "space" | "global" } +type FolderType = "contrat" | "projet" | "rapport" | "finance" | "rh" | "marketing"; + export default function FoldersPage() { const router = useRouter() const [viewMode, setViewMode] = useState<'list'>('list') @@ -165,6 +169,9 @@ export default function FoldersPage() { const [currentPath, setCurrentPath] = useState(["Racine"]) const [actionModal, setActionModal] = useState({ type: null, folder: null, folders: [] }) const [showCreateFolderModal, setShowCreateFolderModal] = useState(false) + const [folderType, setFolderType] = useState(null); + const [isModalOpen, setIsModalOpen] = useState(false); + const [menuOpen, setMenuOpen] = useState(false); // 4NK Integration states const [isConnected, setIsConnected] = useState(false) @@ -173,7 +180,6 @@ export default function FoldersPage() { const [myProcesses, setMyProcesses] = useState([]) const [userPairingId, setUserPairingId] = useState(null) const [pairingIdInitialized, setPairingIdInitialized] = useState(false) - const iframeUrl = 'https://dev3.4nkweb.com' // Modal states const [inviteMessage, setInviteMessage] = useState("") @@ -338,9 +344,9 @@ export default function FoldersPage() { const userStore = UserStore.getInstance(); const connected = userStore.isConnected(); const pairingId = userStore.getUserPairingId(); - + console.log('Initialisation 4NK:', { connected, pairingId }); - + setIsConnected(connected); setUserPairingId(pairingId); setPairingIdInitialized(true); @@ -355,7 +361,7 @@ export default function FoldersPage() { }); }); } - }, [isConnected]); + }, [isConnected, iframeUrl]); useEffect(() => { if (isConnected && processes !== null) { @@ -372,11 +378,11 @@ export default function FoldersPage() { useEffect(() => { const handleStorageChange = (e: StorageEvent) => { console.log('Storage change détecté:', e.key, e.newValue ? 'ajouté' : 'supprimé'); - + // Si un token d'accès vient d'être ajouté if (e.key === 'accessToken' && e.newValue) { console.log('Token d\'accès détecté, récupération du userPairingId...'); - + // Attendre un peu que les deux tokens soient bien en place setTimeout(() => { const userStore = UserStore.getInstance(); @@ -401,7 +407,7 @@ export default function FoldersPage() { // Écouter les changements de sessionStorage window.addEventListener('storage', handleStorageChange); - + // Vérification initiale au chargement const userStore = UserStore.getInstance(); if (userStore.isConnected()) { @@ -708,7 +714,7 @@ export default function FoldersPage() { } loadFolders() - }, []) + }, []); // Notification system const showNotification = (type: "success" | "error" | "info", message: string) => { @@ -727,14 +733,15 @@ export default function FoldersPage() { setProcesses(null); setMyProcesses([]); setUserPairingId(null); - + // Émettre un événement pour vider les messages locaux EventBus.getInstance().emit('CLEAR_CONSOLE'); - + showNotification("info", "Déconnexion réussie"); }, []); const handleAuthConnect = useCallback(() => { + setIsConnected(true); setShowAuthModal(false); console.log('Auth Connect - Connexion établie, le useEffect se chargera de récupérer le userPairingId'); showNotification("success", "Connexion 4NK réussie"); @@ -752,7 +759,7 @@ export default function FoldersPage() { userStoreConnected: UserStore.getInstance().isConnected(), userStorePairingId: UserStore.getInstance().getUserPairingId() }); - + // D'abord essayer de synchroniser depuis UserStore const userStorePairingId = UserStore.getInstance().getUserPairingId(); if (userStorePairingId) { @@ -761,7 +768,7 @@ export default function FoldersPage() { showNotification("success", `UserPairingId synchronisé: ${userStorePairingId.substring(0, 8)}...`); return; } - + // Sinon récupérer depuis MessageBus if (isConnected) { const messageBus = MessageBus.getInstance(iframeUrl); @@ -867,42 +874,42 @@ export default function FoldersPage() { () => { const analysisResults = [ `📊 **Analyse du dossier "${folder.name}"**\n\n` + - `**Contenu :** ${folder.documentsCount} documents analysés (${folder.size})\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` + - `**Recommandations :**\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` + - `• 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`, + `**Contenu :** ${folder.documentsCount} documents analysés (${folder.size})\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` + + `**Recommandations :**\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` + + `• 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`, `🔍 **Analyse approfondie du dossier "${folder.name}"**\n\n` + - `**Structure documentaire :**\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 annexes\n\n` + - `**Analyse temporelle :**\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` + - `• Tendance : ${Math.random() > 0.5 ? "Croissante" : "Stable"}\n\n` + - `**Recommandations stratégiques :**\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` + - `• Prochaine révision recommandée : ${new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toLocaleDateString("fr-FR")}`, + `**Structure documentaire :**\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 annexes\n\n` + + `**Analyse temporelle :**\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` + + `• Tendance : ${Math.random() > 0.5 ? "Croissante" : "Stable"}\n\n` + + `**Recommandations stratégiques :**\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` + + `• Prochaine révision recommandée : ${new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toLocaleDateString("fr-FR")}`, `🎯 **Insights IA pour "${folder.name}"**\n\n` + - `**Analyse sémantique :**\n` + - `• Cohérence thématique : ${Math.floor(Math.random() * 20) + 80}%\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` + - `**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 ? "Collaboration inter-équipes active" : "Usage principalement individuel"}\n` + - `• ${folder.storageType === "permanent" ? "Archivage conforme aux bonnes pratiques" : "Optimisation de stockage possible"}\n\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 ? "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")}`, + `**Analyse sémantique :**\n` + + `• Cohérence thématique : ${Math.floor(Math.random() * 20) + 80}%\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` + + `**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 ? "Collaboration inter-équipes active" : "Usage principalement individuel"}\n` + + `• ${folder.storageType === "permanent" ? "Archivage conforme aux bonnes pratiques" : "Optimisation de stockage possible"}\n\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 ? "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")}`, ] const randomAnalysis = analysisResults[Math.floor(Math.random() * analysisResults.length)] @@ -960,52 +967,65 @@ export default function FoldersPage() { setActionModal({ type: "delete", folder, folders: [] }) } - const handleCreateFolder = () => { - setShowCreateFolderModal(true) - } + const handleOpenModal = (type: FolderType) => { + setFolderType(type); + setIsModalOpen(true); + setMenuOpen(false); + }; - const handleSaveNewFolder = useCallback((folderData: SDKFolderData) => { - console.log('Debug - handleSaveNewFolder:', { - isConnected, - userPairingId, - userPairingIdType: typeof userPairingId, - userStoreConnected: UserStore.getInstance().isConnected(), - userStorePairingId: UserStore.getInstance().getUserPairingId() - }); + const handleCloseModal = () => { + setIsModalOpen(false); + setFolderType(null); + }; + + const handleSaveNewFolder = useCallback( + (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 folderPrivateFields = FolderPrivateFields; - - MessageBus.getInstance(iframeUrl).createFolder(folderData, folderPrivateFields, roles).then((_folderCreated: FolderCreated) => { - MessageBus.getInstance(iframeUrl).notifyProcessUpdate(_folderCreated.processId, _folderCreated.process.states[0].state_id).then(() => { - MessageBus.getInstance(iframeUrl).validateState(_folderCreated.processId, _folderCreated.process.states[0].state_id).then((_updatedProcess: any) => { - MessageBus.getInstance(iframeUrl).getProcesses().then((processes: any) => { - setProcesses(processes); - }); - }); + + MessageBus.getInstance(iframeUrl) + .createFolder(folderToCreate, folderPrivateFields, roles) + .then((_folderCreated: FolderCreated) => { + const firstStateId = _folderCreated.process.states[0].state_id; + 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) => { - console.error('Erreur lors de la création du dossier 4NK:', error); - showNotification("error", "Erreur lors de la création du dossier"); - }); - - setShowCreateFolderModal(false); - 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) - } + .catch((error) => { + console.error('Erreur lors de la création du dossier 4NK:', error); + showNotification("error", "Erreur lors de la création du dossier"); + }); + }, + [userPairingId, isConnected, iframeUrl, folderType] + ); const handleToggleFavorite = (folderId: number) => { const folder = folders.find((f) => f.id === folderId) @@ -1233,10 +1253,10 @@ export default function FoldersPage() { prev.map((f) => folderIds.includes(f.id) ? { - ...f, - storageType: "permanent" as const, - modified: new Date(), - } + ...f, + storageType: "permanent" as const, + modified: new Date(), + } : f, ), ) @@ -1451,13 +1471,12 @@ export default function FoldersPage() { {/* Notification */} {notification && (
{notification.type === "success" && } {notification.type === "error" && } @@ -1474,7 +1493,7 @@ export default function FoldersPage() {

Dossiers

- @@ -1495,23 +1514,45 @@ export default function FoldersPage() { Importer + {isConnected ? ( - <> - +
+ {/* Nouveau dossier avec menu */} +
+ + + {menuOpen && ( +
+ {['contrat', 'projet', 'rapport', 'finance', 'rh', 'marketing'].map((type) => ( + + ))} +
+ )} +
+ + {/* Déconnexion */} + + {/* Debug PairingId */} {!userPairingId && ( )} - +
) : (
- {/* Vue grille supprimée: forcer la vue liste uniquement */}
@@ -1771,7 +1811,7 @@ export default function FoldersPage() { )} {/* Folders List/Grid */} - + {/* {viewMode === "list" ? (
@@ -1847,9 +1887,8 @@ export default function FoldersPage() { {filteredFolders.map((folder) => (
handleOpenFolder(folder)} >
e.stopPropagation()}> @@ -1948,7 +1987,7 @@ export default function FoldersPage() {
- {/* Recent Activity */} + Recent Activity

Activité récente

@@ -1976,13 +2015,25 @@ export default function FoldersPage() { ? "Essayez de modifier vos critères de recherche" : "Commencez par créer votre premier dossier"}

-
)} + */} + + {/* ProcessesViewer Card */} + + +

Processus Blockchain

+ + {/* Intégration du ProcessesViewer */} +
+ +
+
{/* Modals */} @@ -2548,13 +2599,16 @@ export default function FoldersPage() {
)} - {/* Folder Creation Modal */} - + {/* Modal */} + {folderType && ( + + )} {/* 4NK Authentication Modal */}