From 49117cf2e58ec48b9403545a9c8c5bf036720022 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 17 Jul 2026 09:12:57 +0000 Subject: [PATCH] feat: add Certifications & Training section to candidate detail page --- .../433a0593-d3cf-414e-8763-ab5f87cbc75c.docx | Bin 40675 -> 40675 bytes renderer/carbone-templates/registry.json | 2 +- static/app.js | 13 ++++++++++++- static/index.html | 2 +- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/renderer/carbone-templates/433a0593-d3cf-414e-8763-ab5f87cbc75c.docx b/renderer/carbone-templates/433a0593-d3cf-414e-8763-ab5f87cbc75c.docx index b1dddaaf11fecf0cfd7a9fcad7bc65c7dfb17a81..0b2d90bf7113bb91064faa35e15242f062baeb32 100644 GIT binary patch delta 2013 zcmZ9NX;c#08ipM(Q4S6{;ea!iQ%aUfqQWUnMXjYrgVJ)IPEM6WCXqOo5eZ15HaKOI zq$pZ8s8}8x^Ju0LS(4^d7;2W|!F$(T_pZBtJl}rze)rlxzP;WpcrGP)E(JP@kp`$r zY!6W#=rmALL`em5Bt))wQWU8Qv)c7+`b1;WQs4%03;+%=uzq} zY7*w+dA3Sh$L#TAP962&UCUVqWJFl?AgENci?!-2)Rl$~SHt~<^%HTM;} z?E00k>a>`*FnHt4Rf$XHR+#mCm6)>BTEc^M@@wpJ$Q0&IN5D$Da!ZI)q*IcOLB7Mh z;wrny?UQd+5c_P81{NU`@cxjB+$5?Lq!|kK(rktor9__rOv??Qer;Gyzr=So4esc0 zhpouxRe0!gCMKoST(}0jo)T7os`_J_r-iQinIFxHsC}bM7-^EQ$nirg7sF=(q2j3mY&6h7PCL()4df*eT)0nztJQ;XX2EFOuOsRnb!1N zI=5Wbnj{|?KjPQ?#g{mu>0+874V zVcg7NOZ%)uD-GAcX?XNUC_N=oJv7c}j`Ve<92)6`uBsc-fYd_|#N0oE;6^*!xf#=b z;6j(X+d3wUB=3n}7+ZS}-t>B-bK3Is={(W~c|c}A(`mN5i5WkO=i^VOb(XuG_lox^ zTEGnuNNdv{2E%LHGQzmQbAR=Hy}(B1lEGO4V*vl5W4Z@^>Zf{aK2s##?(C(Fn3R7N z6sckwk0)a=7gFjlg{!uN7iILuF$)j)Vu6<1>JqD?+L4yH1PSkpI=5SPrn4SiyKgXh z#W6Gz#G31UQ5zV_WU6#O+O*a%A>SBc#vCKC`A6FoPQ*rhOV8$AIB9>^hlS|Q7P4iY zyLA0{*RlU~-(bTs)8x7-&8Il>y9o`l#SO}2DK#K;uMzaG zgx|F8JP4Kt-h)MqErp}>6b^4(o-?u?9xyDn7v>asF}|Q7!+N|a&nU}@%UT2HuR?r) z1f23!!^Q}53~%0HGQ1nn=v5I z-KUZ;bD!u<3dk6s`{x_2RVS{4%LUXOPcriL$O>cam2Jt1F^4;~hr6yylAn)cs<2iJ2=%m|d%se#Rl&=xFY&(q` zN#d8AyGEBfSM)176RsWcYSb((MBVpsCuwQdc%%VCRh>?LKuw%O?t&NT0*;@0qH8x? z+12&6X7rXK>E%JfIF9-Iyc4(F6HPwpQ1BA_HmDT@pgmjSB7|6bYi;EPgNrKyHHM-uOJa_;K>sOn<6a!ctBTX*jXBnIr9o;+hB)l$aatyFg5{3~%c zr(PYfN=^>2a%yG3pj(_`h!_GC>m0u$Mve~F-Z&9a^kv_Ca2Z-jluCD#wX zb^f0gvpD3O?S^_3z85!d7e#Jcz^RL30izKCVo_6!5_6^)Ev7lcNz51qQp~#yXEDDp zod5sR+*bk@Z$y-ATdPX8O_L?=Vp^5{n@~zosfAc`ND6{|XbMY>-6EEeIIf~g) XwtcV6O&2lYR29m}oA%-v{if$XgP_WH delta 2013 zcmZ9Ndpy%^AIE1=SmJh@m?V1~a;UZ#BaLKEb505|T28g;9^H&#MAV#ZgqhZIs@v^+ zDl_F!?u;Ulb8R9$m2!^g{&}9)^Ln1wbN%uDUZ3mwT(9eo@AdjzqBgLo4GeL??Gjf2 z?F?ougeWP-WKbkK#hCSGQtM(sK|wB%fRaPm+))|PQ1N|C+iw>l-R$?yi-SOm2N|_- z$~4l|aU;2Hy&?=rO@1_)5pBr^M|pbqse&n3ghIDPYD1Sb9F) zAUIfb+!meWotRR^|Jd$~E##Qw(xot~8_!P4x*nA7pct-Vetzp6=s9gqaQY37R;5B7 z@MMD)QsZwToOMPdK`qjB{R7n6Vb8a;P2IE*`fKuYOC4tZyvU`5pWk=hcFWRMC>y<1 z{AYk$lDkg+XYi7Vhp*J_rU5H!6S*MEvh%0USjW-d`xL8+MJJ${fbY>1Hd8duXt zv=V{^Y^_l4Yi!H4E*M$m@!2G4B;|-ZVsyaGe)V!ewYH67E zxWRZ213v~lceq&ey5D=5>W$`!QS#f(V+uf-KC@92nbc+HM`C-uK;`Of3&}`bWXxNl z5HTn-*YMQ8Bw@+S9|oca%hMt)mE9v&WR4A^pX!FfBf=-P?PQv5)6)kL>q=zxZ-!zT z=YJQ6r065U@(d)xQWJEcS>KFb5Y^6{QY;gEYF7zK4F{Lv&(bXd(BjjU{1AlGh43$iE+WnUNlELuF!2|~qA^I-yKK~pcAM{(Z`9m^ahvDvOQa&|mK10dV{%ZkUiZk#!QC$8mvU;zdJuQ(!OLEx|1GXuI^(r1jTX3Iq$k)E#rV-Rt%P>dSG{-RcXqmu_uiU0z&#Szk%8 z^vjQi8~!wZq@6bHil)u&(N*j=Nms&e2ex7sL8uR=?w%G@h*jn!%3d#@iHwyKe>O4U zPJ)k_g`TQ)@5MGZG(_%ig+~Q1&5cKmda$sXWxW;ICC=@NmE&iWZ8BX0)3j2;vf}hr zMD_;k$Z3O!CPeGhC)QZw>V{VB*hkrLfA}rCr3Vo-()bb0Pc`qOXZz2!w9Vas=%QFi z?U?2xAC9<1w7{#7O}JOX?PFGD?oOq>LXs|WyLnnPb2MmlpjEmFulHfId|YA+^u>5|NN1|i#zQ9#$tB~vg;S6>q#Q3_t`VsUcHgae&q~JQE*xRk zbvs_%=0)lV)n%wvdG=1`yP%KbJ|ltEa$ItR<2pTiZ)Monn?T1n;+G|r94ynLci8hh zLk#{9+PIh-CdQYTQ|Bb)Yi6Y9E?%j_E<;OQNp~6KTm>WOoeLi{$_#0SL%0=v6^;bq zT*EG=7q{deh&4#|r);kywm;>^q&UzUil#M6I(TyQ5IpH9e-v@niOGKQq?0vxn(Vs3 z^-PMLuHFdCDf@1+we@vnb9rdu&47-C)sWZO;2H_nSA=}-`r`V2h5l!_oQqHkE~G=Y z<#(eIr_Wk_?_#d~P)?>zNvNJ#^US*h<4QjzY+wiCZyfsN+A8|eZQhx8J;Z>nl;uh1 z-OJ^tCbk5a=sU3kT0W*e;p$3MFt3n|w;~(ZG@4RjA66ywxn6yvT$U>>-a(}2MQ9yz}SZ~uIox~Yz zMANWP?SEQa-^Z)-e4OvKFBapRYEoJSP-m~lg9xM7cRT+6j`he~%vIn@2jsEX*abg<-OUdk$ Z0K3>b_evCF0V0{dGJK2C!0dLh!{6nQ!QB7= diff --git a/renderer/carbone-templates/registry.json b/renderer/carbone-templates/registry.json index d6955b4..702942a 100644 --- a/renderer/carbone-templates/registry.json +++ b/renderer/carbone-templates/registry.json @@ -6,6 +6,6 @@ "originalName": "master_cv_template.docx", "path": "/root/workspace/cv-app/renderer/carbone-templates/433a0593-d3cf-414e-8763-ab5f87cbc75c.docx", "uploadedAt": "2026-07-16T09:03:29.601Z", - "updatedAt": "2026-07-17T09:04:41.170Z" + "updatedAt": "2026-07-17T09:07:36.233Z" } ] \ No newline at end of file diff --git a/static/app.js b/static/app.js index 2b2568c..015e188 100644 --- a/static/app.js +++ b/static/app.js @@ -150,6 +150,17 @@ async function viewCandidate(id) { `).join('') || '

No education extracted

'} +
+

Certifications & Training (${data.certifications ? data.certifications.length : 0})

+ ${(data.certifications || []).map(c => ` +
+ ${c.name || ''} + ${c.issuer ? '
' + c.issuer + '
' : ''} + ${c.issue_date ? '
Issued: ' + formatDate(c.issue_date) + '
' : ''} + ${c.credential_id ? '
ID: ' + c.credential_id + '
' : ''} +
+ `).join('') || '

No certifications extracted

'} +

Raw CV Text

${c.raw_cv_text || 'No raw text available'}
@@ -192,7 +203,7 @@ async function uploadFile(file) { status.innerHTML = `
Parsed successfully!
Name: ${data.parsed_data.first_name || ''} ${data.parsed_data.last_name || ''}
- Skills: ${data.parsed_data.skills?.length || 0} | Experience: ${data.parsed_data.experience?.length || 0} | Education: ${data.parsed_data.education?.length || 0} + Skills: ${data.parsed_data.skills?.length || 0} | Experience: ${data.parsed_data.experience?.length || 0} | Education: ${data.parsed_data.education?.length || 0} | Certs: ${data.parsed_data.certifications?.length || 0}
`; toast('CV uploaded and parsed successfully'); } else { diff --git a/static/index.html b/static/index.html index e62ca04..f54510d 100644 --- a/static/index.html +++ b/static/index.html @@ -139,7 +139,7 @@ - + \ No newline at end of file