From 1c8845adf7f80d191f8f15e0646c3198d0db26c5 Mon Sep 17 00:00:00 2001 From: Imer ouijdane Date: Tue, 17 Feb 2026 09:34:20 +0100 Subject: [PATCH] commit v_1 Tutoriel --- .../17.14.1577.30250/CodeChunks.db | Bin 192512 -> 192512 bytes .../17.14.1577.30250/CodeChunks.db-shm | Bin 32768 -> 32768 bytes .../17.14.1577.30250/CodeChunks.db-wal | Bin 123632 -> 123632 bytes .../17.14.1577.30250/SemanticSymbols.db | Bin 61440 -> 61440 bytes .../17.14.1577.30250/SemanticSymbols.db-shm | Bin 32768 -> 32768 bytes .../17.14.1577.30250/SemanticSymbols.db-wal | Bin 148352 -> 148352 bytes .vs/RGC/v17/.wsuo | Bin 19456 -> 21504 bytes .vs/RGC/v17/DocumentLayout.backup.json | 4 + .vs/RGC/v17/DocumentLayout.json | 22 +- .vs/VSWorkspaceState.json | 5 +- .vs/slnx.sqlite | Bin 102400 -> 102400 bytes .../suivireforamteur/src/HistoriquePage.tsx | 311 +++++++++++++++++- 12 files changed, 322 insertions(+), 20 deletions(-) diff --git a/.vs/RGC/CopilotIndices/17.14.1577.30250/CodeChunks.db b/.vs/RGC/CopilotIndices/17.14.1577.30250/CodeChunks.db index 3e14a5a567e50c49e841aebeb8161db1967507d1..a2a3716d60aa7c4d135dbd641454938285eadd34 100644 GIT binary patch delta 332 zcmZp8z}@hGdjp$*SPKLH8vaOrR=$;dKD-}!TY1%aj`5^VmJ_gNY?(MwgFUuUmzAN> zcJfC__sIe}Y?Gs9c$lKqC;Q2{Pu?KIGI`Ejj>(pSE17sWHa`(m;bLQ8V2DSk-W)Bn zjG2u`g+YsveKNa(F%yuoQ8>*S$I@uaGnx4A169omOV9tqlC1__y*u z;J>n2FkmUaFh3KsGNWf+N@_)Fid$w*DklTO820JJwA;{X5v diff --git a/.vs/RGC/CopilotIndices/17.14.1577.30250/CodeChunks.db-wal b/.vs/RGC/CopilotIndices/17.14.1577.30250/CodeChunks.db-wal index cdda5d500215e3af135a29fed66ede696a7f6390..b716260a8e542ce38e373e1e18111e8d844bd056 100644 GIT binary patch delta 926 zcmexxl>Ng|b_?@*wk8JMM-mJS0t_Iaw}^YGgmv_s%1=uj&zWxj2NYrfVttsnn3t^Z zygR#?HwOr8;b*))+4iHKD2jqhmR_yyXB6{*3O4gIF*1TxFd-W~&CV?KMBuJ(n*}Cv z2nfIoUd=zr+Bnj3#%70&sf>(kH}@@C#0QtO&3LP+%~WaxllAS1mUQ>L6yYU-)5xxSwrS&)d%@Hv0o3hl!CH#Vbla zl50Pm{9FmwiDL1``J1-#v`X(q^-2~q3)5to4RfH5Wk!va}{SY zbM?v3n~-Q>!Ssre(rw?V?+eyL9mIkfEotZH)r_}^sM)k`VGxv=fyh5X(u4O^>%T7+7woM*q{=#KZOf*>0ntb2p-gk&!STX(b v_-*0}$EK}kp$=k2^~;Nw8D<+JZumg`!iwUTSpJ~n3`gJV!L|N#oW%zKB}iOM delta 985 zcmexxl>Ng|b`SG5ZKJm#IStwTYf)LCZH;~dlL8j*lCyf zYT{&piBU|9A14NOZ1z!9;TM3p>+qdfOS(>e<=Wg}z|J@^A%1h;qD6dg*dGdn&3U3~zn?*6gZi*uKpL7gHFS7*=f7 zOG45(<3bJk4XKjgw}Q?@}ovI;dy z-e{~c*!yVf2bd&^dEc65=$1{%Era+(8`CGZic}x>F3;Hxb|yV WY80R7X5R0PHrVkOuJxbeEIt5^2ct3o diff --git a/.vs/RGC/CopilotIndices/17.14.1577.30250/SemanticSymbols.db b/.vs/RGC/CopilotIndices/17.14.1577.30250/SemanticSymbols.db index 92cf262861eafe629f3caacec5dbf844fb52bf7d..4ae7c2d7b53b34ab0b9ff18e4da1f7d64e5a6ca7 100644 GIT binary patch delta 304 zcmZp8z})bFc>|*Y8;=Tu79;y)b_HW5AZ4R)nl+B4(Uxhlp-2QP!&)2W+R2JqikrI> zXK}GGFfhacdG3=1bl4`>ituc1)M;gA`N+WkakF5+bAB;iMrK(im;B_?+|;}hhP7N2 z8ST?htk0swAj0^Jfqx0VCuv{cHCNdvlPT~2?%+9ow$%FA3&mtZN z?(>@s4*X(fV%;&h@t`-zjhkzav~x3yv8zvJzo5;;uD)5&;4>R@YNPJtMnSLwpeOj) s=A7HQ>vqiM{_A{|*Y8v_G_7Gv6Eb_HW59+k;93a2M7h-bE8uAQu?rMS6EaTXU#EK8#; zkmo*GK!mQM`)pEe5yyx)t5bN_WdM%IvT cTe`C*FS-%PHak?IvqfxjfVgQ$HB*6dx delta 88 zcmZo@U}|V!njj%D_XuBTSwZL?*(>#h4fv0M|AoMF0Q* diff --git a/.vs/RGC/CopilotIndices/17.14.1577.30250/SemanticSymbols.db-wal b/.vs/RGC/CopilotIndices/17.14.1577.30250/SemanticSymbols.db-wal index d9e486638e37c45d71f69a5dff583971bf4ae711..2dae5ee6586a16d6eac6b5a1abac5bd8d87e9897 100644 GIT binary patch delta 1754 zcmZo@=WJ-_v@ow{YhuuSB*DNSzyJc}dnWs--TiS}xoUsc_UMvOpb#Gr^TWjNe0$1r z$En?Lv%^MBc2-?hhDO`Tj$F=@8{AkXABbU_yx|ZJ2jiVN=eF*;9kcnqI4>jHT*lwm zYAWyr#mEShX9i-pmrJfzy)Z0av~qL7#Z*SdwVVGr zF5-i`m~W=std`vY`3T9me4;2Jvv-$g#i|?=y~zOrMw@p%j9_QQ2n1y3H@@OWgvVKF z@sDo}u4`<5P>{mN#K;7+8)!Vp^>Ei+lk`YmaM{!u>Ut)i6f3g4gS(y0_BxA~s79c; zFmL_I?(bJvO18gHWHexBZ(;()9>?T^J`tO@uYkuCvLg*SksPTsdB?H{mBTW?NYh|v zgXqQ*_w%)<Kwso)Je{aO&v##`DgG;>6dJ4` zZzBcz=gX_omIbs-L6Sue^dRmVdnS8&-9ip@qHRzAt$g%I+e8&;h_PS^^bnnI+(M>C z{?I@NjS@b|}o#iv_F@Hf4a-b7!yNk58 zxt8TG8)%5JVhQxGc^Rg1jrrx!KnDdlN}#{;omdnYdaoAM2$VqgS+cG(RJ3*lEYMj= h3-rBd6W2_M%8!EvI#@T>K!2?Lmlao_8*;L<0|5Ho*2e$< delta 2440 zcma)+3s6*57{~A3*S&Xl?>^)uAfX8fA_6Ip5p6*0F0#QwfV_kS7EFnks56WyyJazm zlz4CvS2Xd3kO5v4n=BJG$V|pi3uYadA`8<&4b5zX&b__deqL%WMRZAoSyQE%bcX8Mb1#$4~yXlDxf862VtIq4P&Q&-EAmI!xjX zhy(UXwakao&s~L415PB$GbZ}PW%Yx8JeFrnm|L;ckqRKhnA1e8c2DGxYWcDg{}W5~ zgacoTaZum+K2qS)}`OXKVFwvblV zdQllYN+pu>Ry->wvpoP~%zdJ7RB5=U~=IFChlL=_?jvW1N1RI@wTTH#-8jCGi$ zL~jWjgl`CX;4equ%s<0dqh-V+bPiF4e1$jQF4##d6T^6IyhKF99p|2=i=`i4BKncu zn-}qF8c?{)fNnVlY#}5ZD0_pe!c-37i(CS2ZW%oIXSF^Qgz+O7r~M)qmSz?h;VYQW zvneDWHPuFy99Zv_Dg`okM&22P)2eE>lb4G|!Z@p=q_h-=XUgxViYFYwamKS|VNS{b zH;n|Lmb7_k1ns?rb!S~ut`L;XQG)SU0(`C_MNlpp-YKtytytIfO&Slhc9NvYxS}*G zT%N<{B34z?)_Y-uG`pk(HSNhyUVU*SivvA^>ArSqxS%ORL}ykEm8*tQ*wC`TY!Q&C zsqV&x&h5bvnNt}Q=YfoHXEACr#y@JWT$|tpeSL9I{6aX8;35n`xTX3)^LMl>0V>}n zuy{}C<1?uV)|M0&BzZt>$%G~aZ7%Ux_KQ%9q_qf8gu7C40y`8YWHsnz6QUznM6Th% zGux-1&uqyK1p(`>ethwEkOs4N<7R?c~M)D!oU43)rzarDv zGaFMN#%BAzTbP}MN&Ga5PqT}P zh$x82AfOz;$Y@<111)X}Fc3WpN_7Kk24tsGxy-Ry79)fSsvke`SH>l?CaVZh(^WtcSN*o9pipLZ z5Xh96$KsrVjWF-mr;=I<;nBCbu!oL>vX^d3-a!o(X;Bu^2rq2C$br7|lXv>MV_$%D z!H@r1?tCLOajorHuVdm-L+hYz3Y!VHx=P~bbyDj~c^z1Q!6}2U($fbg6bI*2NmNJU zGJh#qzSTY08!KTeqcW*d_ zD19p6W^W1@0l>|mCC&@ z-=WM*nTY9_YK_*(H&YbZQXUdR4?o5dS;x;G`_Yxs?%^mXJI;n z1@S{$zi6(kt+N1WnuclGZ==6waKjocOq-@MJzDskr?W<-w@qQgw9oIoE?L0&n--=E zXTa2Mp8Ngc-sSmbrcA_iOm%ug{&ScbHXIz+_S(CevC$n`F;&+D=B!a}Dt>01%G53> zeP!&8*gq^xXRzSfD?QhZ50k?zK$@pvS~+6sm5dEbEKHlHGF@@$hXY3*uJX1`VZ(H! oCjop}+#|Oz^_cN86U;5aUc*J6JtVvCD@5$JZp_KdM#nGb|u+)Y`os}6Dx$#Xk?GQT5U91 z$6MLGa3KdO95|3eQWPgBPJx0dD5_GaREh%?2%Na&00jmA0971P#Qc8K)2q>FC66TA zYf;l%-*it;cYodeb$_pJ?VsM?^Vc8${NcYTfiSJ?P(HeGpR&uBA4B>c`Tl7|xff~X zeRSi-4QB5EAQ^=*nt=tSfxnhAp%j&6#7$+5qzoPQDLXf5{)wB^nt%Q$AI9GJAodxQ zd;1YlcpexV$`$1)V6P!nRIcBomCn!mup<4_-T8Ivw_ln>u}3cOGI-t$P$0A>LNKoL*^90!~LJOy|f@C@K2K(@Pt z^gQ4cU;(fQI1M-hI14xjI1ji0_$J^YpbU5(@GZa#fNui~Km}j|WZN>nj6B=Rzv{(x zFK!@S0letFv(7MK1{zNT+DIKeX(A4*_W-RM9)bQ5LyGH#_(g92XAPf8TZYrX>j3Yw z7^wqIXi>TB>R>I*2sI-|6zln<{zIEY>L)!5`aW1l@Alpcz(!1UXnNFt&$(Jy6}c~g zz762Fk!vHhyk%eFp8iLjC+zr-q3opBfs>&A6=e>3UlVJPSg3RI>0ljYyf%XN1d5r4!ie^GSM~O32*@$Ghl5=by1hk$A-ZF z9O}L1HIc_i4B%M<9_|3nM*}+m%}py-qyJ$(x5;2GilG@HQP6; z;_D8tgyc2BIO6{i|L?nqypIw87xw?S^8btAFja7#7Pw9m+Q|g?yx_C+2#GJuqm-mS zL`Z}7%E%7E|E{3=39pHM{*SZJ?$Y3S)bV!5Y;?y3^8JU`-kbi> z-*>(9>I(-h%>L__Km2~mC_QuDdgw1l-~Geu)XCf0C|4wdH&`$7@Ba@EUw`7?57hs2 z=sR!Z|8e2Zzl!$%o!$S(VPllR1y(_C+J6g>`X!h5lH1T0l`BM+;Q0toY6L&>mk7Ux z#JM4t1N8v5$PBo7OVpJRWE4t0d!_}lo`zym5S%|*$rpK|_r#u^sCU;iAE<*tJvmJ)hOpV8EO zDwS6Cc%q=@GljUSl?ug7DVHl0i}8)0#R^k#{Joq{l!_U>sHrmaSh~2nrbea)YViap=DDUy;4bMHfD~_f~U~lr?;6l&P!ch zXt#4cAMn4s>yB%Wp=Uwg2mksDuK#oB4SoOQ{GFDLuK{0jVhH?CqP~TH-#z^QR_Kt@LWuPLbuF2WAJMe%Ho$i4|I}Tmj}99~txw&R z_z8cU-uvBCAN=6e-#-5IOxXUAkIVX^&dRZ{by;rI{ttqyS6SL4!7xf*u&prf)Ioj? z5Z0(T59XOPy#W5R&@#NFHsmv{AqP-{e4KD~2M78xPcnIy+CrLV2MyS%3Eb02;I9l_ zp3;DDFz(p)a0QQjHbk=Wq5S*$AV>EDm-D8$|RtDp*fT9hy2yvym2TpDwVT*L0*E@@&U zHhf&9$a`bEzBrmDG!g1H!f(&Ovr$*H5@ea4E;bZk*(E|rlw}CN=nsJ7E=~(I;WG_S|)3lriGi3aB8?e z_a+wm82>H65O>bpOKQ0RE~&ACKFF;$x5A(pQtm~?koV?%7wxokHIc|AR4bXOs=8)Y zRU@9ss8+==4O2I>rm5qioo~?LDsI(m5iP<{+aq51X-#V3_k;?< ziN#^+HOn##RnKTyRX2>BnoZ@ZYECz;M5?M~6BT2l@SEZ9;m%H#c_-B=H|)BF-(=kM zN^01jRQ$hOA@*IteX#q-DY5gnYXY-fmw`jh{9V|kBZig880ktJTvUhnNo2EXE?upu zDa)uObGl_E)49obJekmv>l8lzfZw1)ip}t6oo=}I?RliV3-;~}FZtgNWQle>s{jA| z`|>7lyUjsT2XK1Q`5#yuh4-oG^w)6fiO+rk16O`A!s!eD4~Z-Ptz^+z0x9C> delta 1593 zcmb_c&ubGw6yDiv+I8JYw%R1Mt!;uU+SEvD65BwfE6qWZHa}2=UNlM-JP18(A>p1&@V#^Ps(Z^iN2UAT++W>Bf!yfdvO1JM(5|-uJ%uy{WxtwHItX zepYaXCI}~R&d_$-?KZhtSfhZq_B!>3dHg2M>~y%7=)8(_Td#-ua_lQ zQNql(2Sg(v!%*^sd1Uc;IJ`CvX!VcqevCj73Ds`BG{PyYjCQKyxM0T|aAIyKIGKn*bEm{f;fQYM1p3xz!_0T33R>)I<<|ENy>8?Z>TjpYr7A#iy^XcRj&*ySAG%5>$d;I3g5;K{SUR zFhgtBSVkH`pQ8&f$DT0_T4Oo8jAz`x8+6h50%SaKgd!0PyV?FTZsS+9GST$^N#;Q; zp1hxmB~w?EvGkSHa%>7`$?4Q`BJnU~zaorY5*m*UEOo=kZZhrfTR;mY_Vdw`Ao8(+ zFF;QNzOz&lb+oG9l6$0e^YC_?78_N*>k`d|zO^Th1KT3Y*#Uily+?)VDOl5o-Xpr@ zb6^3q@CRFT^u~27ZMQOYDrunWMbSY`*N~Z{UDS?Jig3eo37WwoWb|36g|N@*S#YY?*M&iQ6EgKVmfNqU3lDKeVLgFpAciM){!5 zxcv6sPe_G&41km*D3_+4w1u_Ps zc0}8aMAWrQL+3RFdPsw;iJ6e9+?UeTp&hw2$kdS`;K5mprtwU7g(}b{4coc3~xD=G(gv zuo4aeRtjcv{0ait_!8rdmAf5{J~qSnIu~SewZ~UC0Cc)e}UbdrgUP6zjQ2W$ES- z7$*lgHqG&E4g}f>Z7r8Hb2dA*YH?~ZJU=DKDHE~UsOQ=IT1Kig@La8fwfpzxor`pT zo0Tq8*EY|1A2Z*L68#LdNkt&s=DZd&@5PTBx8YmH3+*NUCyH)v&N# z)yOwfvZ0yDcw{P;h*Tfgd6~Wsp+Fo-VRM_ki4qagk}jncHCKT=mk=0$yag@grGm6L zHLd1ES;zStVlEp;aSx+<9IvoWa4g%OaI!F-;2dSO5LJtCsW(UMCcI)9K1bojNT`m% z?s~!noTb9>);iKda59pm+8}xPr4+f0<=!p)SV3~A;r)w46jObBTa3wqXhtP0W;8*qq>sex zh_>sgm}{Gc&g%&DlZJvSu16I4p_FSJ$A#&hf+)!(zhUfghG<({$w~5pn8Qsd7o=^H zoW&cB^K9evqL`f3f5ps<&fl1uh3+{Q3#aE8Np}E&K|*r6tgRA~8s5;F_E`l4?9hZn zRmBZr^bRAySKErkrgGa5Wuf9y1($@p>Syxtg9!AIj-r@Zs~)8v&z(0>p}g00A;tOY zr32Mc6OxrIUMVQqGSS-r^?`ZMotjnsREvtF;i`u=wyW1)WoJTZvJ1;uBX8+Lz)Cm> zSgsh!$twt8{bQWhm+$wOeQbvQX?}vq)fIQtJniuzz>&#OoG$0Atk&g4V1Ud$C6b|5 z=hX`g_IVH(C9tN}uUpu8UYF_(JlE`C^ZuQLbCK@vw$f!v zI&X~Rd(K*FfOZT0v*?>%)e7qdq@N^s=0Zo(TXVtJNd?U+#NX0zMky2(6$_gUjeG|s z8@WB5oSliMW*ZOey-eSSP$7ok{(9&Bw1&j;#hVlW1XyS5xFNmV3MKV;SYYe@UzR`tMg`)iCq;_@M9g)BW~vTPuX4 sq0?{h@ZAc0-wDIJ{ZS~JLuLTsy)Ce{8;HV{-G5Oy1%rprA3@dqA81GDM*si- diff --git a/SuiviREForamteur/suivireforamteur/src/HistoriquePage.tsx b/SuiviREForamteur/suivireforamteur/src/HistoriquePage.tsx index 6902210..62dcec2 100644 --- a/SuiviREForamteur/suivireforamteur/src/HistoriquePage.tsx +++ b/SuiviREForamteur/suivireforamteur/src/HistoriquePage.tsx @@ -941,6 +941,188 @@ body { min-width: 800px; } } +/* ✨ Bouton Tutoriel */ +.tutorial-button { + background: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%); + color: white; + border: none; + padding: 0.5rem 1rem; + border-radius: 12px; + cursor: pointer; + font-weight: 600; + display: flex; + align-items: center; + gap: 0.4rem; + transition: all 0.3s ease; + font-size: 0.85rem; + white-space: nowrap; + box-shadow: 0 2px 4px rgba(139, 92, 246, 0.3); +} + +.tutorial-button:hover { + background: linear-gradient(135deg, #7c3aed 0%, #6d28d9 100%); + transform: translateY(-2px); + box-shadow: 0 6px 12px rgba(139, 92, 246, 0.4); +} + +/* ✨ Modal Tutoriel */ +.tutorial-modal-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.7); + backdrop-filter: blur(8px); + display: flex; + align-items: center; + justify-content: center; + z-index: 2000; + padding: 1rem; + animation: fadeIn 0.3s ease-out; +} + +@keyframes fadeIn { + from { opacity: 0; } + to { opacity: 1; } +} + +.tutorial-modal { + background: white; + border-radius: 24px; + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.3); + max-width: 700px; + width: 100%; + overflow: hidden; + animation: slideIn 0.4s ease-out; +} + +@keyframes slideIn { + from { + opacity: 0; + transform: translateY(30px) scale(0.95); + } + to { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +.tutorial-modal-header { + background: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%); + color: white; + padding: 2rem; + text-align: center; +} + +.tutorial-modal-header h2 { + font-size: 1.8rem; + margin-bottom: 0.5rem; + font-weight: 700; +} + +.tutorial-modal-header p { + font-size: 1rem; + opacity: 0.95; +} + +.tutorial-modal-content { + padding: 2rem; + max-height: 60vh; + overflow-y: auto; +} + +.tutorial-step-list { + list-style: none; + margin: 1rem 0; +} + +.tutorial-step-list li { + padding: 1rem; + margin-bottom: 0.75rem; + background: #f8fafc; + border-radius: 12px; + border-left: 4px solid #8b5cf6; + display: flex; + align-items: start; + gap: 0.75rem; + transition: all 0.3s ease; +} + +.tutorial-step-list li:hover { + background: #ede9fe; + transform: translateX(5px); +} + +.tutorial-step-icon { + font-size: 1.5rem; + flex-shrink: 0; +} + +.tutorial-step-content { + flex: 1; +} + +.tutorial-step-title { + font-weight: 600; + color: #1e293b; + margin-bottom: 0.25rem; + font-size: 1rem; +} + +.tutorial-step-desc { + color: #64748b; + font-size: 0.9rem; + line-height: 1.5; +} + +.tutorial-highlight-box { + background: linear-gradient(135deg, #dcfce7 0%, #bbf7d0 100%); + padding: 1rem; + border-radius: 12px; + border-left: 4px solid #22c55e; + margin: 1rem 0; +} + +.tutorial-highlight-box strong { + color: #166534; + display: block; + margin-bottom: 0.5rem; + font-size: 1rem; +} + +.tutorial-highlight-box p { + color: #14532d; + line-height: 1.6; + font-size: 0.9rem; +} + +.tutorial-modal-footer { + padding: 1.5rem 2rem; + background: #f8fafc; + text-align: center; +} + +.tutorial-close-button { + background: linear-gradient(135deg, #22c55e 0%, #16a34a 100%); + color: white; + border: none; + padding: 0.75rem 2rem; + border-radius: 12px; + font-weight: 700; + cursor: pointer; + font-size: 1rem; + display: inline-flex; + align-items: center; + gap: 0.5rem; + transition: all 0.3s ease; + box-shadow: 0 4px 6px -1px rgba(34, 197, 94, 0.3); +} + +.tutorial-close-button:hover { + transform: translateY(-3px); + box-shadow: 0 10px 20px -5px rgba(34, 197, 94, 0.4); +} `; // ═══════════════════════════════════════════════════════ @@ -1106,6 +1288,7 @@ const HistoriquePage: React.FC = ({ const [editCommentaireFormateur, setEditCommentaireFormateur] = useState(''); const [editDateEvalTuteur, setEditDateEvalTuteur] = useState(''); const [editCommentaireRRE, setEditCommentaireRRE] = useState(''); + const [showTutorial, setShowTutorial] = useState(false); // ✅ Vérifier si l'utilisateur peut modifier (pas lecteur) const effectiveRole = impersonatedUser?.role || user.role; @@ -1316,18 +1499,21 @@ const HistoriquePage: React.FC = ({ }, [records, filter, campusFilter, promoFilter, studentFilter]); const dynamicStatusCounts = useMemo(() => { - // OUI = les deux sont OUI - const oui = preFilteredRecords.filter(r => - r.autoEvaluation === 'OUI' && r.evaluationTuteur === 'OUI' - ).length; + let oui = 0; + let partiel = 0; + let non = 0; - // PARTIEL = les deux sont PARTIEL - const partiel = preFilteredRecords.filter(r => - r.autoEvaluation === 'PARTIEL' && r.evaluationTuteur === 'PARTIEL' - ).length; + preFilteredRecords.forEach(r => { + // Compter auto-évaluation + if (r.autoEvaluation === 'OUI') oui++; + else if (r.autoEvaluation === 'PARTIEL') partiel++; + else non++; // NON ou vide - // NON = tout le reste (combinaisons mixtes, NON, vide, etc.) - const non = preFilteredRecords.length - oui - partiel; + // Compter évaluation tuteur + if (r.evaluationTuteur === 'OUI') oui++; + else if (r.evaluationTuteur === 'PARTIEL') partiel++; + else non++; // NON ou vide + }); return { tous: preFilteredRecords.length, @@ -1342,19 +1528,16 @@ const HistoriquePage: React.FC = ({ if (statusFilter === 'tous') return true; if (statusFilter === 'OUI') { - return r.autoEvaluation === 'OUI' && r.evaluationTuteur === 'OUI'; + return r.autoEvaluation === 'OUI' || r.evaluationTuteur === 'OUI'; } if (statusFilter === 'PARTIEL') { - // PARTIEL = les deux sont PARTIEL - return r.autoEvaluation === 'PARTIEL' && r.evaluationTuteur === 'PARTIEL'; + return r.autoEvaluation === 'PARTIEL' || r.evaluationTuteur === 'PARTIEL'; } if (statusFilter === 'NON') { - // NON = tout ce qui n'est ni OUI/OUI ni PARTIEL/PARTIEL - const isOui = r.autoEvaluation === 'OUI' && r.evaluationTuteur === 'OUI'; - const isPartiel = r.autoEvaluation === 'PARTIEL' && r.evaluationTuteur === 'PARTIEL'; - return !isOui && !isPartiel; + return r.autoEvaluation === 'NON' || !r.autoEvaluation || + r.evaluationTuteur === 'NON' || !r.evaluationTuteur; } return true; @@ -1800,6 +1983,10 @@ const HistoriquePage: React.FC = ({
{displayName} + {/* ✨ Bouton Tutoriel */} + @@ -2525,6 +2712,96 @@ const HistoriquePage: React.FC = ({
, document.body )} + {/* ✨ Modal Tutoriel */} + {showTutorial && createPortal( +
setShowTutorial(false)}> +
e.stopPropagation()}> +
+

📜 Tutoriel - Page Historique

+

Guide rapide d'utilisation

+
+ +
+

+ 🎯 Comment utiliser cette page ? +

+ +
    +
  • + 🔍 +
    +
    Rechercher et filtrer
    +
    + Utilisez la barre de recherche et les filtres (Campus, Promotion, Étudiant, Statut) + pour trouver rapidement les apprenants. +
    +
    +
  • + +
  • + 👁️ +
    +
    Voir l'historique complet
    +
    + Cliquez sur l'icône 👁️ pour ouvrir la fenêtre de détail avec l'historique + complet des modifications et le formulaire de saisie. +
    +
    +
  • + +
  • + ✏️ +
    +
    Ajouter une nouvelle action
    +
    + Dans la fenêtre de détail, remplissez le formulaire selon votre rôle + (Auto-éval, Éval tuteur, Date, Commentaires) puis cliquez sur "Ajouter l'action". +
    +
    +
  • + +
  • + 📄 +
    +
    Exporter en PDF
    +
    + Cliquez sur l'icône 📄 pour générer et télécharger un PDF complet + avec toutes les données et l'historique de l'apprenant. +
    +
    +
  • + +
  • + 📊 +
    +
    Trier les données
    +
    + Cliquez sur n'importe quel en-tête de colonne (Nom, Date, Statut...) + pour trier les résultats par ordre croissant ou décroissant. +
    +
    +
  • +
+ +
+ 💡 Bon à savoir +

+ Toutes les modifications sont enregistrées. + L'historique est permanent et assure une traçabilité complète de chaque dossier. +

+
+
+ +
+ +
+
+
, + document.body + )} ); };